📚 Librería

library(readxl)   
library(dplyr)    
library(tidyr)    
library(knitr)    
library(psych)    
library(rstatix)  
library(ggplot2)  
library(flextable) 
library(treemapify) 
library(ggraph)     
library(igraph)     
library(glue)
library(janitor)

❓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?

Pregunta de investigación cualitativa

¿Qué cambios en la prosocialidad son reportados por los estudiantes universitarios después de su participación en el voluntariado curricular?

📥 Cargar datos y funciones de formato

# --- Cargar ambos conjuntos de datos ---
path_cuanti <- ("/Users/adrianaholguin/Desktop/Fase 1 cuanti.xlsx")
path_cuali <- ("/Users/adrianaholguin/Desktop/Fase 1 cuali.xlsx")

# Cargar los archivos
datos_cuanti_raw <- read_excel(path_cuanti)
datos_cuali_raw <- read_excel(path_cuali)

# --- Limpieza y Preparación ---
        
# 1. Preparar Datos Cuantitativos (datos)

datos <- datos_cuanti_raw %>%
  transmute(
    Sujeto = as.character(Sujeto),
    
    # --- Variables Sociodemográficas ---
    Edad = `X1..Edad`,
    Sexo = `X2..Sexo`,
    Estado_civil = `X3..Estado.civil`,
    Trabaja = `X4..Trabaja`,
    Residente = `X5..Residente`,
    Vive_con = `X6..Vive.con`,
    Grupo_vulnerabilidad = `X7..Grupo.de.vulnerabilidad`,
    Tipo_familia = `X8..Tipo.de.familia`,
    Num_personas_casa = `X9..Numero.de.personas.que.habitan.la.casa.familiar`,
    Nivel_socioeconomico = `X10..Nivel.socioeconomico.percibido`,
    
    # --- Variables de Percepción de Voluntariado ---
    Involucramiento_familiar = `X11..Involucramiento.familiar.con.la.comunidad.percibido`,
    Involucramiento_personal = `X12..Involucramiento.personal.con.su.comunidad.percibido`,
    Gusto_voluntariado = `X13..Le.gustaria.realizar.voluntariados.en.sus.materias`,
    Areas_interes = `X14..Areas.que.le.interesan.para.realizar.voluntariados`,
    
    # --- Variables de Experiencia (Sí/No) ---
    Ha_voluntariado = `X15..Ha.realizado.voluntariados`,
    Cantidad_voluntariados = `X16..Cantidad.de.voluntariados.realizados`,
    Quien_involucro = `X17..Quien.lo.involucro.en.los.voluntariados`,
    Tipos_voluntariados = `X18..Tipos.de.voluntariados.que.ha.realizado`,
    Motivacion_voluntariado = `X19..Que.le.motiva.a.realizar.voluntariados`,
    Percibe_beneficio = `X20..Percibe.algun.beneficio.por.realizar.voluntariados`,
    Beneficio_percibido = `X21..Beneficio.percibido.de.realizar.voluntariados`,
    Recuerdo_voluntariado = `X22..Lo.que.mas.recuerda.de.los.voluntariados`,
    Volveria_participar = `X23..Volveria.a.participar.en.algun.voluntariado`,
    Motivo_no_participar = `X24..Porque.cree.que.no.ha.realizado.voluntariados`,
    Le_gustaria_participar = `X25..Le.gustaria.participar.en.algun.voluntariado`,
    Beneficio_esperado = `X26..Beneficio.que.cree.que.le.dejaria.realizar.voluntariados`,
    
    # --- Ítems de la Escala (Pre-test) ---
    A_item1 = `X27..A_Item1`,
    A_item2 = `X28..A_Item2`,
    A_item3 = `X29..A_Item3`,
    A_item4 = `X30..A_Item4`,
    A_item5 = `X31..A_Item5`,
    A_item6 = `X32..A_Item6`,
    A_item7 = `X33..A_Item7`,
    A_item8 = `X34..A_Item8`,
    A_item9 = `X35..A_Item9`,
    A_item10 = `X36..A_Item10`,
    A_item11 = `X37..A_Item11`,
    A_item12 = `X38..A_Item12`,
    A_item13 = `X39..A_Item13`,
    A_item14 = `X40..A_Item14`,
    A_item15 = `X41..A_Item15`,
    A_item16 = `X42..A_Item16`,
    
    # --- Totales de la Escala (Pre-test) ---
    Ayudar_A = as.numeric(`X43..A_Ayudar`),
    Compartir_A = as.numeric(`X44..A_Compartir`),
    Empatia_A = as.numeric(`X45..A_Empatía`),
    Total_A = as.numeric(`X46..A_Total`),
    
    # --- Variable Cuali (Nivel) ---
    Nivel = case_when(
      Sujeto %in% c("S4", "S5", "S6") ~ "Alto",
      Sujeto %in% c("S1", "S2", "S3") ~ "Bajo",
      TRUE ~ NA_character_
    )
  )

