Histograma

Python
code
Visualization
Author

Marco Aguirre

Published

September 15, 2025

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).
  • 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

  1. Elegir bins inadecuados
    • Bins demasiado anchos pierdes detalle.
    • Bins demasiado estrechos ruido excesivo.
  2. Escalas y etiquetas incorrectas
    • Ejes sin unidades o mal definidos dificulta interpretación.
    • Escalas distintas al comparar histogramas comparaciones engañosas.
  3. 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
import plotly.express as px
import plotly.io as pio
import numpy as np
pio.renderers.default = "notebook"
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()