📚 Librería
library(readxl)
library(glue)
library(dplyr)
library(psych)
library(ggplot2)
library(knitr)
library(janitor)
library(nortest)
library(kableExtra)
library(tidyr)
library(ggrepel)
 
📥 Importar datos
datos <- read_excel("/Users/adrianaholguin/Desktop/Copia de Tabla analisis tesis R.xlsx")
 
Limpiar nombres
# Renombrar columnas
names(datos) <- c(
  "Serie", "Edad", "Sexo", "Estado_civil", "Trabaja", "Residente", "Vive_con",
  "Grupo_vulnerabilidad", "Tipo_familia", "Num_personas_casa", "Nivel_socioeconomico",
  "Involucramiento_familiar", "Involucramiento_personal", "Gusto_voluntariado",
  "Areas_interes", "Ha_voluntariado", "Cantidad_voluntariados", "Quien_involucro",
  "Tipos_voluntariados", "Motivacion_voluntariado", "Percibe_beneficio",
  "Beneficio_percibido", "Recuerdo_voluntariado", "Volveria_participar",
  "Motivo_no_participar", "Le_gustaria_participar", "Beneficio_esperado",
  # Ítems del instrumento A
  "A_item1", "A_item2", "A_item3", "A_item4", "A_item5", "A_item6",
  "A_item7", "A_item8", "A_item9", "A_item10", "A_item11", "A_item12",
  "A_item13", "A_item14", "A_item15", "A_item16", 
  "Ayudar_A", "Empatia_A", "Compartir_A", "Total_A",
  # Ítems del instrumento B
  "B_item1", "B_item2", "B_item3", "B_item4", "B_item5", "B_item6",
  "B_item7", "B_item8", "B_item9", "B_item10", "B_item11", "B_item12",
  "B_item13", "B_item14", "B_item15", "B_item16",
  "Ayudar_B", "Empatia_B", "Compartir_B", "Total_B"
  )
 
❓Preguntas de investigación
Pregunta de investigación general
¿Qué relación existe entre la participación en un voluntariado
curricular y el desarrollo de conductas prosociales en estudiantes
universitarios?
Pregunta de investigación cuantitativa
¿Existe una diferencia significativa en los niveles de prosocialidad de
los estudiantes universitarios antes y después de participar en un
voluntariado curricular, medida con la escala de prosocialidad para
adultos de Caprara?
 
1 📊 Estadística descriptiva sociodemográfica
📊👥 Variables de respuesta única (todos los sujetos)
# --- Mapeo de NOMBRES REALES a Títulos ---
# (Usando los nombres de 'names(datos)')
vars_categoricas <- c(
  "Sexo" = "identidad de género",
  "Estado_civil" = "estado civil",
  "Trabaja" = "condición laboral",
  "Residente" = "residencia habitual",
  "Vive_con" = "personas con quienes vive",
  "Grupo_vulnerabilidad" = "pertenencia a grupo de vulnerabilidad",
  "Tipo_familia" = "tipo de familia",
  "Nivel_socioeconomico" = "nivel socioeconómico percibido",
  "Gusto_voluntariado" = "le gustaría realizar voluntariados en sus materias",
  "Ha_voluntariado" = "ha realizado voluntariados previamente"
)
vars_numericas_titulos <- c(
  "Edad" = "edad de los participantes",
  "Num_personas_casa" = "número de personas en el hogar",
  "Involucramiento_familiar" = "involucramiento familiar en voluntariado",
  "Involucramiento_personal" = "involucramiento personal en voluntariado"
)
# Vector solo con los nombres de columna
vars_numericas <- names(vars_numericas_titulos)
Distribución de Identidad de género
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Femenino
 | 
33
 | 
78.6%
 | 
78.6%
 | 
| 
Masculino
 | 
9
 | 
21.4%
 | 
100%
 | 
 
Distribución de Estado civil
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Soltero
 | 
41
 | 
97.6%
 | 
97.6%
 | 
| 
Unión libre
 | 
1
 | 
2.4%
 | 
100%
 | 
 
Distribución de Condición laboral
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
No
 | 
20
 | 
47.6%
 | 
47.6%
 | 
| 
Si
 | 
22
 | 
52.4%
 | 
100%
 | 
 
Distribución de Residencia habitual
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Foráneo
 | 
23
 | 
54.8%
 | 
54.8%
 | 
| 
Local
 | 
19
 | 
45.2%
 | 
100%
 | 
 
