Bienvenue dans cet atelier pratique dédié à l’analyse bivariée. L’objectif est de dépasser l’analyse d’une seule variable pour explorer les relations entre deux variables. Comprendre ces relations est la première étape vers la modélisation statistique et le machine learning.
1.1 Objectifs Pédagogiques
À la fin de cet atelier, vous serez capable de :
Choisir la méthode statistique et la visualisation appropriées en fonction du type des deux variables analysées.
Mener une analyse bivariée pour les trois cas de figure :
Qualitative vs. Qualitative
Quantitative vs. Qualitative
Quantitative vs. Quantitative
Calculer et interpréter des indicateurs clés comme le Chi-carré, le V de Cramer et le coefficient de corrélation.
Produire des visualisations parlantes pour communiquer vos résultats.
1.2 Le Jeu de Données : Satisfaction des Employés
Pour cet atelier, nous utiliserons un jeu de données simulé sur la satisfaction des employés d’une entreprise fictive, “Innovatech”.
Nos variables sont :
departement (Qualitative): Le département de l’employé (ex: ‘RH’, ‘IT’, ‘Vente’).
niveau_satisfaction (Qualitative ordinale): Le niveau de satisfaction déclaré (ex: ‘Faible’, ‘Moyen’, ‘Élevé’).
genre (Qualitative): Le genre de l’employé.
salaire_annuel (Quantitative): Le salaire annuel brut en euros.
anciennete_annees (Quantitative): Le nombre d’années passées dans l’entreprise.
1.3 Préparation de l’Environnement
Nous utiliserons Python avec les bibliothèques pandas, seaborn, matplotlib et scipy. Exécutez la cellule suivante pour charger les outils et créer le jeu de données.
Code
import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltfrom scipy.stats import chi2_contingency, pearsonr# Création du jeu de donnéesnp.random.seed(42)n =500data = pd.DataFrame({'departement': np.random.choice(['IT', 'Vente', 'RH', 'Marketing'], n, p=[0.3, 0.4, 0.1, 0.2]),'niveau_satisfaction': np.random.choice(['Faible', 'Moyen', 'Élevé'], n, p=[0.2, 0.5, 0.3]),'genre': np.random.choice(['Homme', 'Femme'], n, p=[0.55, 0.45]),'salaire_annuel': np.random.normal(55000, 15000, n).clip(25000, 120000),'anciennete_annees': np.random.normal(5, 3, n).clip(0, 25)})# Ajustements pour rendre les données plus réalistes# Les salaires en Vente et IT sont plus élevésdata.loc[data['departement'] =='Vente', 'salaire_annuel'] *=1.2data.loc[data['departement'] =='IT', 'salaire_annuel'] *=1.15data.loc[data['departement'] =='RH', 'salaire_annuel'] *=0.9# La satisfaction est liée au salairehigh_salary_mask = data['salaire_annuel'] >60000data.loc[high_salary_mask, 'niveau_satisfaction'] = np.random.choice(['Moyen', 'Élevé'], size=high_salary_mask.sum(), p=[0.4, 0.6])# Mettre de l'ordre dans la variable de satisfactiondata['niveau_satisfaction'] = pd.Categorical( data['niveau_satisfaction'], categories=['Faible', 'Moyen', 'Élevé'], ordered=True)print("Aperçu du jeu de données :")data.head()
2 Partie 1 : Qualitative vs. Qualitative
Question de recherche : Le niveau de satisfaction des employés est-il indépendant de leur département ?
2.1 Méthodologie
Tableau de contingence : Croiser les deux variables pour voir les effectifs.
Visualisation : Diagramme en barres empilées (100%) pour comparer les proportions.
Test statistique : Test du Chi-carré (\(\\chi^2\)) pour l’indépendance.
Mesure de la force : V de Cramer pour quantifier la force de l’association.
2.2 Votre Tâche
Exécutez et interprétez le code ci-dessous.
Code
# 1. Tableau de contingencecontingency_table = pd.crosstab(data['departement'], data['niveau_satisfaction'])print("--- Tableau de Contingence ---")print(contingency_table)# 2. Visualisationcontingency_table.apply(lambda r: r/r.sum()*100, axis=1).plot( kind='bar', stacked=True, figsize=(12, 7), colormap='viridis', title='Proportion de Satisfaction par Département').legend(title='Satisfaction', bbox_to_anchor=(1.0, 1.0))plt.ylabel("Pourcentage (%)")plt.xlabel("Département")plt.xticks(rotation=0)plt.show()# 3. Test du Chi-carréchi2, p_value, dof, expected = chi2_contingency(contingency_table)print(f"\n--- Test Statistique ---")print(f"Statistique du Chi-carré (χ²): {chi2:.2f}")print(f"P-value: {p_value:.4f}")# 4. V de Cramern_obs = contingency_table.sum().sum()min_dim =min(contingency_table.shape) -1v_cramer = np.sqrt(chi2 / (n_obs * min_dim))print(f"Force de l'association (V de Cramer): {v_cramer:.3f}")
Questions d’interprétation
Le graphique montre-t-il des différences visibles dans la répartition de la satisfaction entre les départements ? Lequel semble le plus/le moins satisfait ?
Sur la base de la p-value, peut-on conclure à une association statistiquement significative ?
Que nous dit la valeur du V de Cramer sur la force de ce lien ?
3 Partie 2 : Quantitative vs. Qualitative
Question de recherche : Le salaire annuel moyen diffère-t-il significativement entre les départements ?
3.1 Méthodologie
Statistiques descriptives par groupe : Calculer la moyenne, médiane, écart-type, etc., du salaire pour chaque département.
Visualisation : Boîtes à moustaches (Box Plots) ou Diagrammes en violon (Violin Plots) pour comparer les distributions.
3.2 Votre Tâche
Exécutez et analysez les résultats.
Code
# 1. Statistiques descriptives par groupeprint("--- Salaire Annuel par Département ---")summary_salary = data.groupby('departement')['salaire_annuel'].describe()print(summary_salary)# 2. Visualisationplt.figure(figsize=(14, 8))sns.violinplot( x='departement', y='salaire_annuel', data=data, palette='magma', order=['RH', 'Marketing', 'IT', 'Vente'] # Ordonner pour une meilleure lecture)plt.title('Distribution du Salaire Annuel par Département', fontsize=16)plt.xlabel('Département')plt.ylabel('Salaire Annuel (€)')plt.show()
Questions d’interprétation
Quels départements ont la moyenne et la médiane de salaire les plus élevées ?
La dispersion (variabilité) des salaires, visible dans la forme des violons, semble-t-elle la même pour tous les départements ?
Les graphiques révèlent-ils des valeurs potentiellement aberrantes (des points très éloignés du corps principal du violon) ?
4 Partie 3 : Quantitative vs. Quantitative
Question de recherche : Existe-t-il une relation entre l’ancienneté d’un employé et son salaire annuel ?
4.1 Méthodologie
Visualisation : Nuage de points (Scatter Plot) pour visualiser la forme de la relation.
Mesure de la force et de la direction : Coefficient de corrélation de Pearson (\(r\)) pour quantifier la relation linéaire.
4.2 Votre Tâche
Exécutez le code et interprétez le nuage de points et le coefficient de corrélation.
Code
# 1. Visualisation avec droite de régressionplt.figure(figsize=(12, 8))sns.regplot( x='anciennete_annees', y='salaire_annuel', data=data, scatter_kws={'alpha':0.5, 'color': 'indigo'}, line_kws={'color': 'red'})plt.title('Relation entre Ancienneté et Salaire Annuel', fontsize=16)plt.xlabel('Ancienneté (années)')plt.ylabel('Salaire Annuel (€)')plt.grid(True)plt.show()# 2. Calcul du coefficient de corrélation de Pearsoncorrelation, p_value_corr = pearsonr(data['anciennete_annees'], data['salaire_annuel'])print(f"\n--- Mesure de la Corrélation ---")print(f"Coefficient de corrélation de Pearson (r): {correlation:.3f}")print(f"P-value associée: {p_value_corr:.4f}")
Questions d’interprétation
Le nuage de points suggère-t-il une tendance ? Est-elle positive (le salaire augmente avec l’ancienneté) ou négative ?
La relation semble-t-elle forte ou faible ? Les points sont-ils proches de la ligne de régression ou très dispersés ?
Comment la valeur du coefficient de corrélation de Pearson confirme-t-elle (ou infirme-t-elle) votre impression visuelle ?
Une corrélation implique-t-elle une causalité ? Pourquoi ou pourquoi pas ?
5 Conclusion de l’Atelier
Félicitations! Vous avez exploré les trois facettes de l’analyse bivariée. Vous disposez maintenant des outils fondamentaux pour commencer à explorer les relations dans n’importe quel jeu de données, une compétence essentielle pour des analyses plus poussées en data mining ou en machine learning.
---title: "Atelier Pratique : Maîtriser l'Analyse Bivariée"order: 4categories: [Analyse bivariée, Statistiques descriptives, Python, Pandas]image: ../../images/atelier-pratique.jpgexecute: echo: true eval: false warning: false message: falsecode-fold: truecode-tools: true---{fig-align="center"}## Introduction à l'AtelierBienvenue dans cet atelier pratique dédié à l'analyse bivariée. L'objectif est de dépasser l'analyse d'une seule variable pour explorer les **relations entre deux variables**. Comprendre ces relations est la première étape vers la modélisation statistique et le machine learning.### Objectifs PédagogiquesÀ la fin de cet atelier, vous serez capable de :1. **Choisir la méthode statistique et la visualisation appropriées** en fonction du type des deux variables analysées.2. **Mener une analyse bivariée** pour les trois cas de figure : - Qualitative vs. Qualitative - Quantitative vs. Qualitative - Quantitative vs. Quantitative3. **Calculer et interpréter** des indicateurs clés comme le Chi-carré, le V de Cramer et le coefficient de corrélation.4. **Produire des visualisations parlantes** pour communiquer vos résultats.### Le Jeu de Données : Satisfaction des EmployésPour cet atelier, nous utiliserons un jeu de données simulé sur la satisfaction des employés d'une entreprise fictive, "Innovatech".Nos variables sont :- `departement` (Qualitative): Le département de l'employé (ex: 'RH', 'IT', 'Vente').- `niveau_satisfaction` (Qualitative ordinale): Le niveau de satisfaction déclaré (ex: 'Faible', 'Moyen', 'Élevé').- `genre` (Qualitative): Le genre de l'employé.- `salaire_annuel` (Quantitative): Le salaire annuel brut en euros.- `anciennete_annees` (Quantitative): Le nombre d'années passées dans l'entreprise.### Préparation de l'EnvironnementNous utiliserons Python avec les bibliothèques `pandas`, `seaborn`, `matplotlib` et `scipy`. Exécutez la cellule suivante pour charger les outils et créer le jeu de données.```{python}#| label: setup#| echo: trueimport pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltfrom scipy.stats import chi2_contingency, pearsonr# Création du jeu de donnéesnp.random.seed(42)n =500data = pd.DataFrame({'departement': np.random.choice(['IT', 'Vente', 'RH', 'Marketing'], n, p=[0.3, 0.4, 0.1, 0.2]),'niveau_satisfaction': np.random.choice(['Faible', 'Moyen', 'Élevé'], n, p=[0.2, 0.5, 0.3]),'genre': np.random.choice(['Homme', 'Femme'], n, p=[0.55, 0.45]),'salaire_annuel': np.random.normal(55000, 15000, n).clip(25000, 120000),'anciennete_annees': np.random.normal(5, 3, n).clip(0, 25)})# Ajustements pour rendre les données plus réalistes# Les salaires en Vente et IT sont plus élevésdata.loc[data['departement'] =='Vente', 'salaire_annuel'] *=1.2data.loc[data['departement'] =='IT', 'salaire_annuel'] *=1.15data.loc[data['departement'] =='RH', 'salaire_annuel'] *=0.9# La satisfaction est liée au salairehigh_salary_mask = data['salaire_annuel'] >60000data.loc[high_salary_mask, 'niveau_satisfaction'] = np.random.choice(['Moyen', 'Élevé'], size=high_salary_mask.sum(), p=[0.4, 0.6])# Mettre de l'ordre dans la variable de satisfactiondata['niveau_satisfaction'] = pd.Categorical( data['niveau_satisfaction'], categories=['Faible', 'Moyen', 'Élevé'], ordered=True)print("Aperçu du jeu de données :")data.head()```## Partie 1 : Qualitative vs. Qualitative**Question de recherche :** Le niveau de satisfaction des employés est-il indépendant de leur département ?### Méthodologie1. **Tableau de contingence** : Croiser les deux variables pour voir les effectifs.2. **Visualisation** : Diagramme en barres empilées (100%) pour comparer les proportions.3. **Test statistique** : Test du Chi-carré ($\\chi^2$) pour l'indépendance.4. **Mesure de la force** : V de Cramer pour quantifier la force de l'association.### Votre TâcheExécutez et interprétez le code ci-dessous.```{python}#| label: qual-vs-qual#| echo: true# 1. Tableau de contingencecontingency_table = pd.crosstab(data['departement'], data['niveau_satisfaction'])print("--- Tableau de Contingence ---")print(contingency_table)# 2. Visualisationcontingency_table.apply(lambda r: r/r.sum()*100, axis=1).plot( kind='bar', stacked=True, figsize=(12, 7), colormap='viridis', title='Proportion de Satisfaction par Département').legend(title='Satisfaction', bbox_to_anchor=(1.0, 1.0))plt.ylabel("Pourcentage (%)")plt.xlabel("Département")plt.xticks(rotation=0)plt.show()# 3. Test du Chi-carréchi2, p_value, dof, expected = chi2_contingency(contingency_table)print(f"\n--- Test Statistique ---")print(f"Statistique du Chi-carré (χ²): {chi2:.2f}")print(f"P-value: {p_value:.4f}")# 4. V de Cramern_obs = contingency_table.sum().sum()min_dim =min(contingency_table.shape) -1v_cramer = np.sqrt(chi2 / (n_obs * min_dim))print(f"Force de l'association (V de Cramer): {v_cramer:.3f}")```::: {.callout-tip title="Questions d'interprétation"}1. Le graphique montre-t-il des différences visibles dans la répartition de la satisfaction entre les départements ? Lequel semble le plus/le moins satisfait ?2. Sur la base de la p-value, peut-on conclure à une association statistiquement significative ?3. Que nous dit la valeur du V de Cramer sur la force de ce lien ?:::## Partie 2 : Quantitative vs. Qualitative**Question de recherche :** Le salaire annuel moyen diffère-t-il significativement entre les départements ?### Méthodologie1. **Statistiques descriptives par groupe** : Calculer la moyenne, médiane, écart-type, etc., du salaire pour chaque département.2. **Visualisation** : Boîtes à moustaches (Box Plots) ou Diagrammes en violon (Violin Plots) pour comparer les distributions.### Votre TâcheExécutez et analysez les résultats.```{python}#| label: quant-vs-qual#| echo: true# 1. Statistiques descriptives par groupeprint("--- Salaire Annuel par Département ---")summary_salary = data.groupby('departement')['salaire_annuel'].describe()print(summary_salary)# 2. Visualisationplt.figure(figsize=(14, 8))sns.violinplot( x='departement', y='salaire_annuel', data=data, palette='magma', order=['RH', 'Marketing', 'IT', 'Vente'] # Ordonner pour une meilleure lecture)plt.title('Distribution du Salaire Annuel par Département', fontsize=16)plt.xlabel('Département')plt.ylabel('Salaire Annuel (€)')plt.show()```::: {.callout-tip title="Questions d'interprétation"}1. Quels départements ont la moyenne et la médiane de salaire les plus élevées ?2. La dispersion (variabilité) des salaires, visible dans la forme des violons, semble-t-elle la même pour tous les départements ?3. Les graphiques révèlent-ils des valeurs potentiellement aberrantes (des points très éloignés du corps principal du violon) ?:::## Partie 3 : Quantitative vs. Quantitative**Question de recherche :** Existe-t-il une relation entre l'ancienneté d'un employé et son salaire annuel ?### Méthodologie1. **Visualisation** : Nuage de points (Scatter Plot) pour visualiser la forme de la relation.2. **Mesure de la force et de la direction** : Coefficient de corrélation de Pearson ($r$) pour quantifier la relation linéaire.### Votre TâcheExécutez le code et interprétez le nuage de points et le coefficient de corrélation.```{python}#| label: quant-vs-quant#| echo: true# 1. Visualisation avec droite de régressionplt.figure(figsize=(12, 8))sns.regplot( x='anciennete_annees', y='salaire_annuel', data=data, scatter_kws={'alpha':0.5, 'color': 'indigo'}, line_kws={'color': 'red'})plt.title('Relation entre Ancienneté et Salaire Annuel', fontsize=16)plt.xlabel('Ancienneté (années)')plt.ylabel('Salaire Annuel (€)')plt.grid(True)plt.show()# 2. Calcul du coefficient de corrélation de Pearsoncorrelation, p_value_corr = pearsonr(data['anciennete_annees'], data['salaire_annuel'])print(f"\n--- Mesure de la Corrélation ---")print(f"Coefficient de corrélation de Pearson (r): {correlation:.3f}")print(f"P-value associée: {p_value_corr:.4f}")```::: {.callout-tip title="Questions d'interprétation"}1. Le nuage de points suggère-t-il une tendance ? Est-elle positive (le salaire augmente avec l'ancienneté) ou négative ?2. La relation semble-t-elle forte ou faible ? Les points sont-ils proches de la ligne de régression ou très dispersés ?3. Comment la valeur du coefficient de corrélation de Pearson confirme-t-elle (ou infirme-t-elle) votre impression visuelle ?4. Une corrélation implique-t-elle une causalité ? Pourquoi ou pourquoi pas ?:::## Conclusion de l'AtelierFélicitations! Vous avez exploré les trois facettes de l'analyse bivariée. Vous disposez maintenant des outils fondamentaux pour commencer à explorer les relations dans n'importe quel jeu de données, une compétence essentielle pour des analyses plus poussées en data mining ou en machine learning.