【发布时间】:2022-11-01 22:07:20
【问题描述】:
我正在考虑对具有 300 多个特征的数据集上的异常值做出决策。我想在不匆忙删除数据的情况下分析框架。我有一个框架:
| | A | B | C | D | E |
|---:|----:|----:|-----:|----:|----:|
| 0 | 100 | 99 | 1000 | 300 | 250 |
| 1 | 665 | 6 | 9 | 1 | 9 |
| 2 | 7 | 665 | 4 | 9 | 1 |
| 3 | 1 | 3 | 4 | 3 | 6 |
| 4 | 1 | 9 | 1 | 665 | 5 |
| 5 | 3 | 4 | 6 | 1 | 9 |
| 6 | 5 | 9 | 1 | 3 | 2 |
| 7 | 1 | 665 | 3 | 2 | 3 |
| 8 | 2 | 665 | 9 | 1 | 0 |
| 9 | 5 | 0 | 7 | 6 | 5 |
| 10 | 0 | 3 | 3 | 7 | 3 |
| 11 | 6 | 3 | 0 | 3 | 6 |
| 12 | 6 | 6 | 5 | 1 | 5 |
我编写了一些内省代码,以保存在另一个名为 _outliers 的框架中:
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = (Q3 - Q1)
min_ = (Q1 - (1.5 * IQR))
max_ = (Q3 + (1.5 * IQR))
# Counts outliers in columns
_outliers = ((df.le (min_)) | (df.ge (max_))).sum().to_frame(name="outliers")
# Gives percentage of data that outliers represent in the column
_outliers["percent"] = (_outliers['outliers'] / _outliers['outliers'].sum()) * 100
# Shows max value in the column
_outliers["max_val"] = df[_outliers.index].max()
# Shows min value in the column
_outliers["min_val"] = df[_outliers.index].min()
# Shows median value in the column
_outliers["median"] = df[_outliers.index].median()
# Shows mean value in the column
_outliers["mean"] = df[_outliers.index].mean()
这会产生:
| | outliers | percent | max_val | min_val | median | mean |
|:---|-----------:|----------:|----------:|----------:|---------:|---------:|
| A | 2 | 22.2222 | 665 | 0 | 5 | 61.6923 |
| B | 3 | 33.3333 | 665 | 0 | 6 | 164.385 |
| C | 1 | 11.1111 | 1000 | 0 | 4 | 80.9231 |
| D | 2 | 22.2222 | 665 | 1 | 3 | 77.0769 |
| E | 1 | 11.1111 | 250 | 0 | 5 | 23.3846 |
我想通过计算没有它们的平均值和中位数来计算异常值对列的影响。我不想删除它们来进行此计算。我想最好的方法是将“~”添加到异常值过滤器中,但我迷失在代码中......这将使很多人受益,因为搜索删除异常值会产生很多结果。除了他们首先偷偷进入数据的原因之外,我只是认为不应该在不考虑潜在影响的情况下做出删除决定。随意添加其他考虑因素(偏度、西格玛、n 等)
一如既往,我感谢这个社区!
编辑:我添加了方差及其平方根标准差,有无异常值。在某些领域,您可能希望保留异常值并直接进入 ML。至少,通过事先检查您的数据,您会知道它们对您的结果有多大贡献。与异常值列中的 nlargest() 一起使用,您可以快速查看哪些特征包含最多。您可以通过设置方差或均值的阈值将其用作过滤特征的基础。感谢贡献者,我现在拥有了一个强大的分析工具。希望它对其他人有用。
【问题讨论】:
-
您的数据集显然不正常,只有很少的观察。使用经典的 IRQ 标准将审查大量数据,因为异常值支配均值并提供一个完全没有数据的区间。例如列 A 将返回类似 [54; 69]但在这个区间内根本没有数据。为什么不根据百分位标准拒绝高价值,价值 > P99 被审查?
-
这只是一个例子,也许它构造不正确,如果要删除异常值,我正在寻找计算平均值和中位数的代码......
标签: pandas average median outliers