Distribución de Personas con quienes vive
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Familia
 | 
24
 | 
57.1%
 | 
57.1%
 | 
| 
Romíes
 | 
16
 | 
38.1%
 | 
95.2%
 | 
| 
Solo
 | 
2
 | 
4.8%
 | 
100%
 | 
 
Distribución de Pertenencia a grupo de vulnerabilidad
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Madre soltera
 | 
2
 | 
4.8%
 | 
4.8%
 | 
| 
Ninguno
 | 
40
 | 
95.2%
 | 
100%
 | 
 
Distribución de Tipo de familia
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Extensa
 | 
7
 | 
16.7%
 | 
16.7%
 | 
| 
Monoparental
 | 
6
 | 
14.3%
 | 
31%
 | 
| 
Tradicional
 | 
29
 | 
69%
 | 
100%
 | 
 
Distribución de Nivel socioeconómico percibido
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Bajo
 | 
4
 | 
9.5%
 | 
9.5%
 | 
| 
Medio
 | 
38
 | 
90.5%
 | 
100%
 | 
 
Distribución de Le gustaría realizar voluntariados en sus
materias
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
No
 | 
10
 | 
23.8%
 | 
23.8%
 | 
| 
Si
 | 
32
 | 
76.2%
 | 
100%
 | 
 
Distribución de Ha realizado voluntariados previamente
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
No
 | 
17
 | 
40.5%
 | 
40.5%
 | 
| 
Si
 | 
25
 | 
59.5%
 | 
100%
 | 
 
Estadística Descriptiva de Variables Numéricas
| 
Variable
 | 
N
 | 
Media
 | 
DE
 | 
Mediana
 | 
Mín
 | 
Máx
 | 
| 
Edad de los participantes
 | 
42
 | 
18.76
 | 
1.10
 | 
18
 | 
18
 | 
22
 | 
| 
Involucramiento familiar en voluntariado
 | 
42
 | 
5.33
 | 
2.28
 | 
5
 | 
1
 | 
10
 | 
| 
Involucramiento personal en voluntariado
 | 
42
 | 
4.33
 | 
2.18
 | 
4
 | 
1
 | 
9
 | 
| 
Número de personas en el hogar
 | 
42
 | 
4.24
 | 
1.16
 | 
4
 | 
2
 | 
7
 | 
 
 
