Wizualizacja ścieżek użytkowników
Przedstaw lejek na poziomym wykresie słupkowym, a macierz retencji na mapie cieplnej, aby przekazać wnioski interesariuszom.
Wizualizacja ścieżek użytkowników 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.
Dlaczego warto wizualizować ścieżki użytkowników?
Surowe tabele zdarzeń i liczbowe współczynniki konwersji trudno przekazać odbiorcom nietechnicznym. Wizualizacje ścieżek użytkowników — wykresy lejka, mapy cieplne retencji i diagramy Sankeya — sprawiają, że wzorce stają się natychmiast widoczne. Celem nie jest zastąpienie liczb, lecz przedstawienie ich w formie, w której wnioski można dostrzec na pierwszy rzut oka, zmniejszając obciążenie poznawcze odbiorców.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Assume funnel_summary and retention_pct are already computed
print('Visualisation libraries loaded')Poziomy wykres słupkowy lejka
Poziomy wykres słupkowy to najprostsza i najczęściej rozumiana wizualizacja lejka. Każdy słupek przedstawia etap lejka, a jego długość — liczbę użytkowników. Uporządkuj etapy od góry do dołu w kolejności lejka, aby wykres przypominał rozszerzający się lejek. Użyj jednego kontrastowego koloru dla wszystkich słupków, aby uwaga odbiorców skupiała się na wartościach, a nie na różnorodności kolorów.
FUNNEL_STEPS = ['homepage', 'product_page', 'add_to_cart', 'checkout', 'purchase']
users = [10000, 7200, 4100, 2300, 980]
fig, ax = plt.subplots(figsize=(9, 5))
bars = ax.barh(FUNNEL_STEPS[::-1], users[::-1], color='steelblue', height=0.6)
ax.set_xlabel('Unique Users')
ax.set_title('Conversion Funnel')
plt.tight_layout()
plt.show()Dodawanie współczynników konwersji do wykresu
Dodaj adnotacje ze współczynnikami konwersji przy prawym końcu każdego słupka za pomocą ax.text(). Pokaż zarówno bezwzględną liczbę użytkowników, jak i procent konwersji między kolejnymi etapami, aby wykres zawierał wszystkie potrzebne informacje bez osobnej tabeli danych. Umieść tekst nieco poza końcem słupka, z niewielkim poziomym przesunięciem, aby nie nachodził na jego wypełnienie.
conversions = [None, 72.0, 56.9, 56.1, 42.6]
for i, (u, c) in enumerate(zip(users[::-1], conversions[::-1])):
label = f'{u:,} users'
if c is not None:
label += f' ({c}% conv)'
ax.text(u + 100, i, label, va='center', fontsize=9)
plt.tight_layout()
plt.show()Mapa cieplna retencji — powtórzenie
Mapa cieplna retencji to standardowy wynik analizy kohort. Każdy wiersz oznacza kohortę, każda kolumna — przesunięcie tygodniowe, a kolor każdej komórki odpowiada procentowi retencji. Użyj mapy kolorów RdYlGn (czerwony = niska wartość, zielony = wysoka) oraz jawnie ustawionych vmin=0, vmax=100, aby skala kolorów była spójna we wszystkich prezentacjach i nie była przeliczana osobno dla każdej mapy cieplnej.
import numpy as np
# Simulated retention data for illustration
data = [[100, 55, 42, 38, 35, 33],
[100, 52, 40, 36, 33, 0],
[100, 58, 45, 41, 0, 0],
[100, 60, 48, 0, 0, 0]]
retention_pct = pd.DataFrame(data, columns=range(6),
index=['Wk1', 'Wk2', 'Wk3', 'Wk4'])
fig, ax = plt.subplots(figsize=(10, 4))
sns.heatmap(retention_pct, annot=True, fmt='.0f', cmap='RdYlGn',
vmin=0, vmax=100, linewidths=0.5, ax=ax)
ax.set_title('Cohort Retention Heatmap')
plt.tight_layout()
plt.show()Maskowanie niepełnych komórek kohort
Nowsze kohorty nie miały jeszcze czasu przejść przez wszystkie przesunięcia tygodniowe. Te komórki powinny być puste, a nie przedstawione jako 0 %, aby odbiorcy nie pomylili braku danych z zerową retencją. Utwórz maskę logiczną, w której wartość komórki wynosi 0, a indeks kolumny przekracza liczbę tygodni, przez które kohorta już istniała, a następnie przekaż ją do sns.heatmap(mask=...).
mask = retention_pct == 0 # cells with no data yet
fig, ax = plt.subplots(figsize=(10, 4))
sns.heatmap(retention_pct, annot=True, fmt='.0f', cmap='RdYlGn',
vmin=0, vmax=100, linewidths=0.5,
mask=mask, ax=ax)
ax.set_title('Cohort Retention (incomplete cells masked)')
plt.tight_layout()
plt.show()Rysowanie średniej krzywej retencji
Wizualizuj średnią krzywą retencji, rysując średnie wartości kolumn macierzy retencji. Ta pojedyncza linia podsumowuje ogólny profil retencji produktu. Dodaj zacienione pasmo odpowiadające ±1 odchyleniu standardowemu, aby pokazać zmienność między kohortami. Wąskie pasmo oznacza podobne zachowanie kohort, a szerokie sugeruje istotne różnice między kohortami, które warto zbadać.
avg = retention_pct.mean(axis=0)
std = retention_pct.std(axis=0)
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(avg.index, avg, marker='o', color='steelblue', linewidth=2)
ax.fill_between(avg.index, avg - std, avg + std, alpha=0.2, color='steelblue')
ax.set_xlabel('Week Number')
ax.set_ylabel('Avg Retention %')
ax.set_title('Average Cohort Retention Curve')
plt.tight_layout()
plt.show()Segmentowany lejek: komputer stacjonarny a urządzenie mobilne
Rysowanie obok siebie lejków dla różnych segmentów pokazuje, czy problemy z produktem mają charakter ogólny, czy dotyczą konkretnego urządzenia. Utwórz grupowany wykres słupkowy z dwiema grupami słupków dla każdego etapu lejka, używając ax.bar() z przesunięciem na osi x. Możesz też narysować dwa osobne wykresy lejka w układzie podwykresów 1×2 za pomocą plt.subplots(1, 2), aby ułatwić porównanie.
steps = ['Homepage', 'Product', 'Cart', 'Checkout', 'Purchase']
desktop = [5000, 3800, 2300, 1500, 700]
mobile = [5000, 3400, 1800, 900, 280]
x = range(len(steps))
fig, ax = plt.subplots(figsize=(10, 5))
ax.bar([i - 0.2 for i in x], desktop, width=0.4, label='Desktop', color='steelblue')
ax.bar([i + 0.2 for i in x], mobile, width=0.4, label='Mobile', color='darkorange')
ax.set_xticks(list(x))
ax.set_xticklabels(steps)
ax.legend()
ax.set_title('Funnel by Device Type')
plt.tight_layout()
plt.show()Rozkład częstotliwości zdarzeń
Wizualizacja rozkładu liczby zdarzeń w sesji pokazuje, czy sesje skupiają się wokół niewielkiej liczby zdarzeń (co sugeruje, że użytkownicy szybko osiągają cel), czy obejmują szeroki zakres (co może wskazywać na złożone ścieżki lub dezorientację). Narysuj wykres za pomocą ax.hist() dla kolumny event_count, używając skali logarytmicznej na osi y, jeśli rozkład jest silnie prawostronnie skośny.
import numpy as np
event_counts = pd.Series([3, 5, 2, 8, 1, 12, 3, 4, 6, 20, 2, 3, 1, 7, 5])
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(event_counts, bins=15, color='steelblue', edgecolor='white')
ax.set_xlabel('Events per Session')
ax.set_ylabel('Number of Sessions')
ax.set_title('Session Event Frequency Distribution')
plt.tight_layout()
plt.show()Najczęstsze sekwencje zdarzeń
Pokaż najczęstsze sekwencje dwóch zdarzeń (bigramy) w strumieniu kliknięć, aby zrozumieć typowe ścieżki użytkowników. Grupuj dane według sesji, sortuj według event_rank i wyodrębnij kolejne pary za pomocą zip(events, events[1:]). Zlicz częstotliwość par za pomocą Counter i przedstaw 10 najczęstszych na poziomym wykresie słupkowym. Dzięki temu zobaczysz, które ścieżki nawigacji dominują w zachowaniu użytkowników.
from collections import Counter
events_per_session = [['homepage', 'product_page', 'add_to_cart'],
['homepage', 'search', 'product_page'],
['homepage', 'product_page', 'purchase']]
bigrams = Counter()
for session in events_per_session:
for pair in zip(session, session[1:]):
bigrams[pair] += 1
print(bigrams.most_common(5))Rozkład czasu trwania sesji
Histogram czasu trwania sesji pokazuje, czy użytkownicy korzystają z produktu krótko (poniżej 2 minut), umiarkowanie, czy intensywnie. Użyj logarytmicznej skali osi x, jeśli niewielka liczba bardzo długich sesji spowodowałaby skupienie większości danych w skrajnym lewym przedziale. Dodaj pionową linię w miejscu mediany za pomocą ax.axvline(), aby ułatwić odbiorcom interpretację typowej długości sesji.
durations = pd.Series([1.2, 3.5, 0.5, 12.3, 2.1, 8.7, 1.8, 0.3, 45.1, 4.6])
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(durations, bins=20, color='steelblue', edgecolor='white')
ax.axvline(durations.median(), color='red', linestyle='--', label=f'Median: {durations.median():.1f} min')
ax.set_xlabel('Session Duration (min)')
ax.set_ylabel('Sessions')
ax.legend()
plt.tight_layout()
plt.show()Zapisywanie wykresu kokpitu
Połącz wiele wizualizacji w jeden wykres kokpitu, używając siatki podwykresów utworzonej za pomocą plt.subplots(2, 2, figsize=(14, 10)). Przypisz do poszczególnych paneli wykres słupkowy lejka, mapę cieplną retencji, średnią krzywą retencji i rozkład zdarzeń. Zapisz wynik w formacie PNG na potrzeby publikacji w internecie lub PDF na potrzeby raportów przeznaczonych do druku. Jeden spójny wykres łatwiej udostępnić niż cztery osobne pliki.
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# Panel 1: funnel
axes[0, 0].barh(FUNNEL_STEPS[::-1], users[::-1], color='steelblue')
axes[0, 0].set_title('Funnel')
# Panel 2: retention heatmap
sns.heatmap(retention_pct, ax=axes[0, 1], cmap='RdYlGn', annot=True, fmt='.0f', vmin=0, vmax=100)
axes[0, 1].set_title('Cohort Retention')
fig.suptitle('User Journey Dashboard', fontsize=16)
plt.tight_layout()
fig.savefig('user_journey_dashboard.png', dpi=150, bbox_inches='tight')
print('Dashboard saved')Szybkie sprawdzenie
Sprawdź swoją znajomość zagadnień analizy danych z tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyłeś się: tworzyć opisane wykresy słupkowe lejka i mapy cieplne retencji, rysować średnie krzywe retencji z pasmami zmienności, a także łączyć wiele wykresów w jeden wykres kokpitu zapisywany w formacie PNG. Następnie omówimy wykrywanie i usuwanie zduplikowanych rekordów w zaawansowanym czyszczeniu danych.
Często zadawane pytania
Czy lekcja „Wizualizacja ścieżek użytkowników” jest bezpłatna?
Tak — pełny tekst „Wizualizacja ścieżek użytkowników” 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 „Wizualizacja ścieżek użytkowników”?
Przedstaw lejek na poziomym wykresie słupkowym, a macierz retencji na mapie cieplnej, aby przekazać wnioski interesariuszom. Ć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 „Wizualizacja ścieżek użytkowników”?
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