Edited at

実際のマーケデータを使って広告がどれくらい検索流入に貢献しているのか重回帰分析&モデル化に挑戦してみた


自己紹介&学習の動機


  • ウェブマーケター3年目でITサービスのマーケティングを担当

  • 文系出身でプログラミング経験なし、データサイエンス経験なし

  • 広告施策が検索流入へ与える貢献度を可視化して施策の最適化をしたい

  • 統計解析の会社に発注を検討するもコストが高く発注できない

  • 自分の知識がなさすぎて発注や納品データの検収ができないという課題もある

  • いっそのこと自分でスキルを習得して実現できないかと試みることに


受講したコース

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 中級編 -


  • 日本マイクロソフト・Preferred NetworksのAI人材育成トレーナーに任命された株式会社キカガクの代表が講師

  • 一度専門書で挫折してしまった人をターゲットとしているということもあり人工知能の仕組みや機械学習で必要な数学との結びつきが非常にわかりやすい

  • pythonプログラミングでの実装までを短期間で身につけられる超お得なコース

  • 初級で単回帰、中級で重回帰までを扱う


ゴール

下記を変数とした重回帰モデルの作成

- 目的変数(出力変数)を「サービス名での検索流入数」

- 説明変数(入力変数)を「各種広告施策から発生したセッション」

「サービス名での検索流入数」とは、例えば、「メルカリ」とか「ユニクロ」とか具体的なサービス名称での検索でサイトに流入してきた数がどれくらいかという意味です。

ディスプレイ広告とか記事とか様々な広告施策でサイトへの流入を作るのですが、お客さんはすぐに購入するわけではなく、そのサービスについて調べて検討をして最終的に購入することが多いはずです。

そのため、広告で作ったセッションが検索での流入にどれだけ影響いていたのかを可視化することで、各種広告施策の予算配分などが最適化できるのではないかと考え、今回の分析・モデル化を実現してみたいと思いました。

今回の記事では、コースで学習した数学や各コードの意味などはほとんど記載していません。コースで得た知識をもとに実務データを使って自身の業務にどう活かせそうかを試すために分析・モデル作成のアプローチの流れをまとめてみたという内容になります。

【全く知識がない状態からコースで学んだことを元に見様見真似でやってみただけなので、正しいのか全く自信がありません。ぜひ皆さまからのご意見やアドバイスをコメントでお願いいたします!】


用意したデータ

かなりサンプルが少ないデータですが、2018年1月〜12月までの1年間の月別の広告施策のセッションデータとサービス名での検索流入数を用意しました。

(機密データにあたるので具体的な広告施策の項目は伏せています。)

スクリーンショット 2019-01-11 21.36.17.png

(そもそもこのサンプル数で分析して意味あるのでしょうか?・・・もっとデータがないといけないのでしょうか?単に精度が落ちるだけ?とかいった不安を抱えつつもまずはやってみることにします。)


モデル作成の手順

まずはじめにモデル作成までの全体の流れについてです。

以下の手順でモデルを作成しました。

1:モデルを決める

2:評価関数を決める

3:評価関数を最小化する

1:モデルを決める

前述の通り重回帰モデルを使います。

こういう数式のやつです。

y=a+b1x1+b2x2+b3x3+…+bnxn

2:評価関数を決める

実測値と予測値の二重誤差を求め、誤差を最小化することを目指します。誤差が小さいということは精度が高いということになります。

3:評価関数を最小化する

数式で表すと下記のようになります。

スクリーンショット 2019-01-28 23.09.37.png

受講してみて文系出身者からすると、かなり難しい数学に取り組んでいるな・・・という印象でしたが、それでもキカガクさんの指導のわかりやすさのおかげでなんとか機械学習に必要な数学のセクションをクリアしました。

ちなみに数学セクションは、テキストでメモが残せないので、このようにノートに手書きで書いて記録しました。

スクリーンショット 2019-01-28 22.58.39.png

講座では、これらの数式を元にプログラミングをしてモデルを作ることもするのですが、Scikit-learnという最高に便利な機械学習ライブラリを用いることで実際には、数式なしで簡単に重回帰分析をすることができます。

「じゃあ最初から数学はやらなくてもいいのでは・・・」と感じてもしまいますが、裏側の論理を理解していないと何か問題が起きた時に立ち返って解決できないですし、素人としては、実際に一連のプログラミングを経てからライブラリを使うことで、ライブラリのありがたみが身にしみて理解できるので良い経験になりました。

ここからはScikit-learnを使ってのモデル化までを記載します。


pythonによるプログラミングの手順

以下の手順でpythonでモデルを作成し、最後に各広告が検索に与える影響度を示すパラメータ(重み)を確認します。

1. データの読み込み

2. 相関関係の確認→扱う入力変数の決定

3. 入力変数と出力変数の切り分け

4. 訓練データと検証データの分割

5. モデルの学習(パラメータの調整)

6. 検証(予測精度の確認)

7. パラメータ(各入力変数の重み)の値


1. データの読み込み

はじめにpythonでの数値計算を効率的に行うためのnumpyと統計量の可視化などデータ分析に役立つpandasの2つのライブラリをインポートします。


numpyとpandasのインポート

import numpy as np

import pandas as pd

次に用意したcsvデータを読み込みます。


csvデータの読み込み

df = pd.read_csv(' marketing_data.csv')



2. 相関関係の確認→扱う入力変数の決定

