Introducción
indefinido, comencé a pensar en los paralelismos entre la detección de anomalías puntuales y la detección de tendencias. Cuando se trata de puntos, generalmente es intuitivo y la puntuación z resuelve la mayoría de los problemas. Lo que me tomó un tiempo darme cuenta fue aplicar algún tipo de prueba estadística a las tendencias: los puntos singulares ahora son distribuciones completas, y la desviación estándar que tenía mucho sentido cuando miraba un punto, comenzó a parecer completamente incorrecta. Esto es lo que descubrí.
Para una comprensión más sencilla, he adornado esta publicación con algunas simulaciones que configuré y algunos gráficos que creé como resultado.
Z-Scores: cuando dejan de funcionar
La mayoría de las personas recurren a la puntuación z en el momento en que quieren detectar algo extraño. Es muy simple:
$$ z = frac{x – mu}{sigma} $$
(x) es tu nueva observación, ( mu ) es cómo suele verse "normal", ( sigma ) es cuánto se mueven normalmente las cosas. El número que obtiene le dice: "este punto está a tantas desviaciones estándar del resto".
¿Una z de 3? Esa es más o menos la línea de “mierda santa”: bajo una distribución normal, solo se ve algo tan lejano alrededor del 0,27% de las veces (de dos colas). Se siente limpio. Se siente honesto.
Por qué mágicamente se vuelve normal estándar (derivación rápida)
Comience con cualquier variable normal X ~ N(( mu ), ( sigma^2 )).
Resta la media → (x – mu). Ahora el centro es cero. Dividir por la desviación estándar → ( (x – mu) / sigma ). Ahora el diferencial (varianza) es exactamente 1.
Haz ambas cosas y obtendrás:
$$ Z = frac{X – mu}{sigma} sim N(0, 1) $$
Eso es todo. Cualquier variable normal, sin importar su media o escala original, queda aplastada y estirada hasta formar la misma aburrida curva de campana que todos memorizamos. Es por eso que los puntajes z parecen universales: le permiten usar las mismas tablas de búsqueda en todas partes.
la captura
En el mundo real casi nunca conocemos los verdaderos ( mu ) y ( sigma ). Los estimamos a partir de datos recientes, digamos los últimos 7 puntos.
Aquí está la parte peligrosa: ¿incluye el punto actual en esa ventana o no?
Si lo hace, un gran valor atípico infla su ( sigma ) en el acto. Tu puntuación z se reduce. La anomalía se esconde. Terminas pensando "eh, no es tan raro después de todo".
Si lo excluyes (cambia en 1, usa solo la ventana anterior), obtienes una pelea justa: "¿Qué tan extraño es este nuevo punto en comparación con lo que era normal antes de que llegara?"
La mayoría de las implementaciones sólidas hacen lo último. Incluye el punto y básicamente estarás suavizando, no detectando.
Este fragmento debería darle un ejemplo.
Importar código numpy como np importar pandas como pd importar matplotlib.pyplot como plt # Establecer semilla para reproducibilidad np.random.seed(42) # establecer ppp en 250 para gráficos de alta resolución plt.rcParams['figure.dpi'] = 250 # Generar series de 30 puntos: nivel base 10, ligera tendencia ascendente en los últimos 10 puntos, ruido, un gran valor atípico n = 30 t = np.arange(n) base = 10 + 0.1 * t[-10:] # pequeña tendencia solo en la última parte data = np.full(n, 10.0) data[:20] = 10 + np.random.normal(0, 1.5, 20) data[20:] = base + np.random.normal(0, 1.5, 10) data[15]+= 8 # gran valor atípico en el índice 15 df = pd.DataFrame({'value': data}, index=t) # Tamaño de ventana móvil window = 7 # Versión 1: EXCLUIR el punto actual (recomendado para detección) df['roll_mean_ex'] = df['value'].shift(1).rolling(window).mean() df['roll_std_ex'] = df['value'].shift(1).rolling(window).std() df['z_ex'] = (df['value'] – df['roll_mean_ex']) / df['roll_std_ex'] # Versión 2: INCLUIR el punto actual (autoamortiguador) df['roll_mean_inc'] = df['value'].rolling(window).mean() df['roll_std_inc'] = df['value'].rolling(window).std() df['z_inc'] = (df['value'] – df['roll_mean_inc']) / df['roll_std_inc'] # Agregue la comparación de puntuaciones Z como una tercera subtrama, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(12, 12), sharex=True) # Gráfico superior: original + significa ax1.plot(df.index, df['value'], 'o-', label='Observed', color='black', alpha=0.7) ax1.plot(df.index, df['roll_mean_ex'], label='Media móvil (excluir actual)', color='blue') ax1.plot(df.index, df['roll_mean_inc'], '–', label='Media móvil (incluir actual)', color='red') ax1.set_title('Serie temporal + Media móvil (ventana=7)') ax1.legend() ax1.grid(True, alpha=0.3) # Trama intermedia: stds móviles ax2.plot(df.index, df['roll_std_ex'], label='Rolling std (excluir actual)', color='blue') ax2.plot(df.index, df['roll_std_inc'], '–', label='Rolling std (incluir actual)', color='red') ax2.set_title('Desviaciones estándar rodantes') ax2.legend() ax2.grid(True, alpha=0.3) # Gráfico inferior: comparación de puntuaciones Z ax3.plot(df.index, df['z_ex'], 'o-', label='Z-score (excluir actual)', color='blue') ax3.plot(df.index, df['z_inc'], 'x–', label='Puntuación Z (incluir actual)', color='rojo') ax3.axhline(3, color='gris', estilo de línea=':', alfa=0.6) ax3.axhline(-3, color='gris', estilo de línea=':', alfa=0.6) ax3.set_title('Puntuaciones Z: Excluir vs Incluir punto actual') ax3.set_xlabel('Tiempo') ax3.set_ylabel('Puntuación Z') ax3.legend() ax3.grid(True, alpha=0.3) plt.tight_layout() plt.show()
Valores p
Calcula z y luego pregunta: bajo el valor nulo (“esto proviene de la misma distribución que mi ventana”), ¿cuál es la probabilidad de que vea algo tan extremo?
Valor p de dos colas = 2 × (1 − cdf(|z|)) en la normal estándar.
z = 3 → p ≈ 0,0027 → “probablemente no sea ruido aleatorio”.
z = 1,5 → p ≈ 0,1336 → “eh, podría suceder”.
Simple. Hasta que las suposiciones empiecen a desmoronarse.
Suposiciones
La puntuación z (y su valor p) supone dos cosas:
Los datos de la ventana son más o menos normales (o al menos se comportan las colas). Su ( sigma ) estimado está lo suficientemente cerca del valor real de la población.
Una ventana torcida, por ejemplo, viola el punto 1. Esto significa que decir que algo está dentro de 3(sigma) en realidad podría tener solo un 85% de probabilidad, en lugar del 99,7% esperado.
De manera similar, con una ventana lo suficientemente pequeña, ( sigma ) es ruidoso, lo que hace que las puntuaciones z oscilen más de lo que deberían.
Conceptos básicos de las pruebas de hipótesis: rechazar lo nulo, no probar la alternativa
La prueba de hipótesis proporciona el marco formal para decidir si los datos observados respaldan una afirmación de interés. La estructura es consistente en herramientas como la puntuación z y la estadística t.
El proceso comienza con dos hipótesis en competencia:
La hipótesis nula (H₀) representa el supuesto predeterminado: sin efecto, sin diferencia o sin tendencia. En la detección de anomalías, H₀ establece que la observación pertenece a la misma distribución que los datos de referencia. En el análisis de tendencias, H₀ normalmente indica que la pendiente es cero. La hipótesis alternativa (H₁) representa la afirmación bajo investigación: hay un efecto, una diferencia o una tendencia.
La estadística de prueba (puntuación z o estadística t) cuantifica hasta qué punto los datos se desvían de lo que se esperaría con H₀.
El valor p es la probabilidad de obtener un estadístico de prueba al menos tan extremo como el observado, asumiendo que H₀ es verdadero. Un valor p pequeño indica que un resultado tan extremo es poco probable bajo el valor nulo.
La regla de decisión es sencilla:
Si el valor p está por debajo de un nivel de significancia preespecificado (comúnmente 0,05), rechace H₀. Si el valor p excede el umbral, no rechace H₀.
Un punto clave es que no rechazar H₀ no prueba que H₀ sea verdadero. Sólo indica que los datos no aportan pruebas suficientes en su contra. La ausencia de evidencia no es evidencia de ausencia.
La prueba de dos colas es estándar para la detección de anomalías y muchas pruebas de tendencias porque pueden ocurrir desviaciones en cualquier dirección. Por lo tanto, el valor p se calcula como el doble de la probabilidad de una cola.
Para la puntuación z, la prueba se basa en la distribución normal estándar bajo nula. Para muestras pequeñas o cuando la varianza se estima a partir de los datos, se utiliza la distribución t, como se analiza en secciones posteriores.
Este marco se aplica de manera uniforme: el estadístico de prueba mide la desviación del valor nulo, la distribución proporciona la referencia de qué tan inusual es esa desviación y el valor p traduce esa inusualidad en una regla de decisión.
Los supuestos subyacentes a la distribución (normalidad de los errores, independencia) deben cumplirse para que el valor p se interprete correctamente. Cuando se violan esos supuestos, las probabilidades reportadas pierden confiabilidad, lo que se convierte en una preocupación central al extender el enfoque más allá de las anomalías puntuales.
El principio señal-ruido: conectando puntuaciones Z y estadísticas t
La puntuación z y el estadístico t son instancias de la relación
$$ frac{text{señal}}{text{ruido}}. $$
La señal es la desviación del valor nulo: (x – mu) para anomalías puntuales y (hat{beta}_1 – 0) para la pendiente en regresión lineal.
El término de ruido es la medida de la variabilidad bajo la hipótesis nula. Para la puntuación z, el ruido es (sigma) (desviación estándar de las observaciones de referencia). Para el estadístico t, el ruido es el error estándar (text{SE}(hat{beta}_1)).
Error estándar versus desviación estándar
La desviación estándar mide la dispersión de las observaciones individuales alrededor de su media. Para una muestra, es la raíz cuadrada de la varianza muestral, normalmente denotada como s:
$$ s = sqrt{ frac{1}{n-1} sum (x_i – bar{x})^2 }. $$
El error estándar cuantifica la variabilidad de una estadística resumida (como la media muestral o un coeficiente de regresión) entre muestras repetidas de la misma población. Siempre es menor que la desviación estándar porque promediar o estimar reduce la variabilidad.
Para la media muestral, el error estándar es
$$ text{SE}(bar{x}) = frac{s}{sqrt{n}}, $$
donde s es la desviación estándar de la muestra y n es el tamaño de la muestra. La división por (sqrt{n}) refleja el hecho de que la media de n observaciones independientes tiene una varianza igual a la varianza de la población dividida por n.
En regresión, el error estándar de la pendiente (text{SE}(hat{beta}_1)) depende de la varianza residual s², la dispersión de la variable predictiva y el tamaño de la muestra, como se muestra en la sección anterior. A diferencia de la desviación estándar de la variable de respuesta, que incluye tanto la señal como el ruido, el error estándar aísla la incertidumbre en la propia estimación del parámetro.
La distinción es esencial: la desviación estándar describe la dispersión de los datos sin procesar, mientras que el error estándar describe la precisión de una cantidad estimada. El uso de la desviación estándar en lugar del error estándar para una estadística derivada (como una pendiente) mezcla la señal con el ruido, lo que lleva a una inferencia incorrecta.
La relación cuantifica el efecto observado en relación con la variabilidad esperada si la hipótesis nula fuera cierta. Un valor grande indica que el efecto es poco probable únicamente con variación aleatoria.
En la detección de anomalías puntuales, (sigma) es la desviación estándar de las observaciones individuales alrededor de (mu). En la detección de tendencias, la cantidad de interés es (hat{beta}_1) del modelo (y_i = beta_0 + beta_1 x_i + epsilon_i). El error estándar es
$$ text{SE}(hat{beta}_1) = sqrt{ frac{s^2}{sum (x_i – bar{x})^2} }, $$
donde (s^2) es el error cuadrático medio residual después de ajustar la línea.
Usando la desviación estándar bruta de (y_i) como denominador se obtendría
$$ frac{hat{beta}_1}{sqrt{text{Var}(y)}} $$
e incluye tanto la tendencia sistemática como las fluctuaciones aleatorias en el denominador, lo que infla el término de ruido y subestima la fuerza de la tendencia.
El estadístico t utiliza
$$ t = frac{sombrero{beta}_1}{text{SE}(sombrero{beta}_1)} $$
y sigue la distribución t con (n-2) grados de libertad porque (s^2) se estima a partir de los residuos. Esta estimación de la varianza introduce incertidumbre adicional, que se refleja en las colas más anchas de la distribución t en comparación con la normal estándar.
La misma estructura señal-ruido aparece en la mayoría de las estadísticas de prueba. El estadístico F compara la varianza explicada con la varianza residual:
$$ F = frac{text{MS explicado}}{text{MS residual}}. $$
La estadística de chi-cuadrado compara las frecuencias observadas con las esperadas, escaladas según los valores esperados:
$$ chi^2 = sum frac{(O_i – E_i)^2}{E_i}. $$
En cada caso, la estadística es una relación entre la desviación observada y la variación esperada bajo el valor nulo. La puntuación z y el estadístico t son realizaciones específicas de este principio adaptadas a pruebas sobre medias o coeficientes de regresión.
Cuando se rompen los puntajes Z: el problema de la tendencia
La puntuación z funciona de manera confiable cuando se aplica a observaciones individuales frente a una línea de base estable. Sin embargo, extenderlo a la detección de tendencias introduce cuestiones fundamentales que socavan su validez.
Considere una serie de tiempo cuyo objetivo es probar si existe una tendencia lineal. Se podría calcular la pendiente de mínimos cuadrados ordinarios (hat{beta}_1) e intentar estandarizarla utilizando el marco de puntuación z dividiendo por la desviación estándar de la variable de respuesta:
$$ z = frac{hat{beta}_1}{sqrt{text{Var}(y)}}. $$
Este enfoque es incorrecto. La desviación estándar (sqrt{text{Var}(y)}) mide la dispersión total de la variable de respuesta, que incluye tanto la tendencia sistemática (la señal) como las fluctuaciones aleatorias (el ruido). Cuando hay una tendencia, la varianza de y se ve inflada por la tendencia misma. Colocar esta varianza inflada en el denominador reduce la magnitud del estadístico de prueba, lo que lleva a una subestimación de la importancia de la tendencia.
Una alternativa común es utilizar la desviación estándar estimada a partir de datos antes de que comience la tendencia sospechada, por ejemplo a partir de observaciones anteriores a un momento t = 10. Esto parece lógico pero falla por la misma razón que antes: el proceso puede no ser estacionario.
Un breve repaso sobre la estacionariedad
La estacionariedad en una serie de tiempo significa que las propiedades estadísticas del proceso (media, varianza y estructura de autocovarianza) permanecen constantes a lo largo del tiempo.
Una serie estacionaria no tiene ningún cambio sistemático en el nivel (sin tendencia), ningún cambio en la dispersión (varianza constante) y no depende de la relación entre las observaciones en el momento específico, lo que la hace predecible y adecuada para el modelado estadístico estándar.
Si las propiedades centrales de nuestra distribución (que es nuestra ventana en este caso) cambian, la (sigma) previa a la tendencia ya no es representativa de la variabilidad durante el período de la tendencia. La estadística de prueba refleja entonces un nivel de ruido irrelevante, produciendo falsos positivos o falsos negativos dependiendo de cómo haya evolucionado la varianza.
El problema central es que la cantidad que se está probando (la pendiente) es una estadística resumida derivada calculada a partir de los mismos datos utilizados para estimar el ruido. A diferencia de las anomalías puntuales, donde la observación de la prueba es independiente de la ventana de referencia, el parámetro de tendencia está entrelazado con los datos. Cualquier intento de utilizar la varianza bruta de y mezcla la señal con la estimación del ruido, violando el requisito de que el denominador represente la variabilidad bajo la hipótesis nula de que no hay tendencia.
Esta contaminación no es un detalle técnico menor. Sesga sistemáticamente la prueba hacia el conservadurismo cuando existe una tendencia, porque el denominador crece con la fuerza de la tendencia. El resultado es que las tendencias genuinas son más difíciles de detectar y los valores p informados son mayores de lo que deberían ser.
Estas limitaciones explican por qué el puntaje z, a pesar de su simplicidad y atractivo intuitivo, no se puede aplicar directamente a la detección de tendencias sin modificaciones. El estadístico t aborda precisamente esta cuestión mediante la construcción de una medida de ruido que excluye la tendencia ajustada, como se explica en la siguiente sección.
Una simulación rápida para comparar los resultados del estadístico t con el resultado de puntuación z “incorrecto”/ingenuo:
Código importar numpy como np importar pandas como pd importar matplotlib.pyplot como plt desde scipy importar estadísticas # ──────────────────────── ──────────────────────── # Generación de datos (igual que antes) np.random.seed(42) n = 30 t = np.arange(n) data = np.full(n, 10.0) data[:20] = 10 + np.random.normal(0, 1.5, 20) data[20:] = 10 + 0.1 * t[20:] + np.aleatorio.normal(0, 1,5, 10) datos[15]+= 8 # valor atípico en el índice 15 df = pd.DataFrame({'time': t, 'value': data}) # ──────────────────────── ──────────────────────── # Ajustar la regresión solo en los últimos 10 puntos (índices 20 a 29) last10 = df.iloc[18:].copy() pendiente, intercepción, r_value, p_value, std_err = stats.linregress( last10['time'], last10['value'] ) last10['fitted'] = intercept + pendiente * last10['time'] t_stat = pendiente / std_err # "Estadística z" ingenua: usar std(y) / sqrt(n) como denominador (incorrecto para la tendencia) z_std_err = np.std(last10['value']) / np.sqrt(len(last10)) z_stat = pendiente / z_std_err # Imprimir comparación print("Estadística t correcta (usando el SE de pendiente adecuado):") print(f" Pendiente: {pendiente:.4f}") print(f" SE de pendiente: {std_err:.4f}") print(f" t-stat: {t_stat:.4f}") print(f" p-value (t-dist): {p_value:.6f}n") print("Ingenua 'estadística z' (usando std(y)/sqrt(n) — incorrecto):") print(f" Pendiente: {pendiente:.4f}") print(f" SE incorrecto: {z_std_err:.4f}") print(f" z-stat: {z_stat:.4f}") # ──────────────────────── ──────────────────────── # Gráfico con dos subgráficos fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10), sharex=True) # Arriba: Gráfico de estadístico t correcto ax1.plot(df['time'], df['value'], 'o-', color='black', alpha=0.7, linewidth=1.5, label='Serie de tiempo completa') ax1.plot(last10['time'], last10['fitted'], color='red', linewidth=2.5, label=f'Ajuste lineal (últimos 10 pts): pendiente = {pendiente:.3f}') ax1.axvspan(20, 29, color='red', alpha=0.08, label='Ventana ajustada') ax1.text(22, 11.5, f'Estadística t correcta = {t_stat:.3f}np-value = {p_value:.4f}', fontsize=12, bbox=dict(facecolor='white', alpha=0.9, edgecolor='gray')) ax1.set_title('Prueba t correcta: ajuste lineal en los últimos 10 puntos') ax1.set_ylabel('Valor') ax1.legend(loc='upper left') ax1.grid(True, alpha=0.3) # Abajo: gráfico ingenuo de estadística z (que muestra el error) ax2.plot(df['time'], df['value'], 'o-', color='black', alpha=0.7, linewidth=1.5, label='Serie de tiempo completa') ax2.plot(last10['time'], last10['fitted'], color='red', linewidth=2.5, label=f'Ajuste lineal (últimos 10 pts): pendiente = {pendiente:.3f}') ax2.axvspan(20, 29, color='red', alpha=0.08, label='Ventana ajustada') ax2.text(22, 11.5, f'Estadística z ingenua = {z_stat:.3f}n(usa std(y)/√n — denominador incorrecto)', fontsize=12, bbox=dict(facecolor='white', alpha=0.9, edgecolor='gray')) ax2.set_title('"Prueba Z ingenua": uso de std(y)/√n en lugar de SE de pendiente') ax2.set_xlabel('Time') ax2.set_ylabel('Value') ax2.legend(loc='upper left') ax2.grid(True, alpha=0.3) plt.tight_layout() plt.show() Estadística t correcta (usando el SE de pendiente adecuado): Pendiente: 0.2439 SE de pendiente: 0.1412 estadística-t: 1,7276 valor p (t-dist): 0,114756 'estadística z' ingenua (usando std(y)/sqrt(n) — incorrecto): Pendiente: 0,2439 SE incorrecto: 0,5070 estadística z: 0,4811
Ingrese la estadística t: diseñada para el ruido estimado
El estadístico t aborda las limitaciones del puntaje z al tener en cuenta explícitamente la incertidumbre en la estimación de la varianza. Es la herramienta adecuada cuando se prueba un parámetro, como una pendiente de regresión, donde el nivel de ruido debe estimarse a partir de los mismos datos utilizados para calcular el parámetro.
Considere el modelo de regresión lineal.
$$ y_i = beta_0 + beta_1 x_i + epsilon_i, $$
donde se supone que los errores (epsilon_i) son independientes y están distribuidos normalmente con media 0 y varianza constante (sigma^2).
El estimador de mínimos cuadrados ordinarios de la pendiente es
$$ hat{beta}_1 = frac{sum (x_i – bar{x})(y_i – bar{y})}{sum (x_i – bar{x})^2}. $$
Bajo la hipótesis nula H₀: (beta_1 = 0), el valor esperado de (hat{beta}_1) es cero.
El error estándar de (hat{beta}_1) es
$$ text{SE}(hat{beta}_1) = sqrt{ frac{s^2}{sum (x_i – bar{x})^2} }, $$
donde (s^2) es la estimación insesgada de (sigma^2), calculada como el error cuadrático medio residual:
$$ s^2 = frac{1}{n-2} sum (y_i – hat{y}_i)^2. $$
El estadístico t es entonces
$$ t = frac{hat{beta}_1}{text{SE}(hat{beta}_1)} = frac{hat{beta}_1}{sqrt{ frac{s^2}{sum (x_i – bar{x})^2} }}. $$
Bajo la hipótesis nula y los supuestos del modelo, esta estadística sigue una distribución t con n−2 grados de libertad.
Un repaso rápido sobre los grados de libertad
Los grados de libertad representan el número de valores independientes que permanecen disponibles para estimar un parámetro después de que los datos o el modelo hayan impuesto ciertas restricciones.
En el caso más simple, al estimar la varianza de una muestra, se pierde un grado de libertad porque primero se debe calcular la media muestral. Las desviaciones de esta media están obligadas a sumar cero, por lo que sólo n−1 valores pueden variar libremente. Dividir la suma de las desviaciones al cuadrado por n−1 (en lugar de n) corrige esta pérdida y proporciona una estimación insesgada de la varianza poblacional:
$$ s^2 = frac{1}{n-1} sum_{i=1}^n (x_i – bar{x})^2. $$
Este ajuste, conocido como corrección de Bessel, garantiza que la varianza muestral no subestime sistemáticamente la varianza poblacional. El mismo principio se aplica en la regresión: ajustar una línea con una intersección y una pendiente utiliza dos grados de libertad, dejando n−2 para estimar la varianza residual.
En general, los grados de libertad equivalen al tamaño de la muestra menos el número de parámetros estimados a partir de los datos. La distribución t utiliza estos grados de libertad para ajustar su forma: menos grados de libertad producen colas más pesadas (mayor incertidumbre), mientras que valores más grandes hacen que la distribución se acerque a la normal estándar.
La distinción clave del puntaje z es el uso de (s^2) en lugar de un (sigma^2) fijo. Debido a que la varianza se estima a partir de los residuos, el denominador incorpora la incertidumbre muestral en la estimación de la varianza. Esta incertidumbre amplía la distribución del estadístico de prueba, razón por la cual la distribución t tiene colas más gruesas que la normal estándar para pequeños grados de libertad.
A medida que aumenta el tamaño de la muestra, la estimación (s^2) se vuelve más precisa, la distribución t converge a la normal estándar y la distinción entre t y z disminuye.
Por lo tanto, el estadístico t proporciona una evaluación más precisa de la importancia cuando el nivel de ruido se desconoce y debe estimarse a partir de los datos. Al basar la medida del ruido en los residuos después de eliminar la tendencia ajustada, se evita mezclar la señal con el denominador de ruido, que es el defecto central en las aplicaciones ingenuas del puntaje z a las tendencias.
Aquí hay una simulación para ver cómo el muestreo de varias distribuciones t da como resultado valores p variables:
El muestreo de la distribución nula conduce a una distribución uniforme del valor p: es esencialmente igual de probable que obtenga cualquier valor p si toma la muestra de la distribución nula. Digamos que agrega un pequeño cambio: aumenta su media en 4: ahora está esencialmente seguro de que proviene de una distribución diferente, por lo que está sesgado hacia la izquierda del valor p. Curiosamente, a menos que su prueba sea extremadamente conservadora (es decir, es poco probable que rechace la hipótesis nula), es poco probable que se sesgue hacia 1. El tercer conjunto de gráficos muestra mi intento fallido en el que tomé muestras repetidamente de una distribución extremadamente ajustada alrededor de la media de la distribución nula con la esperanza de que eso maximizaría mi valor p. Código importar numpy como np importar matplotlib.pyplot como plt desde scipy importar estadísticas desde tqdm importar trange n_simulaciones = 10_000 n_samples = 30 baseline_mu = 50 sigma = 10 df = n_samples – 1 def run_sim(true_mu, sigma_val): t_stats, p_vals =[],[]para _ en trange (n_simulaciones): # Generar muestra muestra = np.random.normal(true_mu, sigma_val, n_samples) t, p = stats.ttest_1samp(sample, baseline_mu) t_stats.append p_vals.append(p) return np.array(t_stats), np.array(p_vals) # 1. Nulo es verdadero (Ideal) t_null, p_null = run_sim(baseline_mu + 4, sigma) # 2. El efecto existe (desplazado) t_effect, p_effect = run_sim(baseline_mu + 4, sigma) # 3. Demasiado perfecto (varianza suprimida, media forzada a la línea de base) # Usamos una sigma pequeña para que la media de la muestra sea siempre básicamente la línea de base. Incluso entonces, todavía obtenemos una distribución uniforme del valor p. t_perfect, p_perfect = run_sim(baseline_mu, 0.1) # Trazando fig, axes = plt.subplots(3, 2, figsize=(12, 13)) x = np.linspace(-5, 8, 200) t_pdf = stats.t.pdf(x, df) escenarios = [ (t_null, p_null, "Nulo es verdadero (Ideal)", "skyblue", "salmon"), (t_effect, p_effect, "Effect Exists (Shifted)", "lightgreen", "gold"), (t_perfect, p_perfect, "Demasiado perfecto (aún uniforme)", "plum", "lightgrey") ] para i, (t_data, p_data, title, t_col, p_col) en enumerate(scenarios): # T-Stat Plots ejes[i, 0].hist(t_data, bins=50, densidad=True, color=t_col, alpha=0.6, label="Simulado") ejes[i, 0].plot(x, t_pdf, 'r–', lw=2, label="Dista T teórica") ejes[i, 0].set_title(f"{title}: T-Statistics") ejes[i, 0].legend() # Gráficos de valor P ejes[i, 1].hist(p_data, bins=20, densidad=True, color=p_col, alpha=0.7, edgecolor='black') ejes[i, 1].set_title(f"{title}: Valores P") ejes[i, 1].set_xlim(0, 1) si i == 0: ejes[i, 1].axhline(1, color='rojo', estilo de línea='–', etiqueta='Referencia uniforme') ejes[i, 1].legend() plt.tight_layout() plt.show()
(a) Distribución nula Muestreo
(b) Muestreo por cambio medio
(c) Intento fallido de simulación de inclinación a la derecha
Alternativas y extensiones: cuando las estadísticas t no son suficientes
El estadístico t proporciona un enfoque paramétrico sólido para la detección de tendencias bajo supuestos de normalidad. Existen varias alternativas cuando esos supuestos son insostenibles o cuando se requiere una mayor solidez.
La prueba de Mann-Kendall es un método no paramétrico que evalúa tendencias monótonas sin requerir normalidad. Cuenta el número de pares concordantes y discordantes en los datos: para cada par de observaciones ((x_i), (x_j)) con (i < j), comprueba si la tendencia es creciente ((x_j > x_i)), decreciente ((x_j < x_i)) o empatada. El estadístico de prueba (S) es la diferencia entre el número de aumentos y disminuciones:
$$ S = suma_{i
donde sgn es la función de signo (1 para positivo, −1 para negativo, 0 para empates). Bajo la hipótesis nula de que no hay tendencia, (S) tiene una distribución aproximadamente normal para (n) grande, lo que permite calcular una puntuación z y un valor p. La prueba se basa en rangos y es insensible a valores atípicos o distribuciones no normales.
El estimador de pendiente de Sen complementa la prueba de Mann-Kendall al proporcionar una medida de la magnitud de la tendencia. Calcula la mediana de todas las pendientes por pares:
$$ Q = text{mediana} left( frac{x_j – x_i}{j – i} right) quad text{para todos } i < j. $$
Este estimador es robusto a valores atípicos y no asume linealidad.
El método bootstrap ofrece una alternativa flexible y sin distribución. Para probar una tendencia, ajuste el modelo lineal a los datos originales para obtener (hat{beta}_1). Luego, vuelva a muestrear los datos con reemplazo muchas veces (normalmente entre 1000 y 10 000 iteraciones), vuelva a ajustar el modelo cada vez y recopile la distribución de las pendientes de arranque. El valor p es la proporción de pendientes de arranque que son más extremas que cero (o la estimación original, dependiendo del valor nulo). Los intervalos de confianza se pueden construir a partir de los percentiles de la distribución bootstrap. Este enfoque no hace suposiciones paramétricas sobre errores y funciona bien para muestras pequeñas o irregulares.
Cada alternativa ofrece diferentes puntos fuertes. Las pendientes de Mann-Kendall y Sen son computacionalmente simples y robustas, pero asumen monotonicidad en lugar de linealidad estricta. Los métodos Bootstrap son muy flexibles y pueden incorporar modelos complejos, aunque requieren más cálculos. La elección depende de las características de los datos y de la pregunta específica: poder paramétrico cuando los supuestos se cumplen, robustez no paramétrica cuando no lo son.
En conclusión
Tanto el puntaje z como el estadístico t miden la desviación de la hipótesis nula en relación con la variabilidad esperada, pero tienen propósitos diferentes. La puntuación z supone una varianza conocida o estable y es muy adecuada para detectar anomalías puntuales individuales con respecto a una línea de base. El estadístico t tiene en cuenta la incertidumbre en la estimación de la varianza y es la elección correcta cuando se prueban parámetros derivados, como las pendientes de regresión, donde el ruido debe estimarse a partir de los mismos datos.
La diferencia clave radica en el término ruido. El uso de la desviación estándar bruta de la variable de respuesta para una tendencia mezcla la señal con el ruido, lo que lleva a una inferencia sesgada. El estadístico t evita esto basando la medida del ruido en los residuos después de eliminar la tendencia ajustada, lo que proporciona una separación más clara del efecto de la variabilidad.
Cuando los supuestos de normalidad o independencia no se cumplen, alternativas como la prueba de Mann-Kendall, el estimador de pendiente de Sen o los métodos de arranque ofrecen opciones sólidas sin requisitos paramétricos.
En la práctica, la elección del método depende de la pregunta y de los datos. Para anomalías puntuales en procesos estables, la puntuación z es eficiente y suficiente. Para la detección de tendencias, el estadístico t (o una alternativa sólida) es necesario para garantizar conclusiones confiables. Comprender los supuestos y la distinción señal-ruido ayuda a seleccionar la herramienta adecuada e interpretar los resultados con confianza.
Código
colaboración
Repositorio de código general
Referencias y lecturas adicionales
Prueba de hipótesis Una sólida descripción general de las notas de conferencias universitarias que cubre los conceptos básicos de las pruebas de hipótesis, incluidos los tipos de errores y los valores p. Purdue University Northwest: Capítulo 5 Pruebas de hipótesis Estadístico t Notas detalladas sobre pruebas t para muestras pequeñas, incluidas comparaciones con pruebas z y cálculos de valores p. MIT OpenCourseWare: Pruebas de hipótesis de muestra única (pruebas t) Puntuación z Tutorial práctico que explica las puntuaciones z en pruebas de hipótesis, con ejemplos y visualizaciones para comparaciones de medias. Hacia la ciencia de datos: pruebas de hipótesis con puntuaciones Z Puntuación de significancia de tendencias: blog paso a paso sobre cómo realizar la prueba de tendencias de Mann-Kendall (no paramétrica) para detectar tendencias monótonas y evaluar la importancia. Está en R. GeeksforGeeks: Cómo realizar una prueba de tendencia de Mann-Kendall en el valor p de R. Explicación clara y sencilla para principiantes de los valores p, conceptos erróneos comunes y su papel en las pruebas de hipótesis. Hacia la ciencia de datos: explicación del valor P Estadística t frente a estadística z Blog que compara las diferencias entre las pruebas t y z, cuándo usar cada una y aplicaciones prácticas. Estadísticas: prueba T frente a prueba Z. Notas universitarias adicionales sobre pruebas de hipótesis. Notas completas del curso de Georgia Tech que cubren pruebas de hipótesis, estadísticas de pruebas (z y t) y valores p. Georgia Tech: Notas sobre pruebas de hipótesis