Storytelling con Datos: Graficos Efectivos
Comunicar, No Solo MostrarEl objetivo de la visualizacion no es hacer graficos bonitos, es comunicar un mensaje claro. Los mejores analistas de datos saben contar historias con sus graficos. Esta leccion te ensenia los principios de diseno que hacen que tus visualizaciones sean efectivas.
Principios de Visualizacion Efectiva
1. Elegir el grafico correcto
| Quiero mostrar... | Grafico recomendado |
|---|---|
| Comparacion entre categorias | Barras horizontales |
| Tendencia en el tiempo | Lineas |
| Distribucion de una variable | Histograma, boxplot |
| Relacion entre 2 variables | Scatter plot |
| Proporcion del todo | Barras apiladas (NO torta para 5+ categorias) |
| Composicion jerarquica | Treemap |
2. Eliminar el "chartjunk"
Menos es mas. Elimina todo lo que no aporte informacion.
import matplotlib.pyplot as plt
import numpy as np
categorias = ['Producto A', 'Producto B', 'Producto C', 'Producto D', 'Producto E']
valores = [45, 38, 32, 28, 22]
# MAL: Grafico sobrecargado
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
axes[0].bar(categorias, valores, color=['red', 'blue', 'green', 'orange', 'purple'],
edgecolor='black', linewidth=2)
axes[0].set_title('VENTAS POR PRODUCTO!!!', fontsize=18, color='red')
axes[0].grid(True, color='gray', linewidth=2)
axes[0].set_ylabel('VENTAS EN MILES DE DOLARES USD')
axes[0].legend(['Producto A', 'Producto B', 'Producto C', 'Producto D', 'Producto E'])
for s in axes[0].spines.values():
s.set_linewidth(3)
axes[0].text(0.5, 0.95, 'Mal ejemplo', transform=axes[0].transAxes, ha='center', fontsize=14, color='red')
# BIEN: Grafico limpio y efectivo
colors = ['#2196F3'] * 5
colors[0] = '#FF5722' # Destacar el primero
axes[1].barh(categorias[::-1], valores[::-1], color=colors[::-1], height=0.6)
axes[1].set_title('Producto A lidera las ventas', fontsize=14, fontweight='bold', loc='left')
axes[1].set_xlabel('Ventas (miles USD)')
axes[1].spines['top'].set_visible(False)
axes[1].spines['right'].set_visible(False)
for i, v in enumerate(valores[::-1]):
axes[1].text(v + 0.5, i, f'${v}k', va='center', fontweight='bold')
axes[1].text(0.5, 0.95, 'Buen ejemplo', transform=axes[1].transAxes, ha='center', fontsize=14, color='green')
plt.tight_layout()
plt.show()
Estructura de un Reporte Visual
Un buen reporte de datos sigue esta estructura:
1. TITULO DESCRIPTIVO (no generico)
Mal: "Grafico de ventas"
Bien: "Las ventas crecieron 23% en Q2 impulsadas por laptops"
2. CONTEXTO (subtitulo o anotacion)
"Comparado con el mismo periodo del anio anterior"
3. DATOS CLAROS
- Ejes etiquetados
- Unidades claras
- Colores con proposito
4. LLAMADO A LA ACCION
"Recomendacion: Aumentar inventario de laptops para Q3"
Ejemplo: Reporte ejecutivo
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(14, 10))
fig.suptitle('Reporte de Ventas Q2 2025', fontsize=20, fontweight='bold', y=0.98)
fig.text(0.5, 0.94, 'Las ventas crecieron un 23% respecto a Q1, superando el objetivo trimestral',
ha='center', fontsize=12, color='gray')
# 1. Tendencia mensual
ax1 = fig.add_subplot(2, 2, 1)
meses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun']
ventas = [120, 115, 130, 155, 170, 185]
objetivo = [140] * 6
ax1.plot(meses, ventas, 'o-', color='#2196F3', linewidth=2, markersize=8, label='Real')
ax1.plot(meses, objetivo, '--', color='gray', alpha=0.5, label='Objetivo')
ax1.fill_between(meses, ventas, alpha=0.1, color='#2196F3')
ax1.set_title('Tendencia de Ventas', fontweight='bold', loc='left')
ax1.set_ylabel('Miles USD')
ax1.legend()
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)
# 2. Ventas por region
ax2 = fig.add_subplot(2, 2, 2)
regiones = ['Norte', 'Sur', 'Este', 'Oeste']
ventas_q2 = [285, 210, 340, 165]
colors = ['#4CAF50' if v >= 250 else '#FF9800' for v in ventas_q2]
ax2.barh(regiones, ventas_q2, color=colors, height=0.5)
ax2.set_title('Ventas por Region', fontweight='bold', loc='left')
ax2.set_xlabel('Miles USD')
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
for i, v in enumerate(ventas_q2):
ax2.text(v + 3, i, f'${v}k', va='center')
# 3. Distribucion de productos
ax3 = fig.add_subplot(2, 2, 3)
productos = ['Laptops', 'Monitores', 'Teclados', 'Mouse', 'Audio']
pcts = [38, 25, 18, 12, 7]
colors = ['#FF5722', '#2196F3', '#4CAF50', '#FF9800', '#9C27B0']
ax3.barh(productos[::-1], pcts[::-1], color=colors[::-1], height=0.5)
ax3.set_title('Mix de Productos', fontweight='bold', loc='left')
ax3.set_xlabel('% de ventas')
ax3.spines['top'].set_visible(False)
ax3.spines['right'].set_visible(False)
# 4. KPIs
ax4 = fig.add_subplot(2, 2, 4)
ax4.axis('off')
kpis = [
('Ventas Totales', '$1.0M', '+23%', 'green'),
('Ticket Promedio', '$2,340', '+8%', 'green'),
('Clientes Nuevos', '145', '+15%', 'green'),
('Tasa de Retencion', '87%', '-2%', 'red')
]
for i, (titulo, valor, cambio, color) in enumerate(kpis):
y = 0.85 - i * 0.25
ax4.text(0.1, y, titulo, fontsize=11, color='gray', transform=ax4.transAxes)
ax4.text(0.1, y - 0.08, valor, fontsize=20, fontweight='bold', transform=ax4.transAxes)
ax4.text(0.55, y - 0.08, cambio, fontsize=14, color=color, fontweight='bold', transform=ax4.transAxes)
plt.tight_layout(rect=[0, 0, 1, 0.92])
plt.savefig('reporte_q2.png', dpi=150, bbox_inches='tight', facecolor='white')
plt.show()
Paletas de Colores Profesionales
# Paletas recomendadas para reportes de negocio
paletas = {
'Corporativa': ['#1a237e', '#283593', '#3949ab', '#5c6bc0', '#7986cb'],
'Moderna': ['#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336'],
'Minimalista': ['#263238', '#455A64', '#78909C', '#B0BEC5', '#ECEFF1'],
'Vibrante': ['#FF6F00', '#FF8F00', '#FFA000', '#FFB300', '#FFC107']
}
# Regla del color:
# - Usa 1 color principal para todo
# - Usa un color de acento para destacar lo importante
# - Gris para el resto
Video Recomendado
Storytelling con Datos - Mejores Practicas
Ejercicio Practico
Crea un notebook 19_storytelling.ipynb:
- Crea un reporte visual de una pagina con 4 graficos para un dataset de ventas
- Usa titulos descriptivos que cuenten la historia
- Aplica colores con proposito (destacar, comparar, alertar)
- Elimina todo el chartjunk innecesario
- Agrega una seccion de KPIs con metricas clave
- Guarda como PNG de alta calidad listo para presentacion
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- Titulo descriptivo: Cuenta la conclusion, no describe el grafico
- Menos es mas: Elimina gridlines, bordes y decoraciones innecesarias
- Color con proposito: Destacar lo importante, gris para el resto
- Barras horizontales > verticales: Para comparar categorias con texto
- Evitar graficos de torta: Usa barras para 5+ categorias
- Contexto: Siempre da referencia (objetivo, periodo anterior)
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.