執筆者 [Kazuya Kawakami]
分析の面白さは, 構成点(問題意識, 仮説の生成)と技術点(手法の選択, 精度)の組み合わせで
分析の面白さ = 構成点 × 技術点
ように評価できます.
どんなに高度な手法を使っても, 構成が悪ければ良い分析とはいえませんし,
どんなに良い構成でも, 手法の選択を間違って, 精度が悪ければ良い分析とは言えません.
すでに高度な分析技術を身につけた皆さんは, 分析の構成に磨きをかけ,
さらに面白い分析に仕上げることを意識すると良いでしょう.
分析をうまく構成するためには, 小さな仮説検証し, データを概観しながら分析を進めることが大切です.
そこで, 本節ではデータの概観を捉えるための方法について述べます.
本節では Restaurant Consumer Dataset を使用します.
まず, 分析に必要なデータを準備します.
本節では Restaurant Consumer Dataset というデータセットを用います.
Restaurant Consumer Dataset は, 共同研究で用いるデータと良く似た構成をもっています.
簡単にファイルの中身を見てみましょう. 主なファイルは
の 3 つで, その他にユーザ, レストランについての詳しい素性を含んだデータがあります.
共同研究で使用するデータも「ユーザID, アイテムID, 評価」というように整理するとよいでしょう.
データの概要を把握したところで, データをデータベースで扱えるようにしましょう.
データベースには, MySQL, SQLite, MongoDB など様々な種類がありますが,
本節では各 CSV が()内のテーブル名で MySQL にデータが挿入されていることを想定した解説します.
データベースにデータが準備されたところで, まず, 単純な集計を行ってみましょう.
EXCELの count() 関数で行うような簡単な処理を, MySQL で行います.
ユーザ数, レストラン数を計算する
テーブルをまたがない集計には, count() を用います.
SELECT count(*) FROM user_master; SELECT count(*) FROM restaurant_master;
“
日本料理を提供するレストランの数を計算する
行ごとに条件を与えて, 集計する場合には, 「WHERE 行の名前 = 行の値」とします.
SELECT count(*) FROM restaurant_cuisine WHERE cuisine = "Japanese";
“
料理の種類ごとのレストランの数
グループに対して集計を行う場合には, 「GROUP BY 行の名前」とします.
SELECT cuisine,count(*) FROM restaurant_cuisine GROUP BY cuisine;
“
テーブルをまたいだ, 少し複雑な集計を行います. table1 の user_id 行と, table2 の user_id 行を結合するには,
SELECT * FROM table1 LEFT/RIGHT/INNER JOIN table2 ON table1.user_id = table2.user_id
“
というようにします.
各レストランのレーティングの平均
レストランのマスターテーブルと, レーティングテーブルを結合し, 平均(AVG)を計算します.
SELECT name, AVG(rating) FROM restaurant_master LEFT JOIN rating ON restaurant_master.restaurant_id = rating.restaurant_id GROUP BY restaurant_master.restaurant_id;
“
分析を行う際には, 何らかの仮説をもって集計を行います.
また, 分析を行う際には比較を行いましょう.
比較を行うことで, 分析を打ち手に繋げることができると考えられます.
例えば
「日本食レストランのレーティングの平均は 1.344 です!」
と言っても何の手も打てません.
少し頑張って
「日本料理とメキシコ料理のレストランのレーティングはそれぞれ 1.344, 1.183 です」
となればなんとなく意味がありそうですが, やはりこれを聞いても打ち手は出てきません.
さらに踏み込んで,
「formal な服装を好むユーザは, メキシコ料理に比べて日本料理を好む」
というような仮説を立てて検証することができれば, 打ち手まで繋げることができます.
この仮説が正しいとすると, ユーザの好みの服装が formal であると聞いた時点で, 日本料理をオススメできます.
このようなユーザのコンテキスト情報を推薦システムに応用することもできるかもしれません. (研究例)
仮説を生成した際に, あらかじめ打ち手のセットを用意しておくと良いかもしれません.
formal な服装を好むユーザは, メキシコ料理に比べて日本料理を好む
SELECT restaurant_cuisine.cuisine, AVG(rating) as average FROM rating LEFT JOIN user_master ON user_master.user_id = rating.user_id LEFT JOIN restaurant_cuisine ON restaurant_cuisine.restaurant_id = rating.restaurant_id WHERE user_master.dress_preference = "formal" and restaurant_cuisine.cuisine is not NULL GROUP BY restaurant_cuisine.cuisine ORDER BY average DESC
“
SELECT restaurant_cuisine.cuisine, AVG(rating) as average FROM rating LEFT JOIN user_master ON user_master.user_id = rating.user_id LEFT JOIN restaurant_cuisine ON restaurant_cuisine.restaurant_id = rating.restaurant_id WHERE user_master.dress_preference <> "formal" and restaurant_cuisine.cuisine is not NULL GROUP BY restaurant_cuisine.cuisine ORDER BY average DESC
“
他にも
普通のパーキングがあるレストランより, バレットパーキングがあるレストランのほうが評点が高い
SELECT restaurant_parking.parking, AVG(rating) as average FROM rating LEFT JOIN restaurant_parking ON rating.restaurant_id = restaurant_parking.restaurant_id GROUP BY restaurant_parking.parking ORDER BY average DESC
“
などなど…
様々な仮説を生成することができます.
共同研究相手からのヒアリングをもとに仮説を生成し, 検証してみてください.
本節で用いた例のように,
の 3 つからなるデータベースを作成せよ.
データは本節で用いたデータセットでも良いし, 好きなデータで良い.
課題 1 で作成したデータをもとに,
を一通り行い, 打ち手を提案するプレゼンテーションにまとめよ. (但し, 検証は SQL で行える程度のものでよい)
例えば,
というようなレベルのものでよい.