# 2. Preparar Datos Cualitativos (datos_cuali)

datos_cuali <- datos_cuali_raw %>%
  select(Sujeto, Nivel, `Categoría`, `Subcategoría`, Frase) %>% 
  filter(!is.na(Sujeto)) # Limpiar filas vacías
          
cat("--- Carga de Datos Completa ---\n")
## --- Carga de Datos Completa ---
cat(paste("Datos Cuantitativos (datos) cargados con", nrow(datos), "filas.\n"))
## Datos Cuantitativos (datos) cargados con 42 filas.
cat(paste("Datos Cualitativos (datos_cuali) cargados con", nrow(datos_cuali), "filas.\n"))
## Datos Cualitativos (datos_cuali) cargados con 133 filas.

📊 Análisis Cuantitativo

📈 Estadística Descriptiva de la Escala

# 1. Preparar datos: Pivotar las 4 dimensiones
datos_largos_escala <- datos %>%
  select(Ayudar_A, Compartir_A, Empatia_A, Total_A) %>%
  pivot_longer(
    cols = everything(),
    names_to = "Dimension",
    values_to = "Puntuacion"
  )

# 2. Calcular descriptivos (base)
tabla_descriptivos_base <- datos_largos_escala %>%
  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")))

# --- Dividir en dos tablas ---
tabla_desc_1 <- tabla_descriptivos_base %>%
  select(Dimension, N, Media, DE)

tabla_desc_2 <- tabla_descriptivos_base %>%
  select(Dimension, Mediana, Minimo, Maximo)
Estadística Descriptiva (Pre-test): Tendencia Central
Dimensión N Media DE
Ayudar_A 42 21.93 3.54
Compartir_A 42 12.52 1.63
Empatia_A 42 20.02 2.78
Total_A 42 53.60 7.32

Estadística Descriptiva (Pre-test): Distribución
Dimensión Mediana Mín Máx
Ayudar_A 22 15 28
Compartir_A 12 8 15
Empatia_A 20 15 24
Total_A 53 37 67


📦 Gráfico Boxplot General de la Escala

# Etiquetas personalizadas para las dimensiones
facet_labels <- c(
  "Ayudar_A" = "Ayudar",
  "Compartir_A" = "Compartir",
  "Empatia_A" = "Empatía",
  "Total_A" = "Total Escala"
)

ggplot(datos_largos_escala, aes(x = Dimension, y = Puntuacion, fill = Dimension)) +
  geom_boxplot(alpha = 0.8, color = "gray30") +
  
  # Facetas con etiquetas personalizadas (igual que en los Q-Q plots)
  facet_wrap(~ Dimension, scales = "free", labeller = as_labeller(facet_labels)) +
  
  # Títulos y etiquetas
  labs(
    title = "Distribución de Puntuaciones de la Escala (Pre-test)",
    x = "Dimensión",
    y = "Puntuación"
  ) +
  
  # Tema con más contraste
  theme_bw(base_size = 13) +
  theme(
    legend.position = "none", # Ocultar leyenda redundante
    strip.background = element_rect(fill = "#34495E", color = NA),   # fondo oscuro en las tiras
    strip.text = element_text(face = "bold", size = 12, color = "white"), # texto blanco y negrita
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14)
  ) +
  
  # Paleta de colores más estética
  scale_fill_brewer(palette = "Set3")

