R Markdown

Ejercicio 1.

El estudiante deberá realizar un estudio con una base de datos propia, donde deberá analizar:

  1. Deberá ser elaborado en un archivo autoreproducible R – Markdown.

Ejercicio 2.

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.

Importar la base de datos.

insurance <- read.csv(“insurance.csv”)

View(insurance)

exists(“insurance”)

Función summary

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

Función str

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 ...

Verificar valores nulos por columna

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")

Función mean para el promedio de edades.

cat("El promedio de edades es:", mean(insurance$age, na.rm = TRUE), "\n")
## El promedio de edades es: 39.20703

Histograma de los costos del seguro.

hist (insurance$charges, 
     main = "Distribución de Cargos Médicos", 
     xlab = "Costo ($)", 
     ylab = "Frecuencia", 
     col = "lightgreen", 
     border = "black")

Función mean para el promedio de costos.

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

Interpretación de los gráficos.

  1. El gráfico “Distribución de Edad de los Pacientes” muestra la distribución de edad de los paciente.

  2. 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.

Ejercicio 3.

  1. Relacione dos o más variables numéricas y calcule:

  2. 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

Gráfica del Coeficiente de Correlación.

library(corrplot)
## corrplot 0.95 loaded
corrplot(correlacion, method = "circle")

Interpretación:

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.

Interpretación de los Valores:

Autocorrelaciones (diagonal principal):

Cada variable consigo misma muestra correlación perfecta (valor = 1).

  1. age vs bmi:

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.

  1. age vs children:

Coeficiente: ~0.4 (correlación positiva moderada).

Interpretación: Las personas de mayor edad tienden a tener más hijos cubiertos por el seguro.

  1. bmi vs children:

Coeficiente: ~0.0 (prácticamente no hay correlación lineal).

Interpretación: El número de hijos no afecta el índice de masa corporal.

Conclusiones:

  1. Relación más fuerte: Edad-Número de hijos (0.4)

Esto coincide con lo esperado biológicamente (a mayor edad, más probabilidad de tener hijos).

  1. Relación más débil: BMI-Número de hijos (0.0)

Sugiere que tener más hijos no está asociado con cambios en el BMI.

  1. Ausencia de correlaciones negativas:

Ningún par de variables muestra relación inversa.

Mapa de calor de la Correlación.

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()

Interpretación de las Relaciones:

  1. Age (Edad) vs BMI: Correlación esperada: Débil positiva (0.1-0.3)

Explicación: El BMI tiende a aumentar ligeramente con la edad, pero no es una relación fuerte. Algunos pacientes mayores mantienen BMI saludables.

  1. Age (Edad) vs Children (Hijos):

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).

  1. BMI vs Children:

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.

Ejercicio 4

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.

Definición del modelo.

Modelo de regresión lineal simple: charges en función de age.

modelo_age <- lm(charges ~ age, data = insurance)

Ver resumen del modelo.

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

Interpretación de los Coeficientes:

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

Intercept (β₀):

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)

age (β₁):

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.

Gráfico de dispersión con línea de regresión

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) 

Generar 5 nuevas observaciones y predecir valores

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

Gráfica de resultados.

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.

Análisis del comportamiento del modelo.

  1. Relación positiva entre edad y cargos médicos El modelo sugiere una relación lineal directa: a mayor edad, mayores son los cargos médicos esperados.

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.

  1. Crecimiento constante del costo La pendiente del modelo indica que los cargos médicos aumentan en promedio por una cantidad fija por cada año adicional de edad.

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).