【利用python做数据分析02】对 MovieLens数据集进行分析 男女对电影评分差距 评分星级分布 男/女生最喜欢的电影

一、数据集说明

GroupLens Research http://www.grouplens.org/node/73 )采集了⼀组从20 世纪 90 年末到 21 世纪初由 MovieLens ⽤户提供的电
影评分数据。这些数据中包括电影评分、电影元数据(⻛格类型
和年代)以及关于⽤户的⼈⼝统计学数据(年龄、邮编、性别和
职业等)。基于机器学习算法的推荐系统⼀般都会对此类数据感
兴趣。

数据集下载:
通过百度网盘分享的文件:movielens.zip
链接:https://pan.baidu.com/s/1QaEFEXMYKcb07YMWTubqQQ?pwd=vpt8 
提取码:vpt8 
--来自百度网盘超级会员V6的分享

这些文件包含大约 3,900 部电影的 1,000,209 个匿名评级 由 2000 年加入 MovieLens 的 6,040 位 MovieLens 用户制作。


1.所有评级均包含在文件“ ratings.dat”中,并采用 以下格式: UserID::MovieID::Rating::Timestamp - UserID 范围在 1 到 6040 之间 - MovieID范围在 1 到 3952 之间 - 评级按 5 星等级进行(仅限全星评级) - 时间戳以自 time(2) 返回的纪元以来的秒数表示 - 每个用户至少有 20 个评分 用户文件描述
2.用户信息位于“users.dat”文件中,格式如下: 用户 ID::性别::年龄::职业::邮政编码 所有人口统计信息均由用户,并且 不检查准确性。 此数据集中仅包含提供了一些人口统计信息的用户。 - 性别用“M”表示男性,用“F”表示女性 - 年龄从以下范围中选择: * 1:“18 岁以下” * 18:“18-24” * 25:“25-34” * 35:“35-44” * 45:“ 45-49" * 50: "50-55" * 56: "56+"

- 职业从以下选项中选择: * 0:“其他”或未指定 * 1:“学术/教育家” * 2:“艺术家” * 3:“文员/ admin" * 4: "大学生/研究生" * 5: "客户服务" * 6: "医生/医疗保健" * 7: "行政/管理" * 8:“农民” * 9:“家庭主妇” * 10:“K-12 学生” * 11:“律师” * 12:“程序员” * 13 :“退休” * 14:“销售/营销” * 15:“科学家” * 16:“个体户” * 17:“技术员/工程师” * 18:“商人/工匠” * 19:“失业” * 20:“作家”

3.电影信息位于“movies.dat”文件中,格式如下: MovieID::Title::Genres - 标题与 IMDB 提供的标题相同(包括 年份)发行版) - 类型以管道分隔,并从以下类型中选择: * 动作 * 冒险 * 动画 * 儿童 * 喜剧 * 犯罪 * 纪录片 * 剧情 * 奇幻 * 黑色电影 * 恐怖 * 音乐 * 悬疑 * 浪漫 * 科幻 * 惊悚片 * 战争 * 西部片 - 由于意外重复 条目和/或测试条目 ,某些MovieID 与电影不对应 - 电影大多是手动输入的,因此可能存在错误和不一致
 
MovieLens 1M 数据集含有来⾃ 6000 名⽤户对 4000 部电影的 100
万条评分数据。它分为三个表:评分、⽤户信息和电影信息。将
该数据从 zip ⽂件中解压出来之后,可以通过pandas.read_table将各个表分别读到⼀个pandas DataFrame对象中





二、数据分析

首先导入库

import pandas as pd
pd.options.display.max_rows=10
#制在显示 DataFrame 或 Series 时,最多只展示 10 行数据


然后读入三个表
data.dat
ratings.dat
movies.dat



 
unames = ["user_id", "gender", "age", "occupation", "zip"]
users = pd.read_table("yourpath/users.dat", sep="::",
                      header=None, names=unames, engine="python")

rnames = ["user_id", "movie_id", "rating", "timestamp"]
ratings = pd.read_table("yourpath/ratings.dat", sep="::",
                        header=None, names=rnames, engine="python")

mnames = ["movie_id", "title", "genres"]
movies = pd.read_table("yourpath/movies.dat", sep="::",
                       header=None, names=mnames, engine="python")
这里是参考的README.md说明指定三个DataFrame来存储

这里进行输出格式,方便连接




