763e06c127
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.7 KiB
3.7 KiB
id, name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, example, tested, tests, test_file_path, file_path, params, output
| id | name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | example | tested | tests | test_file_path | file_path | params | output | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| normality_tests_py_datascience | normality_tests | function | py | datascience | 1.0.0 | pure | def normality_tests(values: list, alpha: float = 0.05) -> dict | Tests de normalidad (Jarque-Bera, D'Agostino-Pearson, Shapiro-Wilk) sobre una columna numerica para decidir si sigue una distribucion normal. Descarta None/NaN/no-numericos y reporta consenso de los tests aplicables. |
|
false |
|
from normality_tests import normality_tests import numpy as np result = normality_tests(np.random.default_rng(0).normal(0, 1, 1000).tolist()) # result["is_normal"] == True | true |
|
python/functions/datascience/normality_tests_test.py | python/functions/datascience/normality_tests.py |
|
dict. Si n < 8 (tras limpiar): {n, note: "muestra insuficiente", is_normal: None}. En otro caso: {n, jarque_bera:{stat,p,normal}, dagostino:{stat,p,normal}, shapiro:{stat,p,normal}|None (solo 3<=n<=5000), is_normal:bool}. En cada test normal = p > alpha. is_normal es el consenso (todos los tests aplicables coinciden en que los datos son normales). |
Ejemplo
from normality_tests import normality_tests
import numpy as np
# Muestra normal -> is_normal True
normal = np.random.default_rng(0).normal(loc=10, scale=2, size=1000).tolist()
r = normality_tests(normal)
r["is_normal"] # True
r["jarque_bera"]["normal"] # True
r["shapiro"]["p"] > 0.05 # True
# Muestra exponencial (sesgada) -> is_normal False
expo = np.random.default_rng(7).exponential(scale=1.0, size=1000).tolist()
normality_tests(expo)["is_normal"] # False
# Muestra insuficiente
normality_tests([1, 2, 3, 4, 5])
# {"n": 5, "note": "muestra insuficiente", "is_normal": None}
Cuando usarla
Antes de aplicar un test parametrico o un estimador que asume normalidad (t-test, ANOVA, regresion OLS con intervalos de confianza, z-score para outliers): comprueba primero si la columna es realmente normal. Tambien en la fase EDA para decidir entre media (datos normales) y mediana/transformacion log (datos sesgados), y como gate barato antes de elegir un modelo que asuma errores gaussianos.
Gotchas
- Funcion pura y determinista para una entrada dada, pero los p-valores
dependen del tamano de muestra: con n muy grande casi cualquier desviacion
minuscula de la normalidad rechaza H0 (poder estadistico alto). Interpreta
is_normaljunto al tamanony al contexto, no como verdad absoluta. - Shapiro-Wilk solo se ejecuta para
3 <= n <= 5000; fuera de ese rango su clave esNoneyis_normalse decide solo con Jarque-Bera y D'Agostino. - Con
n < 8no se ejecuta ningun test: devuelvenoteeis_normal: None. Cuenta elntras limpiar (None/NaN/no-numericos descartados), no la longitud bruta de la lista. - D'Agostino-Pearson (
normaltest) requiere internamenten >= 8para skew y kurtosis; por eso el umbral de muestra insuficiente es 8.