文章目录
- 题目描述
- 源数据集
- 数据分析
题目描述
GroupLens实验室提供了一些从MoviesLens用户那里收集的20世纪90年代末到21世纪初的电影评分数据的集合。浙西额数据提供了电影的评分、流派、年份和观众数据(年龄、邮编、性别、职业)。 MovisLens1M数据集包含6000个用户对4000部电影的100万个评分。数据分布在三个表格之中:分别包含评分、用户信息和电影信息。
测试环境:python3.7,jupyter notebook
源数据集
点此获得该系列1-4数据
提取码:if5a
数据分析
加载数据
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
unames = ["user_id", "gender", "age", "occupation", "zip"]
users = pd.read_table("datasets/movielens/users.dat", sep="::",
header=None, names=unames, engine="python")
rnames = ["user_id", "movie_id", "rating", "timestamp"]
ratings = pd.read_table("datasets/movielens/ratings.dat", sep="::",
header=None, names=rnames, engine="python")
mnames = ["movie_id", "title", "genres"]
movies = pd.read_table("datasets/movielens/movies.dat", sep="::",
header=None, names=mnames, engine="python")
users.head(5)
ratings.head(5)
movies.head(5)
ratings
users
通过merge函数将表格进行合并,而评分表中具有用户id和电影id,
所以通过该函数,我们可以根据id将用户和电影信息引入表中。
根据这个表我们可以知道,什么样的人给什么样电影评了多少分。
data = pd.merge(pd.merge(ratings, users), movies)
data
data.iloc[0]
pivot函数第一参数是值,即表格中间的数据,index是行,column是列,aggfunc是数据计算的方法。 而这个就是将行列进行分组,之后计算均值。 下面展示了前五个电影中,不同性别对于这些电影的评分的均值:
mean_ratings = data.pivot_table("rating", index="title",
columns="gender", aggfunc="mean")
mean_ratings.head(5)
展示了,评分数大于250的电影:
ratings_by_title = data.groupby("title").size()
ratings_by_title.head()
active_titles = ratings_by_title.index[ratings_by_title >= 250]
active_titles
下面展示了在评分数大于250的电影中,不同的性别对于电影的评价。
mean_ratings = mean_ratings.loc[active_titles]
mean_ratings
下面展示了最受女性欢迎的五个影片:
top_female_ratings = mean_ratings.sort_values("F", ascending=False)
top_female_ratings.head()
下面展示了男女喜爱度偏差较大的电影中,更受女性喜欢,而不受男性喜欢的电影。
mean_ratings["diff"] = mean_ratings["M"] - mean_ratings["F"]
sorted_by_diff = mean_ratings.sort_values("diff")
sorted_by_diff.head()
这个相反,为更受男性喜欢,而不受女性喜欢。
sorted_by_diff[::-1].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()
下面展示了电影评分最高的10个电影中的标准化后的评分。
rating_std_by_title.sort_values(ascending=False)[:10]
movies["genres"].head()
movies["genres"].head().str.split("|")
movies["genre"] = movies.pop("genres").str.split("|")
movies.head()
利用explode函数将电影的性质进行分行,即每个性质会有一行数据。
movies_exploded = movies.explode("genre")
movies_exploded[:10]
利用merge,根据id连接三个表。之后根据年龄和性质分组,计算每一组评分的平均数。展示前十组数据。 利用unstack将行转到列。这样就生成了一个表格。 下面展示了不同年龄段中,对于不同类别的电影的评分数据。
ratings_with_genre = pd.merge(pd.merge(movies_exploded, ratings), users)
ratings_with_genre.iloc[0]
genre_ratings = (ratings_with_genre.groupby(["genre", "age"])
["rating"].mean()
.unstack("age"))
genre_ratings[:10]