Test de l’API Insight de Yooda avec le logiciel R

Je profite de la sortie en bêta test de l’API Insight de Yooda pour faire un test avec le Logiciel R. Si vous souhaitez aussi tester l’API Insight, demandez un accès à Yooda sur cette page : Accès API en Bêta Gratuite.

Qui est Yooda / Aldeis ?

Yooda / Aldeis est une société française bien connue des référenceurs et Web Marketeurs et qui développe des outils SEO depuis 2002. Yooda propose notamment l’outil Insight qui est revendiquée comme la plus grande base de données de mots clés francophones.

Jusqu’à présent Yooda Insight était uniquement accessible via son site Web. Avec son ouverture via une API, Insight pourra maintenant s’intégrer à vos futures applications.

Logiciel R

Si vous ne l’avez pas encore fait, afin de pouvoir tester, reproduire et améliorer par vous même le code source de ce test, téléchargez Le Logiciel R sur ce site https://cran.r-project.org/, ainsi que l’environnement de développement RStudio ici : https://www.rstudio.com/products/rstudio/download/.

Que Propose l’API Insight ?

La documentation de l’API n’étant accessible que si vous avez une clé, vous trouverez ci-dessous les copies des images écrans principales qui résument les fonctionnalités de l’API.

Documentation API Insight Yooda

Comme vous pouvez le voir, l’API Insight permet d’accéder à 2 types d’informations : les informations sur un domaine et qui correspondent à l’option « Site Performance » sur le site de Yooda. Les informations par mot clé et qui correspondent à l’option « Market Explorer » sur leur site.

Yooda fournit aussi 2 outils pour gérer votre API : l’accès à votre crédit et à votre historique d’utilisation.

Docummentation Abonnnement API Insight

En revanche, ce que ne vous dit pas Yooda : c’est quelle est l’adresse de l’API et comment on construit l’URL d’interrogation 🙁 !!!! Mais bon on s’en serait douté :-).

Donc, l’API se trouve à l’adresse :
« https://api.yooda.com/ »
Et pour construire une URL d’Interrogation on suit les instructions en ajoutant les infos à l’URL de l’API. par exemple ici « https://api.yooda.com/insight/domains/yooda.com?apikey=xxxxxxxxxxxxx » retourne l’Id du domaine « yooda.com » avec « xxxxxxxxxxxxx » qui doit être renseigné par la clé d’API fournie par Yooda.

Test avec R

Dans ce test nous nous sommes posé 2 questions principales :
– Quelles sont les caractéristiques des mots clés qui concourent au trafic de « Yooda.com » ?
– Quels sont les mots clés uniques (attention pas les expressions) proches du mot clé « SEO » ?

Vous pouvez copier/coller les morceaux de codes source (sur fond vert) dans un script R pour les tester. N’oubliez pas de renseigner votre code d’API !!

Chargement des bibliothèques utiles
Les packages ne sont à installer qu’une seule fois dans votre environnement.

### Test de l'API Yooda Insight avec R
#### Chargement des bibliothèques utiles ##########################################
#Installer
#install.packages("httr") #à éxecuter une fois - déjà installé chez moi
#install.packages("jsonlite") #une fois
#install.packages("stringr") #une fois
#install.packages("ggplot2") #une fois
#install.packages("tm") #une fois
#install.packages("wordcloud") #une fois
#install.packages("RColorBrewer") #une fois
#Charger
library(httr) #package utile pour récupérer des données sur le Web.
library(jsonlite) #pcakage pour travailler avec les données au format JSON
library(stringr)  #travail de chaine de caractères par exemple ici str_replace_all()
library(ggplot2) #Package de visualisation
library(tm) #Pour le text mining
library(wordcloud) #Nuage de mots clés
library(RColorBrewer) #Palette de Couleurs
###################################################################################

Clé d’API et vérification des crédits
La clé d’API a été fournie par Yooda !

