Rを使ったデータ分析手法-めっちゃクロス集計する


クロス集計ならExcelでええやん、は間違い

ビジネス活用事例で学ぶ データサイエンス入門の第四章では、Rでクロス集計を行う方法が紹介されています。
クロス集計と言えば、Excelの独壇場でしょう!という気持ちになりますし、実際クロス集計を作成した後、そこから色々分析することに関してはExcelは悪いツールとは言えないでしょう。
しかし、クロス集計を切り口を変えて大量に作成する、となると途端にExcelは作業効率の悪いツールと化してしまうでしょう。
クロス集計には、データをこれと決めて、その中でゴリゴリ数字をいじりながら「あーでもないこーでもない」と考えるような方法と、切り口を大量に試して、筋の良さそうなクロス集計を探すような方法とがありますが、前者のようなケースではエクセルが強いですが、後者の場合はRが強いということになります。(まぁ、Tableauがあれば全部Tableauでやるんですけど。)


問題発見・仮説立案・現状把握

今回も、本書で設定された問題を確認してみましょう。今回起こっている問題は、これまで増加を続けていたゲームの利用ユーザー数が今月に入って先月よりも大きく低下してしまったという問題が発生しています。
この問題に関して、

1.プロモーションは、前月とほぼ同様で新規ユーザーの獲得はほぼ同水準
2.イベント内容は前月とほぼ変えていない

ということがヒアリングによって解っています。これらから、プロモーションやイベント内容によって数字が大きく低下したとは考えづらいので、どこかのユーザーセグメントに問題が発生しているだろうと考え、そのユーザーセグメントがどこなのかを突き止めるために様々な軸でクロス集計を行っています。
今回のケースでは月次の関連データを組み合わせたデータセットを作成し、性別、年代、性別と年代の複合、デバイスとRを使って軸を変えつつ集計をしていったところ、Androidの利用ユーザ数が激減していることが解りました。
ここまで、月次データで分析を行いましたが、経時変化を見るため日次データでデバイス別の利用ユーザ数を調べて見ると、特定機能のリリースを行った日から利用ユーザ数が激減していることが解り、原因はそのリリースで発生したバグだと解りました。あとはバグを修正することで元の水準に戻ることを祈るだけですね。


このデータ分析手法から学べること

データ分析には、「検証型」と「探索型」の分析が存在します。「検証型」のデータ分析は、有力な仮説がある時にその仮説が正しいかどうかを検証するデータ分析のことを指します。逆に「探索型」のデータ分析とは、事前に有力な仮説を予想しにくい場合に複数のデータ分析を行うことで有力な仮説を探索するデータ分析を指します。(まぁ、「探索型」のデータ分析は「検証型」データ分析を大量に行うことで有力な仮説を探索していると言えなくもないですが。)
その性質上、「検証型」のデータ分析に比べて「探索型」のデータ分析は難易度が高く、また時間もかかることが多いです。
今回の分析は「探索型」の典型的なものといえ、実運用でも、深刻なバグの影響をデータ分析によって発見したり、結果としてデータが入って来てないだけで、アプリケーションには問題が無かったため深刻度は軽微だったりということがあります。

なお、今回のクロス集計ではtable関数を利用して、例えば

table(dau.user.info[,c("log_month","gender")])

とすることで、性別ごとの月次ログイン(性別✕月のログイン数のクロス集計)を見ています。
ですが、これだと出てくるのはログイン数だけです。数の羅列を見て大小を感覚で比較するというのは、結構リスキーなことが多いので、率で比較した方が良い場面は多いです。(もっと言うと、検定すべき場面も多いですが)
率のクロス集計をRで行うにはprop.tableという関数を使います。

全体の中における各セルの割合を集計するなら、
prop.table(table(dau.user.info[,c("log_month","gender")]))

行単位(今回のケースではlog_month)の割合を集計するなら
prop.table(table(dau.user.info[,c("log_month","gender")]), margin = 1 )

列単位(今回のケースではgender)の割合を集計するなら
prop.table(table(dau.user.info[,c("log_month","gender")]), margin = 2 )

とすれば集計することが可能です。
今回のケースでは、前月に比べて割合が落ちているセグメントを知りたいので、gender単位での割合を集計して異常を見つければ良いため、数値からパッと見て解らないような変化を調べるのであれば

prop.table(table(dau.user.info[,c("log_month","gender")]), margin = 2 )

のような関数を使って複数のセグメントに対して調べることで数値理解を深められるでしょう。
もっとも、今回のケースはデータの落ち方が異常というところがスタート地点なので、結果も数値だけ見れば明らかでしたが。





この記事へのトラックバック