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)).pvalue
if p > 0.05:
print('豆瓣评分数据ks检验的p值为{:.2f}大于0.05\n\n数据满足正态分布'.format(p))
else:
print('豆瓣评分数据不符合正态分布')
–> 输出结果为:(pvalue
=5.0506841649371816e-08)
豆瓣评分数据不符合正态分布
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
–> 输出结果为: