Alexis Martinez
MCD-UNISON
Published in
4 min readNov 24, 2020

--

Análisis de grupo vecinal de WhatsApp

Hoy en día WhatsApp es una de las aplicaciones de mensajería más usadas y los grupos que podemos crear en ella para estar en contacto con nuestro grupo de amigos, familiares y/o compañeros de trabajo, han sido de gran importancia en el éxito de esta. Esto ha permite que se acumule una gran cantidad de datos con el intercambio de mensajes haciendo interesante su análisis.

En este caso analizaremos un grupo integrado por amigos vecinos de entre 18 y 20 años, muy diverso en los temas que se hablan. Usaremos Python para realizarlo y veremos que resulta.

Para este análisis nos basamos en el trabajo hecho por Saiteja Kura en su artículo Whatsapp Group Chat Analysis using Python and Plotly, al cual le realizamos algunas modificaciones para que funcionara en español y con la fuente de datos exportando los datos desde el sistema operativo Android.

Preparación de los datos

En esta primera parte tenemos que convertir nuestro archivo de texto de manera que la podamos guardar en un Pandas dataframe.

Vamos a considerar solo una línea del texto de nuestro archivo y ver como extraer columnas relevantes:

14/12/15 1:13 p. m. — Participante 1: Dos que tres leyeras simple

nuestro objetivo será automáticamente separar la línea de texto en 4 tokens.{Fecha} {Hora} — {Autor}: {Mensaje}

{14/12/15} {1:13 p. m.} — {Participante 1}: {Dos que tres leyeras simple}

Usamos expresiones regulares para identificar distintas partes de la línea de texto y que nos ayuden separarlo, como se muestra en las siguientes funciones.

Participantes y su anonimización

Como vemos en los autores podemos llegar tener un valor “None” que serían las líneas que no tienen autor como:

  • participante 1 cambió el asunto a “nuevo asunto”
  • participante 1 cambió el icono de este grupo
  • participante 1 añadió
  • etc.

vamos a eliminar estos mensajes creados por “None” y posteriormente cambiaremos los nombres de los autores para mantenerlos anónimos, usando los nombres de los personajes de la película del señor de los anillos.

#Eliminamos los mensajes sin autor 
df = df.dropna()
# Anonimizar a los autores de los mensajes
# Lista con los personajes del Señor de los Anillos
got_dt = pd.read_csv("https://raw.githubusercontent.com/tmdavid/lotr-names-classification/master/characters_no_surnames.csv")
# Obtiene nombres y aliases
nombres = list(df.Author.unique())
aliases = list(got_dt.name.sample(len(nombres)))
# Remplaza en la reemplaza los autores de los mensajes
# por aliases por entrada completa
df.Author.replace(nombres, aliases, inplace=True)
df.Author.unique()

Estadísticas de grupo

Vamos a calcular algunos estadísticos generales del grupo.

Estadísticas del grupo
Mensajes: 3323
Multimedia: 524
Emojis: 1142
Links: 9

Estadísticas por autor

Ahora analizaremos el comportamiento por autor para ver como ha sido su participación en el grupo. Agregamos algunas columnas mas para tener más estadísticas.

resultados de solo 3 participantes

Estadìsticas de Daeron 
Mensajes enviados: 471
Palabras por mensaje: 3.0573248407643314
Mensajes multimedia enviados: 44
Emojis enviados: 278
Links enviados 1

Estadìsticas de Fréca
Mensajes enviados: 263
Palabras por mensaje: 4.562737642585551
Mensajes multimedia enviados: 47
Emojis enviados: 96
Links enviados 1

Estadìsticas de Reginard
Mensajes enviados: 304
Palabras por mensaje: 3.8815789473684212
Mensajes multimedia enviados: 22
Emojis enviados: 153
Links enviados 1

Estadísticas de emojis

En nuestro caso contamos con un total de 194 emojis diferentes. Los cuales están distribuidos de la siguiente manera:

# Codigo para el calculo de las estadisticas 
total_emojis_list = list([a for b in messages_df.emoji for a in b])
emoji_dict = dict(Counter(total_emojis_list))
emoji_dict = sorted(emoji_dict.items(), key=lambda x: x[1], reverse=True)
emoji_df = pd.DataFrame(emoji_dict, columns=['emoji', 'count'])
fig = px.pie(emoji_df, values='count', names='emoji')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()

Distribución de mensajes por día de la semana

Para el caso de este grupo vecinal vemos que es un poco extraña la distribución de los días con más mensajes siendo este de sábado a martes probablemente por el fin de semana y las pláticas se extendían hasta el martes. Además, agregamos una gráfica de mensajes a través del tiempo.

Nube de palabras

Por último creamos una nube de palabras en la cual las palabras mas frecuentes son reconocibles por el tamaño en donde a pesar de haber excluido las palabras de paro vemos algunas de uso común sobresalir, dado que es un grupo en donde no hubo bastantes mensajes y con un fin muy general no vemos podemos identificar algún tópico del que se hable.

Conclusión

Un resultado un tanto esperado siendo este un grupo de jóvenes y con un fin general. Este es un ejercicio muy interesante mas cuando se tienen grupos de temática especifica en mi parecer.

Fue realizado en Python y permite desarrollar ciertas habilidades tanto en graficación como el manejo de expresiones regulares para tratar el texto. Para ver más estadísticas pueden ver el código completo.

Libreta código completo

--

--

Alexis Martinez
MCD-UNISON

Computer scientist and machine learning enthusiast