Tabela retencji kohort
Zbuduj macierz retencji kohort pokazującą odsetek użytkowników z tygodnia 0, którzy pozostają aktywni w kolejnych tygodniach, korzystając z pivot_table.
Tabela retencji kohort to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 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 kohortowa tabela retencji?
Kohortowa tabela retencji grupuje użytkowników według tygodnia (lub miesiąca), w którym po raz pierwszy skorzystali z produktu, a następnie śledzi, jaki odsetek każdej kohorty pozostaje aktywny w kolejnych tygodniach. Wiersz 0 zawsze pokazuje 100 %, ponieważ tydzień 0 oznacza tydzień rejestracji. Wartości w późniejszych kolumnach pokazują, jak szybko produkt traci użytkowników — im wolniejszy spadek, tym silniejsza retencja.
import pandas as pd
df = pd.read_csv('user_events.csv', parse_dates=['event_date'])
print(df.dtypes)
print(df.head())Przypisywanie każdemu użytkownikowi tygodnia kohorty
Tydzień kohorty to tydzień pierwszego zdarzenia danego użytkownika. Użyj groupby('user_id')['event_date'].min(), aby znaleźć datę pierwszego zdarzenia każdego użytkownika, a następnie przekonwertuj ją na tydzień ISO za pomocą .dt.to_period('W'). Dołącz tę etykietę kohorty z powrotem do głównego obiektu DataFrame zdarzeń, aby każdy wiersz zawierał informację, do którego tygodnia kohorty należy jego użytkownik.
cohort_week = df.groupby('user_id')['event_date'].min().dt.to_period('W').rename('cohort_week')
df = df.join(cohort_week, on='user_id')
df['event_week'] = df['event_date'].dt.to_period('W')
print(df[['user_id', 'event_date', 'cohort_week', 'event_week']].head())Obliczanie numeru tygodnia od momentu utworzenia kohorty
Numer tygodnia (nazywany także numerem okresu lub wiekiem) to różnica między tygodniem zdarzenia a tygodniem kohorty. Odejmowanie obiektów typu Pandas Period zwraca całkowite przesunięcie. Tydzień 0 oznacza, że użytkownik był aktywny w tygodniu rejestracji, a tydzień 4 — że wrócił cztery tygodnie później. Ta kolumna z przesunięciem staje się osią kolumn macierzy retencji.
df['week_number'] = (df['event_week'] - df['cohort_week']).apply(lambda x: x.n)
print(df[['user_id', 'cohort_week', 'event_week', 'week_number']].head(10))Zliczanie aktywnych użytkowników dla par kohorta–tydzień
Grupuj dane jednocześnie według cohort_week i week_number, a następnie zliczaj unikalnych użytkowników, aby otrzymać macierz surowych wartości retencji. Każda komórka informuje, ilu użytkowników z kohorty C było aktywnych w tygodniu N. Przekątna od lewego górnego do prawego dolnego rogu (tydzień 0 dla każdej kohorty) zawiera liczebności kohort, które są mianownikami używanymi do obliczania wartości procentowych.
retention_counts = (
df.groupby(['cohort_week', 'week_number'])['user_id']
.nunique()
.reset_index(name='active_users')
)
print(retention_counts.head(10))Tworzenie macierzy retencji za pomocą tabeli przestawnej
Użyj pivot_table(), aby przekształcić wartości retencji w długim formacie w szeroką macierz: wiersze oznaczają tygodnie kohort, a kolumny — numery tygodni. aggfunc='sum' obsługuje ewentualne zduplikowane klucze grupowania. Wypełnij komórki wartością 0 dla tygodni, w których żaden użytkownik z danej kohorty nie był aktywny. Ta macierz stanowi podstawę analizy retencji.
retention_matrix = retention_counts.pivot_table(
index='cohort_week',
columns='week_number',
values='active_users',
aggfunc='sum'
).fillna(0)
print(retention_matrix.iloc[:5, :8])Obliczanie wartości procentowych retencji
Podziel każdy wiersz przez jego wartość z tygodnia 0, aby przekształcić liczności w wartości procentowe. Kolumna tygodnia 0 zawiera liczebność kohorty, przechowywaną w retention_matrix[0]. Użyj divide(cohort_sizes, axis=0), a następnie pomnóż wynik przez 100. Zaokrąglij wartości do jednego miejsca po przecinku, aby zwiększyć czytelność. Otrzymasz standardową mapę cieplną retencji stosowaną w raportach analityki produktu.
cohort_sizes = retention_matrix[0]
retention_pct = retention_matrix.divide(cohort_sizes, axis=0) * 100
retention_pct = retention_pct.round(1)
print(retention_pct.iloc[:5, :8])Interpretowanie krzywej retencji
Tabelę retencji odczytuje się po przekątnej: każdy wiersz maleje w czasie. Produkt o silnej retencji będzie miał wartości takie jak 100, 60, 50, 45, 42 — szybki początkowy spadek, po którym następuje stabilne wypłaszczenie. Produkt o słabej retencji będzie wykazywał wartości 100, 30, 15, 8, 4 — ciągły spadek bez wypłaszczenia. Poziom wypłaszczenia (jeśli występuje) nazywa się długoterminowym współczynnikiem retencji i jest najważniejszym KPI retencji.
# Average retention rate per week number across all cohorts
avg_retention = retention_pct.mean(axis=0)
print('Average retention by week:')
print(avg_retention.round(1))Identyfikowanie najlepszych i najsłabszych kohort
Porównuj wyniki kohort, analizując retencję w 4. lub 8. tygodniu. Kohorta z najwyższą retencją w 4. tygodniu skorzystała na ulepszeniu produktu lub skutecznym kanale pozyskiwania; najsłabsza kohorta mogła zostać pozyskana za pośrednictwem kanału niskiej jakości. Użyj .loc[:, 4].sort_values(ascending=False), aby uszeregować kohorty według retencji w 4. tygodniu.
if 4 in retention_pct.columns:
week4 = retention_pct[4].sort_values(ascending=False)
print('Cohorts ranked by week-4 retention:')
print(week4)Wizualizowanie retencji za pomocą mapy cieplnej
Mapa cieplna z kodowaniem kolorami jest standardową wizualizacją tabel retencji. Użyj sns.heatmap() z annot=True, aby wyświetlić wartość procentową wewnątrz każdej komórki, oraz rozbieżnej mapy kolorów (niska retencja = czerwony, wysoka = zielony). Ustaw vmin=0 i vmax=100, aby kolory można było porównywać między różnymi skalami retencji.
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(14, 6))
sns.heatmap(retention_pct.iloc[:, :13],
annot=True, fmt='.0f',
cmap='RdYlGn', vmin=0, vmax=100,
ax=ax, linewidths=0.5)
ax.set_title('Weekly Cohort Retention (%)')
ax.set_xlabel('Week Number')
ax.set_ylabel('Cohort Week')
plt.tight_layout()
plt.show()Rysowanie krzywej retencji
Wykres liniowy przedstawiający średnią retencję w poszczególnych tygodniach wyraźniej niż mapa cieplna pokazuje ogólną krzywą spadku podczas prezentacji dla odbiorców nietechnicznych. Narysuj średnią krzywą retencji z zacienionym pasmem oznaczającym plus lub minus jedno odchylenie standardowe, aby pokazać skalę różnic między kohortami. Wypłaszczenie — miejsce, w którym linia przestaje spadać — stanowi naturalny poziom retencji produktu.
avg_ret = retention_pct.mean(axis=0)
std_ret = retention_pct.std(axis=0)
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(avg_ret.index, avg_ret.values, color='steelblue', linewidth=2, marker='o')
ax.fill_between(avg_ret.index, avg_ret - std_ret, avg_ret + std_ret, alpha=0.2)
ax.set_xlabel('Week Number')
ax.set_ylabel('Retention %')
ax.set_title('Average Cohort Retention Curve')
plt.tight_layout()
plt.show()Eksportowanie tabeli retencji
Wyeksportuj tabelę retencji do programu Excel, aby menedżerowie produktu mogli udostępniać ją podczas cotygodniowych przeglądów. Użyj to_excel() i zastosuj formatowanie warunkowe ręcznie w Excelu albo użyj w Pandas Styler.background_gradient(), aby dodać kolory bezpośrednio do eksportowanego pliku. Tabela retencji jest jednym z najczęściej wymaganych wyników analityki produktu.
styled = retention_pct.style.background_gradient(cmap='RdYlGn', vmin=0, vmax=100)
styled.to_excel('retention_table.xlsx', engine='openpyxl')
print('Retention table saved to retention_table.xlsx')Szybkie sprawdzenie
Sprawdź swoją znajomość zagadnień analizy danych z tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyłeś się: przypisywać użytkowników do tygodni kohort i obliczać przesunięcia tygodniowe, przekształcać dane w macierz retencji i zamieniać liczności na wartości procentowe, a także wizualizować retencję kohort za pomocą mapy cieplnej i średniej krzywej retencji. Następnie omówimy wizualizowanie ścieżek użytkowników za pomocą wykresów słupkowych lejka i map cieplnych.
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 „Tabela retencji kohort” jest bezpłatna?
Tak — pełny tekst „Tabela retencji kohort” 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 „Tabela retencji kohort”?
Zbuduj macierz retencji kohort pokazującą odsetek użytkowników z tygodnia 0, którzy pozostają aktywni w kolejnych tygodniach, korzystając z pivot_table. Ć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 3 z 4.
Ile czasu zajmuje lekcja „Tabela retencji kohort”?
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
- Tworzenie sesji i sekwencjonowanie zdarzeń
- Analiza lejka
- Tabela retencji kohort
- Wizualizacja ścieżek użytkowników