Analisis Descriptivo

Visitas

A continuación se analizan las visitas de encuestadores para la ENAPRES 2021-2023.

library(haven)
library(dplyr)

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)
library(lubridate)

Attaching package: 'lubridate'
The following objects are masked from 'package:base':

    date, intersect, setdiff, union
path <- "G:/.shortcut-targets-by-id/15XqGK2CMiZRU1ytBYJn7Okg4Up6Qy-6Q/LabStat/Proyectos/data/intermediate/visitas"
archivo <- file.path(path, "pool_enapres.sav")
enapres <- read_sav(archivo)

# solo visitas presenciales 
enapres <- filter(enapres, modalidad_enc == 1)
head(enapres)
# A tibble: 6 × 27
  id_hogar id_visita area_resd  dep_cod dep_nom  prov_cod prov_nom    dist_cod
     <dbl>     <dbl> <dbl+lbl>  <chr>   <chr>    <chr>    <chr>       <chr>   
1   367369   1342265 1 [Urbano] 01      AMAZONAS 01       CHACHAPOYAS 01      
2   367369   1342266 1 [Urbano] 01      AMAZONAS 01       CHACHAPOYAS 01      
3   367369   1342267 1 [Urbano] 01      AMAZONAS 01       CHACHAPOYAS 01      
4   367369   1342268 1 [Urbano] 01      AMAZONAS 01       CHACHAPOYAS 01      
5   367369   1342269 1 [Urbano] 01      AMAZONAS 01       CHACHAPOYAS 01      
6   367369   1342270 1 [Urbano] 01      AMAZONAS 01       CHACHAPOYAS 01      
# ℹ 19 more variables: dist_nom <chr>, ccpp_cod <chr>, ccpp_nom <chr>,
#   zona_resd <chr>, manzana <chr>, modalidad_enc <dbl+lbl>,
#   res_final_hogar <dbl+lbl>, num_visita <dbl>, dia_visita <dbl>,
#   mes_visita <dbl>, hora_inicio_enc <dbl>, minuto_inicio_enc <dbl>,
#   hora_fin_enc <dbl>, minuto_fin_enc <dbl>, res_visita <dbl+lbl>,
#   latitud_gps <chr>, longitud_gps <chr>, altitud_gps <chr>, anio <dbl>

Análisis descriptivo

Columnas disponibles y renombradas

print(colnames(enapres))
 [1] "id_hogar"          "id_visita"         "area_resd"        
 [4] "dep_cod"           "dep_nom"           "prov_cod"         
 [7] "prov_nom"          "dist_cod"          "dist_nom"         
[10] "ccpp_cod"          "ccpp_nom"          "zona_resd"        
[13] "manzana"           "modalidad_enc"     "res_final_hogar"  
[16] "num_visita"        "dia_visita"        "mes_visita"       
[19] "hora_inicio_enc"   "minuto_inicio_enc" "hora_fin_enc"     
[22] "minuto_fin_enc"    "res_visita"        "latitud_gps"      
[25] "longitud_gps"      "altitud_gps"       "anio"             

Tipos de datos almacenados

