Regresión lineal para predecir los gastos médicos de pacientes
Clase 10 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Clase 10 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Sandy Paola Atencio Hernández
Juan R. Vergara M.
Julián Cárdenas
Héctor Daniel González Vargas
Julián Cárdenas
Ronal Leiva
Jesús Andrés Báez Pérez
Carlos Andrés Pinilla Castillo
Jhon Freddy Tavera Blandon
Diego Jurado
jabes nestor frias martinez
Juan R. Vergara M.
Alberto Gonzalez
Víctor Trigo
Víctor Trigo
Joel Orellana
Wilson Tumiña Tumiña
Andres Martin
Juan Acevedo
Mario Alexander Vargas Celis
Brayam Fabian Ruiz Zapata
Luis Fernando Laris Pardo
Brayam Fabian Ruiz Zapata
Patricio Sánchez Fernández
Antonio Demarco Bonino
Mauricio Escobar
Cesar Fernandez
Sebastian Castaño Zuluaga
Anuar Manuel Monterrosa Bedoya
Dave Sanchfor
viendo el dataset se me ocurriría analizar la edad, pues tengo la curiosidad de saber si a mayor edad los cargos de los gastos médicos serán altos, o si a mayor cantidad de hijos serán altos esos gastos, también me gustaría analizar que sexo es el que predomina en gastos médicos, o también si la ubicación en este caso la region influye sobre el cargo.
¡Adelante!
También esta en la sección de recursos del curso
Función para detectar valores atípicos en las variables numéricas continuas del dataset:
def detect_otliers(x): Q3 = Datos[x].quantile(0.75) Q1 = Datos[x].quantile(0.25) IQR = Q3 - Q1 superior = Q3 + (1.5 * IQR) inferior = Q1 - (1.5 * IQR) out_sup = Datos[Datos[x] > superior].index out_inf = Datos[Datos[x] < inferior].index outliers = [] for i in out_sup: outliers.append(i) for j in out_inf: outliers.append(j) size = len(outliers) return (f'Hay {size} valores atípicos en la variable {x}, y corresponden a los índices: {outliers}') detect_otliers('bmi') 'Hay 8 valores atípicos en la variable bmi, y corresponden a los índices: [115, 285, 400, 843, 856, 1043, 1084, 1310]'
Wow que buen trabajo, gracias!!
Gracias por compartir tu idea, se puede simplificar, reemplazando los bucles por el método extend.
def detect_outliers(x): Q3 = Datos[x].quantile(0.75) Q1 = Datos[x].quantile(0.25) IQR = Q3 - Q1 superior = Q3 + (1.5 * IQR) inferior = Q1 - (1.5 * IQR) out_sup = Datos[Datos[x] > superior].index out_inf = Datos[Datos[x] < inferior].index outliers = [] outliers.extend(out_sup) outliers.extend(out_inf) size = len(outliers) return (f'Hay {size} valores atípicos en la variable {x}, y corresponden a los índices: {outliers}') print(detect_outliers('bmi')) 'Hay 9 valores atípicos en la variable bmi, y corresponden a los índices: [116, 286, 401, 543, 847, 860, 1047, 1088, 1317]' ````def detect_outliers(x`): ` Q3 = Datos[x].quantile(0.75`) ` Q1 = Datos[x].quantile(0.25`)   IQR = Q3 - Q1 ` superior = Q3 + (1.5` \* IQR) ` inferior = Q1 - (1.5` \* IQR)   out\_sup = Datos\[Datos\[x] > superior].index   out\_inf = Datos\[Datos\[x] < inferior].index   outliers = \[]   outliers.extend(out\_sup)   outliers.extend(out\_inf)     ` size = len`(outliers)     ` return (f'Hay {size} valores atípicos en la variable {x}, y corresponden a los índices: {outliers}'`) `# Ejemplo de uso` `print(detect_outliers('bmi'))` 
Observaciones del dataset
Es obvio que la prima del seguro va depender de la salud fisica del asegurado por lo que el indice de masa corporal y saber si es fumador van a estar correlacionadas, el número de hijos támbien lo encuentro lógico que haya una correlación, si hay más integrantes en una familia, hay más posibilidades de usar el seguro de gastos medicos, lo interesante sería análizar si hay una correlación de la prima del seguro con la región donde vive.
Variables categoricas:
Variables númericas: Enteros - Edad del asegurado - Número de hijos Flotantes - Indice de masa corporal - Prima del seguro
En Colombia, el sistema de salud se maneja con EPSs(Entidades Prromotoras de Salud) que son como aseguradoras. El gobierno da a cada EPS una prima por cada asegurado. El sistema de salud debe ajustar un valor de esa prima por cada asegurado solo con los datos de la edad, la region donde vien y el sexo. Es muy complejo obtener un modelo con tan pocos datos. Se deberia poder usar datos de la famila, y tratamientos previos para ajustar un modelo razonalble.
Plotly
Este código utiliza la biblioteca Plotly para crear una figura 3D con una superficie basada en las predicciones del modelo y puntos dispersos representando los datos reales. Puedes personalizar la apariencia de la gráfica según tus preferencias modificando los parámetros en el código.
Sabes de algun curso en Platzy sobre plotly?
No hay todavia ojala y saquen uno porque la doumentacion no esta sencilla
Este curso cada vez se pone mejor.
Y bien mejor!
import seaborn as sns sns.pairplot(data)
Me llama la atención el gráfico de abajo a la izquierda (o arriba a la derecha, ya que es simétrico), pareciera que se requieren 3 modelos de regresión o incluir una variable categórica
Algo que a primera vista me sorprendió es ver que el BMI tiene una distribución normal
Ya había estado en la página de Kaggle antes de ver este curso, reforzando clases de la U con este buen curso de Platzi.
note que entre mas años tenga la persona mayor seran los gastos
Aquí ya viendo el dataset y cargándolo , me doy cuenta que podríamos utilizar las variables de genero y si fuma o no , ya que son variables binarias , que fácilmente se pueden mapear para utilizar también como información al momento de entrenar
La regresión lineal es una técnica muy útil para predecir los gastos médicos de pacientes si cuentas con variables numéricas relevantes como:
age)bmi)children)sex)smoker)region)Estas variables se pueden usar como características (X) para predecir el gasto médico (charges).
🧠 ¿Por qué usar regresión lineal?
Porque es una forma de modelar cómo distintas características influyen en el resultado (en este caso, los gastos médicos). Por ejemplo:
✅ Ejemplo básico con Python y scikit-learn
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline
# Carga de datos (puedes usar un dataset como el de 'insurance.csv') df = pd.read_csv('insurance.csv')
# Variables numéricas y categóricas numeric = ['age', 'bmi', 'children'] categorical = ['sex', 'smoker', 'region']
# Separar variables predictoras y objetivo X = df[numeric + categorical] y = df['charges']
# Preprocesamiento: estandarizar numéricas y one-hot encoding a categóricas preprocessor = ColumnTransformer([ ('num', StandardScaler(), numeric), ('cat', OneHotEncoder(drop='first'), categorical) ])
# Pipeline con regresión lineal model = Pipeline([ ('preprocess', preprocessor), ('regressor', LinearRegression()) ])
# División de los datos X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Entrenamiento model.fit(X_train, y_train)
# Evaluación from sklearn.metrics import r2_score, mean_squared_error
y_pred = model.predict(X_test) print('R²:', r2_score(y_test, y_pred)) print('MSE:', mean_squared_error(y_test, y_pred))
📊 Interpretación
R² indica qué tan bien el modelo explica los datos (más cerca a 1 = mejor).MSE indica el error medio al predecir los gastos (menor = mejor).Como se podría predecir dos variables numéricas tipo plano cartesiano ? A partir de varios features?
En scikit learn no es tan complejo porque lo que tienes que hacer es declarar y como una variable de dos dimensiones, es decir y=data[['columna1', 'columna2']] y con eso funciona. puedes ver un poco más de esto acá
Con esto podría predecir la ubicación de un robot a partir de la lectura de varios sensores ? Es decir dependiendo de los sensores saber en un plano xy la posición ?
Seria interesante ver la relación de Índice de masa corporal relacionado con los gastos médicos. Hay un dato que no está en la data set, tiene relación con los hábitos alimenticios de la población americana, a ellos les encanta la comida chatarra, por tanto, a mayor IMC mayor es el deterioro de la salud, lo que implicaría mayor gasto médico. Claro, es una suposición sin haber analizado ningún dato. Habrá que ver si tiene sustento, basado en los datos.
Ya me puse a jugar un poco:
sns.set(style='whitegrid', context='notebook') plt.figure(figsize=(12, 10)) columns = ['age', 'sex', 'bmi', 'children', 'charges'] sns.pairplot(df[columns], height=3) plt.show()
creo que la variable region sería interesante de analizar para sabér qué tanto influye la ubicación del sujeto de estudio a la hora de contratar un seguro. Obteniendo algo parecido a por ejemplo:
Tras ver los datos se pueden hacer 3 hipótesis:
Antes de ver a detalle las categorías de cada variable pensé que la variable región tendría muchas categorías y que eso causaría problemas al implementar la regresión , pero solo tiene 2
Teniendo en cuento los datos me gustaría analizar el IBM con la edad, ya que se habla mucho que hoy en día los niños están sufriendo de obesidad, igual la relación de la edad con los costos en salud, es bien conocido que a mayor edad más propensos estamos a enfermarnos porque la vida nos empieza a pasar factura por malos habitos de vida.
Algo que note en el dataset es que 3 de las 7 columnas no son numericas ('region', 'sex', 'smoker')