#Ejercicio 1
#Se lee la tabla, se identifican los espacios vacíos y se cambian por NA
datos <- read.csv("data_prac_2 1.csv")
sum(is.na(datos))
## [1] 308
sum(datos == "", na.rm = TRUE)
## [1] 104
datos[datos == ""] <- NA
summary(datos)
## edad sexo imc hijos
## Length:1338 Length:1338 Length:1338 Min. :0.000
## Class :character Class :character Class :character 1st Qu.:0.000
## Mode :character Mode :character Mode :character Median :1.000
## Mean :1.095
## 3rd Qu.:2.000
## Max. :5.000
##
## fumador region clm X
## Length:1338 Length:1338 Length:1338 Min. : 1.000
## Class :character Class :character Class :character 1st Qu.: 3.000
## Mode :character Mode :character Mode :character Median : 6.000
## Mean : 5.563
## 3rd Qu.: 8.000
## Max. :10.000
## NA's :308
head(datos)
## edad sexo imc hijos fumador region clm X
## 1 19 femenino 27.9 0 yes suroeste 16884.924 NA
## 2 18 masculino 33.77 1 no sureste 1725.5523 NA
## 3 28 masculino 33 3 no sureste 4449.462 NA
## 4 33 masculino 22.705 0 no noroeste 21984.47061 NA
## 5 <NA> masculino 28.88 0 no noroeste 3866.8552 NA
## 6 31 femenino 25.74 0 no sureste 3756.6216 NA
##Se identifican los posibles valores que está tomando cada variable
unique(datos$sexo)
## [1] "femenino" "masculino"
unique(datos$region)
## [1] "suroeste" "sureste" "noroeste" "noreste"
unique(datos$fumador)
## [1] "yes" "no"
unique(datos$hijos)
## [1] 0 1 3 2 5 4
##Edad,sexo,imc,fumador,region y clm son char, propongo cambiar el tipo de variable a numeric
##Tanto fumdor como sexo como region se deben rediseñar, por ejemplo, si sexo es masculino, se cambia por 1
##Si sexo es femenino, se cambia por 0
##En el caso de región, suroeste=1, sureste=2, noroeste=3, noreste=4
##En el caso de fumador, no=0, yes=1
datos$edad <- as.numeric(datos$edad)
## Warning: NAs introducidos por coerción
datos$imc <- as.numeric(datos$imc)
## Warning: NAs introducidos por coerción
datos$clm <- as.numeric(datos$clm)
## Warning: NAs introducidos por coerción
datos$sexo <- trimws(datos$sexo)
datos$sexo <- ifelse(datos$sexo == "masculino", 1, ifelse(datos$sexo == "femenino", 0, NA))
datos$region <- trimws(datos$region)
datos$region <- case_when(
datos$region == "suroeste" ~ 1,
datos$region == "sureste" ~ 2,
datos$region == "noroeste" ~ 3,
datos$region == "noreste" ~ 4
)
datos$fumador <- trimws(datos$fumador)
datos$fumador <- ifelse(datos$fumador == "no", 0, ifelse(datos$fumador == "yes", 1, NA))
head(datos)
## edad sexo imc hijos fumador region clm X
## 1 19 0 27.900 0 1 1 16884.924 NA
## 2 18 1 33.770 1 0 2 1725.552 NA
## 3 28 1 33.000 3 0 2 4449.462 NA
## 4 33 1 22.705 0 0 3 21984.471 NA
## 5 NA 1 28.880 0 0 3 3866.855 NA
## 6 31 0 25.740 0 0 2 3756.622 NA
summary(datos)
## edad sexo imc hijos
## Min. :18.00 Min. :0.0000 Min. :15.96 Min. :0.000
## 1st Qu.:27.00 1st Qu.:0.0000 1st Qu.:26.22 1st Qu.:0.000
## Median :39.00 Median :1.0000 Median :30.30 Median :1.000
## Mean :39.23 Mean :0.5052 Mean :30.62 Mean :1.095
## 3rd Qu.:51.00 3rd Qu.:1.0000 3rd Qu.:34.59 3rd Qu.:2.000
## Max. :64.00 Max. :1.0000 Max. :53.13 Max. :5.000
## NA's :72 NA's :39
## fumador region clm X
## Min. :0.0000 Min. :1.000 Min. : 1122 Min. : 1.000
## 1st Qu.:0.0000 1st Qu.:2.000 1st Qu.: 4747 1st Qu.: 3.000
## Median :0.0000 Median :2.000 Median : 9378 Median : 6.000
## Mean :0.2048 Mean :2.484 Mean :13278 Mean : 5.563
## 3rd Qu.:0.0000 3rd Qu.:3.000 3rd Qu.:16776 3rd Qu.: 8.000
## Max. :1.0000 Max. :4.000 Max. :63770 Max. :10.000
## NA's :41 NA's :308
##Ahora, si se hubieran cambiado todos los datos no numéricos a NA, se hubiera cambiado casi toda la base
##Se hubiera hecho de la siguiente manera:
## datos <- datos %>% mutate(across(everything(), ~ ifelse(!is.na(as.numeric(.)), as.numeric(.), NA)))
sum(is.na(datos))
## [1] 460
##usando duplicated se pueden detectar valores duplicados en el dataframe
duplicados <- datos[duplicated(datos), ]
sum(duplicated(datos))
## [1] 0
duplicados
## [1] edad sexo imc hijos fumador region clm X
## <0 rows> (or 0-length row.names)
##Se detectaron 0 valores duplicados
##Para eliminarlos, en caso de que hubiera, se usa:
datos_sin_duplicados <- unique(datos)
##Se propone el siguiente identificador
datos$identificador <- paste(datos$edad, datos$sexo, datos$region, sep = "_")
head(datos)
## edad sexo imc hijos fumador region clm X identificador
## 1 19 0 27.900 0 1 1 16884.924 NA 19_0_1
## 2 18 1 33.770 1 0 2 1725.552 NA 18_1_2
## 3 28 1 33.000 3 0 2 4449.462 NA 28_1_2
## 4 33 1 22.705 0 0 3 21984.471 NA 33_1_3
## 5 NA 1 28.880 0 0 3 3866.855 NA NA_1_3
## 6 31 0 25.740 0 0 2 3756.622 NA 31_0_2
##Se observa que existen filas con edad=NA, por lo que se ve afectado su identificador
##Se utilizarán técnicas para llenar los registros NA con algún valor que no afecte
## (O lo más mínimo) al estudio estadístico de los datos
## Reemplazar NA en variables numéricas con la mediana o media según corresponda
## Primero, se usa la media en las siguientes variables porque tenemos una gran cantidad de datos y
## Generalmente, los datos no tienen outliers (registros que distan mucho de la media)
datos$edad <- ifelse(is.na(datos$edad), mean(datos$edad, na.rm = TRUE), datos$edad)
datos$hijos <- ifelse(is.na(datos$hijos), mean(datos$hijos, na.rm = TRUE), datos$hijos)
##Se usa la mediana en los siguientes porque puede haber outliers y son datos continuos
datos$imc <- ifelse(is.na(datos$imc), mean(datos$imc, na.rm = TRUE), datos$imc)
datos$clm <- ifelse(is.na(datos$clm), median(datos$clm, na.rm = TRUE), datos$clm)
# Reemplazar NA en variables categóricas con la moda o un valor específico
# Para Sexo, Fumador y Región, usamos la moda (valor más frecuente)
table(datos$sexo)
##
## 0 1
## 662 676
table(datos$fumador)
##
## 0 1
## 1064 274
table(datos$region)
##
## 1 2 3 4
## 325 364 325 324
datos$fumador <- ifelse(is.na(datos$fumador), 0, datos$fumador)
##Se notó una clara tendencia hacia el resultdo 0 en fumador
##Pero no en las demás, que están distribuidas más o menos uniformemente (se observaron las frecuencias con table)
##Por ello, se colocarán los valores aleatoriamente siguiendo una distribución uniforme
set.seed(123)
datos$sexo <- ifelse(is.na(datos$sexo),
sample(c(0, 1), sum(is.na(datos$sexo)), replace = TRUE),
datos$sexo)
set.seed(123)
datos$region <- ifelse(is.na(datos$region),
sample(c(1,2,3,4), sum(is.na(datos$region)), replace = TRUE),
datos$region)
summary(datos)
## edad sexo imc hijos
## Min. :18.00 Min. :0.0000 Min. :15.96 Min. :0.000
## 1st Qu.:27.00 1st Qu.:0.0000 1st Qu.:26.40 1st Qu.:0.000
## Median :39.23 Median :1.0000 Median :30.59 Median :1.000
## Mean :39.23 Mean :0.5052 Mean :30.62 Mean :1.095
## 3rd Qu.:51.00 3rd Qu.:1.0000 3rd Qu.:34.40 3rd Qu.:2.000
## Max. :64.00 Max. :1.0000 Max. :53.13 Max. :5.000
##
## fumador region clm X
## Min. :0.0000 Min. :1.000 Min. : 1122 Min. : 1.000
## 1st Qu.:0.0000 1st Qu.:2.000 1st Qu.: 4855 1st Qu.: 3.000
## Median :0.0000 Median :2.000 Median : 9378 Median : 6.000
## Mean :0.2048 Mean :2.484 Mean :13158 Mean : 5.563
## 3rd Qu.:0.0000 3rd Qu.:3.000 3rd Qu.:16108 3rd Qu.: 8.000
## Max. :1.0000 Max. :4.000 Max. :63770 Max. :10.000
## NA's :308
## identificador
## Length:1338
## Class :character
## Mode :character
##
##
##
##
##Ejercicio 2
ggplot(datos, aes(x = edad)) +
geom_histogram(binwidth = 5, color = "black", fill = "lightblue", alpha = 0.7) +
labs(title = "Histograma de la Edad", x = "Edad", y = "Frecuencia") +
theme_minimal()

