Google Analytics 4 – Collection de ressources

Comme vous le savez, Google Analytics 4 change complètement de paradigme, comparé à Universal Analytics. Il s’agit d’ailleurs en réalité du déploiement à grande échelle de la propriété que l’on retrouvait dans sa version bêta sous le nom de « Web + App ».

Aussi, au vu de la rupture à la fois technique, philosophique et fonctionnelle entre Universal Analytics et Google Analytics 4, le sujet mériterait largement d’y consacrer un livre entier et il n’est pas possible d’écrire un seul article pour traiter tout le sujet.

Désormais, le modèle de donnée est « event based » et l’arbitraire session est reléguée au second plan. Enfin, on peut accéder à la donnée brute en connectant sa propriété à Big Query. Jusqu’à présent ce dernier point n’était possible qu’avec GA 360. Ceci est une petite révolution.

Tout ceci impacte considérablement à la fois l’implémentation technique et l’exploitation des données dans Google Analytics.

Il existe déjà de nombreuses ressources que je vais accumuler ici. Cela permet d’avoir différents points de vue, conceptions et interprétations de la nouvelle philosophie « GA4 ».

De mon point de vue, Google tente avec GA4 de mieux coller aux besoins des data scientists et data analysts, avec un modèle de donnée plus flat, plus compréhensible, plus standard et beaucoup moins arbitraire quant à son agrégation et enrichissement des données brutes.

Ainsi, entre le modèle de données accessible via l’interface de Google Analytics et le modèle de données brut, la différence est moindre : il y a beaucoup moins de variables créées et calculées à partir de l’agrégation de la donnée de niveau hit qu’auparavant.

Ceci a de mon point de vue deux conséquences inéluctables :

  1. Rendre l’exploitation de la donnée plus simple pour un data scientist qui ne vient pas du web. Notamment grâce à la connexion de GA4 à Big Query.
  2. Rendre l’exploitation de la donnée plus complexe aux yeux d’un web analyst ou traffic manager sans background « data ». L’absence de certaines metrics et de certains rapports, l’apparition du « Analysis Hub » et l’intégration à Big Query peuvent être déroutants et masquer le fort potentiel de GA4.

N’hésitez pas à poser vos questions quelles qu’elles soient en commentaire, je m’efforcerai d’y répondre en complétant cet article. Soit via de nouvelles ressources, soit en complétant cette introduction, soit pourquoi pas via un nouvel article si des sujets intéressants sont soulevés 🙂

Avec les ressources ci-dessous, vous êtes armés d’une bonne base théorique pour prendre en main GA4, que vous soyez développeur ou utilisateur.

Implémentation de Google Analytics 4, par Simo Ahava : https://www.simoahava.com/analytics/implementation-guide-events-google-analytics-4/

Implémentation De Google Analytics 4 Ecommerce, par Simo Ahava : https://www.simoahava.com/analytics/google-analytics-4-ecommerce-guide-google-tag-manager/

Exploiter la connexion entre Big Query et une « web + app property » (article datant d’avant GA4) : https://www.simoahava.com/analytics/bigquery-query-guide-google-analytics-app-web/

Modéliser le concept de session à partir de la donnée GA4 importée dans Big Query : https://stuifbergen.com/2020/11/session-modeling-in-bigquery-sql-using-ga4-data-and-a-trip-to-paris/

Guide consacré à GA4 : https://ken-williams.com/

Documentation Google : implémentation de base : https://developers.google.com/analytics/devguides/collection/ga4

Documentation Google : implémentation Ecommerce : https://developers.google.com/tag-manager/ecommerce-ga4

Documentation Google : Events GA4 : https://support.google.com/analytics/answer/9322688?hl=en&ref_topic=9756175

Documentation Google : Events automatiquement collectés : https://support.google.com/analytics/answer/9234069

Documentation Google : noms d’events, de paramètres et de user properties réservés : https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag

Documentation Google : Analysis Hub : https://support.google.com/analytics/answer/9327811?hl=en

Documentation Google : Data API : https://developers.google.com/analytics/devguides/reporting/data/v1

