准备工作
数据下载
从网站 grouplens.org/datasets/movielens 下载 MovieLens 1M Dataset 数据,该文件包含大约3883部电影的1000209个匿名评级。
文件中包含三个数据表,分别为用户表、电影表及评分表。
分析任务
1、统计电影平均得分
2、男女生评分差距最大的电影
3、女生最喜欢的电影排行榜
4、男生最喜欢的电影排行榜
5、统计活跃电影 -> 获得评分的次数越多说明电影越活跃
数据处理
数据读取
# 导入必要的模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
1、用户表users.dat包含5列,分别为用户id、性别、年龄、职业及邮编
1::F::1::10::48067
2::M::56::16::70072
3::M::25::15::55117
4::M::45::7::02460
5::M::25::20::55455
6::F::50::9::55117
7::M::35::1::06810
8::M::25::12::11413
9::M::25::17::61614
10::F::35::1::95370
···
读取users.dat
movie_names = ['movie_id', 'title', 'genres']
movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=movie_names, engine='python')
print(len(movies))
movies.head(5)
# 运行结果
2、电影表movies.dat包含3列,分别为电影id、电影名称及电影类型
1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3::Grumpier Old Men (1995)::Comedy|Romance
4::Waiting to Exhale (1995)::Comedy|Drama
5::Father of the Bride Part II (1995)::Comedy
···
读取movies.dat
rating_names = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rating_names, engine='python')
print(len(ratings))
ratings.head(5)
# 运行结果
3、评分表ratings.dat包含4列,分别为用户id、电影id、评分及日期
1::1193::5::978300760
1::661::3::978302109
1::914::3::978301968
1::3408::4::978300275
1::2355::5::978824291
···
读取ratings.dat
rating_names = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rating_names, engine='python')
print(len(ratings))
ratings.head(5)
# 运行结果
数据合并
data = pd.merge(pd.merge(users, ratings), movies)
print(len(data))
data.head(5)
查看用户id为1的记录
data[data.user_id == 1].head(5)
数据分析
1、统计电影平均得分
统计各个电影在男性和女性观众中的平均分及总平均分
mean_ratings_gender = data.pivot_table(values='rating', index='title',columns='gender', aggfunc='mean')
mean_ratings_gender['rating'] = (mean_ratings_gender['F'] + mean_ratings_gender['M']) / 2
mean_ratings_gender.head(5)
前二十大高分电影
mean_ratings = data.pivot_table(values='rating', index='title', aggfunc='mean')
top_20_mean_ratings = mean_ratings.sort_values(by='rating',ascending=False).head(20)
top_20_mean_ratings
2、男女生评分差距最大的电影
mean_ratings_gender['diff'] = abs(mean_ratings_gender.F - mean_ratings_gender.M)
mean_ratings_gender['diff'] = abs(mean_ratings_gender.F - mean_ratings_gender.M)
3、女生最喜欢的电影排行榜
mean_ratings_gender.sort_values(by='F', ascending=False).head(10)
4、男生最喜欢的电影排行榜
mean_ratings_gender.sort_values(by='M', ascending=False).head(10)
5、统计活跃电影 -> 获得评分的次数越多说明电影越活跃
# 统计每个电影获得评分的次数
ratings_by_movie_title = data.groupby('title').size()
top_10_ratings = ratings_by_movie_title.sort_values(ascending=False).head(10)
top_10_ratings
# 运行结果
title
American Beauty (1999) 3428
Star Wars: Episode IV - A New Hope (1977) 2991
Star Wars: Episode V - The Empire Strikes Back (1980) 2990
Star Wars: Episode VI - Return of the Jedi (1983) 2883
Jurassic Park (1993) 2672
Saving Private Ryan (1998) 2653
Terminator 2: Judgment Day (1991) 2649
Matrix, The (1999) 2590
Back to the Future (1985) 2583
Silence of the Lambs, The (1991) 2578
dtype: int64