crosstab pour les tableaux de fréquences
Calculez un tableau croisé de fréquences ou de proportions entre deux colonnes catégorielles avec pd.crosstab.
crosstab pour les tableaux de fréquences est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Pandas & NumPy Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Pandas & NumPy Academy comprend 4 leçons au total.
Qu’est-ce qu’un tableau croisé ?
Un tableau croisé (crosstab) compte le nombre d’occurrences de chaque combinaison de valeurs provenant de deux variables catégorielles ou plus dans un jeu de données. Il s’agit d’un cas particulier de tableau croisé dynamique conçu spécifiquement pour le comptage. Pandas fournit pd.crosstab(), qui permet de calculer ces tableaux d’effectifs de manière concise sans devoir appeler explicitement groupby() ou pivot_table().
Appel de base à crosstab()
L’appel minimal pd.crosstab(index, columns) prend deux entrées assimilables à des tableaux (généralement des colonnes d’un DataFrame) et renvoie un tableau d’effectifs. Les lignes correspondent aux valeurs uniques du premier argument et les colonnes aux valeurs uniques du second. Chaque cellule contient le nombre de lignes où les deux valeurs apparaissent ensemble dans les données d’origine.
import pandas as pd
df = pd.DataFrame({
'gender': ['M', 'F', 'M', 'F', 'M', 'F', 'M'],
'product': ['A', 'A', 'B', 'B', 'A', 'B', 'B']
})
ct = pd.crosstab(df['gender'], df['product'])
print(ct)
# product A B
# gender
# F 1 2
# M 2 2Personnaliser les noms des lignes et des colonnes
Utilisez les paramètres rownames et colnames pour attribuer des noms significatifs aux axes des lignes et des colonnes dans le résultat, en remplaçant les noms par défaut des Series. Cette possibilité est utile lorsque les noms bruts des colonnes de votre DataFrame ne sont pas explicites dans le contexte du tableau produit.
ct = pd.crosstab(
df['gender'], df['product'],
rownames=['Customer Gender'],
colnames=['Purchased Product']
)
print(ct)
# Purchased Product A B
# Customer Gender
# F 1 2
# M 2 2Ajouter des totaux de lignes et de colonnes
Transmettez margins=True pour inclure une ligne et une colonne totalisant toutes les valeurs. L’étiquette de marge est par défaut 'All', mais vous pouvez la personnaliser avec margins_name. La ligne de marge affiche le total par colonne, la colonne de marge affiche le total par ligne et la cellule en bas à droite affiche le total général.
ct = pd.crosstab(df['gender'], df['product'],
margins=True, margins_name='Total')
print(ct)
# product A B Total
# gender
# F 1 2 3
# M 2 2 4
# Total 3 4 7Normaliser en proportions
Transmettez le paramètre normalize pour convertir les effectifs en proportions. normalize=True ou normalize='all' divise par le total général. normalize='index' calcule les proportions par ligne (la somme de chaque ligne vaut 1.0). normalize='columns' calcule les proportions par colonne (la somme de chaque colonne vaut 1.0). Les proportions sont plus informatives que les effectifs bruts lorsque les tailles des groupes diffèrent.
# Row proportions: what fraction of each gender bought each product?
print(pd.crosstab(df['gender'], df['product'], normalize='index').round(2))
# product A B
# gender
# F 0.33 0.67
# M 0.50 0.50
# All proportions: each cell as fraction of grand total
print(pd.crosstab(df['gender'], df['product'], normalize=True).round(2))Agréger les valeurs plutôt que les compter
Par défaut, crosstab compte les lignes. Vous pouvez plutôt agréger une colonne numérique en transmettant les paramètres values et aggfunc, comme avec pivot_table(). Vous pouvez par exemple calculer le chiffre d’affaires total pour chaque combinaison de sexe et de produit. Cela rend crosstab presque équivalent à pivot_table, avec une syntaxe légèrement plus concise pour les tableaux d’effectifs.
df['revenue'] = [100, 80, 150, 120, 200, 90, 130]
# Sum revenue by gender and product instead of counting
ct_rev = pd.crosstab(
df['gender'], df['product'],
values=df['revenue'],
aggfunc='sum'
)
print(ct_rev)
# product A B
# gender
# F 80 210
# M 300 280Tableau croisé à plusieurs niveaux
Transmettez une liste à index ou à columns pour créer un tableau croisé avec plusieurs niveaux sur les lignes ou les colonnes. Le résultat possède un MultiIndex, ce qui fournit une ventilation plus détaillée. Par exemple, un tableau croisant le sexe et la région sur les lignes avec le produit sur les colonnes affiche chaque combinaison sexe-région-produit.
df['region'] = ['East', 'West', 'East', 'West', 'East', 'East', 'West']
ct_multi = pd.crosstab(
[df['gender'], df['region']],
df['product'],
margins=True
)
print(ct_multi)
# product A B All
# gender region
# F East 0 1 1
# West 1 1 2
# M East 2 1 3
# West 0 1 1
# All 3 4 7crosstab() ou pivot_table()
pd.crosstab() et pd.pivot_table() se recouvrent largement. crosstab est optimisé pour compter les effectifs et accepte directement des entrées assimilables à des tableaux (et non un DataFrame), ce qui le rend légèrement plus concis pour les tableaux rapides. pivot_table fonctionne sur un DataFrame et prend nativement en charge toute fonction d’agrégation. Pour les tâches de simple comptage, crosstab est le choix idiomatique ; pour agréger des valeurs numériques, préférez pivot_table.
# crosstab (more concise for counting)
print(pd.crosstab(df['gender'], df['product']))
# Equivalent pivot_table
print(pd.pivot_table(df, index='gender', columns='product',
aggfunc='size', fill_value=0))
# Both produce the same resultPréparer un test du chi carré
Un tableau croisé constitue l’entrée standard d’un test du chi carré d’indépendance, qui vérifie si deux variables catégorielles sont statistiquement liées. La fonction scipy.stats.chi2_contingency() accepte directement un tableau croisé. Il s’agit de l’une des utilisations les plus courantes de crosstab dans l’analyse statistique des données : vous calculez le tableau, puis vous le testez dans un même flux de travail.
from scipy import stats
ct = pd.crosstab(df['gender'], df['product'])
# Convert to numpy array for scipy
chi2, p, dof, expected = stats.chi2_contingency(ct.values)
print(f'Chi2: {chi2:.2f}')
print(f'P-value: {p:.4f}')
print(f'Degrees of freedom: {dof}')
# p > 0.05 means no significant associationVisualiser un tableau croisé sous forme de carte thermique
Les tableaux croisés comportant de nombreuses catégories sont difficiles à interpréter sous forme de nombres bruts. Les visualiser sous forme de carte thermique avec sns.heatmap() rend immédiatement les tendances visibles : les cellules à fréquence élevée apparaissent dans des couleurs vives. Transmettez la version normalisée pour afficher les proportions plutôt que les effectifs bruts, et utilisez annot=True pour afficher les valeurs dans chaque cellule.
import seaborn as sns
import matplotlib.pyplot as plt
ct_norm = pd.crosstab(df['gender'], df['product'], normalize='index')
# sns.heatmap(ct_norm, annot=True, fmt='.0%', cmap='Blues')
# plt.title('Purchase Rate by Gender and Product')
# plt.tight_layout()
# plt.show()
print('Normalised crosstab ready for heatmap:')
print(ct_norm.round(2))Exemple pratique : analyser une enquête
Un flux de travail complet avec crosstab : charger les données d’enquête, calculer des tableaux de fréquences entre les variables démographiques et les variables de réponse, normaliser par ligne pour obtenir les taux de réponse et repérer les éventuelles tendances marquées. Il s’agit du flux d’analyse standard dans les études de marché, les tests A/B et la segmentation des utilisateurs, et il peut être réalisé en moins de 10 lignes de code Pandas.
# Simulate a survey dataset
survey = pd.DataFrame({
'age_group': ['18-25', '26-35', '18-25', '36-45', '26-35', '36-45'],
'satisfaction': ['High', 'Low', 'High', 'Medium', 'High', 'Low']
})
ct = pd.crosstab(survey['age_group'], survey['satisfaction'],
margins=True, margins_name='Total')
print(ct)
rates = pd.crosstab(survey['age_group'], survey['satisfaction'],
normalize='index').round(2)
print(rates)Vérification rapide
Testez votre compréhension de pd.crosstab pour créer des tableaux de fréquences à partir de cette leçon.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris que pd.crosstab() calcule les effectifs de fréquence pour les combinaisons de deux variables catégorielles ; que normalize convertit les effectifs en proportions par ligne, par colonne ou globales ; que margins=True ajoute les totaux des lignes et des colonnes ; et que le résultat de crosstab est directement compatible avec les tests du khi carré et les visualisations sous forme de cartes thermiques. Nous allons maintenant travailler avec des données de séries temporelles à l’aide de DatetimeIndex et des plages de périodes.
Apprends Python avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 30
- Leçons
- 120
Questions Fréquemment Posées
La leçon « crosstab pour les tableaux de fréquences » est-elle gratuite ?
Oui — le texte complet de « crosstab pour les tableaux de fréquences » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Pandas & NumPy Academy, passe à CoddyKit PRO. Le cours Pandas & NumPy Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « crosstab pour les tableaux de fréquences » ?
Calculez un tableau croisé de fréquences ou de proportions entre deux colonnes catégorielles avec pd.crosstab. Tu pratiques Pandas & NumPy Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Pandas & NumPy Academy ?
Aucune expérience préalable n'est requise. Pandas & NumPy Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « crosstab pour les tableaux de fréquences » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Pandas & NumPy Academy ?
Oui. Chaque leçon Pandas & NumPy Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- pivot_table : tableau croisé
- melt : du format large au format long
- stack et unstack avec MultiIndex
- crosstab pour les tableaux de fréquences