Técnicas multivariantes de investigación en marketing
  • Presentación
  • Contenidos
    • Introducción al análisis
    • Inferencia en Investigación de Mercados
    • Análisis de Correspondencias Simple
    • Análisis de Componentes Principales
    • Análisis Clúster
    • Análisis de Regresión Múltiple
  • Otros
    • Citar en Quarto
    • Acerca de …
  • PDF
  • Scripts R
  • Datos

Contenidos

  • Inferencia e Investigación de Mercados
    • Introducción al proceso inferencial
      • La lógica de la inferencia estadística
    • Normalidad estadística
      • Herramientas de diagnóstico
        • La trampa de la muestra grande
        • Testar la normalidad
        • Otros diagnósticos visuales
          • Gráfico Q-Q estándar
        • Guía rápida para los informes
    • El procedimiento de linealización
      • Transformaciones comunes en R
    • Homogeneidad de varianzas (homoscedasticidad)
      • Test de Levene
      • Ratio de varianzas
    • Introducción a la inferencia estadística paramétrica
    • Inferencia paramétrica
      • Test t de Student para una muestra
      • Test t de Student para muestras independientes
        • El protocolo de decisión
        • Diagnóstico de homogeneidad de varianzas (Test de Levene)
        • Opción A: Varianzas iguales (Levene \(p > 0.05\))
        • Opción B: Varianzas diferentes (Levene \(p \leq 0.05\))
      • Test de comparación de proporciones (Test Z)
        • Preparación de los datos
        • Ejecución del Test Z
      • Test t de Student para muestras dependientes (pareadas)
        • El protocolo de decisión
      • Correlación paramétrica de Pearson
      • Análisis de varianza de un factor (ANOVA one-way)
      • Análisis de varianza de dos factores (ANOVA two-way)
    • Inferencia no paramétrica
      • Prueba Chi-cuadrado (\(\chi^2\))
        • Chi-cuadrado de bondad de ajuste (una muestra)
        • Chi-cuadrado de independencia (tabla de contingencia)
        • Medidas de asociación derivadas
      • Correlaciones no paramétricas
        • Correlación de Spearman (\(\rho\))
        • Correlación de Kendall (\(\tau\))
      • Prueba de Wilcoxon — Muestras independientes (U de Mann-Whitney)
        • Diagnóstico de normalidad (Lilliefors y Shapiro-Wilk)
        • Prueba W de Wilcoxon — U de Mann-Whitney
      • Prueba de Wilcoxon — Muestras dependientes (V de Wilcoxon)
        • Diagnóstico de normalidad de las diferencias

Inferencia e Investigación de Mercados

Tenemos las bases para introducirnos en el mundo de la inferencia estadística, es decir, responder a esas preguntas que planteábamos como esenciales:

  • Existen diferencias
  • Existe relación

Vamos con ello.

Introducción al proceso inferencial

La lógica de la inferencia estadística

Hasta ahora se ha resumido lo que ocurre en la muestra. La inferencia estadística es el paso definitivo que permite saltar de los datos observados a conclusiones sobre la realidad del mercado. Aquí no se busca solo medir, sino verificar si lo observado es fruto de un patrón real o de simple azar.

Cuando hablamos de inferencia, todo contraste sigue un proceso riguroso de cuatro etapas:

  1. Definición de hipótesis: Se formula una hipótesis experimental (lo que se pretende demostrar) frente a la hipótesis nula (\(H_0\)), que asume que no hay efecto alguno (todo es azar).
  2. Elección del modelo: Se selecciona la técnica adecuada en función de la naturaleza de los datos. Para ello es necesario validar los supuestos:
    • Nivel de medida: ¿son datos métricos o categóricos?
    • Normalidad: ¿siguen una distribución de Gauss?
    • Homocedasticidad: ¿tienen los grupos la misma variabilidad?
  3. Cálculo del test: Se evalúa qué parte de la varianza es explicada por el modelo y qué parte es ruido. Aquí se obtiene el valor crítico (p-value).
  4. Toma de decisiones: El resultado se compara con un nivel de significación (usualmente 0.05).
    • Si \(p < 0.05\): se rechaza \(H_0\) y se acepta el efecto como estadísticamente significativo.
    • Si \(p > 0.05\): no puede rechazarse \(H_0\), lo que implica que no hay evidencia suficiente para afirmar que el efecto existe.

La clave del analista es elegir la herramienta correcta. Si los datos cumplen los supuestos (normalidad, homocedasticidad), se utilizan pruebas paramétricas (más potentes). Si no se cumplen, se recurre a pruebas no paramétricas, más flexibles y “robustas” ante datos que no siguen una distribución perfecta.

Es vital insistir en que el 0.05 no es un “número mágico”, sino un criterio de convención científica. En marketing, un 0.05 ofrece la tranquilidad de que, si el estudio se repitiera 100 veces, solo en 5 de ellas se habría afirmado erróneamente que existe un efecto real.

En R se aprenderá a extraer el p-value de forma específica, lo que obliga a ser conscientes de qué test se está realizando en cada momento. Esto evita el error común de aplicar pruebas automáticas sin entender la hipótesis que hay detrás.

Normalidad estadística

Antes de utilizar técnicas estadísticas avanzadas, es necesario validar si la variable sigue una distribución normal. Este es el supuesto base de muchas pruebas paramétricas (como el test t o el ANOVA). Para verificarlo no basta con la intuición visual; son necesarios contrastes estadísticos formales.

Herramientas de diagnóstico

  • Test de Shapiro-Wilk: Es el estándar de referencia para evaluar la normalidad. Bajo \(H_0\), los datos siguen una distribución normal. Es el más potente para detectar desviaciones reales, especialmente en muestras pequeñas o medianas (n < 200).
  • Test de Kolmogorov-Smirnov con corrección de Lilliefors: Alternativa habitual que ajusta el test K-S original para el caso —el más frecuente en la práctica— en que la media y la desviación típica se estiman a partir de la propia muestra. En términos de potencia es algo inferior a Shapiro-Wilk, pero su uso está muy extendido y es la opción que ofrecen la mayoría de los programas estadísticos de forma predeterminada.
La trampa de la muestra grande

Al aumentar el tamaño muestral, ambos tests se vuelven extremadamente sensibles: en bases de datos con cientos o miles de casos, cualquier desviación mínima e irrelevante produce \(p < 0.05\). No debe confundirse significación estadística con relevancia práctica.

Por eso, la decisión sobre normalidad nunca debe basarse únicamente en un p-valor. El protocolo recomendado es:

  1. Ejecutar el test (Shapiro-Wilk como primera opción; Lilliefors como contraste adicional).
  2. Visualizar: histograma y gráfico Q-Q. Si el test rechaza la normalidad pero el gráfico muestra una campana razonable, prevalece el criterio del investigador.
  3. Decidir: si el sesgo es real y relevante, se opta por pruebas no paramétricas o por transformaciones de los datos.

