読者です 読者をやめる 読者になる 読者になる

Data Science by R and Python

統計学を、広く、深く、わかりやすく。

pythonでデータ分析(1)

f:id:tomoshige_n:20140907233155j:plain

R -> python

さて、pythonでRと同程度以上のデータ解析をできるようになろうと決意して、はや1週間が経ちました。まだ、1週間かよ!という突っ込みはやめてください笑。ここ数日は、全力でpythonによるデータ分析入門を読み込んでいます。というか、写経して、基本的なデータ分析の操作を覚えています。
O'Reilly Japan - Pythonによるデータ分析入門

本の内容に沿って、やってみたこと。

まず、Movielensの映画評価データを使います。Movielensは映画評価システムの1つで、ミネソタ大学のコンピュータ理工学研究科のグループレンズが運営しています。映画評価データは1990年代後半から、2000年代前半に書けて、Movielensユーザーを対象に収集されてきました。各データは、その映画への評価値、映画の属性(ジャンル・公開年度)、評価者の属性(年齢・郵便番号・性別・職業)から構成されています。

このデータは、データ数は100万件あります。4000本の映画に対する、6000人の評価をまとめたものになっています(つまり、それぞれが全ての映画にレビューを書くわけではないということです)。データは3つの表(評価・ユーザー情報・映画情報)から構成されています。

These files contain 1,000,209 anonymous ratings of approximately 3,900 movies
made by 6,040 MovieLens users who joined MovieLens in 2000.


MovieLens | GroupLens

それぞれのデータを確認すると、まずは「ユーザー」情報は。

In [52]: users
Out[52]: 
      user_id gender  age  occupation    zip
0           1      F    1          10  48067
1           2      M   56          16  70072
2           3      M   25          15  55117
3           4      M   45           7  02460
4           5      M   25          20  55455
5           6      F   50           9  55117
6           7      M   35           1  06810
7           8      M   25          12  11413
8           9      M   25          17  61614
9          10      F   35           1  95370

となっていて、評価結果はこのようになっています。これらのデータはuseridでひもづいています。

In [53]: ratings[:10]
Out[53]: 
   user_id  movie_id  rating  timestamp
0        1      1193       5  978300760
1        1       661       3  978302109
2        1       914       3  978301968
3        1      3408       4  978300275
4        1      2355       5  978824291
5        1      1197       3  978302268
6        1      1287       5  978302039
7        1      2804       5  978300719
8        1       594       4  978302268
9        1       919       4  978301368

そして、映画情報はこんな感じ。これは評価データとmovie_idでひもづいているデータです。

In [54]: movies[:10]
Out[54]: 
   movie_id                               title                        genres
0         1                    Toy Story (1995)   Animation|Children's|Comedy
1         2                      Jumanji (1995)  Adventure|Children's|Fantasy
2         3             Grumpier Old Men (1995)                Comedy|Romance
3         4            Waiting to Exhale (1995)                  Comedy|Drama
4         5  Father of the Bride Part II (1995)                        Comedy
5         6                         Heat (1995)         Action|Crime|Thriller
6         7                      Sabrina (1995)                Comedy|Romance
7         8                 Tom and Huck (1995)          Adventure|Children's
8         9                 Sudden Death (1995)                        Action
9        10                    GoldenEye (1995)     Action|Adventure|Thriller

このデータをまずは、pandasにあるmerge関数で統合する必要があります。これはRでもmerge関数があって、どこを引数にするのかを指定すれば、マージしてくれます。このあと、性別毎の平均などを導出して、性別で評価が変わる映画は何かなどを出していきます。コードはこんな感じ。

#data merge
data = pd.merge(pd.merge(ratings,users),movies)

#1行目を参照する
data.ix[0]

#男女/タイトルで結果を出力する
mean_ratings = data.pivot_table('rating',rows='title',cols='gender',aggfunc='mean')

#分析対象を250件以上のレビューのある映画に限る
#titleでグループ分けして、sizeを調べる
rating_by_title = data.groupby('title').size()

#250件以上に絞り込む
active_title = rating_by_title.index[rating_by_title>=250]

#mean_ratingsの中でactive titleのみを抜き出す
mean_ratings = mean_ratings.ix[active_title]

#女性の中で評価が高かった映画の抽出
top_female_ratings = mean_ratings.sort_index(by="F",ascending=False)



#評価の分かれた映画の抽出
mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']

#sort by diff
sort_by_diff = mean_ratings.sort_index(by='diff')

1週間経ってみて。

Rで関数を書くよりもpythonで書いてる方が、まずなんというか「楽しい」ということがわかりました。もちろん、不便だなと感じることもあります。記述量が多いです。ただ、Rで処理をすると遅いことも、pythonならやっぱり体感値ですが、速いなぁと感じます。
あとは、プログラム書ける周りの人と話してても、Rは取っ付きにくいし、学習コストが大きいなんて言われたりもします(Rになれると、その感覚はわからないんですけど、そういう感覚もあるようですから)。なので、僕がpythonでデータ処理ができるようになれば、そういう人達にも伝えるお手伝いができるようになるかなとも思うので・・・引き続き、がんばります。