📊👥 Variable de respuesta múltiple (Todos los sujetos)
En la siguiente tabla, los participantes podían seleccionar más de
una opción. Las respuestas fueron separadas por comas y desagregadas
para su análisis. Esta decisión metodológica permite visualizar la
diversidad de intereses sin forzar exclusividad en las categorías.
# Función para variables 
tabla_apa_categorica <- function(variable, nombre_variable) {
  variable <- as.character(variable)
  variable <- trimws(variable)
  
  # --- CORRECCIÓN AQUÍ ---
  # Aplicar filtros en pasos separados para evitar errores con NA
  variable <- variable[!is.na(variable)]
  variable <- variable[variable != ""]
  variable <- variable[toupper(variable) != "NA"]
  # --- FIN DE LA CORRECCIÓN ---
  if (length(variable) == 0) {
    return(invisible(NULL))
  }
  
  frec <- table(variable)
  porc <- round(prop.table(frec) * 100, 1)
  acum <- cumsum(porc)
  if (length(acum) > 0) { acum[length(acum)] <- 100.0 }
  
  tabla <- data.frame(
    "Categoría" = names(frec),
    "Frecuencia" = as.vector(frec),
    "% Frecuencia" = paste0(porc, "%"),
    "% Acumulado" = paste0(acum, "%"),
    check.names = FALSE
  )
  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>Distribución de ', nombre_variable, '</em></div>'))
  print(kable(tabla, format = "html", align = c("l", "c", "c", "c"), escape = FALSE))
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
  cat('<br>') 
}
# --- 2. Función para variables NUMÉRICAS ---
tabla_apa_numerica <- function(datos, vars_numericas, titulos_numericos) {
  
  datos_largos_num <- pivot_longer(datos,
                                  cols = all_of(vars_numericas),
                                  names_to = "Variable",
                                  values_to = "Puntuacion"
                                  )
  
  tabla_num <- datos_largos_num %>%
    group_by(Variable) %>%
    summarise(
      N = n(),
      Media = mean(Puntuacion, na.rm = TRUE),
      DE = sd(Puntuacion, na.rm = TRUE),
      Mediana = median(Puntuacion, na.rm = TRUE),
      Mín = min(Puntuacion, na.rm = TRUE),
      Máx = max(Puntuacion, na.rm = TRUE)
    ) %>%
    mutate(Variable = titulos_numericos[Variable])
  nombre_variable <- "Estadística Descriptiva de Variables Numéricas"
  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>', nombre_variable, '</em></div>'))
  print(kable(tabla_num, 
              format = "html", 
              align = c("l", "c", "c", "c", "c", "c"), 
              escape = FALSE, 
              digits = 2,
              col.names = c("Variable", "N", "Media", "DE", "Mediana", "Mín", "Máx")))
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
  cat('<br>')
}
# --- 3. Función para variables MÚLTIPLES ---
tabla_apa_multiple <- function(variable, nombre_variable) {
  df <- data.frame(respuesta = variable)
  
  df <- df %>%
    separate_rows(respuesta, sep = ",") %>%
    mutate(respuesta = trimws(respuesta)) %>%
    filter(respuesta != "" & !is.na(respuesta))
  frec <- table(df$respuesta)
  porc <- round(prop.table(frec) * 100, 1)
  
  acum <- cumsum(porc)
  if (length(acum) > 0) { acum[length(acum)] <- 100.0 }
  tabla <- data.frame(
    "Categoría" = names(frec),
    "Frecuencia" = as.vector(frec),
    "% Frecuencia" = paste0(porc, "%"),
    "% Acumulado" = paste0(acum, "%"),
    check.names = FALSE
  )
  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>Distribución de ', nombre_variable, ' (respuestas múltiples)</em></div>'))
  print(kable(tabla, format = "html", align = c("l", "c", "c", "c"), escape = FALSE))
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
  cat('<br>')
}
Distribución de Áreas de interés para realizar voluntariados
(respuestas múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Ambiental-ecológico
 | 
6
 | 
8%
 | 
8%
 | 
| 
Educativo
 | 
20
 | 
26.7%
 | 
34.7%
 | 
| 
Emergencias-desastres
 | 
13
 | 
17.3%
 | 
52%
 | 
| 
No respondió
 | 
3
 | 
4%
 | 
56%
 | 
| 
Salud
 | 
13
 | 
17.3%
 | 
73.3%
 | 
| 
Social-comunitario
 | 
20
 | 
26.7%
 | 
100%
 | 
 
Distribución de Quién lo involucró en voluntariados previos
(respuestas múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Amigo
 | 
9
 | 
15.5%
 | 
15.5%
 | 
| 
Escuela
 | 
16
 | 
27.6%
 | 
43.1%
 | 
| 
Familia
 | 
10
 | 
17.2%
 | 
60.3%
 | 
| 
Gobierno
 | 
1
 | 
1.7%
 | 
62%
 | 
| 
NA
 | 
17
 | 
29.3%
 | 
91.3%
 | 
| 
Religión
 | 
5
 | 
8.6%
 | 
100%
 | 
 
Distribución de Tipos de voluntariados que ha realizado (respuestas
múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Ambiental-ecológico
 | 
13
 | 
19.7%
 | 
19.7%
 | 
| 
Educación
 | 
5
 | 
7.6%
 | 
27.3%
 | 
| 
Emergencias-desastres
 | 
4
 | 
6.1%
 | 
33.4%
 | 
| 
NA
 | 
17
 | 
25.8%
 | 
59.2%
 | 
| 
Salud
 | 
6
 | 
9.1%
 | 
68.3%
 | 
| 
Social-comunitario
 | 
21
 | 
31.8%
 | 
100%
 | 
 
Distribución de Motivación para realizar voluntariados (respuestas
múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Altruismo
 | 
5
 | 
8.8%
 | 
8.8%
 | 
| 
Compromiso cívico
 | 
4
 | 
7%
 | 
15.8%
 | 
| 
Desarrollo personal
 | 
13
 | 
22.8%
 | 
38.6%
 | 
| 
Diversión
 | 
9
 | 
15.8%
 | 
54.4%
 | 
| 
NA
 | 
17
 | 
29.8%
 | 
84.2%
 | 
| 
Obligación
 | 
6
 | 
10.5%
 | 
94.7%
 | 
| 
Reconocimiento
 | 
3
 | 
5.3%
 | 
100%
 | 
 
Distribución de Beneficios percibidos de voluntariados previos
(respuestas múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Aprendizaje
 | 
9
 | 
11.1%
 | 
11.1%
 | 
| 
Autoestima
 | 
2
 | 
2.5%
 | 
13.6%
 | 
| 
Consciencia
 | 
6
 | 
7.4%
 | 
21%
 | 
| 
Curriculum
 | 
13
 | 
16%
 | 
37%
 | 
| 
Empatía
 | 
19
 | 
23.5%
 | 
60.5%
 | 
| 
NA
 | 
17
 | 
21%
 | 
81.5%
 | 
| 
Satisfacción
 | 
15
 | 
18.5%
 | 
100%
 | 
 
Distribución de Motivos para no participar en voluntariados
(respuestas múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Falta de interés
 | 
1
 | 
2.1%
 | 
2.1%
 | 
| 
Falta de oportunidades
 | 
10
 | 
21.3%
 | 
23.4%
 | 
| 
Falta de tiempo
 | 
9
 | 
19.1%
 | 
42.5%
 | 
| 
NA
 | 
25
 | 
53.2%
 | 
95.7%
 | 
| 
Prejuicios
 | 
2
 | 
4.3%
 | 
100%
 | 
 
Distribución de Beneficios esperados al participar (respuestas
múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Aprendizaje
 | 
13
 | 
19.1%
 | 
19.1%
 | 
| 
Autoestima
 | 
3
 | 
4.4%
 | 
23.5%
 | 
| 
Consciencia
 | 
8
 | 
11.8%
 | 
35.3%
 | 
| 
Curriculum
 | 
5
 | 
7.4%
 | 
42.7%
 | 
| 
Empatía
 | 
5
 | 
7.4%
 | 
50.1%
 | 
| 
NA
 | 
25
 | 
36.8%
 | 
86.9%
 | 
| 
Satisfacción
 | 
9
 | 
13.2%
 | 
100%
 | 
 
 
 
1.1 🤝 Sujetos que han participado previamente en voluntariados (n =
25)
👤🤝 Variables de respuesta única
vars_condicionales_si <- c(
  "Cantidad_voluntariados" = "Cantidad de voluntariados realizados",
  "Percibe_beneficio" = "Percibe algún beneficio por realizar voluntariados",
  "Volveria_participar" = "Volvería a participar en algún voluntariado"
)
# --- Ejecutar la función 'tabla_apa_categorica' ---
# (Esta función fue definida en el chunk 'setup_funciones_tablas')
for (var_col in names(vars_condicionales_si)) {
  tabla_apa_categorica(datos[[var_col]], nombre_variable = vars_condicionales_si[[var_col]])
}
Distribución de Cantidad de voluntariados realizados
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
1
 | 
4
 | 
16.7%
 | 
16.7%
 | 
| 
10
 | 
1
 | 
4.2%
 | 
20.9%
 | 
| 
2
 | 
9
 | 
37.5%
 | 
58.4%
 | 
| 
3
 | 
5
 | 
20.8%
 | 
79.2%
 | 
| 
4
 | 
2
 | 
8.3%
 | 
87.5%
 | 
| 
5
 | 
3
 | 
12.5%
 | 
100%
 | 
 
Distribución de Percibe algún beneficio por realizar
voluntariados
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Si
 | 
25
 | 
100%
 | 
100%
 | 
 
Distribución de Volvería a participar en algún voluntariado
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
No
 | 
3
 | 
12%
 | 
12%
 | 
| 
Si
 | 
22
 | 
88%
 | 
100%
 | 
 
 
👤🤝 Variables de respuesta múltiple
Cada tabla a continuación representa variables donde los
participantes podían seleccionar más de una opción. Las respuestas
fueron separadas por comas y desagregadas para su análisis. Esta
decisión metodológica permite visualizar la diversidad de experiencias y
motivaciones sin forzar exclusividad en las categorías.
tabla_apa_multiple <- function(variable, nombre_variable) {
  df <- data.frame(respuesta = variable)
  df <- df %>%
    separate_rows(respuesta, sep = ",") %>%
    mutate(respuesta = trimws(respuesta)) %>%
    filter(
      !is.na(respuesta),
      respuesta != "",
      toupper(respuesta) != "NA"
    )
  frec <- table(df$respuesta)
  porc <- round(prop.table(frec) * 100, 1)
  acum <- round(cumsum(porc), 1)
  tabla <- data.frame(
    Categoría = names(frec),
    Frecuencia = as.vector(frec),
    `% Frecuencia` = paste0(porc, "%"),
    `% Acumulado` = paste0(acum, "%"),
    check.names = FALSE
  )
  # Título con línea inferior
  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>Distribución de ', nombre_variable, ' (respuestas múltiples)</em></div>'))
  # Tabla centrada sin líneas internas
  print(kable(tabla, format = "html", align = c("c", "c", "c", "c"), escape = FALSE))
  # Línea debajo del encabezado
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')
  # Línea final
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
}
Distribución de quién le involucró en el voluntariado (respuestas
múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Amigo
 | 
9
 | 
22%
 | 
22%
 | 
| 
Escuela
 | 
16
 | 
39%
 | 
61%
 | 
| 
Familia
 | 
10
 | 
24.4%
 | 
85.4%
 | 
| 
Gobierno
 | 
1
 | 
2.4%
 | 
87.8%
 | 
| 
Religión
 | 
5
 | 
12.2%
 | 
100%
 | 
 
Distribución de tipos de voluntariado realizados (respuestas
múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Ambiental-ecológico
 | 
13
 | 
26.5%
 | 
26.5%
 | 
| 
Educación
 | 
5
 | 
10.2%
 | 
36.7%
 | 
| 
Emergencias-desastres
 | 
4
 | 
8.2%
 | 
44.9%
 | 
| 
Salud
 | 
6
 | 
12.2%
 | 
57.1%
 | 
| 
Social-comunitario
 | 
21
 | 
42.9%
 | 
100%
 | 
 
Distribución de motivaciones para participar en voluntariados
(respuestas múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Altruismo
 | 
5
 | 
12.5%
 | 
12.5%
 | 
| 
Compromiso cívico
 | 
4
 | 
10%
 | 
22.5%
 | 
| 
Desarrollo personal
 | 
13
 | 
32.5%
 | 
55%
 | 
| 
Diversión
 | 
9
 | 
22.5%
 | 
77.5%
 | 
| 
Obligación
 | 
6
 | 
15%
 | 
92.5%
 | 
| 
Reconocimiento
 | 
3
 | 
7.5%
 | 
100%
 | 
 
Distribución de beneficios percibidos de participar en voluntariados
(respuestas múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Aprendizaje
 | 
9
 | 
14.1%
 | 
14.1%
 | 
| 
Autoestima
 | 
2
 | 
3.1%
 | 
17.2%
 | 
| 
Consciencia
 | 
6
 | 
9.4%
 | 
26.6%
 | 
| 
Curriculum
 | 
13
 | 
20.3%
 | 
46.9%
 | 
| 
Empatía
 | 
19
 | 
29.7%
 | 
76.6%
 | 
| 
Satisfacción
 | 
15
 | 
23.4%
 | 
100%
 | 
 
Distribución de lo que más recuerda del voluntariado (respuestas
múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
A las personas
 | 
11
 | 
26.8%
 | 
26.8%
 | 
| 
Lo que aprendí
 | 
7
 | 
17.1%
 | 
43.9%
 | 
| 
Lo que hice
 | 
10
 | 
24.4%
 | 
68.3%
 | 
| 
Lo que sentí
 | 
13
 | 
31.7%
 | 
100%
 | 
 
 
 
1.2 🧤 Sujetos que no han participado previamente en voluntariados
(n = 17)
👤🧤 Variable de respuesta única
# Seleccionar y reordenar los datos
datos_largos_fase1 <- pivot_longer(datos,
                                  cols = c("Total_A", "Ayudar_A", "Compartir_A", "Empatia_A"),
                                  names_to = "Dimension",
                                  values_to = "Puntuacion"
                                  )
# Calcular los descriptivos
# Esta será la 'tabla' que usará tu plantilla
tabla <- datos_largos_fase1 %>%
  group_by(Dimension) %>%
  summarise(
    N = n(),
    Media = mean(Puntuacion, na.rm = TRUE),
    DE = sd(Puntuacion, na.rm = TRUE),
    Mediana = median(Puntuacion, na.rm = TRUE),
    Minimo = min(Puntuacion, na.rm = TRUE),
    Maximo = max(Puntuacion, na.rm = TRUE)
  ) %>%
  # Reordenar las columnas
  arrange(factor(Dimension, levels = c("Ayudar_A", "Compartir_A", "Empatia_A", "Total_A")))
Distribución de Le gustaría participar en un voluntariado
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
No
 | 
2
 | 
11.8%
 | 
11.8%
 | 
| 
Si
 | 
15
 | 
88.2%
 | 
100%
 | 
 
 
👤🧤 Variables de respuesta múltiple
Cada tabla a continuación representa variables donde los
participantes podían seleccionar más de una opción. Las respuestas
fueron separadas por comas y desagregadas para su análisis. Esta
decisión metodológica permite visualizar la diversidad de experiencias y
motivaciones sin forzar exclusividad en las categorías.
Distribución de Motivos para no participar en voluntariado
(respuestas múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Falta de interés
 | 
1
 | 
4.5%
 | 
4.5%
 | 
| 
Falta de oportunidades
 | 
10
 | 
45.5%
 | 
50%
 | 
| 
Falta de tiempo
 | 
9
 | 
40.9%
 | 
90.9%
 | 
| 
Prejuicios
 | 
2
 | 
9.1%
 | 
100%
 | 
 
Distribución de Beneficios esperados del voluntariado (respuestas
múltiples)
| 
Categoría
 | 
Frecuencia
 | 
% Frecuencia
 | 
% Acumulado
 | 
| 
Aprendizaje
 | 
13
 | 
30.2%
 | 
30.2%
 | 
| 
Autoestima
 | 
3
 | 
7%
 | 
37.2%
 | 
| 
Consciencia
 | 
8
 | 
18.6%
 | 
55.8%
 | 
| 
Curriculum
 | 
5
 | 
11.6%
 | 
67.4%
 | 
| 
Empatía
 | 
5
 | 
11.6%
 | 
79%
 | 
| 
Satisfacción
 | 
9
 | 
20.9%
 | 
99.9%
 | 
 
 
 
2 🛡️ Análisis de la Escala de Prosocialidad (Pre-test)
2.1 🎯 Fiabilidad de la Escala de Prosocialidad (Alpha de
Cronbach)
# Definición de ítems
items_ayudar_A <- c("A_item1", "A_item3", "A_item4", "A_item6", "A_item7", "A_item13")
items_empatia_A <- c("A_item5", "A_item8", "A_item10", "A_item12", "A_item16")
items_compartir_A <- c("A_item2", "A_item9", "A_item14")
items_total_A <- c(items_ayudar_A, items_empatia_A, items_compartir_A)
# Calcular los Alfas
alfa_ayudar <- psych::alpha(datos[, items_ayudar_A], check.keys = TRUE)
alfa_compartir <- psych::alpha(datos[, items_compartir_A], check.keys = TRUE)
alfa_empatia <- psych::alpha(datos[, items_empatia_A], check.keys = TRUE)
alfa_total <- psych::alpha(datos[, items_total_A], check.keys = TRUE)
# Crear la tabla de resultados
tabla_para_imprimir_alfa <- data.frame(
  Dimension = c("Ayudar (Pre-test)", 
                "Compartir (Pre-test)", 
                "Empatía (Pre-test)", 
                "Total Escala (Pre-test)"),
  Alfa_Cronbach = c(alfa_ayudar$total$raw_alpha,
                    alfa_compartir$total$raw_alpha,
                    alfa_empatia$total$raw_alpha,
                    alfa_total$total$raw_alpha)
)
Fiabilidad de la Escala (Alfa de Cronbach)
| 
Dimensión
 | 
Alfa de Cronbach (α)
 | 
| 
Ayudar (Pre-test)
 | 
0.753
 | 
| 
Compartir (Pre-test)
 | 
0.504
 | 
| 
Empatía (Pre-test)
 | 
0.584
 | 
| 
Total Escala (Pre-test)
 | 
0.833
 | 
 
 
 
2.2 🧮 Estadística Descriptiva de la escala de prosocialidad
# Preparar datos
datos_largos_fase1 <- pivot_longer(datos,
                                  cols = c("Total_A", "Ayudar_A", "Compartir_A", "Empatia_A"),
                                  names_to = "Dimension",
                                  values_to = "Puntuacion"
                                  )
# Calcular descriptivos y guardar en una variable
tabla_para_imprimir <- datos_largos_fase1 %>%
  group_by(Dimension) %>%
  summarise(
    N = n(),
    Media = mean(Puntuacion, na.rm = TRUE),
    DE = sd(Puntuacion, na.rm = TRUE),
    Mediana = median(Puntuacion, na.rm = TRUE),
    Minimo = min(Puntuacion, na.rm = TRUE),
    Maximo = max(Puntuacion, na.rm = TRUE)
  ) %>%
  arrange(factor(Dimension, levels = c("Ayudar_A", "Compartir_A", "Empatia_A", "Total_A")))
Estadística Descriptiva de la Escala (Fase 1 - Pre-test)
| 
Dimensión
 | 
N
 | 
Media
 | 
DE
 | 
Mediana
 | 
Mín
 | 
Máx
 | 
| 
Ayudar_A
 | 
42
 | 
21.93
 | 
3.54
 | 
22
 | 
15
 | 
28
 | 
| 
Compartir_A
 | 
42
 | 
12.52
 | 
1.63
 | 
12
 | 
8
 | 
15
 | 
| 
Empatia_A
 | 
42
 | 
20.02
 | 
2.78
 | 
20
 | 
15
 | 
24
 | 
| 
Total_A
 | 
42
 | 
54.48
 | 
6.83
 | 
53
 | 
40
 | 
67
 | 
 
📈🧮 Distribución de puntuaciones de la Escala de Prosocialiad

 
 
2.3 🧭 Pruebas de normalidad escala de prosocialidad
# Función de ayuda para calcular normalidad
calcular_normalidad <- function(variable) {
  
  # Limpieza de datos 
  variable <- as.character(variable)
  variable <- trimws(variable)
  variable <- variable[!is.na(variable) & variable != "" & variable != "NA"]
  variable <- as.numeric(variable)
  
  # Check de seguridad
  if (length(variable) < 3) {
    return(list(Shapiro_W = NA, Shapiro_p = NA, KS_D = NA, KS_p = NA))
  }
  
  # Pruebas (se guardan los resultados)
  shapiro <- shapiro.test(variable)
  ks <- ks.test(variable, "pnorm", mean(variable), sd(variable))
  
  # Retornar una lista con los valores clave
  return(list(
    Shapiro_W = shapiro$statistic,
    Shapiro_p = shapiro$p.value,
    KS_D = ks$statistic,
    KS_p = ks$p.value
  ))
}
# Aplicar la función a cada dimensión 
res_ayudar <- calcular_normalidad(datos$Ayudar_A)
res_compartir <- calcular_normalidad(datos$Compartir_A)
res_empatia <- calcular_normalidad(datos$Empatia_A)
res_total <- calcular_normalidad(datos$Total_A)
# Crear el data.frame con los resultados 
tabla_para_imprimir_normalidad <- data.frame(
  Dimension = c("Ayudar (Pre-test)", 
                "Compartir (Pre-test)", 
                "Empatía (Pre-test)", 
                "Total Prosocialidad (Pre-test)"),
  Shapiro_W = c(res_ayudar$Shapiro_W, res_compartir$Shapiro_W, res_empatia$Shapiro_W, res_total$Shapiro_W),
  Shapiro_p_value = c(res_ayudar$Shapiro_p, res_compartir$Shapiro_p, res_empatia$Shapiro_p, res_total$Shapiro_p),
  KS_D = c(res_ayudar$KS_D, res_compartir$KS_D, res_empatia$KS_D, res_total$KS_D),
  KS_p_value = c(res_ayudar$KS_p, res_compartir$KS_p, res_empatia$KS_p, res_total$KS_p)
)
Pruebas de Normalidad de la Escala (Fase 1 - Pre-test)
| 
Dimensión
 | 
Shapiro W
 | 
p-value (S)
 | 
KS D
 | 
p-value (KS)
 | 
| 
Ayudar (Pre-test)
 | 
0.953
 | 
0.083
 | 
0.125
 | 
0.524
 | 
| 
Compartir (Pre-test)
 | 
0.932
 | 
0.016
 | 
0.159
 | 
0.236
 | 
| 
Empatía (Pre-test)
 | 
0.934
 | 
0.018
 | 
0.120
 | 
0.584
 | 
| 
Total Prosocialidad (Pre-test)
 | 
0.955
 | 
0.094
 | 
0.140
 | 
0.385
 | 
 
📈🧭 Gráficos Q-Q plot de normalidad Escala de Prosocialidad
# Cargar librería (si no está en tu setup)
library(ggplot2)
# Crear etiquetas limpias para las facetas
facet_labels <- c(
  "Ayudar_A" = "Ayudar",
  "Compartir_A" = "Compartir",
  "Empatia_A" = "Empatía",
  "Total_A" = "Total Escala"
)
# Crear el gráfico
# Usamos 'datos_largos_fase1' (creado en el chunk 'descriptivos_calculo')
ggplot(datos_largos_fase1, aes(sample = Puntuacion)) +
  
  # 1. geom_qq() grafica los puntos
  geom_qq(color = "#3498DB", size = 2) +
  
  # 2. geom_qq_line() dibuja la línea de referencia CORRECTA
  geom_qq_line(color = "#E74C3C", linetype = "dashed", linewidth = 1) +
  
  # 3. facet_wrap() crea la cuadrícula 2x2
  facet_wrap(~ Dimension, scales = "free", labeller = as_labeller(facet_labels)) +
  
  # Títulos y tema
  labs(
    title = "Gráficos Q-Q de Normalidad de la Escala (Fase 1 - Pre-test)",
    x = "Cuantiles teóricos (Normal)",
    y = "Cuantiles observados"
  ) +
  theme_minimal(base_size = 12)

 
 
3 ⚖️ Análisis de Línea Base (Comparación Interna del Grupo)
# Cargar librerías
library(rstatix)
library(dplyr)
# Preparar datos:
datos_linea_base <- datos %>%
  filter(Ha_voluntariado %in% c("Si", "No"))
# --- Check de Seguridad ---
# Comprobar si tenemos al menos dos grupos para comparar
if (n_distinct(datos_linea_base$Ha_voluntariado) < 2) {
  
  # Si no, crear tablas de NA para que el chunk de impresión no falle
  levene_resultado <- data.frame(df1=NA_real_, df2=NA_real_, statistic=NA_real_, p=NA_real_)
  t_resultado <- data.frame(Variable="Total_A", n1=NA_real_, n2=NA_real_, t=NA_real_, df=NA_real_, p=NA_real_)
  
} else {
  
  # Si todo está bien, correr las pruebas
  levene_resultado <- datos_linea_base %>%
    levene_test(Total_A ~ Ha_voluntariado)
  
  t_resultado <- datos_linea_base %>%
    t_test(Total_A ~ Ha_voluntariado, var.equal = FALSE) %>%
    select(Variable = .y., n1, n2, t = statistic, df, p = p)
}
Prueba de Homogeneidad de Varianzas (Levene) - Experiencia
Previa
| 
df1
 | 
df2
 | 
Estadístico F
 | 
p-value
 | 
| 
1
 | 
40
 | 
1.279
 | 
0.265
 | 
 
Prueba t de Muestras Independientes - Prosocialidad por Experiencia
Previa (Sí vs. No)
| 
Variable
 | 
N (No)
 | 
N (Sí)
 | 
Estadístico t
 | 
df
 | 
p-value
 | 
| 
Total_A
 | 
17
 | 
25
 | 
-0.429
 | 
38.15
 | 
0.67
 | 
 
 
4.📍 Identificación de Casos Atípicos
graficar_boxplot <- function(variable, nombre_dim, sujetos, entrevistados = c("9", "15", "19", "20", "41", "42")) {
  variable <- as.character(variable)
  sujetos <- as.character(sujetos)
  # Filtrar simultáneamente
  filtro <- !is.na(variable) & variable != "" & variable != "NA"
  variable_filtrada <- suppressWarnings(as.numeric(variable[filtro]))
  sujetos_filtrados <- sujetos[filtro]
  df <- data.frame(Sujeto = sujetos_filtrados, Puntaje = variable_filtrada)
  # Crear columna para color y leyenda
  df$Entrevistado <- ifelse(df$Sujeto %in% entrevistados, "Sí", "No")
  ggplot(df, aes(x = "", y = Puntaje)) +
    geom_boxplot(fill = "#D5DBDB", outlier.color = "#E74C3C") +
    geom_text(aes(label = Sujeto, color = Entrevistado),
              position = position_jitter(width = 0.2),
              size = 3.5) +
    scale_color_manual(values = c("Sí" = "#E74C3C", "No" = "#7F8C8D")) +
    labs(
      title = paste("Boxplot con sujetos:", nombre_dim),
      subtitle = "Sujetos entrevistados señalados en rojo",
      x = "", y = "Puntaje",
      color = "Entrevistado"
    ) +
    theme_minimal(base_size = 12) +
    theme(legend.position = "right")
}
# Graficar cada dimensión con etiquetas de Serie
graficar_boxplot(datos$Ayudar_A, "Ayudar", datos$Serie)

graficar_boxplot(datos$Compartir_A, "Compartir", datos$Serie)

graficar_boxplot(datos$Empatia_A, "Empatía", datos$Serie)

graficar_boxplot(datos$Total_A, "Total prosocialidad", datos$Serie)