En investigación de mercados, las variables casi nunca son perfectamente normales. El objetivo no es la perfección, sino la suficiencia. Ante la duda, el gráfico revela lo que el p-valor oculta.

Testar la normalidad

Kolmogorov-Smirnov (Lilliefors) y Shapiro-Wilk

Una vez ejecutados los tests de normalidad, llega el momento de la verdad: ¿pueden aplicarse técnicas paramétricas, o es necesario buscar alternativas? En ambos tests, la hipótesis nula (\(H_0\)) es que “los datos siguen una distribución normal”.

  • Si el p-value > 0.05: no hay evidencia suficiente para rechazar la hipótesis nula. Por tanto, se asume normalidad.
  • Si el p-value < 0.05: se rechaza la normalidad. La distribución se aleja significativamente de la campana de Gauss.

Si vamos con el ejemplo, al aplicar los tests a la variable dia1 (higiene corporal, día 1 del FIB):

cat("H0 → los datos siguen una distribución normal\n\n")

# --- Load the FIB hygiene dataset ---
fib2 <- expss::read_spss('data/fib2.sav')

# --- Lilliefors test (Kolmogorov-Smirnov with Lilliefors correction) ---
# H0: the variable follows a normal distribution
nortest::lillie.test(fib2$dia1)

# --- Shapiro-Wilk test ---
# H0: the variable follows a normal distribution (most powerful test for small/medium n)
stats::shapiro.test(fib2$dia1)

# Basic gghistogram, no overlay
ggpubr::gghistogram(
  fib2, x = "dia1",
  fill = "steelblue", color = "white",
  title = "Distribución"
)

H0 → los datos siguen una distribución normal


    Lilliefors (Kolmogorov-Smirnov) normality test

data:  fib2$dia1
D = 0.053023, p-value = 1.288e-05


    Shapiro-Wilk normality test

data:  fib2$dia1
W = 0.97795, p-value = 1.043e-09

Las conclusiones que se extraen de estos resultados representan uno de los aprendizajes más importantes para un investigador o analista de datos. Es un caso clásico de “significación estadística frente a relevancia práctica”.

Ambos tests plantean como hipótesis nula (\(H_0\)) que los datos provienen de una distribución normal.

  • En el test de Lilliefors, el p-value es \(0.00001288\) (\(< 0.05\)).
  • En el test de Shapiro-Wilk, el p-value es \(0.000000001043\) (\(< 0.05\)).

Conclusión técnica: se rechaza la hipótesis nula en ambos casos. Estadísticamente hablando, la variable dia1 no sigue una distribución perfectamente normal.

Aquí es donde entra la experiencia analítica. La muestra es de 810 casos, un tamaño muestral bastante grande. Como se ha comentado, cuando la muestra es grande, los tests de bondad de ajuste (especialmente Shapiro-Wilk) se vuelven hipersensibles. Tienen tanto “poder estadístico” que detectan cualquier mínima imperfección o asimetría microscópica en la campana de Gauss, devolviendo un p-value significativo que indica “no es normal”.

Sin embargo, hay un detalle crucial en el test de Shapiro-Wilk: el valor de su estadístico es \(W = 0.97795\). El estadístico \(W\) oscila entre 0 y 1, donde 1 significa una normalidad absoluta. Un valor de 0.978 indica que, en la práctica, la curva es extremadamente parecida a una normal. El test la rechaza por purismo matemático, pero visualmente se trata de una campana muy decente.

Con estos resultados sobre \(n=810\), el investigador de mercados puede tomar las siguientes decisiones:

  1. Ignorar el alarmismo del p-value: no debe descartarse automáticamente el uso de técnicas paramétricas (como el Test t o el ANOVA).
  2. Revisión visual obligatoria: el siguiente paso inmediato es dibujar el histograma y el gráfico Q-Q (Q-Q plot). Si el histograma tiene forma de campana y no hay valores atípicos (outliers) extremos y deformantes, puede confiarse en la forma de los datos.
  3. El escudo del Teorema Central del Límite: con 810 casos, la muestra es tan grande que el Teorema Central del Límite protege los análisis paramétricos. Las pruebas de comparación de medias funcionarán perfectamente y serán robustas aunque la distribución original presente esa leve desviación detectada por Lilliefors y Shapiro.

Otros diagnósticos visuales

Para complementar el histograma se utilizan los gráficos Q-Q (Quantile-Quantile Plot). Su lógica es sencilla: representan los cuantiles de los datos frente a los cuantiles de una distribución normal teórica.

  • Si los puntos siguen la línea diagonal: Los datos se ajustan a la normalidad.
  • Si los puntos se curvan en los extremos: Indica colas más pesadas (más outliers de los esperados) o una asimetría clara.
Gráfico Q-Q estándar

Es la primera parada para validar la normalidad.

# 1. Standard Q-Q Plot
ggpubr::ggqqplot(fib2$dia1, 
         main = "Normal Q-Q Plot",
         color = "steelblue")

Guía rápida para los informes

  1. ¿Muestra pequeña (\(n < 50\))?: Usar Shapiro-Wilk. Es el más potente para detectar desviaciones reales de la normalidad con pocos datos.
  2. ¿Muestra grande (\(n > 200\))?: Los tests formales —tanto Shapiro-Wilk como Lilliefors— se vuelven hipersensibles: cualquier desviación mínima produce \(p < 0.05\), aunque sea irrelevante en la práctica. Confiar principalmente en el histograma y el gráfico Q-Q, y usar los tests solo como referencia complementaria.
  3. ¿Duda eterna?: Como siempre, el histograma. Un \(p < 0.05\) con una distribución visualmente simétrica y acampanada no obliga a abandonar las pruebas paramétricas.

El procedimiento de linealización

Cuando los datos no siguen una distribución normal, no siempre es necesario renunciar a las técnicas paramétricas. A menudo, la falta de normalidad es solo un efecto visual provocado por una escala de medida desproporcionada. La linealización es el proceso de aplicar transformaciones matemáticas a las variables para “suavizar” su distribución y aproximarla a la normalidad.

Transformaciones comunes en R

En R, estas transformaciones se aplican directamente sobre la columna del dataframe, creando nuevas variables que conservan la información original pero con una escala más apta para el análisis estadístico:

  • Raíz cuadrada (sqrt()): Reduce la variabilidad en datos con una asimetría positiva moderada.
  • Logaritmo base 10 (log10()): Muy útil para variables con rangos muy amplios (ej. ingresos o población).
  • Logaritmo neperiano (log()): El estándar en modelización económica y de marketing para estabilizar la varianza.

# --- Step 1: Create transformed copies of 'dia1' in the dataframe ---
fib2$dia1_sqrt   <- sqrt(fib2$dia1)
fib2$dia1_log    <- log(fib2$dia1 + 1)   # +1 avoids errors when there are zero values
fib2$dia1_log10  <- log10(fib2$dia1 + 1) # +1 avoids errors when there are zero values

# --- Step 2: Re-run Shapiro-Wilk to check if normality has improved ---
stats::shapiro.test(fib2$dia1_sqrt)

    Shapiro-Wilk normality test

