会員が行うアクションの継続率を出すには

1.対象となる期間のIDを出す

例えば月毎の継続率を見たい場合、
月毎に投稿をしたユーザのIDを抽出してファイルに保存します。

2011-01.log
2011-02.log
2011-03.log
2011-04.log
...
みたいな形で保存しておくと楽ですね!

で、この際に必ず重複は消しておいてくださいね。


2.さっき作ったファイルを全てソートする

ここで何でソートするのかっていうとlinuxのあの変なソートが使いたいからね。

linuxコマンドのsort

3.実際に継続しているかどうか調べる

1月に使ってた人
2011-01.log
2月に使ってた人
2011-02.log

ってな感じでデータが入ってるわけだけど、
継続しているかどうか調べるために、
1月に使ってたけど2月にも使ってた人ってのを出すわけ。
それがこの下の紫の部分です!

で、どうやってそれを出すのかって話なんですけど、
2011-01.logと2011-02.logをまとめて、2個あるものは
1月も2月も使っていたということなので、
それを実際にコマンドでやって見る。



sort -m 2011-01.log 2011-02.log|uniq -d > 2011-01-2011-02.log


二つのファイルを纏めてソートしたやつをパイプで渡して-dオプションの重複のみ表示したやつをファイルに出力する。


これで1月も2月も使ってた人一覧
2011-01-2011-02.log

というファイルが出来上がった。

じゃあ1月も2月も使ってたけど3月も使ってた人は?


sort -m 2011-01-2011-02.log 2011-03.log|uniq -d > 2011-01-2011-03.log


簡単だね\(^o^)/

4.完成!

実際に運営ではこんな風に使われるらしいです。
サイト継続率UPの方法を考えてみました


5.コード

さて皆さんお待ちかねの実装コードです!

<?
$date_arr = array();
$result = array();
for($i=1;$i<=12;$i++){
    $date_arr[] = '2011-'.sprintf('%02d', $i);
}
foreach($date_arr as $key=>$date){
    foreach($date_arr as $key2=>$date2){
        $result[$date][$date2] = 0;
    }
}

foreach($date_arr as $date){
    $uids = getPostUserId($date);
    file_put_contents($date.'.log', join("\n", $uids));
}

foreach($date_arr as $key=>$date){
    $target_a = $date.'.log';
    $str = exec('wc -l '.$target_a);
    list($result[$date][$date]) = explode(' ', $str);

    for($i=$key+1; $i<count($date_arr); $i++){
        $target_b = $date_arr[$i].'.log';
        $file = $date.'-'.$date_arr[$i].'.log';
        exec('sort -m '.$target_a.' '.$target_b.' | uniq -d >'.$file);
        $str = exec('wc -l '.$file);
        list($result[$date][$date_arr[$i]]) = explode(' ', $str);
    }
}
function getPostUserId($date=null){
    $dateに投稿したユーザIDを返してくれるすごいやつ
}
?>
<table class="list">
	<tr>
		<th>/</th>
	<?foreach($result as $key=>$value):?>
		<th><?=$key?>まで</th>
	<?endforeach?>
	<?foreach($result as $key=>$value):?>
	<tr>
		<th><?=$key?>から</th>
		<?foreach($value as $key_=>$value_):?>
		<td>{[$value_]}</td>
		<?endforeach?>
	</tr>
	<?endforeach?>
	</tr>
</table>