Créer de nouveaux events à partir des events existants, directement dans l’interface de Google Analytics : https://www.kristaseiden.com/creating-events-and-conversions-in-the-ga4-user-interface/

Modifier des events existants dans l’interface de Google Anaytics : https://www.kristaseiden.com/modifying-events-in-the-ga4-user-interface/

Définition d’une nouvelle audience (anciennement segment) : https://www.charlesfarina.com/audience-triggers-conversions-in-ga4/

Fonctionnement des sessions dans GA4 : https://www.qa2l.com/blog/211-google-analytics-4-exploring-sessions-with-debugview

Connecter GA4 à Big Query : https://online-metrics.com/ga4-bigquery/

Custom Dimensions dans GA4 : https://www.analyticsmania.com/post/a-guide-to-custom-dimensions-in-google-analytics-4/

Retour sur ma formation de Data Analyst

Formation data analyst

J’ai terminé il y a quelques semaines ma formation de Data Analyst, formation née de la collaboration entre l’ENSAE et OpenClassrooms. Il s’agit d’un diplôme de niveau 6, ce qui est à cheval entre une L3 et un M1 d’un point de vue équivalence. Je ne vais pas revenir sur mon parcours m’ayant amené ici (déjà fait dans ce billet), mais simplement vous donner mon retour et présenter les différents projets.

Je sais que certaines personnes attendaient cet article. J’espère que cela pourra aider et répondre aux questions de ceux et celles qui hésitent à se lancer.

Edit : on m’a posé plusieurs fois la question concernant l’organisation et le temps passé. Mon objectif était de passer 20 heures par semaine sur la formation, que cela soit sur les cours ou bien sur les projets. Il faut savoir que certains projets demandaient beaucoup de temps de mise en oeuvre, d’autres demandaient plutôt une bonne maîtrise théorique avec une mise en oeuvre rapide. En fonction des projets je passais donc plus ou moins de temps sur la partie cours et/ou sur la partie pratique. Pour donner un ordre d’idée, mon rythme était grossomodo une validation de projet par mois en y consacrant 20 heures par semaine.

Points positifs

La formation est axée autour de projets à réaliser de A à Z, de la récupération des données jusqu’à la soutenance orale filmée. Parfois il s’agit de données fictives, mais la plus part des travaux sont basés sur des données réelles (FAO, Worldbank, RTE France…). Chaque projet est soutenu face caméra dans un temps imparti. Ceci permet d’appliquer quasiment immédiatement les connaissances acquises, de tester, de creuser et d’itérer entre théorie et application au quotidien. Enfin, cela oblige également à aiguiser son esprit de synthèse et de communication, puisque chaque soutenance doit être appuyée par une présentation sur slide et non par des fichiers techniques tels que des notebooks Jupyter.

Le second point pédagogique à retenir est qu’on est accompagné tout le long de sa formation par un mentor, qui est là pour vous aider, vous aiguiller, vous soutenir (Coucou Amaury :). Cela instaure au fil du temps une relation très particulière qu’on ne retrouve pas ailleurs. Formellement, il s’agit d’une visio-conférence hebdomadaire d’environ une heure. Si des difficultés majeures se présentent durant une phase de travail, on ne reste jamais longtemps dans le doute, sans réponse. Bien entendu, il est toujours possible d’échanger avec son mentor en dehors de la session officielle, bien que rien ne l’y oblige contractuellement.

Enfin, une fois officiellement étudiant, on a accès au Workplace d’OpenClassrooms, qui est le lieu de vie de la communauté. On y retrouve un groupe par formation, qui sont animés en permanence par les élèves, les mentors et l’équipe pédagogique puis des groupes plus informels pour inciter à créer du lien. C’est top pour échanger des conseils, des points de vue, des ressources, poser ses questions, etc. Pour ceux qui ne connaissent pas Workplace, il s’agit grossomodo d’un réseau Facebook privé.

Cette formation m’a apporté tout ce que je recherchais : des bases solides en statistiques et la possibilité de réaliser un stage en recherche (sur lequel je reviendrai dans un article dédié). Ayant un peu de background technique, c’était surtout la théorie que j’étais venu chercher, dans le but de continuer sur l’apprentissage du Machine Learning ensuite. C’est ce que je fais aujourd’hui en suivant un Master 2 en ligne en collaboration avec CentraleSupelec et OpenClassrooms.

