【python数据分析】国产烂片深度揭秘(1)——以“豆瓣评分”为标准,看看电影评分分布,及烂片情况

要求:

代码运行环境为jupyter notebook

① 读取数据“moviedata.xlsx”
② 查看“豆瓣评分”数据分布,绘制直方图、箱型图
③ 判断“豆瓣评”数据是否符合正态分布
④ 如果符合正态分布,这里以上四分位数(该样本中所有数值由小到大排列后第25%的数字)评分为“烂片标准”
⑤ 筛选出烂片数据,并做排名,找到TOP20
提示:
① 读取数据之后去除缺失值
② 这里可以用ks检验来判断数据是否符合正态分布

1 前期准备

import os
os.chdir(r'C:\Users\86177\Desktop')
import warnings
warnings.filterwarnings('ignore')

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

from bokeh.models import ColumnDataSource,HoverTool
from bokeh.plotting import figure,show,output_file

导入相关的库和设置程序运行路径,并对部分警报信息进行忽视处理,设置图形在notebook内直接显示(%matplotlib inline)

2 数据加载及处理

2.1 数据读取和缺失值处理

data_load = pd.read_excel('moviedata.xlsx')
#data_load.dropna(inplace = True)
#评价的标准是豆瓣评分,因此处理缺失值的时候是以此为准,不是上来就直接对全部的缺失值进行drop,这样会有些偏颇
len(data_load)

–> 输出结果为:2457
注意不要上来就直接使用.dropna(),因为缺失值不是只在‘豆瓣评分’一列存在,如果对全部数据使用这个方法,就会导致再删除‘豆瓣评分’这一列空值的同时,把其他列的空值数据一并删除(删除空值的数据对应着空值所在的这一 数据就没有了)

data_load = pd.read_excel('moviedata.xlsx')
data_load.dropna(inplace = True)
len(data_load) 

–> 输出结果为:1278
此时就会把数据量减少一半,这样做是不合理的。这里评价的标准是豆瓣评分,因此只要保证’豆瓣评分’这一列的数据完整即可,应该是单独对这一列数据进行缺失值处理

data_load = pd.read_excel('moviedata.xlsx')
data_load['豆瓣评分'].dropna(inplace = True)
len(data_load)

–> 输出结果为:2457
那么我通过上面的代码对缺失值处理可以吗?代码看上去是可行的,实际上对单列这种操作是对整体数据是没有用的

2.2 缺失值相关的问题

(1)缺失值查看
nan_counts = len(data_load [data_load .isnull().values == True])   # 计算缺失值数量
nan_counts = data_load .isna().sum()#这种方式会把数据在每一列的数据缺失值给统计出来

第一种方式可以查看全数据中所有缺失值的总数量,后一种是将每个列的缺失值都统计出来

(2)去除缺失值,也就是选取不为Nan的数据
#第一种方式 
data_load = pd.read_excel('moviedata.xlsx')
data = data_load[~(data_load['豆瓣评分'].isnull().values == True)]
len(data)

–> 输出结果为:2306

#第二种方式
data_load = pd.read_excel('moviedata.xlsx')
data = data_load[data_load['豆瓣评分'].notnull()]
len(data)

–> 输出结果为:2306
需要注意的是:.isnull() 和.notnull()不是一个结果,但是可以异曲同工

#第三种方式
data_load = pd.read_excel('moviedata.xlsx')
data = data_load[data_load['豆瓣评分'] >0]
len(data)

–> 输出结果为:2306
这种方式就是具体情况下具体的应用了,前面两种是通用的,这一种因为评分都是数值,只要是>0 就证明存在数据,自动过滤掉不是数值和空值的情况了,具体怎么去除空值,可以使用通用的方式,也可以看数据情况而定

2.3 数据查看

data.head()
#默认是查看前五行,括号内可以填入数值,表明要产看数据的行数

–> 输出结果为:
在这里插入图片描述

3 查看“豆瓣评分”数据分布,绘制直方图、箱型图

3.1 查看“豆瓣评分”数据分布

data['豆瓣评分'].describe()
#总数量也是2306,数据就对应上了

–> 输出结果为:
在这里插入图片描述

3.2 绘制直方图

data['豆瓣评分'].plot.hist(bins = 20,color = 'green', alpha = 0.7,
                            legend= '豆瓣电影评分情况', figsize = (10,5),
                            edgecolor = 'k',
                            grid=True)
plt.ylim([0,250])
plt.margins(0.02)
plt.legend()
plt.xlabel('电影分数')
plt.ylabel('电影数量')

–> 输出结果为:
在这里插入图片描述

3.3 绘制箱型图

data['豆瓣评分'].plot.box(vert = False, grid = True, figsize = (10,3))

–> 输出结果为:
在这里插入图片描述

4 正态分布检验与烂片标准的选择

4.1 K-S检验

from scipy import stats
u = data['豆瓣评分'].mean()
std = data['豆瓣评分'].std()
p = stats.kstest(data['豆瓣评分'], "norm",(u,std)).statistic
if  p > 0.05:
    print('豆瓣评分数据ks检验的p值为{:.2f}大于0.05\n\n数据满足正态分布'.format(p))

–> 输出结果为:

豆瓣评分数据ks检验的p值为0.06大于0.05

数据满足正态分布

4.2 烂片标准的选择

lp_starand = data['豆瓣评分'].quantile(0.25)
lp_starand

–> 输出结果为:4.3
其实前面查看‘豆瓣评分’的信息时候,里面有个25%对应的就是4.3,也就是这里的上四分位数。

5 筛选烂片数据并对烂片排序

data_lp = data[data['豆瓣评分']<lp_starand][['电影名称','豆瓣评分','主演','制片国家/地区','导演','类型']]
data_lp.sort_values(by = '豆瓣评分',inplace = True, ascending = True)
data_lp_20 = data_lp[:20].reset_index()
#reset_index 之后原来的index会变成新的列,当然也可以使用set_index(np.arange(20))
del data_lp_20['index']
data_lp_20

–> 输出结果为:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 4 · 访问量 1971

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/104085917
今日推荐