← Todos los proyectosAll projects
PySparkpandas-on-SparkSpark MLHyperoptCrossValidator

Costes de seguros médicos con PySparkMedical insurance costs with PySpark

Qué hace que un seguro médico cueste el doble: un análisis con pandas-on-Spark y cinco modelos de regresión con Spark ML. La mejora más grande no vino de optimizar hiperparámetros, sino de entender bien una interacción entre variables. What makes a health insurance policy cost twice as much: an analysis with pandas-on-Spark and five regression models with Spark ML. The biggest improvement didn't come from tuning hyperparameters, but from properly understanding an interaction between variables.

DatosData: insurance.csv · 1.338 beneficiariospolicyholders CódigoCode: insurance_pyspark.py
Pregunta de negocioBusiness question

¿Qué características de un asegurado explican su coste médico anual, y con qué precisión podemos estimarlo para fijar la prima? Which characteristics of a policyholder explain their annual medical cost, and how accurately can we estimate it to set the premium?

01

Fumar y obesidad: el problema es la combinaciónSmoking and obesity: the combination is the problem

En los no fumadores, la obesidad apenas cambia el coste medio (+11 %). En los fumadores lo duplica: de 21.363 $ a 41.558 $. No son dos efectos que se suman, sino una interacción: la obesidad solo dispara el coste cuando va con el tabaco. Among non-smokers, obesity barely changes the average cost (+11%). Among smokers it doubles it: from $21,363 to $41,558. These aren't two effects that add up but an interaction: obesity only drives costs up when combined with smoking.

Coste medio anual por perfilAverage annual cost by profile

Obeso = IMC ≥ 30Obese = BMI ≥ 30

Correlación de cada variable con el costeCorrelation of each variable with cost

La variable "fumador × obeso" es la que más se relaciona con el costeThe "smoker × obese" variable is the most related to cost

02

Tres tarifas paralelas que suben con la edadThree parallel price bands that rise with age

Al cruzar edad y coste aparecen tres bandas casi paralelas: no fumadores, fumadores con peso normal y fumadores obesos. La edad sube el coste de forma lineal y parecida en las tres; el perfil de riesgo decide en qué banda está cada persona. Los 139 "outliers" de coste no son errores: 136 son fumadores. Plotting age against cost reveals three almost parallel bands: non-smokers, normal-weight smokers and obese smokers. Age raises cost linearly and similarly in all three; the risk profile decides which band each person falls into. The 139 cost "outliers" aren't errors: 136 of them are smokers.

Edad frente a coste anual, por perfil de riesgoAge vs annual cost, by risk profile

1.338 asegurados · pasa el cursor por los puntos1,338 policyholders · hover the points

03

Cinco modelos y una lección: la escala importaFive models and one lesson: scale matters

Pasar el coste a logaritmo (algo habitual con datos asimétricos) empeoró el modelo, y añadir la interacción en esa escala lo empeoró aún más (R² 0,39): el logaritmo convierte los efectos en multiplicativos y sobreestima a los fumadores obesos. Como el salto de coste es aditivo en dólares, el modelo lineal sobre el coste original con la interacción es el mejor: R² 0,895 y un 29 % menos de RMSE que el punto de partida. Taking the log of cost (common with skewed data) hurt the model, and adding the interaction on that scale hurt it even more (R² 0.39): the log turns effects multiplicative and overestimates obese smokers. Since the cost jump is additive in dollars, the linear model on the original cost with the interaction is the best: R² 0.895 and 29% lower RMSE than the starting point.

R² en test por modeloTest R² by model

Todas las métricas en dólares, comparables entre síAll metrics in dollars, comparable to each other

Error en test (RMSE y MAE, $)Test error (RMSE and MAE, $)

Menos es mejorLower is better

04

Coste real frente a predichoActual vs predicted cost

Con el mejor modelo, los 230 asegurados de test caen cerca de la diagonal en los tres perfiles. Los errores grandes que quedan son siempre por debajo: personas que cuestan mucho más de lo que su perfil indica, sobre todo no fumadores, probablemente por enfermedades que el dataset no recoge. With the best model, the 230 test policyholders sit close to the diagonal in all three profiles. The large errors that remain are always underestimates: people who cost far more than their profile suggests, mostly non-smokers, probably due to conditions the dataset doesn't capture.

Real frente a predicho en test (modelo 5)Actual vs predicted on test (model 5)

La línea discontinua es la predicción perfectaThe dashed line is a perfect prediction

⚙

Cómo lo construíHow I built it

LimitacionesLimitations

  • El mejor regParam del modelo 5 (1,0) está en el borde del grid: habría que ampliarlo.Model 5's best regParam (1.0) sits at the edge of the grid: it should be extended.
  • Con 1.338 filas, una única partición y CV de 3 folds, los resultados son sensibles: al reproducir el notebook comprobé que el R² del modelo 3 pasa de 0,61 a 0,64 solo por cómo se reparten las filas entre folds.With 1,338 rows, a single split and 3-fold CV, results are sensitive: when reproducing the notebook I found that model 3's R² moves from 0.61 to 0.64 just from how rows are assigned to folds.
  • Spark es más de lo que necesita un dataset de este tamaño; el objetivo era aprender una API que escala a millones de filas sin cambiar el código.Spark is more than a dataset this size needs; the goal was to learn an API that scales to millions of rows without changing the code.
Siguiente proyectoNext project Análisis de negocio en SQL: ChinookBusiness analysis in SQL: Chinook →