crosstab do tabel częstości
Obliczaj tabulację krzyżową częstości lub proporcji dla dwóch kolumn kategorycznych za pomocą pd.crosstab.
crosstab do tabel częstości to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Czym jest tabela krzyżowa?
Tabela krzyżowa (crosstab) zlicza, ile razy każda kombinacja wartości dwóch lub większej liczby zmiennych kategorycznych występuje w zbiorze danych. Jest szczególnym przypadkiem tabeli przestawnej, przeznaczonym konkretnie do zliczania. Pandas udostępnia funkcję pd.crosstab() jako zwięzły sposób obliczania takich tabel częstości bez konieczności jawnego wywoływania funkcji groupby() lub pivot_table().
Podstawowe wywołanie crosstab()
Minimalne wywołanie pd.crosstab(index, columns) przyjmuje dwa wejścia podobne do tablic (zazwyczaj kolumny DataFrame) i zwraca tabelę częstości. Wiersze odpowiadają unikatowym wartościom pierwszego argumentu, a kolumny — unikatowym wartościom drugiego. Każda komórka zawiera liczbę wierszy, w których obie wartości występują razem w pierwotnych danych.
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 2Dostosowywanie nazw wierszy i kolumn
Parametry rownames i colnames służą do nadawania osi wierszy i kolumn w wyniku znaczących nazw, zastępujących domyślne nazwy obiektów Series. Jest to przydatne, gdy surowe nazwy kolumn w DataFrame nie wyjaśniają same w sobie znaczenia tabeli, która ma zostać utworzona.
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 2Dodawanie sum częściowych (sum wierszy i kolumn)
Przekazanie margins=True powoduje dodanie wiersza i kolumny sumujących wszystkie wartości. Etykieta sumy domyślnie ma wartość 'All', ale można ją zmienić za pomocą parametru margins_name. Wiersz sum zawiera łączną liczbę dla każdej kolumny, kolumna sum zawiera łączną liczbę dla każdego wiersza, a komórka w prawym dolnym rogu zawiera sumę całkowitą.
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 7Normalizacja do proporcji
Parametr normalize służy do przekształcania liczności w proporcje. normalize=True lub normalize='all' dzieli wartości przez sumę całkowitą. normalize='index' oblicza proporcje wierszy (suma każdego wiersza wynosi 1.0). normalize='columns' oblicza proporcje kolumn (suma każdej kolumny wynosi 1.0). Proporcje są bardziej miarodajne niż surowe liczności, gdy rozmiary grup są różne.
# 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))Agregowanie wartości zamiast zliczania
Domyślnie funkcja crosstab zlicza wiersze. Zamiast tego można agregować kolumnę liczbową, przekazując parametry values i aggfunc — podobnie jak w przypadku funkcji pivot_table(). Można na przykład obliczyć łączny przychód dla każdej kombinacji płci i produktu. Dzięki temu crosstab jest niemal równoważna funkcji pivot_table, ale ma nieco zwięźlejszą składnię w przypadku tabel częstości.
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 280Wielopoziomowa tabela krzyżowa
Przekazanie listy do parametru index lub columns tworzy tabelę krzyżową z wieloma poziomami wierszy lub kolumn. Wynik zawiera MultiIndex, co zapewnia bardziej szczegółowy podział danych. Na przykład utworzenie tabeli krzyżowej, w której wiersze są podzielone według płci i regionu, a kolumny według produktu, pokazuje każdą kombinację płeć–region–produkt.
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() a pivot_table()
Funkcje pd.crosstab() i pd.pivot_table() w znacznym stopniu się pokrywają. crosstab jest zoptymalizowana pod kątem zliczania częstości i przyjmuje bezpośrednio dane podobne do tablic (a nie DataFrame), dzięki czemu jest nieco zwięźlejsza przy szybkim tworzeniu tabel. pivot_table działa na DataFrame i natywnie obsługuje dowolną funkcję agregującą. Do samego zliczania idiomatycznym wyborem jest crosstab, natomiast do agregowania wartości liczbowych lepiej użyć 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 resultPrzygotowanie do testu chi-kwadrat
Tabela krzyżowa jest standardowym wejściem dla testu niezależności chi-kwadrat, który sprawdza, czy dwie zmienne kategoryczne są ze sobą powiązane statystycznie. Funkcja scipy.stats.chi2_contingency() przyjmuje bezpośrednio tablicę tabeli krzyżowej. Jest to jedno z najczęstszych zastosowań crosstab w statystycznej analizie danych — w jednym potoku tworzy się tabelę, a następnie poddaje ją testowi.
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 associationWizualizacja tabeli krzyżowej jako mapy cieplnej
Tabele krzyżowe zawierające wiele kategorii są trudne do interpretacji jako surowe liczby. Wizualizacja w postaci mapy cieplnej za pomocą sns.heatmap() natychmiast uwidacznia wzorce — komórki o dużej częstości są wyświetlane w jasnych kolorach. Należy przekazać wersję znormalizowaną, aby pokazać proporcje zamiast surowych liczności, oraz użyć annot=True, aby wyświetlić wartości w poszczególnych komórkach.
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))Przykład praktyczny: analiza ankiety
Kompletny przebieg analizy tabeli krzyżowej: wczytanie danych ankietowych, obliczenie tabel częstości dla zmiennych demograficznych i zmiennych odpowiedzi, normalizacja według wierszy w celu uzyskania odsetków odpowiedzi oraz identyfikacja wyraźnych wzorców. Jest to standardowy proces analityczny w badaniach rynku, testach A/B i segmentacji użytkowników, który można zrealizować w mniej niż 10 wierszach kodu 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)Szybki test
Sprawdź swoją znajomość funkcji pd.crosstab służącej do tworzenia tabel częstości z tego урокu.
Podsumowanie lekcji
W tej lekcji dowiedziałeś się, że pd.crosstab() oblicza liczebności dla kombinacji dwóch zmiennych kategorialnych; normalize przekształca liczebności w proporcje według wierszy, kolumn lub całości; margins=True dodaje sumy wierszy i kolumn; a wynik działania crosstab jest bezpośrednio zgodny z testami chi-kwadrat i wizualizacjami w postaci map cieplnych. Następnie zajmiemy się danymi szeregów czasowych, korzystając z DatetimeIndex i zakresów okresów.
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „crosstab do tabel częstości” jest bezpłatna?
Tak — pełny tekst „crosstab do tabel częstości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „crosstab do tabel częstości”?
Obliczaj tabulację krzyżową częstości lub proporcji dla dwóch kolumn kategorycznych za pomocą pd.crosstab. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „crosstab do tabel częstości”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- pivot_table: tabulacja krzyżowa
- melt: format szeroki na długi
- stack i unstack z MultiIndex
- crosstab do tabel częstości