Predicción de primas de seguros médicos con Machine Learning

Utilizando Python

Python
Seguros
Random Forest Regressor
Author

Juan Isaula

Published

November 19, 2023

Una persona que ha contratado una póliza de seguro médico obtiene cobertura de seguro médico pagando una prima determinada. Existen muchos factores que determinan la prima del seguro médico. Entonces, si deseas saber como podemos utilizar Machine Learning para predecir la prima del seguro médico, este artículo es para ti. En este artículo, lo guiaré a traves de la tarea de predicción de primas de seguros médicos con Machine Learning usando Python.

Predicción de primas de seguro médico

El monto de la prima de una póliza de seguro médico depende de persona a persona, ya que muchos factores afectan el monto de la prima de una póliza de seguro médico. Por ejemplo, la edad, una personas joven tiene menos probabilidad de tener problemas de salud importantes en comparación con una persona mayor. Por tanto, tratar a una persona mayor será caro en comparación con una joven. Por este motivo, una persona mayor debe pagar una prima más elevada que una persona joven.

Además de la edad, muchos otros factores afectan la prima de una póliza de seguro médico. A este punto, espero haya comprendido qué es el seguro médico y cómo se determina la prima de una poliza de seguro médico. En la siguiente sección, lo guiaré a través de la tarea de predicción de primas de seguros médicos con aprendizaje automático utilizando Python.

Predicción de primas de seguros médicos usando Python

El conjunto de datos que estoy utilizando para la tarea de predicción de primas de seguros médicos se recopila de Kaggle. Contiene datos sobre:

  1. age: la edad de la persona.
  2. sex: género de la persona.
  3. bmi: índice de masa corporal de la persona.
  4. children: cuantos hijos va a tener la persona.
  5. smoker: si la persona fuma o no.
  6. region: la región donde vive la persona.
  7. charges: cargos de la prima de segura.

Entonces, importemos el conjunto de datos y las bibliotecas de Python necesarias para esta tarea:

import numpy as np
import pandas as pd
data = pd.read_csv("health_insurance_charges.csv")
data.head()
age sex bmi smoker region children charges
0 21 male 25.745000 no northeast 2 3279.868550
1 37 female 25.744165 yes southeast 3 21454.494239
2 18 male 30.030000 no southeast 1 1720.353700
3 37 male 30.676891 no northeast 3 6801.437542
4 58 male 32.010000 no southeast 1 11946.625900

Antes de continuar, echemos un vistazo a si este conjunto de datos contiene valores nulos o no:

data.isnull().sum()
age         0
sex         0
bmi         0
smoker      0
region      0
children    0
charges     0
dtype: int64

Por lo tanto, el conjunto de datos está listo para ser utilizado. Después de tener las primeras impresiones de estos datos, me fijé en la columna smoker, que indica si la persona fuma o no. Esta es una característica importante de este conjunto de datos porque una persona que fuma tiene más probabilidades de tener problemas de salud importantes en comparación con una persona que no fuma. Así que veamos la distribución de personas que fuman y que no:

import plotly.express as px
data = data
figure = px.histogram(data, x = "sex", color = "smoker", title= "Number of Smokers")
figure.show()

Según la visualización anterior, 1,144 hombres y 980 mujeres no fuman y 243 hombres y 133 mujeres fuman. Es importante utilizar esta función al entrenar un modelo de Machine Learning, por lo que ahora reemplazaré los valores de las columnas sex y smoker con 0 y 1, ya que ambas columnas contienen valores de cadena:

data["sex"] = data["sex"].map({"female": 0, "male": 1})
data["smoker"] = data["smoker"].map({"no": 0, "yes": 1})
print(data.head())
   age  sex        bmi  smoker     region  children       charges
0   21    1  25.745000       0  northeast         2   3279.868550
1   37    0  25.744165       1  southeast         3  21454.494239
2   18    1  30.030000       0  southeast         1   1720.353700
3   37    1  30.676891       0  northeast         3   6801.437542
4   58    1  32.010000       0  southeast         1  11946.625900

Ahora echemos un vistazo a la distribución de las regiones donde vive la gente según el conjunto de datos:

import plotly.express as px
pie = data["region"].value_counts()
regions = pie.index
population = pie.values
fig = px.pie(data, values=population, names=regions)
fig.show()

Ahora echemos un vistazo a la correlación entre las características de este conjunto de datos:

print(data.corr())
               age       sex       bmi    smoker  children   charges
age       1.000000 -0.151066  0.146278  0.032529 -0.055408  0.312068
sex      -0.151066  1.000000 -0.005126  0.077443  0.146442  0.089900
bmi       0.146278 -0.005126  1.000000  0.028656 -0.034233  0.197721
smoker    0.032529  0.077443  0.028656  1.000000 -0.174135  0.769390
children -0.055408  0.146442 -0.034233 -0.174135  1.000000 -0.064515
charges   0.312068  0.089900  0.197721  0.769390 -0.064515  1.000000
C:\Users\juani\AppData\Local\Temp\ipykernel_18556\3359323643.py:1: FutureWarning:

The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.

Modelo de predicción de primas de seguro médico

Pasemos ahora a entrenar un modelo de aprendizaje automático para la tarea de predecir las primas de seguros médicos. Primero, dividiré los datos en conjuntos de entrenamiento y prueba:

x = np.array(data[["age", "sex", "bmi", "smoker"]])
y = np.array(data["charges"])

from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=42)

Después de usar diferentes algoritmos de Machine Learning, encontré que el algoritmo de Random Forest es el de mejor rendimiento para esta tarea. Entonces aquí entrenaré el modelo usando el algoritmo de Random Forest Regression:

from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor()
forest.fit(xtrain, ytrain)
RandomForestRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

Ahora echemos un vistazo a los valores predichos del modelo:

ypred = forest.predict(xtest)
data = pd.DataFrame(data={"Monto de prima predicho": ypred})
print(data.head())
   Monto de prima predicho
0              9406.796792
1              4375.500954
2             41854.323503
3             15823.019738
4              6563.550778

Así es como se puede entrenar un modelo de Machine Learning para la tarea de predicción de primas de seguros médicos utilizando Python.

Resumen

El monto de la prima de una póliza de seguro médico depende de persona a persona, ya que muchos factores afectan el monto de la prima de una póliza de seguro médico. Espero que te haya gustado este artículo sobre predicción de primas de seguros médicos con Machine Learning utilizando Python. No dude en hacer sus valiosas preguntas en la sección de comentarios a continuación.