KLab-データ分析グループのblog

アクセス時間帯を可視化してみる

こんにちは、ponpoko1968です。

今回の記事は、去る2月9日に開催された、「関西ソーシャルゲーム勉強会 第3回」での発表を紹介します。
この勉強会は、関西に拠点をおくソーシャルゲーム関連の会社の有志により、親睦を深める場として開催されている催しで、弊社は記念すべき第1回に会場を提供しました。毎回弊社のメンバーもプレゼンを行っており、「エンジニアリング以外のお話」がテーマの今回は、私がデータ分析関連の発表をさせていただきました。

今回はLT枠での発表と言うこともあり、いろいろ突っ込み足りなかったり、舌足らずな部分もあるのですが、今後もこのような形でデータ分析に関する対外活動を続けていきたいと思います。

春のJAWS-UG 三都物語 2013でライトニングトークしてきました


こんにちは、ponpoko1968です。

去る3月9日、神戸・大阪・京都のAWSユーザ会の方が主催するイベント、「春のJAWS-UG 三都物語 2013」のライトニングトークで、私たちデータ分析グループでのAWSの活用について話してきました。

DSC_0039














イベントは大変盛況な中、LTのトップバッターとして登壇させて頂きました。
200人を超える聴衆の方々を前にして、緊張しきりでしたが、何とか時間内に伝えたいことが話せて良かったです。
実は、私たちデータ分析グループのメンバーの一部は大阪事業所に勤務しています。
今後も大阪で活動するIT企業として、関西のITコミュニティに参加・貢献していきたいと思います。

発表内容はこちらです。

最後になりましたが、主催者の皆様、大規模なイベントの運営、大変お疲れ様でした。
今回発表の機会を頂きましたこと、この場をお借りしてお礼を申し上げたいと思います。

ユーザー継続率をフィッティング

Rを使って、ソーシャルゲームのユーザー継続率を、カーブフィッティングしてみましょう。 カーブフィッティングとは、データにもっともよく当てはまる数式を見つけ、データに当てはまる曲線を描くことです。 ここで継続率とは、ある日インストールしたユーザーが、n日後にゲームを訪問している確率と考えます。 たとえば、以下はある日にインストールしたユーザーが日を経過するにつれてへっていくところを10日分集計したデータです(ただし数字はダミーです)。
installがインストール日に加入したユーザー数、nが経過日数、countはインストールユーザーの内、n日後にも継続してアクセスしてきたユーザー数です。最初は1301人いたユーザーが10日後には、168まで減っています。


installncount
13011338
13012264
13013248
13014235
13015185
13016173
13017181
13018188
13019145
130110168



上記のようなデータをインストール日5日分集め、データからえられた継続率(count/install)をグラフにプロットしたのが以下の図です。
retention

ここでは、ユーザーの期待値を求めたり、未来のユーザー数を予測するために、この減少率を数式で表現し、曲線でフィッティングしてみたいと思います。
先に結果を出しておくと、以下が継続率にフィッティングした曲線です。
retention-fitting

様々なインストール日のデータに当てはまるような曲線が引けていると思います。当然ながらここから定着するユーザー数を予測することもできます。
以下では、この曲線がどのような式に基くものか解説していきましょう。


考え方

継続率のような確率的なデータを扱うには、通常の回帰分析ではなく、一般化線形モデルの一種であるロジスティック回帰モデルという統計モデルを利用します。
このモデルに基づくと、n日後の継続率は以下のような式によって表わされます。



logisticという関数は以下のような形の関数で、値域が(0,1)となる関数です。確率が0未満や1より大きくなってしまっては困るので、この関数を利用して(0,1)区間にマッピングしていると考えてください。



また日数nのlogをとっていますが、これは継続率がしばしば曲線的な形状を取るため、こちらの方が当てはまりがよくなるという経験則に従っているだけです。サービスの性質によっては必要ないかもしれません。

問題は、(1)式のαとβを調整することによって、過去のデータにもっともよくはてまるα、βの値を見つけることです。より正確に言うと、インストールしたユーザー数に対する継続したユーザー数を確率P(n)に従う二項分布と見なした上で、もっともよく当てはまるα、βを見つけます。一般的に用いられるのは最尤法と呼ばれる手法です。最尤法では、尤度、つまり与えられたデータが得られる確率を最も高くするα、βの値を探します(この辺の解説は最後に書籍を紹介するのでそちらを参考にしてください)。

使用するデータは以下のようになっています。上にあげたデータと同様、ある日にインストールしたユーザーを10日分追跡したデータを、インストール日5日分集めたものです。

dummy <- read.table("dummy.csv",sep=",", head=T)

> dummy[1:5,]

   install  n count

1     1301  1   338

2     1301  2   264

3     1301  3   248

4     1301  4   235

5     1301  5   185


一般化線形モデルはRがデフォルトでサポートしているのでそちらを利用します。glm関数のfamily引数にbinomial(二項分布)を指定します。

inputdata <- cbind(dummy$count, dummy$install-dummy$count)
n <- dummy$n
model <- glm(inputdata~log(n), family=binomial)

最初の二行は、データの準備を行なっているだけで、メインはglm関数を使用している一行だけです。
~(チルダ)の左側が被説明項で、ここでは残存ユーザー数と離脱ユーザー数を水平に結合した行列になっています。~の右側は説明項です。familyにbinomialを指定すれば、先程説明した最尤法によるパラメーターの探索を行ない、モデルを構築してくれます。
モデルを構築するにはこれだけで十分です。
係数を表示するには、model$coeffを見てください。

> model$coeff

(Intercept)      log(n)

-0.9853399  -0.4220020


(Intercept)とあるのがグラフの切片α、log(n)がlog(n)の係数βです。
つまり、このデータからえられるユーザーの継続率は以下の数式で表現できます。
これによって、過去の継続率に基づいて、任意の日数後の継続率を求めることができました。



Rで継続率の予測値をえるには、以下のようにします。

logistic <- function(x) return(1/(1+exp(-x)))

coeff <- model$coeff

n <- seq(1,15)

# 継続率の予測値

yy <- logistic(coeff[1] + coeff[2] * log(n))


# グラフにプロットしてみる

plot(dummy$n,dummy$count/dummy$install,xlab="day",ylab="retention rate")

lines(n, yy, col=3)

retention-fitting


書籍紹介
 
一般化線形モデルについては以下の本が大変わかりやすく説明も豊富ですのでおすすめです。

データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)
データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)