# Load the dataset (expss::read_spss preserves variable/value labels from SPSS)
gssft1 <- expss::read_spss('data/gssft1.sav')Parte 2
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:
- 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.
- 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?).
- 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).
- 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.
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:
- 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.
- 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:
- 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). - Ejecución del test: se utiliza la sintaxis de fórmulas
variable_metrica ~ variable_factor. - 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:
- 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. - 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.
- 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.