Data Marketing

Comment enrichir les données de votre site grâce à Google Analytics 360 & Python ?

« En utilisant correctement Google Analytics 360 et Python, la mise en œuvre de vos analyses et enrichissements de données de votre site sont désormais possibles, y compris sur des périmètres complexes et étendus. »

Une des problématiques récurrentes pour les web analystes est de devoir travailler avec de la donnée pauvre et/ou de mauvaise qualité. Dans le cas où Google Analytics est déployé dans sa version Premium, désormais baptisée Google Analytics 360, il est possible de rectifier le tir.

Nous allons vous expliquer comment grâce à deux fonctionnalités particulièrement utiles de Google Analytics 360 et un guide, il est possible d’enrichir facilement et rapidement sa donnée web :

  • Pour palier une lacune dans le marquage actuel du site, il faut créer, par exemple, une dimension personnalisée « Auteur » et la valoriser via l’import de données ;
  • Pour réaliser une analyse ponctuelle , il faut déployer au sein d’une dimension personnalisée le résultat d’un algorithme de scoring basé sur une ou plusieurs dimensions statistiques,
  • Pour commencer ses analyses avant la mise en place d’un nouveau marquage, il est essentiel d’analyser des données existantes en valorisant une dimension ou une métrique personnalisée avant même son déploiement au sein du marquage.
  • Il est possible de valoriser de manière rétroactive une dimension récemment intégrée au plan de marquage 

Cas client : classer toutes les URLS d’un site par thématique

Nous allons vous accompagner avec un tutoriel basé sur un cas client concret. La problématique est simple : attribuer une thématique à chaque URL d’un site. Pour cela, on va se baser sur les termes contenus de chaque URL. Cette classification se traduira par la création et la valorisation d’une nouvelle dimension personnalisée au sein de Google Analytics 360.

Dans un monde parfait, ce type d’implémentation est réalisé en amont de la définition des KPI, ainsi que des objectifs et des analyses. Mais ici, il n’était pas possible de toucher au plan de marquage et, in-fine, à l’implémentation. Nous allons donc voir comment enrichir de manière rétroactive environ 700 000 URLS en quelques clics et en seulement dix secondes de traitement.

Une fois la nouvelle dimension personnalisée valorisée, il sera possible de l’utiliser au sein de tous les rapports natifs, des custom reports et des requêtes API. On pourra donc la croiser avec l’ensemble des statistiques et dimensions disponibles au sein de l’environnement Google Analytics.

Le tutoriel est découpé en trois étapes clés :

1. Exporter de la donnée non échantillonnée via un « Unsampled Report ». Le but étant de récupérer un CSV contenant un maximum d’URLS sur une période donnée. Cette liste d’URLS servira de clé de jointure pour notre nouvelle dimension.

2. Enrichir et nettoyer la donnée en local grâce à Python. L’objectif est de créer une nouvelle colonne au sein de notre CSV dont la valeur de chaque ligne dépendra de l’URL, en fonction des règles qu’on aura établies au préalable.

3. Réimporter la donnée au sein de Google Analytics 360 via le Dimension Widening. Une fois notre CSV construit, il faut importer ce dernier au sein de la plateforme pour rendre notre dimension exploitable. Une des options spécifiques de Google Analytics 360 sur l’import de données, « Query Time », est particulièrement utile.

Vous trouverez pour cette action les trois parties, mais n’hésitez pas à consulter celles qui vous intéressent.

Etape #1 : Exporter la donnée – L’Unsampled Report à la rescousse

Objectif : récupérer un CSV avec une colonne « Pages » exhaustive.

Un des avantages de Google Analytics 360 est de pouvoir exporter de la donnée non échantillonnée via les « Unsampled Reports ». Au sein d’un site à fort volume d’audience couplé à un nombre de pages indexées élevé, on peut rapidement analyser plusieurs centaines de milliers de pages différentes.

L’Unsampled Report présente deux avantages :

1. Récupérer de la donnée non échantillonnée, même si le rapport dépasse la limite théorique des 100 millions de sessions. Rappelons que cette limite est de 500 000 sessions sur Google Analytics Standard. Au-delà de ces limites, une estimation est automatiquement appliquée.

2. Récupérer un nombre de lignes allant jusqu’à 3 millions, contre seulement 5000 pour les custom reports standards. Cette fonctionnalité est de loin la plus puissante. Dans une majorité de cas, on pourra donc récupérer de manière exhaustive toutes les valeurs de n’importe quelle dimension. Attention en revanche au croisement de dimensions qui pourra exploser le quota des 3 millions.

Création du rapport personnalisé

Pour créer un Unsampled Report, il faut commencer par créer un rapport personnalisé standard.