Il y a un point dont je discutais avec Luc Bertrand (le directeur pédagogique de la branche data chez OpenClassrooms) : il est très difficile de définir ce qu’est un data analyst, que cela soit d’un point de vue académique : quelles connaissances doit-on acquérir ? Ou bien d’un point de vue marché du travail : quelles sont les compétences attendues par l’employeur recherchant un data analyst ?

OpenClassrooms a fait de mon point de vue le bon choix. A savoir enseigner les bases théoriques et techniques des statistiques pour permettre à l’élève d’aller ensuite dans la direction qu’il souhaite : vers encore plus de technique ou de théorie. Vers du Business Intelligence ou vers de la data science. Les différents projets permettent d’acquérir des compétences et une ouverture d’esprit qui seront utiles quelle que soit la suite envisagée.

De mon côté, j’ai appréhendé cette formation comme un tremplin vers la data science et le machine learning. Et en ce sens, je n’ai pas été déçu. Cela a demandé beaucoup d’efforts d’apprentissage allant au delà du minimum requis pour valider les différents projets. Notamment en allant chercher quotidiennement des ressources externes – généralement universitaires – pour comprendre et saisir l’intuition, les concepts et le raisonnement mathématique rencontrés au fil des projets. Mais que cela fut passionnant !

Points négatifs

Ces derniers sont très subjectifs et révèlent plutôt les points que j’aurais aimé être différents, dans la vision qui est la mienne. A savoir celle d’aborder cette année comme une année préparatoire vers de la théorie plus avancée.

Je dirais que la principale frustration a été l’absence de pratique de l’algèbre linéaire au sein des projets. Dans le sens où on ne réalise quasiment aucun calcul matriciel / vectoriel, car on implémente pas d’algorithmes à la main. Ce n’est pas le but initial de cette formation, mais cela reste indispensable quand l’on souhaite étudier ou travailler dans le domaine de l’analyse de données.

Il y a d’ailleurs parfois un choc culturel entre certains cours de l’ENSAE qui peuvent être très théoriques, où l’on admet que l’élève est à l’aise avec l’algèbre linéaire et la lecture d’équations mathématiques relativement avancées et la réalité des projets souvent très applicatifs ne nécessitant pas forcément de compétences théoriques pour être menés à bien.

Pour ma part j’ai beaucoup aimé ces quelques cours, mais ils sont souvent très denses et à la fois trop synthétiques. Il faut les considérer comme un appel à aller chercher d’autres ressources. C’était parfois seulement après plusieurs heures voire plusieurs journées de travail que le cours initial rattaché au projet me paraissait clair. Sans bagages mathématiques post-bac, les cours ne se suffisent donc pas à eux-même. De plus, leur compréhension n’étant la plus part du temps pas nécessaires dans la réussite des projets, on peut aisément imaginer qu’ils passent à la trappe pour bon nombre d’élèves.

Présentation des projets

Pour vous faire une meilleur idée de ce qui vous attend concrètement durant cette formation, je présente ici les principaux projets autour desquels la forme s’articule.

Réalisez une étude de santé publique

Ce projet est vraiment génial, car il plonge de suite dans la réalité du terrain : à savoir qu’il faut comprendre ses données, avant de pouvoir les traiter. La connaissance métier est souvent tout aussi importante que les compétences techniques. Le but du projet est d’analyser des données provenant de la FAO (Food and Agriculture Organization) qui est l’organisme rattaché à l’ONU ayant pour ambition de faire disparaître la faim dans le monde.

Données de la FAO

Ici, on apprend à récupérer des données puis à les traiter avec Python / Pandas et SQL. Toutes les bases du traitement de données sont passées en revue (import, nettoyage, sélection / regroupement / agrégation)

En plus de permettre de mieux comprendre un sujet si primordial, à savoir la faim dans le monde, on prend également conscience qu’avec un petit peu de manipulation et de technique, on peut déjà faire parler ses données, sans même aborder de concepts statistiques à proprement parler.

