File size: 3,578 Bytes
e5cc8ee
 
d7f258e
 
 
 
 
 
 
 
 
e5cc8ee
d7f258e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
---
license: mit
language:
  - es
tags:
  - exploratory-data-analysis
  - data-quality
  - tabular
  - pandas
  - profiling
library_name: generic
---

# EDA Express — análisis exploratorio automático

Dado un dataset tabular (CSV, Excel o DataFrame), genera el análisis
exploratorio que un analista haría en su primera hora: calidad de datos,
estadísticos, correlaciones, alertas accionables e informe en Markdown.
Todo corre **en tu máquina** — no hay servidor ni se envían datos a ningún sitio.

- **Motor de 12 alertas de calidad** con recomendación concreta: faltantes por
  gravedad, columnas constantes, posibles IDs, cardinalidad alta, duplicados
  (filas y columnas), numéricas/fechas guardadas como texto, outliers,
  asimetría, pares redundantes y clases desbalanceadas.
- **Estadística sólida sin dependencias pesadas**: correlaciones de Pearson,
  V de Cramér entre categóricas, eta² respecto al objetivo y PCA — implementados
  con pandas y numpy, sin scipy ni scikit-learn.
- **Informe en Markdown** listo para adjuntar o convertir a PDF.
- Código fuente, app web (Streamlit + Docker) y API REST:
  [github.com/aitziberluis/eda-express](https://github.com/aitziberluis/eda-express)

## Uso

```python
# pip install huggingface_hub pandas numpy tabulate requests
import sys

import pandas as pd
from huggingface_hub import snapshot_download

sys.path.insert(0, snapshot_download("aitziberluis/eda-express"))
from eda import alerts, profiler, report

df = pd.read_csv("mi_dataset.csv")

# Visión general y alertas accionables
print(profiler.overview(df))
for alerta in alerts.run_all_checks(df, target="mi_columna_objetivo"):
    print(f"[{alerta['nivel']}] {alerta['columna']}: {alerta['mensaje']}")
    print(f"   -> {alerta['recomendacion']}")

# Estadísticos y asociaciones
print(profiler.numeric_table(df))
print(profiler.cramers_v_matrix(df))
print(profiler.eta_squared_table(df, "mi_columna_objetivo"))

# Informe completo en Markdown
md = report.build_report(df, "mi_dataset", alerts.run_all_checks(df), target=None)
open("informe.md", "w", encoding="utf-8").write(md)
```

O ejecuta el ejemplo incluido (usa el dataset del Titanic): `python example.py`

## Qué incluye el análisis

| Función | Qué devuelve |
|---|---|
| `profiler.overview(df)` | Filas, columnas, memoria, faltantes, duplicados |
| `profiler.column_table(df)` | Tipo, faltantes, únicos y ejemplos por columna |
| `profiler.numeric_table(df)` | describe() ampliado: asimetría, curtosis, outliers IQR |
| `profiler.categorical_table(df)` | Cardinalidad, moda y concentración por categórica |
| `profiler.correlation_matrix(df)` / `top_correlations` | Pearson y ranking de pares |
| `profiler.cramers_v_matrix(df)` | Asociación entre categóricas |
| `profiler.eta_squared_table(df, target)` | Varianza explicada por las clases del objetivo |
| `profiler.pca_summary(df)` | Varianza explicada, proyección 2D y cargas |
| `profiler.numeric_stored_as_text(df)` | Numéricas atrapadas en columnas de texto |
| `profiler.dates_stored_as_text(df)` | Fechas atrapadas en columnas de texto |
| `profiler.duplicate_columns(df)` | Pares de columnas idénticas |
| `alerts.run_all_checks(df, target)` | Las 12 alertas con recomendaciones |
| `report.build_report(...)` | Informe completo en Markdown |

## Limitaciones

- Pensado para datos tabulares de hasta unos pocos millones de celdas.
- Las alertas son heurísticas con umbrales razonables, no verdades absolutas.
- La detección de tipos mal guardados exige que ≥80% de los valores parseen.

## Licencia

MIT