---
title: "Fundamentos del análisis exploratorio de datos"
pagetitle: "Fundamentos del análisis exploratorio de datos"
open-graph:
description: "Define el análisis exploratorio de datos (EDA), sus preguntas guía y su lugar en CRISP-DM, antes de aplicar medidas descriptivas concretas."
twitter-card:
description: "Define el análisis exploratorio de datos (EDA), sus preguntas guía y su lugar en CRISP-DM, antes de aplicar medidas descriptivas concretas."
description: "Define el análisis exploratorio de datos (EDA), sus preguntas guía y su lugar en CRISP-DM, antes de aplicar medidas descriptivas concretas."
author: "Diego Villalba"
date: today
lang: es
format:
html:
toc: true
toc-depth: 3
number-sections: true
code-fold: true
code-tools: true
code-summary: "Mostrar código"
fig-align: center
theme: cosmo
pdf:
toc: true
toc-depth: 3
number-sections: true
execute:
echo: true
warning: false
message: false
cache: false
jupyter: python3
bibliography: [referencias_eda.bib, ../../references.bib]
crossref:
fig-title: "Figura"
tbl-title: "Tabla"
eq-prefix: "Ec."
---
## Introducción
El análisis exploratorio de datos (EDA) es el proceso iterativo mediante el cual se conoce un conjunto de datos antes de construir modelos o comunicar resultados definitivos. Combina resúmenes numéricos y visuales para descubrir estructura, evaluar calidad y formular preguntas más precisas [@tukey1977eda; @nist2012handbook].
Dentro de CRISP-DM, el EDA forma parte del entendimiento de los datos y mantiene una relación iterativa con su preparación. Un hallazgo exploratorio puede exigir corregir una variable; después de corregirla, la distribución debe examinarse nuevamente.
::: {.callout-note appearance="minimal"}
**Definición.** El EDA es una estrategia de investigación que utiliza estadística descriptiva y visualización para reconocer patrones, anomalías, relaciones y limitaciones antes de elegir un procedimiento de modelado.
:::
## Preguntas que orientan el EDA
- ¿Cuál es la unidad de observación y cuántos registros existen?
- ¿Qué significa cada variable y en qué escala fue medida?
- ¿Qué valores faltan y por qué podrían faltar?
- ¿Qué valores son imposibles, inconsistentes o duplicados?
- ¿Dónde se localizan los valores y cuánto varían?
- ¿Qué forma tienen las distribuciones?
- ¿Existen diferencias entre grupos o concentración del total?
- ¿Qué asociaciones aparecen entre variables?
```{mermaid}
flowchart LR
A["Vista analítica del DW"] --> B["Perfilar variables"]
B --> C["Resumir y visualizar"]
C --> D["Formular hallazgos"]
D --> E["Decidir tratamiento"]
E --> B
D --> F["Preparar modelado"]
```
::: {.callout-important appearance="minimal"}
La salida del EDA no es una colección de gráficos. Es una bitácora de hallazgos, evidencia, decisiones y preguntas pendientes.
:::
## Unidad de observación y granularidad
Antes de calcular cualquier estadístico debe identificarse qué representa una fila: una venta, un producto por tienda, un cliente, una visita o una medición temporal. Mezclar granularidades produce duplicaciones y resúmenes engañosos.
::: {.callout-tip appearance="minimal"}
**Ejemplo.** Si una tabla contiene una fila por producto y outlet, sumar ventas puede ser válido; contar productos sin distinguir el outlet puede contar el mismo producto varias veces.
:::
## Tipos de variables
### Variables cualitativas
- **Nominales:** categorías sin orden intrínseco, como tipo de outlet o método de pago.
- **Ordinales:** niveles ordenados sin distancias métricas garantizadas, como satisfacción baja, media y alta.
### Variables cuantitativas
- **Discretas:** conteos con valores separados, como número de compras.
- **Continuas:** mediciones en un intervalo, como peso, ingreso o duración.
| Tipo | Resúmenes adecuados | Visualizaciones iniciales |
|---|---|---|
| Nominal | Frecuencias, proporciones, moda, diversidad | Barras |
| Ordinal | Frecuencias ordenadas, mediana, cuantiles | Barras ordenadas, acumulada |
| Discreta | Frecuencias, centro, dispersión | Barras o histograma entero |
| Continua | Centro, dispersión, forma | Histograma, ECDF, boxplot |
::: {.callout-warning appearance="minimal"}
El tipo almacenado no siempre coincide con el tipo estadístico. Un código postal numérico sigue siendo nominal y una fecha guardada como texto sigue representando tiempo.
:::
## Frecuencias y proporciones
Para valores $v_1,\ldots,v_K$, la frecuencia absoluta y la proporción son
$$
f_k=\#\{i:x_i=v_k\},
\qquad p_k=\frac{f_k}{n},
\qquad \sum_{k=1}^{K}p_k=1. \tag{1}
$$
La colección $(p_1,\ldots,p_K)$ es la distribución empírica de una variable categórica o discreta.
## Frecuencias acumuladas y ECDF
Cuando existe un orden natural,
$$
F_k=\sum_{j\le k}f_j,
\qquad P_k=\sum_{j\le k}p_j. \tag{2}
$$
Para una variable cuantitativa, la función de distribución empírica es
$$
\widehat F_n(x)=\frac{1}{n}\sum_{i=1}^{n}\mathbf{1}(x_i\le x). \tag{3}
$$
::: {.callout-note appearance="minimal"}
**Definición.** La ECDF indica la proporción observada de datos menores o iguales que cada umbral. A diferencia del histograma, no requiere elegir intervalos.
:::
## Ejemplo de calidad categórica
```{python}
import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
resultado = pd.Series([
"Asistió", "No asistió", "ASISTIÓ", "Canceló", "Asistió",
"NA", "No asistió", "No asistió", None, "Asistió",
"Canceló", "ASISTIÓ", "No asistió", "NA", "Asistió"
], name="resultado_cita")
conteos = resultado.fillna("<faltante>").value_counts().rename_axis("Categoría").reset_index(name="Frecuencia")
conteos["Proporción"] = conteos["Frecuencia"]/conteos["Frecuencia"].sum()
fig = px.bar(conteos, x="Categoría", y="Frecuencia", color="Categoría", text="Frecuencia",
title="Frecuencias que revelan duplicados semánticos y faltantes")
fig.update_layout(showlegend=False)
fig.show()
```
::: {.callout-tip appearance="minimal"}
**Hallazgo.** `Asistió` y `ASISTIÓ`, así como `No asistió` y `No asistió`, son duplicados semánticos. `NA` y `<faltante>` podrían representar la misma ausencia, pero debe confirmarse con el diccionario de datos antes de recodificar.
:::
## Ejemplo discreto y acumulado
```{python}
rng = np.random.default_rng(2026)
espera = np.r_[rng.poisson(12, 600), [-4, -1, 95, 120]]
tabla = pd.Series(espera).value_counts().sort_index().rename_axis("Días").reset_index(name="Frecuencia")
tabla["Acumulada"] = tabla["Frecuencia"].cumsum()/tabla["Frecuencia"].sum()
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_bar(x=tabla["Días"], y=tabla["Frecuencia"], name="Frecuencia", secondary_y=False)
fig.add_scatter(x=tabla["Días"], y=tabla["Acumulada"], mode="lines+markers",
name="Proporción acumulada", secondary_y=True)
fig.update_yaxes(title_text="Frecuencia", secondary_y=False)
fig.update_yaxes(title_text="Proporción acumulada", tickformat=".0%", secondary_y=True)
fig.update_layout(title="Tiempo de espera: distribución y acumulación")
fig.show()
```
::: {.callout-warning appearance="minimal"}
Los tiempos negativos son imposibles bajo la definición habitual y requieren revisión. Los valores de 95 y 120 días son extremos, pero podrían ser casos reales; no deben eliminarse sin evidencia.
:::
## Datos faltantes
El porcentaje faltante debe analizarse por variable y por grupos relevantes. Un promedio global puede ocultar que la ausencia se concentra en una fuente, fecha o categoría. La decisión de imputar pertenece al preprocesamiento, pero el EDA debe documentar patrón, magnitud y posibles mecanismos.
## Valores atípicos y anomalías
Un valor atípico es una observación alejada según una regla estadística; una anomalía es un caso incompatible con el proceso esperado. No son sinónimos de error.
| Evidencia | Pregunta | Acción posible |
|---|---|---|
| Valor imposible | ¿Contradice el dominio? | Corregir, marcar o excluir con trazabilidad |
| Valor raro pero posible | ¿Es un segmento real? | Conservar y analizar por separado |
| Cola extensa | ¿La escala es adecuada? | Transformar o usar medidas robustas |
| Categoría infrecuente | ¿Es error o nivel real? | Estandarizar o agrupar con criterio |
## Ruta descriptiva del libro
Los siguientes capítulos desarrollan seis perspectivas complementarias:
1. [Medidas de localización](2-3-localizacion.qmd): ¿dónde están los valores?
2. [Medidas de variabilidad](2-4-variabilidad.qmd): ¿cuánto cambian?
3. [Medidas de forma](2-5-forma.qmd): ¿cómo son sus colas y simetría?
4. [Medidas de heterogeneidad](2-6-heterogeneidad.qmd): ¿cambian entre categorías o grupos?
5. [Medidas de concentración](2-7-concentracion.qmd): ¿quién acumula el total?
6. [Medidas de correlación](2-9-correlacion.qmd): ¿cómo se asocian dos variables?
Cada capítulo teórico está seguido por una práctica reproducible con BigMart.
## Checklist de salida
::: {.callout-important appearance="minimal"}
Un EDA reproducible debe dejar: diccionario y granularidad, perfil de faltantes, dominios validados, resúmenes con unidades, visualizaciones pertinentes, hallazgos redactados, decisiones justificadas y preguntas pendientes.
:::
## Ejercicios
1. Clasifique cada variable de BigMart por escala estadística y justifique los casos ambiguos.
2. Proponga una regla de validación para tres columnas del dataset.
3. Compare qué información aporta un histograma frente a una ECDF.
## Referencias {.unnumbered}
::: {#refs}
:::