サービス紹介ページはお問い合わせに効いているのか？


##この記事は、[WEBやデータ分析に関する投稿をみんなでしてみよう Advent Calendar 2020](https://qiita.com/advent-calendar/2020/think-with-tomohiko)の22日目の記事です。

多分、ブログを書くのも年内最後になります。何を書こうかなぁ？と考えたのですが、やはり自分的には今年は機械学習の年だったので、Exploratoryで締めたいと思います。

##お題と解き方

お題は、このブログ記事のタイトルにもしました**「サービス紹介ページはお問い合わせに効いているのか？」**です。よく、お客様からもご質問を受けますね。
このお題への解の出し方はたくさんあると思うのですが、この記事では「ロジスティック回帰」を利用してみたいと思います。

##データラングリング

Exploratoryでは分析の種類として「ロジスティック回帰」を選んで「実行」をポチっとするとあっという間に結果が出ます。ですので、その部分に掛かる労力は、右手の人差し指を1mm程度動かしてトラックボールの左ボタンを押すだけです。

が、手間がかかるのはデータラングリングと呼ばれるデータの整形です。そしてデータラングリングはExploratoryの得意技です。

今回、ロジスティック回帰分析を動かす上で必要となるデータの要件は、以下です。

1. １行が1ユーザー（※）となっている
1. サービスページを見たかどうか？というブール型のカラムがある
2. お問い合わせをしたかどうか？というブール型のカラムがある

（※）「サービスページを見た**ユーザー**がお問い合わせをしやすいのか？がお題の場合は1行が1ユーザーとしますが、もし、お題が「サービスページを見た **セッション**がお問い合わせに繋がりやすいのか？」であれば、1行を1セッションとします。このように、関心のあるものについて1行にするというのが機械学習を利用するときのデータラングリングの大原則ですので、覚えておくと良いかな。と思います。

こんな感じですね。

![1219_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/d3bb0ac8-9cb8-070a-b150-be276f12c3dd.png)

- cidはユーザーを一意に特定するID
- has_browsed_servicedpage_maxは、サービスページを見たかどうか？
- has_converted_maxは、お問い合わせをしたかどうか？

です。

##肝となるラングリングのステップ

Google アナリティクスから取得したデータは普通、最初はこのような形をしています。赤枠のユーザーさんは複数ページを見てくれていますが、このユーザーさんはサービスページを見ていないので、このユーザー1レコードにまとめると、「サービスページを閲覧したか？」の列は、FALSEとなるようにラングリングしなければなりません。ですよね？

![1219_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/477a3404-d561-4b8e-30b8-a2d95a81acc5.png)

一方、こちらのユーザーさんは、「サービス紹介をページを閲覧したか？」の列はTRUEとなるようにしなければなりません。

![1219_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/b48cccef-c376-916e-2a86-94dd0b693d44.png)

そのラングリングを可能にするのは、以下の3ステップで行います。

###第一ステップ = 行単位で「サービスページを閲覧したら1」のフラグを立てる

Exploratory内で以下の計算式を書きます。見慣れない読者の方もいらっしゃるかもしれませんが、やっていることは単純で、行単位で見ていったときに（どのユーザーかは全く問わず）pageが "/service/"で始まっていたら1を、そうでなければ0フラグとして立て、カラム名（これは任意の名前でOK）は、has_browsed_serivcepageとしなさい。という命令となっています。

![1219_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/69ef5828-3d47-6612-6e72-f226f01351fb.png)

結果はこうなります。特に難しくないですね。

![1219_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/ef8e76af-07f9-4166-7de1-e6d865f7570a.png)

###第二ステップ = ユーザー別にグループ化して最大値を取得する

メインとなるのがこのステップです。ユーザー別に1行にする作業はデータラングリングでは**「グループ化」**と呼びます。。
そして、このケースでは、グループ化したユーザーごとに、has_browsed_serivcepageの最大値を取得します。（合計値でもなんとかなりますが、最大値の方が第三ステップがスマートに行えますので、最大値を推奨します。）その作業を**「集計」**と呼びます。