glimpse(enapres)
Rows: 605,115
Columns: 27
$ id_hogar          <dbl> 367369, 367369, 367369, 367369, 367369, 367369, 3673…
$ id_visita         <dbl> 1342265, 1342266, 1342267, 1342268, 1342269, 1342270…
$ area_resd         <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ dep_cod           <chr> "01", "01", "01", "01", "01", "01", "01", "01", "01"…
$ dep_nom           <chr> "AMAZONAS", "AMAZONAS", "AMAZONAS", "AMAZONAS", "AMA…
$ prov_cod          <chr> "01", "01", "01", "01", "01", "01", "01", "01", "01"…
$ prov_nom          <chr> "CHACHAPOYAS", "CHACHAPOYAS", "CHACHAPOYAS", "CHACHA…
$ dist_cod          <chr> "01", "01", "01", "01", "01", "01", "01", "01", "01"…
$ dist_nom          <chr> "CHACHAPOYAS", "CHACHAPOYAS", "CHACHAPOYAS", "CHACHA…
$ ccpp_cod          <chr> "0001", "0001", "0001", "0001", "0001", "0001", "000…
$ ccpp_nom          <chr> "CHACHAPOYAS", "CHACHAPOYAS", "CHACHAPOYAS", "CHACHA…
$ zona_resd         <chr> "00200", "00200", "00200", "00200", "00200", "00200"…
$ manzana           <chr> "051", "051", "051", "051", "051", "051", "053", "05…
$ modalidad_enc     <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ res_final_hogar   <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 7, 1, 1, 1, …
$ num_visita        <dbl> 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 1, 1, 1, 2, 3, 4, 5…
$ dia_visita        <dbl> 12, 13, 13, 14, 15, 15, 12, 13, 15, 16, 16, 14, 13, …
$ mes_visita        <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ hora_inicio_enc   <dbl> 9, 9, 17, 18, 11, 17, 10, 14, 10, 11, 15, 15, 13, 11…
$ minuto_inicio_enc <dbl> 44, 1, 27, 47, 38, 53, 42, 45, 38, 47, 29, 36, 37, 1…
$ hora_fin_enc      <dbl> 10, 10, 17, 19, 11, 18, 11, 14, 10, 12, 16, 15, 13, …
$ minuto_fin_enc    <dbl> 0, 30, 39, 18, 51, 13, 16, 59, 43, 1, 59, 44, 58, 29…
$ res_visita        <dbl+lbl> 4, 2, 4, 2, 4, 1, 4, 4, 4, 4, 1, 5, 7, 4, 4, 4, …
$ latitud_gps       <chr> "-6.22879852540791", "-6.228711688891053", "-6.22882…
$ longitud_gps      <chr> "-77.87547337822616", "-77.87526743486524", "-77.875…
$ altitud_gps       <chr> "2362.0", "2369.0", "2370.0", "2370.0", "2373.0", "2…
$ anio              <dbl> 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021…

Identificación de duplicados y valores faltantes

Valores faltantes

colSums(is.na(enapres))
         id_hogar         id_visita         area_resd           dep_cod 
                0                 0                 0                 0 
          dep_nom          prov_cod          prov_nom          dist_cod 
                0                 0                 0                 0 
         dist_nom          ccpp_cod          ccpp_nom         zona_resd 
                0                 0                 0                 0 
          manzana     modalidad_enc   res_final_hogar        num_visita 
                0                 0                 0                 0 
       dia_visita        mes_visita   hora_inicio_enc minuto_inicio_enc 
                0                 0                 0                 0 
     hora_fin_enc    minuto_fin_enc        res_visita       latitud_gps 
                0                 0                 0                 0 
     longitud_gps       altitud_gps              anio 
                0                 0                 0 

