Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2016年09月13日

良く使うデータマイニング手法の説明

こんにちは。コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、前回のブログで紹介したデータマイニング用のデータを用いてよく行われているデータマイニング手法を紹介します。

 

前回紹介した準備したデータの5種類は、以下の通りです。

①ユーザーのイベントデータ

②ユーザーのステータスデータ

③ユーザーイベントの定期要約データ

④ユーザーのステータスの時系列変化

⑤システム要約データ

上記の5種類のデータを使って、どのようなデータマイニング手法を用いてユーザー分析をしているかを説明します。

ユーザーイベントデータ

ユーザーイベントをそのまま使える分析手法としては、アソシエーション分析があります。

①アソシエーション分析

ユーザーが同時に、あるいは一定の期間内に行うアクションを抽出するマイニング手法です。Aアクションを行うユーザーはBアクションも行うような関連性のあるアクションを洗い出します。例えば、サービス内では、Bアクションを増やしたいという施策を考えています。その場合、ユーザーが同時にしている他のアクションを分かっていれば、Bアクションの動機が何かを把握できたり、Aアクションを促進することによって、Bアクションを増やしたりすることが可能になります。アソシエーション分析によく出る例としては、スーパーマーケットの買い物で、ビールを買うユーザーは同時に子供用のおむつも購入するという有名な例があります。同時に何を購入する把握することで、スーパーの品物の並べ方を効率的に計画できます。アソシエーション分析は、R言語のarulesパッケージを使って実施できます。

ユーザーイベントはそのままアソシエーション分析以外のデータマイニングに使うのは中々難しいです。データマイニングは、基本的に説明変数を基に色々分析を行う。ユーザーイベントは用いて、ユーザーの特性を定義できるように変数化する必要があります。

ユーザーのステータスデータとユーザーイベントの定期要約データ

ユーザーのステータスデータとユーザーイベントの定期要約データには、大きく以下のような種類の分析手法に使います。

①予測分析

予測分析とは、ユーザーの現在のステータスや直近の行動状況によって、将来どのような行動をするかを予測する分析手法です。ユーザーの現在のステータスや直近の行動状況をは、変数で表します。この変数は、説明変数と呼びます。予測する値は、目的変数と呼びます。目的変数が連続型変数の場合は回帰分析と呼び、不連続型変数の場合は分類と呼びます。予測分析の応用例としては、サービスの利用を離脱しそうなユーザーを把握して離脱対策を計画したり、課金する可能性の高いユーザーを優先的に有料コンテンツへと誘導したりして、動的にオンラインサービスをユーザーの特性に合わせた最適なサービス設計が可能となります。予測分析に利用できるアルゴリズムには、様々なアルゴリズムがあります。例として、線形回帰分析、logistic回帰分析、ニューラルネットワーク、SVMなどがあります。私達のチームでは、オンラインサービスのデータに最も使いやすい「ランダムフォレスト」をよく使って分析を行います。別ブログ記事で、「ランダムフォレスト」を用いた予測分析方法の詳細を記述するので、ここでは詳細を省略します。

 

②クラスター分析

クラスター分析は、似たような特性、あるいは似たような行動をしているユーザーのグループを把握するための分析手法です。ユーザーのグループを把握することによって、ある特定のグループのユーザーだけをターゲットにして施策を計画することができます。きちんとユーザーの特性に合わせたサービス設計することによって、ユーザー満足度を上げることができます。このクラスター分析は、マーケティングではセグメンテーションとも呼ばれます。クラスター分析にも色々なアルゴリズムが存在します。よく使われるものとしては、kmeans等があります。

 

③相関分析

相関分析は、ユーザーの行動に相関が高いものを抽出します。オンラインサービスを例に挙げると、ソーシャルゲームでよく課金するユーザーは、どのようなプレイしているか、サイト滞在時間でよく見ているコンテンツはどういうものが多いか等が挙げられます。

