クチコミ分析プロジェクト構想


ソーシャルゲームの運営業務はKPIの分析によってイベント施策に対するユーザ反応を把握することに始まる。
UU(Unique Users)、DAU(Daily Active Users)、一人当たり平均課金額(ARPPU:Average Revenue Per Payed Use)
を分/時/日/週/月/年のレベルでグラフ化し、
グラフが上昇した理由、グラフが下降した理由を常に要因分析しながら、
グラフが常に上昇トレンドを描くための施策のPDCAサイクルを回していくのである。


何故かと言うと、ソーシャルゲームは売切りのビジネスではなく基本無料、アイテム課金制の
ビジネスであるため、如何にしてゲーム自体が売れるかと言う作り込みの要素だけではなく
如何にして人に飽きさせないか、如何にして人にアイテムを買ってもらえるかという運営フェーズが
売上の鍵になるからである。そこで不可欠になってくるのは、モノが飛ぶように売れるお祭り状態を
イベントという形で周期的に絶え間なく次々仕掛け続けることなのである。


KPI指標はこの意味において顧客満足度の代用になっている。


しかし今回私が提案するのは、
「本当に顧客満足度を把握するためには、やはりどうしても実際のユーザの購買行動(KPIに現れる)
だけではなくユーザの直接の声もKPI分析と両輪で分析すべきなのではないか」
という仮説である。


しかし、ユーザの声の直接分析とは、「なにを」「どうやって」分析する事なのだろうか?
「なにを」分析するかの対象としては2ちゃんねるmixiTwitterなど、掲示板やSNSの書き込みと
各ゲーム内の掲示板、及び蓄積された問い合わせメールのデータベースがあげられる。
そして「どうやって」分析するかという方法については”テキストマイニング”として知られる
既存の自然言語解析技法を用いることができる。


この基本的な着想に基づき、私はKPI分析とユーザのクチコミ分析を両輪で回すことによる、
ユーザの行動分析と生の声の分析を同時に行う事が、より正確な顧客満足度の把握につながると考え、
これによってイベント運用のPDCAサイクルをよりユーザに向き合った形で回せる仕組みづくりを
すべきなのではないかと提案する。


市場リサーチによれば、野村総研のTrue Tellerやベクスト社のVextMinerなど一般に知られた
サービスがあり、メールによるヒアリングなどではデータさえサービスに合わせた形で特定のサーバに
定期的に配置してやれば、ソーシャルゲームのDBとも連携は可能なので、一度御社に伺って
デモをやりたいという話もあった。これは一番有望なソリューションだと考えられる反面、
決して安くないサービスであるために、有効性を証明しなければ、中々お金を出したいという
判断に納得感が生まれないだろう。


そこで私は、簡単なモックを作成してみた。
モックで簡単なテキスト分析を行い、その有用性を立証する事で、まずは予算確保を目指そう
という目論見であった。

<?php

// ライブラリの読み込み
require_once('phplot/phplot.php');

//接続文字列
$db_host = "localhost";
$db_user = "root";
$db_passwd = "";
$db = mysql_connect($db_host,$db_user,$db_passwd);

$db_name = "csv";
mysql_select_db($db_name,$db);


//dbでの日付データ取得
$str_sql = "select date from csv group by date";
$rs = mysql_query($str_sql, $db);


//日付を$datelistに確保
$datelist = array();

while($arr_item = mysql_fetch_assoc($rs))
 {
    foreach($arr_item as $key => $value)
    {
    	$value = mb_convert_encoding($value, "SJIS", "UTF-8");
        $datelist[] = $value;
    }

 }
 
 //日付で検索したコメントを日付ごとの配列にする。
 $textlist = array();
 foreach($datelist as $date){
 	if($date !== "0000-00-00"){
 		$str_sql = "select comment from csv where date ='" . $date . "';";
 		$rs = mysql_query($str_sql, $db);
 	}
 	//テキスト
 	$text = array();
 	while($arr_item = mysql_fetch_assoc($rs))
	{	
 		foreach($arr_item as $value)
 		{
 			$value = mb_convert_encoding($value, "SJIS", "UTF-8");
 			$text[$value] = $date;
 		}
 		//値をキー、日付をvalueにしたリストができる※(array_keys())対応   
 		$textlist[] = $text;	 
 	}
 }
 
 //コメントを連結し日付毎に1レコードにする(array_key()用)
