📊 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 disparateMê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.03.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 FCFA3.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 23.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 18000003b. 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-profilingpythonfrom 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 notebookCe 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 sweetvizpythonimport 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 skimpypythonfrom 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 :
ydata-profilingpour comprendre le dataset en 2 minutespandaspour les analyses ciblées et calculs spécifiques- 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.04.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) # 2500004.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 24.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 18000005. 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 ansExercice 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 190000Exercice 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