Discrétisation de données avec Pandas (cut / qcut)

Le binning de données (aussi appelé compartimentage) est le processus de discrétisation de variables continues, couramment utilisé dans le prétraitement des données, l'ingénierie des caractéristiques et l'analyse de données.


cut : binning à largeur égale

cutDivisez les données en intervalles de largeur égale.

Exemple

import pandas as pd
import numpy as np

# Créer des données d'âge
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])

print("Données d'origine :")
print(ages.tolist())
print()

# Binning à largeur égale (5 intervalles)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Enfant", "Jeune", "Adulte d'âge moyen", "Pré-senior", "Personne âgée"]

age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Résultat du binning à largeur égale :")
print(age_bins)
print()

# Inclure la borne droite
age_bins2 = pd.cut(ages, bins=4)
print("Discrétisation automatique à largeur égale :")
print(age_bins2)

Renvoie les catégories et les bornes

Exemple

import pandas as pd
import numpy as np

ages = pd.Series([5, 15, 25, 35, 45])

# Renvoyer les indices d'intervalle
result = pd.cut(ages, bins=4, labels=False)
print("Indices d'intervalle :")
print(result)
print()

# Renvoyer les bornes d'intervalle
result = pd.cut(ages, bins=4, retbins=True)
print("Bornes d'intervalle :")
print(result[1])

qcut : discrétisation à fréquence égale

qcutDivisez les données en intervalles comportant approximativement le même nombre de points de données.

Exemple

import pandas as pd
import numpy as np

# Données inégalement réparties
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])

print("Données d'origine :")
print(data.tolist())
print()

# Discrétisation à largeur égale (peut entraîner une répartition inégale)
cut_result = pd.cut(data, q=4)
print("Discrétisation à largeur égale :")
print(cut_result.value_counts())
print()

# Discrétisation à fréquence égale (approximativement le même nombre de points de données par intervalle)
qcut_result = pd.qcut(data, q=4)
print("Discrétisation à fréquence égale :")
print(qcut_result.value_counts())

Spécifier les quantiles

Exemple

import pandas as pd

data = pd.Series(range(1, 101))

# Diviser par quantiles spécifiés
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("Divisé par quantiles :")
print(result.value_counts().sort_index())

Pratique : Analyse de données

Exemple

import pandas as pd
import numpy as np

# Simuler des données de dépenses clients
np.random.seed(42)
customers = pd.DataFrame({
    "Customer ID": range(1, 101),
    "Spending amount": np.random.exponential(500, 100) + 100
})

# Répartir en différents niveaux de dépenses
customers["Spending level"] = pd.cut(
    customers["Spending amount"],
    bins=[0, 300, 500, 800, float("inf")],
    labels=["Faible", "Moyen", "Élevé", "VIP"]
)

# Compter les clients dans chaque niveau
print("Répartition des niveaux de dépenses :")
print(customers["Spending level"].value_counts())
print()

# Calculer les dépenses moyennes par niveau
print("Dépenses moyennes par niveau :")
print(customers.groupby("Spending level")["Spending amount"].mean().round(2))
Autres extensions