首先需要保证数据列大致上服从正态分布;
计算需要检验的数据列的平均值和标准差;
比较数据列的每个值与平均值的偏差是否超过3倍,如果超过3倍,则为异常值;
剔除异常值,得到规范的数据。
1import numpy as np
2import pandas as pd
3from scipy import stats
4
5
6# 创建数据
7data = [1222,87,77,92,68,80,78,84,77,81,80,80,77,92,86,
8 76,80,81,75,77,72,81,72,84,86,80,68,77,87,
9 76,77,78,92,75,80,78,123,3,1223,1232]
10df = pd.DataFrame(data,columns = ['value'])
11
12# 计算均值
13u = df['value'].mean()
14
15# 计算标准差
16std = df['value'].std()
17
18print(stats.kstest(df, 'norm', (u, std)))
19# 此时,pvalue > 0.05,不拒绝原假设。因此上面的数据服从正态分布
20print('均值为:%.3f,标准差为:%.3f' % (u,std))
21print('------')
22
23
24# 定义3σ法则识别异常值
25# 识别异常值
26error = df[np.abs(df['value'] - u) > 3*std]
27# 剔除异常值,保留正常的数据
28data_c = df[np.abs(df['value'] - u) <= 3*std]
29
30# 输出正常的数据
31print(data_c)
32# 输出异常数据
33print(error)