ひどい教授がいたもんですね。

教授「この本買え アマゾンで星5つけろ」学生がamazonレビューで内情を暴露 : ワラノート

僕はこんな教授にあたらなくて良かったです。ところでこの本のレビューに以下のような投稿がありました。

ここには途轍もない量の★5レビューがあると思いますが、暇な人は、横軸に時間(単位は日)、縦軸に1日あたりに書かれた★5レビューの数として、ヒストグラムを取ってみると面白いと思います。(だいたい半年おきに、パルス的なレビュー数の鋭い極大が見られます)

おお、確かに面白そうだ。やってみましょう。

データを取る

Amazonの商品情報はAPIとかがあるんですかね。ちょっと面倒なのでスクレイピングでやらせてください。 やりたいのは可視化なので、適当に書いちゃいますね。 標準出力に吐き出したものをリダイレクトでCSVにしちゃいましょう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import urllib2
import time
import re

BASE_URL = "http://www.amazon.co.jp/product-reviews/4062179350"

def get_max_page_num():
    html = BeautifulSoup(urllib2.urlopen(BASE_URL + "/ref=cm_cr_dp_see_all_summary").read(), 'lxml')
    return int(html.find_all(class_="page-button")[-1].string)

def get_comment_list(page_num):
    html = BeautifulSoup(urllib2.urlopen(BASE_URL + "/ref=cm_cr_arp_d_paging_btm_{0}?pageNumber={0}".format(page_num)).read(), 'lxml')
    return html.find(id="cm_cr-review_list").find_all(class_="review")

def parse_comment_detail(comment):
    return {"date": re.sub(u"\d+日", "", comment.find(class_="review-date").string),
            "rate": comment.find(class_="review-rating").find(class_="a-icon-alt").string}

def wait():
    time.sleep(5)

for i in range(get_max_page_num()):
    wait()
    page_num = i + 1
    for comment in get_comment_list(page_num):
        parsed_comment = parse_comment_detail(comment)
        print("{0},{1}".format(parsed_comment["date"].encode("utf-8"), parsed_comment["rate"].encode("utf-8")))

こんな感じで取れます。ヘッダもつけておきましょう。 この時点ではただ吐き出しただけで何も集計していません。

date,rate
2015年2月,5つ星のうち1.0
2014年6月,5つ星のうち1.0
2014年7月,5つ星のうち1.0
2016年3月,5つ星のうち1.0
2015年1月,5つ星のうち1.0
2016年3月,5つ星のうち1.0
2016年2月,5つ星のうち1.0
2016年3月,5つ星のうち1.0
  :
  :

あ、一桁の月は0埋めで2桁になるように手動で修正しました。抽出した後に気付いたので、正規表現でうまいことやりました。

可視化する

何を使おうか迷ったんですが、僕はそもそも可視化とかあんまり詳しくないんですよね。 ただ、こないだマイクロソフト社から発表されたSandDanceというちょうどいいものがあるので、これを使ってみましょう。

これは何かというと、CSVやらなんたらを乗っけると幾つかのパターンで可視化してくれるというものです。 ファセットも出来たりして便利なのですが、意外と可視化したいデータってなかったりするんですよね。

前置きはおいておいて、取り込んでみましょう。 取り込んだ直後はcolumnという形式で表示してくれます。これでいうと、月ごとのレビュー数ですね。

これだと評価値がわからないので、評価ごとに色をつけてみましょう。

ピンクが評価5のものです。随分見やすくなりましたね。ほとんどが評価5なのがよくわかります。 どうやら2014年7月に1度大きな波が来て、その後2014年11月、2014年12月と大量に評価されているようです。 8月から10月に評価が全く付いていないのは、おそらく評価を強いられていた学生が夏休みだったからでしょう。

だいたい半年おきに、パルス的なレビュー数の鋭い極大が見られます

半年ごとではなかったですが、何か恣意的なものを感じるグラフなのは確かですね。

ちなみに月ごとのファセット表示をするとこうなります。

違った表示の仕方も出来たり。
データによってはもっと面白い表示が出来そうですね。

最後にCSVを貼っておくので、使いたい人がいたらどうぞ。

date,rate
2015年02月,5つ星のうち1.0
2014年06月,5つ星のうち1.0
2014年07月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2015年01月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2016年02月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち2.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2014年10月,5つ星のうち3.0
2016年03月,5つ星のうち1.0
2016年03月,5つ星のうち1.0
2014年10月,5つ星のうち3.0
2013年08月,5つ星のうち3.0
2013年01月,5つ星のうち5.0
2012年10月,5つ星のうち5.0
2015年07月,5つ星のうち4.0
2013年05月,5つ星のうち5.0
2016年03月,5つ星のうち3.0
2014年08月,5つ星のうち4.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち4.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2014年07月,5つ星のうち4.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち4.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2013年12月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年01月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年06月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2013年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2013年06月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年06月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2013年06月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2013年06月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち4.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年07月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2016年03月,5つ星のうち4.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2014年11月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2014年12月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2015年03月,5つ星のうち5.0
2015年01月,5つ星のうち5.0
2015年07月,5つ星のうち5.0