Base de datos:

setwd("~/Rstudio/8Semestre/Practica2CC")

#SUbimos base
dataPrac<- read.csv("~/Rstudio/8Semestre/Practica2CC/data_prac_2 1.csv")
dataPrac

Revisión de los datos nulos

#Verificar si hay datos faltantes 

Cuantos datos faltantes hay?

sum(is.na(dataPrac))
## [1] 308

Verificamos cuantos datos vacios tenemos por columna

dataPrac %>%
  summarise_all(~sum(is.na(.)))
#Conocemos el tipo de datos que tenemos
str(dataPrac)
## 'data.frame':    1338 obs. of  8 variables:
##  $ edad   : chr  "19" "18" "28" "33" ...
##  $ sexo   : chr  "femenino" "masculino" "masculino" "masculino" ...
##  $ imc    : chr  "27.9" "33.77" "33" "22.705" ...
##  $ hijos  : int  0 1 3 0 0 0 1 3 2 0 ...
##  $ fumador: chr  "yes" "no" "no" "no" ...
##  $ region : chr  "suroeste" "sureste" "sureste" "noroeste" ...
##  $ clm    : chr  "16884.924" "1725.5523" "4449.462" "21984.47061" ...
##  $ X      : int  NA NA NA NA NA NA NA NA NA NA ...

Podemos ver que si hay datos faltantes

En caso de presentar valores diferentes a tipo numérico, reemplace con NA.

# Convertir columnas numéricas correctamente
dataPrac$edad <- as.numeric(dataPrac$edad)
dataPrac$imc  <- as.numeric(dataPrac$imc)
dataPrac$clm  <- as.numeric(dataPrac$clm)

# Cambiar las variables categóricas a factores
dataPrac$sexo    <- as.factor(dataPrac$sexo)
dataPrac$fumador <- as.factor(dataPrac$fumador)
dataPrac$region  <- as.factor(dataPrac$region)

# Eliminar la columna "X", ya que no es necesaria para el estudio
dataPrac <- dataPrac %>% select(-X)

# Convertir a numérico y reemplazar valores no numéricos con NA
dataPrac$edad <- as.numeric(as.character(dataPrac$edad))
dataPrac$imc <- as.numeric(as.character(dataPrac$imc))
dataPrac$clm <- as.numeric(as.character(dataPrac$clm))

Verifique que las variables tengan el fomato adeacuado para trabajar.

# Verificar cambios
str(dataPrac);
## 'data.frame':    1338 obs. of  7 variables:
##  $ edad   : num  19 18 28 33 NA 31 46 37 37 60 ...
##  $ sexo   : Factor w/ 2 levels "femenino","masculino": 1 2 2 2 2 1 1 1 2 1 ...
##  $ imc    : num  27.9 33.8 33 22.7 28.9 ...
##  $ hijos  : int  0 1 3 0 0 0 1 3 2 0 ...
##  $ fumador: Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 1 1 1 1 ...
##  $ region : Factor w/ 4 levels "noreste","noroeste",..: 4 3 3 2 2 3 3 2 1 2 ...
##  $ clm    : num  16885 1726 4449 21984 3867 ...
summary(dataPrac);
##       edad              sexo          imc            hijos       fumador   
##  Min.   :18.00   femenino :662   Min.   :15.96   Min.   :0.000   no :1064  
##  1st Qu.:27.00   masculino:676   1st Qu.:26.22   1st Qu.:0.000   yes: 274  
##  Median :39.00                   Median :30.30   Median :1.000             
##  Mean   :39.23                   Mean   :30.62   Mean   :1.095             
##  3rd Qu.:51.00                   3rd Qu.:34.59   3rd Qu.:2.000             
##  Max.   :64.00                   Max.   :53.13   Max.   :5.000             
##  NA's   :72                      NA's   :39                                
##       region         clm       
##  noreste :324   Min.   : 1122  
##  noroeste:325   1st Qu.: 4747  
##  sureste :364   Median : 9378  
##  suroeste:325   Mean   :13278  
##                 3rd Qu.:16776  
##                 Max.   :63770  
##                 NA's   :41
##Vemos los NA
vis_miss(dataPrac)

¿Hay manera de detectar valores duplicados?, en caso negativo, ¿qué podría proponer como identificador, para evitar duplicados en el data set?

# Detectar valores duplicados
duplicados <- dataPrac %>% duplicated()

# Contar cuántas filas duplicadas hay
sum(duplicados) 
## [1] 1
# Eliminar filas duplicadas
dataPrac <- dataPrac %>% distinct()

# Verificar estructura después de eliminar duplicados
str(dataPrac)
## 'data.frame':    1337 obs. of  7 variables:
##  $ edad   : num  19 18 28 33 NA 31 46 37 37 60 ...
##  $ sexo   : Factor w/ 2 levels "femenino","masculino": 1 2 2 2 2 1 1 1 2 1 ...
##  $ imc    : num  27.9 33.8 33 22.7 28.9 ...
##  $ hijos  : int  0 1 3 0 0 0 1 3 2 0 ...
##  $ fumador: Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 1 1 1 1 ...
##  $ region : Factor w/ 4 levels "noreste","noroeste",..: 4 3 3 2 2 3 3 2 1 2 ...
##  $ clm    : num  16885 1726 4449 21984 3867 ...

