Pandas & NumPy Academy · Lekcja

Analiza lejka

Śledź, ilu użytkowników dociera do każdego etapu wieloetapowego lejka, i obliczaj współczynniki konwersji między kolejnymi etapami.

Lekcja 2 z 413 kroki

Analiza lejka to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 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 lejek konwersji?

Lejek konwersji modeluje ścieżkę użytkownika przechodzącego przez sekwencję wymaganych etapów, na przykład: strona główna → strona produktu → dodanie do koszyka → płatność → zakup. Na każdym etapie część użytkowników odpada i nie przechodzi do następnego. Analiza lejka określa skalę tych spadków, dzięki czemu zespoły mogą ustalić, który etap należy poprawić w pierwszej kolejności. Wynikiem jest tabela pokazująca liczbę użytkowników i współczynnik konwersji na każdym etapie.

import pandas as pd

FUNNEL_STEPS = [
    'homepage',
    'product_page',
    'add_to_cart',
    'checkout',
    'purchase'
]

df = pd.read_csv('clickstream.csv', parse_dates=['timestamp'])
print(df['event_type'].value_counts())

Zliczanie unikalnych użytkowników na każdym etapie

Dla każdego etapu lejka zlicz liczbę unikalnych użytkowników, którzy co najmniej raz wywołali dane zdarzenie. Użyj df[df['event_type'] == step]['user_id'].nunique() w pętli i zbierz wyniki w słowniku. Przekształcenie go w Series ułatwia późniejsze obliczenia procentowe za pomocą pojedynczego dzielenia.

step_counts = {}
for step in FUNNEL_STEPS:
    users = df[df['event_type'] == step]['user_id'].nunique()
    step_counts[step] = users

funnel = pd.Series(step_counts, name='users')
print(funnel)

Obliczanie współczynników konwersji między etapami

Współczynnik konwersji między etapami pokazuje, jaka część użytkowników, którzy ukończyli etap N, ukończyła również etap N+1. Oblicz go za pomocą funnel.shift(1) (które zwraca liczbę użytkowników na poprzednim etapie) i dzielenia: funnel / funnel.shift(1) * 100. Pierwszy etap nie ma poprzedniego etapu, dlatego jego współczynnik wynosi NaN lub 100%, zależnie od definicji wartości bazowej.

funnel_df = funnel.to_frame()
funnel_df['prev_users'] = funnel_df['users'].shift(1)
funnel_df['step_conversion_%'] = (funnel_df['users'] / funnel_df['prev_users'] * 100).round(1)
print(funnel_df)

Obliczanie całkowitego współczynnika konwersji

Całkowity współczynnik konwersji mierzy, jaka część wszystkich użytkowników, którzy weszli do lejka na etapie 1, ostatecznie ukończyła ostatni etap. Podziel liczbę użytkowników na ostatnim etapie przez liczbę użytkowników na pierwszym etapie. Całkowita konwersja od strony głównej do zakupu na poziomie 2–5% jest typowa dla handlu internetowego; niższe wartości sygnalizują krytyczny spadek w którymś miejscu lejka.

overall_rate = funnel.iloc[-1] / funnel.iloc[0] * 100
print(f'Overall conversion rate: {overall_rate:.1f}%')

funnel_df['overall_conversion_%'] = (funnel_df['users'] / funnel_df['users'].iloc[0] * 100).round(1)
print(funnel_df[['users', 'overall_conversion_%']])

Uporządkowany lejek: wymaganie sekwencji etapów

Proste zliczanie unikalnych użytkowników uznaje osoby, które przeszły bezpośrednio do płatności bez odwiedzenia strony produktu, za prawidłowe wejścia do lejka, co zawyża konwersję na początkowych etapach. Aby wymusić właściwą kolejność, sprawdź, czy każdy użytkownik dotarł do etapu N dopiero po przejściu etapu N-1. Wymaga to porównania sygnatur czasowych: zdarzenie product_page użytkownika musi wystąpić przed jego zdarzeniem add_to_cart.

# Get first occurrence of each step per user
first_events = df.groupby(['user_id', 'event_type'])['timestamp'].min().unstack('event_type')

# Enforce ordering: each step must come after the previous
first_events['valid_to_cart'] = first_events['add_to_cart'] > first_events['product_page']
print(first_events[['product_page', 'add_to_cart', 'valid_to_cart']].head())

Lejek według segmentu: typ urządzenia

Różne segmenty użytkowników mogą osiągać bardzo różne współczynniki konwersji. Wykonaj te same obliczenia lejka osobno dla użytkowników komputerów i urządzeń mobilnych, używając groupby('device_type'). Jeśli użytkownicy mobilni często odpadają na etapie płatności, strona płatności prawdopodobnie ma problemy z użytecznością na małych ekranach. Lejki podzielone na segmenty ujawniają możliwości ukierunkowanej optymalizacji.

def funnel_for_group(group_df):
    counts = {}
    for step in FUNNEL_STEPS:
        counts[step] = group_df[group_df['event_type'] == step]['user_id'].nunique()
    return pd.Series(counts)

segmented_funnel = df.groupby('device_type').apply(funnel_for_group)
print(segmented_funnel)

Identyfikowanie etapu z największym spadkiem