data:  fib2$dia1_sqrt
W = 0.9165, p-value < 2.2e-16
stats::shapiro.test(fib2$dia1_log)

    Shapiro-Wilk normality test

data:  fib2$dia1_log
W = 0.89497, p-value < 2.2e-16
stats::shapiro.test(fib2$dia1_log10)

    Shapiro-Wilk normality test

data:  fib2$dia1_log10
W = 0.89497, p-value < 2.2e-16
# --- Step 3: Compare the three transformed distributions visually ---
# par(mfrow = c(1, 3)) arranges the next 3 plots side by side in one row
par(mfrow = c(1, 3)) 

ggpubr::gghistogram(
  fib2, x = "dia1_sqrt",
  fill = "steelblue", color = "white",
  title = "Distribución SQRT"
)

ggpubr::gghistogram(
  fib2, x = "dia1_log",
  fill = "darkgreen", color = "white",
  title = "Distribución LN"
)

ggpubr::gghistogram(
  fib2, x = "dia1_log10",
  fill = "firebrick", color = "white",
  title = "Distribución LOG10"
)

# Reset the plotting layout back to a single plot per figure
par(mfrow = c(1, 1))

Nota importante: al realizar estas transformaciones, cambia la interpretación de la variable. La media de una variable logarítmica no se lee en las mismas unidades que la original. Por eso, el procedimiento correcto siempre es: transformar, realizar el análisis paramétrico y, después —si es necesario—, interpretar los resultados en el contexto de la escala original.

Homogeneidad de varianzas (homoscedasticidad)

La comprobación de la homogeneidad de varianzas, también conocida como homocedasticidad, es un pilar innegociable antes de aplicar técnicas de inferencia estadística paramétrica como el test t de Student o el ANOVA. Estas pruebas matemáticas asumen desde su origen que los grupos que se comparan tienen una variabilidad similar; es decir, que sus datos se dispersan de forma parecida en torno a su propia media. Si se ignora este paso y resulta que las varianzas son radicalmente distintas, los cálculos del error estándar se distorsionan.

Esto resulta especialmente peligroso en investigación de mercados, ya que aumenta drásticamente la probabilidad de cometer un falso positivo (afirmar que hay diferencias estratégicas entre dos segmentos de clientes cuando en realidad no las hay). Validar la homocedasticidad garantiza que los grupos se comparan bajo unas reglas del juego justas y equilibradas. Sin este diagnóstico previo, cualquier decisión de negocio basada en diferencias de medias carecerá de validez y rigor científico.

Test de Levene

# --- Levene's test for homogeneity of variances ---
# H0: Variances are equal. H1: Variances are different.
car::leveneTest(dia1 ~ factor(sex), data = fib2)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value    Pr(>F)    
group   1  388.54 < 2.2e-16 ***
      808                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# --- Visual proof: compare the spread of 'dia1' between sex groups ---
ggplot2::ggplot(fib2, aes(x = sex, y = dia1, fill = factor(sex))) +
    geom_boxplot() 

Este análisis se suele complementar con gráficos de caja e histogramas, así como con el cálculo de los ratios de varianza, una medida que SPSS no proporciona.

Ratio de varianzas

Para calcular el ratio de varianzas (también conocido como F-test ratio) de forma manual en R, basta con dividir la varianza del grupo que tiene mayor dispersión entre la del grupo con menor dispersión. Esto da un índice de cuántas veces es más grande la variabilidad de un grupo respecto al otro.

# 1. Calculate variances for each group
var_male   <- var(fib2$dia1[fib2$sex == 1], na.rm = TRUE)
var_female <- var(fib2$dia1[fib2$sex == 2], na.rm = TRUE)

# 2. Calculate the ratio (Var_max / Var_min) 
# We use max() so the ratio is always >= 1, making it easier to interpret
variance_ratio <- max(var_male, var_female) / min(var_male, var_female)

# 3. Print the result
cat("Variance of Male group:", round(var_male, 3), "\n")
Variance of Male group: 2.237 
cat("Variance of Female group:", round(var_female, 3), "\n")
Variance of Female group: 0.34 
cat("Variance Ratio:", round(variance_ratio, 3), "\n")
Variance Ratio: 6.571 

Si el ratio es cercano a 1, significa que las varianzas son prácticamente idénticas. Si el ratio es mayor a 2, ya hay una diferencia considerable. Es un indicador de magnitud (tamaño del efecto), mientras que el test de Levene indica si esa diferencia es estadísticamente “confiable”.

# Visual proof: Histograms for comparison
ggplot2::ggplot(fib2, aes(x = dia1, fill = factor(sex))) +
  geom_histogram(bins = 15, alpha = 0.6, position = "identity") +
  facet_wrap(~factor(sex)) +
  theme_minimal() +
  labs(title = "Distribution of hygiene levels by gender",
       subtitle = "Visual comparison of variance",
       x = "Hygiene Score", y = "Frequency")

El ratio de varianzas es un indicador de magnitud. Mientras que el test de Levene indica si la diferencia es estadísticamente significativa, el ratio indica cuántas veces más grande es la variabilidad de un grupo respecto al otro.

Como norma general, si este ratio supera un valor de 2.0, la heterocedasticidad se considera lo suficientemente marcada como para desaconsejar el uso de pruebas paramétricas clásicas.

Introducción a la inferencia estadística paramétrica

Una vez descritos los datos y validada su distribución, el siguiente nivel es responder a las preguntas estratégicas de cualquier investigación. La inferencia estadística es el conjunto de técnicas que permite realizar afirmaciones sobre una población a partir de los datos observados en una muestra.

En esta sesión se abordan cuatro tipos fundamentales de contrastes que todo investigador debe dominar:

  1. Test t para una muestra: se utiliza para comparar un resultado actual frente a un valor de referencia, un objetivo histórico o un estándar poblacional conocido.
  2. Test t para muestras independientes: es la herramienta para comparar grupos distintos (ej. ¿se comportan igual los clientes de la Región A frente a los de la Región B?).
  3. Test t para muestras dependientes (o relacionadas): permite medir la eficacia de una acción comparando el mismo grupo en dos momentos temporales diferentes (ej. antes y después de una campaña publicitaria).
  4. Correlación de Pearson: es el primer paso para detectar asociaciones; permite saber si, cuando una variable aumenta, la otra también lo hace (o decrece), cuantificando la fuerza de esa relación.

El enfoque de esta sesión: no se trata de “clicar” opciones, sino de identificar qué pregunta estadística corresponde a cada problema planteado. Una vez identificada la técnica, se ejecuta el modelo en R, se interpreta su significación y, sobre todo, se evalúa si los resultados obtenidos son robustos.

Se pasa así de la observación simple a la toma de decisiones basada en evidencia estadística.

# Load the dataset (expss::read_spss preserves variable/value labels from SPSS)
gssft1 <- expss::read_spss('data/gssft1.sav')

