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)
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])
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())
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())
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))
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))