R言語のcor()関数などを使って、相関分析を行っています。相関分析で気を付けないといけないことは、相関関係は高いけれども、因果関係があるとは限らないということです。因果関係に関しては、サービスの詳細も考えて、判断しないといけないです。

 

ユーザーのステータスの時系列変化

ユーザーのステータスの時系列データを扱う分析は、縦断データ分析と呼びます。ユーザーの行動の変化には、どのような変数が影響しているかが分析可能です。

オンラインサービスを例でいうと、

  • 毎月サービスの滞在時間が伸びているユーザーの特性は何か
  • 継続して使うユーザーと飛び飛びに使うユーザーの違いは何か

この要因を把握することで、ユーザーの満足度を高めるために重要な要因が把握できたりします。

 

システム要約データ

このデータは、各ユーザーごとの特性は表してないため、ユーザーレベルでの詳細分析に使うことはできないです。しかし、サービス全体として予測やトレンドを把握する、施策の効果測定などには非常に重要です。システム要約データは、時系列の一次元のデータとなっています。そのため、その他のデータと違い時系列データの分析手法を用いて分析します。

①時系列データ分析

長期トレンドを把握

時系列データは、長期トレンド、季節要因とその他の部分とを分解することができます。そのために、R言語のdecomposeなどの関数を用いています。時系列データから長期トレンド分をだけを観測することによって、サービスが長期的にどんな変化が起きているかなどが分かります。この長期トレンドは、特に外部要因による変化が多いです。そのため、早めに市場の長期トレンドを把握することによって、サービスの長期的なビジネスチャンスを把握できたり、危機的な状況が見つかったりして、早期対応が可能ともなります。

 

季節要因を把握

時系列データは、季節部分を把握することにより、特にサービスの需要が高くなる時期などを把握し、それに合わせた施策を計画したり、新しいビジネスチャンスを見つけることができます。たとえば、クリスマス時期に需要が高くなるとわかった場合、クリスマスを対象にした特別商品やサービスを計画することが可能となります。

 

施策の効果測定

時系列データから長期トレンドと季節要因部分を除外することにより、その他の要因によるサービスの利用状況の変化が分かりやすくなります。特にサービスの改善や変更施策を実施した場合、それによってどれ位サービスの利用状況の変化があったか等を調べたい時にはかなり有効です。

 

将来予測

サービスの時系列データはかなり複雑で、以前説明した長期トレンド、季節要因とその他の部分によって形成されています。サービスの将来予測をしたい場合は、その部分の要因を参考に計算した方が精度の高い予測が可能です。R言語のHoltwinters関数などを使って、時系列データの予測計算が可能です。

 

終わりに

本日は、データマイニング用に準備したデータを基に、どのような分析をしているかを軽く説明しました。今後、一個一個のデータマイニング手法を、R言語を用いた実施方法に関して詳細に説明する予定です。

 

 

 


2016年09月13日

データマイニング用のデータ設計について

 

こんにちは、コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、データマイニングを始めるためにはどのようにデータを準備する必要があるかを紹介します。

 

オンラインサービスのデータについて

簡単に分けると、オンラインサービスから蓄積されるデータには大きく2つのタイプがあります。

  1. データベース - サービス運用のために必要なデータが保存される。ユーザーのステータスやユーザーのアクションの結果等が記録されていることが多い
  2. アクセスログ - ユーザーのページアクセスやタップイベント等が記録されている。ウェブサーバーやアプリケーションサーバーに、ログファイルとして保存されている。

データベースのデータは、サービスを維持するために必要なデータが保存されています。しかし、このデータは分析用としてそのまま使うには難しいケースが多いです。アクセスログは、ユーザーがサービスを利用する上で、どのように使ったか(UIの操作履歴)の履歴となっています。ほとんどの場合は、そのまま分析するには複雑すぎることが多いです。では、データベースとアクセスログデータから、データマイニングあるいは分析用にどうデータを変換した方が良いかを説明します。私達のチームでは、この元のデータを加工して、データ分析用のデータベースに(データウェアハウス)保存しています。データ加工とテーブル設計等は、どのようにした方が良いか等を紹介します。