Inferencia paramétrica

Test t de Student para una muestra

El test t para una muestra es la primera herramienta de inferencia. Se utiliza cuando es necesario saber si la media de una muestra es estadísticamente diferente de un valor de referencia (o valor poblacional).

Antes de ejecutar el test, la hoja de ruta es:

  1. Descriptivos: conviene visualizar siempre la media y el histograma. Si los datos están muy sesgados o tienen outliers extremos, el test t pierde potencia.
  2. Planteamiento de Hipótesis:
    • Hipótesis Nula (\(H_0\)): la media de la población es igual al valor de referencia (\(\mu = \mu_0\)).
    • Hipótesis Alternativa (\(H_1\)): la media es diferente (\(\mu \neq \mu_0\)).

En R, la función stats::t.test() es extremadamente flexible. A continuación se definen todos sus parámetros para que el código sea transparente y no quede ninguna decisión estadística “oculta”:

# Defining the target value (reference mean)
target_mean <- 40

# Executing the one-sample t-test
stats::t.test(
    gssft1$hrs1,                  # The variable to analyze
    mu          = target_mean,    # The reference value
    alternative = "two.sided",    # Two-tailed: looking for any difference
    conf.level  = 0.95             # Standard confidence level (95%)
)

    One Sample t-test

data:  gssft1$hrs1
t = 14.069, df = 438, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 40
95 percent confidence interval:
 46.22201 48.24268
sample estimates:
mean of x 
 47.23235 

Interpretación para el investigador: al ejecutar el código, R devuelve tres datos críticos:

  • t-statistic: indica cuántas desviaciones estándar se aleja la media muestral del valor objetivo.
  • p-value: si es menor que 0.05, se rechaza la \(H_0\). Se concluye que la diferencia observada es estadísticamente significativa y no fruto del azar.
  • Confidence Interval (95% CI): indica el rango donde, con un 95% de probabilidad, se encuentra la verdadera media poblacional. Si el valor de referencia (40) no está dentro de este rango, hay una prueba extra de que la media es significativamente distinta.

Test t de Student para muestras independientes

Este test permite determinar si existe una diferencia estadísticamente significativa entre las medias de dos grupos distintos (ej. ¿consumen más internet los hombres que las mujeres?).

El protocolo de decisión

Para aplicar correctamente este test se siguen tres pasos obligatorios:

  1. Diagnóstico de varianzas (Levene): se comprueba si los grupos tienen dispersiones similares. Si el p-value es \(> 0.05\), se asumen varianzas iguales (var.equal = TRUE). Si es \(\leq 0.05\), se utiliza la Corrección de Welch (var.equal = FALSE).
  2. Ejecución del test: se utiliza la sintaxis de fórmulas variable_metrica ~ variable_factor.
  3. Tamaño del efecto: no basta con saber si hay diferencia; se calcula el r de Cohen (o eta-cuadrado mediante la fórmula de la \(t\) y los grados de libertad) para ver si esa diferencia es relevante en el mundo real.

Diagnóstico de homogeneidad de varianzas (Test de Levene)

Antes de comparar medias, se comprueba si la variabilidad es similar en ambos grupos.

# Loadin data
gssnet2 <- expss::read_spss("data/gssnet2.sav")

# Convert sex to factor with descriptive labels
gssnet2$sex_factor <- factor(gssnet2$sex, labels = c("Hombre", "Mujer"))

# Levene's test for homogeneity of variances
car::leveneTest(emailhrs ~ sex_factor, data = gssnet2)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   1  0.0988 0.7534
      982               

Opción A: Varianzas iguales (Levene \(p > 0.05\))

Se utiliza var.equal = TRUE.

# t-test assuming equal variances
test_t_equal <- stats::t.test(emailhrs ~ sex_factor, data = gssnet2,
                                var.equal  = TRUE,
                                conf.level = 0.95)
print(test_t_equal)

    Two Sample t-test

data:  emailhrs by sex_factor
t = 0.20832, df = 982, p-value = 0.835
alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
95 percent confidence interval:
 -0.9158859  1.1334347
sample estimates:
mean in group Hombre  mean in group Mujer 
            3.371057             3.262282 
# Effect size: Cohen's r
t_val  <- test_t_equal$statistic
df_val <- test_t_equal$parameter
cat("Effect size (r):", round(sqrt((t_val^2) / ((t_val^2) + df_val)), 3), "\n")
Effect size (r): 0.007 

Opción B: Varianzas diferentes (Levene \(p \leq 0.05\))

Se utiliza var.equal = FALSE (Corrección de Welch).

# t-test with Welch correction (unequal variances)
test_t_welch <- stats::t.test(emailhrs ~ sex_factor, data = gssnet2,
                                var.equal  = FALSE,
                                conf.level = 0.95)
print(test_t_welch)

    Welch Two Sample t-test

data:  emailhrs by sex_factor
t = 0.20682, df = 893.88, p-value = 0.8362
alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
95 percent confidence interval:
 -0.9234377  1.1409865
sample estimates:
mean in group Hombre  mean in group Mujer 
            3.371057             3.262282 
# Effect size: Cohen's r
t_val  <- test_t_welch$statistic
df_val <- test_t_welch$parameter
cat("Effect size (r):", round(sqrt((t_val^2) / ((t_val^2) + df_val)), 3), "\n")
Effect size (r): 0.007 

Test de comparación de proporciones (Test Z)

Cuando se trabaja con variables categóricas (como el grupo de pertenencia A, B o C), ya no se comparan medias, sino proporciones. El Test Z permite determinar si la diferencia entre las proporciones observadas en distintos grupos es estadísticamente significativa.

Preparación de los datos

Se utiliza el archivo gssz, que incluye grupos de pertenencia (grupo), sexo (sexo) y edad (edad).

# Load dataset
gssz <- expss::read_spss('data/gszz.sav')

# Contingency table: sex vs group membership
contingency_sex_group <- table(gssz$sexo, gssz$grupo)
print(contingency_sex_group)
        
           A   B   C
  Hombre 217  54  71
  Mujer   90 146  47
# Row percentages
round(prop.table(contingency_sex_group, 1) * 100, 2)
        
             A     B     C
  Hombre 63.45 15.79 20.76
  Mujer  31.80 51.59 16.61

Ejecución del Test Z

Se quiere verificar si la proporción de pertenencia al Grupo A es distinta entre Hombres y Mujeres.

# Successes (Group A counts) and totals by sex
group_a_counts <- c(contingency_sex_group["Hombre", "A"],
                    contingency_sex_group["Mujer",  "A"])

sex_totals <- c(sum(contingency_sex_group["Hombre", ]),
                sum(contingency_sex_group["Mujer",  ]))

# Proportion test (Z-test for two proportions)
stats::prop.test(x = group_a_counts, n = sex_totals, correct = FALSE)

    2-sample test for equality of proportions without continuity correction

data:  group_a_counts out of sex_totals
X-squared = 62.062, df = 1, p-value = 3.328e-15
alternative hypothesis: two.sided
95 percent confidence interval:
 0.2419910 0.3909725
