缩尾处理(winsorize)-数据分析、数据处理

28 篇文章 5 订阅
6 篇文章 3 订阅

原理浅析

和经常听到的“去掉一个最低分去掉一个最高分”操作类似,缩尾处理相当于对数据进行掐头(尾)去尾,然后再按照一定的方法填补被掐掉的数据。需要注意的是,缩尾处理并不是掐掉指定个数的数据,而是按照比例,比方说删掉前10%和后20%的数据。

一个例子说清楚怎么用Python实现

话不多说,直接搬运scipy.stats.mstats.winsorize
一个例子说的清清楚楚,而且还把轮子也搬出来了。Python调个包就能用了

>>> from scipy.stats.mstats import winsorize
>>> import numpy as np
>>> a = np.array([10, 4, 9, 8, 5, 3, 7, 2, 1, 6])
>>> winsorize(a, limits=[0.1, 0.2])
masked_array(data=[8, 4, 8, 8, 5, 3, 7, 2, 2, 6],
             mask=False,
       fill_value=999999)

代码注释:

  • 将一个从1到10的数组的顺序打乱,得到a
  • 掐掉最小的10%的数据,同时用2去替换
  • 掐掉最大的20%的数据,同时用8去替换

一个正态分布缩尾处理的例子

import numpy as np
from scipy.stats.mstats import winsorize
import matplotlib.pyplot as plt

np.random.seed(12345)
data = np.random.standard_normal(12345)
data_winsorize = winsorize(data, limits=[0.025, 0.025])
lower_band = np.percentile(data, 2.49)  # 避开临界点
upper_band = np.percentile(data, 97.51)  # 避开临界点
bins = [min(data), lower_band, -1, 0, 1, upper_band, max(data)]  # 注意区间是左闭右开,所以要避开临界点
plt.hist(
    data,
    # alpha=0.15,
    label='data',
    bins=bins,
    color='b'
)
plt.figure()
plt.hist(
    np.array(data_winsorize),
    # alpha=0.15,
    label='data_winsorize',
    bins=bins,
    color='r'
)
plt.legend()

结果如图所示
请添加图片描述

请添加图片描述

see also

  1. SciPy专栏
  2. 时间序列特征提取
  3. sklearn/scikit-learn孤立森林(IsolationForest)中decision_function和score_samples函数的区别和联系
  • 11
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千行百行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值