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