El estudiante deberá realizar un estudio con una base de datos propia, donde deberá analizar:
Descripción de la Base de Datos.
La base de datos insurance.csv contiene 1,338 observaciones y 7 variables, con información individual de personas aseguradas. Su propósito principal es analizar cómo diversos factores (edad, índice de masa corporal, tabaquismo, etc.) influyen en el costo del seguro médico.
insurance <- read.csv(“insurance.csv”)
View(insurance)
exists(“insurance”)
insurance <- read.csv("insurance.csv")
summary(insurance)
## age sex bmi children
## Min. :18.00 Length:1338 Min. :15.96 Min. :0.000
## 1st Qu.:27.00 Class :character 1st Qu.:26.30 1st Qu.:0.000
## Median :39.00 Mode :character Median :30.40 Median :1.000
## Mean :39.21 Mean :30.66 Mean :1.095
## 3rd Qu.:51.00 3rd Qu.:34.69 3rd Qu.:2.000
## Max. :64.00 Max. :53.13 Max. :5.000
## smoker region charges
## Length:1338 Length:1338 Min. : 1122
## Class :character Class :character 1st Qu.: 4740
## Mode :character Mode :character Median : 9382
## Mean :13270
## 3rd Qu.:16640
## Max. :63770
str(insurance)
## 'data.frame': 1338 obs. of 7 variables:
## $ age : int 19 18 28 33 32 31 46 37 37 60 ...
## $ sex : chr "female" "male" "male" "male" ...
## $ bmi : num 27.9 33.8 33 22.7 28.9 ...
## $ children: int 0 1 3 0 0 0 1 3 2 0 ...
## $ smoker : chr "yes" "no" "no" "no" ...
## $ region : chr "southwest" "southeast" "southeast" "northwest" ...
## $ charges : num 16885 1726 4449 21984 3867 ...
cat("\nValores nulos por columna:\n")
##
## Valores nulos por columna:
print(colSums(is.na(insurance)))
## age sex bmi children smoker region charges
## 0 0 0 0 0 0 0
Gráfique el histograma de al menos 2 variables que considere importantes, puede utilizar la función “hist()” (recuerde poner los títulos y nombres a los ejes). # Histograma de la edad
hist(insurance$age,
main = "Distribución de Edad de los Pacientes",
xlab = "Edad",
ylab = "Frecuencia",
col = "lightblue",
border = "black")
cat("El promedio de edades es:", mean(insurance$age, na.rm = TRUE), "\n")
## El promedio de edades es: 39.20703
hist (insurance$charges,
main = "Distribución de Cargos Médicos",
xlab = "Costo ($)",
ylab = "Frecuencia",
col = "lightgreen",
border = "black")
cat("El promedio de los costos en dólares es:", mean(insurance$charges, na.rm = TRUE), "\n")
## El promedio de los costos en dólares es: 13270.42
El gráfico “Distribución de Edad de los Pacientes” muestra la distribución de edad de los paciente.
El gráfico “Distribución de Cargos Médicos” indica que los cargos médicos suelen ser bajos para la mayoría de las personas aseguradas, pero hay una minoría que genera costos muy elevados. Esto es típico en seguros médicos, donde unos pocos casos extremos representan una gran parte del gasto total.
Relacione dos o más variables numéricas y calcule:
Coeficiente de correlación o matriz de correlación.
correlacion <- cor(insurance[, c("age", "bmi", "children")], use = "complete.obs")
print(correlacion)
## age bmi children
## age 1.0000000 0.1092719 0.0424690
## bmi 0.1092719 1.0000000 0.0127589
## children 0.0424690 0.0127589 1.0000000
library(corrplot)
## corrplot 0.95 loaded
corrplot(correlacion, method = "circle")
El gráfico muestra una matriz de correlación entre las variables age (edad), bmi (índice de masa corporal) y children (número de hijos) mediante coeficientes numéricos que van de -1 a 1.
Autocorrelaciones (diagonal principal):
Cada variable consigo misma muestra correlación perfecta (valor = 1).
Coeficiente: ~0.1 (correlación positiva muy débil).
Interpretación: Existe una mínima tendencia a que el BMI aumente ligeramente con la edad.
Coeficiente: ~0.4 (correlación positiva moderada).
Interpretación: Las personas de mayor edad tienden a tener más hijos cubiertos por el seguro.
Coeficiente: ~0.0 (prácticamente no hay correlación lineal).
Interpretación: El número de hijos no afecta el índice de masa corporal.
Esto coincide con lo esperado biológicamente (a mayor edad, más probabilidad de tener hijos).
Sugiere que tener más hijos no está asociado con cambios en el BMI.
Ningún par de variables muestra relación inversa.
options(repos = c(CRAN = "https://cloud.r-project.org"))
install.packages("ggplot2")
## Installing package into 'C:/Users/isz58/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\isz58\AppData\Local\Temp\RtmpgP5kGT\downloaded_packages
library(ggplot2)
library(reshape2)
melted_cor <- melt(correlacion)
ggplot(melted_cor, aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0) +
geom_text(aes(label = round(value, 2)), color = "black", size = 4) +
theme_minimal()
Explicación: El BMI tiende a aumentar ligeramente con la edad, pero no es una relación fuerte. Algunos pacientes mayores mantienen BMI saludables.
Correlación esperada: Moderada positiva (0.3-0.5)
Explicación: Pacientes de mayor edad tienen mayor probabilidad de tener más hijos, aunque hay excepciones notables (adultos jóvenes con varios hijos).
Correlación esperada: Casi nula (0 a 0.1)
Explicación: El número de hijos no parece afectar directamente el índice de masa corporal de los pacientes.
Estime un modelo de regresión lineal simple con las variables utilizadas en el punto 2, siga los pasos vistos en clase 3 para la obtención y explicación de resultados.
Modelo de regresión lineal simple: charges en función de age.
modelo_age <- lm(charges ~ age, data = insurance)
summary(modelo_age)
##
## 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
summary(modelo_age)
##
## 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
Valor esperado de charges cuando age = 0. Es solo un valor base.
Es como el punto de partida de la recta.
No siempre tiene sentido práctico (porque nadie tiene 0 años), pero sirve como base matemática para la ecuación.
Ejemplo: Si β₀ = 2000, eso significa que según el modelo, una persona de 0 años tendría un costo de seguro de $2000 (aunque esto no sea realista)
Por cada año adicional de edad, el costo promedio del seguro aumenta aproximadamente en $257.72 (si el valor estimado es ese).
Este es el valor que aumenta (o disminuye) el costo del seguro por cada año adicional de edad.
Ambos coeficientes son estadísticamente significativos si el valor Pr(>|t|) es < 0.05. Esto es una prueba estadística que te dice si los valores de los coeficientes (β₀ y β₁) son importantes de verdad o si podrían haber salido por casualidad.
Si el valor es menor que 0.05, se considera que el coeficiente es estadísticamente significativo.
Es decir, sí tiene un efecto real en el modelo.
plot(insurance$age, insurance$charges,
main = "Regresión lineal: Charges vs Age",
xlab = "Edad",
ylab = "Cargos Médicos",
pch = 19, col = "skyblue")
abline(modelo_age, col = "red", lwd = 2)
Paso 1: Nuevas observaciones de edad
nuevas_edades <- data.frame(age = c(25, 35, 45, 55, 65))
Paso 2: Usar el modelo para predecir los cargos
valores_predichos <- predict(modelo_age, newdata = nuevas_edades)
Paso 3: Unir ambos en un solo data frame.
resultados <- data.frame(Edad = nuevas_edades$age,
Costo_Predicho = round(valores_predichos, 2))
Paso 4: Imprimir en consola.
cat("Resultados de predicción por edad:\n")
## Resultados de predicción por edad:
for (i in 1:nrow(resultados)) {
cat("Edad:", resultados$Edad[i], "- Costo predicho:", resultados$Costo_Predicho[i], "\n")
}
## Edad: 25 - Costo predicho: 9608.95
## Edad: 35 - Costo predicho: 12186.18
## Edad: 45 - Costo predicho: 14763.4
## Edad: 55 - Costo predicho: 17340.63
## Edad: 65 - Costo predicho: 19917.86
install.packages("ggplot2")
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)
library(reshape2)
ggplot(resultados, aes(x = Edad, y = Costo_Predicho)) +
geom_line(color = "steelblue", size = 1.2) +
geom_point(color = "darkred", size = 3) +
labs(title = "Costo Predicho del Seguro por Edad",
x = "Edad",
y = "Costo Predicho ($)") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Esto concuerda con el comportamiento real esperado en servicios de salud: a mayor edad, mayor riesgo de enfermedades crónicas y necesidad de atención médica.
Este incremento constante no refleja efectos no lineales como un posible aumento más acelerado en edades más avanzadas (lo cual podría explorarse en modelos más complejos como regresión cuadrática o modelos no lineales).