Bonjour à tous,

Nous allons voir aujourd’hui comment analyser des tweets (= messages postés sur Twitter) avec R !

Pour cela, nous allons par exemple récupérer les tweets publiés hier et qui parlent de “facebook”.


1/ Première étape :

Il faut au préalable disposer soi-même d’un compte Twitter et le configurer afin que des applications tierces (ici R) puissent y accéder.

Pour cela, il faut donc commencer par se créer un compte Twitter si vous n’en avez pas. Puis se rendre sur le site https://apps.twitter.com et s’enregistrer avec son compte Twitter.
Ensuite, il faut cliquer sur le bouton “Create New App”. Il va vous falloir remplir les champs “Name”, “Description” et “Website” comme suit :

  • “Name” : doit être unique (il vous faudra donc peut-être en tester plusieurs),
  • “Description” : doit contenir au moins 10 caractères,
  • “Website” : si vous n’avez pas de site web personnel, vous pouvez mettre à peu près n’importe quoi, ce n’est pas grave.


newapp

Il suffit alors de cocher la case pour valider le “Twitter Developer Agreement”, de cliquer sur “Create your Twitter Application”, et c’est bon !
Vous arrivez alors sur la page de votre application et il vous faudra cliquer sur “Keys and Access Tokens” pour récupérer les informations suivantes :

  • Consumer Key,
  • Consumer Secret,
  • Access Token,
  • Access Token Secret.

NB : Cette opération n’est à effectuer que la toute première fois afin de récupérer les clés d’accès à l’API Twitter depuis R.


2/ Ensuite on se connecte à Twitter depuis R :

library(twitteR)  
# si le package n'est pas déjà installé, il faut le faire au préalable, 
# avec la commande suivante: install.packages("twitteR", dependencies = TRUE)

setup_twitter_oauth(consumer_key = "XXX", 
                    consumer_secret = "XXX", 
                    access_token = "XXX", 
                    access_secret = "XXX")

C’est ici qu’il faut indiquer (à la place de “XXX”) les identifiants récupérés à l’étape précédente.


3/ Et on extrait les tweets souhaités :

tweets <- searchTwitter("facebook", n = 1000, lang = "fr", resultType = "mixed", since = "2016-09-14")

tweets_df <- twListToDF(tweets) # cette fonction va permettre de transformer la liste de tweets extraite en un "dataframe"
 

On a limité la recherche à 1000 tweets afin que ça ne soit pas “trop lourd” mais il est possible d’en extraire plus.
Le paramètre “resultType” peut prendre les 3 valeurs suivantes : * “popular” : pour extraire les tweets les plus populaires, * “recent” : pour extraire les tweets les plus récents, * “mixed” : pour extraire un mix entre les tweets les plus populaires et les tweets les plus récents.

On peut ensuite, par exemple, stocker ces tweets dans un fichier CSV :

write.csv2(tweets_df, file = "tweets.csv", row.names = FALSE)


Extrait :

extrait_tweets


4/ On va à présent retravailler un peu le texte de ces tweets afin de pouvoir les représenter dans un nuage de mots (ou "wordcloud") :

library(stringi)

tweets_text <- stri_trans_general(tweets_df$text, "lower") # on va ici mettre tous les mots en minuscules

# on crée ci-dessous une fonction R qui va nous permettre de faire un peu de nettoyage de nos données : 
# suppression des liens web et d'une liste de certains mots (contenue dans "mots")

myCleaningFunction <- function(x, mots) {
  
  s <- x
  
  s <- gsub("(https://[^\\s]+)", "", s, perl = TRUE)
  s <- gsub("(http://[^\\s]+)", "", s, perl = TRUE)
  
  for(k in 1:length(mots)) {
    
    s <- gsub(mots[k], "", s, perl = TRUE)
    
  }
  
  return(s)
  
}

mots_supp <- c("facebook", "via", "c'est", "plus", "tous") # vecteur de mots à supprimer

tweets_text <- sapply(tweets_text, myCleaningFunction, mots_supp)
names(tweets_text) <- NULL

# le package "tm" propose un certain nombre de fonctions intéressantes pour le retravail de données textuelles

library(tm)

tweets_corpus <- Corpus(VectorSource(tweets_text))

tweets_corpus <- tm_map(tweets_corpus, removePunctuation) # ici cela va supprimer automatiquement tous les caractères de ponctuation
tweets_corpus <- tm_map(tweets_corpus, removeWords, stopwords("fr")) # ici cela va supprimer automatiquement une bonne partie des mots français "basiques", tels que "le", "la", etc. mais il en manque ! Il manque par exemple "les"...
tweets_corpus <- tm_map(tweets_corpus, stripWhitespace) # ici cela va supprimer automatiquement tous les espaces vides
 


On peut ensuite construire la matrice des fréquences :

dtm <- TermDocumentMatrix(tweets_corpus)
m <- as.matrix(dtm)
v <- sort(rowSums(m), decreasing = TRUE)
d <- data.frame(word = names(v),freq = v)

head(d, 10) 
barplot(d[1:10,]$freq, las = 2, names.arg = d[1:10,]$word,
        col ="lightblue", main ="Mots les plus fréquents",
        ylab = "Fréquences")

barplot_words


5/ Et voici la représentation graphique ainsi obtenue :

library(wordcloud)

set.seed(123456)
wordcloud(text_corpus, max.words = 20, colors = brewer.pal(8, "Dark2"))

wordcloud1

NB : On a ici fait appel au package “RColorBrewer” (chargé par défaut avec “wordcloud”) afin de définir une palette de couleurs pour notre wordcloud. Pour plus d’infos sur les palettes disponibles dans ce package, voir par exemple ici.


Voilà, maintenant que vous avez vu les bases, il n’y a plus qu’à s’amuser à récolter les tweets sur différents sujets qui vous intéressent ou bien tous les tweets postés par une personne en particulier, à vous de voir ! Pour cela vous pouvez retrouver le code et les données utilisés ici sur notre github.
> En tout cas, n’hésitez pas à nous partager vos analyses et jolis wordcloud en commentaires ;)

Et enfin, si vous voulez en apprendre plus sur la programmation avec R, n’hésitez pas à nous contacter pour suivre une de nos formations.

Bonne journée à tous !

Partager