##### Votre Clé d'API
MyAPIKey <- "xxxxxxxxxxxxxxxxxxxxxxxxx"  #ICI indiquez votre clé d'API fournie par Yooda.


#Verification de mes crédits
MyApiYoodaURLCredits <- paste("https://api.yooda.com/subscriptions/credits?apikey=", MyAPIKey, sep ="")
MyApiYoodaURLCredits
responseCredits <- GET(url = MyApiYoodaURLCredits) #Attention le test de crédits mange 1 crédit :-(
httr::content(responseCredits)$content   #Affiche les crédits restants
[1] 9966053

Ouf ! il m’en reste un beau paquet !

I – On va travailler tout d’abord sur le domaine yooda.com

I-1 Récupération de l’ID du domaine yooda.com

###########################################################################################
######  I) Travail sur un Domaine
###########################################################################################
MyURL <- "yooda.com"  #Domaine étudié

##############################################
# Importation des données
##############################################

#Récupération de l'id du site
MyApiYoodaURLId <- paste("https://api.yooda.com/insight/domains/", MyURL, "?apikey=", MyAPIKey, sep ="")
MyApiYoodaURLId  #Vérification de l'url
responseURL <- GET(url = MyApiYoodaURLId)  #Appel API Yooda.
MyURLId <- httr::content(responseURL)$content$id  # Recupération de l'Id de site
MyURLId  #Verification
[1] 12840941

I-2 – Récupérations des mots clés du domaine yooda.com
à partir de l’Id du site yooda.com. On va récupérer les données dans un data.frame.

#Récupération des mots clés:  #GET /insight/domains/{domain_id}/keywords
MyApiYoodaURLKeywords  <- paste("https://api.yooda.com/insight/domains/", MyURLId, "/keywords?apikey=",  MyAPIKey, sep ="")
MyApiYoodaURLKeywords #Vérification de l'URL de l'API
responseKeywords <- GET(url = MyApiYoodaURLKeywords)  #Appel API Yooda
httr::content(responseKeywords) #Verif  
http_type(responseKeywords) #Verif type reçu
#Récupération des données à partir du format JSON de la réponse de l'API
DataKeywords  <- fromJSON(httr::content(responseKeywords, as = "text"), flatten=TRUE)$content$items_list
str(DataKeywords) #Vérifions que l'on a bien un Data Frame
'data.frame':	29 obs. of  11 variables:
 $ domain_id            : chr  "12840941" "12840941" "12840941" "12840941" ...
 $ url                  : chr  "https://www.yooda.com/" "https://www.yooda.com/" "https://www.yooda.com/" "https://www.yooda.com/submit/" ...
 $ position             : int  1 3 3 1 1 2 3 1 3 2 ...
 $ score                : chr  "69920" "22560" "4512" "1840" ...
 $ traffic              : int  699 226 45 18 15 11 8 7 5 4 ...
 $ keyword.kw_id        : chr  "6104257" "130965642" "6162822" "6162821" ...
 $ keyword.keyword      : chr  "yooda" "yooda insight" "seeurank" "yooda map" ...
 $ keyword.search_volume: int  1900 2400 480 50 40 90 90 20 50 30 ...
 $ keyword.competition  : num  0.14 0.11 0 0.03 0.13 0 0.04 0.15 0 0.05 ...
 $ keyword.cpc          : num  1.41 0.98 0 0 1.65 0 0 1.1 0 0 ...
 $ keyword.results_nb   : int  113000 6810 28600 45200 11400 43000 19500 28400 19600000 1500 ...

I-3 – Préparation des données