Reemplace los valores no disponibles con las técnicas usadas, y haga unatabla resumen sobre los resultados (summary) de las variables numéricas ¿cuál técnica sugiere usar y por qué?

# Reemplazo con la Media
datos_mean <- data.frame(lapply(dataPrac, function(x) 
  ifelse(is.na(x), mean(x, na.rm = TRUE), x)))

# Reemplazo con la Mediana
datos_median <- data.frame(lapply(dataPrac, function(x) 
  ifelse(is.na(x), median(x, na.rm = TRUE), x)))

# Reemplazo con la Moda (para valores categóricos)
library(modeest)
datos_mode <- data.frame(lapply(dataPrac, function(x) 
  ifelse(is.na(x), mfv(x, na_rm = TRUE), x)))
# Resumen Estadístico de las Variables Numéricas

Para el método de la media

summary(datos_mean)
##       edad            sexo            imc            hijos      
##  Min.   :18.00   Min.   :1.000   Min.   :15.96   Min.   :0.000  
##  1st Qu.:27.00   1st Qu.:1.000   1st Qu.:26.40   1st Qu.:0.000  
##  Median :39.24   Median :2.000   Median :30.59   Median :1.000  
##  Mean   :39.24   Mean   :1.505   Mean   :30.62   Mean   :1.096  
##  3rd Qu.:51.00   3rd Qu.:2.000   3rd Qu.:34.40   3rd Qu.:2.000  
##  Max.   :64.00   Max.   :2.000   Max.   :53.13   Max.   :5.000  
##     fumador          region           clm       
##  Min.   :1.000   Min.   :1.000   Min.   : 1122  
##  1st Qu.:1.000   1st Qu.:2.000   1st Qu.: 4878  
##  Median :1.000   Median :3.000   Median : 9705  
##  Mean   :1.205   Mean   :2.516   Mean   :13287  
##  3rd Qu.:1.000   3rd Qu.:3.000   3rd Qu.:16115  
##  Max.   :2.000   Max.   :4.000   Max.   :63770

Para el método de la mediana

summary(datos_median)
##       edad            sexo            imc            hijos      
##  Min.   :18.00   Min.   :1.000   Min.   :15.96   Min.   :0.000  
##  1st Qu.:27.00   1st Qu.:1.000   1st Qu.:26.40   1st Qu.:0.000  
##  Median :39.00   Median :2.000   Median :30.30   Median :1.000  
##  Mean   :39.23   Mean   :1.505   Mean   :30.61   Mean   :1.096  
##  3rd Qu.:51.00   3rd Qu.:2.000   3rd Qu.:34.40   3rd Qu.:2.000  
##  Max.   :64.00   Max.   :2.000   Max.   :53.13   Max.   :5.000  
##     fumador          region           clm       
##  Min.   :1.000   Min.   :1.000   Min.   : 1122  
##  1st Qu.:1.000   1st Qu.:2.000   1st Qu.: 4878  
##  Median :1.000   Median :3.000   Median : 9382  
##  Mean   :1.205   Mean   :2.516   Mean   :13167  
##  3rd Qu.:1.000   3rd Qu.:3.000   3rd Qu.:16115  
##  Max.   :2.000   Max.   :4.000   Max.   :63770

Para el método de la moda

summary(datos_mode)
##       edad            sexo            imc            hijos      
##  Min.   :18.00   Min.   :1.000   Min.   :15.96   Min.   :0.000  
##  1st Qu.:25.00   1st Qu.:1.000   1st Qu.:26.40   1st Qu.:0.000  
##  Median :38.00   Median :2.000   Median :30.59   Median :1.000  
##  Mean   :38.13   Mean   :1.505   Mean   :30.66   Mean   :1.096  
##  3rd Qu.:51.00   3rd Qu.:2.000   3rd Qu.:34.40   3rd Qu.:2.000  
##  Max.   :64.00   Max.   :2.000   Max.   :53.13   Max.   :5.000  
##     fumador          region           clm       
##  Min.   :1.000   Min.   :1.000   Min.   : 1122  
##  1st Qu.:1.000   1st Qu.:2.000   1st Qu.: 4762  
##  Median :1.000   Median :3.000   Median : 9305  
##  Mean   :1.205   Mean   :2.516   Mean   :13254  
##  3rd Qu.:1.000   3rd Qu.:3.000   3rd Qu.:16587  
##  Max.   :2.000   Max.   :4.000   Max.   :63770

Sugiero utilizar la mediana, ya no se ve afectada por los valores extremos o atípicos y, por lo tanto, proporciona una mejor estimación de la tendencia central en presencia de sesgo.

