Carga de Librerías

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(mice)
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
library(modeest)

Carga de Datos

datos <- read.csv(file.choose(), stringsAsFactors = FALSE)

1. Revisión de Datos

a) Identificación de Valores Nulos o Vacíos

colSums(datos == "")
##    edad    sexo     imc   hijos fumador  region     clm       X 
##      53       0      24       0       0       0      27      NA

b) Conversión de Variables a Tipo Numérico

datos$edad <- as.numeric(as.character(datos$edad))
## Warning: NAs introducidos por coerción
datos$imc <- as.numeric(as.character(datos$imc))
## Warning: NAs introducidos por coerción
datos$clm <- as.numeric(as.character(datos$clm))
## Warning: NAs introducidos por coerción
datos[c("edad", "imc", "clm", "hijos")] <- lapply(datos[c("edad", "imc", "clm", "hijos")], as.numeric)

c) Verificación del Formato de Variables

str(datos)
## 'data.frame':    1338 obs. of  8 variables:
##  $ edad   : num  19 18 28 33 NA 31 46 37 37 60 ...
##  $ sexo   : chr  "femenino" "masculino" "masculino" "masculino" ...
##  $ imc    : num  27.9 33.8 33 22.7 28.9 ...
##  $ hijos  : num  0 1 3 0 0 0 1 3 2 0 ...
##  $ fumador: chr  "yes" "no" "no" "no" ...
##  $ region : chr  "suroeste" "sureste" "sureste" "noroeste" ...
##  $ clm    : num  16885 1726 4449 21984 3867 ...
##  $ X      : int  NA NA NA NA NA NA NA NA NA NA ...

d) Eliminación de Duplicados

duplicados <- datos %>% duplicated()
sum(duplicados) 
## [1] 0
datos <- datos %>% distinct()

2. Manejo de Valores Faltantes

a) Reemplazo con Media, Mediana e Interpolación

datos_num <- select(datos, edad, imc, clm)

datos_mean <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)))
summary(datos_mean)
##       edad            imc             clm       
##  Min.   :18.00   Min.   :15.96   Min.   : 1122  
##  1st Qu.:27.00   1st Qu.:26.40   1st Qu.: 4855  
##  Median :39.23   Median :30.59   Median : 9674  
##  Mean   :39.23   Mean   :30.62   Mean   :13278  
##  3rd Qu.:51.00   3rd Qu.:34.40   3rd Qu.:16108  
##  Max.   :64.00   Max.   :53.13   Max.   :63770
datos_median <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), median(x, na.rm = TRUE), x)))
summary(datos_median)
##       edad            imc             clm       
##  Min.   :18.00   Min.   :15.96   Min.   : 1122  
##  1st Qu.:27.00   1st Qu.:26.40   1st Qu.: 4855  
##  Median :39.00   Median :30.30   Median : 9378  
##  Mean   :39.21   Mean   :30.61   Mean   :13158  
##  3rd Qu.:51.00   3rd Qu.:34.40   3rd Qu.:16108  
##  Max.   :64.00   Max.   :53.13   Max.   :63770
datos_interpol <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), na.approx(x, na.rm = FALSE), x)))
summary(datos_interpol)
##       edad            imc             clm       
##  Min.   :18.00   Min.   :15.96   Min.   : 1122  
##  1st Qu.:27.00   1st Qu.:26.24   1st Qu.: 4784  
##  Median :39.00   Median :30.40   Median : 9410  
##  Mean   :39.27   Mean   :30.62   Mean   :13265  
##  3rd Qu.:51.00   3rd Qu.:34.56   3rd Qu.:16813  
##  Max.   :64.00   Max.   :53.13   Max.   :63770

3. Análisis Exploratorio de Datos

a) Histogramas

ggplot(datos_interpol, aes(x = imc)) +
  geom_histogram(binwidth = 2, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Distribución del IMC", x = "IMC", y = "Frecuencia") +
  theme_minimal()

ggplot(datos_interpol, aes(x = clm)) +
  geom_histogram(binwidth = 1000, fill = "green", color = "black", alpha = 0.7) +
  labs(title = "Distribución del Monto de Reclamación (CLM)", x = "Monto de Reclamación", y = "Frecuencia") +
  theme_minimal()

b) Cálculo de la Media del Monto de Reclamación por Sexo

datos_interpol <- datos_interpol %>% mutate(
  sexo = datos$sexo,
  fumador = datos$fumador,
  region = datos$region,
  hijos = datos$hijos
)

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

c) Media del Monto de Reclamación por Fumador y Sexo

media_fumador_sexo <- aggregate(clm ~ fumador + sexo, data = datos_interpol, FUN = mean)
media_fumador_sexo
##   fumador      sexo       clm
## 1      no  femenino  8934.788
## 2     yes  femenino 29555.859
## 3      no masculino  8193.213
## 4     yes masculino 32873.799

d) 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), ]
##    region      clm
## 3 sureste 14588.32

e) Creación de la Variable “Obesidad”

datos_interpol$obesidad <- ifelse(datos_interpol$imc > 30, "Sí", "No")

f) Top 10 Personas Obesas con Mayor Monto de Reclamación

top10_obesos <- datos_interpol %>%
  filter(obesidad == "Sí") %>%
  select(edad, sexo, hijos, clm, region) %>%
  arrange(desc(clm)) %>%
  head(10)

top10_obesos
##    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