Los siguientes paquetes son necesarios para hacer limpieza y manipulación de los datos, lo que a su vez permite hacer graficos de estos.
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
Se debe fijar el directorio en el cual se encuentre el archivo con los datos que deseamos importar a R. Esto se puede realizar de la siguiente manera:
setwd("C:/Users/57322/OneDrive - Universidad de los Andes/4. Cuarto Semestre/Taller en R Estadística y Programación/Talleres/Taller 3")
Una vez fijado el directorio, podremos importar la base de datos. Para esto se debe usar la función de Data Input que corresponda al tipo de datos que se quieran importar. En este caso, la función es “read.csv”, pues el archivo es de tipo csv. Se debe nombrar esta base de datos como un objeto en R para poder efectuar procesos sobre él con facilidad. En este caso, el objeto lo llamamos “Geih”:
Geih <- read.csv("geih_hogares_enero_2023.csv")
En este apartado se hacen algunas preguntas para determinar el grado de representación de la encuesta, y qué puede inferirse del tamaño del hogar en Colombia con base en esta.
Para responder a esto, se puede usar una tabla de frecuencias, sobre la cantidad de veces en que se cumple queen la base de datos el MES es igual a 1. Esto se puede hace con la función “table”
table(Geih$MES)
##
## 1
## 24703
Debe notarse que esta es una pregunta sobre la población, no sobre la muestra. Por tanto, para contestar se debe considerar el factor de expansión de la encuesta, esto es el peso representativo de cada observación. En la base de datos, esto se encuentra bajo la columna “FEX_C18”. Considerando esto, para calcular el total de hogares en Colombia de la encuesta, simplemente se deben sumar todos los valores representativos de cada observación, esto se puede hacer con la función “sum”, de la siguiente manera:
sum(Geih$FEX_C18)
## [1] 17228767
Para esta pregunta se debe crear un data frame que resuma la cantidad de datos respecto a una categoría estrato (P4030S1A1). Para esto, primero se debe usar la función “group_by”, que permite hacer operaciones sobre la variable categórica de estrato. A esto se le debe sumar también la función “summarize” que permite sumar la cantidad de hogares según el factor de expansión.
Geih %>%
group_by(P4030S1A1) %>%
summarize(sum(FEX_C18))
## # A tibble: 9 × 2
## P4030S1A1 `sum(FEX_C18)`
## <int> <dbl>
## 1 0 343817.
## 2 1 5950523.
## 3 2 5896031.
## 4 3 3107719.
## 5 4 1046083.
## 6 5 472158.
## 7 6 163709.
## 8 9 127508.
## 9 NA 121218.
De manera análoga a la anterior, se debe agrupar y resumir los datos. Ahora no para un total, sino para una media ponderada. Para esto, se usa la función “weighted.mean” sobre la variable de total de personas en el hogar (P6008).
Geih %>%
group_by(P4030S1A1) %>%
summarize(weighted.mean(P6008))
## # A tibble: 9 × 2
## P4030S1A1 `weighted.mean(P6008)`
## <int> <dbl>
## 1 0 3.54
## 2 1 3.23
## 3 2 2.94
## 4 3 2.68
## 5 4 2.54
## 6 5 2.49
## 7 6 2.31
## 8 9 3.31
## 9 NA 3.66
Para este apartado no se considera el factor de expansión de la encuesta (FEX_C18). Pues nos interesa conocer datos sobre la población encuestada respecto a su gasto en el arriendo.
Las variables P5130 y P5140 son variables que agrupan el costo potencial y efectivo del arriendo, respectivamente. Dicho de otra manera, de los hogares de la encuesta puede que hayan con vivienda propia o que vivan en arriendo. Para el primer caso (P5130), no se puede preguntar por el costo del arriendo, pues no existe tal pago. Sin embargo, se le pueden pedir estimaciones sobre cuánto sería el costo de arriendo de tener que pagarlo. En el segundo caso (P5140) es más fácil, pues ese sí es un pago efectivo y puntual. Por tanto, la nueva variable “arriendo” agrupa esta información. Nótese que dada la descripción de las variables, estas son mutuamente excluyentes, por tanto se debe usar una función condicional para unirlas. Con “ifelse” se establece una condición: “si la variable P5130 es faltante. En la que, de cumplirse, la variable”arriendo” toma el valor de la variable P5140. De no ser P5130 un valor faltante, la nueva variable “arriendo” toma esta en lugar de P5140.
Geih$arriendo <- ifelse(is.na(Geih$P5130), Geih$P5140, Geih$P5130)
Para generar este histograma se debe usar la función ggplot. En esta se debe especificar como primer argumento el data frame que contiene los datos con los que se hará el gráfico. Como segundo argumento, se deben especificar los ejes del gráfico (aes); en este caso, al ser un histograma, sólo se especifica una variable (arriendo) como el eje x. Finalmente para que el gráfico sea de tipo histograma, se usa el pipe “+” que caracteriza la función ggplot, y se añade “geom_histrogram()”, pues corresponde a este tipo de gráfico.
ggplot(Geih, aes(x = arriendo)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Para esto nos apoyamos en el histograma generado, en el cual es visible que la mayoría de datos están acumulados al inicio. Sin embargo, también es visible que hay valores extremos cercanos a 6e+08, que es el límite de la gráfica.
Para filtrar los datos primero debe saberse hasta qué punto. Por tanto, se usa la función “quantile” para ver qué números están asociados a qué percentiles de la distribución de la variable arriendo.
quantile(Geih$arriendo, probs = c(0.25, 0.50, 0.75, 0.9, 0.99))
## 25% 50% 75% 90% 99%
## 300000 450000 600000 1000000 2800000
Geih$perc99 <- quantile(Geih$arriendo, probs = c(0.99))
En este caso, se puede determinar que hasta el percentil 99 no hay valores extremos, pues en este hay un valor asociado de 2800000. Por tanto, asignamos este percentil como el máximo para filtrar los datos, y que no considere valores extremos. Ahora, con la variable perc99 (que agrupa los valores extremos, aquellos encima del percentil 99), se usa la función ggplot usando los datos del data frame base, pero filtrando los datos, para aquellos menores al percentil 99. Se especifica el mismo argumento “arriendo” como el eje x del histograma.
ggplot(Geih[Geih$arriendo < Geih$perc99,], aes(x = arriendo)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
De lo observado en el grafico de la distribución de la variable arriendo, surgen algunas preguntas como: (1) Dadala necesidad de filtrar los datos, ¿qué tan independientes son las variables de la encuesta?; (2) ¿Qué tan representativa es la distribución de los datos respecto a la realidad poblacional?; y (3) ¿Qué porcentaje de los valores extremos (sobre el percentil 99) son de hogares con vivienda propia y qué porcentaje de hogares en arriendo?
En este caso, para crear una variable percápita, se divide la variable de interés (en este caso arriendo), sobre el total de personas en el hogar. Y para crear estadísticas descriptivas se usa la función “summary” sobre esa nueva variable percápita.
Geih$arr_pc = (Geih$arriendo) / (Geih$P6008)
summary(Geih$arr_pc)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6 90000 162500 323233 300000 300000000
Para generar el histograma se usa la función ggplot, como se explicó anteriormente. En este caso la variable de interés será arr_pc.
ggplot(Geih, aes(x = arr_pc)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Nuevamente pueden verse valores extremos, y dado esto se filtran los datos usando la misma metodologíade antes: ver la distribución de los datos, crear una variable asociada a un percentil que agrupe a la mayoría de datos debajo (en este caso también es el percentil 99), y filtrar esa mayoría de datos en el histograma,
quantile(Geih$arr_pc, probs = c(0.25, 0.50, 0.75, 0.9, 0.99))
## 25% 50% 75% 90% 99%
## 90000 162500 300000 500000 1500000
perc99 <- quantile(Geih$arr_pc, probs = c(0.99))
ggplot(Geih[Geih$arr_pc < perc99,], aes(x = arr_pc)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Para mostrar la distribución de una variable para diferentes categorías se deben usar múltiples histogramas, uno para cada categoría. Para crear el histograma se hace lo mismo que se ha realizado anteriormente: filtrar los datos para excluir valores extremos, fijar la variable de interés (arr_pc) como el eje x, y crear histogramas (con geom_histogram). Pero adicional a esto, se usa “facet_wrap(~ P4030S1A1)” para hacer los diferentes histogramas, cada uno asociado a un valor de la variable de estrato (P4030S1A1). El argumento de “scales = ‘free_y’” permite que cada histograma tenga una escala independiente en el eje y, lo que mejora sustancialmente la visualización de datos. Finalmente, la función “labs” es para añadir etiquetas a los ejes de cada histograma y título a la figura en general.
ggplot(Geih[Geih$arr_pc < perc99, ], aes(x = arr_pc)) +
geom_histogram() +
facet_wrap(~ P4030S1A1, scales = 'free_y') +
labs(title = 'Histograma de arriendo per cápita por Estrato',
x = 'arriendo per cápita',
y = 'Count')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Para calcular este promedio se deben considerar valores extremos y no incluirlos. Para diferenciar el grupo de todos los datos del grupo de aquellos que no consideran los atípicos, se define la nueva variable “arr_pc_perc_99”, que filtra los datos con la función condicional “ifelse”.
Geih$arr_pc_perc_99 = ifelse(Geih$arr_pc < perc99, Geih$arr_pc, NA)
Ahora, con los grupos de datos diferenciados, para hallar el promedio de cada uno se debe agrupar según la variable de interés, en este caso el estrato (P4030S1A1)
Geih %>%
group_by(P4030S1A1) %>%
summarize(mean(arr_pc, na.rm = T), mean(arr_pc_perc_99, na.rm = T))
## # A tibble: 9 × 3
## P4030S1A1 `mean(arr_pc, na.rm = T)` `mean(arr_pc_perc_99, na.rm = T)`
## <int> <dbl> <dbl>
## 1 0 183542. 78135.
## 2 1 185875. 131318.
## 3 2 283609. 205948.
## 4 3 422309. 326177.
## 5 4 653048. 459327.
## 6 5 1112356. 614969.
## 7 6 1306036. 735289.
## 8 9 78442. 78442.
## 9 NA 66948. 66948.
Para esto se usa la función condicional “ifelse”, poniendo como condición que si el valor de la variable arr_pc es superior al percentil 99, se sustituya este valor por el extremo de este percentil, de no cumplirse esa condición, se deja el valor tal cual.
Geih$arr_pc = ifelse(Geih$arr_pc > perc99, perc99, Geih$arr_pc)
Lo primero que debe hacerse es filtrar el data frame para sólo incluir valores de estrato entre 1 y 6. Para esto se usa la función filter y se plantean la condición sobre la variable estrato (P4030S1A1): estar entre 1 y 6.
Geih_btw_1_6 <- filter(Geih, P4030S1A1 >= 1 & P4030S1A1 <= 6)
Ahora se debe crear un nuevo objeto, partiendo del data frame filtrado. En este se agrupa los datos por estrato (con la función “group_by) para calcular la media de cada categoría (mediante la función”summarise” y “mean”).El resultado de esta operación se guarda en una nueva variable “promedio_arr_pc”
arriendo_pc_promedio <- Geih_btw_1_6 %>%
group_by(P4030S1A1) %>%
summarise(promedio_arr_pc = mean(arr_pc, na.rm = TRUE))
Ahora con el objeto “arriendo_pc_promedio” se podrá hacer el gráfico de barras. Esto se hace usando la función ggplot, en la que se toma este objeto como la base para graficar. Los ejes que se usan son: estrato como eje x, y promedio de arriendo percápita como eje y. Se usa “geom_bar” para especificar que se quiere hacer un grafico de barras con esa información, y se pone el argumento “stat =”identity” para no alterar los valores del eje y en el gráfico. Finalmente se titula el gráfico y los ejes, respectivamente.
ggplot(arriendo_pc_promedio, aes(x = as.factor(P4030S1A1), y = promedio_arr_pc)) +
geom_bar(stat = "identity") +
labs(title = 'Arriendo percápita promedio por estrato',
x = 'Estrato',
y = 'Arriendo percápita promedio')
Este gráfico permite evidenciar una correlación directa entre el promedio de arriendo percápita y el estrato: a un mayor estrato, el promedio de arriendo percápita es mayor.