Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

 | 

2013-06-21

[] Rにさわってみたかったので、はてなブックマークの本の傾向についてちょっと調べてみる 00:01

 月曜日から、はてなブックマークから取得してきた本をランダムで表示する「Bookable」というサービスを立ち上げました。その中で、適当に「50User以上」「50User以上25User以下」「25User以上10User以下」みたいな感じで、適当な範囲を設けていたのですが、ランダムに表示するサービスという性質上、どうしても母数が少ないと、同じ本が何度も表示されてしまう結果となってしまいます。

 で、どうせだからということで、はてなブックマークで、全体的に本に対するブックマークの分布ってどんな風になっているんだろう?と思ったので、調べてみることにしました。もちろん、Pythonで調べてもいいのですが、せっかくの機会なので、統計処理に定評のあるRを覚えるついでにでも、その辺の分析をしてみようかと思います。いまから使うデータは下に置いておきます。

 https://gist.github.com/esehara/ec4206f47b12278667e9

 ちなみに、参考にRによるやさしい統計学を使ってます。

まずはRを入れてみる

 とりあえず、自分はUbuntuを使用しているので、apt-getでサクッと入れました。

sudo apt-get install r-base

データを読み込ませてみる

 まず、何はともあれデータを読み込ませてみる必要があるでしょう。試しに上のcsvファイルを読み込ませてみます。ちなみに、Ubuntuだと"R"一文字で、対話型コンソールが開きます。

book_table <- read.csv('simple_data.csv')

 これで読み込まれました。csvのデータがbook_tableにある状態です。実際に、book_tableだけを、コンソールでたたいてみると

    Users Books
1     264     0
2     263     1
3     262     0
4     261     0
5     260     0
6     259     1
7     258     0
8     257     0
9     256     0
10    255     0
.
.
.

 という風に表示されました。Usersが、はてなブックマークのユーザー数であり、そしてそのユーザー数で記録された本の冊数がBooksになります。とはいえ、それぞれのカラムに、アクセスしたいと思うのが、普通だと思います。その方法は「$」でアクセスすることができます。

> book_table$Books
.
.
[136]    3    3    2    5    2    1    0    2    3    3    3    5    2    3    3
[151]    4    3    3    1    4    2    4    4    2    5    4    3    3    5   10
[166]    2    7    8    5    8    2    7    7    6    7    3    7   11    8    7
[181]    6    2    5   10   10    8    6   13   13    6   12    9    9   13   16
[196]   12   15   14   18   17   17   25   20   14   22   22   23   21   25   27
[211]   21   25   45   32   25   37   50   51   40   60   60   70   47   71   66
[226]   69   76   74   90   84   98  113  106  118  134  127  168  166  189  192
.
.

 といった形でアクセスすることが可能になります。そこで、このデータの相関関係を求めてみることができます。自分は統計について詳しくはないのですが、相関係数というものがあるそうです。

> cor(book_table$Books, book_table$Users)
[1] -0.3283284

 この負の数に関しては、絶対値で0.2〜0.4が弱い相関、0.4〜0.7が中程度、0.7〜1.0が強い相関関係になるそうです。どうも同じブックマーク数の本の数には相関がありそうにも見えるのだけれどもどうでしょうか。

 相関がありそうなところを調べる前に、散布図を作ってみます。plotという関数で作ることが出来ます。(ちなみに、png関数は、pngファイルを作るために、そしてdev.off()はファイルを閉じて保存するためのもののようです)

> png('test-graph01.png')
> plot(book_table)
> dev.off()

 これで散布図が下になるわけですが……

f:id:nisemono_san:20130620222959p:image

 …うーん、ちょっと左側が大きすぎて右側がよくわからないですね。ちょっと、どれだけ大きいのかを調べてみましょう。あえて、ユーザー数が1000冊以下のデータをばっさりと切ってみます。

