import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import skew, kurtosis
# Configuration pour un meilleur affichage des graphiques
plt.style.use('seaborn-v0_8-whitegrid')
1 Introduction à l’Analyse Statistique Descriptive Univariée
L’analyse statistique descriptive univariée consiste à étudier une seule variable à la fois pour comprendre sa distribution, ses caractéristiques centrales, sa variabilité et sa forme. C’est la première étape fondamentale de toute analyse de données.
1.1 Objectifs du tutoriel
- Comprendre les concepts de base de la statistique descriptive.
- Maîtriser les mesures de tendance centrale, de dispersion et de forme, ainsi que leurs formules.
- Apprendre à créer et interpréter des graphiques descriptifs.
- Savoir choisir les bonnes méthodes selon le type de variable.
- Détecter les valeurs aberrantes.
2 Types de Variables
2.1 Variables Qualitatives
Variables Nominales
Variables dont les modalités sont des catégories non ordonnées (ex: couleur, sexe, profession).
Variables Ordinales
Variables dont les modalités ont un ordre naturel (ex: niveau d’éducation, satisfaction).
2.2 Variables Quantitatives
Variables Discrètes
Variables qui prennent un nombre fini ou dénombrable de valeurs, souvent des entiers (ex: nombre d’enfants, âge en années).
Variables Continues
Variables qui peuvent prendre n’importe quelle valeur dans un intervalle donné (ex: taille, poids, salaire).
3 Préparation des Données
Créons un jeu de données d’exemple pour illustrer les concepts.
# Création d'un jeu de données exemple
np.random.seed(123)
n = 200
donnees = pd.DataFrame({
'age': np.round(np.random.normal(35, 10, n)),
'salaire': np.round(np.random.normal(45000, 15000, n)),
'sexe': np.random.choice(['Homme', 'Femme'], n),
'education': np.random.choice(['Primaire', 'Secondaire', 'Supérieur'], n, p=[0.2, 0.5, 0.3]),
'satisfaction': np.random.choice(np.arange(1, 6), n, p=[0.1, 0.15, 0.3, 0.3, 0.15])
})
# Convertir 'education' en type catégoriel ordonné
donnees['education'] = pd.Categorical(donnees['education'], categories=['Primaire', 'Secondaire', 'Supérieur'], ordered=True)
# Aperçu des données
print(donnees.head(10).to_markdown(index=False))4 Analyse des Variables Qualitatives
L’analyse des variables qualitatives repose principalement sur les tableaux de fréquences et les graphiques en barres ou circulaires.
4.1 Tableaux de Fréquences
Un tableau de fréquences montre le nombre d’occurrences (fréquence absolue) et la proportion (fréquence relative) de chaque modalité.
# Fréquences pour la variable 'education'
freq_education = donnees['education'].value_counts().reset_index()
freq_education.columns = ["Niveau d'éducation", "Fréquence"]
print("Fréquences pour le niveau d'éducation:")
print(freq_education.to_markdown(index=False))
# Tableau de fréquences relatives
prop_sexe = donnees['sexe'].value_counts(normalize=True).reset_index()
prop_sexe.columns = ["Sexe", "Proportion"]
print("\nProportion par Sexe:")
print(prop_sexe.to_markdown(index=False))4.2 Graphiques pour Variables Qualitatives
Diagramme en Barres
Le diagramme en barres est idéal pour visualiser et comparer les fréquences des différentes modalités.
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
sns.countplot(data=donnees, x='education', palette='viridis')
plt.title("Distribution par Niveau d'Éducation")
plt.xlabel("Niveau d'Éducation")
plt.ylabel("Fréquence")
plt.show()Diagramme Circulaire (Pie Chart)
Bien que souvent critiqué, le diagramme circulaire peut être utile pour montrer la part de chaque modalité dans un tout.
import matplotlib.pyplot as plt
freq_sexe = donnees['sexe'].value_counts()
plt.figure(figsize=(8, 8))
plt.pie(freq_sexe, labels=freq_sexe.index, autopct='%1.1f%%', startangle=90, colors=sns.color_palette('pastel'))
plt.title("Répartition par Sexe")
plt.axis('equal') # Assure que le cercle est un cercle.
plt.show()5 Analyse des Variables Quantitatives
5.1 Mesures de Tendance Centrale
Elles décrivent le “centre” ou la valeur typique d’une distribution.
Moyenne Arithmétique
La moyenne est la somme de toutes les valeurs divisée par leur nombre. Sensible aux valeurs extrêmes.
Formule :
\[\bar{x} = \frac{\sum_{i=1}^{n} x_i}{n}\]
Médiane
La médiane est la valeur qui sépare l’échantillon en deux moitiés égales. Robuste aux valeurs extrêmes.
Formule : Pour un échantillon trié \(x\_{(1)}, \dots, x\_{(n)}\) :
- Si \(n\) est impair : \(M = x\_{(\frac{n+1}{2})}\)
- Si \(n\) est pair : \(M = \dfrac{x_{(\frac{n}{2})} + x_{(\frac{n}{2}+1)}}{2}\)
Mode
Le mode est la valeur la plus fréquente dans l’échantillon.
print(f"Moyenne d'âge: {donnees['age'].mean():.2f} ans")
print(f"Médiane de salaire: {donnees['salaire'].median():.0f} €")
print(f"Mode de satisfaction: {donnees['satisfaction'].mode()[0]}")5.2 Mesures de Dispersion
Elles quantifient la variabilité ou l’étalement des données.
Variance et Écart-type
La variance (\(s^2\)) est la moyenne des carrés des écarts à la moyenne. L’écart-type (\(s\)) est sa racine carrée, exprimée dans la même unité que les données.
Formule (échantillon) : \[s^2 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n-1} \quad \text{et} \quad s = \sqrt{s^2}\]
Pourquoi diviser par \(n-1\) ? Diviser par \(n-1\) (correction de Bessel) au lieu de \(n\) donne un estimateur non biaisé de la variance de la population à partir de l’échantillon. C’est la méthode par défaut dans la plupart des logiciels statistiques, y compris Pandas.
Écart Interquartile (EIQ)
L’EIQ est la différence entre le troisième (Q3) et le premier (Q1) quartile. Il mesure l’étendue des 50% centraux des données.
Formule : \[EIQ = Q3 - Q1\]
print(f"Écart-type de l'âge: {donnees['age'].std():.2f} ans")
print(f"Variance du salaire: {donnees['salaire'].var():.2f}")
print(f"Écart interquartile du salaire: {donnees['salaire'].quantile(0.75) - donnees['salaire'].quantile(0.25):.2f} €")5.3 Mesures de Forme
Elles décrivent la forme de la distribution des données.
Asymétrie (Skewness)
Mesure le degré d’asymétrie de la distribution.
- \(g_1 > 0\) : Asymétrie à droite (queue longue à droite).
- \(g_1 < 0\) : Asymétrie à gauche (queue longue à gauche).
Formule : \[g_1 = \dfrac{\frac{1}{n} \sum_{i=1}^{n}(x_i - \bar{x})^3}{s^3}\]
Aplatissement (Kurtosis)
Mesure si la distribution est plus pointue ou plus aplatie qu’une distribution normale. On utilise souvent l’excès d’aplatissement (\(g\_2\)).
- \(g_2 > 0\) : Leptokurtique (pointue).
- \(g_2 < 0\) : Platykurtique (aplatie).
Formule (excès) : \[g_2 = \left( \dfrac{\frac{1}{n} \sum_{i=1}^{n}(x_i - \bar{x})^4}{s^4} \right) - 3\]
print(f"Asymétrie de la distribution de l'âge: {skew(donnees['age']):.3f}")
print(f"Aplatissement (excès) de la distribution du salaire: {kurtosis(donnees['salaire']):.3f}")5.4 Graphiques pour Variables Quantitatives
Histogramme et Densité
L’histogramme groupe les données en classes et représente la fréquence de chaque classe. La courbe de densité lisse cette représentation.
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
sns.histplot(donnees['salaire'], kde=True, bins=20, stat='density', color='skyblue', edgecolor='black')
plt.axvline(donnees['salaire'].mean(), color='blue', linestyle='dashed', linewidth=1, label=f"Moyenne: {donnees['salaire'].mean():.0f}€")
plt.axvline(donnees['salaire'].median(), color='green', linestyle='dotted', linewidth=1, label=f"Médiane: {donnees['salaire'].median():.0f}€")
plt.title("Distribution du Salaire\nAvec Moyenne (bleu) et Médiane (vert)")
plt.xlabel("Salaire (€)")
plt.ylabel("Densité")
plt.legend()
plt.show()Boîte à Moustaches (Box Plot)
La boîte à moustaches résume la distribution en cinq points : minimum, Q1, médiane, Q3, et maximum. Elle est très efficace pour visualiser la dispersion et détecter les valeurs aberrantes.
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
sns.boxplot(y=donnees['age'], ax=axes[0], color='lightcoral')
axes[0].set_title("Distribution de l'Âge")
axes[0].set_ylabel("Âge (années)")
sns.boxplot(y=donnees['salaire'], ax=axes[1], color='lightblue')
axes[1].set_title("Distribution du Salaire")
axes[1].set_ylabel("Salaire (€)")
plt.tight_layout()
plt.show()6 Tableau de Synthèse Complet
Il est souvent pratique de regrouper toutes les statistiques descriptives dans un seul tableau.
# Sélection des variables quantitatives
donnees_quant = donnees.select_dtypes(include=np.number)
# Calcul des statistiques descriptives
summary_stats = donnees_quant.agg(
['count', 'mean', 'std', 'median', 'min', 'max', skew, kurtosis]
).T
# Renommer les colonnes pour plus de clarté
summary_stats.columns = ['n', 'mean', 'std', 'median', 'min', 'max', 'skew', 'kurtosis']
# Affichage du tableau
print("Tableau de synthèse des statistiques descriptives:")
print(summary_stats.to_markdown(floatfmt=".2f"))7 Détection des Valeurs Aberrantes
Une valeur aberrante est une observation qui s’écarte de manière anormale des autres.
7.1 Méthode de l’Écart Interquartile (EIQ)
Une observation \(x\_i\) est considérée comme aberrante si : \[x_i < Q1 - 1.5 \times EIQ \quad \text{ou} \quad x_i > Q3 + 1.5 \times EIQ\]
# Analyse pour la variable SALAIRE
Q1_salaire = donnees['salaire'].quantile(0.25)
Q3_salaire = donnees['salaire'].quantile(0.75)
EIQ_salaire = Q3_salaire - Q1_salaire
limite_inf = Q1_salaire - 1.5 * EIQ_salaire
limite_sup = Q3_salaire + 1.5 * EIQ_salaire
aberrantes = donnees[(donnees['salaire'] < limite_inf) | (donnees['salaire'] > limite_sup)]['salaire']
print("--- Détection par EIQ sur le SALAIRE ---")
print(f"Limites de détection : [{round(limite_inf)}; {round(limite_sup)}]")
print(f"Nombre de valeurs aberrantes : {len(aberrantes)}")
if len(aberrantes) > 0: # Vérifie s'il y a des valeurs aberrantes
print(f"Valeurs détectées : {', '.join(map(str, sorted(aberrantes.tolist())))}") # Affiche les valeurs8 Conclusion et Bonnes Pratiques
- Toujours visualiser les données : Un graphique vaut mille mots (et mille chiffres).
- Choisir les bonnes mesures : Utiliser la médiane et l’EIQ pour les distributions asymétriques.
- Contextualiser : Interpréter les statistiques à la lumière du domaine d’étude.
- Documenter : Noter les observations importantes, les valeurs manquantes et les décisions prises.
L’analyse univariée est le socle sur lequel reposent des analyses plus complexes (bivariées, multivariées, modélisation). Une exploration bien menée est la clé d’un projet statistique réussi.
9 Exercices
Exercise 1
Quel est l’objectif principal de l’analyse descriptive univariée ?
Une variable représentant le “niveau de satisfaction” (ex: ‘Faible’, ‘Moyen’, ‘Élevé’) est de type :
Quelle mesure de tendance centrale est la plus sensible aux valeurs aberrantes (outliers) ?
Que mesure l’écart interquartile (EIQ) ?
Une distribution avec une asymétrie (skewness) de -1.5 est :
Quel est le graphique le plus approprié pour visualiser la fréquence de chaque catégorie d’une variable nominale comme ‘sexe’ ?
Dans une boîte à moustaches (box plot), la ligne à l’intérieur de la boîte représente :
Selon la méthode de l’EIQ, une valeur est considérée comme aberrante si elle est :
Quelle fonction Pandas est utilisée pour obtenir un tableau de fréquences absolues pour une colonne education d’un DataFrame df ?
Un excès d’aplatissement (kurtosis) positif (\(g_2 > 0\)) signifie que la distribution est :
Laquelle de ces variables est un exemple de variable quantitative continue ?
Quelle est la principale différence entre un histogramme et un diagramme en barres ?
Pour décrire le salaire “typique” dans une entreprise où quelques directeurs ont des salaires extrêmement élevés, quelle mesure serait la plus pertinente ?
L’écart-type est calculé comme :
Dans le tutoriel, quelle méthode est utilisée sur un DataFrame pour obtenir un résumé complet (moyenne, std, min, max, etc.) des variables numériques ?