R est très pratique pour le traitement de données, nous allons voir un premier exemple de manipulation de données. Dans cet article nous verrons comment charger, filtrer et croiser des données.
C’est parti, on attaque le côté pratique : le but de cet article est de vous montrer un exemple de ce qu’on peut faire pour travailler son SEO avec R.
Nous allons chercher à identifier les mots clés à optimiser en priorité pour le site http://www.jaime-jardiner.com/.
L’analyse
Nous allons partir d’un suivi de position réalisé avec semrush afin de déterminer l’impact d’un gain de position éventuel sur ces mots clés : c’est la technique du potentiel immédiat
L’objectif est donc de générer une liste des mots clés sur lesquels le gain de position serait le plus profitable en terme de trafic.
Cette liste permettra d’identifier les pages à optimiser en priorité.
Charger les librairies
Les librairies sont une des choses que j’apprécie énormément sur R : elles sont nombreuses utiles et gratuites.
Si je devais en choisir une ce serait DPLYR car elle permet de manipuler les données de la même manière que sur une base de données relationnelle.
A la différence près qu’on peut directement manipuler des fichiers, ce qui évite de devoir créer des tables et des relations.
[pastacode lang= »java » manual= »library(%22dplyr%22) » message= » » highlight= » » provider= »manual »/]
Charger les données issues de Semrush
Nous allons commencer par charger les données dans un dataframe.
[pastacode lang= »java » manual= »%23%20Je%20charge%20le%20fichier%20de%20suivi%20de%20positions%0Akeywords%20%3C-%20read.csv(file%3D%22C%3A%2FUsers%2Fgreg%2FDocuments%2Fdata%2Fjaime%20jardiner%2Fjaime-jardiner.com-domain_organic-fr.csv%22%2C%20header%3DTRUE%2C%20sep%3D%22%3B%22%2Cencoding%20%3D%20%22UTF-8%22)%0A%0A%23%20Je%20garde%20les%20colonnes%20qui%20m’int%C3%A9ressent%20%0Akeywords%20%3C-%20keywords%5B%2Cc(1%2C2%2C4)%5D%0A%0A%23%20Je%20renomme%20les%20colonnes%0Acolnames(keywords)%20%3D%20c(%22keyword%22%2C%22position%22%2C%22searchvolume%22)%0A » message= » » highlight= » » provider= »manual »/]
- Le chargement d’un fichier s’effectue avec la fonction read.csv. Elle possède plusieurs paramètres permettant de définir le format de fichier, l’encodage, les lignes à omettre,…
- Ensuite on filtre les colonnes qui nous intéressent en spécifiant les numéros des colonnes à conserver
- La fonction colnames permet de renommer les colonnes
Nettoyer les données
- Nous allons retirer les mots clés contenant la marque
- Nous allons également filtrer les mots clés pour ne conserver que ceux qui figurent dans les 15 premiers résultats Google
[pastacode lang= »java » manual= »%23%20Je%20retire%20les%20requ%C3%AAtes%20marque%0Akeywords%20%3C-%20filter(keywords%2C!grepl(%22aime%22%2Ckeywords%24keyword))%0A%0A%23%20Je%20filtre%20sur%20les%20expressions%20sous%20la%2015%C3%A8me%20position%0Akeywords%20%3C-%20filter(keywords%2Ckeywords%24position%20%3C%3D15)%0A » message= » » highlight= » » provider= »manual »/]
- La fonction filter permet de filtrer les données, soit avec des conditions, soit avec des expressions régulières lorsqu’elle est appelée avec la fonction grepl
Estimer le trafic
Nous allons charger un fichier dans lequel j’ai spécifié le CTR associé à chaque position et nous appliqueront ce CTR pour chaque mot clé pour déterminer le trafic qu’il peut apporter
[pastacode lang= »java » manual= »%23%20Je%20charge%20mon%20fichier%20de%20CTR%0Actr%20%3C-%20read.csv(file%3D%22C%3A%2FUsers%2Fgreg%2FDocuments%2Fdata%2FCTR.txt%22%2C%20header%3DTRUE%2C%20sep%3D%22%5Ct%22%2Cencoding%20%3D%20%22UTF-8%22)%0A%0A%23%20J’estime%20le%20trafic%0Atrafic%20%3C-%20inner_join(keywords%2Cctr%2C%20by%3D%22position%22)%0A%0Atrafic%24trafic%20%3C-%20trafic%24searchvolume%20*%20trafic%24ctr%20%0A » message= » » highlight= » » provider= »manual »/]
- Ce coup çi j’ai chargé un fichier qui avait une tabulation comme séparateur
- La fonction inner_join me permet de faire une jointure (bref de croiser) mes 2 fichiers.
- Le paramètre by= me permet de spécifier le ou les champs à croiser
- Je crée un nouveau champ qui correspond à la multiplication du volume et du CTR
Définir les mots clés à potentiel
Ici nous allons simuler un gain de 2 positions.
D’abord, je fais gagner une position à toutes les requêtes situées en 2ème position. Puis j’en fais gagner 2 aux autres mots clés.
Enfin je regroupe les 2 fichiers
[pastacode lang= »java » manual= »potentiel%20%3C-%20keywords%0A%0A%23%20Je%20simule%20un%20gain%20de%20position%0A%0ApotentielP2%20%3C-%20filter(potentiel%2C%20potentiel%24position%20%3D%3D%202)%0ApotentielP2%24position%20%3C-%20potentielP2%24position%20-1%0A%0ApotentielAutre%20%3C-%20filter(potentiel%2C%20potentiel%24position%20%3E%202)%0ApotentielAutre%24position%20%3C-%20potentielAutre%24position%20-2%0A%0A%23%20Je%20regroupe%20mes%20fichiers%0Apotentiel%20%3C-%20rbind(potentielP2%2CpotentielAutre)%0A » message= » » highlight= » » provider= »manual »/]
- La fonction Rbind permet de regrouper 2 dataFrames contenant les mêmes colonnes
Estimer le trafic potentiel
Même exercice que tout à l’heure.
[pastacode lang= »java » manual= »%23%20Je%20calcule%20le%20trafic%20potentiel%0AtraficPotentiel%20%3C-%20inner_join(potentiel%2Cctr%2C%20by%3D%22position%22)%0A%0AtraficPotentiel%24trafic%20%3C-%20traficPotentiel%24searchvolume*%20traficPotentiel%24ctr%20%0A » message= » » highlight= » » provider= »manual »/]
Identifier les mots clés à potentiel
Il ne me reste qu’à croiser mes 2 dataFrames et à calculer le gain de trafic pour chaque mot clé.
[pastacode lang= »markup » manual= »%23%20Je%20calcule%20les%20top%20mots%20cl%C3%A9s%20%C3%A0%20optimiser%0Atop%20%3C-%20inner_join(trafic%2CtraficPotentiel%2Cby%3D%22keyword%22)%0Atop%24delta%20%3C-%20top%24trafic.y%20-%20top%24trafic.x%20%0A%0Atop%20%3C-%20arrange(top%2C%20desc(delta)) » message= » » highlight= » » provider= »manual »/]
- arrange me permet de trier les données
Résultats
Voici le top 5 des mots clés sur lesquels un gain de 2 positions apporterait le plus de trafic.
Conclusion
Cette analyse est surtout un prétexte pour vous montrer qu’avec quelques commandes, on peut faire beaucoup de choses.
Certes Excel permettrait de faire à peu près la même chose.
Mais :
- R permet de faire cette analyse sur une bas d’un million de mots clés. Là ou Excel risque de tousser un peu.
- Si vous voulez relancer ce traitement sur un autre site ou dans 6 mois, il vous suffit de modifier une ligne de ce script
Et puis ce n’est qu’un point de départ…
On pourrait ensuite optimiser ce script pour crawler les pages d’attérissage pour s’assurer que :
- Ces pages ne sont pas trop profondes
- Ces mots clés sont bien présents en H1 et Title
- La sémantique de la page est optimale
- ….
Le script complet
[pastacode lang= »java » manual= »%0Alibrary(%22dplyr%22)%0A%0A%0A%23%20Je%20charge%20le%20fichier%20de%20suivi%20de%20positions%0Akeywords%20%3C-%20read.csv(file%3D%22C%3A%2FUsers%2Fgreg%2FDocuments%2Fdata%2Fjaime%20jardiner%2Fjaime-jardiner.com-domain_organic-fr.csv%22%2C%20header%3DTRUE%2C%20sep%3D%22%3B%22%2Cencoding%20%3D%20%22UTF-8%22)%0A%0A%23%20Je%20garde%20les%20colonnes%20qui%20m’int%C3%A9ressent%20%0Akeywords%20%3C-%20keywords%5B%2Cc(1%2C2%2C4)%5D%0A%0A%23%20Je%20renomme%20les%20colonnes%0Acolnames(keywords)%20%3D%20c(%22keyword%22%2C%22position%22%2C%22searchvolume%22)%0A%0A%23%20Je%20retire%20les%20requ%C3%AAtes%20marque%0Akeywords%20%3C-%20filter(keywords%2C!grepl(%22aime%22%2Ckeywords%24keyword))%0A%0A%23%20Je%20filtre%20sur%20les%20expressions%20sous%20la%2015%C3%A8me%20position%0Akeywords%20%3C-%20filter(keywords%2Ckeywords%24position%20%3C%3D15)%0A%0A%23%20Je%20charge%20mon%20fichier%20de%20CTR%0Actr%20%3C-%20read.csv(file%3D%22C%3A%2FUsers%2Fgreg%2FDocuments%2Fdata%2FCTR.txt%22%2C%20header%3DTRUE%2C%20sep%3D%22%5Ct%22%2Cencoding%20%3D%20%22UTF-8%22)%0A%0A%23%20J’estime%20le%20trafic%0Atrafic%20%3C-%20inner_join(keywords%2Cctr%2C%20by%3D%22position%22)%0A%0Atrafic%24trafic%20%3C-%20trafic%24searchvolume%20*%20trafic%24ctr%20%0A%0Apotentiel%20%3C-%20keywords%0A%0A%23%20Je%20simule%20un%20gain%20de%20position%0A%0ApotentielP2%20%3C-%20filter(potentiel%2C%20potentiel%24position%20%3D%3D%202)%0ApotentielP2%24position%20%3C-%20potentielP2%24position%20-1%0A%0ApotentielAutre%20%3C-%20filter(potentiel%2C%20potentiel%24position%20%3E%202)%0ApotentielAutre%24position%20%3C-%20potentielAutre%24position%20-2%0A%0A%23%20Je%20regroupe%20mes%20fichiers%0Apotentiel%20%3C-%20rbind(potentielP2%2CpotentielAutre)%0A%0A%0A%23%20Je%20calcule%20le%20trafic%20potentiel%0AtraficPotentiel%20%3C-%20inner_join(potentiel%2Cctr%2C%20by%3D%22position%22)%0A%0AtraficPotentiel%24trafic%20%3C-%20traficPotentiel%24searchvolume*%20traficPotentiel%24ctr%20%0A%0A%23%20Je%20calcule%20les%20top%20mots%20cl%C3%A9s%20%C3%A0%20optimiser%0Atop%20%3C-%20inner_join(trafic%2CtraficPotentiel%2Cby%3D%22keyword%22)%0Atop%24delta%20%3C-%20top%24trafic.y%20-%20top%24trafic.x%20%0A%0A%23Je%20trie%20les%20donn%C3%A9es%0Atop%20%3C-%20arrange(top%2C%20desc(delta))%0A » message= » » highlight= » » provider= »manual »/]
8 commentaires
Vincent Jamin · 12/04/2017 à 09:17
Bravo !! Je vais me mettre à R au plus vite, vu le besoin de traitement données énorme que j’ai à accomplir en permanence.
greg · 12/04/2017 à 11:12
Merci
Je pense que tu ne le regretteras pas
Maxime · 13/04/2017 à 12:25
Merci pour ce nouveau tuto.
Une fois de plus très intéressant comme base de travail.
Impatient de voir les suivants 🙂
znati · 12/06/2017 à 11:39
Un grand merci 🙂
Etienne · 23/05/2018 à 09:51
hello,
que contient ton fichier « CTR.txt » concrètement ? Et d’ou vient la data ? Search Console ?
merci
greg · 23/05/2018 à 11:14
Hello,
Oui ça vient essentiellement de la search console. Ca n’est pas 100% fiable mais peu importe puis que tous les potentiels seront calculés avec le même biais.
Greg
Nicolas · 10/02/2019 à 11:01
Bonjour Grégory,
Je suis en train d’apprendre R et j’essaie d’utiliser ton script.
J’ai une erreur lors du inner_join du trafic :
Erreur : `by` can’t contain join column `position` which is missing from RHS
Peux-tu m’indiquer de quoi il s’agit si tu sais ?
Merci !
Nicolas · 10/02/2019 à 11:17
Je me réponds à moi-même : dans le fichier CTR, le header de ma colonne n’était pas « position » mais « CTR position ». En renommant la colonne, ça passe 🙂
Merci pour ton article 🙂