統計解析ツールRを使ったエンジニア向けデータマイニング講座後編。機械学習の1手法である決定木を用いて、事例を基にデータマイニングを実践していきます。エンジニアとしてのキャリアアップを考えている方にピッタリのデータマイニング連載企画最終回です。
前回は、ウェブ系のエンジニアの山田君がデータマイニングを始めるきっかけをお話ししました。
―Rを学ぼう!エンジニア向けデータマイニング講座|freee 坂本登史文【初めの第一歩編】
無事にRとMySQLを接続し、うまくヒストグラムを描くことができました。
今回は、山田君がデータマイニングを始めるきっかけとなった「どのような属性のユーザーが課金をしてくださっているのか」ということを、機械学習の1手法である、「決定木」という手法で明らかにしていきたいと思います。
さて、山田君はうまくデータを分析して、サービスの意思決定まで落とすことができるのでしょうか?これまで通り、山田君の気持ちになって読んでいただければ幸いです。
[プロフィール]
freee 株式会社 データマイニングエンジニア
坂本登史文 Toshifumi Sakamoto
京都大学理学研究科修了後、メーカー系SIer、ディー・エヌ・エーを経て2014年3月からfreee株式会社にジョイン。データマイニングエンジニア兼グロースチームのリーダーをつとめる。定量的なデータを元に、サービスを拡大するための戦略づくりと実行に励む毎日。
「ふぅ。」
MySQLとRのデータ連携がうまく行き、山田は一息つきました。が、「俺って一息つきすぎでは?」という疑問を覚え、すぐに手元のデータマイニングの本を読み進めました。
本を読み進めていくとどうやら、今回のような分析には「決定木」という手法がうまく使えそうです。決定木は、エンジニアになじみのある木構造で情報を整理する方法です。
まずは、ある会社における従業員の遅刻要因を分析した決定木の例から学んでみましょう。
・遅刻するかどうかを決定づける最も大きな要因は「前日に飲酒した?」であり、飲酒している場合の遅刻率は1.3%である。
・次に大きな要因は「新入社員かどうか?」であり、新入社員であった場合、前日に飲酒していなくとも、遅刻率が0.8%となっています。
このように、決定木ではある事柄を決定づけた要因を木構造で説明することができます。
参考図書では、タイタニック号の乗客の生死を「客室等級」「大人 or 子供」「性別」といった属性で説明した例が載っています。
「ふぅ」山田は本日4杯目のコーヒーをすすりながら、「課金の有無をユーザー属性で整理できそうだな」と独り言をつぶやきました。
と同時に、「決定木ではどのようなアルゴリズムで木構造を作っているのだろう?」と疑問に思いました。
たしかに木構造を作るには、親子関係を評価する必要があります。その順序をどうやって評価しているのでしょうか?
問題をより簡単にしてみます。「○か×」を属性Aと属性Bで説明する場合を考えてみましょう。
上記の例を当てはめると、「○か×」が「遅刻するかどうか」に対応し、属性A,Bが「前日に飲酒したか?」や「新入社員か?」に対応します。
下図に16個の○と×を用意してみました。この○と×を属性によって分割することを考えてみましょう。
『「○か×」を決定づけている要因として属性A,Bのどちらの要因が大きいのか』という問題は、『属性Aの条件で集団を分割したときと、属性Bの条件で分割したときで、よりうまく分割できるのはどちらか』という問題と同じです。うまく分割できる方が、より大きな要因となります。
文章だけではわかりづらいと思うので、おもむろに分割してみましょう。
下図に、属性Aの条件で分割した場合と、属性Bの条件で分割した場合の状況を示しました。
さて、上図の右図と左図、どちらのほうがうまく分割できていると感じますか?
おそらく、左図の方がうまく分割できていると感じるのではないでしょうか。試しに○の数を数えてみると、左図は1個:4個に分割されているのに対し、右図では2個:3個に分割されています。
このことから、左図(属性Aの条件で分割)の方がうまく分割できていると言えるため、属性Aをもっとも決定的な要因(ルートノード)として採用します。決定木のアルゴリズムではこのような分割を繰り返し、木構造を茂らせていきます。
実際の計算過程では、『うまく分割できている』という条件を評価するために、下記の指標のいずれかが用いられることが多いです。
・ジニ係数
・交差エントロピー
・分類誤り率
それぞれの定義や、実際に分析使う際のテクニックなどは、参考図書に詳しく載っているのでご参照ください。
「これ、面白いな」決定木の読み方や山田は間髪入れず、自分のMacでRを叩き始めました。
# 決定木のパッケージをインストール
> install.packages("mvpart")
# 使用するパッケージを宣言
> library(DBI)
> library(RMySQL)
> library(mvpart)
決定木ではmvpartというライブラリを利用するので、インストールをしています。
DBI, RMySQLは前編で登場したライブラリなのでおなじみですね。
> sql <-"
> SELECT
> gender,
> age,
> referral,
> CASE WHEN charges.user_id IS NOT NULL THEN 'Yes' ELSE 'No' END A S charged
> FROM users
> LEFT JOIN charges
> ON users.user_id = charges.user_id;
>"
> md <- dbDriver("MySQL")
> dbconnector <- dbConnect(md, dbname="ch_datamining_lesson", user=“user", password=“password")
> users <-dbGetQuery(dbconnector, sql)
> users$age <- as.character(users$age)
さて、ここまでは前回紹介したコードとほぼ同じです。
SQLを発行することで、usersには下記のようなデータ構造のデータが入っています。
chargedがYES/NOになるかどうかは、gender, age, referral のどの属性で決まるのでしょうか?
それを決定木で分析してみます。
# 決定木分析の実行
> users.rp <- rpart(charged~.,data=users)
決定木を使用するには、rpartという関数を用います。
ここで第一引数の、'charged~' は、charged列を他の列(gender, age, referral)で説明するという意味です。
これを実行した時点で決定木が終了しているので、コンソールに
> users.rp
と打ってもよいのですが、せっかくですので木構造の図にしてみましょう。
# 決定木のプロット
> plot(users.rp,uniform=T, margin=0.05)
> text(users.rp,uniform=T, use.n=T, all=T, cex=1.3, pretty=0)
これで下記のような図を得ることができました。
この図からわかることはどんなことでしょうか?
①課金を決定づける最も大きな要因は性別である
←性別による課金率に大きな差がある。
- gender=Mの場合(ルートノードの左枝)課金率は、879/(6754+879) = 11.5%
- また反対に、gender=Fの場合は、1051/(1165+1051) = 47.4%
②課金を決定づける2番目に大きな要因は流入元広告である
←広告Aから流入したユーザーの課金率が顕著に低い。
- referral=Aの場合、課金率 33/(225+33) = 12.8%
- 一方、referral=NULL,B,C,Dの場合、課金率 1018/(940+1018) = 52.0%
「うぉぉぉ」山田は思わず唸り声をあげてしまいました。そして意気揚々とリーダーズミーティングに臨むのでした。
「ーーというわけで、課金して頂けるかどうかをユーザー属性で整理すると、大きなものから、性別、流入元広告ということがわかりました」
若干のドヤ顔を浮かべながら、リーダーズミーティングで山田はこう報告しました。
「女性のユーザーの課金率が高いとは、意外…」と、出席者も山田のだした結果にざわついています。
そしてプロデューサーが問いかけます。
「女性の半数が課金してくれてるってことは、今後集客予算のかけ方やプロダクトのクリエイティブも女性に注力した方がよい、ということ? 山田ちゃん。」
山田は「はい、データからはそうです」と言いかけましたが、ロースハラミ現象を思い出し、ぐっと口をつぐみ、
「現段階でそれを判断するのは時期尚早です。まずは、女性の課金率がこれほど高い理由を突き止めるのが先です。もしかすると、女性がとりやすい特徴的な行動などがあり、それが課金につながっているかもしれません。そうであれば、男性の課金率を上昇させる施策にもつながる可能性もあります。」
と、返しました。
「確かに。このデータだけでプロダクトの今後の方向性を決めるのは飛躍している気がする。
そもそも顧客獲得単価は男性のほうが低いし会員数も多いのだから、ここで女性にターゲットを絞ってしまうと、今後スケールした際の規模が変わってしまうよね。
だから、今すぐにターゲットを絞るのは、もう少し山田ちゃんに行動ログを分析してもらってからにしようか」
と、プロデューサーがまとめ、一件落着しました。
こうして、山田とデータの戦いは続いていくのでした。
2回にわけて山田君のデータマイニング奮闘記をお伝えしましたがいかがだったでしょうか。
今回の記事は特に、
・エンジニアになじみのあるMySQLからデータを取得する
・データ分析のアルゴリズムだけでなく、データをどう活用するのかを説明する
ということに重点をおいて執筆させて頂きました。
ロースハラミ現象の記事とあわせて、少しでもデータマイニングの世界に興味を持ってもらえれば幸いです。
この記事をみたエンジニアによって、世の中のwebサービスがより価値の高いものになればこれ以上の幸せはありません。
長い間おつきあいいただき、大変ありがとうございました。
参考図書
▽データマイニング入門
Amazonリンク:(http:goo.gl/HSe8I)
データマイニングの様々な手法を会話形式でわかりやすく説明している本です。今回紹介した決定木は「第3章 人工知能エンジンと決定木」という章に詳しく記載されています。本書は、アルゴリズムや数式を省略せずに記載されているのも特徴です。データマイニングをこれからガッツリ勉強したいと思っているエンジニアには是非お勧めしたい1冊です。
編集 = 寄稿
4月から新社会人となるみなさんに、仕事にとって大切なこと、役立つ体験談などをお届けします。どんなに活躍している人もはじめはみんな新人。新たなスタートラインに立つ時、壁にぶつかったとき、ぜひこれらの記事を参考にしてみてください!
経営者たちの「現在に至るまでの困難=ハードシングス」をテーマにした連載特集。HARD THINGS STORY(リーダーたちの迷いと決断)と題し、経営者たちが経験したさまざまな壁、困難、そして試練に迫ります。
Notionナシでは生きられない!そんなNotionを愛する人々、チームのケースをお届け。