3h00M11

📊 Module 11 — Statistiques descriptives avec R & Python

Acte IV — R & Python pour l'analyse de données
Niveau : Débutant · Durée estimée : 3h00



🎯 Objectifs du module

À la fin de ce module, tu sauras :

  • Charger un fichier CSV/Excel avec pandas (Python) et base R
  • Calculer les indicateurs statistiques clés : moyenne, médiane, écart-type, quartiles
  • Comprendre et interpréter chaque indicateur
  • Détecter les valeurs aberrantes (outliers)
  • Comparer des groupes avec groupby (Python) et group_by (R)
  • Produire un résumé statistique complet d'un dataset

🌍 Mise en contexte — Bamba & Associés, Abidjan

Kouassi Ama a maintenant Python et R installés. M. Bamba lui confie le fichier RH des 35 employés :

"Ama, j'ai besoin d'un rapport statistique sur nos salaires. Qui gagne quoi ? Quelles sont les disparités entre départements ? Y a-t-il des salaires anormaux ?"

C'est exactement ce que les statistiques descriptives permettent de faire — rapidement, rigoureusement, et de façon reproductible.



1. Les indicateurs statistiques essentiels

1.1 Les indicateurs de tendance centrale

Ils répondent à la question : "Quelle est la valeur typique ?"

Indicateur Définition Quand l'utiliser
Moyenne Somme / Nombre de valeurs Distribution symétrique, sans outliers
Médiane Valeur du milieu quand on trie Distribution asymétrique, avec outliers
Mode Valeur la plus fréquente Variables catégorielles (ex : département)

Exemple concret — salaires Bamba & Associés :

Salaires (FCFA) : 300 000 · 350 000 · 380 000 · 420 000 · 1 800 000

Moyenne  = (300 000 + 350 000 + 380 000 + 420 000 + 1 800 000) / 5
         = 3 250 000 / 5 = 650 000 FCFA

Médiane  = 380 000 FCFA  (valeur du milieu après tri)

⚠️ La moyenne (650 000) est tirée vers le haut par le salaire de 1 800 000.
La médiane (380 000) représente mieux la réalité de l'équipe.
Règle : quand moyenne ≠ médiane, il y a probablement des outliers.

1.2 Les indicateurs de dispersion

Ils répondent à : "Les valeurs sont-elles proches ou dispersées ?"

Indicateur Définition Interprétation
Étendue Max − Min Plage totale des valeurs
Variance Moyenne des écarts² à la moyenne Rarement utilisée directement
Écart-type √Variance Dispersion autour de la moyenne (même unité)
Quartiles Q1/Q3 25e et 75e percentile Encadrement des 50% centraux
IQR Q3 − Q1 Dispersion des 50% centraux (robuste aux outliers)

Exemple :

Équipe A — salaires : 400 000 · 410 000 · 420 000 · 430 000 · 440 000
Équipe B — salaires : 200 000 · 300 000 · 420 000 · 550 000 · 680 000

Moyenne A = Moyenne B = 420 000 FCFA  ← identiques !
Écart-type A ≈  15 811 FCFA           ← équipe très homogène
Écart-type B ≈ 183 848 FCFA           ← équipe très disparate

Même moyenne, mais des réalités très différentes. L'écart-type révèle ce que la moyenne cache.

1.3 Les quartiles et la boîte à moustaches

Données triées : 300k · 350k · 380k · 420k · 450k · 480k · 520k · 560k · 600k · 650k · 1 800k

Q1  (25%) = 380 000   ← 25% des employés gagnent moins
Q2  (50%) = 480 000   ← médiane
Q3  (75%) = 560 000   ← 75% des employés gagnent moins
IQR       = Q3 - Q1 = 180 000

Seuil outlier bas  = Q1 - 1.5 × IQR = 380k - 270k = 110 000
Seuil outlier haut = Q3 + 1.5 × IQR = 560k + 270k = 830 000

→ 1 800 000 > 830 000  : c'est un outlier !


2. Le dataset — Fichier RH Bamba & Associés

On travaille sur un extrait du fichier RH (15 employés) :