On va créer un rapport personnalisé avec une seule dimension « Pages ». On rajoute la statistique « Pages vues » puisqu’un rapport doit contenir à minima une dimension et une statistique. Vous pouvez rajouter d’autres statistiques pour anticiper vos besoins. En revanche, ne rajoutez pas d’autre dimension, afin de ne pas démultiplier les valeurs de la colonne « Pages ».

Une fois le rapport créé, choisissez une période suffisamment large pour avoir une exhaustivité de la colonne « Pages ».

Une fois votre rapport prêt, cliquez sur « Exporter » puis « Rapport non échantillonné ».

 

Vous recevrez un email vous avertissant que le rapport non échantillonné est prêt. Vous pourrez également y accéder via l’onglet du menu dédié ci-dessous :

Ensuite, il suffit de télécharger le rapport au format CSV. De mon côté, j’ai exporté un rapport contenant « Page » en dimension, « Pages vues » et « Sorties » en statistique, ce qui donne le résultat suivant :

  

Pour plus d’informations sur l’extraction de données Google Analytics 360 non échantillonnée, nous vous renvoyons vers les deux articles de LunaMetrics :

Etape #2 : Enrichir facilement la donnée grâce à Python et la librairie Pandas

Objectif : enrichir le CSV préalablement obtenu avec une nouvelle colonne. Cette colonne contiendra les valeurs que l’on souhaite importer au sein de notre dimension « Thématique ». La jointure se fera grâce à la colonne « Page ».

Prérequis :

  • Avoir suivi l’étape 1 du tutoriel
  • Avoir créé une nouvelle custom dimension « Thématique » au sein de Google Analytics 360

A ce stade, vous devriez avoir un CSV dont la première colonne est la dimension « Page », suivie des statistiques que vous avez décidé d’intégrer dans le rapport.

L’objet de l’article n’est pas d’expliquer comment installer un environnement Python. Notons simplement que j’ai réalisé l’ensemble des opérations au sein d’un Jupyter Notebook. En revanche détailler les différentes étapes du code, que l’on peut découper ainsi :

  1. Chargement des librairies (standards et externes)
  2. Création d’une fonction qui renvoie à une thématique en fonction du contenu de l’URL
  3. Importation du CSV en tant que DataFrame
  4. Création d’une nouvelle colonne valorisée grâce à notre fonction précédemment créée
  5. Enregistrement du DataFrame en tant que CSV

Chargement des librairies

Nous allons avoir besoin de trois librairies, dont deux faisant parties de la librairie standard.

  • « time » qui va nous permettre de mesurer le temps d’exécution de notre script.
  • « re » pour pouvoir réaliser des expressions régulières plus rapidement.
  • « Pandas », développée par Wes McKinney : cette librairie a largement contribué au succès de Python en Data Science et a donné toutes les armes au langage pour rivaliser notamment avec R. Dans notre cas, elle va nous permettre d’importer notre CSV sous forme de « DataFrame ». Un DataFrame est un objet Pandas modélisant une matrice à deux dimensions. Les colonnes possèdent des labels, et chaque ligne est indexée.

# Import des Librairies
import pandas as pd
import re
import time

 

Création de notre fonction d’attribution de thématique

Tout se joue ici. Dans notre cas, notre fonction de classement va être très basique. On va simplement chercher des correspondances d’expression régulière au sein de la chaîne de caractères passée en argument. Rien n’empêche en revanche d’imaginer une fonction de plus complexe, basée sur plusieurs critères.

Afin de faciliter la compréhension, la fonction a été simplifiée, en réduisant notamment le nombre de vérifications. Mais le principal y est. L’idée est de récupérer une URL en paramètre. On teste ensuite plusieurs expressions régulières pour trouver celle qui correspond le mieux. Dès qu’une correspondance est trouvée, on renvoie la thématique associée. Si aucune condition n’est trouvée, alors on renvoie une valeur par défaut.

# Fonction retournant une thématique en fonction du contenu de l'URL
def page_theme(url):
    """ Assignation d'une thématique en fonction du contenu de l'URL """
    theme = ""
    if (re.search('^/$', url)):
        theme = 'Home'
    elif (re.search('(fen(e|ê)tre|(baie(.*)vitr(é|e))', url)):
        theme = 'Fenêtre'
    elif (re.search('porte.*garage', url)):
        theme = 'Porte de garage'
    elif (re.search('(sol|mur|carrelage|parquet|lambri|parement)', url)):
        theme = 'Sols et murs'
    else:
        theme = 'Undefined'
    return theme

 

Importation du CSV et création de la nouvelle colonne « Thématique »

