一、数据集说明
数据集下载:
通过百度网盘分享的文件: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 与电影不对应 - 电影大多是手动输入的,因此可能存在错误和不一致
二、数据分析
首先导入库
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
: 指定排序算法,常用的有quicksort
、mergesort
和heapsort
。默认是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)