python计算各类型电影的评分_【Python数据科学实战项⽬】
之基于MovieLens。。。
原标题:【Python数据科学实战项⽬】之 基于MovieLens的影评趋势分析|详解
1. 项⽬任务
1.1 数据来源
本项⽬使⽤GroupLens Research收集的MovieLens⽹站电影评分数据集进⾏分析
该数据集发布于2015年4⽉,包含2000多万条评分数据、2.7万部电影数据、46.5万个电影类型标签数据及13.8万位⽤户数据
本项⽬对该数据集中的movies及ratings两个csv数据⽂件进⾏分析
1.2 分析⽬的
分析得出主要电影类型(如电影数量300万以上的电影类型)
分析主要电影类型评分的变化趋势
分析主要电影类型评分变化趋势之间的联系
分析⽤户对不同类型电影评分之间的关系强度
1.3 分析问题
不同类型电影的平均评分变化趋势:
主要电影类型的平均评分如何变化?
对不同类型电影的平均评分进⾏⽐较会有什么发现?
不同类型电影平均评分变化趋势之间的关联程度:
不同类型电影平均评分的变化趋势之间有关联吗?
⽐如,喜剧⽚(Comedy)和冒险⽚(Adventure)等其他电影类型的得分之间是正相关?关联强度怎么样?
2. 项⽬步骤
2.1 导⼊包
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
2.2 数据读取
为了⽅便查阅,本项⽬使⽤魔法命令(以%开始)将matplotlib图表直接嵌⼊在Notebook之中
% matplotlib inline
⽤Pandas包的read_csv()函数分别将⽂件movies.csv和ratings.csv读⼊⾄对应的DataFrame变量中
ad_csv('MovieLens/movies.csv')ad_csv('MovieLens/ratings.csv')
显⽰movies的前5⾏数据
movies.head(5)
查看movies维度(形状)
movies.shape(27278, 3)
显⽰ratings的前6⾏数据
ratings.head(6)
查看ratings维度(形状)
ratings.shape(20000263, 4)
查看ratings的统计性描述信息
ratings.describe()
2.3 数据规整化
2.3.1 movies数据规整化处理
movies数据需要进⾏规整化处理(Data Tidying),原因在于genrens列不符合规整数据的基本原则
规整化处理的⽅法与步骤:
[1].以电影所属类型(genres)及符号’|’为依据进⾏分割;
[2].如果⼀个电影有多个类型(genres),将分割成多个列表(List);
[3].将分割后得到的多个列表(Lists)转换为⼀个数据框(DataFrame);
[4].将数据框的索引设置为movieId
movies_tidy1=pd.s.str.split('|').tolist(),vieId)
显⽰movies_tidy1的前3⾏
movies_tidy1.head(3)
[5].按规整化数据的基本原则,采⽤stack()函数进⾏重构,并重新设置⾏索引
注:重新设置⾏索引后,原来的⾏索引保留为movieId列
movies_tidy2=movies_tidy1.stack().reset_index()
显⽰movies_tidy2的前10⾏
movies_tidy2.head(10)
[6].删除level_1列,将columns为0的列重命名为genres,并重新定义数据框为movies_genres
movies_genres=movies_tidy2.drop('level_1',axis=1).rename(columns={0:'genres'})movies_genres.head() [7].将原movies数据中的genres列替换成movies_genres,得到规整化处理后的movies数据
(movies.drop('genres',axis=1),movies_genres)movies.head()
查看movies维度(形状)
movies.shape(54406, 3)
2.3.2 ratings数据规整化处理
[1].查看ratings头部数据
ratings.head()
[2].格式化时间戳为本地时间,并输出为4位数年份
import timeratings['timestamp']=ratings['timestamp'].apply(lambda x: time.strftime('%Y', time.localtime(x)))ratings.head()
2.3.3 定义新的数据集movie_ratings
基于规整化处理后的movies和ratings,构建电影评分数据集movie_ratings
[1].去掉movies中的title列,得到新movies
[2].合并新movies与ratings,连接键为movieId
[3].得到新的数据框movie_ratings
[4].显⽰数据框movie_ratings的前5⾏
movie_(movies.drop('title',axis=1),on='movieId',how='inner')movie_ratings.head()
[5].查看movie_ratings的维度
movie_ratings.shape(53177059, 5)
计算movies_ratings中不同类型电影的频数
[1].按genres列进⾏分组处理
[2].计算movieId的频数
[3].按movieId的频次进⾏降序
upby(['genres'],as_index=False)['movieId'].count().sort_values( by='movieId',ascending=0)
[4].过滤movie_ratings中数量在300万以下的电影种类
movie_ratings=movie_ratings.loc[movie_ratings['genres'].isin(['Drama','Comedy','Action','Thriller','Adventure','Romance','Crime','S Fi'])]movie_ratings.head()
[5].查看movie_ratings的维度
movie_ratings.shape(41918630, 5)
电影源代码 下载2.4 数据分析及可视化
2.4.1 基本统计分析
计算不同电影类型的年度平均评分
⽅法:按年份、类型进⾏分组,并计算各组的均值,将timestamp列名更改为year
mean_ratings=upby(['timestamp','genres'],as_index=False)
['rating'].an)ame(columns={'timestamp':'year'},inplace=True)mean_ratings.head()
统计年度不同电影类型的标准差
⽅法:按年份、类型进⾏分组,并计算各组的标准差,将timestamp列改名为year
sd_ratings=upby(['timestamp','genres'],as_index=False)
['rating'].agg(np.std,ddof=1)ame(columns={'timestamp':'year'},inplace=True)sd_ratings.head()
2.4.2 变化趋势分析
对不同类型电影平均评分的时间变化趋势进⾏分析
⽅法:按'movieId','timestamp','genres'进⾏分组,并计算各组平均值
mg_ratings=upby(['movieId','timestamp','genres'],as_index=False)
['rating'].an)ame(columns={'timestamp':'year'},inplace=True)ame(columns=
{'rating':'mg_rating_mean'},inplace=True)mg_ratings.head()
可视化:绘制不同类型电影平均评分的变化趋势图
sns.set(font_scale=1,rc={'lines.linewidth':0.5,'figure.figsize':
(10,7)})sns.pointplot(x='year',y='mg_rating_mean',hue='genres',data=mg_ratings,palette='tab10')
对⽐分析不同时间段内的评分变化情况
⽅法:选取1996-2000及2011-2015两个五年时间段进⾏分析
ratings_9600=mg_ratings.loc[mg_ratings['year'].isin(['1996','1997','1998','1999','2000'])]ratings_1115=mg_ratings.loc[mg_rat
⽤⼩提琴图可视化1996-2000年间8种电影类型平均评分的分布
sns.set(font_scale=1,rc=
{'lines.linewidth':0.5})sns.violinplot(x='year',y='mg_rating_mean',hue='genres',data=ratings_9600,palette='rainbow_r')plt.legend(bbox_ (1.2,0.5),loc=7)
⽤箱线图可视化2011-2015年间8种电影类型平均评分的分布
sns.set(font_scale=1,rc=
{'lines.linewidth':0.5})sns.boxplot(x='year',y='mg_rating_mean',hue='genres',data=ratings_1115,palette='Set2')plt.legend(bbox_to_anc (1.2,0.5),loc=7)
2.4.3 关联程度分析
对不同电影类型之间⽤户平均评分的关联程度进⾏分析
[1].按'userId','genres'进⾏分组,并计算每组平均分,结果存放在数据框ug_ratings
ug_ratings=upby(['userId','genres'],as_index=False)
['rating'].an)ame(columns={'rating':'ug_rating_mean'},inplace=True)ug_ratings.head()
[2].可视化不同类型电影⽤户平均评分的分布图
sns.set(style='darkgrid')g=sns.FacetGrid(ug_ratings,col='genres',sharey=False,size=5)g.map(sns.distplot,'ug_rating_mean',bins= (0,6),xticks=[1,2,3,4,5,6])
[3].对数据框ug_ratings进⾏重构操作(reshape),⽣成对应的透视表
pivot=ug_ratings.pivot(index='userId',columns='genres',values='ug_rating_mean')pivot.head()
[4].通过关联图分析关联程度
4.1 绘制Comedy,Adventure两种类型电影评分的联合图,分析关联程度
sns.jointplot('Comedy','Adventure',pivot,kind='reg',color='g')
4.2 绘制Comedy,Drama两种类型电影评分的联合图,分析关联程度
sns.jointplot('Comedy','Drama',pivot,kind='reg',color='b')
4.3 绘制 Comedy,Romance 两种类型电影评分的联合图,分析关联程度
sns.jointplot('Comedy','Romance',pivot,kind='reg',color='r')
4.4 绘制 Comedy,Thriller 两种类型电影评分的联合图,分析关联程度
sns.jointplot('Comedy','Thriller',pivot,kind='reg',color='g')
4.5 绘制Comedy,Action两种类型电影评分的联合图,分析关联程度
sns.jointplot('Comedy','Action',pivot,kind='reg',color='b')
4.6 绘制 Comedy,Crime 两种类型电影评分的联合图,分析关联程度
sns.jointplot('Comedy','Crime',pivot,kind='reg',color='g')
4.7 绘制 Comedy,Sci-Fi 两种类型电影评分的联合图,分析关联程度
sns.jointplot('Comedy','Sci-Fi',pivot,kind='reg',color='r')
3. 结果分析
3.1 变化趋势分析
电影数量超过300万的主要电影类型有8种:戏剧(Drama)、喜剧(Comedy)、动作(Action)、惊悚(Thriller)、冒险(Adventure)、爱情(Romance)、犯罪(Crime)和科幻(Sci-Fi);
上述8种主要电影类型的平均评分在1996-1998年间均呈下降趋势,之后变化平稳,平均评分均低于3.5分;
1995-2015年间,科幻(Sci-Fi)类电影的平均评分⼀直最低,动作(Action)类电影的平均评分也⽐较低;
1995-2015年间,戏剧(Drama)、爱情(Romance)、犯罪(Crime)三种类型电影的平均评分最⾼。
注:图⽚源于⽹络
3.2 关联程度分析
喜剧(Comedy)类电影与其他7种电影类型的得分之间均呈现正相关关系;
喜剧(Comedy)与爱情(Romance)的得分关联程度最⾼,相关系数达0.72;
喜剧(Comedy)与科幻(Sci-Fi)的得分关联程度最低,相关系数为0.55。
END
【注释】
本⽂是在Sandipan Dey分析⼯作的基础上,进⾏了如下改进:
1.通过数据分析确定主要电影类型(原⽂没有给出电影类型选择依据)
2.提供了每个步骤的全套源代码(原⽂没有提供全部代码)
3.对⽂字解释部分进⾏了翻译和优化(原⽂部分地⽅为灰⾊难点)
4.对源代码和注释部分进⾏了优化(原⽂的源代码和注释需要优化)
5.将原⽂翻译成中⽂(原⽂为英⽂)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。