Medidas de Dispersión

Ejercicios

Usando la data ‘OXFAM_IEP_ENADES_2024.xlsx’, desarrolle las siguientes preguntas:

  1. Lea el archivo quitando los missing values y los NA.
  2. Haga el preprocesamiento de los datos segun el diccionario y guardelo en datos1.
  3. Obtener e interpretar el rango de la edad.
  4. Obtener e interpretar el rango de la edad por sexo.
  5. obtener e interpretar el IQR de la edad
  6. Obtener e interpretar el rango intercuartil de la edad para las personas que creen que la diferencia entre ricos y pobres ha aumentado en el Perú. Comparar con aquellos que creen que ha disminuido.
  7. Obtener la varianza de la edad.
  8. Obtener la varianza de la cantidad de personas que viven en el hogar.
  9. Obtener e interpretar la desviación estándar de la edad de las personas cuyo ingreso económico les alcanza bien y pueden ahorrar (P16).
  10. Obtener e interpretar la desviación estándar del monto mínimo mensual que requiere para vivir en el hogar de las personas que piensan que el Perú es gobernado por unos pocos, y compararlo con aquellos que creen que el Perú es gobernado para el bien de todo el pueblo (P27).
  11. Obtener el coeficiente de variabilidad de la edad.
  12. ¿Qué sexo presenta mayor variabilidad de la edad?
  13. ¿Quiénes presentan mayor variabilidad en la cantidad de miembro en su hogar: los que viven en costa, sierra o selva?
  14. Obtener e interpretar el rango intercuartil de la edad de los hombres que viven en zonas rurales.
  15. Obtener e interpretar la desviación estándar de la cantidad de miembros en el hogar de las personas que creen que la desigualdad entre personas LGTBIQ y quienes no lo son es muy grave.

Solución:

1) Lea el archivo quitando los missing values y los NA.

library(readxl)
datos <- read_excel('OXFAM_IEP_ENADES_2024.xlsx', na = c('99','99999'))
datos |> na.omit()
## # A tibble: 102 × 91
##         NC ponderab  edad edadr  sexo   dep  prov   dist macrozona zona2 ambito2
##      <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>     <dbl> <dbl>   <dbl>
##  1  2.03e8    0.861    25     2     2     3   301  30101         4     7       2
##  2  2.03e8    0.906    47     3     1     4   402  40201         4     4       2
##  3  2.03e8    0.892    34     2     1    12  1203 120301         5     8       2
##  4  2.03e8    0.861    35     2     2    12  1203 120305         5     8       2
##  5  2.03e8    1.22     42     3     2    15  1501 150106         1     1       1
##  6  2.03e8    0.874    45     3     2    22  2201 220105         5     8       2
##  7  2.03e8    1.21     27     2     1     3   302  30201         4     7       2
##  8  2.03e8    0.874    49     3     2     4   401  40112         4     7       2
##  9  2.03e8    0.874    50     3     2     4   401  40102         4     7       2
## 10  2.03e8    1.17     28     2     2    22  2201 220101         5     8       2
## # ℹ 92 more rows
## # ℹ 80 more variables: zonali1 <dbl>, zonali2 <dbl>, region <dbl>, ur <dbl>,
## #   ambito <dbl>, hogar <dbl>, hijos18 <dbl>, edu <dbl>, edu2 <dbl>,
## #   edupadre <dbl>, edupadre2 <dbl>, edumadre <dbl>, edumadre2 <dbl>,
## #   origen <dbl>, ocupa <dbl>, ocupa2 <dbl>, NSE <dbl>, NSE1 <dbl>, NSE2 <dbl>,
## #   P01 <dbl>, P02 <dbl>, P02a <dbl>, P03 <dbl>, P03a <dbl>, P05 <dbl>,
## #   P05a <dbl>, P06 <dbl>, P06a <dbl>, P07 <dbl>, P08 <dbl>, P09 <dbl>, …