Base a nivel de visitas (ID : id de hogar + número de visita, se eliminan las observaciones con ID repetido

# Generar id unico por fila
enapres$id_hogar <- as.character(enapres$id_hogar)
enapres$num_visita <- as.character(enapres$num_visita)

enapres <- enapres %>%
  mutate(id_visita2 = paste0(id_hogar, num_visita))

# Eliminar duplicados basados en la columna id_visita
enapres <- enapres %>%
  distinct(id_visita2, .keep_all = TRUE)

print(dim(enapres))
[1] 605115     28

Identificación de Outliers

Se analizarán las variables de mayor interés.

Número de visitas

Se observa que tiene valores muy altos (125 visitas).

enapres$num_visita <- as.numeric(enapres$num_visita)
summary(enapres$num_visita)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.000   3.000   4.176   5.000 125.000 

Asimismo observamos que la cantidad de visitas realizadas por año van en aumento.

observaciones <- enapres %>%
  count(anio, name = "Num. Visitas") %>%  # "año" debe ser tu columna de año
  arrange(anio)  # Ordenar por año (opcional)

print(observaciones)
# A tibble: 3 × 2
   anio `Num. Visitas`
  <dbl>          <int>
1  2021         187057
2  2022         207105
3  2023         210953

Se observa que apartir de las 11 visitas el crecimiento acumulado de las visitas es marginal. Lo que hace notar poco son lso hogares que acumulan más de 11 visitas. En base a esta criterio de 11 visitas se procede a eliminar a las visitas mayores a 11. Se recomienda hacer seguimiento a los hogares y encuestadores que realizaron más de 11 visitas y consultar con los jefes de campo y coordinadores de encuestas para verificar la veracidad de estos datos outlier.

Elimnamos aproximadamente 7% de la muestra debido a este criterio.

tabla <- enapres %>%
  # 1. Contar frecuencias de cada categoría en "num_visita"
  count(num_visita, name = "Frecuencia") %>%
  # 2. Calcular porcentaje y porcentaje acumulado
  mutate(
    Porcentaje = round(Frecuencia / sum(Frecuencia) * 100, 1),
    PorcentajeAcumulado = cumsum(Porcentaje)  # Clave: suma acumulada
  )

# Ver resultado
print(tabla)
# A tibble: 125 × 4
   num_visita Frecuencia Porcentaje PorcentajeAcumulado
        <dbl>      <int>      <dbl>               <dbl>
 1          1     167622       27.7                27.7
 2          2     115993       19.2                46.9
 3          3      82809       13.7                60.6
 4          4      59085        9.8                70.4
 5          5      42996        7.1                77.5
 6          6      31563        5.2                82.7
 7          7      23243        3.8                86.5
 8          8      17291        2.9                89.4
 9          9      13012        2.2                91.6
10         10       9867        1.6                93.2
# ℹ 115 more rows
enapres <- filter(enapres, num_visita <= 10) # este corte debe estar sustentato tecnicamente

Esta es la nueva cantidad de visitas luego de eliminar outliers.

observaciones <- enapres %>%
  count(anio, name = "Num. Visitas") %>% 
  arrange(anio) 

print(observaciones)
# A tibble: 3 × 2
   anio `Num. Visitas`
  <dbl>          <int>
1  2021         174084
2  2022         193363
3  2023         196034

A continuación, este es el numero total de hogares encuestador por año. Se observa que la cantidad de hogares encuestados tiene una tendencia a incrimentar con el paso de los años.

enapres_hogar <- enapres %>%
  distinct(id_hogar, .keep_all = TRUE)
tab_hogares <- enapres_hogar %>%
  count(anio, name = "Hogares") %>%
  arrange(anio) 

print(tab_hogares)
# A tibble: 3 × 2
   anio Hogares
  <dbl>   <int>
1  2021   53374
2  2022   56702
3  2023   57557
#Los hogares que reportan más de 10 visitas en realidad tienen información confiable ?

#enapres %>%
#  filter(num_visita >= 20) %>%         # Filter rows where num_visita is 20
#  arrange(id_visita2) %>%              # Order by id_visita2
#  select(id_hogar, id_visita2, num_visita, res_visita, res_final_hogar)  %>%
#  View () # Display in Viewer (optional)
# Paso 1: Crear una variable con el máximo de visitas por hogar
enapres_max <- enapres %>%
  group_by(id_hogar, anio) %>%               # Agrupar por hogar
  summarise(
    max_visitas_hogar = max(num_visita, na.rm = TRUE),  # Máximo de visitas
  ) %>%
  ungroup()
`summarise()` has grouped output by 'id_hogar'. You can override using the
`.groups` argument.
summary(enapres_max$max_visitas_hogar)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.000   2.000   3.361   5.000  10.000 
# Ejemplo con la variable 'edad' del dataframe 'datos'
ggplot(enapres_max, aes(x = max_visitas_hogar)) + 
  geom_density(fill = "skyblue", alpha = 0.5, color = "blue", bw=1.5) +
  scale_x_continuous(
    limits = c(1, 10),       # Límites del eje (mínimo = 1, máximo = 10)
    breaks = seq(1, 10, 1)   # Marcas del eje: 1, 2, 3, ..., 10
  ) +  # alpha = transparencia
  labs(
    title = "Curva de Densidad de Visitas Necesarias",
    x = "Numero de visitas",
    y = "Densidad"
  ) +
  facet_wrap(~anio) +
  theme_minimal()

Resultados por visita

A continuación, se evaluan los resultados que se obtuvieron por visita. Inicialmente esta variable tiene siete categorías: 1 completa, 2 incompleta, 3 rechazo, 4 ausente, 5 vivienda desocupada, 6 no se inició entrevista, 7 otro.

# Calcular proporciones y completar categorías faltantes (si las hay)
tab_resultados <- enapres %>%
  # Contar filas por año y categoría de res_visita
  count(anio, res_visita, name = "resultado") %>% 
  # Calcular porcentaje dentro de cada año
  group_by(anio) %>%
  mutate(
    porcentaje = resultado / sum(resultado) * 100,
    res_visita = factor(res_visita)  # Convertir a factor para ordenar
  ) 
print(tab_resultados)
# A tibble: 21 × 4
# Groups:   anio [3]
    anio res_visita resultado porcentaje
   <dbl> <fct>          <int>      <dbl>
 1  2021 1              35468      20.4 
 2  2021 2              45082      25.9 
 3  2021 3               4882       2.80
 4  2021 4              75214      43.2 
 5  2021 5               3207       1.84
 6  2021 6               3003       1.73
 7  2021 7               7228       4.15
 8  2022 1              35524      18.4 
 9  2022 2              43548      22.5 
10  2022 3               5067       2.62
# ℹ 11 more rows

Debido a la distribucion de los valores de los resultados de las visitas se decidió re agrugar lor valores. La nueva categorización es la siguiente: 1 completa, 2 incompleta, 3,5,6,7 rechazo, 4 ausente

# recategorizando la varaible de resultado
enapres <- enapres %>%
  mutate(
    res_visita2 = case_when(
      res_visita == 1 ~ 1,
      res_visita == 2 ~ 2,
      res_visita == 4 ~ 4,
      res_visita %in% c(3,5,6,7) ~ 3
    ),
    res_visita2 = factor(  # Convertir a factor con etiquetas
      res_visita2,
      levels = c(1, 2, 3, 4),
      labels = c("Completo", "Incompleto", "Rechazado", "Ausente")
    )
  )

# Calcular proporciones y completar categorías faltantes (si las hay)
tab_resultados <- enapres %>%
  # Contar filas por año y categoría de res_visita
  count(anio, res_visita2, name = "resultado") %>% 
  # Calcular porcentaje dentro de cada año
  group_by(anio) %>%
  mutate(
    porcentaje = resultado / sum(resultado) * 100,
    res_visita2 = factor(res_visita2)  # Convertir a factor para ordenar
  ) 
print(tab_resultados)
# A tibble: 12 × 4
# Groups:   anio [3]
    anio res_visita2 resultado porcentaje
   <dbl> <fct>           <int>      <dbl>
 1  2021 Completo        35468       20.4
 2  2021 Incompleto      45082       25.9
 3  2021 Rechazado       18320       10.5
 4  2021 Ausente         75214       43.2
 5  2022 Completo        35524       18.4
 6  2022 Incompleto      43548       22.5
 7  2022 Rechazado       20735       10.7
 8  2022 Ausente         93556       48.4
 9  2023 Completo        36390       18.6
10  2023 Incompleto      42659       21.8
11  2023 Rechazado       21579       11.0
12  2023 Ausente         95406       48.7

Gráfico de barras apiladas por año

ggplot(tab_resultados, aes(x = factor(anio), y = porcentaje, fill = res_visita2)) +
  geom_col(position = "stack") +  # Barras apiladas al 100%
  geom_text(
    aes(label = sprintf("%.1f%%", porcentaje)),  # Mostrar porcentaje con 1 decimal
    position = position_stack(vjust = 0.5),  # Centrar etiquetas en cada segmento
    size = 3,
    color = "black"
  ) +
  labs(
    title = "Resultados de Visitas por Año - ENAPRES",
    x = "Año",
    y = "Porcentaje",
    fill = "Resultados"
  ) +
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +  # Formato de porcentaje en eje Y
  scale_fill_brewer(palette = "YlGnBu") +  # Paleta de colores
  theme_minimal()

# Calcular proporciones y completar categorías faltantes (si las hay)
tab2 <- enapres %>%
  # Contar filas por año y categoría de res_visita
  count(anio, res_visita2, num_visita, name = "resultado") %>% 
  # Calcular porcentaje dentro de cada año
  group_by(anio, num_visita) %>%
  mutate(
    porcentaje = resultado / sum(resultado) * 100,
    res_visita2 = factor(res_visita2)  # Convertir a factor para ordenar
  ) 
print(tab2)
# A tibble: 120 × 5
# Groups:   anio, num_visita [30]
    anio res_visita2 num_visita resultado porcentaje
   <dbl> <fct>            <dbl>     <int>      <dbl>
 1  2021 Completo             1      7843       14.7
 2  2021 Completo             2      9022       24.6
 3  2021 Completo             3      6615       25.7
 4  2021 Completo             4      4096       22.9
 5  2021 Completo             5      2711       21.3
 6  2021 Completo             6      1869       20.2
 7  2021 Completo             7      1300       19.2
 8  2021 Completo             8       917       18.2
 9  2021 Completo             9       645       17.1
10  2021 Completo            10       450       15.8
# ℹ 110 more rows
# Convertir num_visita a factor para mejor manejo en el gráfico
tab2$num_visita <- factor(tab2$num_visita)

ggplot(tab2, aes(x = interaction(anio, num_visita, sep = " - Visita "), y = porcentaje, fill = res_visita2)) +
  geom_col(position = "stack", width = 0.7) +  # Barras apiladas al 100%
  geom_text(
    aes(label = sprintf("%.1f%%", porcentaje)),  # Mostrar porcentaje con 1 decimal
    position = position_stack(vjust = 0.5),  # Centrar etiquetas en cada segmento
    size = 2,
    color = "black"
  ) +
  labs(
    title = "Resultados de Visitas por Año y Número de Visita - ENAPRES",
    x = "Año - Número de Visita",
    y = "Porcentaje",
    fill = "Resultados"
  ) +
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +  # Formato de porcentaje en eje Y
  scale_fill_brewer(palette = "YlGnBu") +  # Paleta de colores
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotar etiquetas del eje X

tab2$num_visita <- as.numeric(as.character(tab2$num_visita))
# Gráfico de líneas con facetas por año
ggplot(tab2, aes(x = num_visita, y = porcentaje, color = res_visita2)) +
  geom_line(linewidth = 1) +          # Líneas para cada resultado
  geom_point(size = 2) +              # Puntos en cada número de visita
  geom_text(
    aes(label = sprintf("%.1f%%", porcentaje)),
    vjust = -0.8,                       # Ajustar posición vertical de etiquetas
    size = 2.5,
    check_overlap = TRUE                # Evitar superposición de texto
  ) +
  labs(
    title = "Evolución de Resultados por Visita y Año - ENAPRES",
    x = "Número de Visita",
    y = "Porcentaje",
    color = "Resultados"
  ) +
  scale_x_continuous(breaks = unique(tab2$num_visita)) +   # Mostrar todos los números de visita
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +
  scale_color_brewer(palette = "Set1") +  # Paleta diferenciada
  facet_wrap(~anio, nrow = 1) +          # 3 gráficos en una fila
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.spacing = unit(1, "lines"),  # Espacio entre facetas
    legend.position = "bottom"
  )

