Análisis Encuesta multipropósito - EM 2021

1 Análisis descriptivo univariado

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
  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)

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)
  [1] "DIRECTORIO.x"     "DIRECTORIO_HOG.x" "DIRECTORIO_PER"  
  [4] "SECUENCIA_P.x"    "ORDEN.x"          "NPCJP1B"         
  [7] "NPCJP1C"          "NPCJP1D"          "NPCJP1E"         
 [10] "NPCJP1F"          "NPCJP1G"          "NPCJP1H"         
 [13] "NPCJP1I"          "NPCJP1J"          "NPCJP1K"         
 [16] "NPCJP1L"          "NPCJP1M"          "NPCJP1N"         
 [19] "NPCJP1A"          "NPCJP1O"          "NPCJP1P"         
 [22] "NPCJP1Q"          "NPCJP2"           "NPCJP3"          
 [25] "NPCJP6"           "NPCJP7"           "NPCJP9A"         
 [28] "NPCJP9B"          "NPCJP9C"          "NPCJP9D"         
 [31] "NPCJP9E"          "NPCJP9F"          "NPCJP9G"         
 [34] "NPCJP9H"          "NPCJP9I"          "NPCJP9J"         
 [37] "NPCJP8A"          "NPCJP8B"          "NPCJP8C"         
 [40] "NPCJP8D"          "NPCJP8E"          "NPCJP8F"         
 [43] "NPCJP8G"          "NPCJP8H"          "NPCJP9AA"        
 [46] "NPCJP9AB"         "NPCJP9AC"         "NPCJP9AD"        
 [49] "NPCJP9AE"         "NPCJP9AF"         "NPCJP9AG"        
 [52] "NPCJP9AH"         "NPCJP9AI"         "NPCJP9AJ"        
 [55] "NPCJP9AK"         "NPCJP10"          "NPCJP11"         
 [58] "NPCJP12"          "NPCJP13"          "FEX_C.x"         
 [61] "DPTO"             "MPIO"             "CLASE"           
 [64] "COD_LOCALIDAD"    "NOMBRE_LOCALIDAD" "COD_UPZ_GRUPO"   
 [67] "NOMBRE_UPZ_GRUPO" "ESTRATO2021"      "NOMBRE_ESTRATO"  
 [70] "FEX_C.y"          "DIRECTORIO_HOG.y" "DIRECTORIO.y"    
 [73] "SECUENCIA_P.y"    "ORDEN.y"          "NPCEP4"          
 [76] "NPCEP5"           "NPCEP6"           "NPCEP7"          
 [79] "NPCEP8"           "NPCEP8A"          "NPCEP9"          
 [82] "NPCEP9A"          "NPCEP9B"          "NPCEP10"         
 [85] "NPCEP11A"         "NPCEP11AA"        "NPCEP11AB"       
 [88] "NPCEP11AC"        "NPCEP11"          "NPCEP13"         
 [91] "NPCEP13A"         "NPCEP13B"         "NPCEP13C"        
 [94] "NPCEP14"          "NPCEP15"          "NPCEP16A"        
 [97] "NPCEP16B"         "NPCEP16C"         "NPCEP16D"        
[100] "NPCEP16E"         "NPCEP16F"         "NPCEP16G"        
[103] "NPCEP16H"         "NPCEP16I"         "NPCEP16J"        
[106] "NPCEP16K"         "NPCEP16A1"        "NPCEP16AA"       
[109] "NPCEP16AB"        "NPCEP16B1"        "NPCEP17"         
[112] "NPCEP18"          "NPCEP19"          "NPCEP21"         
[115] "NPCEP21A"         "NPCEP22"          "NPCEP22A"        
[118] "NPCEP24"          "NPCEP24A"         "NPCEP25"         
[121] "NPCEP25A"         "NPCEP27"          "NPCEP26"         
[124] "NPCEP5A"          "FEX_C"           

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.

