Bloque del grupo eda (sesion ausente EDA-benchmark): - 8 funciones nuevas: adf_kpss_stationarity, acf_pacf, stl_decompose, to_returns, fdr_correction, suggest_reexpression, exploratory_caveats, render_eda_pdf - integracion: profile_table (run_series, emit_pdf), association_matrix (FDR Benjamini-Hochberg), render_eda_markdown (secciones series/reexpresion/caveats) - slash commands /eda y /capitulos - issues 0173-0177: mejoras del /eda derivadas del benchmark sobre 12 datasets reales (outlier_pct x100, periodo estacional, FK inference, render models, tipos id-like) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.4 KiB
name, kind, lang, domain, version, purity, signature, description, tags, params, output, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | params | output | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | |||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| association_matrix | function | py | datascience | 1.1.0 | pure | def association_matrix(columns: dict, strong_threshold: float = 0.5, top_n: int = 20, alpha: float = 0.05, fdr_method: str = "bh") -> dict | Matriz de asociacion unificada de una tabla con tipos mezclados: elige la metrica correcta por par de tipos (Pearson/Spearman num-num, Cramer's V cat-cat, correlation ratio num-cat) y calcula informacion mutua normalizada comun para todos los pares. Cada par lleva su p-valor (test de correlacion / chi-cuadrado / ANOVA) y se corrige por comparaciones multiples (FDR) para combatir el sesgo de mineria de datos: el subconjunto fuerte se basa en la significancia corregida, no solo en superar el umbral de magnitud. |
|
|
dict {pairs: lista de todos los pares {a, b, a_type, b_type, method, value, extra, p_value, p_value_adjusted, significant}; strong: subconjunto con magnitud >= umbral Y significativo tras FDR (pares sin test se admiten por magnitud), ordenado por relevancia desc truncado a top_n; methods_legend: dict metodo->descripcion; n_tests: nº total de pares evaluados (== len(pairs)); multiple_testing: {method, alpha, n_tests, n_rejected}}. Pura: con dict vacio o 1 columna devuelve pairs=[] y strong=[]. |
|
false |
|
true |
|
python/functions/datascience/association_matrix_test.py | python/functions/datascience/association_matrix.py |
Ejemplo
from datascience import association_matrix
columns = {
# Numerica correlada linealmente con "size" (y ~ 2x + ruido pequeno).
"size": {"values": [1, 2, 3, 4, 5, 6, 7, 8], "type": "numeric"},
"price": {"values": [2.1, 4.0, 5.9, 8.1, 10.0, 12.2, 13.8, 16.1], "type": "numeric"},
# Categorica que explica la varianza de "score" (cada region -> nivel distinto).
"region": {"values": ["N", "N", "S", "S", "E", "E", "W", "W"], "type": "categorical"},
"score": {"values": [10.0, 11.0, 50.0, 49.0, 90.0, 91.0, 30.0, 31.0], "type": "numeric"},
}
result = association_matrix(columns, strong_threshold=0.5, top_n=10)
# Pares fuertes detectados (orden por relevancia):
for p in result["strong"]:
print(p["a"], p["b"], p["method"], round(p["value"], 2))
# size price pearson/spearman 1.0 -> num-num lineal casi perfecta
# region score correlation_ratio 0.99 -> la categoria explica la numerica
print(result["methods_legend"]["correlation_ratio"])
Cuando usarla
Cuando necesites una matriz de relaciones de una tabla entera mezclando tipos
(numericas, categoricas, fechas, booleanos) en una sola pasada, sin tener que
elegir a mano que metrica aplicar a cada par. Ideal en la fase EDA para detectar
de un vistazo que columnas estan asociadas (y por que metodo), priorizando los
pares fuertes. Reusa las funciones atomicas del registry (pearson,
spearman_corr, cramers_v, theils_u, correlation_ratio,
mutual_info_columns) y anade informacion mutua normalizada como medida comun
no-lineal a todos los pares.
Notas
- Pura: las atomicas que compone son puras y deterministas; no hace I/O.
pearsonno limpia None/NaN internamente, asi que los pares num-num se limpian aqui antes de llamarla (se emparejan por indice y se descartan pares con algun lado no numerico).- En num-num el
valueprincipal es el de mayor valor absoluto entre Pearson y Spearman; ambos quedan enextra(pearson,spearman). - En cat-cat el
valuees Cramer's V (simetrico) yextralleva Theil's U direccional en ambos sentidos (u_ab= U(a|b),u_ba= U(b|a)). - En num-cat el
valuees el correlation ratio (eta) llamando siempre con la categorica como primer argumento y la numerica como segundo. - Se saltan columnas con menos de 3 valores validos, y columnas
textcuya cardinalidad sea >= 90% del numero de filas (identificadores / free-text).
Gotchas
- Ahora corrige multiple-testing (v1.1.0). El subconjunto
strongya no depende solo de la magnitud: un par con magnitud alta pero p-valor ajustadoalphaNO entra enstrong. Esto combate el sesgo de mineria de datos (data-mining bias, Aronson cap. 6): al evaluar todos los pares a la vez, el azar produce correlaciones espurias que el umbral de magnitud por si solo dejaria pasar. - Cada par lleva
p_value(test del metodo principal: correlacion de Pearson/Spearman, chi-cuadrado de independencia para Cramer's V, ANOVA de una via para correlation ratio) yp_value_adjusted(trasfdr_correction). La informacion mutua no tiene test asociado, por lo que un par cuyo metodo principal sea degenerado puede tenerp_value = None; esos pares se admiten enstrongpor magnitud (no hay p-valor que corregir). n_tests(top-level) es el numero total de pares evaluados (len(pairs)), mientras quemultiple_testing.n_testses el numero de p-valores validos que entraron en la correccion (puede ser menor si algun par no tiene test).- Sigue siendo pura, pero ahora importa
scipy.stats(pearsonr,spearmanr,chi2_contingency,f_oneway) para los p-valores; scipy ya vive enpython/.venv. - Sube
alphao usafdr_method="bonferroni"segun lo costoso que sea un falso positivo: BH controla la tasa de falsos descubrimientos (mas potencia), Bonferroni la probabilidad de cualquier falso positivo (mas cautela).
Capability growth log
- v1.1.0 (28/06/2026) — anade p-valor por par (Pearson/Spearman, chi-cuadrado,
ANOVA) + correccion de comparaciones multiples via
fdr_correction(BH / Bonferroni).strongpasa a basarse en la significancia corregida, no solo en el umbral de magnitud. Nuevos parametrosalphayfdr_method; nuevas clavesp_value/p_value_adjusted/significantpor par yn_tests/multiple_testingen el resultado. Retrocompatible: no quita claves previas.