Resultado por hogar

# Calcular proporciones y completar categorías faltantes (si las hay)
tab_resultados2 <- enapres_hogar %>%
  # Contar filas por año y categoría de res_visita
  count(anio, res_final_hogar, name = "resultado_hogar") %>% 
  # Calcular porcentaje dentro de cada año
  group_by(anio) %>%
  mutate(
    porcentaje = resultado_hogar / sum(resultado_hogar) * 100,
    res_final_hogar = factor(res_final_hogar)  # Convertir a factor para ordenar
  ) 
print(tab_resultados2)
# A tibble: 18 × 4
# Groups:   anio [3]
    anio res_final_hogar resultado_hogar porcentaje
   <dbl> <fct>                     <int>      <dbl>
 1  2021 1                         36845      69.0 
 2  2021 2                          3646       6.83
 3  2021 3                          1098       2.06
 4  2021 4                          1333       2.50
 5  2021 5                          3228       6.05
 6  2021 7                          7224      13.5 
 7  2022 1                         37162      65.5 
 8  2022 2                          4512       7.96
 9  2022 3                          1365       2.41
10  2022 4                          1760       3.10
11  2022 5                          3268       5.76
12  2022 7                          8635      15.2 
13  2023 1                         38297      66.5 
14  2023 2                          3703       6.43
15  2023 3                          1183       2.06
16  2023 4                          1530       2.66
17  2023 5                          3404       5.91
18  2023 7                          9440      16.4 