データマイニング用のデータ設計方法

サービスのデータを以下のようなデータ構造に変換してから、データ分析に使っています。

  1. ユーザーのイベントデータ
  2. ユーザーのステータスデータ
  3. ユーザーのイベントの定期要約データ
  4. ユーザーのステータスの時系列変化
  5. システム要約データ

データマイニングは、ほとんどの場合、ユーザーの行動あるいは体験を分析するために行います。そのため、①~④のテーブルは、ユーザーの行動あるいは体験をどう表すかを意識して設計しています。上記のデータの5種類について詳細に見ていきましょう。

①ユーザーイベントデータ

このデータは、ユーザーのアクションと体験を表します。アクションと体験は、サービスのUX設計等をベースに考えると考えやすいと思います。一つのデータレコードは、一つのアクションと体験を表します。しかし、場合によっては、この一レコードは、ユーザーの複数のUIアクセスやタップによって行う操作を、一つのアクションして抽象化しているものもあります。例えば、画像管理と投稿できるようなSNSアプリを参考に考えてみましょう。

主に考えられるユーザーイベント

  • 新規でアプリ登録する
  • チュートリアルを完了する
  • 友達を検索する
  • 友達をフォローする
  • 友達にフォローされる
  • 画像をアップする
  • 画像をアルバムに振り分け保存する
  • 画像を投稿する
  • 友達の画像にコメントする
  • 自分が投稿した画像に「いいね」される

このイベントを見ると、大きく2タイプのものがあることに気が付くと思います。ユーザーが自分の意思で行うアクション、ユーザーが体験することの2つです。一つのイベントが複数のアクションを完了することによって発生することもあります。例えば、画像投稿のイベントは、画像を選ぶ、タイトルを入力する、コメントを入力する、カテゴリー設定、ハッシュタグ設定、公開範囲の設定、等の複数のアクションによって完了されます。もちろん、このアクションを別々にイベントとして保存するということもできます。しかし、分析という意味では、細かいアクションの単位では、なかなか分析が難しくて複雑になりやすいです。そのため、ユーザーの行動は、ある程度に抽象化した形で、ユーザーイベントを定義した方が効果的だと思います。

ユーザーイベントデータの形式:

データは、5W2Hで保存します。誰が(Who)、何を(what)、どこで(Where)、いつ(when)、どの位(How many)、なぜ(Why)、どのように(How)の項目を記録します。イベントによって、5W2Hのすべてが存在しない時もあります。

SNSアプリを例にして、画像を投稿した場合を考えてみると、

Who – ユーザーID

What – 投稿ID

When – 投稿時刻

Where – どこのページで投稿したか

How many – 画像が何枚か

Why – 目的

How – なし

定義が難しいものもあります。特にWhere、WhyやHowの定義はイベントに依存します。

②ユーザーのステータスデータ

ユーザーのステータスデータとは、ユーザーの現在の状態を表すデータを保存するテーブルを意味します。このデータは、毎日のユーザーの行動によって変化するものもあります。そのため、いつも最新状態で保存されています。データを管理する単位は、現在私達のチームでは、データウェアハウスのデータを一日単位で管理しているため、一日一回更新されています。

ユーザーステータスには、二種類のデータがあります。

  • 固定情報:年齢、地域、性別、職業などのユーザーの情報
  • ユーザーの行動から生まれてくるステータス 例:サービス利用期間、友達の人数、保存されている画像枚数の合計等

このデータの特性は、その時刻であるユーザーを説明できるということです。特に、短期間では、著しく変化しない、あるいは、短期間での行動を表すというよりも、長期的な行動状況を表すようなデータを表す変数にした方が良いユーザーの特性に関しては意味があります。

悪い例:最終アクセス時刻

良い例:月間平均滞在時間

データマイニング手法などに使うときは、ユーザーの特性として使えるかという意味で評価します。

 

③ユーザーイベントの定期要約データ