各種広告と検索数との相関を相関係数を算出して確認します。


相関係数(corriration)の算出

df.corr()


その結果がこちら

スクリーンショット 2019-01-11 22.39.08.png

相関係数については、絶対値が

0.7~1.0:強い相関あり

0.4~0.7:相関あり

0.2~0.4:弱い相関あり

0.2以下:相関なし

ということなので今回は「サービス名_検索数」に対して

広告A:強い正の相関あり

広告B:相関あり

広告C:弱い相関あり

広告D:相関あり

広告E:相関あり

広告F:強い相関あり

広告G:弱い相関あり

という結果になりました。今回は「相関あり」、もしくは「強い相関あり」という結果が出たA,B,D,E,Fの5つの広告施策を入力変数にして重回帰モデルを作成することにします。

ちなみにpairplot関数を使えばビュジュアライズでき、目視で相関関係も確認できます。


pairplot関数での可視化

sns.pairplot(df)


このように一覧でパッと出てくるのでテンションが上がります!自分って単純だなと思いますが、学習においてワクワクしたり楽しいと感じる瞬間って大事ですよね。

スクリーンショット 2019-01-11 22.49.58.png


3. 入力変数と出力変数の切り分け

相関係数から今回パラメータに設定することを決めた5つの広告施策に絞ったデータを用意し読み込みます。


データの読み込み

df2 = pd.read_csv('marketing_data_2.csv')


このデータから入力変数と出力変数を切り分けます。


ilocを使い、切り分けを行います。

X = df.iloc[:,1:-1]

y = df.iloc[:,-1]

Xとyで切り分けができました。

スクリーンショット 2019-01-13 21.17.07.png

スクリーンショット 2019-01-12 14.20.41.png


4. 訓練データ(train)と検証データ(test)の分割

データを訓練用のデータと検証用のデータに分けてモデルを作成します。これはどういう意味があるのかというのがコースの中で受験勉強を例にわかりやすく解説されていました。

例えば、受験勉強用に10年分の過去問を購入したとします。そのとき、10年分で勉強(学習) をし、10年分で実力テスト(検証)を行なった場合、テストの結果(精度)は良くなるかもしれませんが、全ての過去問を一度勉強しているので本番の試験に臨んだ時に新しい問題に対応できる(新しいデータで予測できる)かは心配です。

そこで、前半の5年分(訓練用)で勉強をし、後半の5年分(検証用)で実力テストを行うことで、しっかりと本番にも対応できるように学習しようというのが訓練用データと検証用データに分ける目的になります。つまりこうすることで、より使えるモデルの作成に繋げることができるということなんですね。

ということで、まずデータを訓練用と検証用に分割をします。Scikit-learnにはこの作業もサポートされています。


訓練データ(train)と検証データ(test)の分割

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4, random_state = 1)


5. モデルの学習(パラメータの調整)

LinearRegression(重回帰分析)をモデルとして使うということを指定し、モデルの学習(パラメータの調整)を行います。

Scikit-learnの中のLinearRegressionを読み込みます。


Scikit-learnの中のLinearRegressionの読み込み

from sklearn.linear_model import LinearRegression



モデルの宣言と学習(パラメータの調整)

model = LinearRegression()

model.fit(X_train, y_train)


6. 検証(予測精度の確認)

予測精度の確認(検証)を決定係数を用いて行います。

決定係数は0~1の間で算出され、1に近いほど予測精度が高いという結果になります。(マイナスになる場合もあるそうです。)


検証(決定係数の計算:訓練データ)

model.score(X_train, y_train)



検証(決定係数の計算:検証データ)

model.score(X_test, y_test)


今回は、

訓練データ:0.95315067595674163

検証データ:0.75743781952894018

と算出されました。


7.パラメータ(各入力変数の重み)の値

最後に作成したモデルのパラメータを確認します。


パラメータの確認

model.coef_


次のように出力されました。

array([ 0.41, 0.04, 0.37, -0.11, 0.23])

左から広告A,B,D,E,Fです。この結果を見ると、広告Aが0.41と最も係数が大きく検索への影響度が大きいと言えそうです。

(ただ、Eに関しては負の値になっており、これは入力変数の項目として除外した方が良いということを意味しているのでしょうか?・・・この辺りの知識がまだ不足しているので今後も継続して学習していきたいと考えています。)


最後に

今回は、本当にコースを一度視聴して得た知識をもとに実際の業務データをを使って見様見真似でやってみた。だけです。きっと自分が気づいていないところでいくつもの落とし穴があって自分が実現したいことができていない、そもそもできるものではないのかもしれませんが、今の自分の知識では何がわからないのかもわからない状態なので、これからも実践的な力をつけていけるように頑張っていきたいと思います。

また、今回この講座を学んでデータサイエンスができるようになった訳ではありませんが、実際に手を動かしてモデル作成まで経験をしたことで前提となる基礎知識の習得にはつながったと感じています。

ここで学んだことを糧にさらに文献を読んで知識を深めたり、チャンスがあれば解析業務を外部に発注する際には共通言語として会話ができるように挑戦してみたいと思います。

数学なんてほんと高校以来だなと思いながら楽しく学ぶことができました。高校の時は微分とか一体何が楽しくて学ばなくてはいけないんだと感じていましたが、このように実社会で生きる力になるということをもっと早く知りたかったですw 

冒頭にも書かせていただいた通り、ぜひ知見のある皆様からのご意見やフィードバックをお待ちしております。