# On enregistre l'heure avant de démarrer le processing
startTime = time.time()
# On récupère le rapport non échantillonné
gadf = pd.read_csv('Pages.csv', encoding='utf-8')
# On garde uniquement la colonne "Pages" On peut également choisir la colonne à l'import
del gadf['Pages vues']
del gadf['Sorties']
# Création d'une colonne "Theme". Application de la fonction page_theme()
gadf['Theme'] = list(map(page_theme, gadf.Page))
# Affichage du nombre de lignées traitées et du temps d'exécution
print(str(round(time.time() - startTime, 2)) + " secs")
print(str(len(gadf)) + " lines")
# Nettoyage du DataFrame
gadfCleanVersion = pd.DataFrame(gadf[list(map(is_clean_page, gadf['Page']))])
# Renommage des colonnes
gadfCleanVersion.rename(columns={'Page' : 'ga:pagePath', 'Theme' : 'ga:dimension31'}, inplace=True)
# Enregistrement du DataFrame sous forme de fichier CSV
gadfCleanVersion.to_csv(path_or_buf='page_and_theme.csv', index=False, encoding='utf-8')
# Affichage des 100 premières lignes du DataFrame
LapeyreCleanPages.head(100)

 

Et voilà ! A peine plus de 10 secondes de traitement pour enrichir près de 700 000 URLS. Un vrai jeu d’enfant J

Note : si vous souhaitez gagner du temps dans l’exécution, le code est optimisable assez facilement :

  1. Ne pas utiliser de regex sur les tests de chaînes simples ;
  2. Compiler une bonne fois pour toute les regex qui vont être testées sur l’ensemble des lignes du DataFrame.

J’ai réalisé ces optimisations et je suis tombé à 7 secondes d’exécution. A vous de juger ensuite du meilleur rapport entre le temps d’écriture de code versus le temps d’exécution, en fonction de la ré-utilisation du dit-code et/ou du volume de données à traiter.

C’est cette syntaxe extrêmement synthétique qui rend notamment Python pratique et puissant pour traiter de la donnée. Bien que ce ne soit qu’un bref aperçu, on peut également remercier la librairie Pandas et son objet « DataFrame » très pratique.

Maintenant que notre fichier CSV est prêt, il ne reste plus qu’à l’importer au sein de Google Analytics 360.

Etape #3 : Importation de la donnée enrichie au sein de Google Analytics 360

Google Analytics 360 propose deux types d’importation de données :

  • Processing Time Import Mode
  • Query Time Import Mode

Les deux modes d’importation sont disponibles également sur la version gratuite de Google Analytics 360. Le premier présente, en revanche, deux inconvénients rendant la fonctionnalité peu utile, voire même dangereuse à l’utilisation :

  1. Effet non rétroactif sur la donnée, elle sera effective uniquement sur les hits récoltés après l’import de votre modèle. Impossible donc d’utiliser cette fonctionnalité dans un but d’analyse antérieure.
  2. Marquage irréversible : votre modèle sera gravé dans le marbre pour tous les hits générés à posteriori.

Attardons-nous plutôt sur le second mode.

Query Time Import Mode

Cette option n’est disponible que sur Google Analytics 360. Espérons qu’elle soit un jour étendue à la version standard. Le fonctionnement de ce mode est simple : à chaque fois que l’on requête de la donnée Google Analytics via une vue (rapport natif, rapport personnalisé, requête Core API), Google réalise un processing à la volée pour intégrer la donnée importée.

Cela présente trois avantages non négligeables :

  1. Toute importation est rétroactive de facto, puisque le modèle est généré à la volée lors des requêtes, quelle que soit la date d’analyse.
  2. Vos importations n’ont aucune conséquence sur le schéma de données récoltées et stockées par Google.
  3. Il suffit de supprimer un modèle importé pour qu’il ne soit plus effectif.

L’import se réalise en deux étapes :

  1. Création d’un modèle d’import
  2. Import de la donnée sous forme de CSV respectant le modèle

Création d’un modèle d’import

Rendez-vous dans : Admin => Importation de données => Créer

Choisir ensuite l’option « Import de données relatives au contenu »

 

Puis choisir le type d’import que l’on souhaite réaliser. On notera la traduction de « Time Query » par « Heure de la requête ».

 

Nommer ensuite votre modèle d’importation et sélectionner les vues auxquelles il sera rattaché :

  

Enfin, il faut créer à proprement parler le modèle de données. Pour cela, on sélectionne la dimension qui servira de clé de jointure. Dans notre exemple, c’est la dimension « Page » qui endossera ce rôle. Ensuite, on sélectionne les dimensions que l’on souhaite enrichir. Il s’agit d’une custom dimension fraîchement créée, appelée « Thématique » et qui correspond à la Custom Dimension n°31 dans mon cas. On peut en sélectionner plusieurs si nécessaire.

On notera que sur la clé de jointure, il est possible de sélectionner qu’une partie des valeurs à prendre en compte lors de l’import, grâce à une expression régulière. C’est grossomodo le rôle de ma fonction de nettoyage expliquée plus haut, dans le script Python.

