Cargar librerías necesarias

library(dplyr) library(skimr) library(visdat) library(ggplot2) library(modeest) library(zoo) library(mice)

setwd(“C:/Users/ALENKAR/Documents/CC/TAREA2”)

Cargar la base de datos

datos <- read.csv(“data_prac_2 1.csv”, header = TRUE, sep = “,”, dec = “.”, na.strings = c(“null”, ““), stringsAsFactors = FALSE)

Verificar nombres de columnas

colnames(datos)

Contar valores faltantes por columna

datos %>% summarise_all(~sum(is.na(.)))

Revisar estructura de datos

str(datos)

1. Limpieza de datos

Convertir variables numéricas correctamente

datos <- datos %>% mutate( edad = as.numeric(edad), imc = as.numeric(imc), clm = as.numeric(clm), hijos = as.numeric(hijos)
)

Convertir variables categóricas a factores

datos <- datos %>% mutate( sexo = as.factor(sexo), fumador = as.factor(fumador), region = as.factor(region) )

Eliminar columna innecesaria “X”

if (“X” %in% colnames(datos)) { datos <- datos %>% select(-X) }

Verificar la estructura después de la conversión

str(datos)

Contar valores NA después de la conversión

datos %>% summarise_all(~sum(is.na(.)))

Detectar valores duplicados y eliminarlos

duplicados <- duplicated(datos) sum(duplicados) # Muestra cuántas filas están duplicadas

Eliminar duplicados

datos <- datos %>% distinct()

1d. Imputación de valores faltantes

Seleccionar solo las columnas numéricas

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

Diferentes métodos de imputación

Reemplazo con la media

datos_mean <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)))

Reemplazo con la mediana

datos_median <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), median(x, na.rm = TRUE), x)))

Reemplazo con la moda (para valores numéricos)

datos_mode <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), mfv(x, na_rm = TRUE)[1], x))) # Se usa [1] para evitar errores en caso de múltiples modas

Reemplazo con la media recortada (trimmed mean)

datos_trimmed_mean <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE, trim = 0.1), x)))

Interpolación de valores faltantes

datos_interpol <- data.frame(lapply(datos_num, function(x) ifelse(is.na(x), na.approx(x, na.rm = FALSE), x)))

Imputación con regresión lineal (usando mice)

imputed_data <- mice(datos, method = “norm.predict”, m = 1) datos_lm <- complete(imputed_data)

Comparación de los métodos de imputación

summary(datos_mean) summary(datos_median) summary(datos_mode) summary(datos_trimmed_mean) summary(datos_interpol) summary(datos_lm)

Elección del método de imputación

Se recomienda:

- Mediana si hay valores atípicos

- Interpolación si los datos tienen una tendencia

- Regresión lineal si hay relaciones fuertes entre variables

- Moda si es una variable categórica

2. Análisis con la base imputada (Interpolación)

Agregar variables categóricas de la base original a la base imputada

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

Verificar que las columnas categóricas se agregaron correctamente

colnames(datos_interpol)

2a. Histograma del IMC

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

¿Es adecuado para análisis univariante?

- Sí, si solo queremos ver la distribución de una variable.

- Para comparar grupos, sería mejor usar un boxplot o densidad.

2b. Media del monto de reclamación por sexo

media_sexo <- datos_interpol %>% group_by(sexo) %>% summarise(media_clm = mean(clm, na.rm = TRUE))

print(media_sexo)

2c. Media del monto de reclamación por fumador y sexo

media_fumador_sexo <- datos_interpol %>% group_by(fumador, sexo) %>% summarise(media_clm = mean(clm, na.rm = TRUE))

print(media_fumador_sexo)

2d. Región con mayor monto promedio de reclamación

region_max <- datos_interpol %>% group_by(region) %>% summarise(media_clm = mean(clm, na.rm = TRUE)) %>% arrange(desc(media_clm))

print(region_max[1, ]) # Muestra la región con el monto más alto

2e. Crear columna de obesidad (IMC > 30)

datos_interpol <- datos_interpol %>% mutate(obesidad = ifelse(imc > 30, “Sí”, “No”))

2f. Top 10 de personas obesas con mayor monto de reclamación

top_obesos <- datos_interpol %>% filter(obesidad == “Sí”) %>% select(edad, sexo, hijos, clm, region) %>% arrange(desc(clm)) %>% slice_head(n = 10) # Asegura exactamente 10 resultados

print(top_obesos)