Lección 16 de 29Módulo 3: Visualización de Datos

16. Proyecto: Dashboard de Social Listening

Proyecto integrador: crea un dashboard completo de métricas sociales

30 minutos

Crea un dashboard completo de social listening integrando todo lo aprendido: carga de datos, limpieza, análisis y visualización.

Descripción del proyecto

Construirás un dashboard que analiza menciones de marca en redes sociales, identificando:

  • Volumen de menciones
  • Sentiment analysis (positivo/negativo/neutral)
  • Tendencias temporales
  • Plataformas más activas
  • Palabras clave frecuentes

Dataset simulado

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta

# Generar dataset de menciones
np.random.seed(42)

fechas = pd.date_range('2024-01-01', periods=500, freq='H')
plataformas = ['Twitter', 'Facebook', 'Instagram', 'LinkedIn', 'TikTok']
sentimientos = ['Positivo', 'Neutral', 'Negativo']

df_menciones = pd.DataFrame({
    'fecha': np.random.choice(fechas, 1000),
    'plataforma': np.random.choice(plataformas, 1000, p=[0.4, 0.25, 0.2, 0.1, 0.05]),
    'sentimiento': np.random.choice(sentimientos, 1000, p=[0.5, 0.3, 0.2]),
    'engagement': np.random.randint(1, 1000, 1000),
    'alcance': np.random.randint(100, 10000, 1000),
    'mencion_texto': [f'Mención {i}' for i in range(1000)]
})

# Calcular métricas
df_menciones['engagement_rate'] = (df_menciones['engagement'] / df_menciones['alcance']) * 100
df_menciones['fecha'] = pd.to_datetime(df_menciones['fecha'])
df_menciones = df_menciones.sort_values('fecha')

print("Dataset de menciones cargado:")
print(df_menciones.head())

Dashboard completo

# Configurar estilo
sns.set_style("whitegrid")
plt.rcParams['figure.figsize'] = (20, 12)

# Crear dashboard con 6 visualizaciones
fig = plt.figure(figsize=(20, 12))
gs = fig.add_gridspec(3, 3, hspace=0.3, wspace=0.3)

# 1. Tendencia de menciones en el tiempo
ax1 = fig.add_subplot(gs[0, :])
menciones_diarias = df_menciones.groupby(df_menciones['fecha'].dt.date).size()
ax1.plot(menciones_diarias.index, menciones_diarias.values, linewidth=2, color='#2E86AB')
ax1.fill_between(menciones_diarias.index, menciones_diarias.values, alpha=0.3, color='#2E86AB')
ax1.set_title('Tendencia de Menciones - Enero 2024', fontsize=16, fontweight='bold')
ax1.set_xlabel('Fecha', fontsize=12)
ax1.set_ylabel('Número de Menciones', fontsize=12)
ax1.grid(alpha=0.3)

# 2. Distribución por sentimiento
ax2 = fig.add_subplot(gs[1, 0])
sentimiento_counts = df_menciones['sentimiento'].value_counts()
colores_sent = {'Positivo': '#06D6A0', 'Neutral': '#FFD166', 'Negativo': '#EF476F'}
colors = [colores_sent[s] for s in sentimiento_counts.index]
ax2.pie(sentimiento_counts.values, labels=sentimiento_counts.index, autopct='%1.1f%%',
        colors=colors, startangle=90)
ax2.set_title('Distribución de Sentimiento', fontsize=14, fontweight='bold')

# 3. Menciones por plataforma
ax3 = fig.add_subplot(gs[1, 1])
plat_counts = df_menciones['plataforma'].value_counts()
ax3.barh(plat_counts.index, plat_counts.values, color='#457B9D')
ax3.set_title('Menciones por Plataforma', fontsize=14, fontweight='bold')
ax3.set_xlabel('Número de Menciones')

# 4. Engagement rate por plataforma
ax4 = fig.add_subplot(gs[1, 2])
eng_por_plat = df_menciones.groupby('plataforma')['engagement_rate'].mean().sort_values()
ax4.barh(eng_por_plat.index, eng_por_plat.values, color='#E63946')
ax4.set_title('Engagement Rate Promedio', fontsize=14, fontweight='bold')
ax4.set_xlabel('Engagement Rate (%)')

