异常值分析
(1)3б原则:如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值:p(|x - μ| > 3σ) ≤ 0.003
(2)箱型图分析
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import stats
# step 1 创建数据
data=pd.Series(np.random.randn(10000)*100)
# step 2 正态性检验
u=data.mean()#计算平均值
std=data.std()#计算标准差
stats.kstest(data,'norm',(u,std))
print('*****均值为%.3f,标准差为:%.3f*****'%(u,std))
# step 3 绘制数据密度曲线
fig=plt.figure(figsize=(10,6))
ax1=fig.add_subplot(2,1,1)
data.plot(kind='kde',grid=True,style='--k',title='密度曲线')
plt.show()
# step 4 筛选出异常值,提出异常值之后的数据
ax2=fig.add_subplot(2,1,2)
error=data[np.abs(data-u)>3*std]
data_c=data[np.abs(data-u)<=3*std]
print('\n*****异常值共%i条*****'%len(error))
# 图表显示
plt.scatter(data_c.index,data_c,color='k',marker='.',alpha=.3)
plt.scatter(error.index,error,color='r',marker='.',alpha=.5)
plt.xlim([-10,10010])
plt.grid()
plt.show()
# 异常值分析——箱型图分析
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import stats
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体
plt.rcParams['axes.unicode_minus'] =False# 图画中正常显示负数
# step 1 创建数据
data=pd.Series(np.random.randn(10000)*100)
# step 2 箱型图查看数据分布情况(以内限为界)
fig=plt.figure(figsize=(10,6))
ax1=fig.add_subplot(2,1,1)
color=dict(boxes='DarkGreen',whiskers='DarkOrange',medians='DarkBlue',caps='Grey')
data.plot.box(vert=False,grid=True,color=color,ax=ax1,label='样本数据')
# plt.show()
# step 3 查看基本统计量
s=data.describe()
print('******基本统计量*****\n',s)
# step 4 计算分位差
q1=s['25%']
q3=s['75%']
iqr=q3-q1
mi=q1-1.5*iqr
ma=q3+1.5*iqr
print('\n******分位差为:%.3f,下限为:%.3f,上限为:%.3f*****\n'%(iqr,mi,ma))
# step 5 筛选异常值,剔除异常值之后的数据data_c
ax2=fig.add_subplot(2,1,2)
error=data[(data<mi)|(data>ma)]
data_c=data[(data>=mi)&(data<=ma)]
print('异常值共有%i条'%len(error))
# step 6 图表显示
plt.scatter(data_c.index,data_c,color='k',marker='.',alpha=.3)
plt.scatter(error.index,error,color='r',marker='.',alpha=.5)
plt.xlim([-10,10010])
plt.grid()
plt.show()