Etap, na którym występuje największa bezwzględna utrata użytkowników, jest najważniejszym celem optymalizacji. Znajdź go, obliczając różnicę między liczbami użytkowników na kolejnych etapach za pomocą funnel.diff() — najbardziej ujemna wartość odpowiada największemu spadkowi. Przedstaw ten wniosek interesariuszom zarówno w formie liczbowej, jak i wizualnej.

dropoffs = funnel.diff().abs()
biggest_drop = dropoffs.idxmax()
biggest_drop_count = dropoffs.max()

print(f'Biggest drop-off: {biggest_drop} ({biggest_drop_count:.0f} users lost)')

Czas między etapami lejka

Czas potrzebny użytkownikom na przejście z jednego etapu do następnego ujawnia występujące bariery. Jeśli użytkownicy czekają wiele godzin między dodaniem produktu do koszyka a przejściem do płatności, wiadomość e-mail o porzuconym koszyku może ich odzyskać. Oblicz medianę czasu między każdą parą etapów, używając DataFrame first_events: odejmij sąsiednie kolumny z sygnaturami czasowymi i oblicz medianę dla wszystkich użytkowników.

for i in range(1, len(FUNNEL_STEPS)):
    prev = FUNNEL_STEPS[i-1]
    curr = FUNNEL_STEPS[i]
    delta = (first_events[curr] - first_events[prev]).dt.total_seconds() / 60
    print(f'{prev} -> {curr}: median {delta.median():.1f} min, 90th pct {delta.quantile(0.9):.1f} min')

Tygodniowy trend lejka

Śledź, czy współczynniki konwersji poprawiają się, czy pogarszają z tygodnia na tydzień, obliczając lejek osobno dla każdego tygodnia. Pogrupuj tabelę pierwszych zdarzeń według tygodnia za pomocą first_events['homepage'].dt.isocalendar().week i oblicz całkowity współczynnik konwersji dla każdego tygodnia. Nagły spadek w konkretnym tygodniu może zbiegać się z wydaniem produktu lub zmianą marketingową.

df['week'] = df['timestamp'].dt.isocalendar().week

weekly_conv = []
for week, wdf in df.groupby('week'):
    top = wdf[wdf['event_type'] == FUNNEL_STEPS[0]]['user_id'].nunique()
    bot = wdf[wdf['event_type'] == FUNNEL_STEPS[-1]]['user_id'].nunique()
    weekly_conv.append({'week': week, 'conversion_%': bot/top*100 if top else 0})

print(pd.DataFrame(weekly_conv))

Tworzenie DataFrame podsumowania lejka

Umieść wszystkie metryki lejka w przejrzystym DataFrame podsumowania, który można wyeksportować do raportu lub przekazać do wizualizacji. Uwzględnij kolumny z nazwą etapu, liczbą użytkowników, konwersją między etapami, całkowitą konwersją oraz liczbą utraconych użytkowników. Ten pojedynczy DataFrame powinien być rezultatem analizy lejka i być czytelny zarówno dla inżynierów, jak i menedżerów produktu.

summary = pd.DataFrame({
    'step': FUNNEL_STEPS,
    'users': [step_counts[s] for s in FUNNEL_STEPS]
})
summary['users_lost'] = summary['users'].shift(-1).rsub(summary['users'])
summary['step_conv_%'] = (summary['users'] / summary['users'].shift(1) * 100).round(1)
summary['overall_conv_%'] = (summary['users'] / summary['users'].iloc[0] * 100).round(1)
print(summary)

Wizualizacja lejka na wykresie słupkowym

Przedstaw lejek jako poziomy wykres słupkowy, na którym długość każdego słupka odpowiada liczbie użytkowników na danym etapie. Kształt lejka pojawia się naturalnie, gdy słupki zostaną uporządkowane od góry (najwięcej użytkowników) do dołu (najmniej). Opisz każdy słupek procentem konwersji między kolejnymi etapami, aby wykres był samodzielny i nie wymagał interpretowania osobnej tabeli danych.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 5))
ax.barh(summary['step'][::-1], summary['users'][::-1], color='steelblue')
for i, row in summary[::-1].iterrows():
    ax.text(row['users'], i - summary.index[0], f'  {row['step_conv_%']}%', va='center')
ax.set_xlabel('Unique Users')
ax.set_title('Conversion Funnel')
plt.tight_layout()
plt.show()

Szybkie sprawdzenie

Sprawdź swoją znajomość zagadnień analizy danych z tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyłeś się: zliczać unikalnych użytkowników na każdym etapie lejka, obliczać współczynniki konwersji między kolejnymi etapami oraz dla całego lejka, a także dzielić lejki według typu urządzenia i śledzić tygodniowe trendy konwersji. Następnie omówimy kohortowe tabele retencji, które pozwalają śledzić, ilu użytkowników wraca z tygodnia na tydzień.

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 „Analiza lejka” jest bezpłatna?

Tak — pełny tekst „Analiza lejka” 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 „Analiza lejka”?

Śledź, ilu użytkowników dociera do każdego etapu wieloetapowego lejka, i obliczaj współczynniki konwersji między kolejnymi etapami. Ć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 2 z 4.

Ile czasu zajmuje lekcja „Analiza lejka”?

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. Tworzenie sesji i sekwencjonowanie zdarzeń
  2. Analiza lejka
  3. Tabela retencji kohort
  4. Wizualizacja ścieżek użytkowników
← Powrót do Pandas & NumPy Academy