SEO

OnCrawl : Génération d’un audit SEO au format PowerPoint


Nous avons récupéré beaucoup de données dans les précédents articles, désormais il est temps de les mettre en forme et de les diffuser sous la forme d’un PowerPoint en respectant vos polices d’écritures, vos contenus, votre logo, vos couleurs.
Ainsi si vous avez déjà un template PowerPoint soigné, il est facile de l’industrialiser et de concentrer votre énergie sur les analyses. Prêt à gagner du temps ?

Génération d’un PowerPoint

Nous allons utiliser le package R : officeR qui fonctionne sur Mac et PC.

Le package officeR permet aux utilisateurs de R de manipuler des documents Word (.docx) et PowerPoint (*.pptx). Il est facile d’ajouter des images, des tableaux et du texte dans les documents. Un document initial peut être fourni ; le contenu, les styles et les propriétés du document original seront alors conservés. Des exemples sont dévoilés à la fin de l’article une fois que les données sont mises en forme.

Avant de commencer à utiliser ce package, il faut récupérer les données et là nous allons voir des exemples basés sur les articles 1, 2 et 3 expliqués précédemment.

Récupérons tous les crawls de OnCrawl

Si vous crawlez régulièrement votre site avec OnCrawl, il est intéressant d’étudier de longues périodes. Ci-dessous nous allons voir un exemple de code pour récupérer plusieurs crawls.

Il n’existe aucune limite dans le temps. Par contre, les anciens crawls peuvent être archivés donc parfois si vous remontez sur d’anciennes périodes, vous allez devoir les désarchiver via la plateforme OnCrawl.
Vous avez l’option « un-archive all » pour chaque crawl archivé.

Voici un code R qui vous permet d’aller chercher les dix derniers crawls d’un projet. Il reprend toutes les fonctions que nous avons vues dans l’article 1 sur l’API OnCrawl.

listProjectsId <- listProjects()
last_crawl_ids <- unlist(listProjectsId$projects$crawl_ids[2])
last_crawl_top10 <- head(last_crawl_ids, 10)

for (crawlId in last_crawl_top10) {
    crawlInfo <- getCrawl(crawlId)
    date_in_ms <- crawlInfo$crawl$created_at
    sec <- date_in_ms / 1000
    date_format <- as.POSIXct(sec, origin="1970-01-01", tz=Sys.timezone())
    date_format <- substr(date_format,1,10)
    pages <- listPages(crawlId)
    assign(paste("crawl_d_", date_format, sep = ""), pages)
}

Chaque crawl est stocké en mémoire sous le nom de variable crawl_d_DATE pour permettre de calculer les métriques qui nous intéressent. Ci-dessous, un exemple :

C’est parti pour l’extraction des premières métriques

En R comme en Python, il est facile de calculer vos métriques quand les données sont bien collectées et qualifiées.

En R, je conseille le package Dplyr. En Python, je conseille la librairie Pandas.

Voici une liste non exhaustive des métriques. Nous verrons des exemples concrets plus tard dans l’article.

Métric R with Dplyr
duplicateDescription nrow(filter(result, description_evaluation == « duplicated »))
duplicateTitle nrow(filter(result, title_evaluation == « duplicated »))
nearDuplicatePages nrow(filter(result, nearduplicate_content == TRUE))
poorContent nrow(filter(result, word_count_range == « xs »))
incompleteOpenGraph nrow(filter(result, ogp_evaluation != « complete »))
notCanonical nrow(filter(result, canonical_evaluation != « matching »))
indexable nrow(filter(result, fetched == TRUE && meta_robots_index == TRUE)) – nrow(filter(result, canonical_evaluation == « not_matching »)) – nrow(filter(result, status_code != « 200 »))
code3xx nrow(filter(result, status_code == « 301 »))
code4xx nrow(filter(result, status_code == « 404 »))
code5xx nrow(filter(result, status_code == « 500 »))
pages_in_structure nrow(filter(result, depth>0))
indexable_canonical_pages nrow(filter(result, meta_robots_index == « True » & status_code_range == « ok » & canonical_evaluation != « not_matching » & fetched == « True »))
seo_active_orphan_pages nrow(filter(result, is.na(depth) & analytics_entrances_seo_google >0 ))
seo_active_traffic nrow(filter(result, analytics_entrances_seo_google >0 ))
seo_visits_google sum(result$analytics_entrances_seo_google)

