import pandas as pd
import plotly.express as px
import plotly.io as pio
import numpy as np
pio.renderers.default = "notebook"Un histograma es una representación gráfica de la distribución de un conjunto de datos.
Se construye dividiendo los datos en intervalos (bins) y mostrando en el eje Y la frecuencia con que los valores caen en cada intervalo.
0.1 Caracteristicas
- Resumir grandes volúmenes de datos permite visualizar rápidamente la distribución.
- Detectar valores atípicos identificar datos que se desvían del comportamiento general.
- Comprender patrones:
- Asimetría de la distribución.
- Moda (cantidad de picos).
- Dispersión (rango de los datos).
- Asimetría de la distribución.
- Comparar conjuntos de datos colocando histogramas lado a lado.
0.2 Cálculo de los Bins (Intervalos)
Existen reglas prácticas para determinar el número de bins:
Regla de la raíz cuadrada
\[ k \approx \sqrt{n} \]Regla de Sturges
\[ k \approx 1 + \log_{2}(n) \]
La mejor elección depende del tamaño del dataset y de la distribución de los datos.
0.3 Errores Comunes y Cómo Evitarlos
- Elegir bins inadecuados
- Bins demasiado anchos pierdes detalle.
- Bins demasiado estrechos ruido excesivo.
- Bins demasiado anchos pierdes detalle.
- Escalas y etiquetas incorrectas
- Ejes sin unidades o mal definidos dificulta interpretación.
- Escalas distintas al comparar histogramas comparaciones engañosas.
- Ejes sin unidades o mal definidos dificulta interpretación.
- Excluir valores atípicos sin justificación
- Oculta información importante sobre la distribución.
1 Dataset: Precios Agroindustria de Cacao (2012 - 2025)
Archivo: MAG_PreciosAgroindustriaCacao_2025Junio.csv
Fuente: Ministerio de Agricultura y Ganadería (MAG), Ecuador
Última actualización: Junio 2025
import pandas as pd
df = pd.read_csv("mag_preciosagroindustriacacao_2025junio.csv", sep=";")
print(df.head())
print(df.info()) PACC_ANIO PACC_MES DPA_PROVINCIA DPA_CANTON PACC_PRODUCTO \
0 2012 Enero El Oro Arenillas Cacao seco mezclado
1 2012 Enero El Oro Arenillas Cacao seco mezclado
2 2012 Enero El Oro El Guabo Cacao seco mezclado
3 2012 Enero El Oro El Guabo Cacao seco mezclado
4 2012 Enero El Oro Machala Cacao seco mezclado
PACC_PRESENTACION PACC_TIPO PACC_PRECIO_USD PACC_USD_KG
0 Quintal de 100,00 libras Compra 71.41 1.57
1 Quintal de 100,00 libras Venta 74.06 1.63
2 Quintal de 100,00 libras Compra 73.75 1.63
3 Quintal de 100,00 libras Venta 84.00 1.85
4 Quintal de 100,00 libras Compra 75.00 1.65
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26246 entries, 0 to 26245
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PACC_ANIO 26246 non-null int64
1 PACC_MES 26246 non-null object
2 DPA_PROVINCIA 26246 non-null object
3 DPA_CANTON 26246 non-null object
4 PACC_PRODUCTO 26246 non-null object
5 PACC_PRESENTACION 26246 non-null object
6 PACC_TIPO 26246 non-null object
7 PACC_PRECIO_USD 26246 non-null float64
8 PACC_USD_KG 26246 non-null float64
dtypes: float64(2), int64(1), object(6)
memory usage: 1.8+ MB
None
2 Iteración 1
fig = px.histogram(
df,
x="PACC_PRECIO_USD",
nbins=30, # número de bins (puedes ajustar)
title="Histograma de Precio USD Cacao",
labels={"PACC_PRECIO_USD": "Precio en USD Cacao"}
)
fig.show()3 Iteración 2
Conteo registro aplicacion nbins
import numpy as np
import plotly.express as px
n = len(df)
nbins = int(np.sqrt(n)) # regla de la raíz cuadrada
fig = px.histogram(
df,
x="PACC_PRECIO_USD",
nbins=nbins,
title="Histograma de Precio USD Cacao",
labels={"PACC_PRECIO_USD": "Precio en USD Cacao"}
)
# Fondo blanco
fig.update_layout(
plot_bgcolor="white", # fondo del área de gráfico
paper_bgcolor="white" # fondo general
)
fig.update_xaxes(showgrid=True, gridcolor="lightgray")
fig.update_yaxes(showgrid=True, gridcolor="lightgray")
fig.show()4 Iteracion 3
import numpy as np
import plotly.express as px
n = len(df)
nbins = int(np.sqrt(n)) # regla de la raíz cuadrada
fig = px.histogram(
df,
x="PACC_PRECIO_USD",
nbins=nbins,
title="Histograma de Precio USD Cacao",
labels={"PACC_PRECIO_USD": "Precio en USD Cacao"},
color_discrete_sequence=["saddlebrown"] # color café
)
# Fondo blanco y personalización
fig.update_layout(
plot_bgcolor="white", # fondo del área de gráfico
paper_bgcolor="white", # fondo general
title_font=dict(color="saddlebrown", size=20) # título en café
)
fig.update_xaxes(showgrid=True, gridcolor="lightgray")
fig.update_yaxes(showgrid=True, gridcolor="lightgray")
fig.show()5 Agrege al grafico una linea que represente la media y otra la mediana.
# Número de bins con la regla de la raíz cuadrada
n = len(df)
nbins = int(np.sqrt(n))
# Histograma
fig = px.histogram(
df,
x="PACC_PRECIO_USD",
nbins=nbins,
title="Histograma de Precio USD Cacao",
labels={"PACC_PRECIO_USD": "Precio en USD Cacao"},
color_discrete_sequence=["gray"]
)
# Calcular media y mediana
mean_value = df["PACC_PRECIO_USD"].mean()
median_value = df["PACC_PRECIO_USD"].median()
# Líneas de media y mediana
fig.add_vline(
x=mean_value,
line_dash="dash",
line_color="blue",
annotation_text="Media",
annotation_position="top left"
)
fig.add_vline(
x=median_value,
line_dash="dot",
line_color="red",
annotation_text="Mediana",
annotation_position="top right"
)
# Fondo blanco y personalización
fig.update_layout(
plot_bgcolor="white",
paper_bgcolor="white",
title_font=dict(color="saddlebrown", size=20),
legend=dict(title="Referencias")
)
fig.update_xaxes(showgrid=True, gridcolor="lightgray")
fig.update_yaxes(showgrid=True, gridcolor="lightgray")
fig.show()
# Número de bins con la regla de la raíz cuadrada
n = len(df)
nbins = int(np.sqrt(n))
# Histograma
fig = px.histogram(
df,
x="PACC_PRECIO_USD",
nbins=nbins,
title="Histograma de Precio USD Cacao",
labels={"PACC_PRECIO_USD": "Precio en USD Cacao"},
color_discrete_sequence=["gray"]
)
# Calcular media y mediana
mean_value = df["PACC_PRECIO_USD"].mean()
median_value = df["PACC_PRECIO_USD"].median()
# Líneas de media y mediana
fig.add_vline(
x=mean_value,
line_dash="dash",
line_color="blue",
#annotation_text="Media",
#annotation_position="top left"
)
fig.add_annotation(
x=mean_value + 20,
y=2500,
text="Media",
showarrow=False,
font=dict(color="blue")
)
fig.add_vline(
x=median_value,
line_dash="dot",
line_color="red"
)
fig.add_annotation(
x=median_value - 30,
y=2500,
text="Mediana",
showarrow=False,
font=dict(color="red")
)
# Fondo blanco y personalización
fig.update_layout(
plot_bgcolor="white",
paper_bgcolor="white",
title_font=dict(color="saddlebrown", size=20),
legend=dict(title="Referencias")
)
fig.update_xaxes(showgrid=True, gridcolor="lightgray")
fig.update_yaxes(showgrid=True, gridcolor="lightgray")
fig.show()