データマイニング手法を用いたデータ分析には、ユーザーは説明変数を用いて表さないといけません。そのためには、ユーザーのイベントデータをそのままデータマイニング手法に使うことはできないことが多いです。その問題を解決するためには、イベントデータを何らかの形で変数化しないといけません。ユーザーの行動イベントは、定期的に要約して変数に変換します。

例:ユーザーのイベントデータから、一ヶ月間でユーザーのある特定のアクション数をカウントして変数として保存します。アプリ起動回数、「いいね」した件数、画像を投稿した件数、新規フォロー作成件数

 

このように変数化することによって、ユーザーの行動イベントの情報量を減らし、説明変数として使えるようになります。私達のチームのデータウェアハウス上では、ユーザーのイベント情報を集約して、ユーザーイベントの定期要約データを作成し保存されるようにしています。現在は、データの集約期間は一ヶ月を期間としています。データ分析を行いたい時には、この定期要約データを使うことが多いです。

④ユーザーのステータスの時系列変化

ユーザーのステータスデータの値は、日々変化していきます。そのため、ユーザーの状態が過去はどうだったか、あるいはどのように変化していたかを後で見るとわからなくなります。そのため、ユーザーのステータスデータを一定期間ごとに、スナップショットとして保存するようにしています。私達のチームのデータウェアハウスでは、スナップショットの保存間隔は一ヶ月間としています。1ユーザー当たり一ヶ月に一回、ユーザーのステータレコードとしてテーブルに挿入されます。このデータを使うと、ユーザーの成長あるいはサービスの利用頻度の変化等はユーザーごとに時系列のデータとして作成できます。

⑤システム要約データ

ユーザーベースのデータだけではなく、サービス全体として集約するデータを作成しています。このデータは、ユーザーの特性や予測には使いませんが、時系列データとして、サービスとしては将来予測に使います。

例:

デイリーアクティブユーザー数、マンスリーアクティブユーザー数、PV数、

新規登録ユーザー数、課金したユーザー数

データによって、一日ごとに集計するものと一ヶ月に一回集計するものがあります。

 

終わりに

本日は、データマイニング用のデータ準備方法に関して説明しました。サービスのデータベースとアクセスログを用いて、ユーザーの行動や体験を表すようなデータの加工方法に関して説明しました。今後は、このデータをどのようなデータマイニング手法に用いて分析しているかを説明します。

 

 

 


2016年09月12日

「ランダムフォレスト」を用いた予測モデルの構築について

こんにちは。コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、予測モデルの構築方法として、「ランダムフォレスト」アルゴリズムについて紹介します。

ランダムフォレストのアルゴリズムについて

ランダムフォレストのアルゴリズムは、「決定木モデル」が基になっています。決定木モデルとは、よくプログラムで書くif then elseのような簡単な説明変数の値によって結果を決める手法のことです。ランダムフォレストは、複数の「決定木モデル」を足し合わせる(平均化)するようなアンサンブル学習(Ensemble learning)というアルゴリズムを利用します。そのため、決定木モデルよりも高性能な予測が可能となっています。ランダムフォレストのアルゴリズムは、以下のような特性があるためオンラインサービスのログ分析に適していると言われています。

  • 的変数と説明変数の型に(連続、不連続、バイナリー)何でも対応している

オンラインサービスの場合は、変数はユーザーの年齢(整数)、性別(不連続)、滞在時間(連続)であったりして、混ざったタイプの変数が多いです。そのため、何でも使えるランダムフォレストは便利です。

  • 変数の分布に依存しない

分析手法によって、変数の分布に制約はあります。例:ガウス分布

データの分布の判断は難しいようなケースが多いため、分布の制約は無い方が安心です。

  • 外れ値や欠損値などに強い

オンラインサービスの場合は、データが入っていなかったり、場合によっては、間違ったデータが入っていることがよくあります。例:値の代わりにnullが入っている等ランダムフォレストの予測モデルは、このようなデータによって影響を受けにくいため、データの前準備の手間を減らせます。

  • 説明変数の数が非常に多いケースにも応用できる