Nom Département Contrat Salaire (FCFA) Ancienneté (ans)
Kouassi Ama RH CDI 450 000 5
Kouamé Jean Finance CDI 620 000 8
Traoré Seydou Commercial CDI 380 000 3
Diabaté Fatou RH CDD 310 000 1
Bamba Koné Direction CDI 1 800 000 12
Ouédraogo Moussa IT CDI 580 000 6
Soro Aminata Commercial Stage 180 000 0
Koné Ibrahim Finance CDI 540 000 7
Yao Adjoua IT CDI 610 000 9
Diallo Mamadou Commercial CDD 340 000 2
Coulibaly Assata RH CDI 420 000 4
N'Guessan Éric Finance CDI 590 000 7
Touré Mariam IT Stage 200 000 0
Keita Souleymane Commercial CDI 360 000 3
Fofana Raïssa Direction CDI 950 000 10

Statistiques clés (vérifiées) :

Indicateur Valeur
Effectif 15
Masse salariale totale 8 330 000 FCFA
Salaire moyen 555 333 FCFA
Salaire médian 540 000 FCFA
Salaire minimum 180 000 FCFA
Salaire maximum 1 800 000 FCFA
Écart-type 393 215 FCFA
Q1 (25%) 360 000 FCFA
Q3 (75%) 610 000 FCFA

Ces chiffres sont les résultats attendus — tu peux vérifier tes calculs contre eux.



3. Statistiques descriptives en Python

3.1 Créer le DataFrame

pythonimport pandas as pd

data = {
    "nom": ["Kouassi Ama", "Kouamé Jean", "Traoré Seydou", "Diabaté Fatou",
            "Bamba Koné", "Ouédraogo Moussa", "Soro Aminata", "Koné Ibrahim",
            "Yao Adjoua", "Diallo Mamadou", "Coulibaly Assata", "N'Guessan Éric",
            "Touré Mariam", "Keita Souleymane", "Fofana Raïssa"],
    "departement": ["RH", "Finance", "Commercial", "RH", "Direction",
                    "IT", "Commercial", "Finance", "IT", "Commercial",
                    "RH", "Finance", "IT", "Commercial", "Direction"],
    "contrat": ["CDI", "CDI", "CDI", "CDD", "CDI", "CDI", "Stage", "CDI",
                "CDI", "CDD", "CDI", "CDI", "Stage", "CDI", "CDI"],
    "salaire": [450000, 620000, 380000, 310000, 1800000, 580000, 180000,
                540000, 610000, 340000, 420000, 590000, 200000, 360000, 950000],
    "anciennete": [5, 8, 3, 1, 12, 6, 0, 7, 9, 2, 4, 7, 0, 3, 10]
}

df = pd.DataFrame(data)
print(df.shape)   # (15, 5) → 15 lignes, 5 colonnes
df.head()

3.2 Premier aperçu

python# Infos générales
df.info()
# RangeIndex: 15 entries, 0 to 14
# Data columns (total 5 columns):
#  nom           15 non-null  object
#  departement   15 non-null  object
#  contrat       15 non-null  object
#  salaire       15 non-null  int64
#  anciennete    15 non-null  int64

# Résumé statistique automatique
df.describe()
#         salaire    anciennete
# count      15.0          15.0
# mean   555333.3           5.1
# std    393215.0           3.6
# min    180000.0           0.0
# 25%    360000.0           2.5
# 50%    540000.0           5.0
# 75%    610000.0           8.0
# max   1800000.0          12.0

3.3 Calculs individuels

python# Indicateurs de tendance centrale
print(f"Moyenne   : {df['salaire'].mean():,.0f} FCFA")
# → Moyenne   : 555,333 FCFA

print(f"Médiane   : {df['salaire'].median():,.0f} FCFA")
# → Médiane   : 540,000 FCFA

print(f"Mode      : {df['departement'].mode()[0]}")
# → Mode      : Commercial

# Indicateurs de dispersion
print(f"Écart-type : {df['salaire'].std():,.0f} FCFA")
# → Écart-type : 393,215 FCFA

print(f"Min       : {df['salaire'].min():,.0f} FCFA")
print(f"Max       : {df['salaire'].max():,.0f} FCFA")
# → Min       : 180,000 FCFA
# → Max       : 1,800,000 FCFA

# Quartiles
q1 = df['salaire'].quantile(0.25)
q3 = df['salaire'].quantile(0.75)
iqr = q3 - q1
print(f"Q1  : {q1:,.0f} FCFA")
print(f"Q3  : {q3:,.0f} FCFA")
print(f"IQR : {iqr:,.0f} FCFA")
# → Q1  : 360,000 FCFA
# → Q3  : 610,000 FCFA
# → IQR : 250,000 FCFA

