DIPLOMADO EN ESTRATEGIAS DE DATOS
CAPÍTULO 3: VISUALIZACIÓN PRO
MÓDULO 1: PYTHON CORE

Visualización Pro: Del EDA al Storytelling

19 Conceptos para dejar de hacer gráficos y empezar a comunicar datos.

Fase 1: Fundamentos

1. La Mentira de la Escala

En datos reales (salarios, tiempos), la mayoría se agrupa abajo y los extremos rompen la escala visual. Un histograma normal no sirve.

Reto: Grafica trip_duration. Se verá horrible. Aplica plt.xscale('log') para ver la verdad oculta.
sns.histplot(data=df, x='duration')
plt.xscale('log') # La clave mágica

Fase 1: Fundamentos

2. Orden Significativo

El orden alfabético no aporta valor. El orden debe contar una historia (de mayor a menor impacto).

Reto: Ordena los días de la semana por cantidad de viajes (el más ocupado primero), no por Lunes-Domingo.
order = df['day'].value_counts().index
sns.countplot(..., order=order)

Fase 1: Fundamentos

3. Anatomía de una Figura

Deja de usar plt.plot(). Usa la interfaz orientada a objetos para control total.

Reto: Crea una figura explícita (12x6) y define ejes, títulos y etiquetas manualmente usando ax.
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(x, y)
ax.set_title("Título Controlado")
graph TD Figure[Objeto FIGURE
El Lienzo Completo] --> Axes[Objeto AXES
El Gráfico en sí] Axes --> XAxis[Eje X] Axes --> YAxis[Eje Y] Axes --> Title[Título] Axes --> Legend[Leyenda] style Figure fill:#003366,color:white style Axes fill:#FFCC00,color:black

Fase 1: Fundamentos

4. Títulos Activos

Un título no debe describir los ejes ("Ventas por Año"). Debe dar la conclusión ("Las Ventas Cayeron").

Reto: Cambia el título aburrido por uno que narre el hallazgo principal del gráfico.

❌ Ventas por Trimestre

✅ El tráfico decae un 40% los Domingos

Fase 2: Big Data

5. El Desastre del Sólido

Con 1.4M de puntos, un scatter plot normal es una mancha de tinta inútil.

Reto: Grafica Distancia vs Duración. Usa alpha=0.05 y s=1. Verás patrones ocultos.
plt.scatter(x, y, alpha=0.05, s=1)

Fase 2: Big Data

6. Hexbins (Densidad)

Cuando hay demasiados puntos, visualiza la densidad, no los individuos.

Reto: Usa sns.jointplot(kind="hex"). Crea un mapa de calor hexagonal.

Fase 2: Big Data

7. Mapas sin Mapas

Podemos usar latitud y longitud como ejes X/Y para recrear la ciudad sin librerías complejas.

Reto: Scatter de Longitud vs Latitud. Usa puntos diminutos. ¡Dibujarás Manhattan!

Fase 3: Relaciones

8. Heatmaps Temporales

La mejor forma de ver patrones cíclicos (Hora vs Día de Semana).

Reto: Pivota la tabla (Index=Día, Col=Hora). Visualiza con sns.heatmap. ¿Cuál es la peor hora del Viernes?

Fase 3: Relaciones

9. Small Multiples

No metas 5 líneas en un gráfico. Haz 5 gráficos pequeños comparables (FacetGrid).

Reto: Usa col='vendor_id' en Seaborn para separar histogramas y comparar proveedores.
Vendor 1
Vendor 2

Fase 3: Relaciones

10. Boxplots y Violines

Comparar medias es peligroso. Hay que ver la dispersión y los outliers.

Reto: Boxplot de distance_km por passenger_count. ¿Grupos grandes viajan más lejos?
sns.boxplot(x='passengers', y='dist')

Fase 4: Estética

11. Menos es Más

Elimina bordes, fondos grises y líneas innecesarias. El dato es el rey.

Reto: Usa sns.despine() para quitar bordes superiores y derechos. Limpia tu gráfico.
Antes (Ruidoso)
⬇️ sns.despine() ⬇️
Después (Limpio)

Fase 4: Estética

12. Color con Significado

No uses arcoíris aleatorios. Usa colores para indicar intensidad o categorías semánticas.

Reto: Colorea barras: Rojo (Lento), Amarillo (Normal), Verde (Rápido).

Fase 4: Estética

13. Anotaciones Directas

Las leyendas externas distraen. Señala lo importante directamente en el gráfico.

Reto: Usa ax.annotate() para señalar el mínimo del Domingo con una flecha.
ax.annotate("Mínimo", xy=(x, y), xytext=(...))

Fase 4: Estética

14. Exportación HQ

Las capturas de pantalla son para amateurs. Guarda con DPI alto para reportes impresos.

Reto: plt.savefig('plot.png', dpi=300, bbox_inches='tight').
📉

Default (72 DPI)

📈

300 DPI (Nítido)

Fase 5: Capstone

15. Setup del Reporte PDF

Automatización total: Python generando PDFs sin intervención humana.

Reto: Inicializa FPDF, agrega página y título centrado "Reporte de Movilidad".
from fpdf import FPDF
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", "B", 16)
PDF Generado

Fase 5: Capstone

16. Generador de Assets

Crea funciones que generen y guarden imágenes temporales, no que las muestren en pantalla.

Reto: def generar_grafico(df): ... plt.savefig('temp.png') plt.close()
graph LR DF[DataFrame] --> Func[Función Python] Func --> Plot[Matplotlib Plot] Plot --> Save[Guardar PNG] Save --> Disk[Disco Duro] Save --> Close[Liberar Memoria] style Disk fill:#DA291C,color:white

Fase 5: Capstone

17. Datos Tabulares

Los DataFrames no se pegan solos. Conviértelos a strings o listas formateadas.

Reto: Crea una función que resuma el Top 5 de horas y devuelva texto listo para imprimir.
graph TD DF[DataFrame Gigante] --> Agg[Groupby & Sort] Agg --> Top5[Top 5 Rows] Top5 --> Loop[Iterar Filas] Loop --> String[String Formateado] String --> PDF[Método pdf.cell] style PDF fill:#003366,color:white

Fase 5: Capstone

18. Integración Final

Ensambla el rompecabezas. Inserta la imagen generada en el PDF.

Reto: Usa pdf.image('temp.png', w=190) para colocar el gráfico bajo el título.
TÍTULO PDF
Gráfico Insertado
Texto explicativo...
⬅️
asset.png

Fase 5: Capstone

19. Narrativa Dinámica

El reporte debe "leer" los datos. Usa f-strings para insertar métricas calculadas en el texto.

Reto: Escribe un párrafo introductorio automático: f"Analizamos {total} viajes...".
total = df.shape[0]
pdf.multi_cell(0, 10, f"Total: {total}")
"Hoy procesamos 1,450,200 datos."

¡Módulo 1 Completado!

Has dominado Python, Pandas y Visualización Pro.

Próximo: Bases de Datos y SQL