サービスユーザーの特性を表す変数の数は、20個も30個もあることはよくあります。そのため、説明変数の数が多くてもきちんと機能する手法が不可欠です。

  • 関係ない説明変数はモデルのパフォーマンスに影響しない。

線形回帰分析やニューラルネットワーク等は、目的変数と関係のない説明変数をモデル構築に使った場合、予測制度にかなり影響します。そのため、関係性のある目的変数だけを選ぶ等のデータの前準備が必要となります。しかし、ランダムフォレストは、そのような準備をする必要はあまりありません。

  • ビッグデータに対応しやすい

最近、オンラインサービスデータは数百万も数千万件もあることがよくあります。ランダムフォレストは、複数の「決定木」モデルを合わせるような計算手法になっているため、分散計算プラットフォーム(Hadoop, Spark)を使って大量のデータでも扱いやすいです。

 

R言語を用いたランダムフォレストのアルゴリズムの利用

R言語とは、統計解析を得意とする(Libraryが多くある)スクリプト言語です。無料でダウンロードして、Windows, Mac, Linux等どんな環境でも利用できます。CRANからオープンソースのライブラリを無料でダウンロードしインストールすることによって、データマイニングや統計解析手法のほとんどを無料で利用することができます。ランダムフォレストを利用するにはパッケージのインストールが必要です。

 

RandomForestのインストール:

install.packages(“randomForest”, dependencies = TRUE)

library(randomForest)

 

データサンプル:

ランダムフォレストに入力するデータを、CSV形式で以下のように準備する。

一行目がヘッダーとして変数名、二行目から変数の値をCSV形式で記述する。

v1は目的変数、v2~v6は説明変数

data.csv(データサンプル)

v1,v2,v3,v4,v5,v6

n11,n12,n13,n14,n15,n16

n21,n22,n23,n24,n25,n26

CSVデータの読み込み:

datacsv <-read.csv(file=”data.csv”,header = T)

 

モデル構築:

RFmodel <- randomForest(v1 ~ v2+v3+v4+v5+v6, data= datacsv)

N二番目の変数に、説明変数を‘+’で組み合わせて記述する。V1は目的変数、V2~v6は説明変数を表します。

全ての説明変数を予測モデル構築に使う場合は、

RFmodel <- randomForest(v1 ~ ., data= datacsv)

 

モデル評価:

予測モデルの評価方法には色々あります。しかし、Rのprint関数を使うだけで簡単にモデル評価ができます。

例えば、ランダムフォレストを、バイナリーの目的変数を予測に用いた場合は、以下のような結果が表示されます。

Call:

randomForest(formula = v1 ~ ., data = datacsv, ntree = 2000)

Type of random forest: classification

Number of trees: 2000

No. of variables tried at each split: 10

OOB estimate of  error rate: 28.82%

Confusion matrix:

continue redatsu class.error

r1     5573    1092   0.1638410

r2      2026    2128   0.4877227

真ん中のerror rate: 28.82%と出力されているのは、目的変数の予測の精度です。

100件を予測れば、28件の誤りが出る可能性があると出力されています。

モデルを用いた予測:

構築された予測モデルを用いて、結果(目的変数)の分からないユーザーのデータdata2を入力することで、予測値が出力されます。

Results <-  predict(RFmodel ,data2)

 

モデル構築時の注意点:

  1. 目的変数の情報が説明変数に漏れないこと。目的変数と同じ情報が説明変数にも入ってしまった場合は、予測モデルの結果の精度が高くなると評価されますが、実際にデータ予測を行った場合、非常に精度が悪くなる場合があるため、注意して変数を定義しないといけません。
  2. ラベルとして扱わないといけないラベルタイプ(不連続型データ)の変数を、R言語のfactor()を用いて、ラベルとして認識させる必要がある。
  3. パラメータのntree(決定木の数)の値が小さい場合、結果が不安定な時がある。特に、説明変数の数が多い時は、十分に大きな値のntreeを設定する必要がある。

 

