1. Selección de una muestra por MAS(N,10)

En este paso, debes seleccionar una muestra aleatoria de hogares utilizando el marco muestral y generar una muestra de tamaño 10 (en tu caso, n = 10).

# Borrar objetos y cerrar gráficos abiertos
#rm(list = ls()) # Elimina todos los objetos en el espacio de trabajo.
#graphics.off() # Cierra todas las ventanas gráficas.

# Cargar las librerías necesarias
library(pacman) 
p_load(tidyverse, janitor, readxl, writexl, survey, srvyr)

# Cargar el marco muestral
marco <- read_excel("C:/Users/john/Desktop/Practica DS/Universidad del Bosque/Projects/EjerMuest/data/Ejemplo Hogares - Marco Muestral.xls")
muestra_data <- read_excel("C:/Users/john/Desktop/Practica DS/Universidad del Bosque/Projects/EjerMuest/output/Muestra Seleccionada.xlsx")
encuestas <- read_excel("C:/Users/john/Desktop/Practica DS/Universidad del Bosque/Projects/EjerMuest/data/Dominio Hogares.xls", sheet = "Hoja1")

# Definir el tamaño de la muestra
n <- 10

# Establecer la semilla para la generación de números aleatorios
set.seed(22-11-2024)  # Semilla ajustada

# Ordenar el marco muestral aleatoriamente
marco_ord <- marco |>
             mutate(aleatorio = runif(nrow(marco))) |>  # No usar 'n ='
             arrange(aleatorio)

# Seleccionar las primeras 10 filas para la muestra
muestra <- marco_ord |> 
           slice(1:n)

# Verificar si la carpeta 'output' existe, y si no, crearla
#if (!dir.exists("output")) {
#  dir.create("output")
#}

# Guardar la muestra en un archivo Excel
write_xlsx(muestra, "C:/Users/john/Desktop/Practica DS/Universidad del Bosque/Projects/EjerMuest/output/Muestra Seleccionada.xlsx")

2. Estimar en Excel el cuadro de salida solicitado por el cliente

Este punto se debe hacer directamente en Excel. Usando la información de las encuestas, debes crear un cuadro con las estimaciones solicitadas. Los datos que necesitarás para estimar estos valores estarán disponibles en el paso 5, cuando subas los datos a R.

head(muestra)
# A tibble: 6 × 4
  Hogar Dirección         Telefono aleatorio
  <dbl> <chr>                <dbl>     <dbl>
1    11 CRA 6 N 10 - 85    8372199    0.0397
2    10 CRA 6 N 6 - 02     8372696    0.126 
3    21 CR 46 49-12        2483960    0.134 
4    34 CRA 46B 49B-21  3002103665    0.149 
5    12 CR 6 9-13          8370727    0.191 
6    27 CL 57 N 46-42      2983461    0.243 

3. Asignar arbitrariamente los códigos de hogares seleccionados

Este paso consiste en asignar los códigos de hogares seleccionados en la muestra al archivo de encuestas. Esto se hará en el siguiente bloque de código cuando leas los archivos y los cruces.

# Cargar los datos desde Excel
glimpse(muestra)
Rows: 10
Columns: 4
$ Hogar     <dbl> 11, 10, 21, 34, 12, 27, 26, 3, 16, 7
$ Dirección <chr> "CRA 6 N 10 - 85", "CRA 6 N 6 - 02", "CR 46 49-12", "CRA 46B…
$ Telefono  <dbl> 8372199, 8372696, 2483960, 3002103665, 8370727, 2983461, 298…
$ aleatorio <dbl> 0.0396923, 0.1258008, 0.1335689, 0.1493850, 0.1911764, 0.242…
glimpse(encuestas)
Rows: 10
Columns: 8
$ Hogar <dbl> 13, 3, 10, 33, 24, 26, 27, 1, 35, 16
$ P1    <dbl> 2, 1, 3, 1, 3, 2, 2, 3, 3, 3
$ P2    <dbl> 224, 112, 227, 166, 134, 109, 154, 190, 33, 244
$ P3    <dbl> 68, 42, 154, 143, 149, 224, 126, 161, 4, 81
$ P4    <dbl> 187, 126, 78, 205, 162, 138, 50, 158, 10, 153
$ P5    <dbl> 36, 78, 155, 67, 231, 31, 115, 172, 232, 126
$ P6    <dbl> 64, 207, 169, 18, 44, 73, 43, 83, 97, 175
$ P7    <dbl> 36, 63, 57, 181, 72, 65, 242, 32, 23, 61

4. Subir los datos a R