2) Haga el preprocesamiento de los datos segun el diccionario y guardelo en datos1.

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
datos |> 
  mutate(sexo = case_when(sexo == 1 ~ "Hombre",
                          sexo == 2 ~ "Mujer",
                          sexo == 3 ~ "Otro"),
         region = case_when(region == 1 ~ "Costa",
                            region == 2 ~ "Sierra",
                            region == 3 ~ "Selva"),
         ur = case_when(ur == 1 ~ "Urbana",
                        ur == 2 ~ "Rural"),
         edu = case_when(edu %in% 1:2 ~ "Sin educación",
                         edu %in% 3:4 ~ "Primaria",
                         edu %in% c(5,6,8) ~ "Secundaria",
                         edu %in% c(7,9,10) ~ "Superior"),
         edu = factor(edu, levels = c("Sin educación","Primaria",
                                      "Secundaria","Superior")),
         edu2 = ifelse(edu2 == 1, "E. Básica","E. Superior"),
         edupadre = case_when(edupadre %in% 1:2 ~ "Sin educación",
                              edupadre %in% 3:4 ~ "Primaria",
                              edupadre %in% c(5,6,8) ~ "Secundaria",
                              edupadre %in% c(7,9,10) ~ "Superior" ),
         ocupa = case_when(ocupa == 1 ~ "Solo trabaja",
                           ocupa == 2 ~ "Solo estudia",
                           ocupa == 3 ~ "Trabaja y estudia",
                           ocupa == 4 ~ "Está jubilado(a)",
                           ocupa == 5 ~ "Está desempleado(a)",
                           ocupa == 6 ~ "Solo se dedica a tareas del hogar",
                           ocupa == 7 ~ "Ni estudia ni trabaja ni se dedica a labores del hogar",
                           ocupa == 8 ~ "Trabaja y hace las tareas del hogar"),
         P07 = case_when(P07 == 4 ~ "Mucho",
                         P07 == 3 ~ "Algo",
                         P07 == 2 ~ "Poco",
                         P07 == 1 ~ "Nada"),
         P08 = case_when(P08 == 1 ~ "Ha aumentado",
                         P08 == 2 ~ "Se mantiene igual",
                         P08 == 3 ~ "Ha disminuido"),
         P16 = case_when(P16 == 1 ~ "Les alcanza bien y pueden ahorrar",
                         P16 == 2 ~ "Les alcanza justo sin grandes dificultades",
                         P16 == 3 ~ "No les alcanza y tienen dificultades",
                         P16 == 4 ~ "No les alcanza y tienen grandes dificultades"),
         P26 = case_when(P26 == 1 ~ "Muy desigual",
                         P26 == 2 ~ "Algo desigual",
                         P26 == 3 ~ "Poco desigual",
                         P26 == 4 ~ "Nada desigual"),
         P27 = case_when(P27 == 1 ~ "Está gobernado por unos cuantos grupos poderosos en su propio beneficio",
                         P27 == 2 ~ "Está gobernado para el bien de todo el pueblo")) -> datos1

3) Obtener e interpretar el rango de la edad.

library(ggQC)
## Warning: package 'ggQC' was built under R version 4.4.2
library(dplyr)
datos1 |> pull(edad) |> QCrange()  # Funcion que nos da el resultado como un solo valor
## [1] 72
datos1 |> summarise(Rango = QCrange(edad)) #Funcion que nos da el resultado en un tibble
## # A tibble: 1 × 1
##   Rango
##   <dbl>
## 1    72

Interpretación: La amplitud de la edad de las personas encuestadas es de 72 años.

4) Obtener e interpretar el rango de la edad por sexo.

datos1 |> summarise(Rango = QCrange(edad), .by = sexo)
## # A tibble: 2 × 2
##   sexo   Rango
##   <chr>  <dbl>
## 1 Mujer     62
## 2 Hombre    72
datos1 |> group_by(sexo) |> summarise(Rango = QCrange(edad))
## # A tibble: 2 × 2
##   sexo   Rango
##   <chr>  <dbl>
## 1 Hombre    72
## 2 Mujer     62

Los dos códigos significan lo mismos, pero se escriben de diferentes formas.

Interpretación: La amplitud de la edad de las mujeres encuestadas es de 62 años, y de los hombres es de 72 años.

Ante ello podemos detectar un incoveniente al usar el rango, lo cual era sensible a los valores atípicos, y ello puede afectar nuestras medidas. Ante ello podemos usar el \(\mathbf{Rango}\) \(\mathbf{intercuatil}\) para solucionar dicho incoveniente.

5) obtener e interpretar el IQR de la edad

