J’ai présenté dans mon article précédent les résultats de l’analyse du mot croisillon #TelAvivSurSeine
, l’évènement au centre d’une polémique qui n’aurait jamais dû sortir des réseaux sociaux ni des cercles militants.
Ces résultats sont le fruit d’une analyse rationnelle et distanciée des tweets associés à ce hashtag, analyse à la portée d’un informaticien suffisamment à l’aise sous UNIX et familier du langage de programmation Python.
Je présenterai dans cet article les outils et techniques m’ayant permis d’effectuer cette analyse.
Le code est disponible dans mon repository GitHub.
Nous verrons comment extraire, explorer, synthétiser et visualiser de la connaissance à partir d’une importante masse d’information disponible sur Twitter. Ainsi nous verrons, entre autres, comment :
- visualiser l’évolution du nombre de tweets et retweets par heure
- identifier les comptes les plus retweetés ou mentionnés
- identifier les comptes ayant le plus tweeté ou retweeté
- comptabiliser les hashtags les plus utilisés
- identifier les photos les plus diffusées
- visualiser le réseau social constitué des 15 comptes ayant le plus (re)tweeté et des 15 comptes les plus retweetés :
Collecte des données
Vous devez évidemment disposer d’un compte Twitter. Si c’est le cas, connectez-vous sur le gestionnaire d’applications Twitter puis :
- remplissez le formulaire de création d’une application Twitter.
- cliquer sur l’onglet Keys and Access Token et générer le jeton d’accès (bouton Create my access token)
- récupérez :
- la clé de l’API (
Consumer Key
) et son mot de passe (Consumer Secret
) - le jeton d’accès (
Access Token
) et son mot de passe (Access Token Secret
)
- la clé de l’API (
Note : votre profil Twitter doit être renseigné avec un numéro de téléphone valide sans quoi il ne vous sera pas possible de créer une application.
L’utilisation de l’API Twitter est plafonnée selon des critères variables.
Vous ne pourrez par exemple pas faire plus de 15 appels à la requête GET followers/ids
par quart d’heure. Néanmoins, un seul appel restitue jusqu’à 5000 identifiants de followers.
Fort heureusement, la librairie tweepy
propose un mode (wait_on_rate_limit
) permettant au client de temporiser lorsque le quota est atteint, puis de reprendre le processus.
Par ailleurs, notez que l’API de recherche (GET search/tweets
) a une profondeur de 10 jours maximum.
Je mets à disposition un script Python implémentant la collecte des tweets, à adapter selon votre contexte et après avoir renseigné les vecteurs d’accréditation (Consumer key, Consumer secret, Access token, Access token secret).
Le mode opératoire d’installation est le suivant :
Editez le script collect.py
situé dans le répertoire datascience-twitter/scripts/collect
et renseignez les variables consumer_key
, consumer_secret
, access_token
et access_token_secret
avec les vecteurs d’accéditation créés plus haut.
Ensuite, vous pourrez lancer la commande suivante afin de collecter les tweets en relation avec le hashtag #TelAvivSurSeine
et dumper les résultats dans le répertoire ./data
:
Quelques préliminaires
Structure d’un tweet
Avant d’explorer les données, il est important de connaître la structure d’un tweet restitué par l’API Twitter. Elle est pleinement décrite sur le portail de dev de Twitter.
Pour vous donner une idée, voici un lien contenant un exemple complet de tweet au format JSON.
On trouvera ci-dessous une représentation très élaguée d’un tweet, ne contenant que les propriétés que nous exploiterons dans le cadre de cet article :
Voici une description des principaux champs :
.text
: contenu du texte associé au tweet.created_at
: date et heure UTC de création du tweet (ou retweet).source
: support utilisé (terminal Android dans l’exemple).entities.hashtags
: liste des mots croisillons contenu dans le tweet.entities.user_mentions
: liste des comptes mentionnés dans le tweet.media
: liste des ressources médias contenues dans le tweet (des images par exemple).user.screen_name
: nom du compte ayant tweeté (ce qui suit après le caractère@
).user.followers_count
: nombre d’abonnés à ce compte.user.friends_count
: nombre de comptes suivis.retweeted_status
: contenu du tweet à l’origine du retweet.quoted_status
: contenu du tweet à l’origine de la citation
Outils
J’ai une affinité particulière pour les outils en ligne de commande. Je vous recommande les suivants :
jq
est un extraordinaire outil permettant de requêter des structures de données au format JSON. C’est un authentique couteau suisse absolument indispensable pour quiconque exploite des données sous ce format (c’est à dire, tout le monde…).
Bien qu’installable viapip
, je vous conseille d’installer directement la version binaire pour votre plateforme 64 bits. A ce jour, la version 1.5 est disponible sous Linux, OS X, Windows ou d’autres plateformes
Je trouve que cet outil permet de mieux sentir les données. Par ailleurs, il peut être très efficacement associés à d’autres commandes Unix (wc
,sort
,sed
,awk
,join
etc.) jusqu’à obtenir le résultat final.gnuplot
est un logiciel multiplateforme produisant des représentations graphiques de données en 2D ou 3Dcsvlook
est un utilitaire permettant de formater proprement les données sous la forme de tableaux. Il est intégré au module Python csvkit dont le mode opératoire d’installation est des plus simples :pip install csvkit
Note : vérifier les prérequis d’installation en particulier sous Ubuntu
Exploration des données
Note : si vous souhaitez faire l’économie de la collecte des données et vous adonner directement à leur exploration, je mets à disposition un échantillon de données brutes (toute la journée du 10 Août 2015).
Pour récupérer le jeu de données :
Visualisation
Produisons le fichier courbe_tweets.csv
(séparateur ,
) contenant la série temporelle du nombre de tweets par tranche horaire :
Note : notez que l’heure UTC de création des tweets est convertie en heure locale
Une fois le fichier généré, produisons sa représentation graphique avec gnuplot
:
Autre exemple. Produisons le fichier devices.csv
contenant la distribution des tweets par device
:
La représentation graphique de la distribution sous la forme d’histogrammes est obtenue comme suit :
Eléments statistiques
Les commandes ci-dessous permettent d’obtenir différents indicateurs statistiques sur l’ensemble du jeu de données.
On verra dans le paragraphe suivant comment obtenir ces mêmes indicateurs sur une plage de temps restreinte :
- comptabiliser le nombre total de tweets :
- comptabiliser le nombre total de twittos (utilisateurs de Twitter) :
- extraire les 5 photos les plus diffusées, avec leur nombre d’occurrences :
- extraire les 4 types de clients Twitter les plus utilisés :
- extraire les 3 comptes les plus retweetés (c’est un indicateur d’influence) avec le nombre de RT :
- extraire les 3 comptes les plus cités (équivalent au retweet mais moins usité) avec le nombre de citations :
- extraire les 3 comptes les plus mentionnés (c’est un indicateur de notoriété) avec le nombre de mentions :
- dégager les 20 sentiments dominants en comptabilisant le nombre de hashtags :
Filtrer par date
Utilisons le sélecteur select
/match
supporté par jq
pour filtrer sur la date de création du tweet created_at
.
Ainsi, la commande suivante permet d’identifier les 3 comptes les plus retweetés le 10 Août entre 18h et 19h59 (soit entre 16h et 18h50 heure UTC) :
Formatage des résultats avec csvlook
Voyons comment afficher les 5 comptes les plus influents (i.e les plus retweetés) sous la forme d’un tableau à 3 colonnes : le nombre de RT, le nom du compte (.user.screen_name
) et la date de création du compte (.user.created_at
).
On utilisera un shell imbriqué à 2 commandes :
Magique ? Pas tant que ça. Décomposons la commande :
echo "Nb RT,Compte,Date Creation"
: affiche l’entête du tableaujq --raw-output 'select(.retweeted_status!=null)|[.retweeted_status.user.screen_name,.retweeted_status.user.created_at] | @csv' data/*.json
:- filtre les éléments en ne retenant que ceux ayant une propriété
retweeted_status
non nulle - puis affiche les valeurs
screen_name
etcreated_at
- puis formate la sortie standard en CSV
- filtre les éléments en ne retenant que ceux ayant une propriété
sort | uniq -c
: tri et comptage du nombre d’occurrences (nombre de RT)sort -k1rn
: le flag-k1
signifie que le tri s’effectue sur la première colonne (le nombre de RT)
Plus de statistiques
Je mets à disposition un script shell implémentant plusieurs routines suffisamment génériques pour s’adonner à tous types d’explorations de données.
La liste des routines implémentées s’obtient en exécutant la commande : ./compute.sh
.
Pour obtenir la liste des 5 comptes les plus mentionnés sur toute la période :
Pour obtenir la liste des 3 comptes les plus retweetés le 10 Août entre 18h et 19h59 heure de Paris :
Visualiser un réseau social
Je mets à disposition un script Python reconstituant le réseau de relations entre plusieurs utilisateurs Twitter.
Si vous avez bien suivi, vous ne devriez avoir aucun mal à produire un fichier contenant les 15 comptes les plus retweetés et les 15 comptes ayant le plus tweeté.
Sinon, vous pouvez utiliser mes routines :
Reconstituons le réseau de relations entre ces utilisateurs :
Puis générons le réseau de relations :
Pour visualiser le réseau de relation, lancer la commande suivante :
Pour visualiser le résultat, ouvrir un navigateur et consulter le lien http://localhost:8000
:
Le graphe orienté est généré à l’aide de l’excellente librairie D3 pour laquelle j’ai consacré un article il y a 3 ans.
Les cercles représentent les comptes. Leur taille est proportionnelle à leur nombre d’abonnés.
Il s’agit d’une version très expérimentale bien sûr, mais je trouve remarquable la formation de 2 groupes distincts de tweetos dont l’un concentre les tweets défavorables à l’évènement.
Par ailleurs, on visualise bien les signes révélateurs d’astroturfing.