📚 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 General

¿Qué relación existe entre la participación en un voluntariado curricular y el desarrollo de conductas prosociales en estudiantes universitarios?

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

📊 Estadística descriptiva sociodemográfica

Variables de respuesta única

# Función para tabla APA
tabla_apa_unica <- function(variable, nombre_variable) {
  variable <- as.character(variable)
  variable <- trimws(variable)
  variable <- variable[variable != "" & !is.na(variable)]

  frec <- table(variable)
  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 tablas
 cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:16pt; 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>'))

  # Tabla estilo APA
  print(kable(tabla, format = "html", align = c("c", "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>')
}

# Nombres estilo APA
nombres_apa <- c(
  "Edad" = "edad de los participantes",
  "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",
  "Num_personas_casa" = "número de personas en el hogar",
  "Nivel_socioeconomico" = "nivel socioeconómico percibido",
  "Involucramiento_familiar" = "involucramiento familiar en voluntariado",
  "Involucramiento_personal" = "involucramiento personal en voluntariado",
  "Gusto_voluntariado" = "le gustaría realizar voluntariados en sus materias",
  "Ha_voluntariado" = "ha realizado voluntariados previamente"
)

# Mostrar tablas APA
contador <- 1
for (var in names(nombres_apa)) {
  tabla_apa_unica(datos[[var]], nombre_variable = nombres_apa[[var]])
  contador <- contador + 1
}
Distribución de edad de los participantes
Categoría Frecuencia % Frecuencia % Acumulado
18 23 54.8% 54.8%
19 12 28.6% 83.4%
20 3 7.1% 90.5%
21 2 4.8% 95.3%
22 2 4.8% 100.1%
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%
Union 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
Foraneo 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%
Roomies 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 número de personas en el hogar
Categoría Frecuencia % Frecuencia % Acumulado
2 1 2.4% 2.4%
3 12 28.6% 31%
4 12 28.6% 59.6%
5 12 28.6% 88.2%
6 3 7.1% 95.3%
7 2 4.8% 100.1%
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 involucramiento familiar en voluntariado
Categoría Frecuencia % Frecuencia % Acumulado
1 1 2.4% 2.4%
10 1 2.4% 4.8%
2 6 14.3% 19.1%
3 2 4.8% 23.9%
4 5 11.9% 35.8%
5 9 21.4% 57.2%
6 6 14.3% 71.5%
7 5 11.9% 83.4%
8 4 9.5% 92.9%
9 3 7.1% 100%
Distribución de involucramiento personal en voluntariado
Categoría Frecuencia % Frecuencia % Acumulado
1 4 9.5% 9.5%
2 7 16.7% 26.2%
3 5 11.9% 38.1%
4 6 14.3% 52.4%
5 6 14.3% 66.7%
6 8 19% 85.7%
7 3 7.1% 92.8%
8 1 2.4% 95.2%
9 2 4.8% 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%

Variable de respuesta múltiple

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.

Distribución de Áreas de interés para realizar voluntariados (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Ambiental-ecologíco 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%

🤝 Sujetos que han participado previamente en voluntariados (n = 25)

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
Autoestima 2 3.1% 3.1%
Conexión 6 9.4% 12.5%
Empatía 19 29.7% 42.2%
Experiencia 13 20.3% 62.5%
Habilidades 9 14.1% 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%

🧤 Sujetos que no han participado previamente en voluntariados (n = 17)

tabla_apa_unica <- function(variable, nombre_variable) {
  variable <- as.character(variable)
  variable <- trimws(variable)
  variable <- variable[variable != "" & !is.na(variable) & toupper(variable) != "NA"]

  frec <- table(variable)
  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, '</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>')
}

Variable de respuesta única

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.

Variable: Motivos para no participar en voluntariado

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%

Variable: Beneficios esperados del voluntariado

Distribución de Beneficios esperados del voluntariado (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Amistades 5 11.6% 11.6%
Aprendizaje 13 30.2% 41.8%
Aventura 3 7% 48.8%
Consciencia 8 18.6% 67.4%
Curriculum 5 11.6% 79%
Satisfacción 9 20.9% 99.9%

🧭 Pruebas de normalidad Escala de Prosocialidad

Nota: El “Warning in ks.test.default” antes de cada prueba, se debe a que la prueba de Kolmogorov-Smirnov presentó valores repetidos (‘ties’) en las variables evaluadas, lo cual puede afectar la precisión del estadístico D. Por ello, se privilegió la interpretación de la prueba de Shapiro-Wilk como criterio principal de normalidad.

prueba_normalidad <- function(variable, nombre_dim) {
  variable <- as.character(variable)
  variable <- trimws(variable)
  variable <- variable[!is.na(variable) & variable != "" & variable != "NA"]
  variable <- as.numeric(variable)

  cat(paste0("🧩 Variable: ", nombre_dim, "\n\n"))

  if (length(variable) < 3) {
    cat("⚠️ No se puede aplicar prueba de normalidad: menos de 3 datos válidos.\n")
  } else {
    # Shapiro-Wilk
    shapiro <- shapiro.test(variable)

    # Kolmogorov-Smirnov ajustado
    ks <- ks.test(variable, "pnorm", mean(variable), sd(variable))

    # Mostrar resultados 
    cat("🧪 Shapiro-Wilk:\n")
    print(shapiro)
    cat("\n🧪 Kolmogorov-Smirnov (ajustada):\n")
    print(ks)
  }

  cat("\n", strrep("─", 50), "\n\n")
}

# Aplicar a cada dimensión
prueba_normalidad(datos$Ayudar_A, "Ayudar")
## 🧩 Variable: Ayudar
## Warning in ks.test.default(variable, "pnorm", mean(variable), sd(variable)):
## ties should not be present for the one-sample Kolmogorov-Smirnov test
## 🧪 Shapiro-Wilk:
## 
##  Shapiro-Wilk normality test
## 
## data:  variable
## W = 0.953, p-value = 0.08277
## 
## 
## 🧪 Kolmogorov-Smirnov (ajustada):
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  variable
## D = 0.12535, p-value = 0.5242
## alternative hypothesis: two-sided
## 
## 
##  ──────────────────────────────────────────────────
prueba_normalidad(datos$Compartir_A, "Compartir")
## 🧩 Variable: Compartir
## Warning in ks.test.default(variable, "pnorm", mean(variable), sd(variable)):
## ties should not be present for the one-sample Kolmogorov-Smirnov test
## 🧪 Shapiro-Wilk:
## 
##  Shapiro-Wilk normality test
## 
## data:  variable
## W = 0.93241, p-value = 0.01563
## 
## 
## 🧪 Kolmogorov-Smirnov (ajustada):
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  variable
## D = 0.15943, p-value = 0.2361
## alternative hypothesis: two-sided
## 
## 
##  ──────────────────────────────────────────────────
prueba_normalidad(datos$Empatia_A, "Empatía")
## 🧩 Variable: Empatía
## Warning in ks.test.default(variable, "pnorm", mean(variable), sd(variable)):
## ties should not be present for the one-sample Kolmogorov-Smirnov test
## 🧪 Shapiro-Wilk:
## 
##  Shapiro-Wilk normality test
## 
## data:  variable
## W = 0.93404, p-value = 0.01777
## 
## 
## 🧪 Kolmogorov-Smirnov (ajustada):
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  variable
## D = 0.11968, p-value = 0.5843
## alternative hypothesis: two-sided
## 
## 
##  ──────────────────────────────────────────────────
prueba_normalidad(datos$Total_A, "Total prosocialidad")
## 🧩 Variable: Total prosocialidad
## Warning in ks.test.default(variable, "pnorm", mean(variable), sd(variable)):
## ties should not be present for the one-sample Kolmogorov-Smirnov test
## 🧪 Shapiro-Wilk:
## 
##  Shapiro-Wilk normality test
## 
## data:  variable
## W = 0.95451, p-value = 0.0938
## 
## 
## 🧪 Kolmogorov-Smirnov (ajustada):
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  variable
## D = 0.13979, p-value = 0.3846
## alternative hypothesis: two-sided
## 
## 
##  ──────────────────────────────────────────────────

## 📈 Gráficos Q-Q plot de normalidad Escala de Prosocialidad

graficar_qqplot_individual <- function(variable, nombre_dim) {
  variable <- as.character(variable)
  variable <- trimws(variable)
  variable <- variable[!is.na(variable) & variable != "" & variable != "NA"]
  variable <- suppressWarnings(as.numeric(variable))
  variable <- variable[!is.na(variable)]

  nombre_dim <- trimws(nombre_dim)

  n <- length(variable)
  df <- data.frame(
    observado = sort(variable),
    teorico = qnorm(ppoints(n))
  )

  plot <- ggplot(df, aes(x = teorico, y = observado)) +
    geom_point(color = "#3498DB", size = 2) +
    geom_abline(slope = 1, intercept = 0, color = "#E74C3C",
                linetype = "dashed", linewidth = 1) +
    labs(
      title = paste0("Q-Q Plot: ", nombre_dim),
      x = "Cuantiles teóricos (Normal)",
      y = "Cuantiles observados"
    ) +
    theme_minimal(base_size = 12)

  print(plot)
}

graficar_qqplot_individual(datos$Ayudar_A, "Ayudar A")

graficar_qqplot_individual(datos$Empatia_A, "Empatía A")

graficar_qqplot_individual(datos$Compartir_A, "Compartir A")

graficar_qqplot_individual(datos$Total_A, "TotalA A")

📍 Gráfico Bloxplot para identificación de sujetos fuera de los parámetros

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)