1. 程式人生 > >《利用python進行資料分析》————MovieLens 1M資料集

《利用python進行資料分析》————MovieLens 1M資料集

[本次資料分析所用到的資料集連結]
(http://github.com/wesm/pydata-book)
先使用pandas.read_table將每個表載入到一個pandas.DataFrame物件中:

import pandas as pd

#讓展示的內容少一點
pd.options.display.max_rows = 10

unames = ['user_id','gender','age','occupation','zip']
users = pd.read_table('datasets/movielens/users.dat',sep = '::',header = None,names = unames)

rnames = ['user_id','movie_id','rating','timestamp']
ratings = pd.read_table('datasets/movielens/ratings.dat',sep = '::',header = None,names = rnames)

mnames = ['movie_id','title','genres']
movies = pd.read_table('datasets/movielens/movies.dat',sep = '::',header = None,names = mnames)

然後首先將ratings表與users表合併,然後將該結果與movies表資料合併:

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

使用pivot_table方法或得按性別分級的每部電影的平均電影評分:

mean_ratings = data.pivot_table('rating',index = 'title',columns='gender',aggfunc='mean')
print(mean_ratings[:5])

過濾掉少於250個評分的電影,並使用size()為每個標題獲取一個元素是各分組大小的Series,然後評分多於250個的電影標題的索引之後可以用於從mean_ratings中選出所需的行:

ratings_by_title = data.groupby('title').size()
print(ratings_by_title[:10])
active_titles = ratings_by_title.index[ratings_by_title >= 250]
print(active_titles)
mean_ratings = mean_ratings.loc[active_titles]
print(mean_ratings)

要看到女性觀眾的top電影,我們可以按F列降序排序:

top_female_ratings = mean_ratings.sort_values(by = 'F',ascending = False)
print(top_female_ratings[:10])

如果想要找到男性和女性觀眾之間最具有分歧性的電影,一種方法是新增一列到含有均值差的mean_ratings中:

mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']

按照’diff’排序產生評分差異最大的電影,以便我們可以看到哪些是女性首選的:

sorted_by_diff = mean_ratings.sort_values(by = 'diff')
print(sorted_by_diff[:10])

轉換行的順序,並切片出top10的行,我們就可以獲得男性更喜歡但女性評分不高的電影:

print(sorted_by_diff[::-1][:10])

如果你想要的是不依賴於性別標識而在觀眾中引起最大異議的電影。異議可以通過評分的方差或者標準差來衡量:

rating_std_by_title = data.groupby('title')['rating'].std()
ratings_std_by_title = rating_std_by_title.loc[active_titles]
print(rating_std_by_title.sort_values(ascending = False)[:10])