Análisis de encuesta pre-piloto

Documento de trabajo JUSMER

Autor/a

Tomás Urzúa - Asistente de investigación

Fecha de publicación

14 de octubre de 2026

1 Introducción

Este documento presenta los análisis del pre-piloto de la Encuesta JUSMER Justicia y Merecimiento, la cual se enmarca en el FONDECYT Regular N°1250518 “Justicia de mercado y Merecimiento del bienestar social” (jus-mer.com). El objetivo de este insumo es orientar la toma de decisiones para la construcción de la versión final de la encuesta.

Para ello, el documento se estructura a partir de los siguientes ejes: Primero se presentan los antecedentes principales del pre-piloto. Luego, se exponen los resultados del análisis de los comentarios abiertos, para posteriormente presentar los resultados del análisis de los tiempos de respuesta de la encuesta, detallando por pregunta y por módulo. Seguido de esto, se presentan propuestas para la versión final de la encuesta en base a los resultados del análisis. Por último, se presentan las conclusiones y recomendaciones finales.

1.1 Antecedentes

El pre-piloto de la Encuesta JUSMER se realizó en dos etapas:

  1. Primero se aplicó un pre-piloto con todas las preguntas que se decidieron incluir en la encuesta, además de integrar espacios de comentarios para recibir retroalimentación de los respondentes. Esta versión estuvo activa desde el 03 de julio hasta el 12 de julio del 2026 (solamente una respuesta válida se escapa de este plazo, la cual fue registrada el 20 de julio).

  2. Posteriormente, se aplicó un segundo pre-piloto con las mismas preguntas la primera versión, pero la diferencia fue que se eliminaron las cajas de comentarios, ya que esta versión buscaba recabar información sobre los tiempos de respuesta de cada pregunta y batería temática. El segundo pre-piloto estuvo activo desde 15 de julio hasta el 20 de ese mismo mes.

Debido a la extensión del pre-piloto, se decidió generar 3 módulos de aproximadamente 25 preguntas cada uno, con el objetivo de asegurar que los respondentes pudieran completar la encuesta en los tiempos estimados.

Ambas versiones del pre-piloto fueron construidas con surveydown, una plataforma de código abierto para la generación de encuestas, la cual se basa mayoritariamente en las lógicas de Quarto y Shinyapp. Para el despliegue de la encuesta recurrimos a dos plataformas: El primer pre-piloto se alojó en HuggingFace, mientras que el segundo se alojó en Posit Cloud. Esto se debió al intento de explorar plataformas que fueran más eficientes para el despliegue de la encuesta, ya que shinyapp.io presentaba problemas de lentitud y límites de almacenamiento por parte del servidor. Por último, para el almacenamiento de datos se utilizó Supabase, una plataforma gratuita que permite conectar las encuestas con bases de datos alojadas en la nube, las cuales se actualizan automáticamente.

En la siguiente Tabla 1 se pueden observar los principales módulos del cuestionario, los cuales se desagregan en la cantidad de tareas/items acompañado de una breve descripción de lo que buscan medir. Cabe mencionar que los primeros módulos se componen de items actitudinales medidos en escalas likert, mientras que desde el módulo de conjoint hasta el último módulo de la tabla se responden mediante un slider interactivo. Para mayores detalles sobre la composición de los módulos, su origen y medición atienda el manual metodológico de la encuesta.

Código
tbl_general <- read.csv(
  here::here("input", "tbl", "tbl-general.csv"),
  stringsAsFactors = FALSE,
  check.names = FALSE,
  encoding = "UTF-8"
)

knitr::kable(tbl_general, align = "lcll")
Tabla 1: Módulos del cuestionario JUSMER
Módulos Tareas / Items Descripción / Objetivo Ola
Market Justice Prefences 3 Determinar en qué medida la gente considera justo que el acceso a los servicios sociales y la calidad de los mismos dependan de criterios de mercado 1
Market Justice Reflexive 5 Recoger las percepciones de los encuestados sobre la justicia de mercado desde dos perspectivas: (1) su acceso personal a los servicios sociales y (2) el acceso de sus hijos a los servicios sociales 1
Market Justice en el tiempo 6 Capturar las percepciones de los encuestados sobre la equidad del mercado en lo que respecta al acceso a los servicios sociales, desde una perspectiva temporal comparativa 1
Comodificación de servicios 5 Evaluar hasta qué punto es aceptable que los servicios sociales funcionen (o no) según una lógica de mercantilización 1
Lucro en servicios 3 Pretende evaluar las preferencias de inversión en relación con las políticas públicas 1
NICERA 20 Evaluar los criterios normativos que aplican los ciudadanos para determinar quién tiene derecho a la protección social 1
Meritocracia 8 Medir las percepciones y preferencias de mérito y privilegio de los respondentes 1
Adicionales 4 Recoger las opiniones de las personas sobre sus preocupaciones financieras personales 1
Demográficos 8 Recopilar información demográfica, socioeconómica y de caracterización general sobre los encuestados 1
Conjoint 5 Analizar cómo los criterios de merecimiento influyen en las decisiones relativas a la asignación de ayudas para el acceso a la educación superior 1
Neoliberalismo 4 Saber en qué medida las personas están de acuerdo con que los gobiernos adopten medidas neoliberales 2
Escenarios de subvención 3 Estudiar en qué medida los encuestados están dispuestos a subvencionar a terceras personas en el acceso a servicios sociales 2
Ranking de políticas 5 Evaluar cómo priorizan los encuestados el gasto en políticas públicas a partir de una clasificación 2
Participación Estado/Mercado 15 Medir las percepciones y preferencias respecto a la administración de los servicios sociales por parte del Estado o Empresas privadas (mercado) 2

2 Análisis

Cargamos los paquetes necesarios para el análisis y fijamos la ubicación del documento para facilitar la llamada de archivos externos

Código
pacman::p_load(dplyr, DT, here)

here::i_am("pre-pilot-analysis/ppilot-analysis.qmd")
Código
resumen <- read.csv(
  here::here("pre-pilot-analysis", "tbl/comentarios-prepiloto-resumen.csv"),
  stringsAsFactors = FALSE,
  check.names = FALSE
)

2.1 Procesamiento de datos

Se unificaron los datos de ambas tablas de Supabase con información actualizada el 23/07, las cuales almacenaron información de las dos versiones de pilotaje implementadas; existen 20 casos válidos para el análisis.

Nota

Cálculos relevantes para los tiempos de respuesta:

  • Tiempo total de la encuesta: time_end - time_start para cada caso (marca de tiempo de término de la encuesta - marca de tiempo del inicio de la encuesta).
  • Duración por pregunta: Se calcula mediante el tiempo en que fue respondida la pregunta menos el checkpoint anterior a ese mismo caso

Primero se cargan las bases de datos extraídas de Supabase y se unifican en una sola base de datos los casos válidos para su posterior análisis.

Código
pacman::p_load(dplyr, DT)


comentarios_csv <- here::here("input", "tbl/comentarios-prepiloto.csv")
tiempos_csv     <- here::here("input", "tbl/tiempos-prepiloto.csv")

union_csv       <- here::here("pre-pilot-analysis", "tbl/tiempos-prepiloto-union.csv")

ids_muestra <- c(1394, 1924, 501, 1785, 1722, 1968, 374, 1878) # casos validos del primer prepiloto

comentarios <- read.csv(comentarios_csv, stringsAsFactors = FALSE, check.names = FALSE,
                         colClasses = "character", na.strings = "", encoding = "UTF-8")
comentarios <- comentarios[comentarios$respID %in% ids_muestra, ]

tiempos <- read.csv(tiempos_csv, stringsAsFactors = FALSE, check.names = FALSE,
                     colClasses = "character", na.strings = "", encoding = "UTF-8")

# comentarios-prepiloto.csv (primer pre-piloto) trae columnas adicionales (bloque de comentarios) que no existen en tiempos-prepiloto.csv (segundo pre-piloto); se conservan solo las columnas en comun para poder unir ambas bases.

comentarios <- comentarios[, names(tiempos)]

df_union <- rbind(tiempos, comentarios)

