Pandas & NumPy Academy · レッスン

ユーザージャーニーの可視化

ファネルを横棒グラフで、リテンション行列をヒートマップで描画し、関係者に分析結果を伝えます。

レッスン 4/413 ステップ

「ユーザージャーニーの可視化」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

ユーザージャーニーを可視化する理由

イベントの生データテーブルや数値で表したコンバージョン率は、非技術系の関係者には伝わりにくいものです。ユーザージャーニーを視覚的に表現したファネルチャート、リテンションヒートマップ、Sankey ダイアグラムを使うと、パターンがすぐに明らかになります。目的は数値を置き換えることではなく、ひと目で洞察が明らかになる形で提示し、見る人の認知的負荷を減らすことです。

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')

ファネル用の横棒グラフ

横棒グラフは、最もシンプルで広く理解されているファネルの可視化方法です。各バーはファネルの1つのステップを表し、バーの長さはユーザー数を表します。ステップをファネルの順序に従って上から下へ並べ、広がっていくファネルとして読めるようにします。すべてのバーに単一の対照的な色を使い、色の種類ではなく値に注目が集まるようにします。

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

グラフへのコンバージョン率の注記

ax.text()を使い、各バーの右端にコンバージョン率の注記を追加します。絶対ユーザー数とステップ間のコンバージョン率の両方を表示し、別のデータテーブルがなくても必要な情報がすべて伝わるようにします。バーの塗りつぶしと重ならないよう、バーの端から少し外側に小さな水平方向のオフセットを付けてテキストを配置します。

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

リテンションヒートマップの再確認

リテンションヒートマップは、コホート分析の標準的な出力です。各行はコホート、各列は週のオフセット、各セルはリテンション率に応じた色を表します。RdYlGnカラーマップ(赤 = 低、緑 = 高)を使い、vmin=0, vmax=100を明示的に指定します。これにより、プレゼンテーション間で色のスケールが一貫し、ヒートマップごとに再スケーリングされることを防げます。

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

不完全なコホートセルのマスキング

新しいコホートには、すべての週のオフセットを経過するための時間がまだありません。そのため、該当するセルは 0 % ではなく空白として表示し、データが存在しないことをリテンションが 0 であると読み手が誤解しないようにします。セルの値が 0 かつ列インデックスがコホートの経過週数を超えている箇所を示すブール型マスクを作成し、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()

平均リテンション曲線の描画

リテンション行列の列平均を描画して、平均リテンション曲線を可視化します。この1本の線で、プロダクト全体のリテンションプロファイルを要約できます。コホート間のばらつきを示すため、標準偏差1つ分を表す帯を追加します。帯が狭ければコホート間の挙動が似ており、広ければ調査すべき重要なコホート間差異があることを示します。

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

セグメント別ファネル:デスクトップとモバイル

異なるセグメントのファネルを横に並べて描画すると、プロダクトの問題が全体的なものか、特定のデバイスに限られるものかがわかります。ax.bar()を水平方向のオフセットとともに使い、ファネルの各ステップに2つのバーグループを持つ集合棒グラフを作成します。または、plt.subplots(1, 2)を使って 1×2 のサブプロットグリッドに2つのファネルチャートを別々に描画すると、より比較しやすくなります。

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

イベント頻度分布

セッションあたりのイベント分布を可視化すると、セッションが少数のイベントに集中しているか(ユーザーがすぐに目的を達成していることを示唆します)、広い範囲にわたっているか(複雑なジャーニーや混乱を示唆します)がわかります。event_count列に対してax.hist()で描画し、分布が右に大きく歪んでいる場合は y 軸に対数スケールを使います。

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

主要なイベントシーケンス

クリックストリームで最も一般的な2イベントのシーケンス(バイグラム)を表示し、典型的なユーザーパスを把握します。セッションごとにグループ化し、event_rank の順に並べ、zip(events, events[1:])を使って連続するペアを抽出します。Counter でペアの頻度を数え、上位10件を横棒グラフとして描画します。これにより、どのナビゲーション経路がユーザー行動の大部分を占めているかがわかります。

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

セッション継続時間の分布

セッション継続時間のヒストグラムから、ユーザーが短時間(2分未満)、中程度、または長時間利用しているかがわかります。非常に長いセッションが少数あることでデータの大部分が左端のビンに圧縮される場合は、x 軸に対数スケールを使います。ax.axvline()で中央値に垂直線を重ね、「一般的な」セッション時間を解釈する際の基準にします。

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

ダッシュボードの図の保存

plt.subplots(2, 2, figsize=(14, 10))でサブプロットのグリッドを作り、複数の可視化を1つのダッシュボード図にまとめます。各パネルにファネル棒グラフ、リテンションヒートマップ、平均リテンション曲線、イベント分布を割り当てます。Web 配信用には PNG、印刷用レポートには PDF として保存します。統合された1つの図のほうが、4つの個別ファイルより共有しやすくなります。

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')

理解度チェック

このレッスンで学んだデータ分析の概念について理解度を確認します。

レッスンのまとめ

このレッスンでは、注記付きファネル棒グラフとリテンションヒートマップの作成、変動幅を示す帯付きの平均リテンション曲線の描画、複数のグラフを1つのダッシュボード図にまとめ、PNG として保存する方法について学びました。次は、高度なデータクリーニングで重複レコードを検出・削除する方法について学びます。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「ユーザージャーニーの可視化」レッスンは無料ですか?

はい。「ユーザージャーニーの可視化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「ユーザージャーニーの可視化」で何を学びますか?

ファネルを横棒グラフで、リテンション行列をヒートマップで描画し、関係者に分析結果を伝えます。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ユーザージャーニーの可視化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. セッション化とイベントの時系列化
  2. ファネル分析
  3. コホート・リテンションテーブル
  4. ユーザージャーニーの可視化
← Pandas & NumPy Academyに戻る