Recategorizando la variable resultado de visita por hogar

# recategorizando la varaible de resultado
enapres_hogar <- enapres_hogar %>%
  mutate(
    res_final_hogar2 = case_when(
      res_final_hogar == 1 ~ 1,
      res_final_hogar == 2 ~ 2,
      res_final_hogar == 4 ~ 4,
      res_final_hogar %in% c(3,5,6,7) ~ 3
    ),
    res_final_hogar2 = factor(  # Convertir a factor con etiquetas
      res_final_hogar2,
      levels = c(1, 2, 3, 4),
      labels = c("Completo", "Incompleto", "Rechazado", "Ausente")
    )
  )

# Calcular proporciones y completar categorías faltantes (si las hay)
tab_resultados_hog <- enapres_hogar %>%
  # Contar filas por año y categoría de res_visita
  count(anio, res_final_hogar2, name = "resultado_hog") %>% 
  # Calcular porcentaje dentro de cada año
  group_by(anio) %>%
  mutate(
    porcentaje = resultado_hog / sum(resultado_hog) * 100,
    res_final_hogar2 = factor(res_final_hogar2)  # Convertir a factor para ordenar
  ) 
print(tab_resultados_hog)
# A tibble: 12 × 4
# Groups:   anio [3]
    anio res_final_hogar2 resultado_hog porcentaje
   <dbl> <fct>                    <int>      <dbl>
 1  2021 Completo                 36845      69.0 
 2  2021 Incompleto                3646       6.83
 3  2021 Rechazado                11550      21.6 
 4  2021 Ausente                   1333       2.50
 5  2022 Completo                 37162      65.5 
 6  2022 Incompleto                4512       7.96
 7  2022 Rechazado                13268      23.4 
 8  2022 Ausente                   1760       3.10
 9  2023 Completo                 38297      66.5 