Reemplazamiento mediante interpolación

# Agregar las variables categóricas desde la base original (dataPrac)
datos_interpol <- data.frame(lapply(dataPrac, function(x) 
  ifelse(is.na(x), na.approx(x, na.rm = FALSE), x)))
datos_interpol <- datos_interpol %>%
  mutate(
    sexo = dataPrac$sexo,
    fumador = dataPrac$fumador,
    region = dataPrac$region,
    hijos = dataPrac$hijos
  )

Usando ggplot, realice un histograma para analizar las variables numéricas, ¿este sería el tipo de gráfico más significativo para su análisis univariante?

# Generar el histograma para la variable IMC
ggplot(datos_interpol, aes(x = imc)) +
  geom_histogram (binwidth = 2, fill = "blue", color = "black", alpha = 0.7) +  # Histograma con bins de tamaño 2
  labs(title = "Distribución del IMC", x = "IMC", y = "Frecuencia") +  # Títulos y etiquetas
  theme_minimal()

¿El grafico es significativo para un análisis univariante? Sí, un histograma es una herramienta muy útil y significativa para un análisis univariante, especialmente cuando se busca analizar la distribución de una variable numérica como el IMC

Calcule la media de monto de reclamación por sexo.

media_sexo <- aggregate(clm ~ sexo, data = datos_interpol, FUN = mean)
print(media_sexo)
##        sexo      clm
## 1  femenino 12517.00
## 2 masculino 14016.57

Calcule la media de monto de reclamación por fumador y sexo.

media_fumador_sexo <- aggregate(clm ~ fumador + sexo, data = datos_interpol, FUN = mean)
print(media_fumador_sexo)
##   fumador      sexo       clm
## 1      no  femenino  8934.788
## 2     yes  femenino 29555.859
## 3      no masculino  8205.914
## 4     yes masculino 32873.799
# Asegúrate de tener la librería ggplot2 cargada
library(ggplot2)

# Crear la gráfica de barras para mostrar la media de 'clm' por 'fumador' y 'sexo'
ggplot(media_fumador_sexo, aes(x = fumador, y = clm, fill = sexo)) +
  geom_bar(stat = "identity", position = "dodge") +  # Barras para cada combinación
  labs(title = "Media del Monto de Reclamación por Fumador y Sexo",
       x = "Fumador",
       y = "Media del Monto de Reclamación") +
  scale_fill_manual(values = c("blue", "pink")) +  # Colores personalizados para 'sexo'
  theme_minimal()  # Tema minimalista

Identifique la región con mayor monto promedio de reclamación.

region_max <- aggregate(clm ~ region, data = datos_interpol, FUN = mean)
region_max[which.max(region_max$clm), ]
# Asegúrate de tener la librería ggplot2 cargada
library(ggplot2)

# Crear la gráfica de barras para mostrar la media de 'clm' por 'region'
ggplot(region_max, aes(x = region, y = clm, fill = region)) +
  geom_bar(stat = "identity") +  # Barras con altura proporcional a la media
  labs(title = "Media del Monto de Reclamación por Región",
       x = "Región",
       y = "Media del Monto de Reclamación") +
  theme_minimal() +  # Tema minimalista
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotar las etiquetas del eje x si las regiones son largas

##Cree una columna con la etiqueta ”obesidad”, si el imc es mayor a 30.

datos_interpol <- datos_interpol %>%
  mutate(obesidad = ifelse(imc > 30, "Obesidad", "No Obesidad"))
head(datos_interpol)

Identifique el top 10 de personas obesas indicando: edad, sexo, hijos, monto de reclamación y región.

topobesos<- datos_interpol %>%
  filter(obesidad == "Obesidad") %>%
  select(edad, sexo, hijos, clm, region) %>%
  arrange(desc(clm)) %>%
  head(10)
print(topobesos)
##    edad      sexo hijos      clm   region
## 1    54  femenino     0 63770.43  sureste
## 2    45 masculino     0 62592.87  sureste
## 3    52 masculino     3 60021.40 noroeste
## 4    31  femenino     1 58571.07  noreste
## 5    33  femenino     0 55135.40 noroeste
## 6    60 masculino     0 52590.83 suroeste
## 7    28 masculino     1 51194.56 suroeste
## 8    64 masculino     2 49577.66  sureste
## 9    59 masculino     1 48970.25  sureste
## 10   44  femenino     0 48885.14  sureste

Obesidad por Región

# Crear el gráfico de barras para obesidad por región
ggplot(datos_interpol, aes(x = region, fill = obesidad)) +
  geom_bar(position = "dodge") +  # Barras separadas por obesidad
  labs(title = "Distribución de Obesidad por Región",
       x = "Región",
       y = "Número de Personas") +
  scale_fill_manual(values = c("lightblue", "salmon")) +  # Colores para las categorías de obesidad
  theme_minimal()  # Tema minimalista