Ya estan subidos.

# Ver una vista rápida de la estructura de los datos
glimpse(marco)
Rows: 35
Columns: 3
$ Hogar     <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…
$ Dirección <chr> "CRA 9 N 7 - 64", "CLL 8 CON CRA 7", "CL 8 N 12-36", "CRA 15…
$ Telefono  <dbl> 2463046, 2460639, 2462149, 2462141, 2462121, 8373548, 827344…
glimpse(muestra)
Rows: 10
Columns: 4
$ Hogar     <dbl> 11, 10, 21, 34, 12, 27, 26, 3, 16, 7
$ Dirección <chr> "CRA 6 N 10 - 85", "CRA 6 N 6 - 02", "CR 46 49-12", "CRA 46B…
$ Telefono  <dbl> 8372199, 8372696, 2483960, 3002103665, 8370727, 2983461, 298…
$ aleatorio <dbl> 0.0396923, 0.1258008, 0.1335689, 0.1493850, 0.1911764, 0.242…
glimpse(encuestas)
Rows: 10
Columns: 8
$ Hogar <dbl> 13, 3, 10, 33, 24, 26, 27, 1, 35, 16
$ P1    <dbl> 2, 1, 3, 1, 3, 2, 2, 3, 3, 3
$ P2    <dbl> 224, 112, 227, 166, 134, 109, 154, 190, 33, 244
$ P3    <dbl> 68, 42, 154, 143, 149, 224, 126, 161, 4, 81
$ P4    <dbl> 187, 126, 78, 205, 162, 138, 50, 158, 10, 153
$ P5    <dbl> 36, 78, 155, 67, 231, 31, 115, 172, 232, 126
$ P6    <dbl> 64, 207, 169, 18, 44, 73, 43, 83, 97, 175
$ P7    <dbl> 36, 63, 57, 181, 72, 65, 242, 32, 23, 61

5. Cruce de los datos con la muestra y la base con la información levantada

Ahora realizamos un cruce de los datos de las encuestas con la muestra seleccionada y calculamos los pesos muestrales.

# Cruce de encuestas con la muestra
anti_join(muestra, encuestas, by = "Hogar") # Hogares en la muestra que no están en las encuestas
# A tibble: 5 × 4
  Hogar Dirección         Telefono aleatorio
  <dbl> <chr>                <dbl>     <dbl>
1    11 CRA 6 N 10 - 85    8372199    0.0397
2    21 CR 46 49-12        2483960    0.134 
3    34 CRA 46B 49B-21  3002103665    0.149 
4    12 CR 6 9-13          8370727    0.191 
5     7 CLL 9  11 6 0      8273445    0.285 
anti_join(encuestas, muestra, by = "Hogar") # Hogares en las encuestas que no están en la muestra
# A tibble: 5 × 8
  Hogar    P1    P2    P3    P4    P5    P6    P7
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1    13     2   224    68   187    36    64    36
2    33     1   166   143   205    67    18   181
3    24     3   134   149   162   231    44    72
4     1     3   190   161   158   172    83    32
5    35     3    33     4    10   232    97    23
# Definir el tamaño total de la población (N) y el tamaño de la muestra (n)
N <- nrow(marco)
n <- nrow(muestra)

# Crear un vector con las columnas de las variables de gasto
variables <- paste0("P", 2:7)

# Cruce de los datos de encuestas con la muestra
encu <- encuestas |> 
        left_join(muestra, by = "Hogar") |> # Cruza encuestas con muestra por la columna Hogar
        rowwise() |> 
        mutate(gasto_tot = sum(c(P2, P3, P4, P5, P6, P7))) |> # Suma de los gastos
        mutate(FEXP = N/n) |>  # Calcula el factor de expansión
        mutate(NI = N) |>  # Añade el tamaño total de la población
        mutate(P1 = factor(P1, levels = 1:3, labels = c("< 2SMMLV", "De 2 a 4 SMMLV", ">4 SMMLV"))) # Etiqueta los niveles de ingreso

