1.1 Definir los paquetes a utilizar en el análisis y algunas características básicas.
Cargar los paquetes dplyr, ggplot2, DescTools.
library(dplyr)
Warning: package 'dplyr' was built under R version 4.3.3
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.3.3
library(DescTools)
Warning: package 'DescTools' was built under R version 4.3.3
Configurar para que los resultados no salgan en notación científica.
options(scipen=999)
1.2 Seleccionar variables de análisis
Como se menciono en la primera parte de este análisis https://rpubs.com/Julieth_ZorroM/EM_2021, se quiere analizar la pregunta de afiliación a organizaciones y redes sociales (NPCJP1x), teniendo en cuenta variables de edad, sexo, y ubicación geográfica.
Entonces, para esto se tiene que trabajaremos con las siguientes variables:
Table 1: Variables a analizar
Nombre columna
Texto pregunta
Rango
MPIO
Municipio
CLASE
Clase
Cabecera
Centros poblados
Área rural dispersa
NOMBRE LOCALIDAD
Nombre de la localidad
*Aplica solo cuando el municipio es Bogotá D.C.
NOMBRE_UPZ_GRUPO
Nombres de UPZ individuales + nombres agrupaciones de UPZ
NPCEP4
4.¿Cuántos años cumplidos tiene…?
NPCEP5
Sexo al nacer
Hombre
Mujer
Intersexual (solo para personas de 15 años y más)
1.3 Filtrar la base de datos a analizar
Con ayuda de la librería dplyr seleccionaremos las variables que se utilizaran para el análisis.
bd_def <- bd %>%#Variables que se van a utilizar select(DIRECTORIO.x,DIRECTORIO_HOG.x,SECUENCIA_P.x,DIRECTORIO_PER,ORDEN.x,MPIO, CLASE,NOMBRE_LOCALIDAD,NOMBRE_UPZ_GRUPO,NPCEP4,NPCEP5A,NPCJP1A,NPCJP1B,NPCJP1C,NPCJP1D,NPCJP1E,NPCJP1F,NPCJP1G,NPCJP1H,NPCJP1I,NPCJP1J,NPCJP1K,NPCJP1L,NPCJP1M,NPCJP1N,NPCJP10,NPCJP1P,NPCJP1Q,FEX_C.x) names(bd)
Este código está creando una nueva base de datos llamada bd a partir de la base bdfinal, usando el paquete dplyr para seleccionar columnas específicas, así:
bd <- bdfinal %>%:
Aquí, bd es la nueva tabla (data frame) que se creará.
bdfinal %>% es el punto de partida, que indica que vamos a procesar la tabla bdfinal.
%>% es el operador pipe que pasa el resultado de bdfinal a la siguiente función.
select(...):
select() se usa para elegir columnas específicas de bdfinal que se incluirán en bd.
Dentro de select(), se listan los nombres de las columnas que queremos extraer.
Con el fin de analizar la distribución de frecuencias de una variable categórica, podemos utilizar la función de Rbase table. En el siguiente ejemplo, se presenta la distribución para las localidades de la EM - 2021:
table(bd_def$NOMBRE_LOCALIDAD, useNA ="ifany")
Antonio Nariño Barrios Unidos Bosa
50027 4012 6197 10965
Chapinero Ciudad Bolívar Engativá Fontibón
8000 15166 16272 15198
Kennedy La Candelaria Los Mártires Puente Aranda
23679 2075 4232 8160
Rafael Uribe Uribe San Cristóbal Santa Fe Suba
10379 11182 8897 22213
Sumapaz Teusaquillo Tunjuelito Usaquén
1707 10746 4100 15712
Usme
11557
Esta línea crea una tabla de frecuencias para la variable NOMBRE_LOCALIDAD en la base de datos bd_def.
useNA = "ifany" hace que R incluya en la tabla cualquier valor NA (faltante) si existe. Esto es útil para saber cuántos valores están ausentes.
En este caso, la variable NOMBRE_LOCALIDAD tiene 50.027 registros en blanco, estos deben corresponder a otros municipios encuestados diferentes a la ciudad de Bogotá D.C. - más adelante probaremos esta hipótesis 👩🏻🏫
El resultado es una tabla que muestra el número de veces que cada localidad aparece en NOMBRE_LOCALIDAD.
Antonio Nariño Barrios Unidos Bosa
50027 4012 6197 10965
Chapinero Ciudad Bolívar Engativá Fontibón
8000 15166 16272 15198
Kennedy La Candelaria Los Mártires Puente Aranda
23679 2075 4232 8160
Rafael Uribe Uribe San Cristóbal Santa Fe Suba
10379 11182 8897 22213
Sumapaz Teusaquillo Tunjuelito Usaquén
1707 10746 4100 15712
Usme Sum
11557 260476
Esta línea utiliza addmargins() para añadir una fila o columna de totales a la tabla de frecuencias.
Agrega un total al final, lo que permite ver el número total de registros (incluidos los NA) en NOMBRE_LOCALIDAD. Para este caso, se tiene que el total de registros SUM es 260.476.
prop.table(table(bd_def$NOMBRE_LOCALIDAD))
Antonio Nariño Barrios Unidos Bosa
0.192059921 0.015402571 0.023791059 0.042096009
Chapinero Ciudad Bolívar Engativá Fontibón
0.030713002 0.058224174 0.062470247 0.058347026
Kennedy La Candelaria Los Mártires Puente Aranda
0.090906648 0.007966185 0.016247178 0.031327262
Rafael Uribe Uribe San Cristóbal Santa Fe Suba
0.039846281 0.042929099 0.034156698 0.085278490
Sumapaz Teusaquillo Tunjuelito Usaquén
0.006553387 0.041255240 0.015740414 0.060320337
Usme
0.044368771
prop.table() crea una tabla de proporciones a partir de la tabla de frecuencias.
Dividiendo el valor de cada categoría por el total general, y muestra estos valores en formato decimal (ej., 0.25 para 25%).
Esta tabla permite ver la proporción que representa cada NOMBRE_LOCALIDAD sobre el total.
Al no estar en formato porcentual hay que tener especial cuidado en la lectura de esta información.
prop.table(table(bd_def$NOMBRE_LOCALIDAD))*100
Antonio Nariño Barrios Unidos Bosa
19.2059921 1.5402571 2.3791059 4.2096009
Chapinero Ciudad Bolívar Engativá Fontibón
3.0713002 5.8224174 6.2470247 5.8347026
Kennedy La Candelaria Los Mártires Puente Aranda
9.0906648 0.7966185 1.6247178 3.1327262
Rafael Uribe Uribe San Cristóbal Santa Fe Suba
3.9846281 4.2929099 3.4156698 8.5278490
Sumapaz Teusaquillo Tunjuelito Usaquén
0.6553387 4.1255240 1.5740414 6.0320337
Usme
4.4368771
Multiplicamos la tabla de proporciones por 100 para convertir las proporciones en porcentajes.
El resultado muestra el porcentaje de registros para cada NOMBRE_LOCALIDAD respecto al total.
Ej: El 4.4368771% de la muestra corresponde a personas que residen en la localidad de Usme.
str(): Esta función muestra la estructura interna de un objeto en R. En este caso, muestra la estructura de la columna NPCEP5 del dataframe bd_def.
El resultado muestra que bd_def$NPCEP5 es un vector de tipo dbl+lbl, que significa que es un vector numérico (dbl = double) que tiene etiquetas asociadas a sus valores.
El objeto tiene atributos adicionales como:
label: “5. Sexo:”, que indica que la variable tiene una etiqueta descriptiva que hace referencia al sexo de las personas.
format.spss: Especifica el formato con el que fue importada (en este caso, SPSS, F1.0 significa un solo dígito con formato de número entero).
labels: Una lista de valores codificados como números (1, 2, 3) que corresponden a las categorías “Hombre”, “Mujer” e “Intersexual”, respectivamente.
haven::as_factor(): Esta función convierte una variable de tipo haven_labelled (como la que acabamos de ver) en un factor en R, manteniendo las etiquetas asociadas.
Al hacer esto, se convierte la variable NPCEP5 de un formato haven_labelled a un factor con niveles correspondientes a las etiquetas (“Hombre”, “Mujer”, “Intersexual”) en lugar de los valores numéricos 1, 2, 3.
✅Esto permite que ahora si podamos realizar un table de esta variable que tiene etiquetas, y facilita la interpretación de los resultados.
unique(bd_def$NPCEP5A)
[1] Mujer Hombre <NA>
Levels: Hombre Mujer
unique(): Esta función muestra los valores únicos presentes en la variable NPCEP5A.
Al ejecutar este código, se obtiene el listado de las categorías que aparecen en la columna, que en este caso son los valores “Hombre”, “Mujer” e “Intersexual” (en lugar de los valores numéricos 1, 2, 3).
table(bd_def$NPCEP5A, useNA ="ifany")
Hombre Mujer <NA>
26 29 260421
Se tiene que muy pocas personas tienen información en la variable Sexo.
Ahora las frecuencias cruzadas…
La función table() en R se utiliza para crear tablas de contingencia, que son tablas que muestran la frecuencia de ocurrencias para las combinaciones de dos o más variables. En este caso, estás analizando la relación entre dos variables:
bd_def$NOMBRE_LOCALIDAD: Esta es una columna de tu base de datos, probablemente una variable categórica que indica el nombre de una localidad.
bd_def$NPCEP5A: Esta es otra columna de tu base de datos, que también es una variable categórica (probablemente relacionada con el sexo, como en el caso anterior).
En la tabla de contingencia, cada celda representará el número de veces que una combinación particular de valores de estas dos variables ocurre juntas. Es decir, cuántas veces una cierta localidad se asocia con un cierto valor de NPCEP5A.
Por ejemplo, para la localidad de Sumapaz se tiene que 10 personas encuestadas eran hombres, 7 mujeres, y el resto no tienen información sobre sexo.
useNA = "ifany": Este argumento le indica a table() cómo manejar los valores NA (faltantes) en las variables involucradas: "ifany": Esto significa que si hay valores faltantes (NA) en cualquiera de las variables (en este caso NOMBRE_LOCALIDAD o NPCEP5A), los incluirá en la tabla de contingencia, creando una fila o columna adicional para los valores faltantes. Si no hay valores NA en alguna de las variables, no se agrega esta categoría.
Siguiendo las instrucciones anteriores, si se quiere tener la tabla de contingencia porcentual:
prop.table(): toma una tabla de frecuencias (como la generada por table()) y convierte las frecuencias absolutas a proporciones. Es decir, calcula la proporción de cada celda en la tabla con respecto al total general.
La fórmula general es:
\[ \text{Proporción} = \frac{\text{Frecuencia de la celda}}{\text{Total de todas las celdas}} \]
El siguiente paso es multiplicar las proporciones por 100 para obtener los resultados en porcentaje.
Esto convierte las proporciones a porcentajes, lo que facilita la interpretación de los resultados. Por ejemplo, si una celda tiene una proporción de 0.25, multiplicada por 100 resultará en un 25%.
round(..., digits = 3): redondea los resultados a un número especificado de decimales. En este caso, 3 decimales, debido a lo pequeños que son.
1.6 Estadísticas descriptivas de algunas variables
Para este apartado utilizaremos la librería DescTools
# Resumen de frecuencias y gráficoslibrary(DescTools)
Para analizar todas las variables de la base de datos solo es necesario usar la función Desc y el nombre de la base de datos: Desc(bd_def)
Sin embargo, en este ejemplo queremos analizar el comportamiento la variable edad de las personas de 18 año y más que respondieron el capítulo J. Participación.
Desc(bd_def$NPCEP4)
──────────────────────────────────────────────────────────────────────────────
bd_def$NPCEP4 (numeric) :
4. ¿Cuántos años cumplidos tiene ... ?
length n NAs unique 0s mean meanCI'
260'476 55 260'421 36 0 41.58 37.08
0.0% 100.0% 0.0% 46.08
.05 .10 .25 median .75 .90 .95
14.70 16.80 26.00 45.00 53.50 59.00 62.30
range sd vcoef mad IQR skew kurt
72.00 16.64 0.40 13.34 27.50 -0.36 -0.77
lowest : 4.0, 12.0, 14.0, 15.0 (2), 16.0
highest: 61.0, 62.0, 63.0, 71.0, 76.0
' 95%-CI (classic)
El análisis descriptivo arrojado por la función Desc(bd_def$NPCEP4)nos indica que:
1.6.1 Resumen de los datos
length: 260,476. Esto indica que hay 260,476 registros en total para esta variable.
n: 55. Esto podría ser el número de observaciones válidas (no NAs), aunque es un dato confuso. Puede que esta cifra se refiera a un subconjunto o que esté relacionado con alguna otra variable.
NAs: 260,421. Indica que la gran mayoría de los registros son NA (valores faltantes). Esto podría ser un error en la forma de presentar los datos o un error en la recolección de información.
unique: 36. Esto significa que hay 36 valores únicos o edades en la variable.
0s: 0.0%. No hay valores de cero en esta variable.
1.6.2 Estadísticas descriptivas
mean (media): 41.58. La edad promedio de las personas que respondieron este capítulo es 41.58 años.
Recuerdas como se calcula la media y cuál es su desventaja❓
1.6.3 Percentiles:
0.05 (percentil 5%): 14.70. El 5% de los registros tiene edades menores a 14.70 años.
0.10 (percentil 10%): 16.80. El 10% de los registros tiene edades menores a 16.80 años.
0.25 (percentil 25%): 26.00. El 25% de los registros tiene edades menores a 26 años.
median (mediana): 45.00. La mediana de la edad es 45 años, lo que significa que la mitad de los registros tiene edades menores a 45 años y la otra mitad mayores.
Recuerdas como se calcula la mediana y cuál es su ventaja❓
0.75 (percentil 75%): 53.50. El 75% de los registros tiene edades inferiores a 53.5 años.
0.90 (percentil 90%): 59.00. El 90% de los registros tiene edades menores a 59 años.
0.95 (percentil 95%): 62.30. El 95% de los registros tiene edades inferiores a 62.3 años.
1.6.4 Rango y dispersión
range (rango): 72.00. El rango de edades va desde un valor mínimo hasta un valor máximo que tienen una diferencia de 72 años.
Recuerdas como se calcula el rango❓
sd (desviación estándar): 16.64. La desviación estándar es 16.64, lo que indica que las edades varían bastante alrededor de la media (41.58 años). Hay una dispersión considerable.
vcoef (coeficiente de variación): 0.40. Este valor indica que la variabilidad relativa de los datos es del 40%. Se obtiene dividiendo la desviación estándar entre la media.
Un coeficiente de variación superior a 15% es …❓
mad (desviación absoluta mediana): 13.34. Esta es una medida robusta de dispersión. El valor de 13.34 indica que las edades varían alrededor de la mediana en promedio 13.34 años.
IQR (rango intercuartílico): 27.50. El rango intercuartílico es la diferencia entre el percentil 75 y el percentil 25 (53.50 - 26.00). Indica el rango de las edades en el que se encuentran el 50% de los registros.
skew (asimetría): -0.36. El valor negativo de asimetría sugiere que la distribución de edades está ligeramente sesgada a la derecha. Esto quiere decir que hay una cola de valores más altos (algunas personas con edades mucho mayores) pero no es muy pronunciada.
kurt (curtosis): -0.77. La curtosis negativa sugiere que la distribución de las edades es menos pronunciada en los extremos (menos “peaks” en comparación con una distribución normal), es decir, hay menos valores extremos en los datos de lo que se esperaría en una distribución normal.
1.6.5 Valores más bajos y más altos
lowest (valores más bajos): 4.0, 12.0, 14.0, 15.0 (2), 16.0. Los valores más bajos de la variable son 4 años, 12 años, 14 años, 15 años (aparece dos veces), y 16 años.
highest (valores más altos): 61.0, 62.0, 63.0, 71.0, 76.0. Los valores más altos de la variable son 61 años, 62 años, 63 años, 71 años y 76 años.
Todo esto se puede ver reflejado en el bloxplot o gráfico de cajas que también genera el paquete.
cov(bd_def$ingreso_laboral,bd_def$Parti,use="na.or.complete")# Pares completos por variable
[1] 18.18492
cov(bd_def$ingreso_laboral,bd_def$NPCEP4,use="na.or.complete")# Pares completos por variable
[1] 187336
cov(bd_def$ingreso_laboral,bd_def$NPCEP4, use ="complete.obs") # Solo las observaciones completas
[1] 187336
# Scatter plot básicoggplot(bd_def, aes(x = ingreso_laboral, y = Parti)) +geom_point() +labs(title ="Gráfico de Dispersión", x ="Variable X", y ="Variable Y")
# Scatter plot básicoggplot(bd_def, aes(x = ingreso_laboral, y = NPCEP4)) +geom_point() +labs(title ="Gráfico de Dispersión", x ="Variable X", y ="Variable Y")
Warning: Removed 260421 rows containing missing values or values outside the scale range
(`geom_point()`).
# Instala y carga ggplot2 si no lo tienes instaladolibrary(ggplot2)# Seleccionar solo las columnas numéricasbd_def_num <-select_if(bd_def, is.numeric)# Suponiendo que bd_def es un DataFrame con solo variables numéricascov_matrix <-cov(bd_def_num, use ="na.or.complete")# Convertir la matriz a un formato largolibrary(reshape2)
Warning: package 'reshape2' was built under R version 4.3.3
cov_data <-melt(cov_matrix)# Graficar el mapa de calorggplot(data = cov_data, aes(x = Var1, y = Var2, fill = value)) +geom_tile(color ="white") +scale_fill_gradient2(low ="blue", high ="red", mid ="white", midpoint =0, limit =c(min(cov_data$value), max(cov_data$value)), name ="Covarianza") +theme_minimal() +theme(axis.text.x =element_text(angle =45, hjust =1)) +labs(title ="Mapa de calor de la matriz de covarianza")
2.2 Correlación
cor(bd_def$ingreso_laboral, bd_def$NPCEP4, use ="complete.obs")
[1] 0.009063622
cor_test <-cor.test(bd_def$ingreso_laboral, bd_def$NPCEP4, use ="complete.obs")cor_test
Pearson's product-moment correlation
data: bd_def$ingreso_laboral and bd_def$NPCEP4
t = 0.065987, df = 53, p-value = 0.9476
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.2568512 0.2737027
sample estimates:
cor
0.009063622
El coeficiente de correlación obtenido es -0.0236, que está muy cerca de cero. Esto indica que no hay una relación lineal significativa entre ingreso_laboral y NPCEP4.
La magnitud de la correlación es tan baja que se considera prácticamente inexistente, lo cual sugiere que los cambios en una variable no están asociados con cambios en la otra.
Prueba de Hipótesis y P-valor: El p-valor de 0.8642 es mucho mayor que el umbral común de significancia (por ejemplo, 0.05). Esto implica que no hay suficiente evidencia para rechazar la hipótesis nula de que el verdadero coeficiente de correlación es igual a cero.
Con un p-valor tan alto, concluimos que la correlación observada no es estadísticamente significativa. Esto significa que la pequeña correlación observada podría deberse al azar en esta muestra.
Importante❗
Un p-valor pequeño (comúnmente menor que 0.05) sugiere que la correlación es estadísticamente significativa.
El coeficiente de correlación indica la dirección y magnitud de la relación entre las dos variables.
2.2.1Conclusión General
No existe una relación lineal significativa entre ingreso_laboral y NPCEP4 en esta muestra. El coeficiente de correlación es cercano a cero, y el alto p-valor indica que cualquier correlación observada es probablemente el resultado del azar.
En la práctica, esto sugiere que la variable ingreso_laboral no está asociada con los valores de NPCEP4, por lo que cambios en una no implican cambios en la otra.
3 Estadísticos descriptivos para una submuestra
ingreso <- bd_def %>%#dejar solo las variables de interésselect(Parti,ingreso_laboral,NPCEP5A,NPCEP4,NOMBRE_LOCALIDAD,FEX_C.x) %>%#filtrar personas que participan#filter(Parti==1) %>% #agrupar por localidadgroup_by(Parti,NOMBRE_LOCALIDAD) %>%#summarise - resumensummarise(#Mediamedia_muestral =mean(ingreso_laboral,na.rm =TRUE),#Media expandidamedia_expandida =weighted.mean(ingreso_laboral, FEX_C.x,na.rm =TRUE), #Mediana muestralmediana_muestral =median(ingreso_laboral,na.rm =TRUE),#Mediana expandidamediana_expandida = Hmisc::wtd.quantile(ingreso_laboral, probs =0.5, weight = FEX_C.x, na.rm =TRUE),#Varianza muestralvar_muestral =var(ingreso_laboral,na.rm =TRUE),#Varianza expandidavare_expandida = Hmisc::wtd.var(ingreso_laboral, weight = FEX_C.x, na.rm =TRUE),#Desviación estandar muestraldes_muestral =sd(ingreso_laboral,na.rm =TRUE),#Desviación estandar expandidades_expandida =sqrt(vare_expandida),#IQRIQR =IQR(ingreso_laboral,na.rm =TRUE))
`summarise()` has grouped output by 'Parti'. You can override using the
`.groups` argument.
4 Análisis gráficos
4.1 Histogramas
histo1 <-ggplot(bd_def, aes(x = ingreso_laboral, fill = ingreso_laboral)) +geom_histogram(color ="black", bins =30) +labs(title ="Distribución de edades mayores de 5 años", x ="Edad", y ="Frecuencia") +facet_wrap(~NOMBRE_LOCALIDAD) +theme_minimal()histo1
Warning: The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
histo2 <-ggplot(bd_def, aes(x = ingreso_laboral, fill = ingreso_laboral)) +geom_histogram(color ="black", bins =30) +labs(title ="Distribución de edades mayores de 5 años", x ="Edad", y ="Frecuencia") +facet_wrap(~Parti) +theme_minimal()histo2
Warning: The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
The following aesthetics were dropped during statistical transformation: fill.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
histo3 <-ggplot(bd_def, aes(x = ingreso_laboral, fill = NPCEP5A)) +geom_bar(stat ="count", position ="dodge", na.rm =TRUE) +labs(x ="Ingreso Laboral", y ="Frecuencia", fill ="Sexo") +theme_minimal()histo3
histo4 <-ggplot(bd_def, aes(x = ingreso_laboral, fill =as.factor(Parti))) +geom_histogram(position ="dodge", bins =30) +labs(x ="Ingreso Laboral", y ="Frecuencia", fill ="Participación") +theme_dark()# Ver el gráficoprint(histo4)
Source Code
---title: "Análisis Encuesta multipropósito - EM 2021"autor: "Julieth Lina Fernanda Zorro Melo"highlight-style: pygmentsformat: html#theme: pandoc theme: lumen #https://bootswatch.com/editor: visualtoc: true#toc-location: right-bodytoc-location: rightnumber-sections: trueother-links: - text: DANE - Encuesta Multipropósito Bogotá & Cundinamarca - 2021 href: https://microdatos.dane.gov.co/index.php/catalog/743bibliography: references.bibcode-tools: truecode-fold: false#code-summary: "Show the code"code-block-bg: truecode-block-border-left: "#31BAE9"code-line-numbers: truecode-copy: true---```{r echo = FALSE}bd <- readRDS("bd.RDS")```## Análisis descriptivo univariado### Definir los paquetes a utilizar en el análisis y algunas características básicas.- Cargar los paquetes dplyr, ggplot2, DescTools.```{r include = T}library(dplyr)library(ggplot2) library(DescTools) ``````{r include = F}library(DT)```- Configurar para que los resultados no salgan en notación científica.```{r include = T}options(scipen=999) ```### Seleccionar variables de análisisComo se menciono en la primera parte de este análisis <https://rpubs.com/Julieth_ZorroM/EM_2021>, se quiere analizar la pregunta de afiliación a organizaciones y redes sociales (`NPCJP1x`), teniendo en cuenta variables de edad, sexo, y ubicación geográfica.Entonces, para esto se tiene que trabajaremos con las siguientes variables:+------------------+-----------------------------------------------------------+-------------------------------------------------------+| Nombre columna | Texto pregunta | Rango |+:=================+:=========================================================:+:=====================================================:+| MPIO | Municipio | |+------------------+-----------------------------------------------------------+-------------------------------------------------------+| CLASE | Clase | 1. Cabecera || | | 2. Centros poblados || | | 3. Área rural dispersa |+------------------+-----------------------------------------------------------+-------------------------------------------------------+| NOMBRE LOCALIDAD | Nombre de la localidad | \*Aplica solo cuando el municipio es Bogotá D.C. |+------------------+-----------------------------------------------------------+-------------------------------------------------------+| NOMBRE_UPZ_GRUPO | Nombres de UPZ individuales + nombres agrupaciones de UPZ | |+------------------+-----------------------------------------------------------+-------------------------------------------------------+| NPCEP4 | 4.¿Cuántos años cumplidos tiene...? | |+------------------+-----------------------------------------------------------+-------------------------------------------------------+| NPCEP5 | Sexo al nacer | 1. Hombre || | | 2. Mujer || | | 3. Intersexual (solo para personas de 15 años y más) |+------------------+-----------------------------------------------------------+-------------------------------------------------------+: Variables a analizar {#tbl- 1}### Filtrar la base de datos a analizarCon ayuda de la librería `dplyr` seleccionaremos las variables que se utilizaran para el análisis.```{r include=T}bd_def <- bd %>%#Variables que se van a utilizar select(DIRECTORIO.x,DIRECTORIO_HOG.x,SECUENCIA_P.x,DIRECTORIO_PER,ORDEN.x,MPIO, CLASE,NOMBRE_LOCALIDAD,NOMBRE_UPZ_GRUPO,NPCEP4,NPCEP5A,NPCJP1A,NPCJP1B,NPCJP1C,NPCJP1D,NPCJP1E,NPCJP1F,NPCJP1G,NPCJP1H,NPCJP1I,NPCJP1J,NPCJP1K,NPCJP1L,NPCJP1M,NPCJP1N,NPCJP10,NPCJP1P,NPCJP1Q,FEX_C.x) names(bd)```Este código está creando una nueva base de datos llamada `bd` a partir de la base `bdfinal`, usando el paquete `dplyr` para seleccionar columnas específicas, así:1. **`bd <- bdfinal %>%`**: - Aquí, `bd` es la nueva tabla (data frame) que se creará. - `bdfinal %>%` es el punto de partida, que indica que vamos a procesar la tabla `bdfinal`. - `%>%` es el operador pipe que pasa el resultado de `bdfinal` a la siguiente función.2. **`select(...)`**: - `select()` se usa para elegir columnas específicas de `bdfinal` que se incluirán en `bd`. - Dentro de `select()`, se listan los nombres de las columnas que queremos extraer.```{r eval=FALSE, include=T}head(bd_def,20)``````{r echo=FALSE}options(expressions = 200000)#| label: tbl-some-2#| tbl-cap: "20 registros de la base de datos a analizar" # Muestra el head de la base de datos en una tabla interactiva head <- head(bd_def,20)DT::datatable(head)``````{r include=T}names(bd_def)```### FrecuenciasCon el fin de analizar la distribución de frecuencias de una variable categórica, podemos utilizar la función de Rbase `table`. En el siguiente ejemplo, se presenta la distribución para las localidades de la EM - 2021:```{r}table(bd_def$NOMBRE_LOCALIDAD, useNA ="ifany")```- Esta línea crea una tabla de frecuencias para la variable `NOMBRE_LOCALIDAD` en la base de datos `bd_def`.- `useNA = "ifany"` hace que R incluya en la tabla cualquier valor `NA` (faltante) si existe. Esto es útil para saber cuántos valores están ausentes.\ En este caso, la variable `NOMBRE_LOCALIDAD` tiene 50.027 registros en blanco, estos deben corresponder a otros municipios encuestados diferentes a la ciudad de Bogotá D.C. - más adelante probaremos esta hipótesis 👩🏻🏫- El resultado es una tabla que muestra el número de veces que cada localidad aparece en `NOMBRE_LOCALIDAD`.```{r}addmargins(table(bd_def$NOMBRE_LOCALIDAD, useNA ="ifany"))```- Esta línea utiliza `addmargins()` para añadir una fila o columna de totales a la tabla de frecuencias.- Agrega un total al final, lo que permite ver el número total de registros (incluidos los `NA`) en `NOMBRE_LOCALIDAD`. Para este caso, se tiene que el total de registros `SUM` es 260.476.```{r}prop.table(table(bd_def$NOMBRE_LOCALIDAD))```- `prop.table()` crea una **tabla de proporciones** a partir de la tabla de frecuencias.- Dividiendo el valor de cada categoría por el total general, y muestra estos valores en formato decimal (ej., 0.25 para 25%).- Esta tabla permite ver la proporción que representa cada `NOMBRE_LOCALIDAD` sobre el total.- Al no estar en formato porcentual hay que tener especial cuidado en la lectura de esta información.```{r}prop.table(table(bd_def$NOMBRE_LOCALIDAD))*100```- Multiplicamos la tabla de proporciones por 100 para convertir las proporciones en **porcentajes**.- El resultado muestra el porcentaje de registros para cada `NOMBRE_LOCALIDAD` respecto al total.- Ej: El 4.4368771% de la muestra corresponde a personas que residen en la localidad de Usme.```{r}round(prop.table(table(bd_def$NOMBRE_LOCALIDAD))*100,digits =1)```- `round(..., digits = 1)` redondea cada porcentaje a un decimal.<!-- -->- Ej: El 4.4368771% de la muestra corresponde a personas que residen en la localidad de Usme. Se convierte en el 4.4%.```{r}addmargins(round(prop.table(table(bd_def$NOMBRE_LOCALIDAD))*100,digits =1))```- `addmargins()` se aplica a la tabla de porcentajes redondeados.- Esto añade un total al final, que debería ser cercano a 100%.### Frecuencias cruzadasSi queremos por ejemplo conocer la distribución de las personas encuestadas en cada localidad por sexo, podemos usar también la función `table`.```{r}str(bd_def$NPCEP5A)```- **`str()`**: Esta función muestra la estructura interna de un objeto en R. En este caso, muestra la estructura de la columna `NPCEP5` del dataframe `bd_def`.- El resultado muestra que `bd_def$NPCEP5` es un **vector de tipo `dbl+lbl`**, que significa que es un vector numérico (`dbl` = double) que tiene **etiquetas** asociadas a sus valores.- El objeto tiene atributos adicionales como: - **`label`**: "5. Sexo:", que indica que la variable tiene una etiqueta descriptiva que hace referencia al sexo de las personas. - **`format.spss`**: Especifica el formato con el que fue importada (en este caso, SPSS, `F1.0` significa un solo dígito con formato de número entero). - **`labels`**: Una lista de valores codificados como números (1, 2, 3) que corresponden a las categorías **"Hombre"**, **"Mujer"** e **"Intersexual"**, respectivamente.```{r}bd_def$NPCEP5A <- haven::as_factor(bd_def$NPCEP5A)```- **`haven::as_factor()`**: Esta función convierte una variable de tipo `haven_labelled` (como la que acabamos de ver) en un **factor** en R, manteniendo las etiquetas asociadas.- Al hacer esto, se convierte la variable `NPCEP5` de un formato `haven_labelled` a un **factor** con niveles correspondientes a las etiquetas ("Hombre", "Mujer", "Intersexual") en lugar de los valores numéricos 1, 2, 3.- ✅Esto permite que ahora si podamos realizar un table de esta variable que tiene etiquetas, y facilita la interpretación de los resultados.```{r}unique(bd_def$NPCEP5A)```- **`unique()`**: Esta función muestra los **valores únicos** presentes en la variable `NPCEP5A`.- Al ejecutar este código, se obtiene el listado de las categorías que aparecen en la columna, que en este caso son los valores "Hombre", "Mujer" e "Intersexual" (en lugar de los valores numéricos 1, 2, 3).```{r}table(bd_def$NPCEP5A, useNA ="ifany")```- Se tiene que muy pocas personas tienen información en la variable Sexo. **Ahora las frecuencias cruzadas...** La función `table()` en R se utiliza para crear **tablas de contingencia**, que son tablas que muestran la frecuencia de ocurrencias para las combinaciones de dos o más variables. En este caso, estás analizando la relación entre dos variables:```{r}table(bd_def$NOMBRE_LOCALIDAD,bd_def$NPCEP5A, useNA ="ifany")```- **`bd_def$NOMBRE_LOCALIDAD`**: Esta es una columna de tu base de datos, probablemente una variable categórica que indica el nombre de una localidad.- **`bd_def$NPCEP5A`**: Esta es otra columna de tu base de datos, que también es una variable categórica (probablemente relacionada con el sexo, como en el caso anterior).- En la tabla de contingencia, cada celda representará el número de veces que una combinación particular de valores de estas dos variables ocurre juntas. Es decir, cuántas veces una cierta **localidad** se asocia con un cierto valor de **NPCEP5A**.\ Por ejemplo, para la localidad de Sumapaz se tiene que 10 personas encuestadas eran hombres, 7 mujeres, y el resto no tienen información sobre sexo.- **`useNA = "ifany"`**: Este argumento le indica a `table()` cómo manejar los valores **NA** (faltantes) en las variables involucradas: **`"ifany"`**: Esto significa que si **hay valores faltantes (`NA`)** en cualquiera de las variables (en este caso `NOMBRE_LOCALIDAD` o `NPCEP5A`), los incluirá en la tabla de contingencia, creando una fila o columna adicional para los valores faltantes. Si no hay valores `NA` en alguna de las variables, no se agrega esta categoría.Siguiendo las instrucciones anteriores, si se quiere tener la tabla de contingencia porcentual:```{r}round(prop.table(table(bd_def$NOMBRE_LOCALIDAD,bd_def$NPCEP5A, useNA ="ifany"))*100,digits=3)```- **`prop.table()`**: toma una tabla de frecuencias (como la generada por `table()`) y **convierte las frecuencias absolutas a proporciones**. Es decir, calcula la proporción de cada celda en la tabla con respecto al total general. La fórmula general es: $$ \text{Proporción} = \frac{\text{Frecuencia de la celda}}{\text{Total de todas las celdas}} $$- El siguiente paso es multiplicar las proporciones por **100** para obtener los resultados en **porcentaje**.- Esto convierte las proporciones a porcentajes, lo que facilita la interpretación de los resultados. Por ejemplo, si una celda tiene una proporción de 0.25, multiplicada por 100 resultará en un 25%.- **`round(..., digits = 3)`**: redondea los resultados a un número especificado de decimales. En este caso, **3 decimales**, debido a lo pequeños que son.### Estadísticas descriptivas de algunas variablesPara este apartado utilizaremos la librería `DescTools````{r}# Resumen de frecuencias y gráficoslibrary(DescTools)```Para analizar todas las variables de la base de datos solo es necesario usar la función `Desc` y el nombre de la base de datos: `Desc(bd_def)`Sin embargo, en este ejemplo queremos analizar el comportamiento la variable edad de las personas de 18 año y más que respondieron el capítulo J. Participación.```{r}Desc(bd_def$NPCEP4)```El análisis descriptivo arrojado por la función `Desc(bd_def$NPCEP4)`nos indica que:#### Resumen de los datos- **`length`**`: 260,476.` Esto indica que hay **260,476 registros** en total para esta variable.- **`n`**`: 55.` Esto podría ser el número de observaciones válidas (no NAs), aunque es un dato confuso. Puede que esta cifra se refiera a un subconjunto o que esté relacionado con alguna otra variable.- **`NAs`**`: 260,421.` Indica que la gran mayoría de los registros son **NA** (valores faltantes). Esto podría ser un error en la forma de presentar los datos o un error en la recolección de información.- **`unique`**`: 36.` Esto significa que hay **36 valores únicos o edades** en la variable.- **`0s`**`: 0.0%.` No hay valores de cero en esta variable.#### Estadísticas descriptivas- **`mean (media)`**`: 41.58.` La **edad promedio** de las personas que respondieron este capítulo es 41.58 años. *Recuerdas como se calcula la media y cuál es su desventaja*❓#### Percentiles:- **`0.05 (percentil 5%)`**`: 14.70.` El 5% de los registros tiene edades menores a 14.70 años.- **`0.10 (percentil 10%)`**`: 16.80.` El 10% de los registros tiene edades menores a 16.80 años.- **`0.25 (percentil 25%)`**`: 26.00.` El 25% de los registros tiene edades menores a 26 años.- **`median (mediana)`**`: 45.00.` La **mediana de la edad** es 45 años, lo que significa que la mitad de los registros tiene edades menores a 45 años y la otra mitad mayores.\ \ *Recuerdas como se calcula la mediana y cuál es su ventaja*❓- **`0.75 (percentil 75%)`**`: 53.50.` El 75% de los registros tiene edades inferiores a 53.5 años.- **`0.90 (percentil 90%)`**`: 59.00.` El 90% de los registros tiene edades menores a 59 años.- **`0.95 (percentil 95%)`**`: 62.30.` El 95% de los registros tiene edades inferiores a 62.3 años.#### Rango y dispersión- **`range (rango)`**`: 72.00.` El rango de edades va desde un valor mínimo hasta un valor máximo que tienen una diferencia de 72 años. *Recuerdas como se calcula el rango*❓- **`sd (desviación estándar)`**`: 16.64.` La **desviación estándar** es 16.64, lo que indica que las edades varían bastante alrededor de la media (41.58 años). Hay una dispersión considerable.- **`vcoef (coeficiente de variación)`**`: 0.40.` Este valor indica que la variabilidad relativa de los datos es del **40%**. Se obtiene dividiendo la desviación estándar entre la media.\ \ *Un coeficiente de variación superior a 15% es ...*❓- **`mad (desviación absoluta mediana)`**`: 13.34.` Esta es una medida robusta de dispersión. El valor de 13.34 indica que las edades varían alrededor de la mediana en promedio 13.34 años.- **I`QR (rango intercuartílico)`**`: 27.50.` El **rango intercuartílico** es la diferencia entre el percentil 75 y el percentil 25 (53.50 - 26.00). Indica el rango de las edades en el que se encuentran el 50% de los registros.- **`skew (asimetría)`**`: -0.36.` El valor negativo de **asimetría** sugiere que la distribución de edades está **ligeramente sesgada a la derecha**. Esto quiere decir que hay una cola de valores más altos (algunas personas con edades mucho mayores) pero no es muy pronunciada.- **`kurt (curtosis)`**`: -0.77.` La **curtosis negativa** sugiere que la distribución de las edades es **menos pronunciada en los extremos** (menos "peaks" en comparación con una distribución normal), es decir, hay menos valores extremos en los datos de lo que se esperaría en una distribución normal.#### Valores más bajos y más altos- **`lowest (valores más bajos)`**`:` 4.0, 12.0, 14.0, 15.0 (2), 16.0. Los valores más bajos de la variable son 4 años, 12 años, 14 años, 15 años (aparece dos veces), y 16 años.- **`highest (valores más altos)`**`:` 61.0, 62.0, 63.0, 71.0, 76.0. Los valores más altos de la variable son 61 años, 62 años, 63 años, 71 años y 76 años.Todo esto se puede ver reflejado en el *bloxplot o gráfico de cajas que también* genera el paquete*.*## Análisis descriptivo bivariado### Covarianza```{r}unique(bd_def$NPCJP1G)table(bd_def$NPCJP1G, useNA ="ifany")bd_def <- bd_def %>%mutate(NPCJP1G =case_when(is.na(NPCJP1G) ~0,TRUE~ NPCJP1G)) %>%# Crear la variable "Parti"mutate(Parti =if_else(rowSums(select(., starts_with("NPCJP1")) ==1, na.rm =TRUE) >0, 1, 0)) %>%#Crear Variable ficticia ingresomutate(ingreso_laboral =pmax(rnorm(n(), mean =900000, sd =1500000),0))table(bd_def$Parti, useNA ="ifany")cov(bd_def$ingreso_laboral,bd_def$Parti,use="na.or.complete")# Pares completos por variablecov(bd_def$ingreso_laboral,bd_def$NPCEP4,use="na.or.complete")# Pares completos por variablecov(bd_def$ingreso_laboral,bd_def$NPCEP4, use ="complete.obs") # Solo las observaciones completas``````{r}# Scatter plot básicoggplot(bd_def, aes(x = ingreso_laboral, y = Parti)) +geom_point() +labs(title ="Gráfico de Dispersión", x ="Variable X", y ="Variable Y")# Scatter plot básicoggplot(bd_def, aes(x = ingreso_laboral, y = NPCEP4)) +geom_point() +labs(title ="Gráfico de Dispersión", x ="Variable X", y ="Variable Y")``````{r}# Instala y carga ggplot2 si no lo tienes instaladolibrary(ggplot2)# Seleccionar solo las columnas numéricasbd_def_num <-select_if(bd_def, is.numeric)# Suponiendo que bd_def es un DataFrame con solo variables numéricascov_matrix <-cov(bd_def_num, use ="na.or.complete")# Convertir la matriz a un formato largolibrary(reshape2)cov_data <-melt(cov_matrix)# Graficar el mapa de calorggplot(data = cov_data, aes(x = Var1, y = Var2, fill = value)) +geom_tile(color ="white") +scale_fill_gradient2(low ="blue", high ="red", mid ="white", midpoint =0, limit =c(min(cov_data$value), max(cov_data$value)), name ="Covarianza") +theme_minimal() +theme(axis.text.x =element_text(angle =45, hjust =1)) +labs(title ="Mapa de calor de la matriz de covarianza")```### Correlación```{r}cor(bd_def$ingreso_laboral, bd_def$NPCEP4, use ="complete.obs")``````{r}cor_test <-cor.test(bd_def$ingreso_laboral, bd_def$NPCEP4, use ="complete.obs")cor_test```- El **`coeficiente de correlación`** obtenido es `-0.0236`, que está muy cerca de cero. Esto indica que no hay una relación lineal significativa entre `ingreso_laboral` y `NPCEP4`.- La magnitud de la correlación es tan baja que se considera prácticamente inexistente, lo cual sugiere que los cambios en una variable no están asociados con cambios en la otra.- **`Prueba de Hipótesis y P-valor:`** El **p-valor** de `0.8642` es mucho mayor que el umbral común de significancia (por ejemplo, `0.05`). Esto implica que no hay suficiente evidencia para rechazar la hipótesis nula de que el verdadero coeficiente de correlación es igual a cero.- Con un p-valor tan alto, concluimos que la correlación observada no es estadísticamente significativa. Esto significa que la pequeña correlación observada podría deberse al azar en esta muestra.**Importante❗**: - Un **p-valor pequeño** (comúnmente menor que 0.05) sugiere que la correlación es estadísticamente significativa. - El **coeficiente de correlación** indica la dirección y magnitud de la relación entre las dos variables.#### **Conclusión General**- No existe una relación lineal significativa entre `ingreso_laboral` y `NPCEP4` en esta muestra. El coeficiente de correlación es cercano a cero, y el alto p-valor indica que cualquier correlación observada es probablemente el resultado del azar.- En la práctica, esto sugiere que la variable `ingreso_laboral` no está asociada con los valores de `NPCEP4`, por lo que cambios en una no implican cambios en la otra.## Estadísticos descriptivos para una submuestra```{r}ingreso <- bd_def %>%#dejar solo las variables de interésselect(Parti,ingreso_laboral,NPCEP5A,NPCEP4,NOMBRE_LOCALIDAD,FEX_C.x) %>%#filtrar personas que participan#filter(Parti==1) %>% #agrupar por localidadgroup_by(Parti,NOMBRE_LOCALIDAD) %>%#summarise - resumensummarise(#Mediamedia_muestral =mean(ingreso_laboral,na.rm =TRUE),#Media expandidamedia_expandida =weighted.mean(ingreso_laboral, FEX_C.x,na.rm =TRUE), #Mediana muestralmediana_muestral =median(ingreso_laboral,na.rm =TRUE),#Mediana expandidamediana_expandida = Hmisc::wtd.quantile(ingreso_laboral, probs =0.5, weight = FEX_C.x, na.rm =TRUE),#Varianza muestralvar_muestral =var(ingreso_laboral,na.rm =TRUE),#Varianza expandidavare_expandida = Hmisc::wtd.var(ingreso_laboral, weight = FEX_C.x, na.rm =TRUE),#Desviación estandar muestraldes_muestral =sd(ingreso_laboral,na.rm =TRUE),#Desviación estandar expandidades_expandida =sqrt(vare_expandida),#IQRIQR =IQR(ingreso_laboral,na.rm =TRUE))```## Análisis gráficos### Histogramas```{r}histo1 <-ggplot(bd_def, aes(x = ingreso_laboral, fill = ingreso_laboral)) +geom_histogram(color ="black", bins =30) +labs(title ="Distribución de edades mayores de 5 años", x ="Edad", y ="Frecuencia") +facet_wrap(~NOMBRE_LOCALIDAD) +theme_minimal()histo1``````{r}histo2 <-ggplot(bd_def, aes(x = ingreso_laboral, fill = ingreso_laboral)) +geom_histogram(color ="black", bins =30) +labs(title ="Distribución de edades mayores de 5 años", x ="Edad", y ="Frecuencia") +facet_wrap(~Parti) +theme_minimal()histo2``````{r}histo3 <-ggplot(bd_def, aes(x = ingreso_laboral, fill = NPCEP5A)) +geom_bar(stat ="count", position ="dodge", na.rm =TRUE) +labs(x ="Ingreso Laboral", y ="Frecuencia", fill ="Sexo") +theme_minimal()histo3``````{r}histo4 <-ggplot(bd_def, aes(x = ingreso_laboral, fill =as.factor(Parti))) +geom_histogram(position ="dodge", bins =30) +labs(x ="Ingreso Laboral", y ="Frecuencia", fill ="Participación") +theme_dark()# Ver el gráficoprint(histo4)```