Partager la publication "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.
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.
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 dans un script R pour les tester. N’oubliez pas de renseigner votre code d’API !!
Vous pouvez aussi télécharger l’ensemble du script gratuitement à partir de notre boutique : https://www.anakeyn.com/boutique/produit/script-r-test-de-lapi-insight-de-yooda/
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 :
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
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
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
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))
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")
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 cette 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)
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
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"))
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 »
Retrouvez un autre exemple de l’utilisation de l’API Yooda Insight dans notre série d’articles sur la recherche de facteurs SEO avec le Machine Learning.
Merci pour votre attention. N’hésitez pas à faire vos remarques et suggestions d’amélioration dans les commentaires.
Pierre