Il faudra compter une centaine d’heures de travail sur ce projet. Peut-être plus si vous n’avez jamais codé en Python, ni fait de SQL au paravant. Les livrables attendus seront une analyse exploratoire permettant de mettre en évidence les causes de la faim dans le monde et de rejeter certains aprioris.

Mon repository GitHub de mon projet

Analysez les ventes de votre entreprise

Ici, on ne réalise plus simplement un traitement de données disons basique, mais bel et bien une analyse statistique exploratoire. On répondra aux questions suivantes : Qu’est-ce qu’une analyse univariée ? Bivariée ? Qu’est-ce qu’une distribution d’une variable statistique ? Comment la caractériser ?

Les cours rattachés aux projets, majoritairement réalisées par Nicolas Rangeon, sont vraiment géniaux. Ils permettent de découvrir les statistiques de manière pédagogique et intuitive. Je dirais qu’on est sur un niveau à cheval entre une Terminale S et un début post-bac. Parmi les concepts qui vont être appris puis appliqués en Python, on peut citer :

  • Calcul d’une moyenne, d’une variance, d’une médiane, des quantiles
  • Calcul des indicateurs de dispersion : Skewness / Kurtosis
  • Analyse de concentration : indice de Gini, courbe de Lorenz
  • Construction et représentation graphique : boxplot (boîte à moustache), histogramme, séries temporelles
  • Analyse bivariée : coefficient de corrélation, régression linéaire, ANOVA.

Ce projet fait également office d’introduction à Matplotlib, la librairie la plus populaire pour la visualisation de donnés en Python. Il demandera une cinquantaine d’heures de travail, voire plus. Les livrables seront une analyse exploratoire statistique permettant d’avoir une vision claire du business de l’entreprise fictive.

Mon repository GitHub du projet

Produisez une étude de marché

Le but principal du projet est de comprendre ce qu’est une ACP (Analyse en composantes principales) ou plus couramment une PCA en anglais (Principal Components Analysis).

L’entreprise pour laquelle on travaille est fictive, il s’agit d’une entreprise agro-alimentaire spécialisée dans le poulet. En revanche, les données utilisées pour réaliser l’étude sont bien réelles puisqu’il s’agit à nouveau des données issues de la FAO.

Là aussi la partie théorique est enseignée par Nicolas Rangeon, qui prend le temps de vraiment décrire l’intuition et le mécanisme d’une PCA. Ne seront pas abordées les notions de diagonalisation de matrice, ni le calcul à proprement parler des vecteurs propres et des valeurs propres. Mais finalement cela n’est pas forcément utile pour comprendre le principe, l’utilité et l’intuition d’une PCA. Si l’on a compris qu’il s’agit de prendre dans ses données les axes ayant le plus d’inertie et de projeter les données sur ces axes, c’est déjà pas mal 🙂

D’autres fondamentaux statistiques sont également abordés. Cette fois-ci il ne s’agit plus uniquement d’analyse exploratoire mais aussi de statistiques inférentielles. On peut notamment citer :

  • Découverte des tests statistiques (tester une moyenne, une variance, test d’adéquation à une loi)
  • La comparaison de deux échantillons
  • La réduction de dimensions via une PCA
  • Clustering des données via l’algorithme k-means

Suite à l’analyse exploratoire, on doit déterminer quels sont les pays à cibler en priorité pour développer l’entreprise à l’international. Il faut compter une petite centaine d’heures pour réaliser ce projet. Ceci allant de la récupération des données, traitement, analyse, tests statistiques et conclusion.

Mon repository GitHub du projet

Détectez des faux billets

Le but pédagogique de ce projet est double :

1) Interpréter de manière un peu plus approfondie le résultat d’une PCA, notamment l’éboulis des valeurs propres (eigenvalues scree plot en anglais) et surtout le cercle des corrélations.