sample estimates:
   prop 1    prop 2 
0.6345029 0.3180212 

Interpretación para el investigador:

  • Hipótesis nula (\(H_0\)): la proporción de pertenencia al Grupo A es igual para hombres que para mujeres.
  • p-value: si el valor es \(< 0.05\), se rechaza la igualdad.
  • Confidence interval: si el intervalo no incluye el valor 0, la diferencia entre las proporciones es estadísticamente significativa.

Test t de Student para muestras dependientes (pareadas)

Este test se aplica cuando se mide la misma variable sobre los mismos sujetos en dos momentos o condiciones diferentes. La pregunta de investigación es: ¿ha cambiado significativamente la medida tras la intervención?

El ejemplo proviene del dataset endorph1, que recoge los niveles de endorfinas de un grupo de sujetos antes y después de una sesión de ejercicio físico. Cada fila es el mismo individuo en dos momentos distintos — de ahí el término pareadas.

El protocolo de decisión

Se siguen tres pasos:

  1. Descriptivos de la diferencia: se calcula la media, desviación típica e intervalo de confianza de la diferencia before - after. Si la diferencia media es cercana a cero, hay pocas razones para esperar significación.
  2. Diagnóstico de normalidad: lo que debe ser normal es la distribución de las diferencias (aunque en la práctica se comprueba cada condición por separado), mediante Lilliefors y Shapiro-Wilk.
  3. Ejecución del test y tamaño del efecto: Con paired = TRUE, R calcula internamente la diferencia y aplica el test t sobre ella.
# Loading data
endorph1 <- expss::read_spss("data/endorph1.sav")

# --- Step 1: Descriptive statistics of the difference ---
before_scores <- endorph1$before
after_scores  <- endorph1$after

diff_mean <- mean(before_scores - after_scores, na.rm = TRUE)
diff_sd   <- sd(before_scores - after_scores, na.rm = TRUE)
diff_se   <- diff_sd / sqrt(length(before_scores))  # Standard error of the mean difference
ci_lower  <- diff_mean - (2 * diff_se)
ci_upper  <- diff_mean + (2 * diff_se)

cat("Mean difference:", round(diff_mean, 3), "\n")
Mean difference: -18.736 
cat("Std. deviation: ", round(diff_sd,   3), "\n")
Std. deviation:  8.33 
cat("95% CI: [", round(ci_lower, 3), ",", round(ci_upper, 3), "]\n")
95% CI: [ -23.759 , -13.713 ]
# --- Step 2: Normality tests for each condition ---
# Lilliefors (Kolmogorov-Smirnov with Lilliefors correction)
print(nortest::lillie.test(before_scores))

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  before_scores
D = 0.17365, p-value = 0.4668
print(nortest::lillie.test(after_scores))

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  after_scores
D = 0.12988, p-value = 0.87
# Shapiro-Wilk (recommended for n < 50)
print(stats::shapiro.test(before_scores))

    Shapiro-Wilk normality test

data:  before_scores
W = 0.86876, p-value = 0.07472
print(stats::shapiro.test(after_scores))

    Shapiro-Wilk normality test

data:  after_scores
W = 0.96441, p-value = 0.8252
# --- Step 3: Paired t-test ---
paired_ttest <- stats::t.test(
    before_scores,
    after_scores,
    alternative = "two.sided",  # Two-tailed: we test for any difference
    paired      = TRUE,         # KEY: same subjects measured twice
    conf.level  = 0.95
)

print(paired_ttest)

    Paired t-test

data:  before_scores and after_scores
t = -7.4602, df = 10, p-value = 2.159e-05
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 -24.33236 -13.14037
sample estimates:
mean difference 
      -18.73636 
# --- Step 4: Effect size (Cohen's r) ---
t_stat      <- paired_ttest[["statistic"]][["t"]]
df_paired   <- paired_ttest[["parameter"]][["df"]]
effect_size <- sqrt((t_stat^2) / ((t_stat^2) + df_paired))

cat("Effect size (r):", round(effect_size, 3), "\n")
Effect size (r): 0.921 
cat("Interpretation: small >= 0.10 | medium >= 0.30 | large >= 0.50\n")
Interpretation: small >= 0.10 | medium >= 0.30 | large >= 0.50

Interpretación para el investigador: conviene fijarse en tres elementos del output:

  • p-value: si es \(< 0.05\), la diferencia antes/después es estadísticamente significativa — el ejercicio ha tenido un efecto real sobre los niveles de endorfinas.
  • Intervalo de confianza (95% CI): si el intervalo no contiene el cero, la diferencia es significativa. El cero representaría “ningún cambio”.
  • Tamaño del efecto (r): indica si esa diferencia es relevante en términos prácticos, más allá de la significación estadística. Un p-value significativo con un efecto pequeño puede ser poco útil en la toma de decisiones.

Correlación paramétrica de Pearson

La correlación de Pearson mide la fuerza y dirección de la relación lineal entre dos variables métricas. Antes de interpretar el coeficiente es fundamental verificar que la relación sea efectivamente lineal, de ahí que el análisis se acompañe siempre de una representación gráfica.

El ejemplo utiliza el dataset anxiety, que recoge tres variables de un grupo de estudiantes: tiempo de estudio (TIEMPO), nota obtenida (NOTA) y nivel de ansiedad (ANSIEDAD).

# Loading data
anxiety <- expss::read_spss("data/anxiety.sav")

# --- Step 1: Select variables of interest ---
anxiety_data <- dplyr::select(anxiety, TIEMPO, NOTA, ANSIEDAD)

# --- Step 2: Scatter plot matrix to assess linearity visually ---
plot(anxiety_data,
     main = "Scatter plot matrix — Anxiety dataset",
     col  = "steelblue",
     pch  = 16)

# --- Step 3: Bivariate Pearson correlation (TIEMPO vs NOTA) ---
pearson_tiempo_nota <- stats::cor.test(
    anxiety$TIEMPO,
    anxiety$NOTA,
    alternative = "two.sided",
    method      = "pearson",
    conf.level  = 0.95
)

print(pearson_tiempo_nota)

    Pearson's product-moment correlation

data:  anxiety$TIEMPO and anxiety$NOTA
t = 4.3434, df = 101, p-value = 3.343e-05
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.2200938 0.5481602
sample estimates:
      cor 
0.3967207 
# --- Step 4: Full correlation matrix with p-values ---
pearson_matrix <- Hmisc::rcorr(as.matrix(anxiety_data), type = "pearson")

cat("--- Correlation coefficients (r) ---\n")
--- Correlation coefficients (r) ---
print(round(pearson_matrix[["r"]], 3))
         TIEMPO   NOTA ANSIEDAD
TIEMPO    1.000  0.397   -0.709
NOTA      0.397  1.000   -0.441
ANSIEDAD -0.709 -0.441    1.000
cat("\n--- Sample sizes (n) ---\n")

