データの概観を捉える

amiablykazu8428 執筆者 [Kazuya Kawakami]

分析の面白さは, 構成点(問題意識, 仮説の生成)と技術点(手法の選択, 精度)の組み合わせで
分析の面白さ = 構成点 × 技術点
ように評価できます.
どんなに高度な手法を使っても, 構成が悪ければ良い分析とはいえませんし,
どんなに良い構成でも, 手法の選択を間違って, 精度が悪ければ良い分析とは言えません.

すでに高度な分析技術を身につけた皆さんは, 分析の構成に磨きをかけ,
さらに面白い分析に仕上げることを意識すると良いでしょう.

分析をうまく構成するためには, 小さな仮説検証し, データを概観しながら分析を進めることが大切です.
そこで, 本節ではデータの概観を捉えるための方法について述べます.

本節では Restaurant Consumer Dataset を使用します.

データの準備

まず, 分析に必要なデータを準備します.
本節では Restaurant Consumer Dataset というデータセットを用います.
Restaurant Consumer Dataset は, 共同研究で用いるデータと良く似た構成をもっています.
簡単にファイルの中身を見てみましょう. 主なファイルは

  • userprofile.csv (user_master) : ユーザの ID と属性を含んだマスターデータ
  • geoplaces2.csv (restaurant_master) : レストランの ID と属性を含んだマスターデータ
  • rating_final.csv (rating) : レーティングデータ

の 3 つで, その他にユーザ, レストランについての詳しい素性を含んだデータがあります.

  • chefmozaccepts.csv (restaurant_payment) : レストランでの支払い方法
  • chefmozcuisine.csv (restaurant_cuisine): レストランの食事の種類 (和食..)
  • chefmozhours4.csv (restaurant_hour) : レストランの営業日と営業時間
  • chefmozparking.csv (restaurant_parking) : レストランのパーキングの有無
  • userpayment.csv (user_payment) : ユーザの支払い方法
  • usercuisine.csv (user_cuisine) : ユーザの食べた食事の種類

共同研究で使用するデータも「ユーザ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

などなど…
様々な仮説を生成することができます.
共同研究相手からのヒアリングをもとに仮説を生成し, 検証してみてください.

Tips

  • 共同研究相手と事前に結果を予想しておいて, 結果を検証すると面白いです.
  • 分析とあわせて, 打ち手をいくつか提案すると議論が盛り上がります.
    特に, 分析手法が複雑で, 活用方法をイメージしにくい場合に効果的です.

課題

課題 1

本節で用いた例のように,

  • ユーザマスター: ユーザID と属性
  • アイテムマスター: アイテムID と属性
  • レーティング: ユーザID, アイテムID, レーティング(閲覧数)

の 3 つからなるデータベースを作成せよ.
データは本節で用いたデータセットでも良いし, 好きなデータで良い.

課題 2

課題 1 で作成したデータをもとに,

  • 仮説の生成
  • 仮説の検証(分析)
  • 打ち手の提案

を一通り行い, 打ち手を提案するプレゼンテーションにまとめよ. (但し, 検証は SQL で行える程度のものでよい)

例えば,

  • 仮説の生成:日本食レストランと中華料理店が同じ地域にあれば, 日本食の方が人気がある
  • 仮説の検証:SQLをもちいて検証
  • 打ち手:日本食レストランの出店計画(中華料理店の近くに出店する)

というようなレベルのものでよい.