#################################################################
# Préparation des données
#################################################################
#### Transformation des variables pour traitements ultérieurs ####################################################################
DataKeywords$position <- as.integer(DataKeywords$position)  #Dernière position connue du site sur cette recherche dans Google.fr
DataKeywords$traffic <- as.integer(DataKeywords$traffic) #Nombre de visiteurs mensuels sur le site à partir de cette recherche
DataKeywords$keyword.search_volume <- as.integer(DataKeywords$keyword.search_volume) #Nombre de recherches mensuelles sur ce mot clé.
DataKeywords$keyword.competition <- as.double(DataKeywords$keyword.competition) #Concurrence sur l'expression
DataKeywords$keyword.cpc <- as.double(DataKeywords$keyword.cpc) #Estimation du Cout par clic sur Adwords
DataKeywords$keyword.results_nb <- as.integer(DataKeywords$keyword.results_nb)  #nb de résultats dans Google.fr

##### Profitons en pour sauvegarder les données dans une fichier à la date du jour
#peut resservir dans le futur pour voir les évolutions.
MyFileName <- paste(format(Sys.time(), "%Y-%m-%d"), "-",
                    str_replace_all(MyURL, "\\.", "-"), ".csv", sep="")
write.csv2(DataKeywords, file = MyFileName)     #Ecriture du fichier .csv avec séparateur ";"

I-4 – Exploration des données (1)
Visualisation des données récupérées, pour voir ce que l’on a d’intéressant :-).

#################################################################
# Exploration des données
#################################################################
str(DataKeywords) #Structure de DataKeywords
utils::View(DataKeywords) #pour visualiser les données sous la forme d'un tableau

Jeu de données (data.frame) DataKeywords :

Jeu de données DataKeywords

I-5 – Exploration des données (2)
Résumés statistiques des variables numériques.

#Isolons les Variables numériques pour voir ce qu'il y a dedans
DataKeywordsNum <- DataKeywords[,c(3,5,8:11)]
summary(DataKeywordsNum) #résumés statistiques des variables numériques.
    position         traffic      keyword.search_volume keyword.competition  keyword.cpc     keyword.results_nb
 Min.   : 1.000   Min.   :  0.0   Min.   :  10.0        Min.   :0.0000      Min.   :0.0000   Min.   :1.16e+03  
 1st Qu.: 1.000   1st Qu.:  1.0   1st Qu.:  10.0        1st Qu.:0.0000      1st Qu.:0.0000   1st Qu.:1.97e+04  
 Median : 3.000   Median :  4.0   Median :  10.0        Median :0.0500      Median :0.0000   Median :8.73e+04  
 Mean   : 3.138   Mean   : 36.9   Mean   : 184.8        Mean   :0.1824      Mean   :0.3466   Mean   :7.77e+06  
 3rd Qu.: 4.000   3rd Qu.:  7.0   3rd Qu.:  40.0        3rd Qu.:0.1400      3rd Qu.:0.0000   3rd Qu.:2.17e+06  
 Max.   :10.000   Max.   :699.0   Max.   :2400.0        Max.   :0.9600      Max.   :2.0800   Max.   :1.44e+08  

I-6 – Exploration des données (3)
Tests d’histogrammes

#Tests d'Histogrammes
par(mfrow=c(2,3)) #divisions de la fenêtre graphique
hist(DataKeywords$position, main = "position", breaks = 10)
hist(DataKeywords$traffic, main = "traffic", breaks = 10)
hist(DataKeywords$keyword.search_volume, main = "keyword.search_volume", breaks = 10)
hist(DataKeywords$keyword.competition, main = "keyword.competition", breaks = 10)
hist(DataKeywords$keyword.cpc, main = "keyword.cpc", breaks = 10)
hist(DataKeywords$keyword.results_nb, main = "keyword.results_nb", breaks = 10)
par(mfrow=c(1,1)) #Raz fenêtre graphique

Histogrammes DataKeywords

Alors que beaucoup de mots clés sont positionnés en 1er, un seul semble apporter un fort trafic…

I-7 – Exploration des données (4)
Tests de boites de dispersion

