📚 Librería

library(readxl)   
library(readr)
library(broom)
library(tidyverse)
library(scales)
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

# 1. CARGA DE ARCHIVOS
path_cuanti <- "/Users/adrianaholguin/Desktop/Fase 2 cuanti.xlsx"
path_cuali  <- "/Users/adrianaholguin/Desktop/Fase 2 cuali.xlsx"

datos_cuanti_raw <- read_excel(path_cuanti)
datos_cuali_raw  <- read_excel(path_cuali)

# 2. LIMPIEZA CUANTITATIVA 

datos_cuanti_listo <- datos_cuanti_raw %>%
  transmute(
    Sujeto = as.character(Sujeto),
    
    # --- Datos sociodemográficos clave ---
    Edad   = as.numeric(`X1..Edad`),
    Sexo   = factor(`X2..Sexo`),                # Femenino / Masculino / Otro
    EstadoCivil = factor(`X3..Estado.civil`),
    Trabaja     = ifelse(`X4..Trabaja` == "Si", 1, 0),
    Residente   = factor(`X5..Residente`),      # Local / Foráneo
    ViveCon     = factor(`X6..Vive.con`),
    GrupoVulnerabilidad = factor(`X7..Grupo.de.vulnerabilidad`),
    TipoFamilia = factor(`X8..Tipo.de.familia`),
    NumPersonasCasa = as.numeric(`X9..Numero.de.personas.que.habitan.la.casa.familiar`),
    NSEpercibido = as.numeric(`X10..Nivel.socioeconomico.percibido`),
    InvolucramientoFamiliar = as.numeric(`X11..Involucramiento.familiar.con.la.comunidad.percibido`),
    InvolucramientoPersonal = as.numeric(`X12..Involucramiento.personal.con.su.comunidad.percibido`),
    VoluntariadoPrevio = factor(`X15..Ha.realizado.voluntariados`, 
                            levels = c("No", "Si")),
    
    # --- Prosocialidad Pre (Escala Caprara) ---
    A_Total     = as.numeric(`X46..A_Total`),
    A_Ayudar    = as.numeric(`X43..A_Ayudar`),
    A_Compartir = as.numeric(`X44..A_Compartir`),
    A_Empatia   = as.numeric(`X45..A_Empatía`),
    
    # --- Prosocialidad Post (Escala Caprara) ---
    B_Total     = as.numeric(`X66..B_Total`),
    B_Ayudar    = as.numeric(`X63..B_Ayudar`),
    B_Compartir = as.numeric(`X64..B_Compartir`),
    B_Empatia   = as.numeric(`X65..B_Empatía`),
    
    # --- Variables de cambio ---
    Cambio_Total     = B_Total - A_Total,
    Cambio_Ayudar    = B_Ayudar - A_Ayudar,
    Cambio_Compartir = B_Compartir - A_Compartir,
    Cambio_Empatia   = B_Empatia - A_Empatia
  )

# 3. LIMPIEZA CUALITATIVA 
datos_cuali_listo <- datos_cuali_raw %>%
  select(
    Sujeto   = 1,            
    Nivel_Excel = 3,          
    `Familia Categorial`, 
    `Categoría`, 
    Testimonio = 7            
  ) %>%
  filter(!is.na(Sujeto)) %>%
  mutate(Sujeto = as.character(Sujeto))

# 4. INTEGRACIÓN FINAL
datos_integrados <- datos_cuanti_listo %>%
  inner_join(datos_cuali_listo, by = "Sujeto")

⚖️ Análisis Inferencial (Prueba de Wilcoxon)

# --- 1) Diferencias Pre vs. Post desde datos_cuanti_listo ---
datos_diferencias <- datos_cuanti_listo %>%
  transmute(
    Ayudar    = B_Ayudar    - A_Ayudar,
    Compartir = B_Compartir - A_Compartir,
    Empatia   = B_Empatia   - A_Empatia,
    Total     = B_Total     - A_Total
  )

# --- 2) Formato largo ---
datos_diferencias_largo <- datos_diferencias %>%
  tidyr::pivot_longer(
    cols = everything(),
    names_to = "Dimension",
    values_to = "Diferencia"
  ) %>%
  dplyr::filter(!is.na(Diferencia))

# --- 3) Wilcoxon de una muestra (mu = 0) ---
wilcox_resultados <- datos_diferencias_largo %>%
  dplyr::group_by(Dimension) %>%
  rstatix::wilcox_test(Diferencia ~ 1, mu = 0, detailed = TRUE) %>%
  dplyr::select(Dimension, statistic, p)

# --- 4) Tamaño de efecto (r) ---
effect_size_resultados <- datos_diferencias_largo %>%
  dplyr::group_by(Dimension) %>%
  rstatix::wilcox_effsize(Diferencia ~ 1, mu = 0) %>%
  dplyr::select(Dimension, effsize, magnitude)

# --- 5) Integración y traducción ---
tabla_inferencia_final <- dplyr::left_join(wilcox_resultados, effect_size_resultados, by = "Dimension") %>%
  dplyr::select(Dimension, statistic, p, effsize, magnitude) %>%
  dplyr::arrange(factor(Dimension, levels = c("Ayudar", "Compartir", "Empatia", "Total"))) %>%
  dplyr::mutate(
    Dimension = dplyr::recode(Dimension, "Empatia" = "Empatía"),
    p = dplyr::if_else(p < 0.001, "< .001", as.character(round(p, 3))),
    magnitude = dplyr::case_when(
      magnitude == "small" ~ "Pequeño",
      magnitude == "moderate" ~ "Mediano",
      magnitude == "large" ~ "Grande",
      TRUE ~ magnitude
    )
  )
Resultados de las Pruebas de Hipótesis (Wilcoxon Pre vs. Post)
Dimensión Estadístico (W) p-value Efecto (r) Magnitud
Ayudar 484.5 < .001 0.603 Grande
Compartir 59.5 0.669 0.018 Pequeño
Empatía 377.5 0.01 0.413 Mediano
Total 622.0 < .001 0.590 Grande

Interpretación: Un p-value menor a 0.05 indica cambio estadísticamente significativo entre el Pre-test y el Post-test. El tamaño del efecto (r) señala la magnitud práctica del cambio: pequeño, mediano o grande.


🙋 Análisis Cualitativo

🌳 Frecuencia de Familias categoriales

# --- 1. Crear tabla de frecuencias por Familia Categorial ---
df_frecuencias_familias <- datos_cuali_listo %>%
  count(`Familia Categorial`, sort = TRUE) %>%
  rename(Frecuencia = n)

ggplot(df_frecuencias_familias, aes(x = reorder(`Familia Categorial`, Frecuencia), 
                                    y = Frecuencia, 
                                    fill = `Familia Categorial`)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  geom_text(aes(label = Frecuencia), 
            position = position_stack(vjust = 0.5), # etiquetas al centro
            color = "black", size = 3.5) +
  labs(
    title = "Frecuencia de Familias Categoriales en las Entrevistas (Fase 2)",
    x = "Familia Categorial",
    y = "Número de Citas (Recurrencias)"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set3")

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

# 1. Usar la base integrada
df_triang_2 <- datos_integrados %>%
  filter(!is.na(A_Total))

# 2. Crear el gráfico
ggplot(df_triang_2, aes(x = reorder(`Categoría`, A_Total, median), 
                        y = A_Total)) +
  geom_jitter(aes(color = Nivel_Excel), 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: 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 (Pre)",
    color = "Nivel (Cuali)"
  ) +
  theme_bw(base_size = 12)