Note : si jamais des données importées et des données récoltées cohabitent, ce sont vos données importées qui prendront le dessus.

 

Maintenant que notre modèle est prêt, il ne reste plus qu’à importer le CSV.

 

Une fois l’importation terminée, il faudra compter environ une petite heure avant que le set de données soit utilisable au sein des requêtes API et des rapports.

Désormais, vous pouvez croiser votre dimension « Thématique » avec l’ensemble des dimensions et statistiques présentes dans le Google Analytics 360.

Les limites

La méthode détaillée dans cet article présente deux limites qui sont les suivantes.

Les valeurs récoltées dans le futur n’auront aucun impact sur l’enrichissement

Toutes les valeurs de la dimension « pagePath » qui ont été exportées ont permis d’enrichir la dimension « Thématique ». Les analyses pourront donc être effectuées sur n’importe quelle période. En revanche, si après l’import, des pages vues génèrent de nouvelles URLS – inconnues lors de l’export – alors celles-ci n’auront aucune thématique associée.

Ainsi il faudra réaliser régulièrement l’opération d’export/processing/import, afin de maintenir à jour les valeurs pour les futures URL. Il est possible d’automatiser une grande partie de l’opération, mais cela reste fastidieux.

C’est pour cette raison qu’il ne s’agit pas d’une méthode se substituant à l’enrichissement d’un plan de marquage. Ici, le but est plutôt de réaliser une analyse ou un enrichissement de manière ponctuelle, afin de répondre à une question à un instant T. La mise en œuvre de cette méthode doit donc être sous-tendue par un besoin spécifique, urgent ou ponctuel.

Le modèle de données Google Analytics au sein de Big Query n’est pas enrichi

Le mode d’importation « Time Query » présente de nombreux avantages de par le requêtage à la volée. En revanche, puisqu’on enrichit uniquement à l’affichage, le modèle de données n’est jamais affecté. Il faudra inéluctablement passer par Google Analytics 360 pour retrouver cette donnée. Il sera donc impossible de retrouver les valeurs importées en Query Time au sein de Big Query.

Si vous souhaitez altérer et enrichir le modèle de données au sein de Big Query, il faudra alors passer par un import de type « Processing time ». L’inconvénient majeur est que ce mode n’affecte que les futurs hits récoltés. Et une fois la récolte commencée, il ne sera pas possible de faire machine arrière pour les hits enregistrés. La prudence reste donc de mise.

Tous les modèles d’export ne sont pas réalisables en rapport non échantillonné

Il y a plusieurs cas où un rapport non échantillonné montrera ses limites :

  • Exporter tous les hits sur une période donnée ;
  • Exporter toutes les sessions sur une période donnée ;
  • Croiser plusieurs dimensions au sein d’un même rapport ;

Pour les deux premiers points, vous aurez besoin de deux custom dimensions : une pour gérer l’identification unique de chaque hit et l’autre de chaque session. Mais au-delà de ça, ces modèles dépasseront rapidement la limite théorique des trois millions de lignes maximales par rapport.

Aller plus loin

Il faut bien retenir que :

  • Grâce aux méthodes de « Dimension widening », le modèle de données Google Analytics 360 n’est pas étanche à la donnée externe.
  • Il est possible de réaliser des traitements de masse sur de la donnée Google Analytics 360 sans nécessairement passer par Big Query.

En restant sur le même schéma, on pourrait imaginer, par exemple, exporter l’ensemble des User ID / Client ID avec les statistiques qui semblent pertinentes, puis réaliser un algorithme de scoring basé sur les données d’achat. Il suffirait ensuite de réimporter la donnée enrichie au sein d’une dimension dédiée dans Google Analytics 360. Ou bien encore, pourquoi ne pas imaginer une qualification basée uniquement sur le comportement de navigation et trouver des corrélations avec le comportement d’achat. Les seules limites seront votre imagination et la qualité du socle Analytics de vos actifs digitaux.

Pour conclure

Nous vous avons décrit une méthode simple et efficace pour enrichir vos données Google Analytics. Il s’agit avant tout de présenter des moyens, à vous ensuite de les adapter pour arriver à vos fins. Certaines notions abordées sont à peine effleurées car infiniment vastes. Mais l’idée est de souligner que les solutions Analytics ne sont pas étanches aux données et aux traitements extérieurs. Et de rappeler qu’un web analyste dispose d’une panoplie de technologies et d’outils à sa disposition permettant de faire face à tout type de contrainte technique. Correctement utilisés, la mise en œuvre de vos analyses et enrichissements de données site-centric seront rendues possibles y compris sur des périmètres complexes et étendus.

Une question sur cet article ? N’hésitez pas à contacter notre équipe de web analystes.