datos1 |> pull(edad) |> IQR()
## [1] 23
datos1 |> summarise(RIC = IQR(edad))
## # A tibble: 1 × 1
##     RIC
##   <dbl>
## 1    23

Interpretación: La amplitud del 50% central de la edad de los encuestados es de 23 años.

6) Obtener e interpretar el rango intercuartil de la edad para las personas que creen que la diferencia entre ricos y pobres ha aumentado en el Perú. Comparar con aquellos que creen que ha disminuido.

datos1 |> 
  group_by(P08) |>  #Segun el diccionario la variable P08 nos muestra ello
  summarise(RIC = IQR(edad)) |> 
  filter(!is.na(P08))
## # A tibble: 3 × 2
##   P08                 RIC
##   <chr>             <dbl>
## 1 Ha aumentado         23
## 2 Ha disminuido        27
## 3 Se mantiene igual    21

Podemos haber filtrado los datos de solo los que nos piden, pero usando la función group_by vemos todo ello.

Interpretación: La amplitud en el 50% central de la edad de las personas que creen que la diferencia entre ricos y pobres ha aumentado es de 23 años, mientras que en el grupo que cree que ha disminuido, es de 27 años.

7) Obtener la varianza de la edad.

datos1 |> pull(edad) |> var()
## [1] 227.2625

Interpretación: 277.26 años al cuadrado.

8) Obtener la varianza de la cantidad de personas que viven en el hogar.

datos1 |> pull(hogar) |> var()
## [1] NA

Como nos da NA, significa que esa columna tiene NA, para ello usaremos el siguiente argumento.

datos1 |> pull(hogar) |> var(na.rm = T)
## [1] 4.144413

Interpretación: 4.14 personas al cuadrado.

9) Obtener e interpretar la desviación estándar de la edad de las personas cuyo ingreso económico les alcanza bien y pueden ahorrar (P16).

datos1 |> 
  filter(P16 == "Les alcanza bien y pueden ahorrar") |> 
  summarise(desv = sd(edad))
## # A tibble: 1 × 1
##    desv
##   <dbl>
## 1  14.4

Interpretación: Las edades están en promedio aproximadamente alejados 14.4 años de la edad promedio

10) Obtener e interpretar la desviación estándar del monto mínimo mensual que requiere para vivir en el hogar de las personas que piensan que el Perú es gobernado por unos pocos, y compararlo con aquellos que creen que el Perú es gobernado para el bien de todo el pueblo (P27)

datos1 |> 
  group_by(P27) |>  
  summarise(desv = sd(P15, na.rm = TRUE)) |> 
  filter(!is.na(P27))
## # A tibble: 2 × 2
##   P27                                                                      desv
##   <chr>                                                                   <dbl>
## 1 Está gobernado para el bien de todo el pueblo                           1302.
## 2 Está gobernado por unos cuantos grupos poderosos en su propio beneficio 2227.

Intepretación: El monto mínimo mensual que requiere para vivir en el hogar se desvía alrededor 1302 soles de su promedio en aquellos que piensan que el país está gobernado para el bien de todo el pueblo; y para aquellos que creen que el Perú es gobernado por unos cuantos grupos poderosos en su propio beneficio se desvía alrededor 2227 de su promedio.

Las desviacion estándar nos dice que tanto aproximadamente se alejan los datos de su promedio, pero si nuestros datos son muy altos la desviación estándar tiende ser mayor y ello puede ocasionar sesgos, entonces es conveniente allí usar el coeficiente de variación. Si se quiere comparar datos, si las medias son parecidas y las medidas son iguales se usa d.estándar; de caso contrario usar coeficiente de variabilidad.

11) Obtener el coeficiente de variabilidad de la edad.

library(sjstats)
## Warning: package 'sjstats' was built under R version 4.4.2
datos1 |> pull(edad) |> cv()*100
## [1] 36.36129
datos1 |> summarize(coef_var = cv(edad)*100)
## # A tibble: 1 × 1
##   coef_var
##      <dbl>
## 1     36.4

Rpta: 36.4

12) ¿Qué sexo presenta mayor variabilidad de la edad?

datos1 |> group_by(sexo) |> summarize(cv = cv(edad)*100)
## # A tibble: 2 × 2
##   sexo      cv
##   <chr>  <dbl>
## 1 Hombre  37.3
## 2 Mujer   35.3