🔔 Pruebas de Normalidad (Shapiro-Wilk)

# 1. Calcular la prueba de Shapiro-Wilk para cada dimensión
shapiro_ayudar <- shapiro_test(datos$Ayudar_A)
shapiro_compartir <- shapiro_test(datos$Compartir_A)
shapiro_empatia <- shapiro_test(datos$Empatia_A)
shapiro_total <- shapiro_test(datos$Total_A)

# 2. Unir los resultados en una sola tabla para imprimir
tabla_para_imprimir_shapiro <- bind_rows(
  shapiro_ayudar, 
  shapiro_compartir, 
  shapiro_empatia, 
  shapiro_total
) %>%

  select(variable, statistic, p.value) %>% 
  
  mutate(variable = c("Ayudar_A", "Compartir_A", "Empatia_A", "Total_A"))
Pruebas de Normalidad (Shapiro-Wilk)
Dimensión Estadístico W p-value
Ayudar_A 0.953 0.083
Compartir_A 0.932 0.016
Empatia_A 0.934 0.018
Total_A 0.960 0.154


🧐 Gráficos Q-Q Plot (Visualización de Normalidad)

ggplot(datos_largos_escala, aes(sample = Puntuacion)) +
  # Puntos con color turquesa y transparencia
  stat_qq(color = "#1ABC9C", size = 2, alpha = 0.8) +
  
  # Línea de referencia más visible
  stat_qq_line(color = "gray30", linetype = "dashed", linewidth = 1) +
  
  # Facetas con etiquetas personalizadas
  facet_wrap(~ Dimension, scales = "free", labeller = labeller(Dimension = c(
    "Ayudar_A" = "Ayudar",
    "Compartir_A" = "Compartir",
    "Empatia_A" = "Empatía",
    "Total_A" = "Total Escala"
  ))) +
  
  # Títulos y etiquetas
  labs(
    title = "Gráficos Q-Q Plot de las Dimensiones (Pre-test)",
    subtitle = "Los puntos deben seguir la línea discontinua para la normalidad",
    x = "Cuantiles Teóricos (Normal)",
    y = "Cuantiles de la Muestra"
  ) +
  
  # Tema con más contraste
  theme_bw(base_size = 13) +
  theme(
    strip.background = element_rect(fill = "#34495E", color = NA),   # fondo oscuro en las tiras
    strip.text = element_text(face = "bold", size = 12, color = "white"), # texto blanco y negrita
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
    plot.subtitle = element_text(hjust = 0.5, size = 11, color = "gray30")
  )

⚖️ Análisis de Línea Base (Prueba t: Sí vs. No)

# 1. Calcular Prueba de Levene (Homogeneidad de Varianzas)
#    Usamos el dataframe 'datos'
levene_test_result <- datos %>%
  levene_test(Total_A ~ Ha_voluntariado)

# 2. Calcular Prueba t de Muestras Independientes
t_test_result <- datos %>%
  t_test(Total_A ~ Ha_voluntariado, var.equal = TRUE) # Asumimos varianzas iguales

# 3. Limpiar las tablas para impresión
tabla_para_imprimir_levene <- levene_test_result %>%
  select(df1, df2, statistic, p)

tabla_para_imprimir_ttest <- t_test_result %>%
  select(statistic, df, p)
Prueba de Homogeneidad de Varianzas (Levene)
df1 df2 Estadístico F p-value
1 40 1.627 0.209

Prueba t de Muestras Independientes (Sí vs. No)
Estadístico t df p-value
-0.387 40 0.7


2 🙋 Análisis Cualitativo

df_frecuencias_cuali <- datos_cuali %>%
  count(`Categoría`, sort = TRUE) %>%
  rename(Frecuencia = n)

