Pandas & NumPy Academy · Lekcja

crosstab do tabel częstości

Obliczaj tabulację krzyżową częstości lub proporcji dla dwóch kolumn kategorycznych za pomocą pd.crosstab.

Lekcja 4 z 413 kroki

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  2

Dostosowywanie 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  2

Dodawanie 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      7

Normalizacja 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  280

Wielopoziomowa 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    7

crosstab() 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 result

Przygotowanie 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 association

Wizualizacja 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.

Bezpłatny start

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

  1. pivot_table: tabulacja krzyżowa
  2. melt: format szeroki na długi
  3. stack i unstack z MultiIndex
  4. crosstab do tabel częstości
← Powrót do Pandas & NumPy Academy