==============================================================================

CAPITULO II: PREPARACIÓN Y EXPLORACIÓN DE DATOS

1.1 Requisitos estadísticos previos para PLS-SEM

==============================================================================

DESCRIPCIÓN:

Para facilitar esta tarea, hemos diseñado un script que evalúa automáticamente

la calidad de los datos utilizando los paquetes ‘psych’ y ‘pastecs’.

Este análisis es fundamental antes de ejecutar modelos de ecuaciones

estructurales por mínimos cuadrados parciales (PLS-SEM).

==============================================================================

1. CARGA DE LIBRERÍAS Y DEPENDENCIAS

——————————————————————————

if(!require(psych)) install.packages(“psych”) # Para estadísticas descriptivas avanzadas if(!require(pastecs)) install.packages(“pastecs”) # Para análisis detallado de series if(!require(dplyr)) install.packages(“dplyr”) # Para manipulación de datos if(!require(seminr)) install.packages(“seminr”) # Específico para PLS-SEM

library(psych) library(pastecs) library(dplyr) library(seminr)

2. PREPARACIÓN DEL DATASET

——————————————————————————

Se asume que el objeto ‘corp_rep_data’ ya se encuentra cargado en el entorno.

data <- corp_rep_data

Selección de variables numéricas (ítems):

Excluimos columnas no numéricas (como IDs) para el cálculo estadístico.

items_data <- data %>% select_if(is.numeric)

— A. ANÁLISIS DE NORMALIDAD (Asimetría y Curtosis) —

——————————————————————————

El PLS-SEM es un método no paramétrico, pero una desviación extrema de la

normalidad puede inflar los errores estándar y afectar la significancia.

Criterio (Hair et al., 2022): Idealmente entre -1 y +1. Aceptable hasta +/- 2.

print(“— 1. REPORTE DE NORMALIDAD (Skewness & Kurtosis) —”) desc_stats <- describe(items_data) print(desc_stats[, c(“n”, “mean”, “sd”, “skew”, “kurtosis”)])

Alerta automática de ítems que superan los umbrales críticos

problematic_items <- rownames(desc_stats)[abs(desc_stats\(skew) > 2 | abs(desc_stats\)kurtosis) > 2]

if(length(problematic_items) > 0) { print(paste(“ALERTA: Revisar normalidad en los siguientes ítems:”, paste(problematic_items, collapse=“,”))) } else { print(“ESTADO: La distribución de los datos es aceptable para PLS-SEM.”) }

— B. DETECCIÓN DE DATOS PERDIDOS (Missing Values) —

——————————————————————————

Los valores perdidos pueden sesgar los resultados.

Si son < 5% por ítem, el reemplazo por la media suele ser aceptable.

print(“— 2. ANÁLISIS DE DATOS PERDIDOS —”) total_missing <- sum(is.na(items_data)) percent_missing <- mean(is.na(items_data)) * 100

print(paste(“Total de celdas vacías:”, total_missing)) print(paste(“Porcentaje global de datos perdidos:”, round(percent_missing, 2), “%”))

if(percent_missing > 5) { print(“ADVERTENCIA: Los datos perdidos superan el 5%. Se recomienda imputación avanzada (MICE o EM).”) } else { print(“ESTADO: Nivel de datos perdidos aceptable. Se procederá con reemplazo por media si es necesario.”) }

— C. VARIANZA CERO (Respuestas Constantes) —

——————————————————————————

Ítems con varianza cero (todos los encuestados marcaron lo mismo)

deben ser eliminados ya que no aportan información al modelo.

print(“— 3. VERIFICACIÓN DE VARIANZA —”) zero_var <- which(apply(items_data, 2, function(x) sd(x, na.rm = TRUE)) == 0)

if(length(zero_var) > 0) { print(paste(“CRÍTICO: Ítems con varianza cero detectados:”, names(zero_var))) print(“ACCIÓN REQUERIDA: Eliminar estos ítems antes de procesar el modelo SEM.”) } else { print(“ESTADO: Todos los ítems tienen varianza suficiente para el análisis.”) }

==============================================================================

FIN DEL SCRIPT DE EVALUACIÓN PREVIA

==============================================================================

==============================================================================

CAPITULO II: PREPARACIÓN Y EXPLORACIÓN DE DATOS

ESCENARIO 2B: Detección de variables duplicadas o redundantes

==============================================================================

DESCRIPCIÓN:

En esta fase, verificamos que no existan ítems idénticos o con una correlación

perfecta. La duplicidad de datos puede invalidar los resultados de los

algoritmos de mínimos cuadrados, generando errores de “matriz singular”.

==============================================================================

1. VERIFICACIÓN DE COLUMNAS IDÉNTICAS (Valores exactos)

——————————————————————————

Comparamos cada columna con las demás para ver si los valores son 100% iguales.

Usamos t() para trasponer, ya que duplicated() actúa sobre filas.

print(“— VERIFICACIÓN DE COLUMNAS DUPLICADAS —”) duplicated_columns <- duplicated(t(corp_rep_data))

if(any(duplicated_columns)){ print(“¡ALERTA ROJA! Se han detectado columnas con datos idénticos:”) print(colnames(corp_rep_data)[duplicated_columns]) print(“ACCIÓN: Debe eliminar una de las dos variables antes de continuar.”) } else { print(“ESTADO: No se encontraron variables con valores idénticos.”) }

2. VERIFICACIÓN DE CORRELACIÓN PERFECTA (Redundancia Estadística)

——————————————————————————

A veces las variables no son idénticas en nombre, pero tienen una

correlación de 1.00, lo que indica que miden exactamente lo mismo.

print(“— ANÁLISIS DE CORRELACIÓN (R = 1.0) —”)

Calculamos la matriz de correlación solo para variables numéricas

cor_matrix <- cor(corp_rep_data %>% select_if(is.numeric), use = “complete.obs”)

Identificamos pares con correlación igual a 1 (excluyendo la diagonal)

perfect_cor <- which(cor_matrix == 1 & row(cor_matrix) < col(cor_matrix), arr.ind = TRUE)

if(nrow(perfect_cor) > 0) { print(“ALERTA: Se encontraron correlaciones perfectas entre:”) for(i in 1:nrow(perfect_cor)) { var1 <- rownames(cor_matrix)[perfect_cor[i, 1]] var2 <- colnames(cor_matrix)[perfect_cor[i, 2]] print(paste(“Redundancia entre:”, var1, “y”, var2)) } } else { print(“ESTADO: No hay correlaciones perfectas. Los datos son linealmente independientes.”) }

==============================================================================