A chaque fois, je stocke ma métrique dans un data.frame avec sa date, sa valeur et son nom unique.

Par exemple :

res <- rbind(res, data.frame(date=date,
     value=seo_visits_orphan_pages_google,
     metric="Visits orphan pages Google"))

Le grand classique : Taux d’évolution

J’ai eu la chance de travailler pour deux grands comptes (un média et un site e-commerce) et il y a un point commun très fort pour les comités de direction : les taux d’évolution.

À chaque fois, les data analystes doivent jongler avec des calculs de taux d’évolutions, des couleurs et des indicateurs faciles à lire.

C’est bien, mais on perd la notion de la tendance car souvent on se concentre sur des données temporelles faciles à expliquer, comme l’année ou le mois.

C’est pour cela qu’il est important d’ajouter des « sparklines » pour suivre les tendances.

Une « sparkline » est un petit graphique dans une colonne qui fournit une représentation visuelle des données. C’est très utilisé pour montrer les tendances d’une série de valeurs, comme les augmentations ou les diminutions saisonnières, les cycles économiques, ou pour mettre en évidence les valeurs maximales et minimales.

Introduction au package formattable

Il existe un package qui permet des présentations à couper le souffle à partir de n’importe quelle table au format R. Avec ce package, il est facile d’ajouter des sparklines et des indicateurs.

Si vous voulez en savoir plus, je vous invite à lire cet article : https://www.littlemissdata.com/blog/prettytables

Désormais dans le package oncrawlR, il y a une fonction qui va faire le travail à votre place à partir des données que nous avons précédemment créées. Vous pouvez suivre des variations sur n’importe quelle période avec les tendances et les sparklines associées.

Voici le résultat :

Par contre, c’est en HTML donc l’astuce est d’utiliser également un package qui transforme la page HTML en image pour pouvoir l’intégrer dans son audit SEO.

Pour changer, tout se fait en une ligne de code quelque soit le nombre de crawls. La fonction va dessiner la sparkline avec tous les crawls puis afficher le premier et le dernier, calculer le taux d’évolution et mettre l’indicateurs correspondants avec la couleur qui va bien.

La fonction a besoin de 4 arguments : en premier argument le nom du dataframe avec les trois colonnes cités précédemment ( date, nom de la métrique et valeur de la métrique ), le nom du l’image à créer, la taille de l’image et l’emplacement du fichier.

oncrawlCreateDashboard(res, "metricSEO.png", 500, ".")

Que mettre alors dans un rapport SEO ?

L’audit doit être concis et efficace en se concentrant sur des actions expliquées et priorisées.

Vous allez trouver le modèle dans la conclusion de cet article mais vous pouvez bien sûr l’améliorer. Le plus important est d’avoir un suivi par catégories et c’est pour cela que j’ai évoqué dans le second article comment faire de la catégorisation multi-segment.

Dans le PowerPoint, vous avez un suivi de chaque catégorie :

  • Par visites
  • Par nombre de pages.
all <- ls()
objects <- all[which(grepl("^crawl_d_", all))]
resGroupByCategory <- data.frame( date=character() , value=integer(), metric=character() )

for (obj in objects) {  
   result <- get(obj)
   date <- substr(obj,9,nchar(obj))
   result$metric <- "no match"

   for (j in 1:length(urls)) {
       result$metric[which(stri_detect_fixed(result$urlpath,urls[j],      case_insensitive=TRUE))] <- urls[j]
   }

   resLastCrawlCategory <- group_by(result, metric) %>%
      summarise(value=n()) %>%
       mutate(date=date) %>%
       ungroup()

   resGroupByCategory <- rbind(resGroupByCategory, resLastCrawlCategory )
}

oncrawlCreateDashboard(resGroupByCategory, "metricCategory.png", 500, ".")

Ensuite, il existe un rapport SEO IMPACT REPORT dans OnCrawl qui vous donne les métriques qui ont le plus d’impact dans vos stratégies SEO.

Voici un exemple, attention tous les chiffres ci-dessous sont factices.

Voici donc le code qui permet de récupérer ses métriques en se concentrant seulement sur le trafic issu de Google. Ainsi nous allons pouvoir l’insérer dans un PowerPoint pour la suite.
Nous retrouvons donc le code R avec Dplyr qui permet de calculer chaque métrique.

all <- ls()
objects <- all[which(grepl("^crawl_d_", all))]
res <- data.frame(date=character(), value=integer(), metric=character() )

for (obj in objects)  {result <- get(obj)
date <- substr(obj,9,nchar(obj))
  pages_in_structure <- nrow(filter(result,
depth>0))

  res <- rbind(res, data.frame(date=date, value=pages_in_structure,
metric="Pages in structure"))

  indexable_canonical_pages <-
nrow(filter(result, meta_robots_index == "True" &
status_code_range == "ok" &    canonical_evaluation !=
"not_matching" & fetched == "True"))

  res <- rbind(res, data.frame(date=date, value=indexable_canonical_pages,
metric="Indexable canonical pages"))

  #traffic mais depth=0 = orphan

  seo_active_orphan_pages <- nrow(filter(result,
is.na(depth) & analytics_entrances_seo_google >0 ))

  res <- rbind(res, data.frame(date=date, value=seo_active_orphan_pages,
metric="Active orphan pages"))

  seo_active_traffic <- nrow(filter(result, analytics_entrances_seo_google
>0 ))

  res <- rbind(res, data.frame(date=date, value=seo_active_traffic,
metric="Active traffic pages"))

  seo_visits_google <-
sum(result$analytics_entrances_seo_google)

  res <- rbind(res, data.frame(date=date, value=seo_visits_google,
metric="Visits Google"))

  seo_visits_orphan_pages_google <-
sum(filter(result, is.na(depth) & analytics_entrances_seo_google>0 )$analytics_entrances_seo_google)

res <- rbind(res, data.frame(date=date, value=seo_visits_orphan_pages_google,
metric="Visits orphan pages Google")) 
}

oncrawlCreateDashboard(res, "metricSEO.png", 500, ".")

Voici le résultat final :

Ajout des ranking factors et des seuils

Désormais nous pouvons insérer les ranking factors et expliquer les principaux seuils que nous avons généré dans l’article 3.

list <- oncrawlTrainModel(datasetMatAll,200)ggsave("variable_importance.jpg",model$plot)

#please be patient !
model <- oncrawlExplainModel(list$model, list$x, list$y, 3, ".")
list_importance_variable <- model$factors

# explain variable 1
factor_top <- list_importance_variable[1]oncrawlCreateGraph(factor_top,"factor_top1.jpg",2, 1,".")

# explain variable 2
factor_top <- list_importance_variable[2]oncrawlCreateGraph(factor_top,"factor_top2.jpg",2, 1,".")

# explain variable 3
factor_top <- list_importance_variable[3]
oncrawlCreateGraph(factor_top,"factor_top3.jpg",2, 1,".")

Dans cet exemple, j’ai limité à 3 variables car plus vous allez gérer de ranking factors et plus le temps investi et donc le budget sera important. Je vous laisse fixer la bonne limite.

Par contre, j’ai refait les graphiques qui expliquent les variables d’importance de DALEX car ils n’étaient pas assez explicites. Désormais, une fonction détecte les changements brusques de seuil et indique les valeurs à suivre.

Voici le résultat :

AVANT

APRES

Générons le PowerPoint

Dans cette section nous allons regarder le code pour générer un PowerPoint en R. Si vous avez envie de faire des opérations sur les slides plus sophistiquées comme par exemple ajouter de nouveaux slides, la documentation se trouve ici : https://cran.r-project.org/web/packages/officer/vignettes/powerpoint.html

Lecture d’un PowerPoint

doc <- read_pptx(“CHEMIN”)

Astuce importante

Il faut se déplacer dans les slides et récupérer les éléments courants pour savoir où placer ses textes ou ses images

# On récupère tous les éléments du slide 1
sumdoc <- slide_summary(doc, index = 1)

# On indique que nous allons modifier le slide 1, très important pour la suite

doc$cursor <- 1

Ajout d’un texte

Ici, voici un exemple avec une date.

doc <- ph_add_text(x=doc
             ,str=format(Sys.Date())
             ,ph_label = "Google Shape;59;p13"
             ,pos="before"
             ,style = fp_text(color="white",
                              font.size=36,
                              font.family="Proxima Nova",
                              bold=TRUE
                              )
             )

Cette fonction ph_add_text permet de placer un texte avec la date du jour dans l’élément : “Google Shape;59;p13” défini dans la fonction « slide_summary » au-dessus. Les arguments du « style » définissent le style du texte ; vous pouvez les adapter à votre charte graphique.

Ajout d’une image dans un slide.

Ici, voici un exemple où j’ajoute une image dans le slide numéro 4.
C’est à vous de placer l’image avec les variables left et top et de définir la taille avec height, width.

sumdoc <- slide_summary(doc, index = 4)
 doc$cursor <- 4
 add img
 img.file <- file.path( "metricSEO.png" )
 if( file.exists(img.file) ){
   doc <- ph_with_img_at(x = doc, src = img.file,
                           height = 2, width = 5,
                           left = 4.9, top = 1
                         )
 }

Enregistrement du résultat

La fonction print vous permet de sauvegarder dans le répertoire de votre choix.

Si rien n’est spécifié, le PowerPoint sera sauvegardé dans le répertoire courant du projet.

print(doc, target = "SEO Report2.pptx")

Mission accomplie

Envie de télécharger le résultat final ? Il faudra l’échanger contre un tweet car il a pris beaucoup de temps de création. En utilisant le lien suivant, vous allez obtenir le code pour le générer et un exemple du PowerPoint généré.

Ces quatre articles Data-SEO ont montré comment automatiser les étapes-clés suivantes avec le machine learning :

À cause des millions de combinaisons de variables existantes, cela prendrait trop de temps à un humain de faire ces étapes manuellement.

En effet, les analyses assistées par ordinateur sont déjà implémentées dans de nombreux outils BI, et ils sont capables de vous faire des suggestions sur le bon visuel en fonction des mesures et dimensions sélectionnées.

À mon sens, d’ici 2025, nous allons passer des outils passifs où les humains recherchent de l’information à des outils actifs où l’information cherche son consommateur grâce à des algorithmes hautement perfectionnés.

L’avenir va surtout se jouer dans algorithmes actifs qui sont constamment à la recherche de tendances, de valeurs aberrantes et d’opportunités et qui vont déclencher les meilleures actions pour vos sites. OnCrawl reste un précurseur dans ce domaine par la richesse de la plateforme.

Qu’en pensez-vous ? N’hésitez pas à me laisser un commentaire sur cette série d’articles.

Merci d’avoir suivi mes articles sur les données OnCrawl. Désormais je vais préparer les équivalents en Python mais aussi une formation associée qui sera dédiée aux données OnCrawl et tous les cas d’usage.

Je voulais terminer par des remerciements.

Merci à Rebecca (@Rbbrbl) pour ses conseils brillants et la relecture de chaque article.
Merci à Alice (@aaliceroussel) pour ses feedbacks.
Merci à François, Tanguy et Philippe d’avoir rendu aussi accessible le SEO Technique.

Laisser un commentaire

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