《利用python進行資料分析》————MovieLens 1M資料集
阿新 • • 發佈:2018-11-27
[本次資料分析所用到的資料集連結]
(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])