Searching...
lunes, 16 de abril de 2018

Análisis y visualización básica de estadísticas de tweets con Python

Voy a realizar un análisis estadístico básico de la cuenta de tweeter @realDonaldTrump de cara a un posterior análisis de sentimientos (interesante, ¿no?). Primero quiero calcular algunos datos estadísticos básicos, como la media de la longitud de los caracteres de todos los tweets, el tweet con más “me gusta” y el más retuiteado, etc.
Este artículo está basado en un artículo anterior donde ya extraje los datos de los tweets y los organice de una manera fácil de gestionar. Recuerda que en el anterior artículo use la cuenta @machinelearnbot para los ejemplos, pero en este artículo la he sustituido por la cuenta @realDonaldTrump para realizar un ejemplo más significativo de cara al análisis de sentimientos que quiero demostrar.

Puedes descargarte el código en el repositorio GitHub que he creado para esta publicación.

A partir de ahora, solo añadiré un código de entrada y la salida justo debajo del código.

Para obtener la media, usando numpy:

# Sacamos la media de las longitudes:
mean = np.mean(data['longitud'])

print("La longitud media de los tweets: {}".format(mean))
La longitud media de los tweets: 126.01

Para calcular el tweet que más ha gustado y el más retuiteado usaremos algunas funcionalidades de pandas:

# Sacamos el tweet con más "Me gusta" y el más retuiteado:
fav_max = np.max(data['Likes'])
rt_max  = np.max(data['RTs'])

fav = data[data.Likes == fav_max].index[0]
rt  = data[data.RTs == rt_max].index[0]

# Tweet que más ha gustado:
print("El tweet con más <Me gusta> es: \n{}".format(data['Tweets'][fav]))
print("Número de <Me gusta>: {}".format(fav_max))
print("{} caracteres.\n".format(data['longitud'][fav]))

# Tweet más retuiteado:
print("El tweet más retuiteado es: \n{}".format(data['Tweets'][rt]))
print("Número de retweets: {}".format(rt_max))
print("{} caracteres.\n".format(data['longitud'][rt]))

El tweet con más <Me gusta> es: 
Crazy Joe Biden is trying to act like a tough guy. Actually, he is weak, both mentally and physically, and yet he t… https://t.co/4e33ZxnAw7
Número de <Me gusta>: 257953
140 caracteres.

El tweet más retuiteado es: 
Crazy Joe Biden is trying to act like a tough guy. Actually, he is weak, both mentally and physically, and yet he t… https://t.co/4e33ZxnAw7
Número de retweets: 75540
140 caracteres.




Es común que el tweet con más “me gusta” sea el tweet más retuiteado, pero no tiene que cumplirse esto necesariamente. Lo que estoy haciendo es encontrar la cantidad máxima de “me gusta” en la columna "Likes" y la cantidad máxima de retweets en la columna "RTs" usando la función max de numpy. Con esto buscamos el índice de cada una de las dos columnas que satisfaga ser el máximo. Como más de uno puede tener la misma cantidad de me gusta/retweets (el máximo) solo necesitamos coger el primero encontrado, y es por eso que usamos .index [0] para asignar el índice a las variables fav y rt. Para imprimir el tweet que satisface, accedemos a los datos de la misma forma que accederíamos a una matriz o cualquier objeto indexado.

Ahora ya podemos visualizar algunas cosas. :)

Pandas tiene su propio objeto para series temporales. Como tenemos un vector completo con fechas de creación, podemos construir series temporales con respecto a las longitudes de tweets, “me gusta” y retweets.

Lo hacemos de la siguiente forma:

# Creamos las series temporales de datos de los tweets:

tlen = pd.Series(data=data['longitud'].values, index=data['Fecha'])
tfav = pd.Series(data=data['Likes'].values, index=data['Fecha'])
tret = pd.Series(data=data['RTs'].values, index=data['Fecha'])

Y si queremos visualizar las series temporales, pandas ya dispone de su propio método. Podemos representar una serie temporal de la siguiente manera:

# Variación de las longitudes de tweets con el tiempo:
tlen.plot(figsize=(16,4), color='r');

Esto crea la salida siguiente:

Y para visualizar los “Me gusta” versus los retweets en el mismo gráfico:

# Visualización de Me gusta vs Retuits:

tfav.plot(figsize=(16,4), label="Me gusta", legend=True)
tret.plot(figsize=(16,4), label="Retuits", legend=True);

Esto crea la salida siguiente:

Ahora voy a visualizar las fuentes en un gráfico de tarta, ya que me he dado cuenta de que lo normal es que no todos los tweets sean tuiteados desde la misma fuente (😱🤔). Primero limpio todas las fuentes:

# Obtener todas las fuentes posibles:
fuentes = []
for fuente in data['Fuente']:
    if fuente not in fuentes:
        fuentes.append(fuente)

# Imprimir la lista de fuentes:
print("Creación de fuentes de contenido:")
for fuente in fuentes:
    print("* {}".format(fuente))

Con el siguiente resultado, nos damos cuenta de que, básicamente, esta cuenta de Twitter tiene cuatro fuentes:

Creación de fuentes de contenido:
* Twitter for iPhone
* Media Studio
* Twitter Web Client
* Twitter for iPad

Ahora contamos el número de cada fuente y creamos un gráfico de tarta. Observa que esta celda de código no es la más optimizada ... Ten en cuenta que eran las 2 de la mañana cuando estaba diseñando este programa. ¡Un poquito de por favor!! 😅

# Creamos un vector numpy mapeado a las etiquetas:
percent = np.zeros(len(fuentes))

for fuente in data['Fuente']:
    for indice in range(len(fuentes)):
        if fuente == fuentes[indice]:
            percent[indice] += 1
            pass

percent /= 100

# Gráfico de tarta:
tarta = pd.Series(percent, index=fuentes, name='Fuentes')
tarta.plot.pie(fontsize=11, autopct='%.2f', figsize=(6, 6));


Con esto obtenemos un resultado como este:

Y podemos ver el porcentaje de tweets por fuente. Como se puede ver, en este caso se ha tuiteado a través del iPhone en un 95,5% de los casos.

En el siguiente post continuaré con este caso de uso y haré un análisis de sentimiento sobre esta cuenta de Twitter. 

¡No te lo pierdas! ;)

0 comentarios:

Publicar un comentario

Gracias por participar en esta página.

 
Back to top!