Se busca hacer clustering con los atributos numéricos asociados a cada cuenta con el objetivo de observar si existen clases naturales en los datos. Para esto, se crea una nueva tabla con los atributos que serán usados.
Se cargan los datos de los 3 millones de tweets, descartando atributos redundantes.
import pandas as pd
columns = [i for i in range(21)]
for i in [20, 19, 16, 15, 12, 0]:
columns.pop(i)
data = pd.read_csv('../datos/IRAhandle_tweets_1.csv', usecols = columns)
for i in range(2, 14):
data = data.append(pd.read_csv('../datos/IRAhandle_tweets_{}.csv'.format(i), usecols = columns))
Algunos lenguajes tienen mayoritariamente tweets mal clasificados, como se detalla en los comentarios del código. Además, entre estos lenguajes que entregan poca confiabilidad, existen datos que han de ser limpiados por otras razones (ej: outliers). Es decir, tras realizar este filtrado, no es necesario limpiar mas los datos.
data_languages = data.loc[(data['language'] == "English") |
(data['language'] == "Russian") |
(data['language'] == "German" ) |
(data['language'] == "Italian") |
(data['language'] == "French" ) |
(data['language'] == "Japanese") |
(data['language'] == "Portuguese") |
(data['language'] == "Macedonian") |
(data['language'] == "Serbian") |
(data['language'] == "Ukrainian") |
(data['language'] == "Uzbek")] # No usar booleanos de python
#Legítimos
# Inglés, Ruso, Alemán, Italiano, Francés, Japonés, Portugués
# Macedonio (Ruso?), Serbio (Ruso?), Ucraniano (Ruso?), Uzbek (Ruso?)
# (?) Indefinido(links y hashtags)
#Descartables
# Filipino: 238 tweets, en su mayoría en inglés y sobre Kanye West.
# Estonio: 770 tweets, en varios idiomas.
# Catalán: 589 tweets, en varios idiomas.
# Vietnamita: 982 tweets, en su mayoría en inglés.
# Pushto: 487 tweets, en su mayoría en inglés con algunos en árabe. Parece detectar la palabra sweet.
# Albano: 572 tweets, en su mayoría en inglés. Parece detectar la palabra shit.
# Croata: 572 tweets, en inglés y otros idiomas. Parece detectar la palabra Obama.
# Somalí: 276 tweets, en su mayoría en inglés.
# Persa: 1684 tweets, en varios idiomas. Parece detectar las palabras Kardashian y hashtag.
# Noruego: 2237 tweets, en su mayoría en inglés.
# Rumano: 1629 tweets, en su mayoría en inglés.
#Cuestionables (Contienen una mezcla del idioma predicho y de otros)
# Sueco, Árabe, Holandés, Español
data_languages.shape
Se crea una tabla con el mínimo y máximo de seguidores, número de gente a la que sigue y acciones sobre la cuenta por cada cuenta
ops = ['max', 'min']
account_numbers = data_languages[['author',
'followers',
'following',
'updates',
'publish_date']].groupby('author').agg(ops)
account_numbers.head()
Se añaden columnas con la diferencia de los valores.
for attr in ['followers', 'following', 'updates']:# 'publish_date']:
account_numbers['{}_max'.format(attr)] = account_numbers[attr]['max']
account_numbers['{}_min'.format(attr)] = account_numbers[attr]['min']
account_numbers['diff_{}'.format(attr)] = account_numbers[attr]['max'] - account_numbers[attr]['min']
del account_numbers[attr]
attr = 'publish_date'
col = account_numbers[attr]
frmt = "%m/%d/%Y %H:%M"
account_numbers['diff_publish_date'] = pd.to_datetime(col['max'], format=frmt) - pd.to_datetime(col['min'], format=frmt)
del account_numbers[attr]
Se obtiene la diferencia en dias de tiempo entre los tweets.
import numpy as np
account_numbers['diff_publish_date'] = account_numbers['diff_publish_date']/np.timedelta64(1,'D')
account_numbers['diff_publish_date'] = abs(account_numbers['diff_publish_date'])
Se crean columnas con la diferencia de followers, following y updates por dia.
acc_numbers_2 = account_numbers.loc[account_numbers['diff_publish_date'] != 0]
for attr in ['followers', 'following', 'updates']:
acc_numbers_2['{}_day'.format(attr)] = acc_numbers_2['diff_{}'.format(attr)] / acc_numbers_2['diff_publish_date']
acc_numbers_2.head()
Se guarda la tabla
col_names=['followers_max', 'followers_min', 'diff_followers',
'following_max', 'following_min', 'diff_following',
'updates_max', 'updates_min', 'diff_updates',
'diff_publish_date',
'followers_day', 'following_day', 'updates_day']
acc_numbers_2.to_csv("datos_numericos_cuentas.csv", header=col_names)