Análisis descriptivos en RStudio
1 Introducción
Esta guía tiene como objetivo brindar a los estudiantes una herramienta práctica para realizar el análisis descriptivo de ítems utilizando RStudio. Aprenderás a realizar una tabla de descripción de los participantes, calcular estadísticos descriptivos de los ítems (como media, desviación estándar, asimetría y curtosis), visualizar la distribución de respuestas mediante gráficos tipo Likert y evaluar la normalidad univariada y multivariada. Esta guía está diseñada para facilitar la exploración inicial de escalas en investigaciones psicométricas.
2 Configuración inicial
2.1 Limpiar el entorno de trabajo
Este comando elimina todos los objetos existentes en tu entorno de trabajo, asegurando que no interfieran con el nuevo análisis.
2.2 Establecer el directorio de trabajo
Aquí definimos la carpeta donde están nuestros archivos. Es importante que el archivo df_final.xlsx esté dentro de esta carpeta.
💡 Cuando copies una ruta desde el explorador de Windows, recuerda cambiar las barras \ por /.
3 Cargar librerías necesarias
#Procedemos a istalar librerías que se utilizarán
#install.packages("psych)
#install.packages("corrplot)
# Cargamos las librerías
library(dplyr)Warning: package 'dplyr' was built under R version 4.4.3
Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
Warning: package 'readxl' was built under R version 4.4.3
Warning: package 'openxlsx' was built under R version 4.4.3
Warning: package 'psych' was built under R version 4.4.3
corrplot 0.94 loaded
4 Cargar la data frame final
Se carga la base de datos limpia exportada de la sesión anterior. Usamos la función read_excel() para leer el archivo df_final.xlsx. A ese archivo nuevamente le llamaremos df (abreviado de data frame). Posterior mente con la función glimpse() podremos ver la estructura de nuestra data frame.
Rows: 53
Columns: 37
$ ID <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16…
$ Edad <dbl> 21, 19, 21, 19, 23, 21, 43, 22, 42, 18, 34, 18, 34, 3…
$ Lugar_nacimiento <chr> "Fuera de Lima", "Fuera de Lima", "Fuera de Lima", "F…
$ Estado_civil <chr> "Soltero", "Soltero", "Soltero", "Soltero", "Soltero"…
$ Sexo <chr> "Masculino", "Masculino", "Masculino", "Femenino", "M…
$ Orientacion <chr> "Heterosexual", "Heterosexual", "Heterosexual", "Hete…
$ Vive_con <chr> "Solo con mi madre", "Con mi madre y padre", "Solo co…
$ Trabajo <chr> "Tengo un trabajo temporal", "Estoy desempleado", "Te…
$ Nivel_educativo <chr> "Secundaria incompleta", "Secundaria completa", "Univ…
$ Sueño <chr> "Sí", "No", "No", "No", "No", "No", "Sí", "Sí", "Sí",…
$ Sobrepeso <chr> "No", "No", "Sí", "Sí", "Sí", "Sí", "No", "No", "Sí",…
$ AFA1 <dbl> 3, 2, 2, 3, 3, 5, 1, 3, 4, 5, 4, 3, 5, 5, 1, 4, 2, 3,…
$ AFA2 <dbl> 3, 3, 3, 4, 4, 5, 1, 3, 3, 4, 4, 3, 5, 3, 1, 3, 2, 5,…
$ AFA3 <dbl> 2, 1, 2, 3, 3, 5, 1, 4, 4, 5, 4, 3, 5, 5, 1, 2, 3, 3,…
$ AFA4 <dbl> 3, 2, 2, 3, 4, 5, 1, 2, 3, 4, 4, 3, 3, 2, 1, 2, 1, 3,…
$ AFA5 <dbl> 2, 3, 2, 3, 5, 5, 1, 3, 5, 5, 5, 4, 5, 5, 1, 5, 2, 5,…
$ AFA6 <dbl> 2, 3, 3, 4, 4, 5, 3, 1, 3, 5, 4, 4, 2, 3, 1, 4, 2, 5,…
$ AFA7 <dbl> 4, 2, 1, 2, 5, 5, 3, 3, 5, 5, 4, 3, 5, 5, 1, 4, 2, 4,…
$ AFA8 <dbl> 2, 3, 2, 3, 4, 5, 3, 3, 2, 5, 4, 3, 2, 3, 1, 3, 2, 4,…
$ AFA9 <dbl> 2, 2, 2, 3, 3, 5, 1, 3, 5, 4, 4, 3, 5, 5, 1, 1, 2, 5,…
$ AFA10 <dbl> 1, 2, 2, 2, 3, 5, 1, 1, 3, 3, 4, 3, 2, 2, 1, 1, 1, 5,…
$ AFA11 <dbl> 1, 1, 1, 2, 1, 5, 1, 1, 2, 4, 4, 3, 2, 1, 1, 1, 1, 5,…
$ AFA12 <dbl> 3, 1, 2, 2, 3, 5, 1, 1, 5, 5, 5, 3, 5, 5, 1, 3, 2, 5,…
$ AFA13 <dbl> 4, 3, 3, 3, 4, 5, 1, 2, 5, 5, 5, 3, 5, 5, 1, 4, 2, 5,…
$ AFA14 <dbl> 3, 3, 2, 3, 4, 5, 1, 1, 3, 5, 5, 4, 2, 5, 1, 4, 2, 5,…
$ ASP1 <dbl> 3, 2, 2, 4, 3, 5, 1, 2, 5, 5, 4, 4, 5, 5, 1, 4, 2, 5,…
$ ASP2 <dbl> 3, 2, 2, 3, 3, 5, 1, 3, 5, 5, 5, 4, 5, 5, 1, 3, 2, 5,…
$ ASP3 <dbl> 4, 2, 3, 3, 3, 5, 1, 3, 5, 5, 4, 4, 5, 5, 1, 4, 2, 5,…
$ ASP4 <dbl> 3, 2, 2, 3, 4, 5, 1, 2, 5, 5, 4, 3, 5, 5, 1, 4, 2, 5,…
$ ASP5 <dbl> 5, 1, 2, 3, 4, 5, 1, 3, 5, 5, 5, 4, 5, 5, 1, 2, 2, 3,…
$ ASP6 <dbl> 4, 2, 3, 3, 4, 5, 1, 1, 3, 5, 4, 4, 2, 2, 1, 4, 2, 5,…
$ ASP7 <dbl> 3, 2, 3, 4, 4, 5, 2, 1, 3, 5, 4, 4, 3, 3, 1, 4, 2, 5,…
$ ASP8 <dbl> 4, 1, 2, 2, 4, 5, 3, 3, 5, 5, 4, 3, 5, 5, 1, 4, 2, 5,…
$ ASP9 <dbl> 4, 2, 2, 4, 4, 5, 4, 2, 3, 5, 4, 3, 2, 3, 1, 3, 2, 5,…
$ ASP10 <dbl> 4, 1, 3, 3, 2, 5, 2, 4, 5, 5, 5, 4, 5, 5, 1, 2, 3, 5,…
$ ASP11 <dbl> 3, 2, 2, 3, 3, 5, 3, 2, 5, 5, 4, 4, 5, 5, 1, 2, 2, 5,…
$ ASP12 <dbl> 3, 2, 2, 3, 4, 5, 1, 1, 3, 4, 4, 3, 2, 3, 1, 3, 2, 4,…
5 Descripción de participantes
En ta sección se genera una tabla resumen con las variables sociodemográficas de interés. Esta tabla facilita la descripción de los participantes del estudio. Se utiliza la función generate_summary() para resumir variables como edad, sexo, lugar de nacimiento, estado civil, orientación sexual, entre otras.
Luego, la tabla generada se transforma en un formato adecuado para su exportación usando generate_table() y se guarda automáticamente en un archivo Excel (.xlsx) en la carpeta Output, con el nombre Tabla_Total.xlsx.
Tabla_Total <- generate_summary(
data = df,
variables = c("Edad", "Lugar_nacimiento", "Estado_civil", "Sexo",
"Orientacion", "Vive_con", "Trabajo",
"Nivel_educativo", "Sueño", "Sobrepeso")
)
summary_Tabla_Total <- generate_table(Tabla_Total)
summary_Tabla_Total %>% openxlsx::write.xlsx(
.,
file = "Output/Tabla_Total.xlsx",
overwrite = TRUE
)6 Análisis de los ítems
Este bloque de código realiza un análisis preliminar de los ítems de la escala a validar, centrándose en los estadísticos descriptivos y la evaluación de la normalidad multivariada.
6.1 Selección de ítems
Se extraen los ítems correspondientes a la escala de interés (en este caso, del AFA1 al AFA14) desde la base de datos principal df. Esto permite trabajar únicamente con las variables relevantes para el análisis psicométrico.
6.2 Estadísticos descriptivos
Se obtiene un resumen estadístico de cada ítem utilizando la función describe() del paquete psych. Esta función proporciona indicadores clave como media, desviación estándar, asimetría (skew), curtosis, y el rango de respuestas, útiles para identificar ítems problemáticos o poco informativos.
vars n mean sd median trimmed mad min max range skew kurtosis se
AFA1 1 53 3.04 1.34 3 3.05 1.48 1 5 4 0.07 -1.15 0.18
AFA2 2 53 3.04 1.18 3 3.05 1.48 1 5 4 0.07 -0.88 0.16
AFA3 3 53 2.96 1.37 3 2.95 1.48 1 5 4 0.20 -1.25 0.19
AFA4 4 53 2.62 1.16 2 2.53 1.48 1 5 4 0.53 -0.53 0.16
AFA5 5 53 3.57 1.38 4 3.70 1.48 1 5 4 -0.46 -1.17 0.19
AFA6 6 53 3.09 1.26 3 3.12 1.48 1 5 4 -0.06 -0.95 0.17
AFA7 7 53 3.04 1.34 3 3.05 1.48 1 5 4 0.12 -1.23 0.18
AFA8 8 53 2.91 1.21 3 2.88 1.48 1 5 4 0.37 -0.89 0.17
AFA9 9 53 3.02 1.51 3 3.02 1.48 1 5 4 0.07 -1.49 0.21
AFA10 10 53 2.32 1.28 2 2.16 1.48 1 5 4 0.80 -0.35 0.18
AFA11 11 53 2.34 1.40 2 2.19 1.48 1 5 4 0.72 -0.80 0.19
AFA12 12 53 3.02 1.42 3 3.02 1.48 1 5 4 0.05 -1.30 0.20
AFA13 13 53 3.64 1.27 4 3.74 1.48 1 5 4 -0.42 -1.05 0.17
AFA14 14 53 3.19 1.35 3 3.23 1.48 1 5 4 -0.01 -1.24 0.18
6.3 Normalidad multivariante
Se evaluará lña normalidad multivariada utilizando la librería PsyMetricTools. Para ello, se emplean dos funciones principales:
-
mardia_test(): Permite detectar desviaciones respecto a la normalidad cuando se analizan múltiples variables al mismo tiempo. -
Multivariate_plot(): Genera un gráfico Q-Q de las distancias de Mahalanobis comparadas con los cuantiles teóricos de una distribución chi-cuadrado. Si los puntos del gráfico se alinean con la diagonal roja, se considera que los datos cumplen con la normalidad multivariada. En caso contrario (como suele suceder con ítems tipo Likert), se interpreta como una violación de este supuesto.
Test Statistic p.value Result
1 Mardia Skewness 829.805618 p < .001 NO
2 Mardia Kurtosis 2.134993 0.033 NO
Adjuntando el paquete: 'ggplot2'
The following objects are masked from 'package:psych':
%+%, alpha
Adjuntando el paquete: 'gridExtra'
The following object is masked from 'package:dplyr':
combine
Warning: package 'gtable' was built under R version 4.4.3
7 Tasa de respuestas de los ítems
En esta sección se genera un gráfico tipo Likert para visualizar la frecuencia de respuesta en cada categoría de los ítems.
Se utiliza la función Plot_Likert() del paquete PsyMetricTools, que permite identificar visualmente si los participantes han utilizado todas las opciones de respuesta y si existen sesgos en la distribución (por ejemplo, concentraciones en un solo valor, efecto techo o efecto piso).
plot <- Plot_Likert(df_items, # Data frame delos ítems
name_items = "AFA", # Prefijo de la escala
ranges = 1:14, # Número de ítems
exclude = NULL, # Null porque no se va a excluir ítems
text_size = 3) # tamaño del texto de etiquetas
print(plot)Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(count)` instead.
ℹ The deprecated feature was likely used in the PsyMetricTools package.
Please report the issue to the authors.
8 Calcular la correlación policórica
Call: polychoric(x = df_items)
Polychoric correlations
AFA1 AFA2 AFA3 AFA4 AFA5 AFA6 AFA7 AFA8 AFA9 AFA10 AFA11
AFA1 1.00
AFA2 0.79 1.00
AFA3 0.78 0.72 1.00
AFA4 0.79 0.92 0.78 1.00
AFA5 0.58 0.55 0.71 0.58 1.00
AFA6 0.62 0.78 0.58 0.79 0.68 1.00
AFA7 0.78 0.69 0.73 0.74 0.75 0.67 1.00
AFA8 0.71 0.81 0.66 0.80 0.51 0.87 0.76 1.00
AFA9 0.78 0.73 0.86 0.79 0.80 0.71 0.75 0.62 1.00
AFA10 0.48 0.62 0.53 0.73 0.51 0.66 0.41 0.53 0.68 1.00
AFA11 0.61 0.71 0.67 0.82 0.58 0.77 0.51 0.66 0.74 0.86 1.00
AFA12 0.63 0.58 0.78 0.59 0.79 0.57 0.71 0.57 0.74 0.58 0.63
AFA13 0.73 0.68 0.72 0.66 0.79 0.62 0.70 0.51 0.80 0.58 0.67
AFA14 0.75 0.79 0.60 0.73 0.64 0.84 0.66 0.81 0.67 0.67 0.77
AFA12 AFA13 AFA14
AFA12 1.00
AFA13 0.79 1.00
AFA14 0.70 0.78 1.00
with tau of
1 2 3 4
AFA1 -1.03 -0.362 0.41 0.81
AFA2 -1.31 -0.413 0.41 1.12
AFA3 -1.03 -0.166 0.41 0.81
AFA4 -1.03 0.071 0.81 1.31
AFA5 -1.31 -0.631 -0.17 0.36
AFA6 -1.12 -0.519 0.36 0.95
AFA7 -1.12 -0.263 0.36 0.81
AFA8 -1.31 -0.166 0.57 1.03
AFA9 -0.81 -0.166 0.26 0.63
AFA10 -0.47 0.312 1.03 1.21
AFA11 -0.31 0.312 0.81 1.12
AFA12 -0.88 -0.312 0.36 0.75
AFA13 -1.58 -0.815 -0.12 0.36
AFA14 -1.21 -0.413 0.26 0.69
library(corrplot)
corrplot(resultado$rho,
method = "circle",
type = "lower",
tl.col = "black",
tl.srt = 45,
number.cex = 0.55,
addCoef.col = "black")# Guardamos la figura
jpeg("Output/Figura_Corrplot.jpg", width = 10, height = 8, units = "in", res = 800)
corrplot(resultado$rho,
method = "circle",
type = "lower",
tl.col = "black",
tl.srt = 45,
number.cex = 0.7,
addCoef.col = "black")
dev.off()png
2
9 Referencias
Revelle, W. (2024). psych: Procedures for Psychological, Psychometric, and Personality Research (v2.4.1) [R package]. Northwestern University. https://CRAN.R-project.org/package=psych
Ventura-León, J. (2024). PsyMetricTools: Psychometric and Statistical Analysis Tools (v1.0.0) [R package]. https://github.com/jventurealn/PsyMetricTools
Ventura-León, J. (2024). ThesiStats: Thesis Analysis Tools for Statistical Computing (v1.0.0) [R package]. https://github.com/jventurealn/ThesiStats
Walker, A. (2023). openxlsx: Read, Write and Edit xlsx Files (v4.2.5.2) [R package]. https://CRAN.R-project.org/package=openxlsx
Wei, T., & Simko, V. (2021). corrplot: Visualization of a Correlation Matrix (v0.92) [R package]. https://CRAN.R-project.org/package=corrplot
Wickham, H., François, R., Henry, L., Müller, K., & Vaughan, D. (2023). dplyr: A Grammar of Data Manipulation (v1.1.4) [R package]. Posit Software. https://dplyr.tidyverse.org
Wickham, H., & Bryan, J. (2023). readxl: Read Excel Files (v1.4.3) [R package]. Posit Software. https://readxl.tidyverse.org
Wickham, H., Hester, J., & Bryan, J. (2024). readr: Read Rectangular Text Data (v2.1.5) [R package]. Posit Software. https://readr.tidyverse.org