10  2023 Incompleto                3703       6.43
11  2023 Rechazado                14027      24.4 
12  2023 Ausente                   1530       2.66
ggplot(tab_resultados_hog, aes(x = factor(anio), y = porcentaje, fill = res_final_hogar2)) +
  geom_col(position = "stack") +  # Barras apiladas al 100%
  geom_text(
    aes(label = sprintf("%.1f%%", porcentaje)),  # Mostrar porcentaje con 1 decimal
    position = position_stack(vjust = 0.5),  # Centrar etiquetas en cada segmento
    size = 3,
    color = "black"
  ) +
  labs(
    title = "Resultados de hogares por Año - ENAPRES",
    x = "Año",
    y = "Porcentaje",
    fill = "Resultados"
  ) +
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +  # Formato de porcentaje en eje Y
  scale_fill_brewer(palette = "YlGnBu") +  # Paleta de colores
  theme_minimal()

Ventanas de tiempo

generar ventanas de tiempo 1. disribucion de la variable hora (quizás deberia redondear a horas) 2. clasificar por mañana tarde y noche dependiendo de la hora. cantidad de visita por cada ventana de tiempo

# Columnas a convertir a numerico
columnas <- c("hora_inicio_enc", "minuto_inicio_enc", "hora_fin_enc", "minuto_fin_enc")
enapres[columnas] <- lapply(enapres[columnas], function(x) as.numeric(as.character(x)))

# generación ventanas de tiempo
enapres <- enapres %>%
  mutate(
    ventana_tiempo = case_when(
      hora_inicio_enc >= 6 & hora_inicio_enc < 12 ~ 1,
      hora_inicio_enc >= 12 & hora_inicio_enc < 18 ~ 2,
      hora_inicio_enc >= 18 | hora_inicio_enc < 6 ~ 3
    ),
    ventana_tiempo = factor(  # Convertir a factor con etiquetas
      ventana_tiempo,
      levels = c(1, 2, 3),
      labels = c("Mañana", "Tarde", "Noche")
    )
  )

# generar cantidad de visitas por ventana de tiempo
enapres <- enapres %>%
  group_by(ventana_tiempo) %>%
  mutate(
    cantidad_visitas_ventana = n()  # n() cuenta las filas por grupo
  ) %>%
  ungroup()  # Eliminar la agrupación
# Crear tabla de visitas por año y ventana de tiempo
tabla_conteo <- enapres %>%
  # Contar filas por año y ventana de tiempo
  count(anio, ventana_tiempo, name = "total_visitas")

# Ver tabla
print(tabla_conteo)
# A tibble: 9 × 3
   anio ventana_tiempo total_visitas
  <dbl> <fct>                  <int>
1  2021 Mañana                 72999
2  2021 Tarde                  75521
3  2021 Noche                  25564
4  2022 Mañana                 83335
5  2022 Tarde                  84307
6  2022 Noche                  25721
7  2023 Mañana                 86345
8  2023 Tarde                  83185
9  2023 Noche                  26504
ggplot(tabla_conteo, aes(x = anio, y = total_visitas, color = ventana_tiempo)) +
  geom_line(linewidth = 1.2) +          # Líneas conectando los puntos
  geom_point(size = 3) +                # Puntos en cada año
  labs(
    title = "Evolución de Visitas por Ventana de Tiempo",
    x = "Año",
    y = "Total de Visitas",
    color = "Ventana"
  ) +
  scale_x_continuous(breaks = c(2021, 2022, 2023)) +  # Fijar años en eje X
  scale_color_brewer(palette = "YlGnBu") +  # Paleta de colores
  theme_minimal()

