01基于正态分布的异常值检测方式

可视化观察是否有异常值

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = np.random.randn(1000) + 10
s = pd.DataFrame(data=data, columns=["value"])

# 绘制散点图
fig = plt.figure(figsize = (10,6))
ax1 = fig.add_subplot(3,1,1)  # 创建子图 1
ax1.scatter(s.index, s.values)
plt.grid()

# 绘制直方图
ax2 = fig.add_subplot(3,1,2)  # 创建子图2
s.hist(bins=30,alpha = 0.5,ax = ax2)    # 通过可视化(绘制直方图)判断是否符合正态分布
s.plot(kind = 'kde', secondary_y=True,ax = ax2)
plt.grid()

# 绘制横着的箱型图
import seaborn as sns

ax2 = fig.add_subplot(3,1,3)  # 创建子图3
sns.boxplot(data=s.values, orient="h")  # 这里的orient = 方向 。orient属性有两个 v = 垂直 , h = 水平

<matplotlib.axes._subplots.AxesSubplot at 0x1ac493d0370>

在这里插入图片描述

定义 量化的 寻找异常值的函数

def outliers(data, col_name, scale=3):##scale--尺度 一般取3

    def box_plot_outliers(data_ser, box_scale):
          ##IQR即尺度*(上四分位点-下四分位点)
        IQR = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
        val_low = data_ser.quantile(0.25) - IQR #计算上边缘
        val_up = data_ser.quantile(0.75) + IQR  #计算上下边缘
        rule_low = (data_ser < val_low)         #小于下边缘的值
        rule_up = (data_ser > val_up)           	#大于上边缘的值
        return (rule_low, rule_up), (val_low, val_up)

    data_n = data.copy()
    data_series = data_n[col_name]
    rule, value = box_plot_outliers(data_series, box_scale=scale)
    index = np.arange(data_series.shape[0])[rule[0] | rule[1]] ##对满足在rule_low以下或rule_up以上条件计数
    print("删除了: {} 个数据".format(len(index))) 
    data_n.reset_index(drop=True, inplace=True)##取删除离群点后的数据
    print("剩余: {} 个数据".format(data_n.shape[0]))
    index_low = np.arange(data_series.shape[0])[rule[0]]
    outliers = data_series.iloc[index_low]#计在下边缘以下的点
    print("小于下边缘线的数据详细:")
    print(pd.Series(outliers).describe())
    index_up = np.arange(data_series.shape[0])[rule[1]]#计在上边缘以上的点
    outliers = data_series.iloc[index_up]
    print("大于上边缘线的数据详细:")
    print(pd.Series(outliers).describe())
	##可视化数据
    fig, ax = plt.subplots(1, 2, figsize=(10, 7))
    sns.boxplot(y=data[col_name], data=data,ax=ax[0])
    sns.boxplot(y=data_n[col_name], data=data_n,ax=ax[1])
    return data_n

## 应用 量化的异常值函数
data_new = outliers(s, "value", scale=3)
删除了: 0 个数据
剩余: 1000 个数据
小于下边缘线的数据详细:
count    0.0
mean     NaN
std      NaN
min      NaN
25%      NaN
50%      NaN
75%      NaN
max      NaN
Name: value, dtype: float64
大于上边缘线的数据详细:
count    0.0
mean     NaN
std      NaN
min      NaN
25%      NaN
50%      NaN
75%      NaN
max      NaN
Name: value, dtype: float64

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值