De la base de datos proporcionada con las variables (edad, sexo, índice masa corpo- ral, hijos, fumador, región y monto reclamación), use el archivo Rmd, para realizar lo siguiente: 1. Realice una revisión de los datos nulos, vacíos o si tienen algún otro carácter: (a) En caso de presentar valores diferentes a tipo numérico (las vairables que apliquen), reemplace con NA. (b) Verifique que las variables tengan el fomato adecuado para trabajar. (c) ¿Hay manera de detectar valores duplicados?, en caso negativo, ¿qué podría proponer como identificador, para evitar duplicados en el data set? (d) Reemplace los valores no disponibles con las técnicas usadas, y haga una tabla resumen sobre los resultados (summary) de las variables numéricas, ¿cuál técnica sugiere usar y por qué?
Comenzamos cargando nuestra base de datos y haciendo limpieza remplazando los caracteres no validos por valores nulos
setwd("/home/davidm/Documentos/Programación/R/Comp_C")
datos <- read.csv("data_prac_2.csv", header = T, sep = ",", dec = ".",
na.strings = c("$$", "null", "&&"), stringsAsFactors = T)
Despues le damos un vistazo estadistico a nuestra base y posteriormente revisamos los datos duplicados y vacios. Creamos una base unicamente para trabajar con nuestros datos de una forma numerica
summary(datos)
## 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 s\xed: 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
sum(duplicated(datos))
## [1] 1
sum(is.na(datos))
## [1] 152
dat <- datos%>%
select(clm,where(is.numeric))
View(dat)
Revisamos los registros duplicados y los eliminamos al mismo tiempo verificamos las dimenciones de la base original y la nueva con la que estaremos trabajando
dat%>%
janitor::get_dupes()
## No variable names specified - using all columns.
## clm edad imc hijos dupe_count
## 1 1639.563 19 30.59 0 2
## 2 1639.563 19 30.59 0 2
dat <- datos%>%
distinct()
dim(dat)
## [1] 1337 7
dim(datos)
## [1] 1338 7
Verificamos las clases de nuestros datos para saber si son los correctos o habla que modificarlos
class(dat$edad)
## [1] "integer"
class(dat$sexo)
## [1] "factor"
class(dat$imc)
## [1] "numeric"
class(dat$hijos)
## [1] "integer"
class(dat$fumador)
## [1] "factor"
class(dat$region)
## [1] "factor"
class(dat$clm)
## [1] "numeric"
Aparentemente todos son correctos. Posteriormente generamos varias bases con modificaciones especificas para entender el comportamiento de los datos y que representacion nos es mas favorable
Eliminando los datos vacios
datos_vacios <- datos%>%
na.omit()
sum(is.na(datos_vacios))
## [1] 0
Remplazando datos faltantes con medias
datos_mean <- data.frame(lapply(dat,
function(x) ifelse(is.na(x),
mean(x, na.rm = T), x)))
sum(is.na(datos_mean))
## [1] 0
summary(datos_mean$clm)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1122 4878 9705 13287 16115 63770
Medias recortadas
datos_rec <- data.frame(lapply(dat,
function(x) ifelse(is.na(x),
mean(x, na.rm = T, trim = .25), x)))
sum(is.na(datos_rec))
## [1] 0
summary(datos_rec$clm)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1122 4878 9559 13173 16115 63770
Mediana
datos_med <- data.frame(lapply(dat,
function(x) ifelse(is.na(x),
median(x, na.rm = T), x)))
sum(is.na(datos_med$clm))
## [1] 0
summary(datos_mean$clm)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1122 4878 9705 13287 16115 63770
Mediana
datos_interpol <- data.frame(lapply(dat,
function(x) ifelse(is.na(x),
na.approx(x, na.rm = T), x)))
sum(is.na(datos_interpol))
## [1] 0
summary(datos_interpol$clm)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1122 4796 9411 13274 16819 63770
Moda
datos_moda <- data.frame(lapply(dat,
function(x) ifelse(is.na(x),
mfv(x, na_rm = T), x)))
sum(is.na(datos_moda))
## [1] 0
summary(datos_moda$clm)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1122 4762 9305 13254 16586 63770
Nos quedaremos con datos_interpol
head(datos_interpol)
## edad sexo imc hijos fumador region clm
## 1 19 1 27.900 0 2 4 16884.924
## 2 18 2 33.770 1 1 3 1725.552
## 3 28 2 33.000 3 1 3 4449.462
## 4 33 2 22.705 0 1 2 21984.471
## 5 32 2 28.880 0 1 2 3866.855
## 6 31 1 25.740 0 1 3 3756.622
histograma para analizar las variables numéricas
datos_num <- datos_interpol %>%
select(where(is.numeric)) %>%
pivot_longer(cols = everything(), names_to = "variable", values_to = "valor")
ggplot(datos_num, aes(x = valor)) +
geom_histogram(bins = 30, fill = "steelblue", color = "black", alpha = 0.7) +
facet_wrap(~variable, scales = "free") +
theme_minimal() +
labs(title = "Histogramas de variables nunericas", x = "", y = "Frecuencia")
¿este sería el tipo de gráfico más significativo para su análisis uni-
variante?Si, nos permite visualizar mejor el comportamiento de los
datos
Calcule la media de monto de reclamación por sexo.
sexo_mean <- datos_interpol %>%
group_by(sexo) %>%
summarise(media_clm = mean(clm, na.rm = TRUE))
sexo_mean
## # A tibble: 2 × 2
## sexo media_clm
## <int> <dbl>
## 1 1 12517.
## 2 2 14017.
Calcule la media de monto de reclamación por fumador y sexo.
sexo_fuma_mean <- datos_interpol %>%
group_by(fumador, sexo) %>%
summarise(media_clm = mean(clm, na.rm = TRUE))
## `summarise()` has grouped output by 'fumador'. You can override using the
## `.groups` argument.
sexo_fuma_mean
## # A tibble: 4 × 3
## # Groups: fumador [2]
## fumador sexo media_clm
## <int> <int> <dbl>
## 1 1 1 8935.
## 2 1 2 8206.
## 3 2 1 29556.
## 4 2 2 32874.
Identifique la región con mayor monto promedio de reclamación.
region_max <- datos_interpol %>%
group_by(region) %>%
summarise(media_clm = mean(clm, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(media_clm))
head(region_max)
## # A tibble: 4 × 2
## region media_clm
## <int> <dbl>
## 1 3 14588.
## 2 1 13577.
## 3 2 12418.
## 4 4 12354.
Cree una columna con la etiqueta ”obesidad”, si el imc es mayor a 30.
datos_interpol <- datos_interpol %>%
mutate(obesidad = ifelse(imc > 30, "si", "no"))
head(datos_interpol)
## edad sexo imc hijos fumador region clm obesidad
## 1 19 1 27.900 0 2 4 16884.924 no
## 2 18 2 33.770 1 1 3 1725.552 si
## 3 28 2 33.000 3 1 3 4449.462 si
## 4 33 2 22.705 0 1 2 21984.471 no
## 5 32 2 28.880 0 1 2 3866.855 no
## 6 31 1 25.740 0 1 3 3756.622 no
Identifique el top 10 de personas obesas indicando: edad, sexo, hijos, monto de reclamación y región.
top_obesos <- datos_interpol %>%
filter(obesidad == "si") %>%
select(edad, sexo, hijos, clm, region) %>%
arrange(desc(clm))
head(top_obesos, 10)
## edad sexo hijos clm region
## 1 54 1 0 63770.43 3
## 2 45 2 0 62592.87 3
## 3 52 2 3 60021.40 2
## 4 31 1 1 58571.07 1
## 5 33 1 0 55135.40 2
## 6 60 2 0 52590.83 4
## 7 28 2 1 51194.56 4
## 8 64 2 2 49577.66 3
## 9 59 2 1 48970.25 3
## 10 44 1 0 48885.14 3