EQUIPO: ALFA BUENA MARAVILLA ONDA DINAMITA. Abel & Kaleb
Fecha de publicación
22 de octubre de 2026
1. Introducción
En este reporte utilizaremos un conjunto de datos de costos de seguro (insurance), el cual contiene información sobre las características personales, de salud y demográficas de 1338 individuos, así como los gastos médicos facturados por su seguro.
Nuestro objetivo es analizar cómo influye la edad en años del individuo (\(X = \text{age}\)) sobre los costos médicos facturados en dólares (\(Y = \text{charges}\)).
2. Análisis exploratorio de datos (AED)
Cargar las librerías y la base de datos.
Primero, se cargan las librerías necesarias para el análisis y se importa la base de datos insurance.csv, que contiene 1,338 observaciones de beneficiarios de un seguro médico. La variable independiente (\(X\)) es la edad (age) y la variable dependiente (\(Y\)) son los costos médicos facturados (charges).
Código
# Cargar las libreríaslibrary(ggplot2)library(mosaic)## Registered S3 method overwritten by 'mosaic':## method from ## fortify.SpatialPolygonsDataFrame ggplot2## ## The 'mosaic' package masks several functions from core packages in order to add ## additional features. The original behavior of these functions should not be affected by this.## ## Adjuntando el paquete: 'mosaic'## The following objects are masked from 'package:dplyr':## ## count, do, tally## The following object is masked from 'package:Matrix':## ## mean## The following object is masked from 'package:ggplot2':## ## stat## The following objects are masked from 'package:stats':## ## binom.test, cor, cor.test, cov, fivenum, IQR, median, prop.test,## quantile, sd, t.test, var## The following objects are masked from 'package:base':## ## max, mean, min, prod, range, sample, sumlibrary(lmtest)## Cargando paquete requerido: zoo## ## Adjuntando el paquete: 'zoo'## The following objects are masked from 'package:base':## ## as.Date, as.Date.numericlibrary(knitr)library(modeest)library(e1071)## ## Adjuntando el paquete: 'e1071'## The following object is masked from 'package:modeest':## ## skewness## The following object is masked from 'package:ggplot2':## ## elementlibrary(kableExtra)## ## Adjuntando el paquete: 'kableExtra'## The following object is masked from 'package:dplyr':## ## group_rows# Cargar la base de datosinsurance =read.csv("insurance.csv")
Inspección de las variables de interés.
Antes de crear un modelo matemático, debemos revisar cómo se comporta cada variable por separado y cómo se relacionan entre ellas mediante diagramas de dispersión.
Código
# Inspeccionamos la variable X (edad)favstats(~ age, data = insurance)
min Q1 median Q3 max mean sd n missing
18 27 39 51 64 39.20703 14.04996 1338 0
Código
# Inspeccionamos la variable Y (costos)favstats(~ charges, data = insurance)
min Q1 median Q3 max mean sd n missing
1121.874 4740.287 9382.033 16639.91 63770.43 13270.42 12110.01 1338 0
Los costos médicos tienen una media de 13,270.42 dólares y una mediana de 9,382.03, lo que indica una distribución sesgada hacia la derecha. Los costos van de 1,121.87 a 63,770.43 dólares.
Gráfico de dispersión.
Visualizamos la relación entre ambas variables para comprobar si una tendencia lineal es adecuada.
Código
ggplot(insurance, aes(x = age, y = charges)) +geom_point(color ="#16a085", size =2, alpha =0.6) +geom_smooth(method ="lm", se =TRUE, color ="#2c3e50", fill ="#16a085", alpha =0.2) +labs(title ="Relación entre la Edad y los Costos Médicos", subtitle ="Dataset Insurance", x ="Edad del beneficiario (años)", y ="Costos médicos facturados (charges)" ) +theme_minimal()
`geom_smooth()` using formula = 'y ~ x'
El diagrama de dispersión muestra una tendencia positiva: a mayor edad, mayores costos médicos. Sin embargo, los puntos aparecen muy dispersos alrededor de la recta y se forman grupos de costos distintos para una misma edad. Esto sugiere que la edad por sí sola no explica bien los costos.
3. Ajuste del modelo de Regresión Lineal Simple
El modelo matemático poblacional se define como:
\[y_i = \beta_0 + \beta_1 x_i + \varepsilon_i\]
Donde:
\(Y_i\) son los costos médicos facturados (charges).
\(X_i\) es la edad del beneficiario (age).
\(\beta_0\) es el intercepto (el costo base estimado cuando la edad es 0).
\(\beta_1\) es la pendiente (el incremento en el costo por cada año adicional de edad).
\(\varepsilon_i\) es el término de error aleatorio.
Estimación de los coeficientes.
Ajustamos el modelo en R utilizando la función lm():
Código
modelo_edad =lm(charges ~ age, data = insurance) summary(modelo_edad)
Call:
lm(formula = charges ~ age, data = insurance)
Residuals:
Min 1Q Median 3Q Max
-8059 -6671 -5939 5440 47829
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3165.9 937.1 3.378 0.000751 ***
age 257.7 22.5 11.453 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 11560 on 1336 degrees of freedom
Multiple R-squared: 0.08941, Adjusted R-squared: 0.08872
F-statistic: 131.2 on 1 and 1336 DF, p-value: < 2.2e-16
Interpretación de los parámetros.
Intercepto (\(\hat{\beta}_0\)): 3165 representa el promedio de los costos médicos estimados en dólares para un individuo de 0 años (interpretación matemática, pues se encuentra fuera del rango observado).
Pendiente (\(\hat{\beta}_1\)): 257.7 indica que, por cada incremento de un año en la edad del beneficiario, se estima que los costos médicos aumenten en promedio 257.7 dólares.
4. Diagnóstico del modelo
Para validar que las inferencias estadísticas del modelo sean confiables, debemos evaluar los supuestos sobre los residuos (\(\varepsilon_i\)): normalidad, homocedasticidad (varianza constante) e independencia.
Independencia (Residuals vs Fitted): En el primer gráfico, los puntos no se distribuyen de manera aleatoria alrededor de la línea roja central (cero), sino que forman tres franjas horizontales separadas. Esto es una evidencia de que no se cumple el supuesto de independencia, pues el modelo puede estar omitiendo otras variables en los individuos.
Normalidad de los errores (Q-Q Residuals): En el gráfico Normal Q-Q, los puntos forman una curva en forma de escalera muy pronunciada y se alejan fuertemente de la línea diagonal, especialmente en la cola derecha. Esto indica que el supuesto de normalidad de los residuos no se cumple de forma aceptable (la distribución es asimétrica).
Homocedasticidad (Scale-Location): Similar al primer gráfico, la dispersión de los residuos estandarizados forma bandas separadas a lo largo de los valores ajustados en lugar de una nube homogénea y constante. Esto sugiere visualmente el incumplimiento del supuesto de homocedasticidad (es decir, existe heterocedasticidad).
Puntos influyentes (Residuals vs Leverage): El gráfico no muestra puntos que superen las bandas de la distancia de Cook (líneas rojas punteadas que no se pueden percibir en la gráfica), lo que indica que, a pesar de la mala distribución de los errores, no hay una sola observación individual que esté alterando o sesgando de forma extrema la pendiente de la regresión por sí sola.
5. Análisis de la variable respuesta
En este apartado se pretende realizar un análisis exploratorio de la variable respuesta (charges), en el cual se realizan diversos gráficos e indicadores para observar el comportamiento y la distribución de la variable.
Código
# Histogramagrafico_1 =ggplot(data=insurance) +geom_histogram(aes(x=charges), binwidth =2000, fill ="#4D6291", color ="black") +theme(axis.text.x =element_text(size =10)) +labs(title ="Histograma - Variable Costos Médicos (charges)", x ="Costos facturados (Dólares)", y ="Frecuencia") +theme(plot.title =element_text(hjust =0.5))grafico_1
En relación con los cuartiles, evaluaremos los puntos de corte que dividen a nuestros beneficiarios en cuatro partes iguales (cuartiles) según lo que se les facturó.
Código
kable(data.frame(Cuartiles =quantile(insurance$charges, prob=c(0.25,0.5,0.75))), caption="Indicadores de posición", align="c")
Indicadores de posición
Cuartiles
25%
4740.287
50%
9382.033
75%
16639.913
Esta representación de los cuartiles se evidencia de una mejor forma en el siguiente gráfico, donde podemos afirmar lo anteriormente dicho y añadiendo que hay una cantidad considerable de pacientes con costos médicos atípicamente altos (puntos rojos):
Código
# Generar el diagrama de cajas (Boxplot)grafico_2 =ggplot(data=insurance) +geom_boxplot(aes(x=charges), col="blue", outlier.color ="red") +labs(title ="Diagrama de cajas - Variable Costos Médicos", x ="Costos facturados (Dólares)", y ="Densidad") +theme(plot.title =element_text(hjust =0.5))grafico_2
Código
# 1. Obtenemos los valorespromedio <-mean(insurance$charges)desviacion <-sd(insurance$charges)# 2. Creamos la estructura Vertical (Indicador vs Valor)tabla_vertical <-data.frame(Indicador =c("Moda", "Varianza", "Desviación Estándar", "Coeficiente de Variación (%)", "Curtosis"),Valor =c(mfv(insurance$charges)[1], var(insurance$charges), desviacion, (desviacion / promedio) *100, kurtosis(insurance$charges) ))# 3. Presentación con Kablekable( tabla_vertical, digits =2, caption ="Indicadores Descriptivos de Costos Médicos (charges)", align =c("l", "c"), col.names =c("Estadístico", "Valor")) %>%kable_styling(bootstrap_options =c("striped", "hover"), full_width =FALSE, position ="center")
Indicadores Descriptivos de Costos Médicos (charges)
Estadístico
Valor
Moda
1639.56
Varianza
146652372.15
Desviación Estándar
12110.01
Coeficiente de Variación (%)
91.26
Curtosis
1.59
Podemos observar que la desviación de los costos médicos varía por encima o por debajo de la media en 12110.01 dólares. Por otro lado, el coeficiente de variación (CV = 91.26%) indica que los costos presentan una alta variabilidad alrededor de su media. Esto refleja que los datos muestran una fuerte heterogeneidad en su distribución.
En cuanto a la forma de la distribución, el coeficiente de curtosis es de 1.59. Al presentar un valor positivo, la distribución se clasifica como leptocúrtica, lo que indica que la concentración de los datos tiene colas más pesadas que las de una distribución normal (presentando una gran cantidad de valores atípicos altos en la cola derecha).
Al evaluar la presencia de valores atípicos mediante el método del Rango Intercuartílico (\(1.5 \times IQR\)), sí se detectó una gran cantidad de valores atípicos (outliers) en la variable costos médicos (charges). A diferencia de una distribución normal, en este caso existen 139 registros que superan la barrera superior aceptable de la distribución (superiores a 34,489 dólares), lo que evidencia un grupo de pacientes con facturaciones médicas excepcionalmente altas.
6. Supuesto de Normalidad de los residuales
Planteamiento de las Hipótesis.
Para cualquier prueba de normalidad sobre los residuales del modelo (\(\varepsilon_i\)):
\(\text{H}_0\) (Hipótesis Nula): Los residuales del modelo siguen una distribución normal (\(\varepsilon_i \sim N(0, \sigma^2)\)).
\(\text{H}_1\) (Hipótesis Alternativa): Los residuales del modelo no siguen una distribución normal.
Regla de Decisión (\(\alpha = 0.05\)):
Si \(p\text{-valor} > 0.05\): No se rechaza\(\text{H}_0\). Se concluye que existe evidencia suficiente de que se cumple el supuesto de normalidad en los residuales.
Si \(p\text{-valor} \le 0.05\): Se rechaza\(\text{H}_0\). Existen evidencias de que los residuales no se distribuyen de forma normal.
Asymptotic one-sample Kolmogorov-Smirnov test
data: modelo_edad$residuals
D = 0.35265, p-value < 2.2e-16
alternative hypothesis: two-sided
Como el \(p\text{-valor} < 2.2\text{e-16}\) es menor que el nivel de significancia\(\alpha = 0.05\), se rechaza la hipótesis nula (\(\text{H}_0\)). Por lo tanto, con un nivel de confianza del 95%, existe suficiente evidencia estadística para afirmar que los residuales del modelo no satisfacen el supuesto de normalidad.
7. Supuesto de Homocedasticidad
Planteamiento de la Hipótesis.
\(\text{H}_0\) (Hipótesis Nula): Los residuales son homocedásticos (la varianza de los errores es constante, \(\sigma_i^2 = \sigma^2\)).
\(\text{H}_1\) (Hipótesis Alternativa): Los residuales son heterocedásticos (la varianza de los errores no es constante).
Regla de Decisión (\(\alpha = 0.05\)):
Si \(p\text{-valor} > 0.05\): No se rechaza\(\text{H}_0 \rightarrow\) Se cumple el supuesto de homocedasticidad.
Si \(p\text{-valor} \le 0.05\): Se rechaza\(\text{H}_0 \rightarrow\) Existe evidencia de heterocedasticidad.
Código
# Prueba formal de Breusch-Paganprueba_bp <-bptest(modelo_edad)print(prueba_bp)
studentized Breusch-Pagan test
data: modelo_edad
BP = 0.0004135, df = 1, p-value = 0.9838
Mediante la prueba de Breusch-Pagan se obtuvo un \(p\text{-valor} = 0.9838\). Al ser el \(p\text{-valor} > 0.05\), no existe evidencia estadística para rechazar la hipótesis nula con un nivel de confianza del 95%. Por lo tanto, se cumple satisfactoriamente el supuesto de homocedasticidad.
8. Supuesto de Independencia
Planteamiento de las Hipótesis
Para la prueba de Durbin-Watson:
\(\text{H}_0\) (Hipótesis Nula): \(\rho = 0\) (Los errores son independientes / No existe autocorrelación en los residuales).
\(\text{H}_1\) (Hipótesis Alternativa): \(\rho \neq 0\) (Existe autocorrelación en los residuales).
Regla de Decisión (\(\alpha = 0.05\)):
Si \(p\text{-valor} > 0.05\): No se rechaza\(\text{H}_0 \rightarrow\) Se cumple el supuesto de independencia.
Si \(p\text{-valor} \le 0.05\): Se rechaza\(\text{H}_0 \rightarrow\) Existe autocorrelación entre los residuales.
Código
# Prueba de Durbin-Watsonprueba_dw <-dwtest(modelo_edad)print(prueba_dw)
Durbin-Watson test
data: modelo_edad
DW = 2.0333, p-value = 0.7285
alternative hypothesis: true autocorrelation is greater than 0
Código
# Residuales en función del ordendatos_indep <-data.frame(Orden =1:nrow(insurance),Residuales =residuals(modelo_edad))# Gráfico de residuales seguidos por orden de observaciónggplot(datos_indep, aes(x = Orden, y = Residuales)) +geom_point(color ="steelblue", size =2) +geom_line(color ="gray60", linetype ="dashed", alpha =0.5) +geom_hline(yintercept =0, linetype ="dashed", color ="#C0392B", linewidth =1) +labs(title ="Residuales por Orden de Observación",subtitle ="Evaluación de Independencia de Errores",x ="Orden de la Observación",y ="Residuales" ) +theme_minimal()
El estadístico de Durbin-Watson es \(\text{DW} \approx 2.03\), un valor muy cercano a 2, lo que indica ausencia de autocorrelación. Al ser el \(p\text{-valor} = 0.7285 > 0.05\), no se rechaza la hipótesis nula (\(\text{H}_0\)). El gráfico de residuales por orden de observación tampoco muestra un patrón claro. Es importante señalar que, al tratarse de un conjunto de datos transversal sin estructura temporal, el orden de los registros no tiene un significado intrínseco, por lo que este resultado debe tomarse solo como una referencia.
9. Conclusiones
El modelo \(\text{charges} = 3,165.89 + 257.72 \cdot \text{age}\) indica que los costos aumentan en promedio 257.72 dólares por cada año de edad.
La edad explica solo el \(8.9\%\) de la variabilidad de los costos (\(R^2 = 0.0894\)), por lo que el modelo tiene un bajo poder explicativo.
No se cumple el supuesto de normalidad (\(\text{Kolmogorov-Smirnov}, p < 2.2\text{e-16}\)).
Se cumple el supuesto de homocedasticidad (\(\text{Breusch-Pagan}, p \approx 0.98\)).
No hay evidencia de autocorrelación (\(\text{DW} \approx 2.03\)), aunque el orden de las filas no es temporal.
Como el modelo no cumple todos los supuestos, se recomienda un modelo de regresión múltiple que incluya otras variables, como smoker y bmi.