2) Découvrir un premier algorithme de classement supervisé linéaire, la régression logistique 🙂 Le cours rattaché au projet aborde la méthode des moindres carrés ordinaires (Ordinary least squares en anglais), la régression linéaire, la régression logistique et l’analyse de la variance. Les cours sont relativement théoriques et risquent parfois de perdre l’élève car il y a peu de détail et de contexte. Par exemple on y retrouve l’écriture matricielle explicite des paramètres d’une régression linéaire (appelée l’équation normale) mais sans explication ni démonstration. Cela aurait mérité un peu de justification, qui est intéressante et simple à comprendre. Car il s’agit simplement de minimiser la fonction de coût sous sa forme matricielle, en regardant sa dérivée en zéro. On obtient ainsi explicitement le vecteur contenant tous les paramètres.

Pour ceux que cela intéresse, voici une petite démonstration (sans le détail des calculs des dérivées) par ici.

Quand on n’a encore jamais fait de machine learning, ce projet est plaisant car il permet de voir comment un modèle mathématique simple (qui sous-tend ceci étant dit encore aujourd’hui beaucoup d’algorithmes plus complexes) permet déjà d’obtenir d’excellents résultats en terme de prédiction.

Cette fois-ci, le livrable attendu est un programme en Python auquel on soumet les caractéristiques d’un ou plusieurs billets sous forme de fichier CSV et qui donne en sortie pour chaque billet s’il s’agit d’un vrai ou non. On est donc ici dans les fondamentaux du Machine Learning. Avant de présenter le programme, il faudra présenter l’analyse exploratoire réalisée qui permet de justifier la construction du modèle.

Mon Repository GitHub du projet

Effectuez une prédiction de revenus

Ce projet est très particulier. Il fait appel à diverses méthodes statistiques et probabilistes permettant de générer un jeu de données enrichi, tant en termes de variables que d’individus. L’approche est plutôt bayesienne, bien que le terme n’est jamais employé. Ce qui est dommage, c’est que l’on est guidés dans la démarche sans vraiment d’explication. Un cours sur les probabilités est néanmoins rattaché au projet.

Démarche du projet :

A partir de classes de population de plusieurs pays, l’on va générer des individus et leur attribuer une « classe parents » correspondant aux revenus de leurs parents.Pour cela, on va suivre la méthode suivante :

  1. Générer de faux parents dont les revenus sont distribués selon une loi normale
  2. A partir du coefficient d’élasticité propre à chaque pays, on va attribuer une classe enfant à chaque parent. Cela permet ensuite de calculer les différentes probabilités conditionnelles, à savoir combien de chance a-t-on d’avoir un parent de telle classe quand l’enfant appartient à telle classe.
  3. Ensuite, à partir du jeu de données initial, pour chaque pays on duplique chaque classe de revenus plusieurs centaines de fois pour pouvoir ventiler les différentes probabilités conditionnelles et ainsi avoir un échantillon représentatif.

Notre jeu de données et désormais enrichi de centaines d’individus plutôt qu’un seul individu par classe ainsi que d’une feature supplémentaire « classe parents ». A partir de ce jeu de données enrichi, on va entraîner une régression linéaire pour prédire le revenu de chaque individu.

Enfin, on va analyser finement notre régression linéaire :

  1. Comprendre l’influence de chaque variable endogène
  2. Juger de la pertinence du modèle, notamment via l’analyse des résidus de la régression linéaire

Le livrable attendu sera le modèle de régression linéaire permettant de prédire les revenus ainsi que l’analyse du modèle permettant de conclure sur l’impact propre de chaque variable.

Mon repository GitHub du projet

Prédisez la demande en électricité

Ce projet est peut-être celui qui demande le plus d’efforts en terme d’investissement intellectuel car ici il ne sera pas possible de sélectionner correctement les hyper-paramètres du modèle de prédiction sans comprendre le mécanisme mathématique derrière. Tout le travail est centré atour de l’analyse et de la modélisation de séries temporelles. Les séries temporelles sont un sujet vaste et complexe. On a donc vite fait de se perdre dans cette jungle théorique où les approches sont diverses et variées.

