freeeのデータマイニングエンジニア、坂本さんによる統計解析ツールRを使ったエンジニア向けデータマイニング講座前編。Rで何ができるのか?設定からSQLとの接続、グラフ化まで一連の流れを学びます。
はじめまして。freeeのデータマイニングエンジニアの坂本登史文です。先日のロースハラミ現象の記事はいかがでしたでしょうか?私は、記事公開後からたくさんの人に焼肉のお誘いを頂き、非常に充実した夏を送ることができました(笑)
先日の記事はあくまでもデータ活用の考え方の紹介で、正しい意味でのデータ“マイニング”の紹介はできていませんでした。
そこで今回は、エンジニアの皆様向けに、2回に分けてデータマイニングの初めの第一歩をご紹介したいと思います。先日の記事では焼肉店の店長がでてきたように、今回のお話では、WEBエンジニアの山田君が登場します。
山田君の気持ちになって一緒にデータマイニングを体験してもらえれば幸いです。
[プロフィール]
freee 株式会社 データマイニングエンジニア
坂本登史文 Toshifumi Sakamoto
京都大学理学研究科修了後、メーカー系SIer、ディー・エヌ・エーを経て2014年3月からfreee株式会社にジョイン。データマイニングエンジニア兼グロースチームのリーダーをつとめる。定量的なデータを元に、サービスを拡大するための戦略づくりと実行に励む毎日。
ソフトウェアエンジニア山田は、入社以来5年間WEB系の開発に従事。その技術力を買われ、社内で新規に立ち上がったフリーミアム制のeラーニングサイトのリードエンジニアに抜擢される。これは、そんな山田がデータマイニングを始めるきっかけとなった日の話。
ある夏の日、山田はリーダーズミーティングに出席していました。
リーダーズミーティングとは、ディレクター、マーケター、エンジニアが集まり、今後のサービスの方向性の確認や実装するべき機能を話し合あう場。山田もエンジニアリーダーとして参加していました。その日の議題は「今後、どのようなユーザーセグメントに注力していくべきか?」ということでした。
このeラーニングサイト、リリースしてからはユーザーを増やすことに注力し、様々なターゲット向けに広告を打っていました。
今後は、よりターゲットを絞った集客方法を実施していきたいというわけです。どのようなユーザーをターゲットにするか議論は二転三転しましたが、結局決まったことは「実際の使われ方を見て決めよう」ということでした。
次回のミーティングまでに、ログ解析を行ない、どのようなユーザーが課金をしているかを把握してくることが、山田の宿題になりました。
「さて、どうしよう」山田はWEB系エンジニアであり、ログ解析をしたことなどありません。
とりあえず、データマイニングの本を読みながら、統計解析ソフトウェアのRを手元のMacにインストールすることから始めました。
ここで少し閑話休題。世の中にはR以外にも分析ソフトウェアがたくさん存在します。SPSSやSAS、使い方によってはExcelも立派な分析ソフトウェアです。いろいろと目移りすると思いますが、エンジニアがデータマイニングの一歩を踏み出すには、Rがオススメです。
というのはずばり、フリーソフトウェアであるにも関わらず、商用ソフトと遜色ない統計・分析ライブラリが充実しているからです。例えば、
・ABテストの結果を偶然じゃないかどうか判断したい(仮説検定)
・商品Aと合わせて購入されている商品は何か知りたい(アソシエーション分析)
・ユーザーを何種類かのクラスタに分けたい(クラスター分析)
・売上をいくつかのパラメータで説明、予測したい(重回帰分析)
など、ビジネスで活用できる分析ライブラリが豊富に揃っています。また、Rはコードをを記述することで分析を実行するため、
・コードレビューを行ないやすい
・コードの再利用性が高い
など、エンジニアと親和性の高い特徴もあります。
Rは基本的にCUIで動作するソフトウェアですが、RStudioというGUI統合開発環境を利用することもできます。
今回は、RとRStudioの両方をインストールします。
▽R :
http://cran.r-project.org 内の http://cran.r-project.org/mirrors.html
からダウンロードできます。
▽RStudio :
http://www.rstudio.com/ 内の http://www.rstudio.com/products/rstudio/download/
からダウンロードできます。
※上記ソフトウェアはWindows,Mac,Linux版が用意されていますので、ご自身の環境にあったものを選択ください。
RStudioを起動すると、3ペインに分かれたウインドウが現れます。おもむろに、最も大きい左のペインに下記のコマンドを打ち、何回かエンターを押してみましょう。
> demo(graphics)
すると、Rのgraphicsデモが始まり、下記のような画面が現れます。
「ふぅ」なんだが強力な助っ人を手に入れた気分の山田はほっと一息つきます。
が、ツールをインストールしただけで全く何も生み出していないことに気づいた山田は、RとMySQLの接続に取りかかることにしました。
今回は山田のローカルに立てたMySQLから、Rを通してデータを取得してみることにしました。CSVなどでデータを直接インポートしてもよかったのですが、データが大きくなるとファイル受け渡しが煩雑になることや、複雑なJOINはSQLに任せた方がパフォーマンスが高いため、MySQLに直接つなぐことにしました。
Rでは、解析を行なうためのアルゴリズムや、データベースと連携する機能を“パッケージ”としてインストールすることができます。MySQLとの連携には、“DBI”と“RMySQL”というパッケージを使用します。パッケージのインストールはinstall.packagesコマンドを下記のように打ち込みます。
> install.packages("DBI")
> install.packages("RMySQL")
また、インストールしたパッケージの読み込みには、libraryコマンドを使用します。
> library(DBI)
> library(RMySQL)
これで、RとMySQLを使用する下準備は整いました。
「ふぅぅぅ」強力な助っ人を手に入れた気分の山田はほっと一息つきます。
が、またもやツールをインストールしただけで全く何も生み出していないことに気づき、実際のデータを取得してみることにしました。
山田が運用しているeラーニングサイトは、ご多分に漏れず多くのテーブルを保持しています。
今回、解析対象のテーブルとして、users, user_logins, charges の3つのテーブルを使ってみることにしました。
▽users
users:ユーザーの属性を管理するテーブル。
定義: [user_id:ユーザーID, gender: 性別, age: 年代, referral: 流入元広告, created_at:作成時刻 ]age = [10:10代以下, 20: 20代, 30: 30代, 40: 40代, 50: 50代以上]
referral = [A: 広告Aから, B: 広告Bから, C: 広告Cから, D: 広告Dから, NULL: オーガニック流入 ユーザー]
※退会ユーザーは物理削除するため、idに欠損が存在することに注意
▽user_logins
user_logins:ユーザーがサインインした際に追加されるテーブル。
定義: [user_id:ユーザーID, sign_in_times:ログイン回数 , created_at:作成時刻]
▽charges
charges:ユーザーが課金した際に追加されるテーブル。
定義: [user_id:ユーザーID, created_at:作成時刻]
※本eラーニングサイトは買い切りモデルであり、1ユーザーの複数回課金は存在しない仕様である点に注意。
山田はRを使い始めた第一歩として、まずは先ほどのテーブルを可視化してみることにしました。
理論的な理解が必要な分析パッケージの利用はとりあえず後回しにして、MySQLからデータを引っ張ってグラフ化することに取りかかりました。
# パッケージの読み込み
> library(DBI)
> library(RMySQL)
# Font指定(Macで日本語を使うための指定)
> par(family="HiraKakuProN-W3")
※Rがデフォルトで指定するフォントでは、日本語が扱えないことがあります。そのため、明示的にフォントを指定しています。
# 2014年1月の入会者が2014年2月末日までの期間にログインした回数を取得
> sql <-"
> SELECT
> gender,
> age,
> referral,
> sign_in_times
> FROM users
> LEFT JOIN
> (
> SELECT
> user_id,
> MAX(sign_in_times) AS sign_in_times
> FROM user_logins
> WHERE '2014-02-01' <= created_at AND created_at < '2014-03-01'
> GROUP BY user_id
> )user_logins
> ON users.user_id = user_logins.user_id
> WHERE '2014-01-01' <= users.created_at AND users.created_at < '2014-02-01';
"
# MySQLへの接続とクエリ発行
> md <- dbDriver("MySQL")
> dbconnector <- dbConnect(md, dbname="ch_datamining_lesson", user="user", password="password")
> users.sign_in_times <-dbGetQuery(dbconnector, sql)
いよいよSQLの発行です。SQLは理解できると思います。2014年1月に入会したユーザーが、翌月末までにログインした回数を取得しています。
末尾3行はドライバを介したSQLの発行です。エンジニアの方ならすんなりとなじめると思います。上記を実行すると、users.sign_in_timesに、SQLの実行結果が格納されます。
右ペインに表示されている変数名をクリックすると、下図のように変数の中身を見ることができます。
ちなみに、このようなRで用いられるマトリックス型の変数を、データフレームと呼びます。
# age列をカテゴリー変数に変換
> users.sign_in_times$age <- as.character(users.sign_in_times$age)
ここで、age列を数値型からカテゴリ型に変換しています。
Rは読み込んだ列の値から自動的に型を推測しますが、今回の場合ageは数字をカテゴリとして使用しているため、Rが数値型として判断してしまいます。そのため、明示的な変換が必要となります。
# 10代以下、50代以上のログイン回数別ヒストグラムを生成
> hist(users.sign_in_times[users.sign_in_times$age == '10',] $sign_in_times, col = '#00FF7734', breaks = 1:30, xlim = c(0, 30), main ='ログイン回数別ヒストグラム', xlab = 'ログイン回数')
> hist(users.sign_in_times[users.sign_in_times$age == '50',] $sign_in_times, col = '#FF007734', breaks = 1:30, xlim = c(0, 30), add= T )
> legend("topright", legend=c("10代以下", "50代以上"), pch=c(15,15), col=c('#00FF7734','#FF007734'))
# MySQLとの接続を閉じる
> dbDisconnect(dbconnector)
hist関数には様々なオプションがありますが、今回は色の指定と範囲の指定、ヒストグラムの幅指定、x軸の範囲指定、グラフタイトル指定、追加描画指定を行なっています。
・色の指定: colオプション。引数には、"#+6桁のRGB色指定+2桁の透過度指定"の8桁を指定。
・ヒストグラム幅指定:breaksオプション。’1:30’は1から30まで1刻みという意味です。breaksを指定しないと、Rが適当な(Not適切な)範囲を選びます。ちなみに、引数に整数を指定した場合はその数でヒストグラムを等分するという意味になります。
・x軸の範囲指定: xlimオプション。c(0, 30) とは0から30までという意味です。
・グラフタイトル指定:mainオプション。日本語が扱えるフォントであれば日本語使用も可。
・追加描画指定: add = T を指定すると、グラフを重ねて描画することができます。
グラフが無事に描画でき、いろいろなことがわかってきました。
・50代以上よりも10代以下の方が人数が多い(全体の面積が大きい)。
・50代以上はログイン5回周辺にピークがあるが、10代以下では10回周辺にピークが存在する。
→10代以下の方がより頻繁にサービスを使用してくれている。
これだけでもいろいろな仮説がわいてきますが、このまま無策でグラフを書きまくってもロースハラミ現象に陥るだけです。
山田は一旦ここで手を止め、「最も課金に寄与する属性は何なのか?」ということを機械学習で明らかにすることを決心しました。
次回は、山田君が「最も課金に寄与する属性は何なのか?」ということを明らかにするとともに、今後のeラーニングサイトの運営方針の意思決定をします。
その際、機械学習の1つである決定木というアルゴリズムを用います。決定木アルゴリズムをわかりやすく解説しながら、どのように現場で使っているのかをご紹介したいと思います。
なお、山田君が解析に利用したデータをこちらのサイト(著者のGitHub)で公開しています。
※記事後編は10月中旬更新予定です。
編集 = 寄稿
4月から新社会人となるみなさんに、仕事にとって大切なこと、役立つ体験談などをお届けします。どんなに活躍している人もはじめはみんな新人。新たなスタートラインに立つ時、壁にぶつかったとき、ぜひこれらの記事を参考にしてみてください!
経営者たちの「現在に至るまでの困難=ハードシングス」をテーマにした連載特集。HARD THINGS STORY(リーダーたちの迷いと決断)と題し、経営者たちが経験したさまざまな壁、困難、そして試練に迫ります。
Notionナシでは生きられない!そんなNotionを愛する人々、チームのケースをお届け。