Exploratoryでこの「グループ化」と「集計」を行うステップは**「集計（Summarize)」**です。実際の画面は以下となります。


![1219_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/bc216523-3e4c-fd7c-e6d3-90693f0cd91d.png)

プレビューが出るのが親切ですね。うまく集計できていて、/service/を閲覧していないユーザーは0、閲覧したユーザーは1となっています。

また、今は「最大値」を使って集計していますが、実は集計の方法は以下の通りにたくさん用意されていて、簡単に切り替えることができます。このあたりが非常に強力なのが、私がExploratoryを好きな理由です。

![1219_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/86a8b04b-62e8-2b04-f3c0-567016698a50.png)

###第三ステップ = ブール型にカラムを変更する

今、ユーザーごとに1、あるいは0が格納されている、has_browsed_serivcepage カラムですが、これをTRUEやFALSEといったブール型（ExploratoryはRのUIなので、Rの流儀に従うとLogical型）に変換します。

ここにもExploratoryが用意した関数をUIがありますので、自分で計算式を書かずに変換することができます。

![1219_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/87b5c52a-5132-0281-8cbb-de98ad0d003f.png)

このとき、1がTRUEに、0がFALSEに変換されます。

![1219_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/8b48811c-43f6-e8ad-65c1-d2d800826a22.png)


##ロジスティック回帰分析の設定

同様に、ユーザーごとに、お問い合わせという「コンバージョンを起こしたかどうか？」も取得したら、あとは、以下の操作でロジスティック回帰分析を回すだけです。

1. アナリティクスタブ（上部の緑のタブ）を選択
1. タイプに「ロジスティック回帰」を選択
1. 目的変数に「コンバージョンしたかどうか？」のLogical型カラムを選択
1. 予測変数に「サービスページを閲覧したユーザーかどうか？」のLogical型カラムを選択
1. 実行ボタンをクリック

### 結果 - 予測タブ

予測タブは以下の通りに出力されます。

![1219_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/a8308eb6-2bc8-d1a0-150b-a3cc772e58f5.png)

has_browsed_serivcepage_maxがTRUE、つまりサービスページを閲覧したユーザーのコンバージョン率を示しているのが左側のエラーバーです。サービスページを閲覧していないユーザーのコンバージョン率はFALSEで示されている右側のエラーバーとなります。
なぜ、1点でなく、上下に「ヒゲ」が出ているのか？といえば、「区間推定」をしていて、その「信頼区間」を示しているからです。
このチャートから、以下の3点が分かります。

**1. サービスページを閲覧したユーザーの方がそうでないユーザーよりもコンバージョン率が高いこと**
**2. エラーバーはサンプルサイズの小さい「TRUE」の方が長く伸びていること**
**3. ただ、そのヒゲを含めても、エラーバー（95%信頼区間）が、TRUEとFALSEで被っていないこと**

この時点で、サンプルサイズを加味しても、統計的に、サービスページの閲覧はコンバージョンを起こすことに対して効いている。と判断できます。


### 結果 - 係数（表）タブ

係数表タブでは、詳細なデータが表示されます。

オッズ比は、サービスページを閲覧することが、閲覧しないことに比べて、何倍コンバージョンへの至りやすいかを示しています。
また、P値は、このような結果が偶然でる可能性を示しています。一般的には0.05以下で「有意」（＝統計学的に、データのゆらぎを加味しても差がある）とされるしきい値です。
この例ではかなり小さいので、P値については問題ありません。

![1219_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/0dcd8e19-13df-2d0f-b91b-daa52c61bb05.png)

オッズ比からは、サービスページを閲覧するユーザーは、閲覧しないユーザーに比べて、約30倍もお問い合わせをする確率が高いことが分かりました。

## 謝辞

永井さん、このような機会を頂き、ありがとうございました。
自分でブログを書くと、ついついスケジュールを後ろ倒ししてしまいがちですが、アドベントカレンダーはその点「良い強制力」があり、刺激になりました。


それでは皆さん、来年も良いお年を！！