3.4 Analyse par groupe (groupby)

python# Salaire moyen par département
df.groupby('departement')['salaire'].mean().sort_values(ascending=False)
# departement
# Direction     1375000.0
# Finance        583333.3
# IT             463333.3
# RH             393333.3
# Commercial     315000.0

# Plusieurs indicateurs à la fois
df.groupby('departement')['salaire'].agg(['mean', 'median', 'min', 'max', 'count'])
#                   mean    median     min      max  count
# departement
# Commercial    315000.0  360000.0  180000   380000      4
# Direction    1375000.0  1375000.0  950000  1800000      2
# Finance       583333.3  580000.0  540000   620000      3
# IT            463333.3  580000.0  200000   610000      3
# RH            393333.3  420000.0  310000   450000      3

# Répartition par type de contrat
df['contrat'].value_counts()
# CDI      10
# CDD       3
# Stage     2

3.5 Détecter les outliers

python# Règle IQR : outlier si < Q1 - 1.5*IQR ou > Q3 + 1.5*IQR
seuil_bas  = q1 - 1.5 * iqr
seuil_haut = q3 + 1.5 * iqr

print(f"Seuil bas  : {seuil_bas:,.0f} FCFA")
print(f"Seuil haut : {seuil_haut:,.0f} FCFA")
# → Seuil bas  : -15,000 FCFA   (aucun outlier bas)
# → Seuil haut : 985,000 FCFA

outliers = df[df['salaire'] > seuil_haut]
print(outliers[['nom', 'departement', 'salaire']])
#          nom  departement  salaire
# 4  Bamba Koné    Direction  1800000


3b. Résumés rapides — les packages EDA

En pratique, les Data Analysts utilisent des packages qui génèrent un rapport complet en une seule ligne de code, sans avoir à calculer chaque indicateur à la main.

Les 3 packages incontournables

