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>
5.1 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0173 | EDA: bugs críticos de correctitud estadística (outlier_pct ×100, distribution_type por-skew) | pendiente | bugfix |
|
registry-only | alta |
|
2026-06-29 | 2026-06-29 |
|
0173 — EDA: bugs críticos de correctitud estadística
Contexto
Un benchmark adversarial del workflow /eda sobre 12 datasets reales (29/06/2026,
temp/eda_benchmark/EVALUATION.md) detectó que los estadísticos descriptivos base son
correctos, pero el porcentaje de outliers que el report markdown muestra es imposible
(supera el 100%, hasta 336%), engañando a un lector no experto con apariencia de autoridad.
Hallazgos cubiertos por este issue:
| Hallazgo | Severidad | Evidencia del benchmark |
|---|---|---|
H1 — outlier_pct por-columna >100% en el report markdown |
crítico | wine-red chlorides 193.87%, density 112.57% (skew 0.07); titanic SibSp 336.70%, Fare 224.47%; seattle precipitation 253.25% |
H11 — distribution_type por-skew etiqueta mal discretas/ordinales/multimodales |
bajo | wine quality (6 valores) → "normal-ish"; precios BTC multimodales → "normal-ish" (skew 0.45) |
Causa raíz de H1 (verificada en código, READ-ONLY)
EVALUATION.md propuso "corregir la fórmula en describe_numeric". Eso es incorrecto. Al
leer el código:
python/functions/datascience/describe_numeric.py:113calculaoutlier_pct = 100.0 * n_outliers / n— ya en escala 0-100 y acotado a [0,100]. Está bien.python/functions/datascience/render_eda_markdown.py:203-204renderiza ese valor con_fmt_pct(val), y_fmt_pct(líneas 31-44) hacenum * 100porque asume que su input es una fracción 0-1. Resultado: doble ×100 (un 1.94 real se muestra como 193.87%).- El PDF (
render_eda_pdf.py:296) usa_fmt_num(outlier_pct, 1) + "%"sin multiplicar — por eso el PDF muestra el outlier_pct correcto y el markdown no. El bug es exclusivo del renderer markdown.
El factor "19-40×" que observó el evaluador se debe a que comparaba contra outliers IQR (3-10%),
mientras describe_numeric usa z-score (umbral 3.0, da menos outliers); pero el mecanismo del bug
es el doble ×100, no la fórmula.
Tareas
- H1 (fix de 1 línea): en
python/functions/datascience/render_eda_markdown.py:203-204, sustituir_fmt_pct(val)por un formateo que NO multiplique (p.ej.f"{_fmt_num(val, 2)}%"), porquenumeric.outlier_pctya viene en escala 0-100. No tocardescribe_numeric.py(su fórmula es correcta). - Auditar el resto de
render_eda_markdown.pypor si otro campo en escala 0-100 pasa por_fmt_pct(los*_pctdel perfil base sí son fracciones 0-1 y deben seguir con_fmt_pct; solonumeric.outlier_pctestá en escala 0-100). Documentar en el docstring dedescribe_numericqueoutlier_pctestá en 0-100 para evitar la confusión a futuro. - H11: en
python/functions/datascience/detect_distribution_type.py, no etiquetar por skew solamente: usar también nº de modos / cardinalidad y, cuando esté disponible, el test de normalidad Jarque-Bera (normality_tests.py, ya expuesto enmodels.normalityvíarun_eda_models). Una variable discreta/ordinal/multimodal no debe salir "normal-ish". - Añadir/extender tests unitarios:
describe_numeric_test.py(outlier_pct en [0,100]),render_eda_markdown_test.py(un perfil conoutlier_pct=7.0renderiza"7.00%", no"700%"), y un test dedetect_distribution_type(discreta de 6 valores no se etiqueta "normal-ish"). Nota: hoy NO existedetect_distribution_type_test.pyenpython/functions/datascience/— hay que crearlo (a confirmar el nombre canónico al implementar; el resto de tests citados sí existen).
Definition of Done
| Escenario | Tipo | Comando / evidencia | Resultado esperado |
|---|---|---|---|
| Golden: outlier_pct en rango | e2e | re-correr profile_table sobre temp/eda_benchmark/datasets/.../wine-red y leer el .md |
chlorides/density muestran outlier_pct en [0,100]% (no 193.87% / 112.57%) |
| Edge: skew alto real | unit | describe_numeric_test.py con datos de cola fuerte |
outlier_pct ≤ 100 y coherente con n_outliers/n |
| Edge: discreta ordinal | unit | detect_distribution_type_test.py con 6 valores discretos |
NO etiqueta "normal-ish" |
| Error: input vacío/no numérico | unit | describe_numeric([]) |
claves None, sin crash (contrato actual preservado) |
| Mecánica | — | ./fn run describe_numeric_py_datascience, ./fn run render_eda_markdown_py_datascience |
tests verdes; fn index limpio |
Re-correr el benchmark sobre wine-red y titanic y confirmar que ningún outlier_pct supera 100%.
Notas
Issue derivado de temp/eda_benchmark/EDA_ISSUES.md (consolidación del benchmark). H1 es el fix de
mayor ratio impacto/esfuerzo del lote (una línea elimina los números imposibles que más minan la
confianza del report). Hermanos: 0174 (series), 0175 (relational), 0176 (render), 0177 (tipos).