1.总结
步骤 | 操作 |
---|---|
数据集介绍 | 需要使用哪些数据集、每个数据集的字段什么含义、文件格式 |
加载数据集 | 选定所需要行列导入、设置编码格式、设置显示行列数量 |
数据的基本查看 | 查看全部的信息(info、describe)、单独分析某一列的比例 |
数据缺失值与重复值处理 | 查看缺失值、分析缺失值(如何处理和原因)、处理缺失值(删除);查看是否存在重复值 |
数据分析 | 基本的数值查看(并判断数据是否可取)、分组聚合(有关目标的分析数据的信息)、绘制有关查看分布的图形(条形图) |
2.电影数据集介绍
2.1 下载数据
数据集包含3个文件,文件中包含电影信息表,评分用户信息,评分信息。数据网址网址
下载第1个zip
2.2 数据集介绍
用户信息
#u.user
#列名称
'user_id','age','gender','occupation','zip_code'
#数据
1|24|M|technician|85711
2|53|F|other|94043
3|23|M|writer|32067
4|24|M|technician|43537
5|33|F|other|15213
评分表
# u.data
#列名称
'user_id','movie_id','rating','unix_timestamp'
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
298 474 4 884182806
115 265 2 881171488
253 465 5 891628467
305 451 3 886324817
电影表
#u.item
#列名称
'movie_id','movie_title','release_date','video_release_date','imdb_url'
1|Toy Story (1995)|01-Jan1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0
2|GoldenEye (1995)|01-Jan1995||http://us.imdb.com/M/title-exact?GoldenEye%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0
3|Four Rooms (1995)|01-Jan1995||http://us.imdb.com/M/title-exactFour%20Rooms%20(1995)|0|0|0|0|0|0|0|0|0|0|0||0|0|0
4|Get Shorty(1995)|01Jan1995||http://us.imdb.com/M/titleexactGet%20Shorty%20(1995)|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0
5|Copycat (1995)|01-Jan1995||http://us.imdb.com/M/title-exact?Copycat%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1
3.加载数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#支持中文显示
plt.rcParams['font.family']='Kaiti'
# 使用非unicode的负号,当使用中文时候要设置
plt.rcParams['axes.unicode_minus']=False
# 1.加载用户信息
# 查看csv中分割符号;指定列名称;指定编码格式;选定自己所需要的列进行导入
# 设置显示行数
pd.options.display.max_rows=5
user_cols = ['user_id','age','gender','occupation','zip_code']
users = pd.read_csv('ml-100k/u.user',sep='|',names=user_cols,encoding='latin-1')
users
# 2.加载电影信息
movie_cols = ['movie_id','movie_title','release_date','video_release_date','imdb_url']# 只选取所需要的列进行导入
# 查看csv中分割符号;指定列名称;指定编码格式;选定自己所需要的列进行导入 usecols
movies = pd.read_csv('ml-100k/u.item', sep='|', names=movie_cols,usecols=range(5),encoding='latin-1')
movies
# 3.加载评分信息
# 查看csv中分割符号;指定列名称;指定编码格式;选定自己所需要的列进行导入
rating_cols = ['user_id','movie_id','rating','unix_timestamp']
ratings = pd.read_csv('ml-100k/u.data',sep='\t',names=rating_cols, encoding='latin-1')
ratings
# 4.合并数据集
user_ratings = pd.merge(users,ratings)# 根据user_id进行合并
data = pd.merge(user_ratings,movies)
data
4.数据基本查看与清洗(缺失值、重复值)
数据的基本查看
# 设置显示行数
pd.options.display.max_rows=10
data.describe()
# 对评分的男性喝女性人数进行统计
# 数值查看
print(data['gender'].value_counts())
# 饼图查看
data['gender'].value_counts().plot(kind='pie',autopct='%.2f',fontsize=20)
缺失值与重复值处理
# 查看数据的行列数量
data.shape
# 查看每列的缺失值情况
data.info()
data.isnull().sum() # 观察后可以发现,video_release_date数据全部为空,可以直接删除
5.数据分析之评分最多的电影
主要分为数据的查看与可视化
# 按照电影标题分组,统计分组中的个数,得到评分次数
# 1.先用数据的方式查看数量
# 方法1:分组聚合count
data.groupby('movie_title')['movie_title'].count().sort_values(ascending=False).head(10)
# 方法2:分组聚合size
data.groupby('movie_title').size().sort_values(ascending=False).head(10)
# 方法3:value_count
data['movie_title'].value_counts().head(10)
# 2.条形图可视化
data['movie_title'].value_counts().head(10).plot(kind='bar')
6.数据分析之评分最高的电影
分析:当我们得到评分最高的电影数据时,先得判断一下是否可以使用,我们发现最高的电影分数大部分评价的人数较少,数据不够真实,所以需要加上人数进行判断,是否可以取。处理过后再进行得出结论。
# 根据电影标题分组,对分组中评分求均值
# 1.直接计算评分最高的电影
# 方法1:使用python自带函数
data.groupby('movie_title')['rating'].mean().sort_values(ascending=False).head(10)
# 方法2:使用agg函数
data.groupby('movie_title').agg({'rating':'mean'})['rating'].sort_values(ascending=False).head(10)
'''
发现此时的评分都是5.0,需要检查数据是否可取(利用评分人数进行判断)
'''
# 2.统计评分人数和评分均值:先按照评分排序,再按照评分人数排序
data.groupby('movie_title')['rating'].agg(['size','mean']).sort_values(by=['mean','size'],ascending=False).head(10)
'''
发现评分靠前的数据评分人数都很少,不可以取这些数据
需要通过过滤评分人数较少的数据再次获取均分较高的电影
'''
# 3.过滤,评分人数必须大于100
# 对数据进行分组,得到数据的评分人数和均值
data_group = data.groupby('movie_title')['rating'].agg(['count','mean'])
# 获取人数大于100的数据
most_100 = data_group[data_group['count']>100]
# 再次进行排序选择前10行
top10 = most_100.sort_values(by=['mean','count'],ascending=False).head(10)
top10
top10.plot(kind='bar', title='评分最高的电影')
7.数据分析之不同年龄组对电影评分分析
# 1.查看年龄的分布基本情况(数据性类查看与柱状图查看)
data['age'].describe()
data['age'].plot(kind='hist', bins=30, figsize=(12,6))
# 2.自定义年龄区间,分布不同年龄组对电影评分总体状况查看
labels = ['0-9','10-19','20-29','30-39','40-49','50-59','60-69','70-79']
# 添加新的列
data['age_group'] = pd.cut(data['age'], np.arange(0,81,10),right=False, labels=labels)
# 按照年龄进行分组聚合,查看分组后的数量与平均值
data.groupby('age_group').agg({'rating':['size','mean']})
8.数据分析之不同年龄分段对某部电影的评分分析
'''
因为电影数据比较多,现在只分析评分次数排在前100的电影
如何得到评分次数在前100的电影?
得到评分排在前100的id信息,同时将数据movie_id设置为行索引,利用索引数组来获得评分次数排在前100的电影数据
'''
# 1.得到评分次数排在前100的电影
# 根据电影id统计次数进行排序输出前100条
most_100 = data['movie_id'].value_counts().head(100)
# 2.数据movie_id列设置为行索引
data.set_index('movie_id',inplace=True)
# 3.按照列索引进行分组聚合
by_age_group = data.loc[most_100.index].groupby(['movie_title','age_group'])
by_age_group
# 4.转化格式为df,填充缺失值数据为0,选取前10行
by_age_group['rating'].mean().unstack(-1).fillna(0).head(10)