您的位置:首页 > 编程语言 > Python开发

MovieLens 《用Python进行数据分析》

2017-05-26 15:03 267 查看
原始数据:20世纪90年代末到20世纪初由MovieLens用户提供的电影评分数据,包括三个表,电影评分,电影信息(年代和风格)以及用户信息(年龄,邮编,性别和职业等),数据存储类型为.dat

分析目的:

1、想知道评分排名前十和后十的电影都是什么?

2、想知道不同的年龄段喜欢的电影风格分别是什么?

3、想知道男性和女性分别最喜欢和最讨厌的电影是哪部?

数据加载:

unames = ['user_id','gender','age','occupation','zip']
rnames = ['user_id','movie_id','rating','timestamp']
mnames = ['movie_id','title','genres']

#前面三行指定将数据家加载进来以后的列名。
ratings =pd.read_table('C:/Users/yuqi/PycharmProjects/unit2/movielens/ratings.dat',sep = '::',names = rnames)
users = pd.read_table('C:/Users/yuqi/PycharmProjects/unit2/movielens/users.dat',sep = '::',names = unames)
movies = pd.read_table('C:/Users/yuqi/PycharmProjects/unit2/movielens/movies.dat',sep = '::',names = mnames)

#因为read_table指定的分隔符为\t(换行符),而文本中不同字符之间是用::隔开的,所以如果想用read_table加载的话,需要自己指定分隔符。


数据清理:

检查每个表中是否有重复值和空缺值。

ratings.duplicated()

users.duplicated()

movies.duplicated()

ratings.isnull()

users.isnull()

movies.isnull()

数据分析:

1、想知道排名前十和后十的电影的信息以及评分观众相关信息。

data=pd.merge(movies,pd.merge(users,ratings,on = 'user_id'),on = 'movie_id')#因为排名信息,电影信息以及用户信息是分散在三个表中的,所以需要将三个表根据它们共同的键联结,一般不用指定on和how,on表示用于联结的公共键,how表示联结方式,外联结内连接。

new_movies = data.sort_values('rating',asscending = 'False')#将这个表按照rating这一列排序,降序排列。

top_movies = new_movies[:10]#取排名前十的电影

bottom_movies = new_movies[-10:]#取排名后十的电影

2、想得到一个数据透视表,包含每一部电影男女评分的平均值,以及同一部电影的平均分,男女分别给所有电影的平均分。

mean_rating = data.pivot_table('rating',columns = 'gender',index = 'title',aggfunc = 'mean',margins = True)

#'rating'表示用于做透视表分析对象的列,一般不指定的话会将所有数值列作为分析对象
#index表示透视表的行
#columns表示透视表的列
#aggfunc表示对分析对象进行的分析,一般默认为求平均值,可以指定
#margins表示添加每行每列求和的值,默认不添加。


3、想过滤掉评分条目数不足250条的电影

ratings_by_size = data,groupby('title').size()

active_titles = ratings_by_size.index[ratings_by_size >= 250]

4、从数据透视表中过滤掉评分条数小于250条的电影

active_movies = mean_rating.ix[active_titles]

5、在数据透视表中过滤掉评分条目数小于250条的电影。

active_mean_rating = mean_rating.ix[active_titles]
print(active_mean_rating)
6、因为在第1步中得到的排名前十的电影仅仅是某个用户对电影的评分,而实际上对平均分进行排名才比较可靠。

#从透视表中得到女性观众和男性最喜欢的10部电影。
female_top_movies = active_mean_rating.sort_values('F',ascending = False)
print(female_top_movies[:10])
male_top_movies = active_mean_rating.sort_values('M',ascending=False)
print(male_top_movies[:10])

6、得到男女评分差别最大的十部电影

active_mean_rating['diff'] = active_mean_rating['F'] - active_mean_rating['M']#要想在数据透视表中添加一列,直接用表名['列名']就可以了。
sorted_by_diff = active_mean_rating.sort_values('diff',ascending=False)
print(sorted_by_diff[:10])
7、找出总体评分分歧最大的十部电影,不考虑性别因素
rating_std_by_tilte = data.groupby('title')['rating'].std()
print(rating_std_by_tilte)
active_rating  = rating_std_by_tilte.ix[active_titles]
a= active_rating.sort_values(ascending=False)[:10]
print(a)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息