--- Sample sizes (n) ---
print(pearson_matrix[["n"]])
         TIEMPO NOTA ANSIEDAD
TIEMPO      103  103      103
NOTA        103  103      103
ANSIEDAD    103  103      103
cat("\n--- p-values ---\n")

--- p-values ---
print(round(pearson_matrix[["P"]], 4))
         TIEMPO NOTA ANSIEDAD
TIEMPO       NA    0        0
NOTA          0   NA        0
ANSIEDAD      0    0       NA

Interpretación para el investigador: la función Hmisc::rcorr() devuelve tres matrices que deben leerse de forma conjunta:

  • r: el coeficiente de correlación. Valores cercanos a \(\pm 1\) indican relación fuerte; cercanos a 0, relación débil o inexistente.
  • n: el número de pares válidos usados en cada correlación (importante cuando hay valores perdidos).
  • P: el p-value de cada coeficiente. Si es \(< 0.05\), la correlación es estadísticamente significativa. La diagonal siempre será NA (correlación de una variable consigo misma).

Análisis de varianza de un factor (ANOVA one-way)

El ANOVA de un factor es la extensión natural del test t cuando se quiere comparar más de dos grupos. La pregunta de investigación es: ¿difieren significativamente las medias de la variable métrica entre los grupos definidos por el factor?

Se utiliza el dataset hatco. La variable dependiente es X10 (valoración del servicio) y el factor de agrupación es X14 (tipo de compra: nueva, recompra modificada, recompra directa).

Nota importante: en R, la variable de agrupación debe ser de tipo factor. Si se pasa como numérica, stats::aov() no funcionará correctamente. Conviene convertirla siempre antes de ejecutar el modelo.

#Loadind data
hatco <- expss::read_spss("data/hatco.sav")

# --- Step 1: Convert grouping variables to factor with descriptive labels ---
hatco <- hatco %>%
    dplyr::mutate(
        purchase_type = factor(X14, labels = c("new", "modified rebuy", "straight rebuy")),
        firm_type     = factor(X13, labels = c("type 1", "type 2"))
    )

# --- Step 2: Boxplot to visualize group differences ---
boxplot(hatco$X10 ~ hatco$purchase_type,
        col  = "lightgray",
        main = "Service rating by purchase type",
        xlab = "Purchase type",
        ylab = "Service rating (X10)")

# --- Step 3: One-way ANOVA ---
anova_one_way <- stats::aov(X10 ~ purchase_type, data = hatco)

# Summary table: F-statistic and p-value
summary(anova_one_way)
              Df Sum Sq Mean Sq F value Pr(>F)    
purchase_type  2  39.01  19.503   56.54 <2e-16 ***
Residuals     97  33.46   0.345                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Group means
stats::model.tables(anova_one_way, "means")
Tables of means
Grand mean
      
4.771 

 purchase_type 
       new modified rebuy straight rebuy
     3.929          5.003          5.394
rep 34.000         32.000         34.000

Interpretación para el investigador: el output de summary() ofrece la tabla ANOVA clásica. El dato clave es el p-value de la F (columna Pr(>F)):

  • Si \(p < 0.05\): al menos un par de grupos tiene medias significativamente distintas.
  • Si \(p \geq 0.05\): no hay evidencia de diferencias entre grupos.

Cuando el ANOVA es significativo, el siguiente paso sería un test post-hoc (Tukey, Bonferroni) para identificar qué pares de grupos difieren. Esto se abordará en sesiones posteriores.

Análisis de varianza de dos factores (ANOVA two-way)

El ANOVA de dos factores introduce un segundo factor de agrupación, lo que permite analizar no solo el efecto de cada factor por separado, sino también su posible interacción: ¿el efecto del tipo de compra sobre la valoración del servicio es diferente según el tipo de empresa?

# --- Two-way ANOVA: main effects of purchase_type and firm_type ---
anova_two_way <- stats::aov(X10 ~ purchase_type + firm_type, data = hatco)

# Summary table
summary(anova_two_way)
              Df Sum Sq Mean Sq F value Pr(>F)    
purchase_type  2  39.01  19.503  57.424 <2e-16 ***
firm_type      1   0.85   0.854   2.514  0.116    
Residuals     96  32.61   0.340                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Group means for each factor
stats::model.tables(anova_two_way, "means")
Tables of means
Grand mean
      
4.771 

 purchase_type 
       new modified rebuy straight rebuy
     3.929          5.003          5.394
rep 34.000         32.000         34.000

 firm_type 
    type 1 type 2
     4.863  4.679
rep 50.000 50.000

Interpretación para el investigador: summary() muestra ahora una fila por cada factor. Cada p-value se interpreta de forma independiente: un factor puede ser significativo aunque el otro no lo sea. Para testar la interacción entre ambos factores se utilizaría la sintaxis purchase_type * firm_type en lugar de purchase_type + firm_type.

Inferencia no paramétrica

Cuando los datos no cumplen el supuesto de normalidad — habitual en escalas de valoración, variables ordinales o muestras pequeñas — se recurre a los contrastes no paramétricos. Estos tests trabajan sobre rangos en lugar de sobre los valores originales, lo que los hace robustos frente a distribuciones asimétricas o con valores extremos.

Prueba Chi-cuadrado (\(\chi^2\))

Chi-cuadrado de bondad de ajuste (una muestra)

Este test compara la distribución observada en una muestra con una distribución teórica de referencia. La pregunta es: ¿se distribuyen los datos de forma similar a lo esperado?

# --- Observed frequencies vs. expected (theoretical) frequencies ---
observed_freq <- c(28, 47, 80, 82, 47, 35)
expected_freq <- c(30, 50, 75, 75, 50, 30)

# rescale.p = TRUE: R normalizes expected_freq to proportions automatically
chi2_goodness <- stats::chisq.test(observed_freq, p = expected_freq, rescale.p = TRUE)
print(chi2_goodness)

    Chi-squared test for given probabilities

data:  observed_freq
X-squared = 1.9941, df = 5, p-value = 0.85

Chi-cuadrado de independencia (tabla de contingencia)

Este es el uso más frecuente en investigación de mercados: determinar si dos variables categóricas están asociadas o son independientes entre sí.

# Loading data
data2 <- expss::read_spss("data/manners.sav")

# --- Step 1: Build the contingency table ---
contingency_table <- table(data2$freedman, data2$sex)
print(contingency_table)
                                                            
                                                             Male Female
  Don't know                                                   28     36
  No Answer                                                     1     10
  Allowing people freedom of expression/tolerate bad manners  268    232
  Enforcing good manners/limit freedom of expression          195    240
# --- Step 2: Chi-square test ---
# Without Yates correction (recommended for tables larger than 2x2)
chi2_no_yates <- stats::chisq.test(contingency_table, correct = FALSE)
print(chi2_no_yates)

    Pearson's Chi-squared test