ratings表和 users表通过 user_id连接
然后连接完的新表跟movie表 通过 movie_id连接

 
data = pd.merge(pd.merge(ratings, users), movies)
print(data)
data.iloc[0]


pivot_table() 是 Pandas 提供的一个强大的数据透视表函数,用于对数据进行分组并聚合计算。
主要参数:
"rating":要聚合的值。这里是对电影评分(rating)进行聚合计算。
index="title":指定行索引,即按电影标题(title)分组。
columns="gender":指定列索引,即按性别(gender)分组。
aggfunc="mean":指定聚合函数,这里使用的是平均值(mean),计算每个分组的平均评分。

直接根据电影名和性别 运用 pivot_table函数来进行取均值 并且通过head函数快速显示5条


mean_ratings = data.pivot_table("rating", index="title",
                                columns="gender", aggfunc="mean")
mean_ratings.head(5)


这里我们随便取一个值250,来丢弃那些评分数量少于250的电影







我们这里继续用上面pivot_table() 是 Pandas 提供的方法,已经设置好参数,直接用。
就可以筛选出 评分次数大于250的电影的男女生评分平均值

 

DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)

  • by: 指定按哪一列或索引排序。可以是列名、列表、或者多个列的组合。
  • axis: 控制排序是按行 (axis=0) 还是按列 (axis=1) 进行,默认是 0(按行排序)。
  • ascending: 布尔值,指定排序方式:True 为升序,False 为降序。
  • inplace: 如果设置为 True,将在原数据上排序,不会返回新的 DataFrame。默认是 False
  • kind: 指定排序算法,常用的有 quicksortmergesortheapsort。默认是 quicksort
  • na_position: 指定空值(NaN)的位置,'first' 为放在前面,'last' 为放在最后。
  • ignore_index: 排序后是否重置索引,默认为 False,即保持原索引。
  • key: 一个函数,应用于排序值,可以用于自定义排序规则(Pandas 1.1.0 版本及以上可用)。

然后 我们可以用sort_values函数来取出最高的按照女性评分(F 列)的值进行降序排序,并显示排序后的前 5 行

我们用新增DataFrame列的方式加上男女生评分平均值的差值

 

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


对插值进行排序,找出数据中男女生电影评分差异最大的数据

 

sorted_by_diff=mean_ratings.sort_values("diff")
sorted_by_diff.head()



我们根据评分的方差来衡量每部电影评分的离散程度(即评分的一致性或分歧)

rating_std_by_title = data.groupby("title")["rating"].std()
rating_std_by_title = rating_std_by_title.loc[active_titles]
rating_std_by_title.head()



排序找出分歧最大的几部电影

rating_std_by_title.sort_values(ascending=False)[:10]





之后我们观察到数据集里面的genres类别数据是以|分割的



这样无法让pandas处理
我们进行变化修改成列表形式存储

 

movies["genre"]=movies.pop("genres").str.split("|")


explode() 是 Pandas 提供的一个非常实用的函数,用于将 DataFrame 或 Series 中包含列表、元组、或其他可迭代对象的列或单元格拆分为多行。它是处理多标签数据(如嵌套列表、分类数据等)时的一个重要工具,能够将嵌套的数据展开成一维的形式,便于进一步的分析和处理。

movies_exploded = movies.explode("genre")
movies_exploded[:10]




接下来,我们要分析 各个类别和各个年龄的的评分均值
通过 movie_id 将 movies_exploded和ratings连接起来
然后通过 user_id将新表和users连接起来

ratings_with_genre = pd.merge(pd.merge(movies_exploded, ratings), users)
print(ratings_with_genre.iloc[0])
ratings_with_genre.iloc[0]
genre_ratings = (ratings_with_genre.groupby(["genre", "age"])
                 ["rating"].mean()
                 .unstack("age"))
genre_ratings[:10]




unstack() 是 Pandas 中用于重塑数据的一种方法,它将一个分层索引(MultiIndex)的某一层次转化为列,使得数据从长格式(long format)转为宽格式(wide format)。unstack() 通常用于在分组数据分析后重新排列数据,以便于查看和进一步分析。

 

#按星级分打1-5星的各有多少人
ratings_with_star = pd.merge(pd.merge(movies_exploded, ratings), users)
star_counts=ratings_with_star["rating"].value_counts().sort_index()
print(star_counts)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值