En esta sección vas a aprender a explorar distribuciones con Seaborn usando tres enfoques complementarios:
histplot
.kdeplot
.Todos los ejemplos están listos para copiar y pegar: incluyen los imports necesarios, configuran un tema agradable y muestran cómo complementar el resultado con funciones de Matplotlib.
histplot
El histograma agrupa valores en bins (intervalos) y cuenta cuántos registros caen en cada uno. Es el primer gráfico para detectar la forma de la distribución.
import seaborn as sns
import matplotlib.pyplot as plt
# Tema visual recomendado
sns.set_theme(style="whitegrid", context="notebook")
# Dataset de ejemplo
tips = sns.load_dataset("tips")
# Histograma simple de la cuenta total
sns.histplot(data=tips, x="total_bill")
plt.title("Histograma de total_bill (cuenta total)")
plt.xlabel("Total de la cuenta (USD)")
plt.ylabel("Frecuencia")
plt.show()
Parámetros clave para afinar el histograma:
bins
: cantidad de barras (o estrategias como "auto"
, "sturges"
).binwidth
: ancho de cada barra, útil cuando la unidad tiene sentido (por ejemplo, 2 USD).stat
: métrica del eje Y ("count"
, "frequency"
, "density"
, "probability"
).log_scale
: escala logarítmica para colas largas.import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.histplot(
data=tips,
x="total_bill",
bins=30, # o binwidth=2
stat="density", # count | frequency | density | probability
element="bars" # bars | step | poly
)
plt.title("Histograma con stat='density' y 30 bins")
plt.show()
hue
y múltiples seriesEl parámetro hue
colorea por categoría y multiple
define cómo se combinan las series.
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.histplot(
data=tips,
x="total_bill",
hue="time", # Lunch vs Dinner
element="bars",
multiple="stack", # layer | stack | dodge | fill
bins=25,
stat="count"
)
plt.title("Histograma por momento del día (stack)")
plt.show()
Para datos enteros (por ejemplo, cantidad de comensales) indicá discrete=True
o definí binwidth=1
.
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.histplot(
data=tips,
x="size", # tamaño de grupo (entero)
discrete=True,
shrink=0.9
)
plt.title("Histograma de tamaño de grupo (discreto)")
plt.xlabel("Tamaño de grupo")
plt.ylabel("Frecuencia")
plt.show()
cumulative=True
genera la función de distribución acumulada (CDF).
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.histplot(
data=tips,
x="total_bill",
bins=40,
stat="probability",
cumulative=True
)
plt.title("Distribución acumulada (CDF) de total_bill")
plt.ylabel("Probabilidad acumulada")
plt.show()
kdeplot
La KDE (Kernel Density Estimation) estima una densidad continua y suavizada, ideal para ver la forma de la distribución sin depender de los bins.
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.kdeplot(data=tips, x="total_bill")
plt.title("KDE de total_bill (densidad suavizada)")
plt.xlabel("Total de la cuenta (USD)")
plt.ylabel("Densidad")
plt.show()
Activá fill=True
para rellenar bajo la curva y ajustá bw_adjust
para controlar la suavidad (valores mayores generan curvas más suaves).
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.kdeplot(data=tips, x="total_bill", fill=True, bw_adjust=0.7)
plt.title("KDE con relleno (bw_adjust=0.7)")
plt.show()
El parámetro hue
superpone o separa densidades por grupo, mientras que common_norm=False
evita normalizarlas juntas.
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.kdeplot(
data=tips,
x="total_bill",
hue="time",
fill=True,
common_norm=False, # densidades independientes
alpha=0.6
)
plt.title("KDE por Lunch vs Dinner (densidades independientes)")
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
sns.kdeplot(data=tips, x="total_bill", cumulative=True)
plt.title("KDE acumulada (CDF continua)")
plt.ylabel("Probabilidad acumulada")
plt.show()
discrete=True
o binwidth
específico.
Podés superponer un histograma (frecuencias/bins) y una KDE (forma suavizada). Existen dos enfoques principales: superposición en el mismo eje o visualización con doble eje.
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
ax = sns.histplot(
data=tips, x="total_bill",
bins=30, stat="density", color="#99c2ff", alpha=0.6, edgecolor=None
)
sns.kdeplot(
data=tips, x="total_bill",
color="#003f8c", linewidth=2, ax=ax
)
plt.title("Histograma (densidad) + KDE superpuestos")
plt.xlabel("Total de la cuenta (USD)")
plt.ylabel("Densidad")
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
# Histograma porcentual por categoría (rellena 100%)
ax = sns.histplot(
data=tips, x="total_bill", hue="time",
multiple="fill", element="bars", bins=25
)
# KDE global encima (solo para mostrar la forma general)
sns.kdeplot(data=tips, x="total_bill", color="black", linewidth=2, ax=ax)
plt.title("Histograma porcentual por categoría + KDE global")
plt.ylabel("Proporción")
plt.show()
Usá doble eje cuando la escala del histograma difiere mucho de la densidad.
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
fig, ax1 = plt.subplots()
# Histograma en eje izquierdo
sns.histplot(
data=tips, x="total_bill",
bins=30, color="#a7d8de", alpha=0.7, ax=ax1
)
ax1.set_xlabel("Total de la cuenta (USD)")
ax1.set_ylabel("Frecuencia (histograma)", color="#2c3e50")
# Crear eje derecho para KDE
ax2 = ax1.twinx()
sns.kdeplot(
data=tips, x="total_bill",
color="#0b3c49", linewidth=2, ax=ax2
)
ax2.set_ylabel("Densidad (KDE)", color="#0b3c49")
plt.title("Histograma (izq.) + KDE (der.) con ejes separados")
plt.show()
stat
con intención: "count"
para volúmenes absolutos, "density"
si vas a superponer KDE y "probability"
para interpretar proporciones.binwidth
cuando la unidad tenga sentido.multiple="fill"
compara proporciones, "stack"
suma volúmenes y "dodge"
muestra barras lado a lado.bw_adjust
(por ejemplo, 0.5, 0.8, 1.2) para evitar curvas demasiado onduladas o planas.density
, probability
, multiple
, etc., mejora la comunicación con tu audiencia.hue
y multiple
(fill
/stack
/dodge
).stat="probability"
o multiple="fill"
.bins
, binwidth
o bw_adjust
.