异常值的判断

字符串型

# 这是使用语法,模糊匹配
train_data['Sex'][2] = 'qqqzzz'
print(train_data['Sex'][2])
print(1, ' = '*50 + '\n', "是否有包含q或者z的值:", any(train_data['Sex'].str.contains('q|z')))

# 也可以用正则
re_par = 'q|z'
print(2, ' = '*50 + '\n', "是否有包含q或者z的值:", any(train_data['Sex'].str.contains(re_par)))
print(2, ' = '*50 + '\n', "是否都是包含q或者z的值:", all(train_data['Sex'].str.contains(re_par)))

在这里插入图片描述

#这一种方法不是匹配,而是等于后面列表中的值,要注意区别
train_data['Sex'][2] = 'male'
print(train_data['Sex'][2])
print(' = '*50 + '\n', "是否都是正常范围的值:", all(train_data['Sex'].isin(['male', 'female'])))

在这里插入图片描述

数值型

1、使用均值和标准差进行判断

mean 为数据的均值
std 为数据的标准差
数据的正常范围为 【mean-2 × std,mean+2 × std】

price_mean = train_data['price'].mean()
price_std = train_data['price'].std()
top1  = price_mean+2*price_std
bottom1 = price_mean-2*price_std

print("正常值的范围:",top1,bottom1)
print("是否存在超出正常范围的值:",any(train_data['price']>top1))
print("是否存在小于正常范围的值:",any(train_data['price']<bottom1))

2、使用上四中位数和下四中位数进行异常值判定

mean1 为上四中位数(就是将数据按从小到大排列,取3/4这个位置的数)
mean2 为下四中位数(同上,取1/4位置的数)
mean3 为中位差 mean3 = mean1-mean2
正常值的范围应在【mean2-1.5×mean3,mean1+1.5×mean2】

# 1/4
mean1 = train_data['price'].quantile(q=0.25)
# 3/4
mean2 = train_data['price'].quantile(q=0.75)
mean3 = mean2-mean1#中位差
top2 = mean2+1.5*mean3
bottom2 = mean2-1.5*mean3
print("正常值的范围:", top, bottom)
print("是否存在超出正常范围的值:",any(train_data['price']>top2))
print("是否存在小于正常范围的值:",any(train_data['price']<bottom2))

3、通过箱线图进行异常值分析判断

箱线图是采用了上下四中位数的方法,也就是第二种方法。

在这里插入图片描述

案例:

import matplotlib.pyplot as plt
plt.boxplot(x=train_data['price'])
plt.show()

在这里插入图片描述

4、异常值处理

通常的处理方式是取数据中的最大最小值进行异常值替换。

max_num = train_data['price'][train_data['price']<top].max()
train_data.loc[train_data['price']>top, 'price'] = max_num

min_num = train_data['price'][train_data['price']>bottom].min()
train_data.loc[train_data['price']<bottom, 'price'] = min_num

参考文章:https://blog.csdn.net/weixin_42575020/article/details/95344914

更多推荐