#tests de Boites de dispersion
par(mfrow=c(2,3)) #divisions de la fenêtre graphique
boxplot(DataKeywords$position, main = "position")
boxplot(DataKeywords$traffic, main = "traffic")
boxplot(DataKeywords$keyword.search_volume, main = "keyword.search_volume")
boxplot(DataKeywords$keyword.competition, main = "keyword.competition")
boxplot(DataKeywords$keyword.cpc, main = "keyword.cpc")
boxplot(DataKeywords$keyword.results_n, bmain = "keyword.results_nb")
par(mfrow=c(1,1)) #Raz fenêtre graphique

Boites de dispersion DataKeywords

Pas grand chose à en dire, je vous laisse vous faire votre opinion.

I-8 – Exploration des données (5)
Tests de nuages de points

#tests de nuages de points
pairs(DataKeywordsNum) #Variables numériques en nuages de points 2 à 2 - pas très lisible ici

Nuages de Points DataKeywordsNum

Pas très lisible : trop de variables.

I-9 – Exploration des données (6)
Intéressons-nous plus particulièrement au trafic des mots-clés vs les autres variables.

#Réfléchissons un peu :-)
#Je m'intéresse aux mots clés qui apportent du trafic : quelles sont leurs caractériques ???
par(mfrow=c(2,3)) #divisions de la fenêtre graphique
plot(x = DataKeywords$position , y= DataKeywords$traffic ,
     main = "Traffic vs position",
     col = "red", lwd = 1, pch = 10, cex=3) #Traffic vs position
plot(x = DataKeywords$keyword.competition , y= DataKeywords$traffic ,
     main = "Traffic vs keyword.competition",
     col = "red", lwd = 1, pch = 10, cex=3) #Traffic vs keyword.competition
plot(x = DataKeywords$keyword.cpc , y= DataKeywords$traffic ,
     main = "Traffic vs keyword.cpc",
     col = "red", lwd = 1, pch = 10, cex=3) #Traffic vs keyword.cpc
plot(x = DataKeywords$keyword.results_nb , y= DataKeywords$traffic ,
     main = "Traffic vs keyword.results_nb",
     col = "red", lwd = 1, pch = 10, cex=3) #Traffic vs keyword.results_nb
plot(x = DataKeywords$keyword.search_volume , y= DataKeywords$traffic ,
     main = "Traffic vs keyword.search_volume",
     col = "red", lwd = 1, pch = 10, cex=3) #Traffic vs keyword.search_volume
par(mfrow=c(1,1))

Nuages de points Traffic vs autres variables numériques

La forme en « trompette » du dernier graphique (Traffic vs keyword.search_volume) nous semble intéressante.

I-10 – Visualisation de données
Investiguons plus avant Traffic vs keyword.search_volume

###########################################################################
# Visualisation intéressante : Trafic en fonction du volume de recherche
###########################################################################
ggplot(DataKeywords,
       aes(
         x = keyword.search_volume ,
         y = traffic,
         col = as.factor(position), #10 positions
         size = keyword.competition
         )
       ) + geom_jitter() + #jittering pour voir les points cachés
  scale_x_log10() + #on met en log pour être plus lisible
  scale_y_log10() +
  stat_smooth(method = "lm", col = "#C42126", se = TRUE , size = 1) +
  theme_dark() +
  ggtitle("Trafic Mots clés vs Volume de Recherche - Echelle Logarithmique")

Nuage de Points Trafic vs Volume de recherche

Le trafic et le volume de recherche sont liés (c’est à priori une évidence mais c’est bien de le constater :-)). Notez que les mots clés positionnés en 1ere position pour le site Yooda.com amènent proportionnellement plus de trafic (points roses-orangés au dessus de la droite de régression linéaire) que les mots clés moins bien positionnés (ce qui n’est pas très étonnant non plus).

En revanche, la compétition sur un mot-clé n’apporte pas grand chose sur sa capacité à générer du trafic : comme quoi il y a encore des progrès à faire dans le choix des mots-clés par les annonceurs :-).