# Ver la clase de la variable 'encu'
#class(encu)
#glimpse(encu)
library(knitr)
# Asegúrate de que 'encu' es un data frame
df_encu <- as.data.frame(encu)
tb_encu <- as.tibble(encu)
# Crear la tabla con kable
kable(df_encu)
Hogar P1 P2 P3 P4 P5 P6 P7 Dirección Telefono aleatorio gasto_tot FEXP NI
13 De 2 a 4 SMMLV 224 68 187 36 64 36 NA NA NA 615 3.5 35
3 < 2SMMLV 112 42 126 78 207 63 CL 8 N 12-36 2462149 0.2786355 628 3.5 35
10 >4 SMMLV 227 154 78 155 169 57 CRA 6 N 6 - 02 8372696 0.1258008 840 3.5 35
33 < 2SMMLV 166 143 205 67 18 181 NA NA NA 780 3.5 35
24 >4 SMMLV 134 149 162 231 44 72 NA NA NA 792 3.5 35
26 De 2 a 4 SMMLV 109 224 138 31 73 65 CR 30 57-22 2983228 0.2689066 640 3.5 35
27 De 2 a 4 SMMLV 154 126 50 115 43 242 CL 57 N 46-42 2983461 0.2425466 730 3.5 35
1 >4 SMMLV 190 161 158 172 83 32 NA NA NA 796 3.5 35
35 >4 SMMLV 33 4 10 232 97 23 NA NA NA 399 3.5 35
16 >4 SMMLV 244 81 153 126 175 61 CLL 10 N 5 - 62 2462121 0.2817241 840 3.5 35

6. Estimar en R el cuadro de salida solicitado por el cliente

Finalmente, se estima el cuadro de salida, utilizando el diseño muestral. El diseño de encuesta permite calcular estimaciones considerando la estructura muestral, como los pesos y el factor de expansión.

library(survey)
library(knitr)
# Definir el objeto de diseño muestral
dsg <- encu |> 
       as_survey_design(ids = 1, # Sin conglomerados, ya que 'ids' es 1
                        fpc = NI, # Utiliza la columna 'NI' como factor de población
                        weights = FEXP, # Utiliza la columna 'FEXP' como pesos muestrales
                        nest = T) # Definir si el diseño es anidado

# Estimar los totales de los gastos por cada categoría (según 'P1' que representa niveles de ingreso)
total <- dsg |> 
          group_by(P1) |> 
          summarise(vivienda = survey_total(P2, na.rm = T, vartype = "cv"),
                    alimentacion = survey_total(P3, na.rm = T, vartype = "cv"),
                    educacion = survey_total(P4, na.rm = T, vartype = "cv"),
                    transporte = survey_total(P5, na.rm = T, vartype = "cv"),
                    esparcimiento = survey_total(P6, na.rm = T, vartype = "cv"),
                    otros = survey_total(P7, na.rm = T, vartype = "cv"),
                    total_gasto = survey_total(gasto_tot, na.rm = T, vartype = "cv")
                    )

# Estimar los totales para todos los hogares (sin agrupar por 'P1')
t1 <- dsg |> 
      summarise(vivienda = survey_total(P2, na.rm = T, vartype = "cv"),
                alimentacion = survey_total(P3, na.rm = T, vartype = "cv"),
                educacion = survey_total(P4, na.rm = T, vartype = "cv"),
                transporte = survey_total(P5, na.rm = T, vartype = "cv"),
                esparcimiento = survey_total(P6, na.rm = T, vartype = "cv"),
                otros = survey_total(P7, na.rm = T, vartype = "cv"),
                total_gasto = survey_total(gasto_tot, na.rm = T, vartype = "cv")
      ) |> 
      mutate(P1 = "Total")

# Combinar los resultados en un solo dataframe y reorganizar las columnas
salida <- bind_rows(total, t1) |> 
          pivot_longer(cols = - P1, names_to = "gasto", values_to = "estimacion") |> 
          pivot_wider(names_from = P1, values_from = estimacion)

# Puedes guardar los resultados en un archivo Excel si lo deseas
write_xlsx(salida, "C:/Users/john/Desktop/Practica DS/Universidad del Bosque/Projects/EjerMuest/output/cuadro_estimacion.xlsx")
kable(total)
P1 vivienda vivienda_cv alimentacion alimentacion_cv educacion educacion_cv transporte transporte_cv esparcimiento esparcimiento_cv otros otros_cv total_gasto total_gasto_cv
< 2SMMLV 973.0 0.5765700 647.5 0.6601037 1158.5 0.5831509 507.5 0.5654592 787.5 0.7729556 854.0 0.6405216 4928.0 0.5675253
De 2 a 4 SMMLV 1704.5 0.4556989 1463.0 0.4915967 1312.5 0.4894686 637.0 0.5399847 630.0 0.4436170 1200.5 0.5940936 6947.5 0.4320404
>4 SMMLV 2898.0 0.3362204 1921.5 0.3565357 1963.5 0.3526977 3206.0 0.2962170 1988.0 0.3332973 857.5 0.3191691 12834.5 0.2962100