ggplot(datos, aes(x = imc)) +
geom_histogram(binwidth = 5, color = "black", fill = "lightblue", alpha = 0.7) +
labs(title = "Histograma del Índice de Masa Corporal (IMC)", x = "IMC", y = "Frecuencia") +
theme_minimal()

ggplot(datos, aes(x = hijos)) +
geom_histogram(binwidth = 5, color = "black", fill = "lightblue", alpha = 0.7) +
labs(title = "Histograma de la Cantidad de Hijos", x = "Cantidad de Hijos", y = "Frecuencia") +
theme_minimal()

ggplot(datos, aes(x = clm)) +
geom_histogram(binwidth = 5, color = "black", fill = "lightblue", alpha = 0.7) +
labs(title = "Histograma del monto de reclamaión", x = "Monto de Reclamación", y = "Frecuencia") +
theme_minimal()

## Considero que no es lo más viable, relizar el histograma, ya que en variables con comportamiento contínuo
## Sería mejor categorizar las variables, o en todo caso, utilizar un gráfico de densidad o de dispersión
media_clm_por_sexo <- datos %>%
group_by(sexo) %>%
summarise(media_monto_reclamacion = mean(clm, na.rm = TRUE))
media_clm_por_sexo
## # A tibble: 2 × 2
## sexo media_monto_reclamacion
## <dbl> <dbl>
## 1 0 12378.
## 2 1 13922.
fumador_sexo <- datos %>%
group_by(sexo, fumador) %>%
summarise(media_monto_reclamacion = mean(clm, na.rm = TRUE))
## `summarise()` has grouped output by 'sexo'. You can override using the
## `.groups` argument.
fumador_sexo
## # A tibble: 4 × 3
## # Groups: sexo [2]
## sexo fumador media_monto_reclamacion
## <dbl> <dbl> <dbl>
## 1 0 0 8810.
## 2 0 1 29352.
## 3 1 0 8119.
## 4 1 1 32791.
region_recla <- datos %>%
group_by(region) %>%
summarise(media_monto_reclamacion = mean(clm, na.rm = TRUE)) %>%
arrange(desc(media_monto_reclamacion))
region_recla
## # A tibble: 4 × 2
## region media_monto_reclamacion
## <dbl> <dbl>
## 1 2 14425.
## 2 4 13528.
## 3 1 12326.
## 4 3 12204.
datos <- datos %>%
mutate(obesidad = ifelse(imc > 30, "Sí", "No"))
head(datos)
## edad sexo imc hijos fumador region clm X identificador obesidad
## 1 19.00000 0 27.900 0 1 1 16884.924 NA 19_0_1 No
## 2 18.00000 1 33.770 1 0 2 1725.552 NA 18_1_2 Sí
## 3 28.00000 1 33.000 3 0 2 4449.462 NA 28_1_2 Sí
## 4 33.00000 1 22.705 0 0 3 21984.471 NA 33_1_3 No
## 5 39.22512 1 28.880 0 0 3 3866.855 NA NA_1_3 No
## 6 31.00000 0 25.740 0 0 2 3756.622 NA 31_0_2 No
top_10_obesos <- datos %>%
filter(obesidad == "Sí") %>%
select(edad, sexo, hijos, clm, region) %>%
arrange(desc(clm)) %>%
head(10)
top_10_obesos
## edad sexo hijos clm region
## 1 54 0 0 63770.43 2
## 2 45 1 0 62592.87 2
## 3 52 1 3 60021.40 3
## 4 31 0 1 58571.07 4
## 5 33 0 0 55135.40 3
## 6 60 1 0 52590.83 1
## 7 28 1 1 51194.56 1
## 8 64 1 2 49577.66 2
## 9 59 1 1 48970.25 2
## 10 44 0 0 48885.14 2