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. 🚀

¿Completaste esta lección?

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