在《python电影数据集的分析(系列一)》分析三个表前两个表的数据,以及对于三个表的数据连接。这里主要是分享三个表连接数据评分的详细分析。在系列一,最后的一个例子中没有考虑到评分者的数量,一个广受评价的电影他的评价满分,这是很有问题的,有可能只有一个观众评价,而这个观众评价的刚好是5.0分,则这部电影平均评分就是5.0分。
- 代码如下:
import pandas as pd
'''
@Function:连接观众,评分,电影数据进行分析
@Author :王育红
@Date :2020/8/21
'''
# 通过分割符'|',来表示每个列的对应的名称
unames = ['uid', 'age', 'gender', 'occupation', 'zip']
users = pd.read_table('d:\\park01\\ml-100k\\u.user', sep='|', header=None, names=unames)
# 通过分割符'\t',来表示每个列的对应的名称
rnames = ['uid', 'mid', 'rating', 'timestamp']
ratings = pd.read_table('d:\\park01\\ml-100k\\u.data', sep='\t', header=None, names=rnames)
# 这里有19个,要对应到文档中
mnames = ['mid', 'title', 'date1', 'data2', 'url',
'unknown', 'Action', 'Adventure', 'Animation',
'Children', 'Comedy', 'Crime', 'Documentary', 'Drama',
'Fantasy', 'Film-Noir', 'Horror', 'Musical',
'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western']
movies = pd.read_table('d:\\park01\\ml-100k\\u.item', sep='|', header=None, names=mnames, encoding='ISO-8859-1')
# 连接三个数据
frame = pd.merge(pd.merge(ratings, users), movies)
# 按性别分析每部电影的平均评分
print(frame['rating'].groupby([frame['gender'],frame['title']]).mean().sort_values(ascending=False))
查看运行结果:
(一)为此我们改变了方法,不仅要考虑平均分,而且还要考虑评分的人数,同时进行两种不同的聚合运算,agg方法来集成分组然后进行过滤和排序,过滤掉评分人数小于100的,然后按照平均分排序
- 提供代码如下:
# 增加参数设定,显示全部的记录结果
pd.set_option('display.max_rows', None)
# 进行过滤(保留总评价次数大于100的)和排序
frame1 = frame['rating'].groupby([frame['gender'],frame['title']]).agg(['mean','count'])
print(frame1[frame1['count'] > 100].sort_values(by='mean',ascending=False))
- 查看运行结果:
- 说明:很明显排在前面的是一些高峰电影,分数比较高,而且评分人数有一定的保证。可以很容易看出女性观众最喜欢电影是1997年的《泰塔尼克号》,具有最高的平均分,虽然总观看人数不是最高,但是满足大于100的要求。所以这种分析更为合理一些,因此在很多时候,我们需要利用各种方法来比较分析结果,找到最为合适和最能展示效果的分析结论。
(二)采用透视图,即多维矩阵或按照几个列来分组展示,以性别和电影来分析,按性别来计算每部电影的平均得分。将性别和标题设置为行和列,由于电影很多,更加适合行,这样就构成了一个二维矩阵,每个矩阵单元格就显示对应的平均评分
- 提供代码如下:
# 增加参数设定,显示全部的记录结果
pd.set_option('display.max_rows', None)
# 过滤筛选,通过标题来分组,size来返回每个组的个数
ratings_by_title = frame.groupby('title').size()
print(frame.pivot_table('rating',index='title',columns='gender',aggfunc='mean').
loc[ratings_by_title.index[ratings_by_title > 100]].
sort_values(by=['F','M'],ascending=[False,False]))
- 查看运行结果:
- 说明:用到了size()函数,再调用loc函数选择查寻,显示的条件是一样的大于100的评分人数
(三)采用标准差进行分析,按照性别、电影标题进行分组,计算每组的标准差,并按照降序进行排序
- 提供代码如下:
# 增加参数设定,显示全部的记录结果
pd.set_option('display.max_rows', None)
# 使用标准差进行分析
frame1 = frame.pivot_table('rating',index='title',columns='gender',aggfunc='mean')
print(frame['rating'].groupby([frame['gender'],frame['title']]).std().sort_values(ascending=False))
- 查询运行结果: