Site icon Anakeyn

Nettoyage du Spam dans Google Analytics avec R – Partie I

Dans un article précédent nous avions vu comment nettoyer le spam dans les données de Google Analytics « à la main » avec les segments.

Il serait judicieux de pouvoir importer les données via l’API de Google Analytics et de les nettoyer au moyen d’un programme, ici en R, puis ensuite de pouvoir traiter ces données avec des analyses plus poussées que celle fournies par Google Analytics.

Cet article pouvant être long nous l’avons divisé en deux parties.

De quoi aurons nous besoin ?

Logiciel R

Comme précédemment, afin de pouvoir tester le code source de cette démonstration nous vous invitons à télécharger 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/.

Bibliothèque googleanalyticsR

Cette bibliothèque, dont nous avons déjà parlé dans cet article vous permettra d’accéder facilement à vos données dans Google Analytics

Création d’un projet sur la console Google Developpers

Dans le même article précédent nous avions décrit comment créer un Projet sur la Console Google et comment récupérer ses identifiants. Merci de vous y référer.

Jeu de données

Comme pour l’article « Comment nettoyer le spam dans Google Analytics avec les segments » et l’article « Importer les données de Google Analytics API avec Python Anaconda » nous reprendrons le jeu de données de Networking Morbihan.

Code Source

Vous pouvez copier/coller les codes sources suivants pour les tester dans votre propre fichier de script R.

Vous pouvez aussi télécharger gratuitement les sources et les fichiers nécessaires dans notre boutique : https://www.anakeyn.com/boutique/produit/script-r-nettoyage-spam-dans-google-analytics/

Connexion à l’API Google Analytics via googleanalyticsR

Dans cette première partie nous reprenons ce que nous avions fait précédemment afin de récupérer l’ID de view de Google Analytics qui nous intéresse.

##########################################################################
# Installer la version stable ou en cours de dev de googleAnalyticsR 
# décommenter la ligne désirée :
# version stable :
# install.packages("googleAnalyticsR", dependencies = TRUE) 
# Version en cours de dev  :
# devtools::install_github("MarkEdmondson1234/googleAnalyticsR")  


# googleAnalyticsR fournit par défaut un ID Client et un Code secret 
# sinon vous pouvez utiliser les votres pas les notres  :
# ceux-ci sont faux 
myclient_id <-  "XXXXXXXXXXXtvh1eh0msnekhkeaeb01vtuvpq8j.apps.googleusercontent.com" 
myclient_secret <-   "XXXXXXXXXXX9NS-R3pKXDa" 


##########################################################################
#Initialiser les codes OAuth  avant de charger la bibliothèque 
#googleAnalyticsR
options(googleAuthR.client_id = myclient_id )
options(googleAuthR.client_secret = myclient_secret ) 
#Optionnel : indiquez l'étendue de l'utilisation des API Google 
#options(googleAuthR.scopes.selected = "https://www.googleapis.com/auth/analytics")
library(googleAnalyticsR)  #! mettre mes info OAuth avant de recharger.

##########################################################################
#connexion via son compte google (un navigateur va s'ouvrir lors 
# de la première connexion)
ga_auth() 

#liste des comptes dans Google Analytics pour récupérer le code viewID
account_list <- ga_account_list()
account_list  #Afficher la liste
# Attention c'est l'ID de vue qu'il nous faut viewID
ga_id <- account_list[1, 'viewId']  #Pour moi c'est la 1ere ligne de mes 
#vues dans Google Analytics

Quelques packages et données utiles

##########################################################################
#Packages utiles 
#install.packages("tidyverse")  #si vous ne l'avez pas #pour gggplot2, dplyr, tidyr, readr, purr, tibble, stringr, forcats 
#install.packages("forecast") #pour ma
#Chargement des bibliothèques utiles
library(tidyverse) #pour gggplot2, dplyr, tidyr, readr, purr, tibble, stringr, forcats 
library(forecast)  #pour  arima, ma, tsclean


#QQ dates utiles 
FirstJuly2011 <- as.Date("2011-07-01")  #début du site étudié
the31thDec2018 <- as.Date("2018-12-31")   #fin de l'étude.


Récupération des données pour filtrages

Afin de pouvoir filtrer le spam il sera nécessaire de récupérer des dimensions : hostname, browser, fullReferrer, sourceMedium, language, landingPagePath, pagePath dans Google Analytics.

##########################################################################
# RECUPERATION DES DONNEES BRUTES POUR FILTRAGE 
##########################################################################
#Pour mémoire Dimensions & Metrics Explorer 
#https://developers.google.com/analytics/devguides/reporting/core/dimsmets

#Attention le nombre de dimensions est limité à 9 et de Metrics à 10.

###############
gaPVAllYears <- google_analytics(ga_id, date_range = c(FirstJuly2011 , the31thDec2018), 
                            metrics = c( "Pageviews"), 
                            dimensions = c("date", 
                                           "hostname", #pour filtrer le spam sur des nom d'hôtes non autorisés 
                                           "browser",  #pour filtrer les robots et browser curieux.
                                           "fullReferrer",  #pour filtrer les fausses pages référentes
                                           "sourceMedium", #pour filtrer les crawlers spammers ou faux sites référents
                                           "language",  #pour filtrer les langues suspectes
                                           "landingPagePath",  #pour voir si la page est en entrée
                                           "pagePath",  #page recherchée
                                           "keyword"  #Peut être récupéré si Bing (et peut être autres moteurs)
                                            ),
                            max = 100000
                            )

#on, récupère 51790 lignes.
#split sourceMedium en source et medium
gaPVAllYears <- separate(gaPVAllYears, sourceMedium, c("source", "medium"), " / ")

# une ligne par observation : décomptage des Pageviews.
gaPVAllYears <- gaPVAllYears %>%
  uncount(Pageviews)

#Verifs
head(gaPVAllYears, n=20) #visualison l'entête
tail(gaPVAllYears, n=20) #visualison fin
nrow(gaPVAllYears) #nombre de lignes 82559  on a le même décompte qu'avec Google Analytics en mode console.

Comme vous pouvez le voir le système a trouvé 82559 observations (comme dans notre article sur le nettoyage de Google Analytics via les segments).

Préparation des données pour les graphiques

Dans cette partie nous allons préparer les données pour pouvoir construire les graphiques illustratifs. Cliquez sur les graphiques pour les agrandir.

##########################################################################
# Affichage des données brutes
##########################################################################

#creation de la dataframe daily_data par jour
dfDatePV <- as.data.frame(gaPVAllYears$date)
colnames(dfDatePV)[1] <- "date"                   #change le nom de la colonne.
daily_data <- dfDatePV  %>%                       #daily_data à partir de dfDatePV
  group_by(date) %>%                              #groupement par date
  mutate(Pageviews = n()) %>%                     #total des pageviews = nombre d'observations / date
  as.data.frame() %>%                             #sur d'avoir une data.frame
  unique() %>%                                    #ligne unique par jour.
  mutate(cnt_ma30 = ma(Pageviews, order=30)) %>%  #variable moyenne mobile (moving average 30 jours)
  mutate(year = format(date,"%Y"))             #creation de la variable year

Pages vues par jour

On va utiliser la bibliothèque ggplot.

#Graphique pages vues par jour
ggplot(daily_data , aes(x=date, y=Pageviews, color=year)) + 
  geom_line() +
  xlab("Année") +
  ylab("Nbre pages vues / jour") +
  labs(title = "Il semble y avoir une anomalie en fin 2016",
       subtitle = "Le trafic est bien au dessus du reste des observations.",
       caption = "Nombre de pages vues par jour depuis 2011 - Données Brutes",
       color = "Année") 
#sauvegarde du dernier ggplot
ggsave(filename = "PV-s2011.jpeg",  dpi="print") #sauvegarde du dernier ggplot.

Page vues brutes depuis 2011

Pages vues en moyennes mobiles sur 30 jours

#lissage avec des années de différentes couleurs. méthode loess
ggplot(daily_data, aes(x=date, y=Pageviews, color=year)) + 
  geom_smooth(method = "loess") + 
  xlab("Année") +
  ylab("Nbre pages vues / jour lissage loess") +
  labs(title = "l'anomalie fin 2016 est bien visible",
       subtitle = "On constate en général une baisse de trafic l'été",
       caption = "Nombre de pages vues par jour depuis 2011 \n lissage méthode Loess par an - Données brutes",
       color = "Année") 
#sauvegarde du dernier ggplot.
ggsave(filename = "PV-s2011-lissage-loess-an.jpeg",  dpi="print") 

Pages Vues en Moyenne Mobile sur 30 jours

Lissage Loess par an

La méthode Loess ou Régression Locale est expliquée ici par exemple.

#lissage avec des années de différentes couleurs. méthode loess
ggplot(daily_data, aes(x=date, y=Pageviews, color=year)) + 
  geom_smooth(method = "loess") + 
  xlab("Année") +
  ylab("Nbre pages vues / jour lissage loess") +
  labs(title = "l'anomalie fin 2016 est bien visible",
       subtitle = "On constate en général une baisse de trafic l'été",
       caption = "Nombre de pages vues par jour depuis 2011 \n lissage méthode Loess par an - Données brutes",
       color = "Année") 
#sauvegarde du dernier ggplot.
ggsave(filename = "PV-s2011-lissage-loess-an.jpeg",  dpi="print") 

Lissage par an méthode Loess

Lissage Linéaire par an

#lissage linéaire par an 
ggplot(daily_data, aes(x=date, y=Pageviews, color=year)) + 
  geom_smooth(method = "lm") +
  xlab("Année") +
  ylab("Nbre pages vues / jour lissage linéaire") +
  labs(title = "l'anomalie fin 2016 est bien visible",
       subtitle = "",
       caption = "Nombre de pages vues par jour depuis 2011 \n lissage linéaire par an - Données brutes",
       color = "Année") 
#sauvegarde du dernier ggplot.
ggsave(filename = "PV-s2011-lissage-lm-an.jpeg",  dpi="print") 

Lissage linéaire par an

Lissage linéaire sur toute la période

#lissage loess sur toutes les données depuis 2011
ggplot(daily_data, aes(x=date, y=Pageviews)) + 
  geom_smooth(method = "loess") +
  xlab("Année") +
  ylab("Nbre pages vues / jour lissé") +
  labs(title = "Le trafic monte jusqu'en 2014 puis reste stable jusqu'en 2016.",
       subtitle = "Après 2016 la décroissance est forte.",
       caption = "Nombre de pages vues par jour depuis 2011 lissage méthode Loess - Données brutes") 
#sauvegarde du dernier ggplot.
ggsave(filename = "PV-s2011-lissage-loess.jpeg",  dpi="print") 

Lissage Loess sur toute la période

Nous démarrons le nettoyage des données à proprement parlé dans la partie II de cet article.

Quitter la version mobile