> lot_users <- book_table$Books > 1000
> lot_books <- book_table[lot_users, ]
> lot_books
    Users Books
253    12  1192
254    11  1361
255    10  1776
256     9  2175
257     8  2868
258     7  3769
259     6  5316
260     5  7542
261     4  6300

 上手く切り捨てられましたね。さっそくこのデータでグラフを作ってみます。

f:id:nisemono_san:20130620222958p:image

 だいぶわかりやすくなりました。上記のデータにもあるように、5ユーザー辺りになると、かなり冊数が多くなってきます。

 それでは、逆に1000Userを切り捨てたデータでグラフを作ってみます。ただし、データを先回りして見ていた人ならわかるとおり、3以下のUser数に関しては生成途中なので、単なるゴミです。なので、これも切り捨てたほうがよさそうです。どうやら条件を複数指定するときは、subsetを使うと便利のようです。

> sub_users <- subset(book_table, book_table$Books < 1000 & book_table$Users > 5)
> sub_users
    Users Books
1     264     0
2     263     1
3     262     0
.
.
.
249    16   582
250    15   755
251    14   795
252    13   947
> 

 ちゃんと対象になりそうなデータが出てきましたね。さっそくグラフを作ってみます。

f:id:nisemono_san:20130620222957p:image

 もうちょっと細かく見てみたいので、13〜50の間のグラフにしてみます。

> sub_users <- subset(book_table, book_table$Books < 1000 & book_table$Users > 5 & book_table$Users < 50)
> png('test-graph04.png')
> plot(sub_users)
> dev.off()

f:id:nisemono_san:20130620222956p:image

 どうやら25を境目に横ならびになりそうです。例えば25以下だとしたのような感じ。

f:id:nisemono_san:20130621120439p:image

50Userから、かなり密集していますね。こんどは50User以上を切り抜いてみましょう。

f:id:nisemono_san:20130620222955p:image

 こうなると、かなりばらけていることが視覚的にわかりますね。

 恐らく、Bookableは、5User以下、5〜10User以下、10Userから25User、それ以上という形で敷居を持った方が、より広範な本がランダム出てくる可能性が高そうです。

 蛇足ですが、User数における冊数が1000冊以下だと、相関が中程度になるようです。実は、cor関数、テーブルをぶち込むと、各種の相関を出してくれます。

> books <- read.csv('simple_userdata.csv')
> less1000 <- subset(books, books$Books < 1000)
> cor(less1000)
           Users      Books
Users  1.0000000 -0.4712317
Books -0.4712317  1.0000000

 当然、Userが増えればUserが増える(当たり前なんですが)ので、UserとUserの相関は1となります。で、本来の目的はUserとBooksの関係ですが、-0.4712317と、かなり相関度が見られるように感じますね。

まとめ

 ということで、今回は間単にRをさわってみましたが、意外に簡単に解析が出来るという利便性と、単純にグラフがつくりやすいという意味では、なるほどたくさんの人に利用され、愛されているんだなあというのが伝わってきました。もちろん、Rをより効率よく使うためには、もっと統計についても勉強する必要があるので、その辺が課題になるでしょう。

anonanon2013/06/22 11:48おおきな値とちいさな値が混在しているときは対数グラフで見るというのもひとつの手ですので、よければお試しくださいませ

nisemono_sannisemono_san2013/06/22 18:21どうも、コメントありがとうございます!対数グラフというのがあるのですね。この辺まったくずぶの素人なので、少しずつ勉強しようと思います。対数グラフについても、あとで調べてみます。コメントThanksです :)

masahalmasahal2013/06/23 23:37こういう相互影響するものの分布はべき乗則に従うという話が『歴史は「べき乗則」で動く』などの科学解説書にのってます

nisemono_sannisemono_san2013/06/24 11:25『歴史は「べき乗則」で動く』という本、面白そうですね。機会があるときに読んでみようと思います。Thanks :)

 |