I-11 – Récupération des Indicateurs clés de Performance
On garde le même site : MyURL = « yooda.com »

#####################################################################################
#Récupération des indicateurs clés de performance on garde le même site MyURL
MyApiYoodaURLKPI  <- paste("https://api.yooda.com/insight/domains/", MyURLId, "/kpi?apikey=",  MyAPIKey, sep ="")
MyApiYoodaURLKPI
responseKPI <- GET(url = MyApiYoodaURLKPI)
httr::content(responseKPI)
http_type(responseKPI)  #verif
httr::content(responseKPI, as = "parsed" )$content #Verif
MyURLKPI <- fromJSON(httr::content(responseKPI, as = "text"), flatten=TRUE)$content #importation dans une Data Frame
MyURLKPI

$rank
[1] 180267

$traffic
[1] 1082

$kw_count
[1] 29

$pages_count
[1] 3

$competitors_count
[1] 19

II – travail sur un mot clé
l’idée ici est de faire un (beau) nuage de mots clés uniques (pas les expressions) des mots approchants notre mot clé cible :
Au hasard prenons ici « SEO » :-).

II-1 – Importation des données
on procède comme précédemment en allant cettr fois récupérer l’Id du mot clé au préalable.

###########################################################################################
######  II - Travail sur un Mot clé
MyKeyword <- "SEO"   #au hasard :-)

##############################################
# II-1 Importation des données
##############################################

#Récupération de l'id du mot clé
MyApiYoodaKeywordId <- paste("https://api.yooda.com/insight/keywords/", MyKeyword,  "?apikey=", MyAPIKey, sep ="")
MyApiYoodaKeywordId
responseKeyword <- GET(url = MyApiYoodaKeywordId)
MyKeywordId <- httr::content(responseKeyword)$content$kw_id  # Recupération de l'Id de keyword
MyKeywordId #Verif


#Liste des expressions de recherche à partir d'un mot-clé
#GET /insight/keywords/market/by/keywords/{kw_id}
MyApiYoodaKeywordList <- paste("https://api.yooda.com/insight/keywords/market/by/keywords/",  MyKeywordId, "?apikey=", MyAPIKey, sep ="")
MyApiYoodaKeywordList
responseKeywordList <- GET(url = MyApiYoodaKeywordList)
httr::content(responseKeywordList, as = "parsed")

DataKeywordList  <- fromJSON(httr::content(responseKeywordList, as = "text"), flatten=TRUE)$content$items_list
str(DataKeywordList) #Vérifions que l'on a bien un Data Frame
utils::View(DataKeywordList)

Expressions proches de SEO

II-2 – Nettoyage des données
Nous allons transformer les mots clés récupérés en un « Corpus » propre.

#################################################################
# II-2 Nettoyage des données
#################################################################
#Recupération des donnés dans une seule chaine de caractères
AllKeywords <- as.character(paste(DataKeywordList$keyword, collapse= " "))

AllKeywords <- chartr("éèëêÉÈËÊàÀçÇ", "eeeeEEEEaAcC", AllKeywords)  #on vire les accents
AllKeywords_Corpus <- Corpus(VectorSource(AllKeywords)) #Transformation en Corpus pour autres nettoyages.

####!Fonction de Nettoyage du texte du Corpus.
Clean_Corpus <- function(docs) {
# Convertir le texte en minuscule
docs <- tm_map(docs, content_transformer(tolower))
# Supprimer les nombres
docs <- tm_map(docs, removeNumbers)
# Supprimer les mots vides anglais
docs <- tm_map(docs, removeWords, stopwords("english"))
# Supprimer les mots vides français
docs <- tm_map(docs, removeWords, stopwords("french"))
# Supprimer votre propre liste de mots non désirés
docs <- tm_map(docs, removeWords, c("seo", "yooda", "seeurank"))
# Supprimer les ponctuations
docs <- tm_map(docs, removePunctuation)
# Supprimer les espaces vides supplémentaires
docs <- tm_map(docs, stripWhitespace)
#Regroupement optimisation/optimization
DoOptimization <- function(x) gsub("optimisation", "optimization", x)
docs <- tm_map(docs, content_transformer(DoOptimization))  
}
###### /Clean Corpus
AllKeywords_Corpus <- Clean_Corpus(AllKeywords_Corpus)
content(AllKeywords_Corpus) #visualisation du contenu du corpus "propre"