Rpta: Los hombres muestran una edad más variable con un CV = 37.3% frente al CV = 35.3% de las mujeres

13) ¿Quiénes presentan mayor variabilidad en la cantidad de miembro en su hogar: los que viven en costa, sierra o selva?

datos1 |> group_by(region) |> summarize(cv = cv(hogar)*100)
## # A tibble: 3 × 2
##   region    cv
##   <chr>  <dbl>
## 1 Costa   46.0
## 2 Selva   47.1
## 3 Sierra  45.6

Rpta: En la selva, con 47.1%, frente a la sierra 45.6% y la costa 46%

El coeficiente sirve más para comparar medidas.

14) Obtener e interpretar el rango intercuartil de la edad de los hombres que viven en zonas rurales.

datos1 |> group_by(ur) |> filter(sexo == "Hombre" ) |> 
  summarise(RIC_Hombres = IQR(edad))
## # A tibble: 2 × 2
##   ur     RIC_Hombres
##   <chr>        <dbl>
## 1 Rural           24
## 2 Urbana          24

Rpta: La amplitud del 50% central de la edad de los hombres que viven en zonas rurales es de 24 años.

15) Obtener e interpretar la desviación estándar de la cantidad de miembros en el hogar de las personas que creen que la desigualdad entre personas LGTBIQ y quienes no lo son es muy grave.

datos1 |> group_by(P22) |> summarise(desv = sd(hogar, na.rm = T)) |> filter(!is.na(P22))
## # A tibble: 4 × 2
##     P22  desv
##   <dbl> <dbl>
## 1     1  2.00
## 2     2  2.12
## 3     3  1.99
## 4     4  2.02

Interpretación: La cantidad de miembros en el hogar se desvía alrededor de 2 miembros de su promedio aquellos que creen que la desigualdad en personas LGTBIQ es muy grave; mientras que los que creen que es nada grave se desvía alrededor de 2 miembros de su promedio también.

16) Obtener el coeficiente de variabilidad de la edad de las mujeres que viven en la costa y creen que el acceso a la justicia (P26) es muy desigual, y compararlo con aquellas que tienen las mismas características pero viven en la selva.

library(sjstats)
datos1 |> filter(sexo == "Mujer" & region == "Costa") |> group_by(P26) |> summarize(CV = cv(edad)*100) |> filter(!is.na(P26))
## # A tibble: 4 × 2
##   P26              CV
##   <chr>         <dbl>
## 1 Algo desigual  36.1
## 2 Muy desigual   33.4
## 3 Nada desigual  36.5
## 4 Poco desigual  39.0
datos1 |> filter(sexo == "Mujer" & region == "Selva") |> group_by(P26) |> summarize(CV = cv(edad)*100) |> filter(!is.na(P26))
## # A tibble: 3 × 2
##   P26              CV
##   <chr>         <dbl>
## 1 Algo desigual  36.7
## 2 Muy desigual   33.4
## 3 Poco desigual  33.7

Rpta: La edad de las mujeres que viven en la Costa y creen que la justicia es muy desigual es menos variable con un CV = 33.37%; mientras que las mujeres que viven en la Sierra lo es más con un CV = 33.39 %.

Tablas de Frecuencias

Ejercicios

1) Construir una tabla de frecuencias del sexo e interpretar los valores obtenidos

datos1 |> count(sexo) |> mutate(porc = n/sum(n)*100)
## # A tibble: 2 × 3
##   sexo       n  porc
##   <chr>  <int> <dbl>
## 1 Hombre   733  48.6
## 2 Mujer    775  51.4
# La funcion count{dplyr} muestra una tabla de conteo 

Rpta: El 48.6 % de los encuestados son hombres y el 51.39% restantes son mujeres.

Una tabla como esta sirve para variables cualitativas y cuantitativas que tomen pocos valores, por ejemplo: cantidad de cursos matriculados en un ciclo aprox es 4 a 6 cursos.Ya que si son valores grandes es recomendable hacer una tabla con intervalos para ello

2) Construir una tabla cruzada de frecuencias del sexo y la ocupación principal, e interpretar los valores obtenidos