ggplot(tabla_conteo, aes(x = anio, y = total_visitas, color = ventana_tiempo)) +
  geom_line(linewidth = 1.2) +          
  geom_point(size = 3) +                
  # Etiquetas con los valores exactos
  geom_text(
    aes(label = total_visitas), 
    vjust = -0.5,  # Ajusta la posición vertical de la etiqueta
    size = 3.5,
    show.legend = FALSE,
    color = "black"
  ) +
  labs(
    title = "Evolución de Visitas por Ventana de Tiempo",
    x = "Año",
    y = "Total de Visitas",
    color = "Hora"
  ) +
  # Personalizar ejes
  scale_x_continuous(
    breaks = c(2021, 2022, 2023),  # Años específicos
  ) +
  scale_y_continuous(
    breaks = seq(0, 100000, by = 10000),  # Eje Y de 1000 en 1000 (ajusta el máximo según tus datos)
  ) +
  scale_color_brewer(palette = "YlGnBu") +
  theme_minimal()

Duración de visitas

Distribución (densidad o grafico de cajas) de duración de cada visita y descriptivos

enapres <- enapres %>%
  mutate(
    # Crear objetos de tiempo (asumiendo que todas son del mismo día)
    tiempo_inicio = make_datetime(hour = hora_inicio_enc, min = minuto_inicio_enc),
    tiempo_fin = make_datetime(hour = hora_fin_enc, min = minuto_fin_enc),
    
    # Calcular duración en minutos (maneja casos donde fin < inicio)
    duracion_minutos = as.numeric(difftime(tiempo_fin, tiempo_inicio, units = "mins")),
    
    # Asegurar que no hay duraciones negativas (si cruzan medianoche)
    duracion_minutos = ifelse(duracion_minutos < 0, duracion_minutos + 24*60, duracion_minutos)
  )
# Ejemplo con la variable 'edad' del dataframe 'datos'
ggplot(enapres, aes(x = duracion_minutos)) + 
  geom_density(fill = "skyblue", alpha = 0.5, color = "blue", bw=1.5) +
  labs(
    title = "Curva de Densidad de Duración de visitas",
    x = "Numero de minutos",
    y = "Densidad"
  ) +
  facet_wrap(~anio) +
  theme_minimal()

ggplot(enapres, aes(y = duracion_minutos)) + 
  geom_boxplot(fill = "skyblue", alpha = 0.7) +
  labs(
    title = "Distribución de la Duración de Visitas por Año",
    y = "Duración (minutos)"
  ) +
  facet_wrap(~anio) +  # Separa en paneles por año
  theme_minimal()

summary(enapres$duracion_minutos)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    5.00   10.00   29.67   45.00 1031.00 
visitas_outliers <- enapres %>%
  filter(duracion_minutos>200) %>%
  select(duracion_minutos, hora_inicio_enc, minuto_inicio_enc, hora_fin_enc, minuto_fin_enc, anio)
print(visitas_outliers)
# A tibble: 921 × 6
   duracion_minutos hora_inicio_enc minuto_inicio_enc hora_fin_enc
              <dbl>           <dbl>             <dbl>        <dbl>
 1              598              10                30           20
 2              265              14                19           18
 3              258              10                57           15
 4              528              13                59           22
 5              589              11                27           21
 6              454              10                24           17
 7              214              16                 2           19
 8              218              17                35           21
 9              225              10                57           14
10              213              17                 6           20
# ℹ 911 more rows
# ℹ 2 more variables: minuto_fin_enc <dbl>, anio <dbl>
tabla_outlier <- visitas_outliers %>%
  count(anio, name = "visitas") %>%
  arrange(anio)
print(tabla_outlier)
# A tibble: 3 × 2
   anio visitas
  <dbl>   <int>
1  2021     191
2  2022     318
3  2023     412

Geolocalización

generar id GPS , calcular la cantidad de veces que se va al mismo punto para encuestar hogares distintos x año