head(bd_def,20)
names(bd_def)
 [1] "DIRECTORIO.x"     "DIRECTORIO_HOG.x" "SECUENCIA_P.x"    "DIRECTORIO_PER"  
 [5] "ORDEN.x"          "MPIO"             "CLASE"            "NOMBRE_LOCALIDAD"
 [9] "NOMBRE_UPZ_GRUPO" "NPCEP4"           "NPCEP5A"          "NPCJP1A"         
[13] "NPCJP1B"          "NPCJP1C"          "NPCJP1D"          "NPCJP1E"         
[17] "NPCJP1F"          "NPCJP1G"          "NPCJP1H"          "NPCJP1I"         
[21] "NPCJP1J"          "NPCJP1K"          "NPCJP1L"          "NPCJP1M"         
[25] "NPCJP1N"          "NPCJP10"          "NPCJP1P"          "NPCJP1Q"         
[29] "FEX_C.x"         

1.4 Frecuencias

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.

addmargins(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                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.

round(prop.table(table(bd_def$NOMBRE_LOCALIDAD))*100,digits = 1)

                       Antonio Nariño     Barrios Unidos               Bosa 
              19.2                1.5                2.4                4.2 
         Chapinero     Ciudad Bolívar           Engativá           Fontibón 
               3.1                5.8                6.2                5.8 
           Kennedy      La Candelaria       Los Mártires      Puente Aranda 
               9.1                0.8                1.6                3.1 
Rafael Uribe Uribe      San Cristóbal           Santa Fe               Suba 
               4.0                4.3                3.4                8.5 
           Sumapaz        Teusaquillo         Tunjuelito            Usaquén 
               0.7                4.1                1.6                6.0 
              Usme 
               4.4 
  • 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%.
addmargins(round(prop.table(table(bd_def$NOMBRE_LOCALIDAD))*100,digits = 1))

                       Antonio Nariño     Barrios Unidos               Bosa 
              19.2                1.5                2.4                4.2 
         Chapinero     Ciudad Bolívar           Engativá           Fontibón 
               3.1                5.8                6.2                5.8 
           Kennedy      La Candelaria       Los Mártires      Puente Aranda 
               9.1                0.8                1.6                3.1 
Rafael Uribe Uribe      San Cristóbal           Santa Fe               Suba 
               4.0                4.3                3.4                8.5 
           Sumapaz        Teusaquillo         Tunjuelito            Usaquén 
               0.7                4.1                1.6                6.0 
              Usme                Sum 
               4.4               99.8 
  • addmargins() se aplica a la tabla de porcentajes redondeados.

  • Esto añade un total al final, que debería ser cercano a 100%.

1.5 Frecuencias cruzadas

Si queremos por ejemplo conocer la distribución de las personas encuestadas en cada localidad por sexo, podemos usar también la función table.

str(bd_def$NPCEP5A)
 hvn_lbll [1:260476]  2,  1, NA, NA, NA, NA, NA, NA, NA,  1,  2, NA, NA, NA...
 @ label        : chr "5a. Sexo imputado (Sin intersexuales):"
 @ format.spss  : chr "F1.0"
 @ display_width: int 1
 @ labels       : Named num [1:2] 1 2
  ..- attr(*, "names")= chr [1:2] "Hombre" "Mujer"
  • 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.

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.

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:

table(bd_def$NOMBRE_LOCALIDAD,bd_def$NPCEP5A, useNA = "ifany")
                    
                     Hombre Mujer  <NA>
                          0     0 50027
  Antonio Nariño          0     0  4012
  Barrios Unidos          0     0  6197
  Bosa                    0     0 10965
  Chapinero               1     1  7998
  Ciudad Bolívar          1     1 15164
  Engativá                0     0 16272
  Fontibón                1     1 15196
  Kennedy                 4     6 23669
  La Candelaria           0     0  2075
  Los Mártires            0     0  4232
  Puente Aranda           1     1  8158
  Rafael Uribe Uribe      0     1 10378
  San Cristóbal           3     6 11173
  Santa Fe                2     1  8894
  Suba                    3     1 22209
  Sumapaz                10     7  1690
  Teusaquillo             0     0 10746
  Tunjuelito              0     0  4100
  Usaquén                 0     0 15712
  Usme                    0     3 11554
  • 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:

round(prop.table(table(bd_def$NOMBRE_LOCALIDAD,bd_def$NPCEP5A, useNA = "ifany"))*100,digits=3)
                    
                     Hombre  Mujer   <NA>
                      0.000  0.000 19.206
  Antonio Nariño      0.000  0.000  1.540
  Barrios Unidos      0.000  0.000  2.379
  Bosa                0.000  0.000  4.210
  Chapinero           0.000  0.000  3.071
  Ciudad Bolívar      0.000  0.000  5.822
  Engativá            0.000  0.000  6.247
  Fontibón            0.000  0.000  5.834
  Kennedy             0.002  0.002  9.087
  La Candelaria       0.000  0.000  0.797
  Los Mártires        0.000  0.000  1.625
  Puente Aranda       0.000  0.000  3.132
  Rafael Uribe Uribe  0.000  0.000  3.984
  San Cristóbal       0.001  0.002  4.289
  Santa Fe            0.001  0.000  3.415
  Suba                0.001  0.000  8.526
  Sumapaz             0.004  0.003  0.649
  Teusaquillo         0.000  0.000  4.126
  Tunjuelito          0.000  0.000  1.574
  Usaquén             0.000  0.000  6.032
  Usme                0.000  0.001  4.436
  • 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áficos
library(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.

2 Análisis descriptivo bivariado

2.1 Covarianza

unique(bd_def$NPCJP1G)
[1] NA  1
table(bd_def$NPCJP1G, useNA = "ifany")

     1   <NA> 
   479 259997 
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 ingreso
  mutate(ingreso_laboral = pmax(rnorm(n(), mean = 900000, sd = 1500000),0))


table(bd_def$Parti, useNA = "ifany")

     0      1 
    23 260453 
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ásico
ggplot(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ásico
ggplot(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 instalado
library(ggplot2)

# Seleccionar solo las columnas numéricas
bd_def_num <- select_if(bd_def, is.numeric)
# Suponiendo que bd_def es un DataFrame con solo variables numéricas
cov_matrix <- cov(bd_def_num, use = "na.or.complete")

# Convertir la matriz a un formato largo
library(reshape2)
Warning: package 'reshape2' was built under R version 4.3.3
cov_data <- melt(cov_matrix)

# Graficar el mapa de calor
ggplot(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.1 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.

3 Estadísticos descriptivos para una submuestra

ingreso <- bd_def %>% 
  #dejar solo las variables de interés
  select(Parti,ingreso_laboral,NPCEP5A,NPCEP4,NOMBRE_LOCALIDAD,FEX_C.x) %>% 
  #filtrar personas que participan
  #filter(Parti==1) %>% 
  #agrupar por localidad
  group_by(Parti,NOMBRE_LOCALIDAD) %>%
  #summarise - resumen
  summarise(
    #Media
    media_muestral = mean(ingreso_laboral,na.rm = TRUE),
    #Media expandida
    media_expandida = weighted.mean(ingreso_laboral, FEX_C.x,na.rm = TRUE), 
    #Mediana muestral
  mediana_muestral = median(ingreso_laboral,na.rm = TRUE),
    #Mediana expandida
  mediana_expandida = Hmisc::wtd.quantile(ingreso_laboral, probs = 0.5, weight = FEX_C.x, na.rm = TRUE),
    #Varianza muestral
  var_muestral = var(ingreso_laboral,na.rm = TRUE),
    #Varianza expandida
  vare_expandida = Hmisc::wtd.var(ingreso_laboral, weight = FEX_C.x, na.rm = TRUE),
     #Desviación estandar muestral
  des_muestral = sd(ingreso_laboral,na.rm = TRUE),
    #Desviación estandar expandida
  des_expandida = sqrt(vare_expandida),
  #IQR
  IQR = 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áfico
print(histo4)