Package Résultat Installation
ydata-profiling Rapport HTML interactif complet pip install ydata-profiling
sweetviz Rapport HTML visuel (comparaison possible) pip install sweetviz
skimpy Résumé console compact (style R's skimr) pip install skimpy

ydata-profiling — Le plus complet

Génère un rapport HTML avec : statistiques, distributions, corrélations, valeurs manquantes, outliers.

pythonpip install ydata-profiling
pythonfrom ydata_profiling import ProfileReport

rapport = ProfileReport(df, title="RH Bamba & Associés")
rapport.to_file("rapport_rh.html")   # sauvegarde en HTML
# ou dans Jupyter :
rapport.to_notebook_iframe()          # affiche directement dans le notebook

Ce que le rapport contient automatiquement :

  • Aperçu général (nb lignes, colonnes, valeurs manquantes, doublons)
  • Pour chaque colonne numérique : moyenne, médiane, écart-type, min, max, Q1, Q3, histogramme
  • Pour chaque colonne catégorielle : fréquences, valeurs uniques, graphique à barres
  • Matrice de corrélations
  • Détection des outliers et des valeurs extrêmes

sweetviz — Le plus visuel

pythonpip install sweetviz
pythonimport sweetviz as sv

rapport = sv.analyze(df)
rapport.show_html("sweetviz_rh.html")

Avantage unique : comparer deux sous-datasets en un coup d'œil.

python# Comparer CDI vs CDD
df_cdi = df[df['contrat'] == 'CDI']
df_cdd = df[df['contrat'] == 'CDD']

rapport = sv.compare([df_cdi, "CDI"], [df_cdd, "CDD"])
rapport.show_html("comparaison_contrats.html")

skimpy — Le plus rapide (dans le terminal)

pythonpip install skimpy
pythonfrom skimpy import skim

skim(df)

Résultat dans la console (inspiré de summary() en R) :

╭──────────────────────────────────────── skimpy summary ─────────────────────────────────────────╮
│         Data Summary         │
│ dataframe shape:   (15, 5)   │
│ Missing values:    0         │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯

numeric
┌────────────┬───────┬──────────┬────────┬────────┬──────────┬────────────┬────────────┐
│ column     │ count │     mean │    std │    min │   median │         Q1 │         Q3 │
├────────────┼───────┼──────────┼────────┼────────┼──────────┼────────────┼────────────┤
│ salaire    │    15 │ 555 333  │ 393 215│ 180 000│  540 000 │    360 000 │    610 000 │
│ anciennete │    15 │       5.1│     3.6│       0│        5 │        2.5 │          8 │
└────────────┴───────┴──────────┴────────┴────────┴──────────┴────────────┴────────────┘

Quand utiliser quoi ?

Situation Package recommandé
Première exploration d'un nouveau dataset ydata-profiling
Présentation client / rapport à partager sweetviz
Vérification rapide dans le terminal skimpy
Contrôle précis indicateur par indicateur pandas (.describe(), .groupby())

💡 Workflow typique d'un DA :

  1. ydata-profiling pour comprendre le dataset en 2 minutes
  2. pandas pour les analyses ciblées et calculs spécifiques
  3. Graphiques (M12) pour communiquer les résultats


4. Statistiques descriptives en R

4.1 Créer le data frame

rdf <- data.frame(
  nom = c("Kouassi Ama", "Kouamé Jean", "Traoré Seydou", "Diabaté Fatou",
          "Bamba Koné", "Ouédraogo Moussa", "Soro Aminata", "Koné Ibrahim",
          "Yao Adjoua", "Diallo Mamadou", "Coulibaly Assata", "N'Guessan Éric",
          "Touré Mariam", "Keita Souleymane", "Fofana Raïssa"),
  departement = c("RH", "Finance", "Commercial", "RH", "Direction",
                  "IT", "Commercial", "Finance", "IT", "Commercial",
                  "RH", "Finance", "IT", "Commercial", "Direction"),
  contrat = c("CDI", "CDI", "CDI", "CDD", "CDI", "CDI", "Stage", "CDI",
              "CDI", "CDD", "CDI", "CDI", "Stage", "CDI", "CDI"),
  salaire = c(450000, 620000, 380000, 310000, 1800000, 580000, 180000,
              540000, 610000, 340000, 420000, 590000, 200000, 360000, 950000),
  anciennete = c(5, 8, 3, 1, 12, 6, 0, 7, 9, 2, 4, 7, 0, 3, 10)
)

dim(df)      # 15  5
head(df, 3)

4.2 Résumé automatique

rsummary(df)
#     salaire         anciennete
# Min.   : 180000   Min.   : 0.0
# 1st Qu.: 360000   1st Qu.: 2.5
# Median : 540000   Median : 5.0
# Mean   : 555333   Mean   : 5.1
# 3rd Qu.: 610000   3rd Qu.: 8.0
# Max.   :1800000   Max.   :12.0

4.3 Calculs individuels

r# Tendance centrale
mean(df$salaire)     # 555333.3
median(df$salaire)   # 540000

# Dispersion
sd(df$salaire)       # 393215.1  (écart-type)
var(df$salaire)      # 154618106667  (variance)
min(df$salaire)      # 180000
max(df$salaire)      # 1800000
range(df$salaire)    # 180000 1800000

# Quartiles
quantile(df$salaire)
#      0%     25%     50%     75%    100%
#  180000  360000  540000  610000 1800000

# IQR
IQR(df$salaire)      # 250000

4.4 Analyse par groupe

r# Moyenne par département (base R)
tapply(df$salaire, df$departement, mean)
# Commercial   Direction     Finance          IT          RH
#     315000   1375000.0    583333.3    463333.3    393333.3

# Avec le package dplyr (plus lisible)
library(dplyr)

df %>%
  group_by(departement) %>%
  summarise(
    n         = n(),
    moyenne   = mean(salaire),
    mediane   = median(salaire),
    min       = min(salaire),
    max       = max(salaire)
  ) %>%
  arrange(desc(moyenne))

# # A tibble: 5 × 6
#   departement     n  moyenne  mediane     min     max
# 1 Direction       2  1375000  1375000  950000 1800000
# 2 Finance         3   583333   580000  540000  620000
# 3 IT              3   463333   580000  200000  610000
# 4 RH              3   393333   420000  310000  450000
# 5 Commercial      4   315000   360000  180000  380000

# Répartition par contrat
table(df$contrat)
# CDI   CDD Stage
#  10     3     2

4.5 Détecter les outliers

rq1 <- quantile(df$salaire, 0.25)   # 360000
q3 <- quantile(df$salaire, 0.75)   # 610000
iqr <- IQR(df$salaire)             # 250000

seuil_haut <- q3 + 1.5 * iqr      # 985000
seuil_bas  <- q1 - 1.5 * iqr      # -15000

# Identifier les outliers
df[df$salaire > seuil_haut, c("nom", "departement", "salaire")]
#          nom departement salaire
# 5 Bamba Koné   Direction 1800000


5. Python vs R — Statistiques côte à côte

Opération Python (pandas) R (base / dplyr)
Charger CSV pd.read_csv("f.csv") read.csv("f.csv")
Dimensions df.shape dim(df)
Aperçu df.head() head(df)
Résumé complet df.describe() summary(df)
Moyenne df['col'].mean() mean(df$col)
Médiane df['col'].median() median(df$col)
Écart-type df['col'].std() sd(df$col)
Quartiles df['col'].quantile([.25,.75]) quantile(df$col)
IQR q3 - q1 IQR(df$col)
Min / Max df['col'].min() / .max() min(df$col) / max(df$col)
Comptage catégories df['col'].value_counts() table(df$col)
Grouper + agréger df.groupby('g')['v'].mean() group_by(df,g) %>% summarise(m=mean(v))
Filtrer outliers df[df['col'] > seuil] df[df$col > seuil, ]


🔗 Pont Excel → Python/R

Tout ce que tu faisais dans Excel a son équivalent direct :

Formule Excel Python R
=MOYENNE(B2:B16) df['salaire'].mean() mean(df$salaire)
=MEDIANE(B2:B16) df['salaire'].median() median(df$salaire)
=ECARTYPE(B2:B16) df['salaire'].std() sd(df$salaire)
=MIN(B2:B16) df['salaire'].min() min(df$salaire)
=MAX(B2:B16) df['salaire'].max() max(df$salaire)
=QUARTILE(B2:B16;1) df['salaire'].quantile(0.25) quantile(df$salaire, 0.25)
=NB.SI(C2:C16;"CDI") (df['contrat']=='CDI').sum() sum(df$contrat == "CDI")
TCD : moyenne par groupe df.groupby('dept')['sal'].mean() group_by(df,dept) %>% summarise(mean(sal))

💡 Avantage Python/R : une seule ligne de code remplace un TCD entier — et elle se réexécute instantanément si les données changent.



✏️ Mini-exercices

Utilise le dataset RH Bamba & Associés (15 employés) défini en section 2.

Exercice 1 — Python : indicateurs d'ancienneté

Calcule les statistiques descriptives de la colonne anciennete :
moyenne, médiane, min, max, écart-type.

👉 Voir la réponse......
pythonprint(f"Moyenne    : {df['anciennete'].mean():.1f} ans")
print(f"Médiane    : {df['anciennete'].median():.1f} ans")
print(f"Min        : {df['anciennete'].min()} ans")
print(f"Max        : {df['anciennete'].max()} ans")
print(f"Écart-type : {df['anciennete'].std():.1f} ans")

# → Moyenne    : 5.1 ans
# → Médiane    : 5.0 ans
# → Min        : 0 ans
# → Max        : 12 ans
# → Écart-type : 3.6 ans

Exercice 2 — R : salaire moyen par type de contrat

En R avec dplyr, calcule le salaire moyen et l'effectif pour chaque type de contrat (CDI, CDD, Stage).

👉 Voir la réponse......
rlibrary(dplyr)

df %>%
  group_by(contrat) %>%
  summarise(
    effectif = n(),
    salaire_moyen = mean(salaire)
  ) %>%
  arrange(desc(salaire_moyen))

# # A tibble: 3 × 3
#   contrat  effectif  salaire_moyen
# 1 CDI            10        646000
# 2 CDD             3        330000
# 3 Stage           2        190000

Exercice 3 — Python : identifier les employés sous le salaire médian

Filtre et affiche les employés dont le salaire est strictement inférieur à la médiane.
Affiche leur nom, département et salaire.

👉 Voir la réponse......
pythonmediane = df['salaire'].median()   # 540 000

sous_mediane = df[df['salaire'] < mediane][['nom', 'departement', 'salaire']]
print(sous_mediane.sort_values('salaire'))

#                  nom departement  salaire
# 6       Soro Aminata  Commercial   180000
# 12      Touré Mariam          IT   200000
# 3      Diabaté Fatou          RH   310000
# 9     Diallo Mamadou  Commercial   340000
# 13  Keita Souleymane  Commercial   360000
# 2      Traoré Seydou  Commercial   380000
# 10  Coulibaly Assata          RH   420000
# 0       Kouassi Ama          RH   450000


📋 Cheat Sheet — Statistiques descriptives

Indicateurs clés

Indicateur Python R Excel
Moyenne .mean() mean() =MOYENNE()
Médiane .median() median() =MEDIANE()
Écart-type .std() sd() =ECARTYPE()
Variance .var() var() =VAR()
Min .min() min() =MIN()
Max .max() max() =MAX()
Q1 (25%) .quantile(0.25) quantile(x, 0.25) =QUARTILE(x;1)
Q3 (75%) .quantile(0.75) quantile(x, 0.75) =QUARTILE(x;3)
IQR q3 - q1 IQR() =QUARTILE(x;3)-QUARTILE(x;1)
Résumé complet .describe() summary()

Quand utiliser quoi ?

Situation Indicateur recommandé
Distribution symétrique (salaires similaires) Moyenne + Écart-type
Distribution asymétrique (quelques très hauts salaires) Médiane + IQR
Comparer des groupes Moyenne ou médiane par groupe
Détecter des anomalies Règle IQR (Q3 + 1.5×IQR)
Variable catégorielle (département, contrat) Mode + value_counts() / table()


🧠 Quiz de validation

Question 1 — Les salaires de 5 employés sont : 300k, 350k, 380k, 420k, 1 800k FCFA.
Quel indicateur représente le mieux le salaire "typique" ?

a) La moyenne (650 000 FCFA)
b) La médiane (380 000 FCFA)
c) L'écart-type
d) Le maximum