dir.create(dirname(union_csv), showWarnings = FALSE, recursive = TRUE)
write.csv(df_union, union_csv, row.names = FALSE, na = "")

Se filtran los casos válidos mediante la confirmación del consentimiento como medida de robustez y luego se calculan los parámetros de tiempo mediante el parseo de las marcas temporales

Código
df <- df_union

df <- df[!is.na(df$consent_understand) & df$consent_understand == "yes", ]

parse_ts <- function(x) {
  as.POSIXct(sub(" UTC$", "", x), format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
}

df$time_start <- parse_ts(df$time_start)
df$time_end   <- parse_ts(df$time_end)

verifica_1 <- df %>%
  filter(respID == 817) # crear objeto para comprobar el for

qcols <- grep("^time_q_", names(df), value = TRUE)
for (col in qcols) df[[col]] <- parse_ts(df[[col]]) # este for convierte todas las columnas de "tiempo por pregunta" de texto a formato de fecha/hora utilizable (character a POSIXct)

# time_p_cbc_qN_page marca el momento en que el respondente LLEGA a la página de la tarea N (no cuando la deja), por lo que el término de la tarea N es la llegada a la página siguiente (tarea N+1). Tras la tarea 6 la página siguiente depende del módulo: A -> "clasicos", B -> "decomodifica"; el módulo C no registra marca de página tras la tarea 6 (sus preguntas siguen en la misma página), por lo que se usa la marca original de respuesta de cbc_q6 (`time_q_cbc_q6`), que corresponde al último movimiento del slider.
cbc_fin <- c(paste0("time_p_cbc_q", 2:6, "_page"), "time_p_clasicos")
fin_q6 <- function(d) {
  f <- function(col) parse_ts(d[[col]])
  fin <- f("time_p_clasicos")
  fin[is.na(fin)] <- f("time_p_decomodifica")[is.na(fin)]
  fin[is.na(fin)] <- d$time_q_cbc_q6[is.na(fin)] # debe llamarse antes de reemplazar time_q_cbc_q6
  fin
}
for (i in 1:5) {
  df[[paste0("time_q_cbc_q", i)]] <- parse_ts(df[[cbc_fin[i]]])
}
df$time_q_cbc_q6 <- fin_q6(df) # considera la marca temporal de llegada a la página siguiente como tiempo de término de cada tarea del conjoint
Importante

Para las preguntas del conjoint (cbc_q1 a cbc_q6), time_q_ (tiempo en que responde una pregunta) tiene vacíos reales no atribuibles a preguntas no respondidas (la respuesta y time_p_..._page, que marca el tiempo de llegada a una página, sí están presentes), por lo que se reemplaza por una marca de cambio de página. time_p_cbc_qN_page registra cuándo el respondente llega a la página de la tarea N, no cuándo la deja; por lo tanto, el término de la tarea N se mide con la llegada a la página siguiente (time_p_cbc_q(N+1)_page; para la tarea 6, la página que sigue según el módulo: time_p_clasicos o time_p_decomodifica; en el módulo C, que no tiene marca de página siguiente, se usa la marca original de respuesta de cbc_q6). Esta es la medida confiable para estas preguntas (cada tarea del conjoint se aloja en una página por separado). Los items se registran sin problemas.

Comprobamos que el bucle que vuelve manipulable la hora (for) funcione correctamente

Código
class(verifica_1$time_q_mj_1)
[1] "character"
Código
qcols <- grep("^time_q_", names(verifica_1), value = TRUE)
for (col in qcols) verifica_1[[col]] <- parse_ts(verifica_1[[col]])

for (i in 1:5) {
  verifica_1[[paste0("time_q_cbc_q", i)]] <- parse_ts(verifica_1[[cbc_fin[i]]])
}
verifica_1$time_q_cbc_q6 <- fin_q6(verifica_1) # replica en verifica_1 el mismo ajuste aplicado a df para las preguntas del conjoint

class(verifica_1$time_q_mj_1)
[1] "POSIXct" "POSIXt" 

El cambio se aplica exitosamente

Estimamos el tiempo total de la encuesta por cada respondente

Código
tiempo_caso <- data.frame(
  session_id       = df$session_id,
  respID           = df$respID,
  assigned_module  = df$assigned_module,
  time_start       = df$time_start,
  time_end         = df$time_end,
  tiempo_total_seg = as.numeric(difftime(df$time_end, df$time_start, units = "secs")),
  stringsAsFactors = FALSE
)
tiempo_caso$tiempo_total_min <- round(tiempo_caso$tiempo_total_seg / 60, 2)
Código
# Objetos que almacenan las preguntas de cada batería temática, para luego poder generar tablas de resumen por batería.

demo_1 <- c("respondent", "sexo", "year_of_birth", "education")

conjoint <- c("cbc_practice", "manip_check", "cbc_q1", "cbc_q2", "cbc_q3", "cbc_q4", "cbc_q5", "cbc_q6")

mjp <- c("mj_1", "mj_2", "mj_3")

mjp_new <- c("ref_1", "ref_2", "ref_3", "proy_1", "proy_2")

mjp_time <- c("pres_1", "pres_2", "pres_3", "pres_4", "pres_5", "pres_6")

comodifica <- c("valor_1", "valor_2", "valor_3", "valor_4", "valor_5")

exp_comodifica <- c("dec_1", "dec_2", "dec_3")

lucro <- c("lucro_1", "lucro_2", "lucro_3")

neoliberal <- c("neolib_1", "neolib_2", "neolib_3", "neolib_4")

nicera <- c("control_1", "control_2", "control_3", "actitud_1", "actitud_2", "reciproc_1", "reciproc_2", "reciproc_3", "actitud_4", "id_1", "id_2", "id_3", "nec_1", "nec_2", "nec_3", "esf_1", "esf_2", "esf_3", "esf_4", "esf_5")

aditional <- c("adc_qstn", "adc_5", "adc_6", "adc_7")

demo_2 <- c("gender", "income", "salud_prov", "educ_prov")

Se calcula el tiempo de respuesta de cada pregunta

Código
duracion_mat <- matrix(NA_real_, nrow = nrow(df), ncol = length(qcols),
                        dimnames = list(NULL, qcols))
for (i in seq_len(nrow(df))) {
  last_time <- df$time_start[i]
  for (col in qcols) {
    cur <- df[[col]][i]
    if (!is.na(cur)) {
      duracion_mat[i, col] <- as.numeric(difftime(cur, last_time, units = "secs")) # se calcula la diferencia entre un checkpoint (marca temporal de la pregunta) y el checkpoint anterior
      last_time <- cur
    }
  }
} # este for calcula cuánto tiempo tardó cada respondente en cada pregunta

# Tarea 1 del conjoint: el checkpoint anterior en el bucle es la respuesta de manip_check, que ocurre unos segundos antes de llegar a la página de la tarea 1. Se usa la llegada a su propia página como inicio para medir solo el tiempo en la tarea.
inicio_q1 <- df$time_p_cbc_q1_page
inicio_q1 <- parse_ts(inicio_q1)
ok_q1 <- !is.na(df$time_q_cbc_q1) & !is.na(inicio_q1)
duracion_mat[ok_q1, "time_q_cbc_q1"] <- as.numeric(difftime(df$time_q_cbc_q1[ok_q1], inicio_q1[ok_q1], units = "secs"))

detalle_list <- lapply(qcols, function(col) {
  data.frame(
    session_id      = df$session_id,
    respID          = df$respID,
    assigned_module = df$assigned_module,
    pregunta        = sub("^time_q_", "", col),
    tiempo_seg       = as.numeric(difftime(df[[col]], df$time_start, units = "secs")),
    duracion_seg     = duracion_mat[, col],
    stringsAsFactors = FALSE
  )
})
tiempo_pregunta_detalle <- do.call(rbind, detalle_list)
tiempo_pregunta_detalle <- tiempo_pregunta_detalle[!is.na(tiempo_pregunta_detalle$tiempo_seg), ]

# Desviacion estandar, por caso, de la duracion (duracion_seg) entre todas
# las preguntas que respondio: mide que tan variable fue su ritmo de
# respuesta pregunta a pregunta.
sd_duracion_caso <- stats::aggregate(
  duracion_seg ~ session_id,
  data = tiempo_pregunta_detalle,
  FUN = function(x) sd(x, na.rm = TRUE)
)
names(sd_duracion_caso)[2] <- "sd_duracion_pregunta_seg"
tiempo_caso <- merge(tiempo_caso, sd_duracion_caso, by = "session_id", all.x = TRUE)
tiempo_caso$sd_duracion_pregunta_seg <- round(tiempo_caso$sd_duracion_pregunta_seg, 2)

Verificamos la aplicación correcta del bucle recalculando manualmente las duraciones para un solo caso (verifica_1 contiene sólo el caso 817) y comparando el resultado contra la fila generada por el bucle

Código
verifica_1[qcols] <- lapply(verifica_1[qcols], parse_ts)

last_time <- verifica_1$time_start
verif_tbl <- data.frame(
  pregunta            = character(),
  checkpoint_anterior = as.POSIXct(character()),
  tiempo_pregunta     = as.POSIXct(character()),
  duracion_seg        = numeric(),
  stringsAsFactors    = FALSE
)

for (col in qcols) {
  cur <- verifica_1[[col]][1]
  if (!is.na(cur)) {
    verif_tbl <- rbind(verif_tbl, data.frame(
      pregunta            = sub("^time_q_", "", col),
      checkpoint_anterior = last_time,
      tiempo_pregunta     = cur,
      duracion_seg        = as.numeric(difftime(cur, last_time, units = "secs"))
    ))
    last_time <- cur
  }
} # se aplica el for a la base verifica_1

i_verifica <- which(df$respID == verifica_1$respID[1])
verif_tbl$duracion_mat_original <- unname(duracion_mat[i_verifica, paste0("time_q_", verif_tbl$pregunta)])

verif_tbl
pregunta checkpoint_anterior tiempo_pregunta duracion_seg duracion_mat_original
consent_understand 2026-07-20 14:19:14 2026-07-20 14:19:37 23 23
respondent 2026-07-20 14:19:37 2026-07-20 14:19:44 7 7
sexo 2026-07-20 14:19:44 2026-07-20 14:19:48 4 4
year_of_birth 2026-07-20 14:19:48 2026-07-20 14:19:53 5 5
education 2026-07-20 14:19:53 2026-07-20 14:19:58 5 5
cbc_practice 2026-07-20 14:19:58 2026-07-20 14:20:55 57 57
manip_check 2026-07-20 14:20:55 2026-07-20 14:21:17 22 22
cbc_q1 2026-07-20 14:21:17 2026-07-20 14:22:40 83 82
cbc_q2 2026-07-20 14:22:40 2026-07-20 14:22:56 16 16
cbc_q3 2026-07-20 14:22:56 2026-07-20 14:23:21 25 25
cbc_q4 2026-07-20 14:23:21 2026-07-20 14:37:18 837 837
cbc_q5 2026-07-20 14:37:18 2026-07-20 14:38:05 47 47
cbc_q6 2026-07-20 14:38:05 2026-07-20 14:38:31 26 26
mj_1 2026-07-20 14:38:31 2026-07-20 14:38:49 18 18
mj_2 2026-07-20 14:38:49 2026-07-20 14:39:01 12 12
mj_3 2026-07-20 14:39:01 2026-07-20 14:39:08 7 7
ref_1 2026-07-20 14:39:08 2026-07-20 14:39:29 21 21
ref_2 2026-07-20 14:39:29 2026-07-20 14:39:33 4 4
ref_3 2026-07-20 14:39:33 2026-07-20 14:39:40 7 7
proy_1 2026-07-20 14:39:40 2026-07-20 14:40:00 20 20
proy_2 2026-07-20 14:40:00 2026-07-20 14:40:05 5 5
ranking_politicas_educacion 2026-07-20 14:40:05 2026-07-20 14:41:37 92 92
ranking_politicas_salud 2026-07-20 14:41:37 2026-07-20 14:41:48 11 11
ranking_politicas_pensiones 2026-07-20 14:41:48 2026-07-20 14:41:50 2 2
ranking_politicas_cuidado_ninos 2026-07-20 14:41:50 2026-07-20 14:41:43 -7 -7
rank_1 2026-07-20 14:41:43 2026-07-20 14:42:18 35 35
rank_2 2026-07-20 14:42:18 2026-07-20 14:42:23 5 5
rank_3 2026-07-20 14:42:23 2026-07-20 14:42:31 8 8
rank_4 2026-07-20 14:42:31 2026-07-20 14:42:34 3 3
rank_5 2026-07-20 14:42:34 2026-07-20 14:42:38 4 4
pres_1 2026-07-20 14:42:38 2026-07-20 14:42:53 15 15
pres_2 2026-07-20 14:42:53 2026-07-20 14:42:55 2 2
pres_3 2026-07-20 14:42:55 2026-07-20 14:42:59 4 4
pres_4 2026-07-20 14:42:59 2026-07-20 14:43:11 12 12
pres_5 2026-07-20 14:43:11 2026-07-20 14:43:18 7 7
pres_6 2026-07-20 14:43:18 2026-07-20 14:43:27 9 9
valor_1 2026-07-20 14:43:27 2026-07-20 14:43:42 15 15
valor_2 2026-07-20 14:43:42 2026-07-20 14:43:57 15 15
valor_3 2026-07-20 14:43:57 2026-07-20 14:44:10 13 13
valor_4 2026-07-20 14:44:10 2026-07-20 14:44:21 11 11
valor_5 2026-07-20 14:44:21 2026-07-20 14:44:47 26 26
gender 2026-07-20 14:44:47 2026-07-20 14:44:58 11 11
income 2026-07-20 14:44:58 2026-07-20 14:45:07 9 9
salud_prov 2026-07-20 14:45:07 2026-07-20 14:45:19 12 12
educ_prov 2026-07-20 14:45:19 2026-07-20 14:45:22 3 3

A partir de la tabla, podemos observar que el bucle logra contabilizar exitosamente los segundos entre una pregunta y su sucesora.

Se construye un resumen de descriptivos por pregunta (n, media, mediana, sd, min, max)

Código
resumen_list <- lapply(qcols, function(col) {
  pregunta <- sub("^time_q_", "", col)
  modulos_presentes <- sort(unique(df$assigned_module[!is.na(df[[col]])]))
  modulo_txt <- if (length(modulos_presentes) == 0) {
    NA_character_
  } else if (length(modulos_presentes) == length(unique(na.omit(df$assigned_module)))) {
    "Todos"
  } else {
    paste(modulos_presentes, collapse = "/")
  }

  x <- tiempo_pregunta_detalle$tiempo_seg[tiempo_pregunta_detalle$pregunta == pregunta]
  d <- tiempo_pregunta_detalle$duracion_seg[tiempo_pregunta_detalle$pregunta == pregunta]
  data.frame(
    pregunta = pregunta,
    modulo   = modulo_txt,
    n        = length(x),
    media_seg   = round(mean(x), 2),
    mediana_seg = round(median(x), 2),
    sd_seg      = round(sd(x), 2),
    min_seg     = round(min(x, Inf), 2),
    max_seg     = round(max(x, -Inf), 2),
    duracion_media_seg   = round(mean(d), 2),
    duracion_mediana_seg = round(median(d), 2),
    stringsAsFactors = FALSE
  )
})
tiempo_pregunta_resumen <- do.call(rbind, resumen_list)
tiempo_pregunta_resumen <- tiempo_pregunta_resumen[tiempo_pregunta_resumen$n > 0, ]

Se calcula una estimación del tiempo total de la encuesta si un mismo respondente tuviera que responder la seccion común + los tres módulos (A + B + C), en vez de solo el que le tocó por aleatorización.

Para cada caso se suman las duraciones (duracion_seg) de sus preguntas comúnes y, por separado, las de sus módulos asignados; luego se calcula la mediana de cada módulo por separado y se suman las 4 medianas.

Código
tiempo_pregunta_detalle <- merge(
  tiempo_pregunta_detalle,
  tiempo_pregunta_resumen[, c("pregunta", "modulo")],
  by = "pregunta", all.x = TRUE
)

# El caso 374 se excluye en la Tabla Tiempo de respuesta por respondente (tabla 2) para no alterar los tiempos promedio de respuesta; sigue presente en el resto del reporte.
detalle_estimado <- tiempo_pregunta_detalle[tiempo_pregunta_detalle$respID != "374", ]

suma_por_caso <- function(seccion) {
  sub <- detalle_estimado[detalle_estimado$modulo == seccion, ]
  stats::aggregate(duracion_seg ~ session_id, data = sub, FUN = sum, na.rm = TRUE)
}

comun_caso   <- suma_por_caso("Todos")
moduloA_caso <- suma_por_caso("A")
moduloB_caso <- suma_por_caso("B")
moduloC_caso <- suma_por_caso("C")

tiempo_estimado_total <- data.frame(
  seccion = c("Común (todos)", "Modulo A", "Modulo B", "Modulo C"),
  n_casos = c(nrow(comun_caso), nrow(moduloA_caso), nrow(moduloB_caso), nrow(moduloC_caso)),
  mediana_seg = round(c(
    median(comun_caso$duracion_seg),
    median(moduloA_caso$duracion_seg),
    median(moduloB_caso$duracion_seg),
    median(moduloC_caso$duracion_seg)
  ), 2),
  stringsAsFactors = FALSE
)
tiempo_estimado_total$mediana_min <- round(tiempo_estimado_total$mediana_seg / 60, 2)

tiempo_estimado_total <- rbind(
  tiempo_estimado_total,
  data.frame(
    seccion = "Total estimado (común + A + B + C)",
    n_casos = NA_integer_,
    mediana_seg = round(sum(tiempo_estimado_total$mediana_seg), 2),
    mediana_min = round(sum(tiempo_estimado_total$mediana_seg) / 60, 2)
  )
)

Guardamos las salidas para luego llamar a cada tabla en la sección correspondiente.

Código
out_dir <- here::here("output/tiempos-prepiloto")
dir.create(out_dir, showWarnings = FALSE, recursive = TRUE)

write.csv(tiempo_caso, file.path(out_dir, "tiempos-caso.csv"), row.names = FALSE, na = "")
write.csv(tiempo_pregunta_detalle, file.path(out_dir, "tiempos-pregunta-detalle.csv"), row.names = FALSE, na = "")
write.csv(tiempo_pregunta_resumen, file.path(out_dir, "tiempos-pregunta-resumen.csv"), row.names = FALSE, na = "")
write.csv(tiempo_estimado_total, file.path(out_dir, "tiempos-estimado-total.csv"), row.names = FALSE, na = "")

Aquí se cargan las tablas para el análisis de la sección 3.3, las cuales fueron construidas manualmente para visualizar de mejor manera los tiempos de respuesta de las secciones de Ranking de políticas y Participación Estado/Mercado.

Código
tiempos_part <- read.csv(
  here::here("input", "tbl/tiempos-part.csv"),
  stringsAsFactors = FALSE, check.names = FALSE, na.strings = ""
)
names(tiempos_part)[1] <- "respID"

tiempo_ranking <- read.csv(
  here::here("input", "tbl/tiempo-ranking.csv"),
  stringsAsFactors = FALSE, check.names = FALSE, na.strings = ""
)
names(tiempo_ranking)[1] <- "respID"

2.2 Análisis comentarios

Tabla 2

La Tabla 2 presenta la recopilación de los comentarios realizados por los respondentes en la primera versión del pre-piloto. Estos comentarios se pueden entender en dos grupos: (1) comentarios relacionados a items y (2) comentarios sobre la tarea de asignación.

Respecto a los comentarios sobre items, se presentan dudas respecto a la comprensión de las preguntas y sugerencias para aclarar lo que buscan medir. Hay un comentario sobre cómo responder la pregunta de nivel educativo en caso de que el respondente fuera universitario, por lo que queda en una posición intermedia entre “educación media completa” y “educación universitaria incompleta”. En la misma línea, la pregunta de ingresos también generó confusión debido a que no le quedó claro a un encuestado si se preguntaba por el ingreso total del hogar o a nivel individual. Además, se realizó una sugerencia para consultar de manera más precisa el género de las personas, incluyendo categorías que aluden a disidencias sexogenéricas.

Los comentarios de la tarea de asignación apuntan principalmente al peso de los atributos que presenta el conjoint, donde se señaló que sólo un atributo llegaba a determinar la decisión de los respondentes, entendiéndose que las demás características eran prescindibles. En este marco, para un encuestado el atributo que orientó toda su decisión fue el género, mientras que para otro fue la necesidad, expresada en términos económicos. Además, se sugirió que para el atributo de necesidad se modificara el nivel de “holgura” ya que inducía a confusión. Si bien, estos comentarios sobre la tarea de asignación pueden ser fructíferos para replantear su modo de implementación (cantidad de atributos y niveles, expresión de los niveles, entre otros), el hecho de que un atributo tenga más peso que otros en la toma de decisiones es justamente lo que busca comprender el conjoint, por lo que son sugerencias que se deben considerar pero con la cautela suficiente.

Importante

Para el análisis de comentarios se omitieron todos aquellos que provienen del Equipo JUSMER, los cuales se realizaron para comprobar el despliegue exitoso de la encuesta en las plataformas correspondientes

2.3 Análisis de tiempo y descriptivos

2.3.1 Tiempo total por respondente

Código
tiempo_caso |>
  filter(respID != "749") |>
  select(
    respID, assigned_module, time_start, time_end, tiempo_total_min,
    sd_duracion_pregunta_seg
  ) |>
  arrange(desc(tiempo_total_min)) |>
  datatable(
    filter = "top",
    rownames = FALSE,
    options = list(pageLength = 15, scrollX = TRUE),
    colnames = c(
      "respID", "Módulo", "Inicio", "Fin", "Tiempo total (min)",
      "DE duración por pregunta (s)"
    )
  )
Tabla 3: Tiempo de respuesta por respondente

La Tabla 3 expone los tiempos de demora en finalizar la encuesta para cada respondente válido. Las últimas dos columnas son las más importantes: Tiempo total (min) muestra los minutos que utilizó el encuestado para completar la encuesta, y DE duración por pregunta (s) representa la dispersión en los segundos de respuesta de las personas por pregunta.

El caso respID 374 tiene un tiempo total de 16.062 minutos, muy por sobre el resto. Esto se debe a que abrió la encuesta en un inicio, marcando el time_start, pero la completó con más de una semana de dilación. Sin embargo, al observar sus respuestas, estas se mantienen en los tiempos normales, comprobando el tiempo en el que respondió la primera y última pregunta (se demoró aproximadamente 15 minutos).

A partir de los resultados presentados en la tabla se observa que solamente hay 3 casos de los 20 totales que lograron responder la encuesta en el tiempo establecido inicialmente (15 minutos como máximo). Al flexibilizar el umbral de respuesta podemos considerar al caso 374, junto con los 3 que se demoraron ~16 minutos. De esta manera, quienes estuvieron en un margen de tiempo de respuesta aceptable se eleva a 7 casos. Aun así, no se alcanza un 50% de éxito en los tiempos de respuesta, incluso considerando que se aplicó una aleatorización de módulos para que la encuesta no fuese demasiado extensa.

2.3.2 Análisis de baterías temáticas

En esta sección se analizan los items actitudinales aplicados en el pre-piloto de la encuesta, los cuales se agrupan en baterías temáticas. Primero se presenta una tabla de descriptivos generales, para luego detallar cada batería temática según los tiempos de respuesta y descriptivos de cada pregunta que las conforman, destacando con rojo una duración mediana > 30 segundos y una desviación estándar (DE) > 1.

Código
# Se excluyen las baterías que no son escalas actitudinales (demográficos, conjoint y escenarios de subvención), que están en otras métricas (años, pesos, categorías).
baterias_actitud <- setdiff(
  names(baterias),
  c("Demográficos inicio", "Demográficos (bloque 2)", "Conjoint", "Escenarios de subvención")
)

# Respuestas válidas de los items numéricos de una batería (se excluyen los códigos 98/99)
respuestas_bateria <- function(ids) {
  unlist(lapply(ids, function(v) {
    x <- df_desc[[v]]
    if (!es_numerica(x)) return(NULL)
    xn <- as.numeric(x)
    xn[!is.na(xn) & !xn %in% c(98, 99)]
  }))
}

# N de la batería: respondentes con al menos una respuesta válida en algún item numérico de la batería
n_respondentes_bateria <- function(ids) {
  ids_num <- ids[vapply(ids, function(v) es_numerica(df_desc[[v]]), logical(1))]
  valido <- sapply(ids_num, function(v) {
    xn <- suppressWarnings(as.numeric(df_desc[[v]]))
    !is.na(xn) & !xn %in% c(98, 99)
  })
  sum(rowSums(as.matrix(valido)) > 0)
}

fila_general <- function(nombre, ids) {
  r <- respuestas_bateria(ids)
  data.frame(
    bateria = nombre,
    n       = n_respondentes_bateria(ids),
    media   = round(mean(r), 2),
    mediana = round(median(r), 2),
    stringsAsFactors = FALSE
  )
}

tabla_general <- rbind(
  do.call(rbind, lapply(baterias_actitud, function(nm) fila_general(nm, baterias[[nm]]))),
  fila_general("Todas las baterías actitudinales", unlist(baterias[baterias_actitud], use.names = FALSE))
)

tabla_general |>
  datatable(
    rownames = FALSE,
    options = list(dom = "t", pageLength = nrow(tabla_general), scrollX = TRUE),
    colnames = c("Batería", "N", "Media", "Mediana")
  ) |>
  formatStyle(
    "bateria",
    target = "row",
    fontWeight = styleEqual("Todas las baterías actitudinales", "bold")
  )
Tabla 4: Descriptivos generales de los items actitudinales por batería

La Tabla 4 muestra los descriptivos generales de todas las baterías actitudinales, así como una síntesis de sus resultados en la última fila. El panorama general de la encuesta es que, considerando todas las baterías, los respondentes tienden a concentrarse en la categoría intermedia, lo cual se corrobora al observar un resultado casi idéntico entre la media y la mediana. Para una lectura más detallada de las respectivas baterías, a continuación se presentan los resultados de cada una acompañadas de sus tiempos estimados de respuesta.

Market Justice Preferences

Fraseo: ¿En qué medida está de acuerdo o en desacuerdo con las siguientes afirmaciones?

Código
tabla_completa_bateria("Market Justice Preferences")
Tabla 5: Tiempo de respuesta y descriptivos - Market Justice Preferences

Para la batería de Market Justice Preferences (ver Tabla 5), se observa que la pregunta 1 es la que más tiempo demanda en responder con una mediana de 44 segundos, lo que puede deberse a la suma del tiempo de lectura del encabezado, mientras que las preguntas 2 y 3 tienen una mediana de respuesta de 9 y 7 segundos respectivamente. Respecto a los resultados descriptivos, la pregunta asociada a pensiones es la que presenta mayor dispersión en sus respuestas con una desviación estándar de 1.36, mientras que la pregunta asociada a educación es que tiene sus respuestas más concentradas con una desviación estándar de 0.5.

Market Justice Reflexive

Fraseo: ¿En qué medida considera justo o injusto las siguientes afirmaciones?

Código
tabla_completa_bateria("Market Justice Reflexive")
Tabla 6: Tiempo de respuesta y descriptivos - Market Justice Reflexive

Para la batería de Market Justice Reflexive (ver Tabla 6), se observa que la pregunta ref_1, asociada a salud, es la que más tiempo demanda en responder con una mediana de 16 segundos, mientras que el resto de las preguntas tienen una mediana de entre 5 y 7 segundos. Respecto a los resultados descriptivos, la pregunta proy_2, asociada a la educación de los hijos/as, es la que presenta mayor dispersión en sus respuestas con una desviación estándar de 1.06 (la única sobre 1), mientras que la pregunta ref_1, asociada a salud, tiene sus respuestas más concentradas con una desviación estándar de 0.71. Las demás preguntas presentan una desviación estándar de 0.83.

Market Justice en el tiempo

Fraseo 16-18: ¿En qué medida está de acuerdo o en desacuerdo con las siguientes afirmaciones?

Fraseo 19-21: Y pensando hace 10 años atrás, ¿usted cree que el acceso a los siguientes servicios entre quienes tienes más y menores ingresos se ha vuelto…?

Código
tabla_completa_bateria("Market Justice en el tiempo")
Tabla 7: Tiempo de respuesta y descriptivos - Market Justice en el tiempo

Para la batería de Market Justice en el tiempo (ver Tabla 7), se observa que la pregunta pres_1 es la que más tiempo demanda en responder con una mediana de 20 segundos, seguida por pres_4 con 12 segundos; las demás preguntas tienen una mediana de entre 3 y 4 segundos. Respecto a los resultados descriptivos, las preguntas pres_5 (educación) y pres_6 (pensiones) presentan una desviación estándar de 1.25 y 1.07 respectivamente, superando el umbral de 1, siendo pres_5 la que presenta mayor dispersión, mientras que la pregunta pres_3, asociada a pensiones, tiene sus respuestas más concentradas con una desviación estándar de 0.38.

Comodificación de servicios

Fraseo: ¿En qué medida está de acuerdo o en desacuerdo con las siguientes afirmaciones?

Código
tabla_completa_bateria("Comodificación de servicios")
Tabla 8: Tiempo de respuesta y descriptivos - Comodificación de servicios

Para la batería de Comodificación de servicios (ver Tabla 8), se observa que la pregunta valor_3, asociada a la igualdad en la calidad del sistema de salud, es la que más tiempo demanda en responder con una mediana de 18 segundos, seguida por valor_1 con 15 segundos, mientras que las demás preguntas tienen una mediana de entre 4 y 11 segundos; ninguna supera el umbral de 30 segundos. Respecto a los resultados descriptivos, todas las preguntas presentan una desviación estándar mayor a 1: valor_1 (administración privada de hospitales) y valor_5 (pensiones más igualitarias) son las que presentan mayor dispersión con 1.41, mientras que valor_3 es la que tiene sus respuestas más concentradas con 1.07. Esto indica que la batería discrimina bien entre los respondentes.

Lucro en servicios sociales

Fraseo: Qué tan justo o injusto le parece que empresas privadas obtengan ganancias monetarias administrando…

Código
tabla_completa_bateria("Lucro en servicios")
Tabla 9: Tiempo de respuesta y descriptivos - Lucro en servicios

Para la batería de Lucro en servicios sociales (ver Tabla 9), se observa que la pregunta lucro_1, asociada a salud, es la que más tiempo demanda en responder con una mediana de 21 segundos, mientras que las preguntas de educación y pensiones tienen una mediana de 3 y 2 segundos respectivamente. Respecto a los resultados descriptivos, ninguna pregunta supera una desviación estándar de 1: lucro_1 y lucro_3 presentan 0.55, mientras que la pregunta asociada a educación (lucro_2) es la que tiene sus respuestas más concentradas con una desviación estándar de 0.45.

Neoliberalismo

Fraseo: ¿En qué medida está de acuerdo o en desacuerdo con las siguientes afirmaciones?

Código
tabla_completa_bateria("Neoliberalismo")
Tabla 10: Tiempo de respuesta y descriptivos - Neoliberalismo

Para la batería de Neoliberalismo (ver Tabla 10), se observa que la pregunta neolib_1 es la que más tiempo demanda en responder con una mediana de 38 segundos, superando el umbral de 30 segundos, mientras que las demás preguntas tienen una mediana de entre 5 y 6 segundos. Respecto a los resultados descriptivos, la pregunta neolib_2, asociada al endeudamiento del Gobierno, es la única que supera una desviación estándar de 1 (1.3), mientras que neolib_4, asociada a mayores impuestos para personas con ingresos más elevados, es la que tiene sus respuestas más concentradas con una desviación estándar de 0.45.

NICERA

Fraseo: ¿En qué medida está de acuerdo o en desacuerdo con las siguientes afirmaciones?

Código
tabla_completa_bateria("NICERA")
Tabla 11: Tiempo de respuesta y descriptivos - NICERA

Para la batería NICERA (ver Tabla 11), se observa que las preguntas control_1 y esf_2 son las que más tiempo demandan en responder, con una mediana de 39 y 31 segundos respectivamente, superando el umbral de 30 segundos; les siguen reciproc_2 y actitud_4 con 28 segundos. En cambio, las preguntas que menos demoran son id_2 (6 segundos) y esf_5 (8 segundos). En cuanto a los resultados descriptivos, 12 de las 20 preguntas presentan una desviación estándar mayor a 1, siendo actitud_2 la que presenta mayor dispersión con 1.75, seguida por id_1 y nec_3 con 1.73 y esf_4 con 1.71. Esto es un buen antecedente para aplicar la escala de merecimiento en la versión oficial de la encuesta. Ahora bien, las preguntas control_1 y control_3 son las que tienen sus respuestas más concentradas con una desviación estándar de 0.41. Cabe señalar que el N disminuye a 4–5 casos en las últimas preguntas de la batería, por lo que estos resultados deben leerse con cautela.

Adicionales

Fraseo: Responda las siguientes preguntas a partir de su situación socioeconómica actual.

Código
tabla_completa_bateria("Adicionales")
Tabla 12: Tiempo de respuesta y descriptivos - Adicionales

Para la batería de Adicionales (ver Tabla 12), se observa que la pregunta adc_qstn es la que más tiempo demanda en responder con una mediana de 39 segundos, superando el umbral de 30 segundos, seguida por adc_5 con 16 segundos, mientras que adc_6 y adc_7 tienen una mediana de 4 y 12 segundos respectivamente. Por su parte, los resultados descriptivos muestran que la pregunta adc_7, asociada a las expectativas de las próximas generaciones, es la única que supera una desviación estándar de 1 (1.41), mientras que adc_qstn es la que tiene sus respuestas más concentradas con una desviación estándar de 0.71.

Demográficos inicio

Código
tabla_completa_bateria("Demográficos inicio")
Tabla 13: Tiempo de respuesta y descriptivos - Demográficos inicio

Para la batería de Demográficos inicio (ver Tabla 13), se observa que la pregunta respondent, asociada al dispositivo de respuesta, es la que más tiempo demanda en responder con una mediana de 15 segundos, seguida por education con 11.5 segundos, mientras que sexo y year_of_birth tienen una mediana de 2 y 7 segundos respectivamente. Respecto a los resultados descriptivos, year_of_birth presenta una desviación estándar de 15.53 (años) y education de 1.57, ambas sobre el umbral de 1, aunque en el caso de year_of_birth esto responde a que la variable está medida en años y no en una escala de pocas categorías. La pregunta sexo es la que tiene sus respuestas más concentradas con una desviación estándar de 0.5. La pregunta respondent no presenta descriptivos por ser categórica.

Demográficos (bloque 2)

Código
tabla_completa_bateria("Demográficos (bloque 2)")
Tabla 14: Tiempo de respuesta y descriptivos - Demográficos (bloque 2)

Para la batería de Demográficos (bloque 2) (ver Tabla 14), se observa que la pregunta income, asociada al ingreso anual del hogar, es la que más tiempo demanda en responder con una mediana de 17 segundos, seguida por gender con 13 segundos, mientras que salud_prov y educ_prov tienen una mediana de 3 y 4 segundos respectivamente. Respecto a los resultados descriptivos, income es la única variable con estadísticos numéricos y presenta una desviación estándar de 22.53, muy superior a su media (12.41) y a su mediana (8), lo que indica una distribución muy dispersa y asimétrica. Las demás preguntas son categóricas, por lo que no presentan descriptivos.

2.3.3 Análisis de módulos

Esta sección presenta en análisis de los tiempos de respuesta y descriptivos de las preguntas incluidas en el pre-piloto que no presentan la estructura de items en bases escalas Likert, sino que se responden mediante un slider, lo cual tiene implicancias al momento de estimar el tiempo de respuesta y los resultados descripivos. En consideración de ello, generamos una sección aparte para estos módulos.

Conjoint

Código
tabla_completa_bateria("Conjoint")
Tabla 15: Tiempo de respuesta y descriptivos - Conjoint

Para la batería de Conjoint (ver Tabla 15), se observa que el ejemplo de práctica (cbc_practice) es lo que más tiempo demanda con una mediana de 139 segundos, lo que tiene sentido porque los respondentes deben comprender a cabalidad la tarea de asignación, lo cual requiere un esfuerzo de comprensión lectora y de atención. Luego, las tres primeras tareas (cbc_q1 a cbc_q3) tienen una mediana de entre 34 y 36 segundos, superando el umbral de 30 segundos, mientras que a partir de la tarea 4 los tiempos disminuyen (22.5, 21 y 21.5 segundos en cbc_q4, cbc_q5 y cbc_q6 respectivamente), lo que sugiere un efecto de aprendizaje a medida que los respondentes se familiarizan con la tarea. La pregunta de verificación (manip_check) tiene una mediana de 28 segundos. Sobre los descriptivos, al estar medidas en pesos chilenos, todas las asignaciones presentan una desviación estándar muy superior a 1, por lo que este umbral no es informativo para esta batería. En términos relativos, cbc_q6 y el ejemplo de práctica son las que presentan mayor dispersión (566.522 y 609.227 respectivamente), mientras que cbc_q2 es la que tiene sus respuestas más concentradas, con una desviación estándar de 264.127 y una mediana de asignación de $1.000.000, es decir, una división equitativa del monto.

Escenarios de subvención

Código
tabla_completa_bateria("Escenarios de subvención")
Tabla 16: Tiempo de respuesta y descriptivos - Escenarios de subvención

En este módulo se presentan escenarios ficticios donde el respondente debe tomar decisiones de acuerdo a la subvención de salud y educación para personas que no son capaces de costear estos servicios. Todas las preguntas de escenarios hipotéticos (Tabla 16) tienden a demorar más debido a que requieren un mayor esfuerzo cognitivo. Cabe señalar que dec_3aparece primero que las otras dos preguntas, por lo que tiene sentido que sea la más demorosa, mientras que después se presenta dec_1, la cual se mantiene apenas debajo del umbral de los 30 segundos. En cuanto a los descriptivos, la pregunta dec_1 es la que presenta la mediana más alta con un 25, lo que quiere decir que al menos la mitad de los encuestados mantuvo en slider en el 25. El escenario de salud tiene una mediana más baja, de sólo 5, y por último el caso condicional del escenario de educación presenta un 0, aunque no entrega mucha información debido a que sólo 2 personas pudieron responder tal pregunta

2.3.3.1 Ranking de políticas

Los recursos del Estado son limitados y deben distribuirse entre distintas áreas de inversión pública. Pensando en cómo usted asignaría esos recursos, le pedimos ordene según prioridad las siguientes áreas de inversión de fondos públicos (seleccione al menos 3):

Código
tiempo_ranking |>
  datatable(
    rownames = FALSE,
    options = list(dom = "t", pageLength = nrow(tiempo_ranking), scrollX = TRUE),
    colnames = c(
      "respID", "Precedente", "Educación", "Salud", "Pensiones",
      "Cuidado niños", "Carreteras", "Tiempo estimado (s)"
    )
  )
Tabla 17: Tiempos de respuesta Ranking de políticas

En la Tabla 17 se presentan los tiempos de respuesta registrados en la base de datos original para cada política considerada en el ranking. Al no poder estimar el tiempo de respuesta con el método aplicado en las demás preguntas, el tiempo aproximado fue calculado a partir de la diferencia entre el último y el primer registro temporal.

En esta situación, los respondentes podían partir seleccionando cualquiera de las 5 alternativas. Como se explica en la metodología, los tiempos estimados de demora por pregunta fueron calculados a partir de la diferencia de tiempo entre la pregunta actual y su predecesora. Debido a la no-restricción de orden es que en algunos casos se presentan valores negativos, reflejando que la pregunta de valor negativo fue respondida antes que su predecesora.

Para calcular el tiempo estimado de respuesta del ranking, se calculó la diferencia entre la última alternativa en ser respondida y la primera para cada respondente. Al promediar los tiempos de respuesta de cada encuestado, la media de tiempo para el ranking fue de 93 segundos.

Código
# Descriptivos de un conjunto de items numéricos de df (casos con consentimiento). Se excluyen los códigos 98/99 (No sé / Prefiero no responder).
descriptivos_items <- function(ids) {
  do.call(rbind, lapply(ids, function(v) {
    x <- suppressWarnings(as.numeric(df[[v]]))
    n_9899 <- sum(x %in% c(98, 99), na.rm = TRUE)
    x <- x[!is.na(x) & !x %in% c(98, 99)]
    data.frame(
      variable = v,
      label    = resumen$label[match(v, resumen$variable)],
      n        = length(x),
      n_9899   = n_9899,
      media    = round(mean(x), 2),
      mediana  = round(median(x), 2),
      sd       = round(sd(x), 2),
      min      = min(x),
      max      = max(x),
      stringsAsFactors = FALSE
    )
  }))
}

tabla_desc_items <- function(ids, prefijo = NULL) {
  tab <- descriptivos_items(ids)
  if (!is.null(prefijo)) tab$label <- paste0(prefijo[sub("_[0-9]+$", "", tab$variable)], ": ", tab$label)
  tab |>
    datatable(
      rownames = FALSE,
      options = list(dom = "t", pageLength = nrow(tab), scrollX = TRUE),
      colnames = c("Variable", "Label", "N", "NA (98/99)", "Media", "Mediana", "DE", "Mín", "Máx")
    ) |>
    formatStyle("sd", backgroundColor = styleInterval(1.0, c("white", "#f79b9b")))
}

ranking_ids <- c("ranking_politicas_educacion", "ranking_politicas_salud",
                 "ranking_politicas_pensiones", "ranking_politicas_cuidado_ninos",
                 "ranking_politicas_carreteras")

tabla_desc_items(ranking_ids)
Tabla 18: Descriptivos Ranking de políticas

En la Tabla 18 se presentan los descriptivos del ranking de políticas, es decir, la prioridad asignada a cada área de inversión (1° a 5°, donde un valor menor indica mayor prioridad). Se puede observar que las políticas de educación y salud son las que nunca fueron consideradas como última prioridad, presentando un valor máximo de 4, mientras que las demás políticas sí fueron dejadas como menos prioritarias, al menos por un encuestado. La alternativa de carreteras es que puede asumirse como la menos priorizada, ya que sus valores rondan entre el 4 y el 5. En cuanto a la dispersión de respuestas, las políticas de educación, salud y cuidado de niños son las que presentan mayor desviación estándar.

2.3.3.2 Participación Estado/Mercado

Código
tiempos_part |>
  datatable(
    rownames = FALSE,
    options = list(dom = "t", pageLength = nrow(tiempos_part), scrollX = TRUE),
    colnames = c(
      "respID", "Precedente", "Primera pregunta part", "Última pregunta part",
      "Siguiente", "Tiempo aprox. batería (s)"
    )
  )
Tabla 19: Tiempos de respuesta batería de participación E/M

En la Tabla 19 se presentan los tiempos aproximados de respuesta en la batería de participación Estado/Mercado. Cabe considerar que esta batería está construida a partir de sliders, los cuales estaban fijados en la categoría media (4). Puede ser que debido a esto, algunos respondentes no interactuaron en el slider, por lo que el valor de su respuesta se registró pero no así el tiempo en responder. En consecuencia, para estimar el tiempo de respuesta se recurrió a las preguntas que precedían y proseguían la batería.

Considerando los 4 casos que respondieron esta batería, el tiempo promedio es de 39 segundos. Si se excluye el caso con el tiempo registrado más alto (74 segundos), el tiempo promedio de la batería disminuye a 28 segundos.

Código
tabla_desc_items(
  c(paste0("cargo_", 1:5), paste0("efic_", 1:5), paste0("part_", 1:5)),
  prefijo = c(cargo = "Quién participa más", efic = "Quién es más eficiente", part = "Quién debería participar más")
)
Tabla 20: Descriptivos batería de participación E/M (cargo, eficiencia y participación deseada)

En la Tabla 20 se presentan los descriptivos de la batería de participación Estado/Mercado, que incluye tres bloques de sliders para cada servicio (salud, educación, pensiones, salas cuna y carreteras): quién participa más en su provisión en Chile (cargo_1 a cargo_5), quién es más eficiente (efic_1 a efic_5) y quién debería participar más (part_1 a part_5). Las respuestas van de 1 (Estado) a 7 (Privados), con 4 como punto medio (“Ambos por igual”). Se destaca con rojo una desviación estándar (DE) > 1. Se puede observar que la gran mayoría de los items presentan alta dispersión en sus respuestas, destacando la sección completa que consulta sobre la eficiencia de los servicios con una desviación estándar > 1. Por otro lado, los descriptivos permiten dar cuenta de un patrón llamativo: aunque varios items tienen como máximo la categoría intermedia (4), y sólo algunos la categoría extrema de Mercado (1), solamente dos de los quince items de los sliders presentaron como respuesta la categoría extrema de Estado, específicamente en las preguntas referidas a la participación en salud y carreteras

3 Panorama general del pre-piloto

En esta sección se presenta el tiempo estimado completo del pre-piloto, incluyendo baterías que no fueron aplicadas en la versión de pilotaje, con el objetivo de analizar en qué medida es viable la aplicación de las preguntas en la versión oficial

Integración batería meritocracia

Como parte fundamental de la encuesta, se propone integrar la batería de meritocracia, la cual no fue incluida en los pre-pilotos. Sin embargo, estimamos su duración promedio en base a los datos de la encuesta EDUMERCO, instrumento donde sí se aplicó la escala de meritocracia.

Ahora bien, EDUMERCO no registra timestamp por pregunta individual, solo el rango created/ended de la sesion completa, la cual incluye ademas de meritocracia otras baterias presentes en la base (caracterizacion y deservingness).

Para aproximar el tiempo de respuesta por pregunta se calculó, para cada caso, una tasa segundos/pregunta usando el total de preguntas efectivamente respondidas por cada caso (entre las tres baterias), y luego se aplica esa tasa a las 8 preguntas del bloque de meritocracia, estimando un promedio general de tiempo de respuesta por pregunta.

Código
load(here::here("pre-pilot-analysis", "tbl/meritocracia.RData"))

merit_vars <- paste0("merit_0", 1:8)

carac_vars <- grep("^carac_a", names(meritocracia), value = TRUE)
des_vars   <- grep("^des_",    names(meritocracia), value = TRUE)
todas_vars <- c(carac_vars, merit_vars, des_vars)

merit_df <- meritocracia[, c("session_id", "created", "ended", todas_vars)]

Se conservan solo los casos que efectivamente respondieron el bloque de meritocracia completo (created/ended validos y sin NA en las 8 preguntas)

Código
merit_df <- merit_df[
  !is.na(merit_df$created) & !is.na(merit_df$ended) &
    stats::complete.cases(merit_df[, merit_vars]),
]

merit_df$created <- as.POSIXct(merit_df$created, format = "%Y-%m-%d %H:%M:%S", tz = "UTC") # transformación de string a fecha/hora
merit_df$ended   <- as.POSIXct(merit_df$ended,   format = "%Y-%m-%d %H:%M:%S", tz = "UTC")

merit_df$duracion_total_seg    <- as.numeric(difftime(merit_df$ended, merit_df$created, units = "secs"))
merit_df$n_respondidas         <- rowSums(!is.na(merit_df[, todas_vars]))
merit_df$duracion_pregunta_seg <- merit_df$duracion_total_seg / merit_df$n_respondidas

Se excluyen los casos con una tasa > 300 s/pregunta (27 casos), los cuales corresponden a sesiones abandonadas y retomadas horas o dias despues (algunos casos tenían sesiones de hasta ~358 horas), que no reflejan tiempo de respuesta real y distorsionan la media.

Código
merit_df <- merit_df[merit_df$duracion_pregunta_seg <= 300, ]

tiempo_merit_resumen <- data.frame(
  pregunta              = merit_vars,
  n                     = nrow(merit_df),
  duracion_media_seg    = round(mean(merit_df$duracion_pregunta_seg), 2),
  duracion_mediana_seg  = round(median(merit_df$duracion_pregunta_seg), 2),
  stringsAsFactors = FALSE
)

Por último estimamos visualizamos el tiempo estimado de respuesta de cada pregunta de la batería de meritocracia a partir de las decisiones tomadas, las cuales buscan reflejar la aproximación más fidedigna posible a la realidad de los tiempos de respuesta de esta batería.

Código
tiempo_merit_resumen |>
  datatable(
    rownames = FALSE,
    options = list(dom = "t", pageLength = nrow(tiempo_merit_resumen), scrollX = TRUE),
    colnames = c("Pregunta", "N", "Duración media (s)", "Duración mediana (s)")
  ) |>
  formatStyle(
    c("duracion_media_seg", "duracion_mediana_seg"),
    backgroundColor = styleInterval(30, c("white", "#f79b9b"))
  )

3.1 Estimación completa de los tiempos de respuesta

Para tener una visión general y comparable entre baterías temáticas, se calcula, para cada una, la suma de la duración mediana (duracion_mediana_seg) de sus preguntas, obteniendo así el tiempo total estimado para responder cada batería completa, lo cual se expresa en minutos. Se incluye además la batería de meritocracia, estimada previamente a partir de los datos de EDUMERCO (tiempo_merit_resumen).

Para leer la Tabla 21 es pertinente aclarar que está dividida en dos apartados: en la primera parte de la tabla se presentan todas las baterías compuestas por ítems medidos con escalas Likert; en la segunda parte de la tabla (diferenciada con el nombre módulos) se muestran todas las secciones de la encuesta que se responden mediante sliders.

Código
panorama_bateria <- do.call(rbind, lapply(names(baterias), function(nm) {
  ids <- baterias[[nm]]
  tab <- tiempo_pregunta_resumen[tiempo_pregunta_resumen$pregunta %in% ids, ]
  data.frame(
    bateria                = nm,
    n_items                = length(ids),
    duracion_mediana_total = round(sum(tab$duracion_mediana_seg), 2),
    stringsAsFactors = FALSE
  )
})) # se suma la duración mediana de las preguntas de cada batería temática, junto con su cantidad de ítems

panorama_bateria <- rbind(
  panorama_bateria,
  data.frame(
    bateria                = "Meritocracia",
    n_items                = length(merit_vars),
    duracion_mediana_total = round(sum(tiempo_merit_resumen$duracion_mediana_seg), 2),
    stringsAsFactors = FALSE
  )
) # se agrega la batería de meritocracia (estimada a partir de EDUMERCO) al panorama general

panorama_bateria$duracion_mediana_total <- round(panorama_bateria$duracion_mediana_total / 60, 2) # conversión de segundos a minutos

panorama_bateria <- rbind(
  panorama_bateria,
  data.frame(
    bateria                = "Ranking de políticas",
    n_items                = unname(ranking_frame["n_items"]),
    duracion_mediana_total = round(unname(ranking_frame["duracion_mediana_total"]) / 60, 2),
    stringsAsFactors = FALSE
  ),
  data.frame(
    bateria                = "Participación Estado/Mercado",
    n_items                = unname(sliders_frame["n_items"]),
    duracion_mediana_total = round(unname(sliders_frame["duracion_mediana_total"]) / 60, 2),
    stringsAsFactors = FALSE
  )
) # se agregan las baterías de ranking y sliders (estimadas por separado en el chunk "ranking y slider df")

seccion_1 <- c(
  "Demográficos inicio", "Market Justice Preferences", "Market Justice Reflexive",
  "Market Justice en el tiempo", "Comodificación de servicios", "Lucro en servicios",
  "Neoliberalismo", "NICERA", "Adicionales", "Demográficos (bloque 2)", "Meritocracia"
) # baterías del cuerpo principal de la encuesta

seccion_2 <- c(
  "Conjoint", "Escenarios de subvención", "Ranking de políticas", "Participación Estado/Mercado"
) # baterías correspondientes a módulos aparte (conjoint, escenarios y tareas interactivas)

panorama_seccion_1 <- panorama_bateria[match(seccion_1, panorama_bateria$bateria), ]
panorama_seccion_2 <- panorama_bateria[match(seccion_2, panorama_bateria$bateria), ]

subtotal_1 <- data.frame(
  bateria                = "Subtotal",
  n_items                = sum(panorama_seccion_1$n_items),
  duracion_mediana_total = round(sum(panorama_seccion_1$duracion_mediana_total), 2),
  stringsAsFactors = FALSE
) # subtotal de ítems y duración mediana de la primera sección

fila_total <- data.frame(
  bateria                = "Total",
  n_items                = sum(panorama_seccion_1$n_items, panorama_seccion_2$n_items),
  duracion_mediana_total = round(sum(panorama_seccion_1$duracion_mediana_total, panorama_seccion_2$duracion_mediana_total), 2),
  stringsAsFactors = FALSE
) # total general, sumando ambas secciones

fila_modulos <- data.frame(
  bateria                = "Módulos",
  n_items                = "N° de ítems",
  duracion_mediana_total = "Duración mediana total (min)",
  stringsAsFactors = FALSE
) # fila separadora que marca el inicio de la segunda sección (módulos aparte)

panorama_bateria <- rbind(
  panorama_seccion_1,
  subtotal_1,
  fila_modulos,
  panorama_seccion_2,
  fila_total
) # tabla final: sección 1, subtotal, separador de módulos, sección 2 y total general

panorama_bateria |>
  datatable(
    rownames = FALSE,
    options = list(dom = "t", pageLength = nrow(panorama_bateria)),
    colnames = c(
      "Batería temática", "N° de ítems", "Duración mediana total (min)"
    )
  ) |>
  formatStyle(
    "bateria",
    target = "row",
    fontWeight = styleEqual("Módulos", "bold")
  ) # se resalta la fila "Módulos", ya que solo replica los encabezados para marcar el inicio de la segunda sección
Tabla 21: Panorama general de los tiempos de respuesta por batería temática

4 Conclusiones

A partir de los resultados del análisis del pre-piloto, se pueden extraer las siguientes conclusiones y sugerencias para la versión final de la encuesta:

La retroalimentación entregada por los respondentes en la primera versión del pre-piloto (la cual se visualiza en la sección 2.2) se puede sintetizar en dos conjuntos: comentarios puntuales de items y consideraciones para la tarea de asignación. En el primer caso, los respondentes entregaron comentarios sobre la adición de elementos a las preguntas, como la integración de los impuestos a la pregunta de ingresos. También se expresaron confusiones respecto a lo que apuntaban ciertas preguntas, como el nivel educacional o el mismo ingreso, entre otras. En el segundo caso, se recibieron sugerencias sobre la implementación de la tarea de asignación, especialmente haciendo alusión a que, el peso de sólo un atributo determinaba la decisión del respondente. A partir de esto, se puede concluir que la encuesta requiere, por un lado, una revisión de los ítems para mejorar la comprensión de la encuesta, y por otro, una discusión en torno a la tarea de asignación, donde si bien los comentarios son valiosos, apuntan justamente a lo que busca comprender el conjoint.

En cuanto a los análisis de las baterías y módulos, se observa que la mayoría de las preguntas presentan una duración mediana de respuesta menor a 30 segundos, lo que indica que los respondentes no requieren un tiempo excesivo para responderlas. Sin embargo, algunas preguntas superan este umbral, especialmente aquellas que requieren un mayor esfuerzo cognitivo, como las preguntas de escenarios hipotéticos y la tarea de asignación. Esto sugiere que estas secciones podrían beneficiarse de una revisión para simplificar la comprensión o proporcionar instrucciones más claras. De todas formas, al estimar el tiempo total de respuesta de la encuesta, se observa que la duración mediana total es de 22.5 minutos, lo que indica que la encuesta es viable en términos de tiempo de aplicación, superando levemente el umbral acordado con la contraparte (20 minutos).

Por último, cabe destacar que los resultados descriptivos de las baterías temáticas muestran que el módulo escenarios de subvención y la batería NICERA son las que presentan mayor heterogeneidad en las respuestas, lo que indica que los ítems discriminan bien entre los respondentes, por lo que pueden resultar provechosos para la versión oficial de la encuesta.