16. Proyecto: Dashboard de Social Listening
Proyecto integrador: crea un dashboard completo de métricas sociales
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.