data:  contingency_table
X-squared = 14.951, df = 3, p-value = 0.001859
# With Yates continuity correction (applies automatically to 2x2 tables)
chi2_yates <- stats::chisq.test(contingency_table, correct = TRUE)
print(chi2_yates)

    Pearson's Chi-squared test

data:  contingency_table
X-squared = 14.951, df = 3, p-value = 0.001859

Medidas de asociación derivadas

Un Chi-cuadrado significativo indica que hay asociación, pero no indica cuánta. Para eso se calculan medidas de efecto como la V de Cramér o el coeficiente de contingencia.

# --- Association measures: Cramer's V, contingency coefficient, etc. ---
association_stats <- vcd::assocstats(contingency_table)
print(association_stats)
                    X^2 df  P(> X^2)
Likelihood Ratio 16.138  3 0.0010623
Pearson          14.951  3 0.0018586

Phi-Coefficient   : NA 
Contingency Coeff.: 0.121 
Cramer's V        : 0.122 

Interpretación para el investigador: vcd::assocstats() devuelve varias medidas. La más utilizada en investigación de mercados es la V de Cramér: valores próximos a 0 indican asociación débil; próximos a 1, asociación fuerte. Para tablas 2×2, el coeficiente phi es equivalente.

Correlaciones no paramétricas

Cuando las variables no son métricas o no cumplen el supuesto de normalidad, la correlación de Pearson se sustituye por alternativas basadas en rangos.

El dataset grades contiene las notas de estadística (Estadística) y la puntuación de selectividad (Selectivo) de un grupo de alumnos.

Correlación de Spearman (\(\rho\))

Mide la correlación entre los rangos de las dos variables. Es la alternativa más común a Pearson cuando los datos son ordinales o presentan distribución no normal.

# Loading data
grades <- expss::read_spss("data/grades.sav")

# --- Spearman rank correlation ---
spearman_result <- stats::cor.test(
    grades$Estadística,
    grades$Selectivo,
    alternative = "two.sided",
    method      = "spearman",
    exact       = NULL,
    conf.level  = 0.95
)

print(spearman_result)

    Spearman's rank correlation rho

data:  grades$Estadística and grades$Selectivo
S = 1418, p-value = 0.02243
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.4546021 

Correlación de Kendall (\(\tau\))

Alternativa más conservadora a Spearman, especialmente recomendada con muestras pequeñas o cuando hay muchos empates en los rangos.

# --- Kendall's tau-b correlation ---
kendall_result <- stats::cor.test(
    grades$Estadística,
    grades$Selectivo,
    alternative = "two.sided",
    method      = "kendall",
    exact       = NULL,
    conf.level  = 0.95
)

print(kendall_result)

    Kendall's rank correlation tau

data:  grades$Estadística and grades$Selectivo
z = 2.1794, p-value = 0.0293
alternative hypothesis: true tau is not equal to 0
sample estimates:
      tau 
0.3539614 

Interpretación para el investigador: tanto \(\rho\) de Spearman como \(\tau\) de Kendall se interpretan igual que el r de Pearson en cuanto a signo y magnitud, pero sus valores no son directamente comparables entre sí. En general, \(\tau\) suele ser numéricamente más pequeño que \(\rho\) para los mismos datos — eso es normal y esperado.

Prueba de Wilcoxon — Muestras independientes (U de Mann-Whitney)

Es el equivalente no paramétrico del test t para muestras independientes. Compara si las distribuciones de dos grupos independientes son similares, sin exigir que los datos sigan una distribución normal.

El dataset bdi recoge puntuaciones de depresión (BDI) de dos grupos de sujetos (droga: 1 = alcohol, 2 = éxtasis) medidos en dos días de la semana (sunbdi = domingo, wedbdi = miércoles).

Diagnóstico de normalidad (Lilliefors y Shapiro-Wilk)

Antes de decidir qué prueba aplicar, es imprescindible verificar si los datos cumplen el supuesto de normalidad. La regla de decisión es siempre la misma: la hipótesis nula (H₀) afirma que la distribución es normal. Un p-valor inferior a 0,05 lleva a rechazar H₀ y a concluir que los datos no se distribuyen con normalidad — lo que justifica el uso de una prueba no paramétrica.

Se combinan dos contrastes de normalidad para mayor robustez:

  • Lilliefors (corrección de Kolmogórov-Smirnov): más potente cuando los parámetros de la distribución no son conocidos de antemano y se estiman a partir de la propia muestra.
  • Shapiro-Wilk: especialmente recomendado para muestras pequeñas (n < 50). Es el contraste de referencia habitual en investigación aplicada.

Se ejecutan los ocho contrastes resultantes de cruzar los cuatro vectores (grupo × día) con los dos tests:

bdi <- expss::read_spss('data/bdi.sav')
# --- Step 1: Split data by group and measurement day ---
alcohol_sunday <- bdi %>% dplyr::filter(droga == 1) %>% dplyr::pull(sunbdi)
ecstasy_sunday <- bdi %>% dplyr::filter(droga == 2) %>% dplyr::pull(sunbdi)
alcohol_wednes <- bdi %>% dplyr::filter(droga == 1) %>% dplyr::pull(wedbdi)
ecstasy_wednes <- bdi %>% dplyr::filter(droga == 2) %>% dplyr::pull(wedbdi)

# --- Step 2: Normality tests ---
# Lilliefors
print(nortest::lillie.test(alcohol_sunday))
print(nortest::lillie.test(ecstasy_sunday))
print(nortest::lillie.test(alcohol_wednes))
print(nortest::lillie.test(ecstasy_wednes))

# Shapiro-Wilk
print(shapiro.test(alcohol_sunday))
print(shapiro.test(ecstasy_sunday))
print(shapiro.test(alcohol_wednes))
print(shapiro.test(ecstasy_wednes))

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  alcohol_sunday
D = 0.27585, p-value = 0.02986


    Lilliefors (Kolmogorov-Smirnov) normality test

data:  ecstasy_sunday
D = 0.16992, p-value = 0.5687


    Lilliefors (Kolmogorov-Smirnov) normality test

data:  alcohol_wednes
D = 0.23469, p-value = 0.1226


    Lilliefors (Kolmogorov-Smirnov) normality test

data:  ecstasy_wednes
D = 0.30502, p-value = 0.00894


    Shapiro-Wilk normality test

data:  alcohol_sunday
W = 0.81064, p-value = 0.01952


    Shapiro-Wilk normality test

data:  ecstasy_sunday
W = 0.95947, p-value = 0.7798


    Shapiro-Wilk normality test

data:  alcohol_wednes
W = 0.94114, p-value = 0.5658


    Shapiro-Wilk normality test

data:  ecstasy_wednes
W = 0.75347, p-value = 0.003933

Lectura de los resultados. Cada test devuelve un estadístico (D en Lilliefors, W en Shapiro-Wilk) y su p-valor asociado. La atención debe centrarse en el p-valor: si es mayor que 0,05, no hay evidencia para rechazar la normalidad; si es menor que 0,05, la normalidad queda descartada para ese grupo y ese momento de medición.