# 5. Heatmap: Sentimiento x Plataforma
ax5 = fig.add_subplot(gs[2, 0:2])
pivot_sent = df_menciones.pivot_table(
    values='engagement',
    index='plataforma',
    columns='sentimiento',
    aggfunc='count',
    fill_value=0
)
sns.heatmap(pivot_sent, annot=True, fmt='d', cmap='YlOrRd', ax=ax5, cbar_kws={'label': 'Menciones'})
ax5.set_title('Menciones: Plataforma x Sentimiento', fontsize=14, fontweight='bold')

# 6. Top horas del día
ax6 = fig.add_subplot(gs[2, 2])
df_menciones['hora'] = df_menciones['fecha'].dt.hour
menciones_por_hora = df_menciones['hora'].value_counts().sort_index()
ax6.bar(menciones_por_hora.index, menciones_por_hora.values, color='#06D6A0', alpha=0.7)
ax6.set_title('Actividad por Hora del Día', fontsize=14, fontweight='bold')
ax6.set_xlabel('Hora')
ax6.set_ylabel('Menciones')
ax6.set_xticks(range(0, 24, 2))

# Título general del dashboard
fig.suptitle('DASHBOARD DE SOCIAL LISTENING - Tooldata', fontsize=20, fontweight='bold', y=0.98)

plt.savefig('dashboard_social_listening.png', dpi=300, bbox_inches='tight')
plt.show()

Análisis y reporte ejecutivo

print("="*70)
print("REPORTE EJECUTIVO DE SOCIAL LISTENING")
print("="*70)

# Métricas clave
total_menciones = len(df_menciones)
sentiment_dist = df_menciones['sentimiento'].value_counts(normalize=True) * 100
plat_principal = df_menciones['plataforma'].value_counts().index[0]
engagement_promedio = df_menciones['engagement'].mean()
alcance_total = df_menciones['alcance'].sum()

print(f"\n📊 MÉTRICAS GENERALES:")
print(f"  Total de menciones: {total_menciones:,}")
print(f"  Alcance total: {alcance_total:,} personas")
print(f"  Engagement promedio: {engagement_promedio:.1f}")
print(f"  Plataforma principal: {plat_principal}")

print(f"\n😊 ANÁLISIS DE SENTIMIENTO:")
print(f"  Positivo: {sentiment_dist.get('Positivo', 0):.1f}%")
print(f"  Neutral: {sentiment_dist.get('Neutral', 0):.1f}%")
print(f"  Negativo: {sentiment_dist.get('Negativo', 0):.1f}%")

# Insights adicionales
sentimiento_dominante = df_menciones['sentimiento'].mode()[0]
mejor_plataforma = df_menciones.groupby('plataforma')['engagement_rate'].mean().idxmax()
hora_pico = df_menciones['hora'].mode()[0]

print(f"\n🎯 INSIGHTS CLAVE:")
print(f"  ✅ Sentimiento general: {sentimiento_dominante}")
print(f"  ⭐ Mejor engagement: {mejor_plataforma}")
print(f"  🕐 Hora pico: {hora_pico}:00")

# Recomendaciones
print(f"\n💡 RECOMENDACIONES:")
if sentiment_dist.get('Negativo', 0) > 30:
    print("  ⚠️ Alto porcentaje de sentimiento negativo - Revisar crisis de comunicación")
else:
    print("  ✅ Sentimiento general positivo - Mantener estrategia")

print(f"  📱 Enfocar esfuerzos en {plat_principal} (mayor volumen)")
print(f"  ⏰ Publicar contenido cerca de las {hora_pico}:00 para máximo alcance")

Resumen de la lección

✅ Integraste carga, limpieza, análisis y visualización de datos ✅ Creaste un dashboard completo con múltiples visualizaciones ✅ Generaste insights accionables a partir de datos ✅ Aplicaste mejores prácticas de visualización ✅ Produjiste un reporte ejecutivo profesional


🎯 Próxima lección: 17. Estadística Descriptiva con NumPy

¡Completaste el módulo de Visualización! Ahora comenzarás con Estadística Aplicada. 🚀

Checkpoint de comprensión

3 preguntas para verificar lo aprendido. No afecta tu nota del examen final.

1¿Qué librerías combinás para construir un dashboard de Social Listening en Python?
2¿Cuál es la métrica más importante en un dashboard de Social Listening?
3¿Cómo desplegás tu dashboard de Streamlit para que tu equipo lo use?

¿Completaste esta lección?

Marca esta lección como completada. Tu progreso se guardará en tu navegador.