ggplot(df_frecuencias_cuali, aes(x = reorder(`Categoría`, Frecuencia), 
                                 y = Frecuencia, 
                                 fill = `Categoría`)) +
  geom_bar(stat = "identity") +
  coord_flip() + # Voltear los ejes para que los nombres se lean bien
  geom_text(aes(label = Frecuencia), hjust = -0.2, size = 3.5) + # Añadir etiquetas de número
  labs(
    title = "Frecuencia de Categorías Principales en las Entrevistas (Fase 1)",
    x = "Categoría",
    y = "Número de Citas (Recurrencias)"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set3") # Paleta de colores suaves y variados

2.1 📍️ Justificación de la Muestra Cualitativa (Casos Atípicos)

graficar_boxplot_con_etiquetas <- function(datos_df, col_puntaje, nombre_dim) {
  
  entrevistados <- c("15", "41", "20", "9", "19", "42")
  
  # Preparar el dataframe para esta dimensión
  df_plot <- data.frame(
    Sujeto = datos_df$Sujeto,
    Puntaje = datos_df[[col_puntaje]]
  ) %>%
    filter(!is.na(Puntaje)) %>%
    mutate(
      Entrevistado = ifelse(Sujeto %in% entrevistados, "Sí", "No")
    )

  # 2. Crear el gráfico
  ggplot(df_plot, aes(x = "", y = Puntaje)) +
    geom_boxplot(fill = "#D5DBDB", outlier.color = NA) + 
    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("Identificación de Sujetos de Entrevista:", nombre_dim),
      subtitle = "Sujetos entrevistados señalados en rojo",
      x = "", y = "Puntaje",
      color = "Entrevistado"
    ) +
    theme_minimal(base_size = 12) +
    theme(legend.position = "right")
}

graficar_boxplot_con_etiquetas(datos, "Total_A", "Total Prosocialidad")

Análisis de Métodos Mixtos (Integración Cuali-Cuanti)

Comparación de Discurso (Alto vs. Bajo)

df_triang_1 <- datos_cuali %>%
  # Agrupar por Nivel (Alto/Bajo) y Subcategoría
  group_by(Nivel, `Subcategoría`) %>%
  # Contar el número de citas (filas) en cada grupo
  summarise(Recurrencias = n(), .groups = "drop") %>%
  # Filtrar 'NA' en Nivel (si los hubiera)
  filter(!is.na(Nivel))

# 2. Crear el gráfico de barras comparativo
ggplot(df_triang_1, aes(x = reorder(`Subcategoría`, Recurrencias), 
                           y = Recurrencias, 
                           fill = Nivel)) +
  geom_bar(stat = "identity", position = "dodge") +
  coord_flip() + # Voltear los ejes para que se lean las categorías
  
  # Títulos (sin emojis)
  labs(
    title = "Triangulación 1: Recurrencia de Subcategorías por Nivel",
    subtitle = "Comparación del discurso cualitativo ('Alto' vs. 'Bajo')",
    x = "Subcategoría",
    y = "Número de Citas (Recurrencias)",
    fill = "Nivel (Cuanti)"
  ) +
  theme_minimal() +
  theme(
    # Achicamos el texto del eje Y para que quepan todas las subcategorías
    axis.text.y = element_text(size = 8) 
  )

Integración de Puntuaciones (Cuanti) y Categorías (Cuali)

# 1. Preparar los datos cuantitativos
datos_cuanti_scores <- datos %>%
  select(Sujeto, Total_A)

# 2. Unir los puntajes (cuanti) con las citas (cuali)
df_triang_2 <- datos_cuali %>%
  
  mutate(Sujeto = as.character(Sujeto)) %>% 
  
  left_join(datos_cuanti_scores, by = "Sujeto") %>%
  
  filter(!is.na(Total_A))

# 3. Crear el gráfico 
ggplot(df_triang_2, aes(x = reorder(`Categoría`, Total_A, median), 
                        y = Total_A)) +
  geom_jitter(aes(color = Nivel), width = 0.2, alpha = 0.7, size = 2) +
  stat_summary(fun = median, geom = "crossbar", width = 0.5, color = "black") +
  coord_flip() +
  labs(
    title = "Triangulación 2: Puntajes de Prosocialidad por Categoría Cualitativa",
    subtitle = "Cada punto representa un sujeto; la barra negra indica la mediana",
    x = "Categoría Cualitativa",
    y = "Puntuación Total de Prosocialidad",
    color = "Nivel (Cuanti)"
  ) +
  theme_bw(base_size = 12)