Nota: este cuaderno incluye caracteres en español (á, é, í, ó, ú, ñ) y símbolos como ≥, ≤, %, $, → para validar renderizado.
URL de prueba visible: https://biitt.com/blog
Ecuación inline de margen: \(m = \frac{ingresos - costos}{ingresos}\).
👋 Sobre el autor
Wilder Ramírez Delgado es Científico de Datos, Arquitecto de IA, Ingeniero Electrónico y Magíster en Analítica de Datos. CEO y fundador de Business Innovation Technology (BIT), consultor y docente universitario, trabaja en la intersección entre Data Science, Inteligencia Artificial, Big Data e IoT, transformando problemas reales en soluciones aplicadas.
De la teoría a la práctica, un problema a la vez.
Datos
Generamos un dataset pequeño de ventas con variación por mes, región, canal y categoría.
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport plotly.express as pxnp.random.seed(42)meses = pd.date_range("2026-01-01", periods=8, freq="MS")regiones = ["Norte", "Centro", "Sur"]canales = ["Online", "Retail"]categorias = ["Software", "Servicios", "Capacitación"]rows = []for mes in meses:for region in regiones:for canal in canales:for categoria in categorias: base_unidades = np.random.randint(60, 180) precio_unitario = np.random.uniform(45, 140) descuento_pct = np.random.choice([0.00, 0.05, 0.10, 0.15], p=[0.35, 0.30, 0.25, 0.10]) ingreso_bruto = base_unidades * precio_unitario ingreso_neto = ingreso_bruto * (1- descuento_pct) costo_estimado = ingreso_neto * np.random.uniform(0.52, 0.72) rows.append({"mes": mes,"region": region,"canal": canal,"categoria": categoria,"unidades": int(base_unidades),"precio_unitario": round(precio_unitario, 2),"descuento_pct": float(descuento_pct),"ingreso_neto": round(ingreso_neto, 2),"costo_estimado": round(costo_estimado, 2) })df = pd.DataFrame(rows)print(f"Filas generadas: {len(df)}")df.head()
Filas generadas: 144
mes
region
canal
categoria
unidades
precio_unitario
descuento_pct
ingreso_neto
costo_estimado
0
2026-01-01
Norte
Online
Software
162
120.67
0.00
19548.80
13213.78
1
2026-01-01
Norte
Online
Servicios
80
59.82
0.00
4785.74
2544.18
2
2026-01-01
Norte
Online
Capacitación
147
76.70
0.00
11275.24
7330.91
3
2026-01-01
Norte
Retail
Software
112
137.14
0.10
13823.86
7775.47
4
2026-01-01
Norte
Retail
Servicios
123
139.26
0.05
16272.54
10452.35
Exploración
Primero revisamos estructura, tipos y una tabla ancha para testear visualización en publicación.
print("Resumen rápido del dataset:")print(df.info())tabla_ancha = ( df.pivot_table( index=["region", "canal"], columns="mes", values="ingreso_neto", aggfunc="sum" ) .round(0))tabla_ancha.columns = [c.strftime("%Y-%m") for c in tabla_ancha.columns]tabla_ancha
Unable to display output for mime type(s): application/vnd.plotly.v1+json
Versión estática del gráfico interactivo
Medium (y otros importadores que no ejecutan JavaScript) no pueden mostrar el widget interactivo de Plotly de arriba. Por eso generamos también una versión estática (PNG) del mismo gráfico, para que sobreviva en plataformas sin soporte de JS.
from IPython.display import Image, display# Exportamos el mismo gráfico de Plotly como imagen estática (requiere el paquete kaleido).# Esta versión sí es un <img> normal en el HTML final, así que sobrevive al import de Medium.fig.update_layout(width=900, height=520)fig.write_image("plotly_scatter_static.png", scale=2)display(Image(filename="plotly_scatter_static.png"))
Conclusiones
Este notebook cumple con una estructura técnica publicable: Título → Introducción → Datos → Exploración → Transformación → Estadísticas → Visualizaciones → Conclusiones.
Hallazgos ficticios: - El ingreso y la utilidad muestran variación moderada por mes. - Existen diferencias entre regiones y canales en margen promedio. - El formato incluye componentes útiles para validar exportación a HTML, blog y Medium.
Checklist visual rápida: - Caracteres especiales: á, é, í, ó, ú, ñ - Símbolos: ≥, ≤, %, $, → - Tabla ancha y bloque de código largo - Gráficas estáticas + gráfica interactiva
💬 ¿Te sirvió?
Deja en los comentarios una duda o un caso donde aplicarías esto — respondo todos. Sígueme para no perderte el próximo artículo de la serie y comparte con alguien que esté aprendiendo análisis de datos.
👉 El código completo está disponible para ejecutar directamente.