library(tidyr)
datos1 |> count(sexo,ocupa) |> filter(!is.na(ocupa))
## # A tibble: 16 × 3
##    sexo   ocupa                                                      n
##    <chr>  <chr>                                                  <int>
##  1 Hombre Está desempleado(a)                                       35
##  2 Hombre Está jubilado(a)                                          28
##  3 Hombre Ni estudia ni trabaja ni se dedica a labores del hogar     8
##  4 Hombre Solo estudia                                              22
##  5 Hombre Solo se dedica a tareas del hogar                         13
##  6 Hombre Solo trabaja                                             526
##  7 Hombre Trabaja y estudia                                         88
##  8 Hombre Trabaja y hace las tareas del hogar                        8
##  9 Mujer  Está desempleado(a)                                       33
## 10 Mujer  Está jubilado(a)                                           9
## 11 Mujer  Ni estudia ni trabaja ni se dedica a labores del hogar     6
## 12 Mujer  Solo estudia                                              41
## 13 Mujer  Solo se dedica a tareas del hogar                        272
## 14 Mujer  Solo trabaja                                             254
## 15 Mujer  Trabaja y estudia                                         87
## 16 Mujer  Trabaja y hace las tareas del hogar                       66
datos1 |> count(sexo,ocupa) |> filter(!is.na(ocupa)) |> spread(sexo,n, fill=0)
## # A tibble: 8 × 3
##   ocupa                                                  Hombre Mujer
##   <chr>                                                   <dbl> <dbl>
## 1 Está desempleado(a)                                        35    33
## 2 Está jubilado(a)                                           28     9
## 3 Ni estudia ni trabaja ni se dedica a labores del hogar      8     6
## 4 Solo estudia                                               22    41
## 5 Solo se dedica a tareas del hogar                          13   272
## 6 Solo trabaja                                              526   254
## 7 Trabaja y estudia                                          88    87
## 8 Trabaja y hace las tareas del hogar                         8    66
# la función spread coloca a la variable sexo de forma más ordenada, para sacar mejores conclusiones 

Es más conveniente verlo en porcentajes.

datos1 |> 
  count(sexo,ocupa)  |> 
  filter(!is.na(ocupa)) |>
  group_by(ocupa) |> 
  mutate(prop = n / sum(n)*100) |> 
  select(-n) |> 
  spread(sexo, prop, fill = 0)
## # A tibble: 8 × 3
## # Groups:   ocupa [8]
##   ocupa                                                  Hombre Mujer
##   <chr>                                                   <dbl> <dbl>
## 1 Está desempleado(a)                                     51.5   48.5
## 2 Está jubilado(a)                                        75.7   24.3
## 3 Ni estudia ni trabaja ni se dedica a labores del hogar  57.1   42.9
## 4 Solo estudia                                            34.9   65.1
## 5 Solo se dedica a tareas del hogar                        4.56  95.4
## 6 Solo trabaja                                            67.4   32.6
## 7 Trabaja y estudia                                       50.3   49.7
## 8 Trabaja y hace las tareas del hogar                     10.8   89.2

Interpretación: El 51.5% de las personas desempleadas son hombres

datos1 |> 
  count(sexo,ocupa)  |> 
  filter(!is.na(ocupa)) |>
  group_by(sexo) |> 
  mutate(prop = n / sum(n)*100) |> 
  select(-n) |> 
  spread(sexo, prop, fill = 0)
## # A tibble: 8 × 3
##   ocupa                                                  Hombre  Mujer
##   <chr>                                                   <dbl>  <dbl>
## 1 Está desempleado(a)                                      4.81  4.30 
## 2 Está jubilado(a)                                         3.85  1.17 
## 3 Ni estudia ni trabaja ni se dedica a labores del hogar   1.10  0.781
## 4 Solo estudia                                             3.02  5.34 
## 5 Solo se dedica a tareas del hogar                        1.79 35.4  
## 6 Solo trabaja                                            72.3  33.1  
## 7 Trabaja y estudia                                       12.1  11.3  
## 8 Trabaja y hace las tareas del hogar                      1.10  8.59

Interpretación: El 4.81% de los hombres está desempleado

La diferencia de los códigos radica en group_by: uno es tomando en cuenta ocupación y otro con sexo, por ende, la interpretaciones serán tomados en cuenta la ocupación y sexo, respectivamente.

3) Construir una tabla de frecuencia de la cantidad de personas que residen en el hogar, e interpretar los valores obtenidos.

