ファネル分析
複数ステップのファネルの各段階に到達したユーザー数を追跡し、連続するステップ間のコンバージョン率を計算します。
「ファネル分析」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
コンバージョンファネルとは
コンバージョンファネルは、ユーザーが一連の必須ステップを進む過程をモデル化したものです。たとえば、ホームページ → 商品ページ → カートに追加 → チェックアウト → 購入という流れです。各ステップで一部のユーザーが離脱し、次のステップに進まなくなります。ファネル分析ではこの離脱を定量化し、最初に改善すべきステップの優先順位をチームが決められるようにします。出力は、各ステップのユーザー数とコンバージョン率を示すテーブルです。
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())各ステップのユニークユーザー数を数える
各ファネルステップについて、そのイベントを少なくとも1回発生させたユニークユーザー数を数えます。ループ内でdf[df['event_type'] == step]['user_id'].nunique()を使い、結果を辞書に集めます。Seriesに変換すると、1回の割り算で後続の割合計算を簡単に行えます。
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)ステップ間のコンバージョン率を計算する
ステップ間のコンバージョン率は、ステップNを完了したユーザーのうち、ステップN+1も完了したユーザーの割合を示します。funnel.shift(1)(前のステップの数を返します)を使って計算し、funnel / funnel.shift(1) * 100のように割り算します。最初のステップには前のステップがないため、基準の定義によって率はNaNまたは100 %になります。
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)全体のコンバージョン率を計算する
全体のコンバージョン率は、ステップ1でファネルに入った全ユーザーのうち、最終ステップまで完了したユーザーの割合を測定します。最終ステップのユーザー数を最初のステップのユーザー数で割ります。ホームページから購入までの全体のコンバージョン率は、eコマースでは2~5 %が一般的です。これを下回る場合、ファネルのどこかで重大な離脱が発生している可能性があります。
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_%']])順序付きファネル:ステップの順序を必須にする
単純なユニークユーザー数の集計では、商品ページを訪れずに直接チェックアウトへ進んだユーザーも有効なファネル参加者として扱われるため、初期ステップのコンバージョン率が高く見えてしまいます。順序を適用するには、ユーザーがステップNに到達する前にステップN-1へ到達していることを確認します。そのためにはタイムスタンプを比較し、ユーザーのadd_to_cartイベントより前にproduct_pageイベントが発生していなければなりません。
# 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())セグメント別ファネル:デバイス種別
ユーザーセグメントによって、コンバージョン率は大きく異なる場合があります。groupby('device_type')を使い、デスクトップユーザーとモバイルユーザーについて同じファネル計算を個別に実行します。モバイルユーザーがチェックアウトの段階で大きく離脱している場合、小さな画面でチェックアウトページが使いにくい可能性があります。セグメント別ファネルから、対象を絞った最適化の機会が見つかります。
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)最大の離脱ステップを特定する
ユーザー数の絶対的な減少が最も大きいステップが、最優先で最適化すべき対象です。funnel.diff()で連続するステップ間のユーザー数の差を計算し、最も負の値を持つステップを見つけます。これが最大の離脱を示します。この洞察を数値と視覚の両方で関係者に提示します。
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)')ファネルステップ間の時間
ユーザーがあるステップから次のステップへ移動するのにかかる時間から、どこに障壁があるかが分かります。カートに追加してからチェックアウトするまでに数時間かかっている場合、カゴ落ちメールでユーザーを呼び戻せる可能性があります。first_events DataFrameを使い、隣接するタイムスタンプ列を引き算してユーザー全体の中央値を取ることで、各ステップの組み合わせ間の時間の中央値を計算します。
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')週次ファネルの推移
週ごとにファネルを個別に計算し、コンバージョン率が週単位で改善しているか悪化しているかを追跡します。first_events['homepage'].dt.isocalendar().weekを使って最初のイベントのテーブルを週ごとにグループ化し、週ごとの全体のコンバージョン率を計算します。特定の週に急な低下が見られる場合、プロダクトのリリースやマーケティングの変更と重なっている可能性があります。
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))ファネル集計DataFrameを作成する
すべてのファネル指標を整理された集計DataFrameにまとめ、レポートに出力したり、可視化に利用したりできるようにします。ステップ名、ユーザー数、ステップ間のコンバージョン率、全体のコンバージョン率、離脱したユーザー数の列を含めます。この1つのDataFrameがファネル分析の成果物となり、エンジニアとプロダクトマネージャーの両方が読み取れる形にします。
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)ファネルを棒グラフとして可視化する
各ステップのユーザー数をバーの長さで表す横棒グラフとしてファネルを描画します。バーを上から(ユーザー数が最も多いものから)下へ(最も少ないものへ)並べると、自然にファネルの形になります。各バーにステップ間のコンバージョン率を注記して、別のデータテーブルがなくてもグラフだけで内容を解釈できるようにします。
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()理解度チェック
このレッスンで学んだデータ分析の概念について理解度を確認します。
レッスンのまとめ
このレッスンでは、ファネルの各ステップにおけるユニークユーザー数のカウント、ステップ間および全体のコンバージョン率の計算、デバイスタイプによるファネルのセグメント分けと週次コンバージョン推移の追跡について学びました。次は、ユーザーが毎週どの程度戻ってくるかを追跡するコホートリテンションテーブルについて学びます。
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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ファネル分析」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。