Dashboard de Ventas Minoristas con Python
Este análisis utiliza Python y Matplotlib para construir un dashboard interactivo que muestra las ventas por país, producto, categoría y más.
Incluye gráficos de barras, pastel y tablas, todo generado programáticamente a partir de datos reales de ventas.
Metricas Importantes
+ 6 Gráficos Generados
Gráficos incluidos (Barras, Pie, Línea, Tablas)
Python
Lenguaje utilizado
Matplotlib
Biblioteca de visualización
Pandas
Biblioteca de Manipulación
Código en Python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# Cargar el dataset
file_path = "./online_retail.csv"
df = pd.read_csv(file_path)
# Rellenar valores nulos
df = df.fillna("Sin Dato")
# Limpiar los datos de los valores duplicados y los almaceno en un nuevo df
df_cleaned = df.drop_duplicates()
# Convertir columna fechas en formato fecha
df_cleaned["InvoiceDate"] = pd.to_datetime(df_cleaned["InvoiceDate"])
df_cleaned["Description"] = df_cleaned["Description"].astype(str)
# funcion para categorizar datos
def categorize(amount):
if amount < 25:
return "Low"
elif amount < 200:
return "Medium"
else:
return "Hight"
# Creacion de nuevas columnas con nuevos datos a obtener
df_cleaned["TotalAmount"] = df_cleaned["Quantity"] * df_cleaned["UnitPrice"]
df_cleaned["Year"] = df_cleaned["InvoiceDate"].dt.year
df_cleaned["Month"] = df_cleaned["InvoiceDate"].dt.month
df_cleaned["Day"] = df_cleaned["InvoiceDate"].dt.day
df_cleaned["Semester"] = df_cleaned["Month"].apply(lambda x:1 if x<=6 else 2)
df_cleaned["Trimestre"] = df_cleaned["Month"].apply(lambda x:1 if x<=3 else 2 if x<=6 else 3 if x<=9 else 4)
df_cleaned["Categorize"] = df_cleaned["TotalAmount"].apply(categorize)
# Creamos un nuevo df con agrupaciones o informaciòn especifica
sales_by_year = df_cleaned.groupby("Year")["TotalAmount"].sum().reset_index()
sales_by_semester = df_cleaned.groupby(["Year","Semester"])["TotalAmount"].sum().reset_index()
sales_by_trimestre = df_cleaned.groupby(["Year","Trimestre"])["TotalAmount"].sum().reset_index()
sales_by_month = df_cleaned.groupby(["Year","Month"])["TotalAmount"].sum()
# Obtenemos el top 10 de prodcutos
top_products = df_cleaned.groupby("StockCode")["Quantity"].sum().sort_values(ascending=False).head(10)
top_products = top_products.reset_index()
top_products = pd.merge(top_products, df_cleaned[["StockCode", "Description"]].drop_duplicates(), on="StockCode", how="left")
total_returns = df_cleaned[df_cleaned["Quantity"] < 0].shape[0]
total_non_returns = df_cleaned[df_cleaned["Quantity"] >= 0].shape[0]
total_low = df_cleaned[df_cleaned["Categorize"] == "Low"].shape[0]
total_medium = df_cleaned[df_cleaned["Categorize"] == "Medium"].shape[0]
total_hight = df_cleaned[df_cleaned["Categorize"] == "Hight"].shape[0]
sales_by_country = df_cleaned.groupby("Country")["TotalAmount"].sum()
sales_by_country_top10 = sales_by_country.sort_values(ascending=False).head(10)
sales_by_categorize = df_cleaned.groupby("Categorize")["TotalAmount"].count()
# Crea graficos con matplotlib con funciones
def graph_returns():
labels = ["Devoluciones", "No Devoluciones"]
sizes = [total_returns, total_non_returns]
colors = ["skyblue", "orange"]
plt.figure(figsize=(8,8))
plt.pie(sizes, labels=labels, colors=colors , autopct="%1.1f%%", startangle=140)
plt.title("% transacciones con y sin Devolucion")
plt.axis("equal")
plt.show()
def graph_categorize():
labels = ["Low", "Medium", "Hight"]
sizes = [total_low, total_medium, total_hight]
colors = ["skyblue", "orange", "gold"]
plt.figure(figsize=(8,8))
plt.pie(sizes, labels=labels, colors=colors , autopct="%1.1f%%", startangle=140)
plt.title("% por categoria de monto")
plt.axis("equal")
plt.show()
def graph_sales_month():
sales_by_month.index = sales_by_month.index.map(lambda x: f"{x[0]}-{x[1]:02d}")
plt.figure(figsize=(8,6))
plt.plot(sales_by_month.index, sales_by_month.values, marker="o", color="green")
for i, value in enumerate(sales_by_month.values):
plt.text(i, value, f"{value/1e6:.1f}M", ha='center', va='bottom', fontsize=9)
plt.title("Ventas por mes")
plt.xlabel("Meses")
plt.xticks(rotation=45)
plt.ylabel("Ventas (millones)")
plt.show()
def table_sales_semester():
sales_by_semester["TotalAmount"] = sales_by_semester["TotalAmount"].map(lambda x: f"$ {x:,.0f}")
fig, ax = plt.subplots(figsize=(6, 2))
ax.axis("off") # Oculta los ejes
# Dibujar tabla
tabla = ax.table(
cellText=sales_by_semester.values,
colLabels=sales_by_semester.columns,
cellLoc="center",
loc="center"
)
tabla.auto_set_font_size(False)
tabla.set_fontsize(10)
tabla.scale(1.2, 1.2)
plt.show()
def graph_sales_country():
plt.figure(figsize=(10,4))
bars = plt.bar(sales_by_country_top10.index, sales_by_country_top10.values, color = "skyblue", label = "Ventas por Pais")
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, yval, f"{yval/1e6:.1f}M", ha='center', va='bottom', fontsize=9)
plt.title("Top 10 Paises con Mayores Ventas")
plt.xlabel("Top 10 Paises")
plt.xticks(rotation=45)
plt.ylabel("Ventas (millones)")
plt.show()
def graph_top10_products():
plt.figure(figsize=(12,8))
plt.barh(top_products["Description"], top_products["Quantity"], color = "salmon")
plt.title("Top 10 Prodcutos mas Vendidos")
plt.xlabel("Cantidad Vendida")
#plt.xticks(rotation=45)
plt.ylabel("Prodcuto")
plt.gca().invert_yaxis()
plt.show()
graph_sales_month()
graph_top10_products()
graph_categorize()
graph_returns()
graph_sales_country()
table_sales_semester()
Aquí podrás encontrar el código completo utilizado para construir cada una de las gráficas del análisis. Se incluyen las etapas de tratamiento de datos, desde la carga del dataset hasta la transformación y creación de nuevas columnas. Además, se muestran fragmentos relevantes del código con explicaciones para entender cómo se organizaron y visualizaron los resultados.
Metodología
El análisis fue desarrollado en Jupyter Notebook utilizando Python como lenguaje principal. Se trabajó con la biblioteca Pandas para la limpieza, transformación y manipulación de los datos, incluyendo:
✅ Conversión de tipos de datos.
✅ Eliminación y tratamiento de valores nulos.
✅ Agrupaciones y resúmenes estadísticos.
✅ Creación de columnas personalizadas mediante funciones definidas por el usuario.
Para la visualización, se utilizó Matplotlib, organizando las gráficas mediante GridSpec para formar un dashboard programático que resume los indicadores clave del comportamiento de ventas.
Incluye código Python, dataset y gráficos generados.