👉 Voir la réponse......

Réponse : b) La médiane (380 000 FCFA)
La moyenne est tirée vers le haut par le salaire exceptionnel de 1 800 000. La médiane — valeur du milieu après tri — est plus représentative de ce que gagne un employé "typique" dans cette équipe. Règle : quand il y a des outliers, préférer la médiane.


Question 2 — En Python, quelle ligne donne le salaire moyen par département ?

a) df['salaire'].mean('departement')
b) df.groupby('departement')['salaire'].mean()
c) df.mean(by='departement')
d) df['departement'].mean('salaire')

👉 Voir la réponse......

Réponse : b) df.groupby('departement')['salaire'].mean()
La méthode groupby() regroupe les lignes selon une colonne, puis on applique .mean() (ou n'importe quelle agrégation) sur la colonne numérique souhaitée.


Question 3 — Un employé gagne 1 800 000 FCFA. Q1 = 360 000, Q3 = 610 000, IQR = 250 000.
Est-ce un outlier selon la règle IQR ?

a) Non, car c'est un Directeur
b) Non, le seuil haut est 2 000 000
c) Oui, le seuil haut est 985 000 et 1 800 000 > 985 000
d) On ne peut pas savoir sans le graphique

👉 Voir la réponse......

Réponse : c)
Seuil haut = Q3 + 1.5 × IQR = 610 000 + 1.5 × 250 000 = 610 000 + 375 000 = 985 000 FCFA.
1 800 000 > 985 000 → c'est bien un outlier statistique. Ça ne veut pas dire que le salaire est illégitime (c'est le Directeur), mais il sort de la distribution normale et doit être noté dans l'analyse.



✅ Résumé du module

Ce que tu as appris Détail
Tendance centrale Moyenne, médiane, mode — quand utiliser quoi
Dispersion Écart-type, IQR, quartiles
Résumé automatique df.describe() (Python) · summary(df) (R)
Grouper + agréger groupby() (Python) · group_by() %>% summarise() (R)
Détecter les outliers Règle IQR : Q3 + 1.5×IQR
Pont Excel→Python/R MOYENNE, MEDIANE, ECARTYPE traduits

🚀 Dans le module suivant

Module 12 — Visualisation avec R & Python
On transforme ces chiffres en graphiques : histogrammes, boîtes à moustaches, barres, nuages de points — avec matplotlib/seaborn (Python) et ggplot2 (R).


Bootcamp Data Analyst — From Zero to Hero | Niveau Débutant · Acte IV