Técnicas multivariantes de investigación en marketing
  • Presentación
  • Sesiones
    • Parte 1
    • Parte 2
    • Parte 3
    • Parte 4
    • Parte 5
    • Parte 6
  • Otros
    • Citar en Quarto
    • Acerca de …

Contenidos

  • Parte 2
    • 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
        • La conclusión estadística estricta
        • ¿Qué hacer ahora?
        • Guía rápida para los informes
        • Otros diagnósticos visuales
          • Gráfico Q-Q estándar
      • 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)

Parte 2

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 oro en muestras pequeñas. Evalúa la hipótesis nula (\(H_0\)): “La distribución de la muestra no difiere significativamente de una distribución normal”.
  • Test de Kolmogorov-Smirnov (con corrección de Lilliefors): Es una alternativa habitual, especialmente útil en muestras más grandes para comparar la forma de la distribución frente a una normal teórica.

Shapiro-Wilk: El más potente (Muestras pequeñas/medianas)

Es considerado universalmente el test más potente para detectar desviaciones de la normalidad.

  • Cuándo usarlo: Es la elección ideal para muestras de menos de 50 (e incluso hasta 100 o 200) casos.
  • Por qué: Tiene una capacidad superior para detectar que los datos no son normales cuando la muestra es pequeña.
  • Limitación: Con muestras muy grandes (por ejemplo, encuestas de 1.000+ personas), pierde su ventaja y se vuelve extremadamente sensible a cualquier mínima desviación.

Kolmogorov-Smirnov (con corrección de Lilliefors): El estándar para muestras grandes

El test K-S original es bastante pobre. Sin embargo, la corrección de Lilliefors ajusta el test específicamente para probar la normalidad cuando la media y la desviación típica se estiman a partir de la propia muestra (lo habitual en la práctica).

  • Cuándo usarlo: Es el test preferido cuando el tamaño muestral es grande (digamos, > 200 o 300 casos).
  • Por qué: Es más robusto y fiable que Shapiro-Wilk cuando el número de observaciones es elevado, ya que no se “desboca” tan fácilmente con desviaciones irrelevantes.
La trampa de la muestra grande

Conviene tener cuidado: al aumentar el tamaño de la muestra (\(n\)), estos tests se vuelven extremadamente sensibles. En bases de datos muy grandes, incluso una desviación insignificante de la normalidad provoca que el test rechace la hipótesis nula (\(p < 0.05\)). No debe confundirse “significación estadística” con “relevancia práctica”.

Una decisión nunca debe basarse únicamente en un número. El protocolo recomendado es siempre:

  1. Ejecutar el test: obtener el p-value de Shapiro-Wilk o Kolmogorov-Smirnov.
  2. Visualizar el histograma: contrastar el resultado estadístico con el gráfico. Si el test indica que no hay normalidad pero el histograma muestra una campana razonable, debe prevalecer el criterio experto del investigador.
  3. Decidir: si el sesgo es real y grave, se opta por pruebas no paramétricas o por transformaciones de los datos antes de forzar el uso de técnicas paramétricas.

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 histograma siempre revela la verdad que el p-value oculta.

Se testa ahora la normalidad de la distribución con la prueba de Kolmogorov-Smirnov, corrigiendo el dato con la prueba de Lilliefors (adecuada para este propósito), y se calcula también Shapiro-Wilk, la prueba más potente para medir la normalidad.

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.

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")
H0 → los datos siguen una distribución normal
# --- 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
lillie.test(fib2$dia1)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  fib2$dia1
D = 0.053023, p-value = 1.288e-05
# --- Shapiro-Wilk test ---
# H0: the variable follows a normal distribution (most powerful test for small/medium n)
shapiro.test(fib2$dia1)

    Shapiro-Wilk normality test

data:  fib2$dia1
W = 0.97795, p-value = 1.043e-09
# Basic gghistogram, no overlay
ggpubr::gghistogram(
  fib2, x = "dia1",
  fill = "steelblue", color = "white",
  title = "Distribución"
)

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”.

La conclusión estadística estricta

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.

¿Qué hacer ahora?

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.

Guía rápida para los informes

  1. ¿Muestra pequeña (\(n < 50\))? Se recomienda Shapiro-Wilk, el que mejor “afina” el ojo.
  2. ¿Muestra grande (\(n > 200\))? Se recomienda Lilliefors (K-S), que evita falsas alarmas que Shapiro detectaría como “no normal” por puro azar estadístico.
  3. ¿Duda eterna? Como siempre, el histograma.

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

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 ---
shapiro.test(fib2$dia1_sqrt)

    Shapiro-Wilk normality test

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

    Shapiro-Wilk normality test

data:  fib2$dia1_log
W = 0.89497, p-value < 2.2e-16
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.
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 ---
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
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 de negocio. 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
one_sample_ttest <- 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%)
)

# Printing the result
print(one_sample_ttest)

    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(shapiro.test(before_scores))

    Shapiro-Wilk normality test

data:  before_scores
W = 0.86876, p-value = 0.07472
print(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.

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 aplicar el test no paramétrico, conviene verificar que efectivamente existe un problema de normalidad que justifique su uso.

# Loading data
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))

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  alcohol_sunday
D = 0.27585, p-value = 0.02986
print(nortest::lillie.test(ecstasy_sunday))

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  ecstasy_sunday
D = 0.16992, p-value = 0.5687
print(nortest::lillie.test(alcohol_wednes))

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  alcohol_wednes
D = 0.23469, p-value = 0.1226
print(nortest::lillie.test(ecstasy_wednes))

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  ecstasy_wednes
D = 0.30502, p-value = 0.00894
# Shapiro-Wilk
print(shapiro.test(alcohol_sunday))

    Shapiro-Wilk normality test

data:  alcohol_sunday
W = 0.81064, p-value = 0.01952
print(shapiro.test(ecstasy_sunday))

    Shapiro-Wilk normality test

data:  ecstasy_sunday
W = 0.95947, p-value = 0.7798
print(shapiro.test(alcohol_wednes))

    Shapiro-Wilk normality test

data:  alcohol_wednes
W = 0.94114, p-value = 0.5658
print(shapiro.test(ecstasy_wednes))

    Shapiro-Wilk normality test

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

Prueba W de Wilcoxon — U de Mann-Whitney

# --- 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 para el investigador: el p-value se interpreta igual que en el test t: si \(p < 0.05\), los dos grupos presentan distribuciones significativamente distintas. La estadística W que devuelve R es la suma de rangos, no la U clásica de otros programas estadísticos — los valores numéricos difieren, pero el p-value es equivalente.

Prueba de Wilcoxon — Muestras dependientes (V de Wilcoxon)

Es el equivalente no paramétrico del test t para muestras pareadas. Compara dos mediciones del mismo sujeto cuando no se cumple la normalidad de las diferencias.

# --- 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.99)
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
99 percent confidence interval:
 -19.5  -3.0
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.99)
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
99.1 percent confidence interval:
 -1.5 11.5
sample estimates:
LABEL: Depresion BDI domingo 
VALUES:
7.5

Interpretación para el investigador: la estadística V que devuelve R es la suma de rangos negativos — numéricamente distinta al resultado de otros programas estadísticos, pero el p-value es equivalente. Si \(p < 0.01\) (con un 99% de confianza), se concluye que el patrón del grupo varía significativamente entre el domingo y el miércoles.