Bien entendu, si l’on souhaite décrire ce que l’on voit ou analyser une série temporelle a posteriori ou bien encore prédire l’avenir de cette série, ce ne sont pas les mêmes outils. Le projet est principalement basé sur la prédiction (mais pas que), notamment à l’aide des modèles basés sur des méthodes stochastiques où l’on considère la série temporelle comme la réalisation d’une variable aléatoire.

Les modèles les plus connus sont les modèles ARMA et toutes ses variantes (ARIMA / SARIMA…). Certains de ces modèles comptent de nombreux hyper-paramètres et il n’est pas toujours facile de saisir l’intuition qui se cache derrière chacun d’entre-eux. C’est à mon avis le plus gros challenge de ce projet.

Pour ma part, en plus d’avoir passé beaucoup de temps à comprendre ces modèles, j’en ai aussi profité pour écrire ma propre fonction de grid-search car les méthodes classiques de cross-validation que l’on utilise en machine learning ne sont pas forcément les plus pertinentes ici.

Ici, le livrable attendu est la présentation du modèle utilisé (modèle, choix des hyper-paramètres, etc.) ainsi qu’une prévision des données sur une année.

Voici un excellent article à ce propos et le lien vers mon repository GitHub du projet.

Conclusion

Cette formation a tout changé pour moi. Elle a complètement chamboulé mes perspectives et m’a permis de révéler mon goût prononcé pour les mathématiques. J’ai pu découvrir les statistiques, les bases du machine learning, faire un stage en recherche.

Bien entendu le format ne correspondra peut-être pas à tout le monde. De plus le contenu et les projets vont continuer d’évoluer, donc ne vous fiez pas uniquement à ce que j’ai pu décrire ici. Enfin, peut-être que certains trouveront la formation trop théorique, d’autres au contraire pas assez.

Pour ma part j’aime beaucoup le choix qu’a fait OpenClassrooms d’orienter la formation vers des projets qui posent les fondamentaux de la data science et de l’analyse statistique plutôt que vers la préparation à un travail d’expert BI, même si la mise en pratique de la théorie pure est parfois absente. Cela aurait été par exemple intéressant d’implémenter une PCA ou un algorithme de régression à la main.

Je rédigerai d’autres articles bientôt pour parler de mon stage réalisé durant la formation, des cours en ligne hors OpenClassrooms qui me permettent de progresser encore aujourd’hui (je pense principalement aux cours d’Andrew Ng <3) et enfin pour parler de mon Master en ligne CentraleSupelec / OpenClassrooms que je viens de commencer 🙂

Pour toutes questions / retours, n’hésitez pas à commenter, à m’envoyer un email ou à me contacter sur Twitter / LinkedIn.

Réaliser un test d’indépendance Chi2 en Python avec scipy.stats

Test d’indépendance Khi2

Ici, je vais montrer comment réaliser un test du Chi2 avec deux variables qualitatives grâce à scipy.stats.chi2_contingency

Analalyse exploratoire

En introduction, j’aimerais vous renvoyer vers l’excellent cours de Nicolas Rangeon qui explique les étapes suivantes :

A partir de deux variables qualitatives, comment :

  1. Construire un tableau de contingence (matrice des valeurs observées)
  2. Construire la matrice des fréquences attendues grâce aux sommes marginales
  3. Construire la matrice des écarts au carré normalisés
  4. Transformer cette dernière matrice en heatmap grâce à seaborn

Il s’agit donc d’une analyse exploratoire permettant de :

  1. Comprendre comment est calculée la statistique khi-2
  2. Mettre en avant les fortes corrélations pour certaines valeurs de nos deux variables.

Test statistique

Bien ! Passons désormais au test d’indépendance pour savoir si nos deux variables sont corrélées ou non. Avant cela, quelques remarques sur la première partie :

La somme totale des valeurs de la matrice de la troisième étape suit une loi du khi-2 à k degrés de liberté. D’après la documentation de SciPy, voici comment est calculé le nombre k :

1
k = observed.size - sum(observed.shape) + observed.ndim - 1

Où observed est le tableau de contingence (matrice de la première étape).

Ici, scipy va (presque) tout faire pour nous. Nous allons nous contenter de réaliser l’étape n°1 de la première partie, à savoir la construction du tableau de contingence. Une fois cette matrice obtenue, scipy va faire le travail.

