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:
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).
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?
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).
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:
Ejecutar el test: obtener el p-value de Shapiro-Wilk o Kolmogorov-Smirnov.
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.
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 distributionlillie.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 overlayggpubr::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 dia1no 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:
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).
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.
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
¿Muestra pequeña (\(n < 50\))? Se recomienda Shapiro-Wilk, el que mejor “afina” el ojo.
¿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.
¿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 Plotggpubr::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 valuesfib2$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 rowpar(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 figurepar(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 groupvar_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 interpretvariance_ratio <-max(var_male, var_female) /min(var_male, var_female)# 3. Print the resultcat("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")
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 comparisonggplot(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:
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.
# 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:
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-testone_sample_ttest <- stats::t.test( gssft1$hrs1, # The variable to analyzemu = target_mean, # The reference valuealternative ="two.sided", # Two-tailed: looking for any differenceconf.level =0.95# Standard confidence level (95%))# Printing the resultprint(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 datagssnet2 <- expss::read_spss("data/gssnet2.sav")# Convert sex to factor with descriptive labelsgssnet2$sex_factor <-factor(gssnet2$sex, labels =c("Hombre", "Mujer"))# Levene's test for homogeneity of variancescar::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
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
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
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 datasetgssz <- expss::read_spss('data/gszz.sav')# Contingency table: sex vs group membershipcontingency_sex_group <-table(gssz$sexo, gssz$grupo)print(contingency_sex_group)
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 sexgroup_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 dataendorph1 <- expss::read_spss("data/endorph1.sav")# --- Step 1: Descriptive statistics of the difference ---before_scores <- endorph1$beforeafter_scores <- endorph1$afterdiff_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 differenceci_lower <- diff_mean - (2* diff_se)ci_upper <- diff_mean + (2* diff_se)cat("Mean difference:", round(diff_mean, 3), "\n")
# --- 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 differencepaired =TRUE, # KEY: same subjects measured twiceconf.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
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).
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.
# --- Step 3: One-way ANOVA ---anova_one_way <- stats::aov(X10 ~ purchase_type, data = hatco)# Summary table: F-statistic and p-valuesummary(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 meansstats::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 tablesummary(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 factorstats::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 automaticallychi2_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í.
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)
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.
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 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.
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
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 Wednesdaywilcox_alcohol_paired <- stats::wilcox.test(alcohol_sunday, alcohol_wednes,paired =TRUE, # Same subjects, two occasionsalternative ="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
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.