[1] " search engine optimization definition search engine optimization web definition definition def o definition search optimization marketing quoi search optimization signification optimization web internet search engine optimization def search engine signification web internet marketing definition marketing search veut dire web search engine optimization definition optimization francais definition search engine optimization search engine optimization definition strategie definition quoi website marketing definition search engine optimization meaning score meaning definition marketing search optimization search search engine optimization search engine optimizer web search search engine marketing search engine optimization description web search search engine optimization tools definition score definition marketing definition definition francais engine optimization search services search marketing optimization search engine optimization search engine optimization optimize search engin... 

II-3 – Préparation des données
Pour l’affichage d’un nuage de mots-clés « wordcloud » nous avons besoin d’une « data.frame » avec les fréquences pour chaque mot clé.

#################################################################
# II-3 Préparation des données au bon format  pour le Wordcloud
#################################################################
####Création de la matrice des mots et du jeu de données pour le nuage.
AllKeywords_dtm <- TermDocumentMatrix(AllKeywords_Corpus)  
AllKeywords_matrix <- as.matrix(AllKeywords_dtm) #récupération dans une matrice terms / Frequence dans Docs
str(AllKeywords_matrix) #Verif
# Sum rows
AllKeywords_frequency <- rowSums(AllKeywords_matrix) #Fréquence par mot clé.
class(AllKeywords_frequency)
#sort by frequency
AllKeywords_frequency  <- sort(AllKeywords_frequency , decreasing=TRUE)   # Tri en foncton de la fréquence.
barplot(AllKeywords_frequency[1:10],  col = "tan", las = 2)  #visualisation des principaux mots clés.
AllKeywords_df <- data.frame(word = names(AllKeywords_frequency),freq=AllKeywords_frequency) #Transformation en Data Frame.
head(AllKeywords_df ,10) #vérifions

Diagramme en barre 10 mots clés proches de SEO

II-4 – Visualisation d’un nuage de mots clés
Ici on affiche uniquement les 20 premiers mots clés en rapport avec SEO

#################################################################
# II-4 - Visualisation du nuage de mots clés.
#################################################################
set.seed(1234)  #"fixation" de la randomization.
#Afffichage du nuage de mots clés.
wordcloud(words = AllKeywords_df$word, freq = AllKeywords_df$freq, min.freq = 1,
          max.words=20, random.order=FALSE, rot.per=0.35,
          colors=brewer.pal(8, "Dark2"))


Nuage de Mots clés proches de SEO

II-5 – Indicateurs clés de performance d’un mot clé
Pour finir profitons-en pour récupérer les indicateurs clés de performance du mot clé « SEO »

#########################################################################
#II-5 Récupérer les indicateurs clés de performance d'un mot-clé
#GET /insight/keywords/{kw_id}/market/kpi
#on garde "SEO"

MyApiYoodaKeywordKPI <- paste("https://api.yooda.com/insight/keywords/",   MyKeywordId, "/market/kpi?apikey=", MyAPIKey, sep ="")
MyApiYoodaKeywordKPI
responseKeywordKPI <- GET(url = MyApiYoodaKeywordKPI)
httr::content(responseKeywordKPI)$content #Affichage

$items_count
[1] "519"

$total_search_volume
[1] "28440"

$average_cpc
[1] "0.38"

Merci pour votre attention. N’hésitez pas à faire vos remarques et suggestions d’amélioration dans les commentaires.

Pierre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *