data_prac2 <- read.csv("/Users/emilianorubioramos/Desktop/8vo Semestre/Cómputo Cientifico/data_prac_2.csv",
dec = ".",
na.strings = c("&&", "null", "$"),
stringsAsFactors = TRUE)
# Convertimos las variables a numéricas adecuadamente
data_prac2$edad <- as.numeric(as.character(data_prac2$edad))
data_prac2$imc <- as.numeric(as.character(data_prac2$imc))
data_prac2$hijos <- as.numeric(as.character(data_prac2$hijos))
data_prac2$clm <- as.numeric(as.character(data_prac2$clm))## '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 : num 0 1 3 0 0 0 1 3 2 0 ...
## $ fumador: Factor w/ 2 levels "no","si": 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 ...
## 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 si: 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
## edad sexo imc hijos fumador region clm dupe_count
## 1 19 masculino 30.59 0 no noroeste 1639.563 2
## 2 19 masculino 30.59 0 no noroeste 1639.563 2
— Hacemos un data frame con las variables numéricas
variables_numericas <- data.frame(
edad = data_prac2$edad,
imc = data_prac2$imc,
hijos = data_prac2$hijos,
monto_reclamacion = data_prac2$clm
)— Reemplazamos los NA con diferentes métodos
# Reemplazar con la media
datos_mean <- data.frame(lapply(variables_numericas, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)))
# Reemplazar con la media recortada
datos_mean_rec <- data.frame(lapply(variables_numericas, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE, trim = 0.15), x)))
# Reemplazar con la mediana
datos_median <- data.frame(lapply(variables_numericas, function(x) ifelse(is.na(x), median(x, na.rm = TRUE), x)))
# Reemplazar por interpolación
datos_interp <- data.frame(lapply(variables_numericas, function(x) ifelse(is.na(x), na.approx(x, na.rm = TRUE), x)))
# Reemplazar con la moda
datos_moda <- data.frame(lapply(variables_numericas, function(x) ifelse(is.na(x), mfv(x, na_rm = TRUE), x)))## Datos originales con NA:
## edad imc hijos monto_reclamacion
## Min. :18.00 Min. :15.96 Min. :0.000 Min. : 1122
## 1st Qu.:27.00 1st Qu.:26.22 1st Qu.:0.000 1st Qu.: 4750
## Median :39.00 Median :30.30 Median :1.000 Median : 9382
## Mean :39.24 Mean :30.62 Mean :1.096 Mean :13287
## 3rd Qu.:51.00 3rd Qu.:34.59 3rd Qu.:2.000 3rd Qu.:16781
## Max. :64.00 Max. :53.13 Max. :5.000 Max. :63770
## NA's :72 NA's :39 NA's :41
##
## Datos con media:
## edad imc hijos monto_reclamacion
## Min. :18.00 Min. :15.96 Min. :0.000 Min. : 1122
## 1st Qu.:27.00 1st Qu.:26.40 1st Qu.:0.000 1st Qu.: 4878
## Median :39.24 Median :30.59 Median :1.000 Median : 9705
## Mean :39.24 Mean :30.62 Mean :1.096 Mean :13287
## 3rd Qu.:51.00 3rd Qu.:34.40 3rd Qu.:2.000 3rd Qu.:16115
## Max. :64.00 Max. :53.13 Max. :5.000 Max. :63770
##
## Datos con media recortada:
## edad imc hijos monto_reclamacion
## Min. :18.00 Min. :15.96 Min. :0.000 Min. : 1122
## 1st Qu.:27.00 1st Qu.:26.40 1st Qu.:0.000 1st Qu.: 4878
## Median :39.07 Median :30.43 Median :1.000 Median : 9705
## Mean :39.23 Mean :30.61 Mean :1.096 Mean :13197
## 3rd Qu.:51.00 3rd Qu.:34.40 3rd Qu.:2.000 3rd Qu.:16115
## Max. :64.00 Max. :53.13 Max. :5.000 Max. :63770
##
## Datos con mediana:
## edad imc hijos monto_reclamacion
## Min. :18.00 Min. :15.96 Min. :0.000 Min. : 1122
## 1st Qu.:27.00 1st Qu.:26.40 1st Qu.:0.000 1st Qu.: 4878
## Median :39.00 Median :30.30 Median :1.000 Median : 9382
## Mean :39.23 Mean :30.61 Mean :1.096 Mean :13167
## 3rd Qu.:51.00 3rd Qu.:34.40 3rd Qu.:2.000 3rd Qu.:16115
## Max. :64.00 Max. :53.13 Max. :5.000 Max. :63770
##
## Datos con interpolación:
## edad imc hijos monto_reclamacion
## Min. :18.00 Min. :15.96 Min. :0.000 Min. : 1122
## 1st Qu.:27.00 1st Qu.:26.22 1st Qu.:0.000 1st Qu.: 4796
## Median :39.00 Median :30.40 Median :1.000 Median : 9411
## Mean :39.29 Mean :30.62 Mean :1.096 Mean :13274
## 3rd Qu.:51.00 3rd Qu.:34.58 3rd Qu.:2.000 3rd Qu.:16819
## Max. :64.00 Max. :53.13 Max. :5.000 Max. :63770
##
## Datos con moda:
## edad imc hijos monto_reclamacion
## Min. :18.00 Min. :15.96 Min. :0.000 Min. : 1122
## 1st Qu.:25.00 1st Qu.:26.40 1st Qu.:0.000 1st Qu.: 4762
## Median :38.00 Median :30.59 Median :1.000 Median : 9305
## Mean :38.13 Mean :30.66 Mean :1.096 Mean :13254
## 3rd Qu.:51.00 3rd Qu.:34.40 3rd Qu.:2.000 3rd Qu.:16586
## Max. :64.00 Max. :53.13 Max. :5.000 Max. :63770
Se recomienda utilizar el método de interpolación para reemplazar los valores NA, ya que proporciona una estimación más precisa al considerar la tendencia de los datos.
Actualizamos la base para contemplar nuevamente las variables no numéricas
datos_completos <- data.frame(
sexo = data_prac2$sexo,
fumador = data_prac2$fumador,
region = data_prac2$region,
datos_interp
)
colnames(datos_completos)[colnames(datos_completos) == "monto_reclamacion"] <- "monto_reclamacion"datos_long <- pivot_longer(
datos_completos,
cols = c(edad, imc, hijos, monto_reclamacion),
names_to = "variable",
values_to = "valor"
)
ggplot(datos_long, aes(x = valor, fill = variable)) +
geom_histogram(color = "white", alpha = 0.7, bins = 30) +
facet_wrap(~ variable, scales = "free", ncol = 2) +
scale_fill_viridis_d() +
labs(
title = "Distribución de variables numéricas",
x = "Valor",
y = "Frecuencia",
fill = "Variable"
) +
theme(
legend.position = "none",
strip.text = element_text(size = 12, face = "bold"),
plot.title = element_text(hjust = 0.5, size = 16)
)ggplot(datos_long, aes(x = valor, fill = variable)) +
geom_density(alpha = 0.7) +
facet_wrap(~ variable, scales = "free", ncol = 2) +
scale_fill_viridis_d() +
labs(
title = "Densidad de variables numéricas",
x = "Valor",
y = "Densidad",
fill = "Variable"
) +
theme(
legend.position = "none",
strip.text = element_text(size = 12, face = "bold"),
plot.title = element_text(hjust = 0.5, size = 16)
)reclamacion_por_sexo <- datos_completos %>%
group_by(sexo) %>%
summarise(promedio_reclamacion = mean(monto_reclamacion))
ggplot(reclamacion_por_sexo, aes(x = sexo, y = promedio_reclamacion, fill = sexo)) +
geom_col() +
geom_text(aes(label = round(promedio_reclamacion, 2)), vjust = -0.5, size = 4) +
scale_fill_brewer(palette = "Set1") +
labs(
title = "Monto promedio de reclamación por sexo",
x = "Sexo",
y = "Monto promedio de reclamación"
) +
theme(legend.position = "none")reclamacion_por_sexo_fumador <- datos_completos %>%
group_by(sexo, fumador) %>%
summarise(promedio_reclamacion = mean(monto_reclamacion), .groups = "drop")
ggplot(reclamacion_por_sexo_fumador, aes(x = sexo, y = promedio_reclamacion, fill = fumador)) +
geom_col(position = "dodge", width = 0.7) +
geom_text(aes(label = round(promedio_reclamacion, 2)),
position = position_dodge(width = 0.7),
vjust = -0.5, size = 3.5) +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Monto promedio de reclamación por sexo y condición de fumador",
x = "Sexo",
y = "Monto promedio de reclamación",
fill = "Fumador"
) +
theme(legend.position = "bottom")reclamacion_por_region <- datos_completos %>%
group_by(region) %>%
summarise(promedio_reclamacion = mean(monto_reclamacion)) %>%
arrange(desc(promedio_reclamacion))
ggplot(reclamacion_por_region, aes(x = reorder(region, promedio_reclamacion), y = promedio_reclamacion, fill = region)) +
geom_col() +
geom_text(aes(label = round(promedio_reclamacion, 2)), hjust = -0.1, size = 3.5) +
scale_fill_viridis_d() +
labs(
title = "Monto promedio de reclamación por región",
subtitle = "Ordenado de mayor a menor",
x = "Región",
y = "Monto promedio de reclamación"
) +
theme(
legend.position = "none",
axis.text.x = element_text(angle = 45, hjust = 1)
) +
coord_flip()datos_completos <- datos_completos %>%
mutate(estado_nutricional = case_when(
imc > 40 ~ "Obesidad mórbida",
imc > 35 ~ "Obesidad clase II",
imc > 30 ~ "Obesidad clase I",
imc > 25 ~ "Sobrepeso",
imc > 18.5 ~ "Peso normal",
TRUE ~ "Bajo peso"
))
ggplot(datos_completos, aes(x = estado_nutricional, fill = estado_nutricional)) +
geom_bar() +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5, size = 3.5) +
scale_fill_brewer(palette = "RdYlBu") +
labs(
title = "Distribución por estado nutricional",
x = "Estado nutricional",
y = "Cantidad de personas"
) +
theme(
legend.position = "none",
axis.text.x = element_text(angle = 45, hjust = 1)
)top_obesos <- datos_completos %>%
filter(grepl("Obesidad", estado_nutricional)) %>%
select(imc, estado_nutricional, edad, sexo, hijos, monto_reclamacion, region) %>%
arrange(desc(imc)) %>%
head(10)
knitr::kable(top_obesos,
caption = "Top 10 personas con mayor IMC",
col.names = c("IMC", "Estado Nutricional", "Edad", "Sexo", "Hijos", "Monto Reclamación", "Región"))| IMC | Estado Nutricional | Edad | Sexo | Hijos | Monto Reclamación | Región |
|---|---|---|---|---|---|---|
| 53.13 | Obesidad mórbida | 18 | masculino | 0 | 1163.463 | sureste |
| 52.58 | Obesidad mórbida | 22 | masculino | 1 | 44501.398 | sureste |
| 50.38 | Obesidad mórbida | 23 | masculino | 1 | 2438.055 | sureste |
| 49.06 | Obesidad mórbida | 58 | masculino | 0 | 11381.325 | sureste |
| 47.74 | Obesidad mórbida | 52 | masculino | 1 | 9748.911 | sureste |
| 47.60 | Obesidad mórbida | 37 | femenino | 2 | 46113.511 | suroeste |
| 47.52 | Obesidad mórbida | 47 | masculino | 1 | 8083.920 | sureste |
| 47.41 | Obesidad mórbida | 54 | femenino | 0 | 63770.428 | sureste |
| 46.75 | Obesidad mórbida | 52 | femenino | 5 | 12592.534 | sureste |
| 46.70 | Obesidad mórbida | 54 | femenino | 2 | 11538.421 | suroeste |
ggplot(top_obesos, aes(x = reorder(paste("Persona", row.names(top_obesos)), imc), y = imc, fill = sexo)) +
geom_col() +
geom_text(aes(label = round(imc, 1)), hjust = -0.1, size = 3.5) +
scale_fill_brewer(palette = "Set1") +
labs(
title = "Top 10 personas con mayor IMC",
x = "",
y = "IMC",
fill = "Sexo"
) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1)
) +
coord_flip()datos_obesos <- datos_completos %>%
filter(grepl("Obesidad", estado_nutricional))
ggplot(datos_obesos, aes(x = edad, y = monto_reclamacion, size = imc, color = sexo)) +
geom_point(alpha = 0.7) +
facet_wrap(~ region) +
scale_size_continuous(range = c(2, 8)) +
scale_color_brewer(palette = "Set1") +
labs(
title = "Relación entre edad, monto de reclamación e IMC",
subtitle = "Para personas con obesidad, por región",
x = "Edad",
y = "Monto de reclamación",
size = "IMC",
color = "Sexo"
) +
theme(
legend.position = "right",
strip.text = element_text(size = 10, face = "bold")
)