Análisis de correlación de los datos
Clase 12 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Clase 12 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Sandy Paola Atencio Hernández
Abisai Antonio Madera
Ángel Samuel Suesca Ríos
Alfonso Andres Zapata Guzman
Alfonso Andres Zapata Guzman
Alfonso Andres Zapata Guzman
Christopher Brian Guzmán Martínez
Jeison Andres Arias Camayo
Olga Lisethe Castellanos Galeano
Tomas Dale
Anuar Manuel Monterrosa Bedoya
Gustavo Adolfo Marquez Prieto
FELIX DAVID CORDOVA GARCIA
Luis Fernando Laris Pardo
Juan R Rossano
Luis Fernando Laris Pardo
Tomas Dale
Brayam Esparza
Mauricio Escobar
Bernardo Tamayo
Bernardo Tamayo
Fabian Villada
Jhon Freddy Tavera Blandon
Antonio Demarco Bonino
Enrique Jiménez Téllez
Jordan Anderson Huayhua Morales
Thomas Gonzalez Rodrigues
Diego Jurado
Romel Manrique
Alex Xiomar Rubio Lopez
Andres Martin
Mario Alexander Vargas Celis
Hago un aporte, utilice estas dos lineas de código para poder sacar nuestras variables numéricas y categoricas por separado pensado en el futuro cuando nos encontremos con dataset que tengas muchas variables, espero que les sirva a todos:
creo una variable ++cols_numerica++ y en ella almaceno una lista comprimida que evaluara si mi columna es numerica o flotante
creo una variable ++cols_categorica++ y en ella almaceno una lista comprimida que evaluara si mi columna es de tipo object
cols_numericas = [colname for colname in df.columns if df[colname].dtype in ['int64', 'float64']] cols_categoricas = [colname for colname in df.columns if df[colname].dtype in ['object']]
Esta genial tu aporte. Aunque se podría mejorar al definir también la cantidad máxima de diferentes valores en las categorías que se desea encontrar. Por ejemplo hay casos en que una columna, es de tipo "Object" y que casi todo los valores son diferentes. Para este caso, podría mejorarse a:
cols_categoricas = [colname for colname in df.columns if df[colname].nunique() < 10 and df[colname].dtype == 'object']
Éste código analiza las columnas que son "Object" y que su categoría no exceda de valores únicos en 10. Puse el diez (10) solo por mencionar un ejemplo, pero uno puede definir la cantidad deseada.
Saludos 😎😌
Que bonito, thx
Pobres fumadores, pagan mas.
Otra cosa es que si hay una correlacion ascendente entre la edad y pagar mas, entre fumadores y pagar mas hay aun mas correlacion, con el sexo de la persona no sucede casi, a nivel de aseguradora segun la grafica, se cobra lo mismo.
df.corr().style.background_gradient(cmap="coolwarm", axis=None)
fig = px.imshow( df.corr(), color_continuous_scale=px.colors.diverging.RdBu[::-1], text_auto=True, zmin=-1, zmax=1, ) fig.show()
Problemas con las variables dommies? puede que ésto te pueda ayudar:
pd.get_dummies(df, columns=['sex', 'smoker', 'region'], drop_first=True, dtype='int64')
Solo me aparecía True and False, gracias por el aporte.
excelente aporte
Luego de pasar a dummies encontre una alta correlacion entre fumar y cargos 0.79
Por otra parte, no encontre correlacion entre region y fumador.
Concuerdo, entre más fumas más caro le sales al sistema de salud T.T
Otra forma de obtener la correlación:
numeric_cols = ['age', 'bmi', 'children', 'charges'] sns.set(font_scale=1.5) # Configuracion del heatmap sns.heatmap(df[numeric_cols].corr(), cbar=True, annot=True, yticklabels=numeric_cols, xticklabels=numeric_cols) plt.show()
Cuando se quiere llevar un modelo creado a producción en forma de APP por ejemplo, es necesario tener una columna de cada una de las variables categóricas, ya que por ejemplo si un usuario desea seleccionar un dato en específico para hacer una predicción .este debe en encontrarse dentro de los datos del modelos
Ciertamente, si uno quisiera ser muy permisivo con el usuario tendría que darle la oportunidad de seleccionar las variables. Lo importante a notar es lo que mencionas, hay que tener bien en claro qué variables tiene tu modelo y que sea consistente con los datos que vas a entrenar.
¿Se puede codificar las valores categorias como numericas? Supongamos como region que tuvieramos 10 valores distintos, seria asignar un numero a cada valor (ejemplo northwest = 1, southeast = 2, southwest = 3) para crear una sola columna y no varias. ¿Que ventajas tendria un modo sobre otro?
El problema con esta codificación es que la mayoría de los algoritmos tratan estos como valores numéricos y entonces puedes sesgar los resultados, imagina que el 49% de los datos son 1 y el 49% son 3 y el 1% es 2, entonces cuando el algoritmo haga las cuentas podría decir que la media es 2, pero esto no es así (además que no tiene mucho sentido hacer promedios con valores categóricos) En cambio lo que haces al crear columnas de 1s y 0s es Que los resultados se pueden ver como probabilidades, es decir, en la columna de southwest si el promedio es 0.6, quiere decir que southwest aparece en el 60% de todos los resultados. Yo es por esto y que he visto muchas veces en el primer método que mencionas, que ya no lo uso para mis algoritmos 😄 ¿Te queda alguna duda o comentario de este tema?
La data age - charges presenta 3 posibles grupos, lo que haria es utilizar otro modelo de ML para estos dos valores y evaluar si se puede crear 3 grupos o si surgen mas grupos. Igual con age-bmi podria surgir agrupaciones que no se pueden apreciar
los que pagan mas son fumadores
viejitos
Qué tal, en mi análisis he comparado:
Primero con un scatterplot la influencia que tiene bmi con charges
Despúes con un stripplot y un boxplot la influencia que podría tener sex entre la variable charges
En las líneas [magenta y cyan] de ambas gráficas están los valores promedio y mediana
no se porque no me dejó poner el link, lo dejo abajo
https://www.geeksforgeeks.org/how-to-convert-categorical-string-data-into-numeric-in-python/
gracias
La codificación one-hot de las variables categóricas 'sex', 'smoker' y 'region'. Esto creará nuevas columnas numéricas en el DataFrame df_encoded correspondientes a las categorías de cada variable.
Me puse a experimentar con scatterplot e hice este experimento:
colors = {True: 'blue', False: 'red'} df.plot(kind='scatter', x='age', y='bmi', s=32, alpha=.8, c=df['sex_male'].map(colors)) plt.gca().spines[['top', 'right']].set_visible(False) plt.show()
aqui esta mi aporte con todas las variables
Cuando hago el get_dummies en lugar de 1 y 0 me aparece True y False ¿Por qué?
hola comunidad
dividí la variable
chargesen 3 y después tome solo la primera parte y obtuve una mejor correlacion
Que tan disciplinados todos!
Otra forma de obtener las variables categóricas convertidas con scikit_learn.
categorical_cols = ['sex','smoker','region'] ohe = OneHotEncoder(drop='first') ohe.fit(df[categorical_cols]) new = ohe.transform(df[categorical_cols]) df_one_hot_encoded = df.drop(columns=['sex', 'smoker', 'region']) df_one_hot_encoded[ohe.get_feature_names_out()] = new.toarray() df_one_hot_encoded.head(5)
| age | bmi | children | charges | sex_male | smoker_yes | region_northwest | region_southeast | region_southwest | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 19 | 27.9 | 0 | 16884.9 | 0 | 1 | 0 | 0 | 1 |
| 1 | 18 | 33.77 | 1 | 1725.55 | 1 | 0 | 0 | 1 | 0 |
| 2 | 28 | 33 | 3 | 4449.46 | 1 | 0 | 0 | 1 | 0 |
| 3 | 33 | 22.705 | 0 | 21984.5 | 1 | 0 | 1 | 0 | 0 |
| 4 | 32 | 28.88 | 0 | 3866.86 | 1 | 0 | 1 | 0 | 0 |
Utilizando y agregando las variables booleans al grafico heatmap y revisar las correlaciones
veo una relacion entre los fumadores y los cargos que reciben
El análisis de correlación es una técnica fundamental para comprender las relaciones entre variables numéricas en un conjunto de datos. Es especialmente útil antes de aplicar un modelo de regresión lineal, como el que estás construyendo para predecir los gastos médicos.
Aquí tienes una guía paso a paso usando pandas, seaborn y matplotlib para un análisis de correlación claro y visual:
✅ Paso 1: Cargar los datos
import pandas as pd
# Por ejemplo, si usas el dataset de gastos médicos df = pd.read_csv('insurance.csv')
✅ Paso 2: Convertir variables categóricas (si es necesario)
# Convertir columnas categóricas con one-hot encoding df_encoded = pd.get_dummies(df, drop_first=True)
✅ Paso 3: Calcular la matriz de correlación
correlation_matrix = df_encoded.corr() print(correlation_matrix)
✅ Paso 4: Visualizar la matriz de correlación con un heatmap
import seaborn as sns import matplotlib.pyplot as plt
plt.figure(figsize=(12, 8)) sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f") plt.title("Matriz de Correlación") plt.show()
✅ ¿Qué observar?
charges) y las otras.bmi, smoker_yes, o age tienen una correlación fuerte con charges, son buenos candidatos como predictores.