Les données

Je me contente de reprendre l’exemple utilisé par Nicolas Rangeon dans le cours linké dans la première partie. Il s’agit d’une liste d’individus, pour lesquels on connait deux informations :

Dans quel bar ils ont consommé (nom du bar)
Quelle boisson ont-ils consommé dans ce bar (Café, Thé ou autre).

Voici le code que j’ai écrit pour générer le jeu de données :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
X = ["Chez Luc"]*10
X.extend(["Au café Dembas"]*20)
X.extend(["Au café Ducoing"]*40)
X.extend(["Chez Sarah"]*30)
 
Y = ["Café"]*1
Y.extend(["Thé"]*9)
Y.extend(["Autre"]*0)
 
Y.extend(["Café"]*9)
Y.extend(["Thé"]*6)
Y.extend(["Autre"]*5)
 
Y.extend(["Café"]*20)
Y.extend(["Thé"]*10)
Y.extend(["Autre"]*10)
 
Y.extend(["Café"]*20)
Y.extend(["Thé"]*5)
Y.extend(["Autre"]*5)
 
data = {
    'bar':X,
    'boisson':Y
}
df = pd.DataFrame(data)

Voici le .head() obtenu :

L’idée est simplement d’avoir deux listes de valeurs qualitatives. Chaque ligne doit correspondre à un couple de valeurs.

Générer le tableau de contingence

Ici, on reprend la méthode utilisée dans l’analyse exploratoire (première partie), à savoir :

1
2
3
X = "bar"
Y = "boisson"
cont = df[[X, Y]].pivot_table(index=X, columns=Y, aggfunc=len).fillna(0).copy().astype(int)

En fait c’est très simple, on utilise la méthode pivot_table pour obtenir notre tableau de contingence. J’en profite au passage pour remplacer les valeurs nulles par des zéro, je crée une copie du dataframe original et je m’assure de tout convertir en int.

Et c’est tout ce qu’on a à faire ! Dans la première partie, à ce stade on calcule les sommes marginales grâce à la méthode value_counts(), mais ici pas besoin. Notre matrice des valeurs observées est prête, on a plus qu’à la soumettre à scipy.stats.chi2_contingency. Voici à quoi elle resemble dans notre cas :

Calcul de la p-value

En une ligne, le tour est joué :

1
st_chi2, st_p, st_dof, st_exp = st.chi2_contingency(cont)

Voici les valeurs récupérées :

1
2
3
4
5
6
7
8
# Statistique khi2, calculée à la main dans la première partie
st_chi2 = 21.99
 
# Nombe de degrés de liberté
st_dof = 6
 
# Pvalue : l'unique valeur nécessaire pour prendre notre décision
st_p = 0.00121

On récupère également dans st_exp le tableau des fréquences attendues, que l’on calcule manuellement dans la première partie.

Ce qui nous intéresse ici, c’est la variable st_p, qui contient la pvalue. Celle-ci est calculée par scipy de la manière suivante :

  1. Calcul de la stat khi2
  2. Calcul du nombre de degrés de liberté k
  3. Calcul de la loi à densité suivie par une loi khi2 à k degrés de liberté
  4. Confrontation de la stat khi2 calculée avec la loi à densité obtenue

L’hypothèse nulle est que les variables sont indépendantes. La p-valeur nous indique quelle probabilité (matérialisée par l’aire sous la courbe de la loi à densité) représente les valeurs encore plus éloignées que celle obtenue.

Test au seuil de 1%

Rejetons l’hypothèse nulle au seuil de 1%, donc pour une pvaleur inférieure à 0.01.

Dans notre cas, la pvaleur obtenue par notre échantillon est de 0.00121, ce qui est en dessous du seuil fixé. On peut donc rejeter l’hypothèse nulle. Les variables « nom du bar » et « boisson consommée » ne sont pas indépendantes. Ceci confirme ce qu’on aurait pu intuitivement deviner dans notre cas, juste avec l’analyse exploratoire.

Voici un notebook sur lequel vous trouverez l’ensemble du code :Test-du-khi2