終わりに

今回は、ランダムフォレストをR言語で用いた予測モデル構築方法に関して軽く説明しました。今後、ランダムフォレストを「要因分析」へ応用する方法に関して説明していきます。

 

参考資料:

Rのダウンロード

https://www.rstudio.com/

R言語について

http://qiita.com/stkdev/items/6aba2c1db2fa056170ae

RandomForestについて

https://www1.doshisha.ac.jp/~mjin/R/32/32.html


2016年09月12日

データマイニング手法の予測モデルを用いた将来予測について

こんにちは。コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、データマイニング手法として予測モデルの構築方法について紹介します。

 

予測モデルとは

まず初めに、予測モデルとはどのようなものかを軽く説明します。 予測モデルとは、ユーザーの現在の行動や属性によって、将来どのようなアクションを起こすか予測が立てれるような数学的な手法のことです。

オンラインサービスで例を挙げると、

  • 将来、サービスを使わなくなる可能性のある(離脱する)ユーザーはどんなユーザーかを予測する。
  • 将来、課金する可能性の高いユーザーは誰かを予測する。

などが挙げられる。

予測モデルの結果の形によって、大きく2つのタイプがあります。

予測したい結果は、

  • 連側型変数 - 回帰分析(Regression analysis)
  • 不連続型変数 - 分類 (Classification)

予測モデルの結果を表す変数は、目的変数とも呼びます。予測モデルは、将来を予測するために色々なデータを利用します。そのデータを変数として定義して、予測モデルに入力します。このデータを表す変数は、目的変数と呼びます。目的変数にも、連続型と不連続型変数があります。

オンラインサービスで例を挙げると、

  • ユーザーの年齢、性別(不連続型変数)
  • 一日当たりの滞在時間(連続型)
  • 一ヶ月間での課金総額(連続型)

 

予測モデルの使い方

では、この予測モデルをどのように使うかを説明します。 予測モデルを用いて将来予測を行うためには、予測モデルを学習させないといけません。 そのために、目的変数と説明変数は既に知っているデータを用います。 オンラインサービスで例を挙げると、過去のユーザーのデータを用います。 各ユーザーが、将来どの位サイトで課金するかを予測するケースを考えましょう。 そのためには、過去のサイト利用者のデータを用います。

  • 目的変数:各ユーザーの総合課金額
  • 説明変数:ユーザーの年齢、性別、一日当たりの滞在時間等

既に結果を知っているデータを使い学習させることを、予測モデル構築と言います。 過去の結果を既に知っているユーザーのデータを使って学習させたモデルに、今後、結果(目的変数)を知らないユーザーのデータ(目的変数)を入力して、結果の予測(Predict)を行います。それによって、将来サービスでどのようなことが起きるかという予測を立てられます。この予測を使い、サービスの改善や将来の計画がしやすくなります。

 

予測モデルのアルゴリズムについて

予測モデルを構築できる手法は世の中には、たくさんあります。例をあげると、線形回帰、logistic回帰分析、ニューラルネットワーク、決定木、サポートベクターマシーンなどがあります。アルゴリズムは、すべてが万能ではありません。手法によって、目的変数と説明変数の形(連続、不連続)が限られたり、変数の値のデータ分布の制約があったり、データのノイズや欠陥への対応が苦手だったりします。そのため、予測モデルのアルゴリズムの選び方は、きちんとデータの中身を理解してそれにあった手法を選ばないといけません。データマイニングでよく言われるのは、「ごみを入れるとごみが出てくる」(Gabage-in,garbage-out)ので、注意して応用しないといけません。この記事では、分析手法の詳細は説明しませんが、今後別の記事でR言語を用いて予測モデルの構築する方法を説明する予定です。

 

終わりに

今回は、予測モデル構築とはどういうものか、変数の定義方法等についてオンラインサービスをケースとして軽く説明しました。今後、具体的に各予測モデル構築手法に関する手法に関して説明していきます。