pandas异常值检测与处理

关注公众号FF工作室,回复pandas异常值检测与处理,获取数据
在这里插入图片描述

1、异常值检测
1.1、标准差法
outlier>x¯+nσ或outlier<x¯−nσ

x¯ 为样本均值, σ 为样本标准差 当n=2时,满足条件的观测值就为异常值,当n=3时满足条件的观测就是极端异常值

1.2、箱线图法
outlier>\Q3+nIQR或outlier<\Q1−nIQR

\Q3 为上四分位数(75%), \Q1 为下四分位数(25%), IQR 为上四分位与下四分位的差 当n=1.5时,满足条件的观测值就为异常值,当n=3时满足条件的观测就是极端异常值

2、选择方法
数据近似服从正态分布(数据分布比较对称)优先选择标准差法即1.1 否则选择箱线图法1.2

3、异常值处理
若观测值异常比例不大可以考虑删除 也可以考虑替代法,可以使用低于判别上限的最大值进行替换上端异常值,高于判别下限的最小值替换下端异常值 或使用均值或中位数等

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']    #定义使其正常显示中文字体黑体
plt.rcParams['axes.unicode_minus'] = False      #用来正常显示表示负号 
data = pd.read_excel(r'D:\jupyter\data\全国疫情数据_来自CDC及卫健委.xlsx')
print(data.head())
    date  新增确诊  新增疑似  新增死亡  累积确诊  现有疑似  累积死亡  新增治愈  累积治愈  现有确诊  现有重症

0 2020-01-16 4 0 1 45 0 2 0 8 0 0
1 2020-01-17 17 0 0 62 0 2 0 12 0 0
2 2020-01-18 59 0 1 121 0 3 0 17 0 0
3 2020-01-19 77 0 1 198 0 4 0 18 0 0
4 2020-01-20 77 27 2 291 54 6 0 25 291 0

df = data["累积确诊"]
print(df.head(),"\n")
print(df.describe())

0 45
1 62
2 121
3 198
4 291
Name: 累积确诊, dtype: int64

count 68.000000
mean 52605.897059
std 33092.962085
min 45.000000
25% 16531.250000
50% 74690.000000
75% 80824.500000
max 81747.000000
Name: 累积确诊, dtype: float64

mean_val = df.mean() #均值
std_val = df.std()   #标准差
up = df > mean_val+2*std_val
down = df < mean_val-2*std_val

print(df.loc[up,])
print(df.loc[down,],"\n")
print("标准差法异常值上限检测:\n",up.head(),"\n")
print("标准差法异常值下限检测:\n",down.head())

Series([], Name: 累积确诊, dtype: int64)
Series([], Name: 累积确诊, dtype: int64)

标准差法异常值上限检测:
0 False
1 False
2 False
3 False
4 False
Name: 累积确诊, dtype: bool

标准差法异常值下限检测:
0 False
1 False
2 False
3 False
4 False
Name: 累积确诊, dtype: bool

Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1

up1 = df > Q3+1.5*IQR
down1 = df < Q1-1.5*IQR

print(df.loc[up1,])
print(df.loc[down1,],"\n")
print("箱线图法异常值上限检测:\n",up1.head(),"\n")
print("箱线图法异常值下限检测:\n",down1.head())
Series([], Name: 累积确诊, dtype: int64)
Series([], Name: 累积确诊, dtype: int64) 

箱线图法异常值上限检测:
0 False
1 False
2 False
3 False
4 False
Name: 累积确诊, dtype: bool

箱线图法异常值下限检测:
0 False
1 False
2 False
3 False
4 False
Name: 累积确诊, dtype: bool

plt.style.use("ggplot")
plt.rcParams["font.size"]=10 #设置字体大小
plt.boxplot([df,data["新增确诊"]],labels=['累积确诊',"新增确诊"])
plt.title('箱线图')
plt.savefig('gender.png',dpi=400)

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值