En este caso, los resultados muestran p-valores por debajo de 0,05 en la mayoría de los subgrupos — en especial en el grupo de éxtasis. Cuando al menos uno de los grupos no cumple la normalidad, la comparación paramétrica (test t) deja de ser válida y debe sustituirse por su alternativa no paramétrica. Esa alternativa es la prueba de Wilcoxon para muestras independientes, también conocida como U de Mann-Whitney.

Prueba W de Wilcoxon — U de Mann-Whitney

Una vez diagnosticada la falta de normalidad, se aplica el contraste no paramétrico. La prueba de Wilcoxon para muestras independientes transforma las puntuaciones originales en rangos y compara la distribución de esos rangos entre los dos grupos. La hipótesis nula es que las distribuciones de ambos grupos son idénticas (o equivalentemente, que la diferencia de localización entre ellas es cero).

# --- Wilcoxon rank-sum test (Mann-Whitney U) ---
# Sunday: alcohol vs ecstasy
wilcox_sunday <- stats::wilcox.test(alcohol_sunday, ecstasy_sunday,
                                      paired      = FALSE,        # Independent groups
                                      alternative = "two.sided",
                                      mu          = 0,
                                      conf.int    = TRUE,
                                      conf.level  = 0.95)
print(wilcox_sunday)

    Wilcoxon rank sum exact test

data:  alcohol_sunday and ecstasy_sunday
W = 64.5, p-value = 0.2882
alternative hypothesis: true location shift is not equal to 0
95.9 percent confidence interval:
 -1  5
sample estimates:
difference in location 
                     1 
# Wednesday: alcohol vs ecstasy
wilcox_wednes <- stats::wilcox.test(alcohol_wednes, ecstasy_wednes,
                                      paired      = FALSE,
                                      alternative = "two.sided",
                                      mu          = 0,
                                      conf.int    = TRUE,
                                      conf.level  = 0.95)
print(wilcox_wednes)

    Wilcoxon rank sum exact test

data:  alcohol_wednes and ecstasy_wednes
W = 96, p-value = 0.0001299
alternative hypothesis: true location shift is not equal to 0
96.3 percent confidence interval:
 18 29
sample estimates:
difference in location 
                  23.5 

Interpretación de los resultados. El output de R incluye el estadístico W (suma de rangos del primer grupo), el p-valor y, si se solicita, el intervalo de confianza para la diferencia de medianas (pseudomediana de Hodges-Lehmann). Conviene tener en cuenta que R denomina a este estadístico W, mientras que otros programas estadísticos utilizan U; los valores numéricos difieren, pero el p-valor es matemáticamente equivalente y la conclusión estadística es idéntica.

  • Si \(p < 0.05\): se rechaza H₀ y se concluye que los dos grupos presentan distribuciones significativamente distintas — los perfiles de depresión del grupo de alcohol y del grupo de éxtasis difieren en ese día de la semana.
  • Si \(p \geq 0.05\): no hay evidencia suficiente para afirmar que las distribuciones sean distintas.

La interpretación debe realizarse para cada día de medición por separado, ya que el estado del sujeto puede variar entre el domingo (normalmente el día de mayor consumo) y el miércoles (varios días después).

Prueba de Wilcoxon — Muestras dependientes (V de Wilcoxon)

Cuando se quiere comparar dos mediciones del mismo sujeto en momentos distintos — en lugar de comparar dos grupos diferentes —, el diseño es dependiente o apareado. En este caso, cada individuo actúa como su propio control, lo que elimina la variabilidad entre sujetos y hace el análisis más potente.

El equivalente no paramétrico del test t para muestras pareadas es la prueba de los rangos con signo de Wilcoxon. A diferencia del caso anterior, aquí se trabaja dentro de cada grupo (alcohol o éxtasis) y se comparan las puntuaciones del domingo con las del miércoles para los mismos individuos.

Diagnóstico de normalidad de las diferencias

Para el test t pareado, el supuesto que debe cumplirse no es la normalidad de cada variable por separado, sino la normalidad de las diferencias dentro de cada par. Cuando ese supuesto no se sostiene — o cuando el tamaño muestral es pequeño y no puede verificarse con fiabilidad —, la alternativa no paramétrica es la prueba de Wilcoxon pareada.

En los grupos de este estudio, los tamaños muestrales son reducidos y los diagnósticos anteriores ya han mostrado desviaciones de la normalidad. Esto refuerza la decisión de emplear la versión no paramétrica también para las comparaciones intra-grupo.

# --- Wilcoxon signed-rank test (paired) ---
# Alcohol group: Sunday vs Wednesday
wilcox_alcohol_paired <- stats::wilcox.test(alcohol_sunday, alcohol_wednes,
                                              paired      = TRUE,  # Same subjects, two occasions
                                              alternative = "two.sided",
                                              mu          = 0,
                                              conf.int    = TRUE,
                                              conf.level  = 0.95)
print(wilcox_alcohol_paired)

    Wilcoxon signed rank exact test

data:  alcohol_sunday and alcohol_wednes
V = 0, p-value = 0.007812
alternative hypothesis: true location shift is not equal to 0
96.5 percent confidence interval:
 -18.0  -6.5
sample estimates:
LABEL: Depresion BDI domingo 
VALUES:
-13
# Ecstasy group: Sunday vs Wednesday
wilcox_ecstasy_paired <- stats::wilcox.test(ecstasy_sunday, ecstasy_wednes,
                                              paired      = TRUE,
                                              alternative = "two.sided",
                                              mu          = 0,
                                              conf.int    = TRUE,
                                              conf.level  = 0.95)
print(wilcox_ecstasy_paired)

    Wilcoxon signed rank exact test

data:  ecstasy_sunday and ecstasy_wednes
V = 47, p-value = 0.04492
alternative hypothesis: true location shift is not equal to 0
95.3 percent confidence interval:
  2.0 10.5
sample estimates:
LABEL: Depresion BDI domingo 
VALUES:
7.5

Interpretación de los resultados. El estadístico que devuelve R en este caso se denomina V y corresponde a la suma de rangos positivos de las diferencias (domingo − miércoles). El p-valor se interpreta de la misma forma que en cualquier contraste de hipótesis:

  • Si \(p < 0.05\): se rechaza H₀ y se concluye que existe un cambio estadísticamente significativo en las puntuaciones de depresión entre el domingo y el miércoles dentro de ese grupo. Dicho de otro modo, el patrón de consumo tiene un impacto detectable en el estado de ánimo a lo largo de la semana.
  • Si \(p \geq 0.05\): no hay evidencia de que el estado de ánimo varíe significativamente entre los dos momentos de medición.

Al igual que en el caso independiente, el estadístico V de R no coincide numéricamente con el que ofrecen otros programas estadísticos, pero el p-valor es equivalente y la conclusión no varía. El intervalo de confianza al 95 % para la pseudomediana de las diferencias permite cuantificar también la magnitud del cambio observado.

Derechos de autor

Roberto Gil 2026-2027