TT Lab
はじめる
学ぶ 学習パス コース

開発者の起業 — 作る前に検証する

順序と窓を守ったファネルとチャネル帰属

TT Labで続きを見る

目標

「モアノート」の記録で、順序と14日の窓を守った人数ファネルを作り、よくある間違いが数字をどれだけ膨らませるかを測った後、ファーストタッチ・ラストタッチのアトリビューションで、チャネル別のCACを計算して比べます。

なぜ重要なのか

ファネルは、どこで人が漏れるかを、アトリビューションとCACは、どこにお金を使うかを、決めます。イベントの行数を数えたり、順序・窓を無視したりすると、欄が膨らみ、アトリビューションモデルを黙って変えると、同じチャネルのCACが変わります。定義をコードで固定して、計算し直せるようにして初めて、チームが同じ数字で話せます。

用意するものと定義

ステップ

  1. /root/founder/funnel/counts.jsonに、ファネルのイベント4種類(create_doc・share_doc・invite_sent・upgrade)それぞれの{"events": 줄 수, "users": 사람 수}(プレースホルダーは行数と人数です)を、外部ユーザー基準、観測全体で書く。
  2. /root/founder/funnel/funnel.pyに、funnel(fix)を作る: 定義どおりの、5つの整数のリスト。
  3. /root/founder/funnel/order.jsonに、順序を無視したとき(14日の窓の中に、前の段階のイベントが、順序と無関係にすべてあれば到達)の5つの欄unorderedと、定義どおりのorderedを書く。
  4. /root/founder/funnel/window.jsonに、窓をなくしたとき(観測の最後まで、順序は守る)の5つの欄no_windowと、window_14dを書く。
  5. /root/founder/funnel/conversion.jsonに、step_rates(欄i ÷ 欄i−1、4個、小数第4位)、overall(upgrade ÷ 登録)、biggest_drop(コンバージョン率が最も低い段階の到着段階の名前、例: "share_doc")を書く。
  6. funnel.pyのfunnel(fix, channel=None)は、channelを受け取ったら、ラストタッチがそのチャネルの人だけでファネルを出す。/root/founder/funnel/channel.jsonに、5つのチャネルのファネルを書く。
  7. /root/founder/funnel/attribution.jsonに、first_touch・last_touchそれぞれの、チャネル別の有料転換者数を書く。
  8. /root/founder/funnel/cac.jsonに、first_touch・last_touchそれぞれの、チャネル別のCACと、cheapest_paid_last(費用が0より大きいチャネルのうち、ラストタッチのCACが最も低いチャネル)、rank_changed(費用があるチャネルのCACの順位が、2つのモデルで違えばtrue)を書く。

参考

イベント数と人数は違う

/root/founder/funnel/counts.jsonに、create_doc・share_doc・invite_sent・upgradeの、events(行数)・users(人数)を、外部ユーザー基準で書く。

同じイベントのリストで、len(リスト)とlen(set(ユーザー))を並べて求めれば済みます。社内アカウントは、users.csvで除きます。

順序と14日の窓を守った人数ファネル

/root/founder/funnel/funnel.pyに、funnel(fix)を作る。[登録, create_doc, share_doc, invite_sent, upgrade]の5つの整数。

人ごとに(時刻, イベント)を並べ替え、次に待っている段階と同じイベントが、前の段階の到達時刻以降に出てきたら、1欄前進します。登録後14×24時間を過ぎたイベントは捨てます。

順序を無視すると、後ろの欄が膨らむ

/root/founder/funnel/order.jsonに、ordered(定義どおり)とunordered(14日の窓の中に、前の段階のイベントが順序と無関係にすべてあれば到達)の、2つのファネルを書く。

窓はそのままにして、到達の判定だけを変えます。unorderedは、窓の中のイベント種類の集合に、前の段階がすべてあるかどうかだけを見ます。

窓をなくすと、古い人ほど転換が高く見える

/root/founder/funnel/window.jsonに、window_14d(定義どおり)とno_window(観測の最後まで、順序は守る)の、2つのファネルを書く。

順序の判定はそのままにして、14日の窓だけをなくします。

段階別のコンバージョン率と、最も大きく漏れる欄

/root/founder/funnel/conversion.jsonに、step_rates(4個)・overall・biggest_drop(コンバージョン率が最も低い段階の、到着段階の名前)を書く。

step_rates[i]は、ファネルの欄i+1 ÷ 欄iです。biggest_dropは、最も低い比率が「到着する」段階の名前(create_doc–upgradeのうちの1つ)です。

登録経路別のファネル

funnel(fix, channel=None)は、channelを受け取ったら、ラストタッチがそのチャネルの人だけでファネルを出す。/root/founder/funnel/channel.jsonに、5つのチャネルのファネルを書く。

touches.csvで、人ごとにtsが最も遅い接点のchannelで、登録者の名簿だけを絞り、残りの計算はそのままです。

ファーストタッチとラストタッチで、転換を帰属する

/root/founder/funnel/attribution.jsonに、first_touch・last_touchそれぞれの、チャネル別の有料転換者数を書く。

有料転換者は、観測期間内にupgradeがある外部ユーザーです(14日の窓ではありません)。ファーストタッチは最も早いts、ラストタッチは最も遅いtsのchannelです。

アトリビューションモデルが、チャネルCACを変える

/root/founder/funnel/cac.jsonに、first_touch・last_touchのチャネル別のCAC(整数に切り捨て、帰属が0ならnull)と、cheapest_paid_last・rank_changedを書く。

CAC = 3か月の費用の合計 // 帰属した転換者数。費用が0のチャネルは、順位の比較から除きます。rank_changedは、費用があるチャネルをCACの昇順に並べた順序が、2つのモデルで違うかどうかです。