datos1 |> count(hogar) |> filter(!is.na(hogar)) |> mutate(porce = n/sum(n)*100)
## # A tibble: 14 × 3
##    hogar     n   porce
##    <dbl> <int>   <dbl>
##  1     1    92  6.12  
##  2     2   153 10.2   
##  3     3   250 16.6   
##  4     4   349 23.2   
##  5     5   282 18.8   
##  6     6   173 11.5   
##  7     7    85  5.65  
##  8     8    71  4.72  
##  9     9    18  1.20  
## 10    10    19  1.26  
## 11    11     4  0.266 
## 12    12     5  0.332 
## 13    13     2  0.133 
## 14    15     1  0.0665

Podemos simplificar la tabla con la función Freq() del paquete “Desctools”

library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.2
datos1 |> pull(hogar) |> Freq(breaks = c(1,4,7,10,13,15))
##      level  freq   perc  cumfreq  cumperc
## 1    [1,4]   844  56.1%      844    56.1%
## 2    (4,7]   540  35.9%    1'384    92.0%
## 3   (7,10]   108   7.2%    1'492    99.2%
## 4  (10,13]    11   0.7%    1'503    99.9%
## 5  (13,15]     1   0.1%    1'504   100.0%

Con la variable edad.

datos1 |> pull(edad) |> Freq(breaks = seq(10,100,20))
##      level  freq   perc  cumfreq  cumperc
## 1  [10,30]   437  29.0%      437    29.0%
## 2  (30,50]   651  43.2%    1'088    72.1%
## 3  (50,70]   362  24.0%    1'450    96.2%
## 4  (70,90]    58   3.8%    1'508   100.0%

Gráficos

Variables cualitativas

Gráfico de barras

datos1 |> 
  pull(sexo) |> 
  table() |>
  barplot(main = "Distribución de encuestados por sexo",
          xlab = "Sexo",
          ylab = "Frecuencia",
          col = "darkblue")

datos1 |> 
  pull(region) |> 
  table() |>
  barplot(main = "Distribución de encuestados por región de residencia",
          xlab = "Región",
          ylab = "Frecuencia",
          col = c("darkblue","forestgreen","gold"))

Gráficos circular

datos1 |> 
  pull(region) |> 
  table() |>
  pie(main = "Distribución de encuestados por región de residencia",
      col = c("darkblue","forestgreen","gold"))

Se recomienda usar el barplot() para variables cualitativas con más categorías.

datos1 |>
  count(region) |>
  mutate(PORC = round(100*n/sum(n))) -> tabla
tabla |> pull(PORC,region) -> partes
library(waffle)
## Warning: package 'waffle' was built under R version 4.4.2
## Cargando paquete requerido: ggplot2
waffle(partes, title = "Distribución de encuestados por región de residencia",
       rows = 10, colors = c("darkblue","forestgreen","gold"))

Explicación del código: tabla: es una tabla contenida con la cantidad de encuestados en esa región con su respectivo porcentaje, luego de tabla solo extraigo la región y el porcentaje como un vector.

Se observa que en la región costa hay más encuestados que en sierra y selva.

Variables Cuantitativas

Histogramas

 datos |> 
  pull(edad) |>
  hist(main = "Distribución de encuestados por edad",
       xlab = "Edad", ylab = "Frecuencia (número de encuestados)",
       col = "gold")

datos |> 
  pull(P15) |>
  hist(main = "Distribución de encuestados por monto mínimo para vivir en el hogar",
       xlab = "Monto mínimo mensual que requiere su hogar para vivir",
       ylab = "Frecuencia (número de encuestados)",
       col = "gold",
       breaks = seq(0,40000,2000))

Diagrama de cajas

datos |> 
  pull(edad) |>
  boxplot(main = "Distribución de encuestados por edad",
          ylab = "Edad",
          col = "gold")

datos1 |> pull(edad) |> density() |> 
  plot(main = "Distribución de la edad",
       xlab= "Edad" , ylab = "Densidad", col = "red")

Se observa que hay más encuestados de 20 a 40 años es más denso, en otras palabras.

datos |> 
  pull(P15) |>
  boxplot(main = "Distribución de encuestados por monto mínimo para vivir en el hogar",
          ylab = "Monto mínimo",
          col = "gold")