Volver al curso

Data Science con Python: Análisis de Datos para Tu Carrera

leccion
19 / 23
intermediate
8 horas
Visualizacion de Datos

Storytelling con Datos: Graficos Efectivos

Lectura
45 min~5 min lectura

Storytelling con Datos: Graficos Efectivos

Comunicar, No Solo Mostrar

El 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:

  1. Crea un reporte visual de una pagina con 4 graficos para un dataset de ventas
  2. Usa titulos descriptivos que cuenten la historia
  3. Aplica colores con proposito (destacar, comparar, alertar)
  4. Elimina todo el chartjunk innecesario
  5. Agrega una seccion de KPIs con metricas clave
  6. 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.