$last_comment_of_date = array(); 
$hoge = array(); 
foreach($textlist as $k => $arr){ 
	foreach($arr as $comment => $date){ 
		if( ! isset($hoge[$date])){ 
			$hoge[$date] = array(); 
		} 
		if( ! in_array($comment , $hoge[$date])){ 
			$hoge[$date][] = $comment; 
		} 
	} 
} 
foreach($hoge as $date => $comment_array){ 
	$last_comment_of_date[implode($comment_array)] = $date; 
} 

//var_dump($last_comment_of_date);

 //日付ごとの集計
 
 //語義取得
 $db_name = "keyword";
 mysql_select_db($db_name,$db);
 $str_sql = "select keyword, score from keyword";
 $rs = mysql_query($str_sql, $db);

 $word = array();
 
 while($arr_item = mysql_fetch_assoc($rs))
 {
 	 $word[mb_convert_encoding($arr_item['keyword'], "SJIS", "UTF-8")] = $arr_item["score"];
 }
 
 //var_dump($word);
 
 $data = array();
 
 //スコア
 $score = array();
 
 //書き込みのあった日付を日付ごとに精査
 foreach($datelist as $date){

    if($date !== "0000-00-00"){ 
 	
 	//$targetは日付が一致する文章を$targetに
 	$target = array_keys($last_comment_of_date, $date);		
 	//日付ごとの書き込みを一行ごとに分解
 	foreach($target as $textval){

		//検索対象キーワードごとに検索を行う
		foreach($word as $key => $val){			
			$point = 0;		
			
			//検索しながら一致文字以前を切り落とすため、tmpを使って作業
			$tmp = $textval;
			while(strpos($tmp, $key) !== FALSE){
				//文字列が出てくる最初の位置から、その文字列を取り除いた文字列を取りだす。
				$tmp = substr(strstr($tmp, $key), strlen($key));
				//$point = $point + $val;
				$score[$date] += $val;
			}
			//$score[$date] = $score[$date] + $point;
		}
	}
 
 	// データの設定
	$data[] = array($date, $score[$date]);
     }
 }
 //var_dump($data);
 
mysql_close($db);

// グラフオブジェクトの生成
$graph = new PHPlot(3000,600);
$graph->SetDataType("text-data");
 
$graph->SetDataValues($data);
 
$graph->SetXTitle("DATE");
$graph->SetYTitle("SCORE");
$graph->SetYTickIncrement(1);
$graph->SetPlotType("bars");
$graph->SetXLabelAngle(0);
$graph->SetLegend(array("good", "bad"));
  
$graph->SetNewPlotAreaPixels(40,30,2800,400);
$graph->SetPlotAreaWorld(0,-30,50,30);
 
// グラフの表示
$graph->DrawGraph();

?>


PHPのソースを読んでもチンプンカンプン、というアナタの為に簡単な仕様を解説すると、
「書き込み日付,コメント内容」の形式にあらかじめ加工されたCSVファイルに対して、
予め登録しておいた「プラス評価を意味するキーワード」「マイナス評価を意味するキーワード」
を集計し、phplotというグラフ化ライブラリを用いて集計結果をグラフ化するという簡易版である。


但し、2ちゃんねるから実際にdatデータを取得し、別のプログラムで「書き込み日付,コメント」
以外の余分な情報をトリミングした上で上記モックで料理してみた結果分かったのは
売上が立っていようといまいとユーザがどれだけもりあがっていようといまいと、
2ちゃんねるにはユーザの中のほんの一部の人間しか書き込みをしていないので、
売上との相関関係を証明できないという結果であった。
極端な話、一人の人間が大量に悪評を連投していれば、グラフは正直に極端な下振れを出す。
言うまでもなくそれは実際のユーザの動向とグラフとの連動を乖離させる結果になる。


従って、2ちゃんねるよりもよりユーザに密着したデータ、ゲーム自体の内部掲示板を対象に
分析を行うか、ある程度ユーザの連投を特定して除去できるSNSを対象に分析を行うべきなのではないか
という帰結を導かざるを得ない。
ここから先は、モックでやるのは少しハードルが上がってくる。
但し、何らかの形で技術的ないしは予算的なハードルを越えられるのであれば、
検証を続ける価値はあるのではないかと私は考えている。


というのも、システム化するにせよしないにせよ、
プランナー職の方々は自分で各種クチコミをチェックしていて、
施策の評判を気にしておられるからである。それを定性分析なり定量分析にまでもっていって
システム化するというのは、実は結構ニーズがある課題なのではないだろうか。