通过删除行从DataFrame的一列中消除偏斜?

时间:2019-09-15 14:46:55

标签: python pandas

我有一个DataFrame,我正试图从中构建一个多元线性回归模型。我的问题是我的Y变量之一在数据集中严重偏斜,因此它过于偏重一侧。我需要一种规范化该列的方法,而我唯一想到的方法是选择并删除行,直到获得均匀分布的数据集。我在下面建立了一个简单的例子。我希望通过消除低尾来使列[0]以正态分布结束。这样做的最佳方法是什么?

import pandas as pd
from matplotlib import pyplot as plt
from numpy.random import seed
from numpy.random import randn
from numpy.random import rand
from numpy import append
seed(1)
data=5*randn(100) + 10
tail = 10 + (rand(50) * 100)
data=append(data, tail)
data2=5*randn(150)+ 10
s1 = pd.Series(data)
s2 = pd.Series(data2)

df = pd.concat([s1, s2], axis=1)

2 个答案:

答案 0 :(得分:0)

首先,您需要确定一个阈值,以区分哪些值属于尾部(太高)而哪些不属于尾部。

一种非常有经验的方法是通过目视检查:绘制数据的直方图,并查看尾巴从何处开始。

plt.hist(df[0])
plt.show()

使用您提供的样本数据,您可以看到尾部从20开始,因此由于分布的尾部,您可以认为每个值都大于20。

当然,这是一种非常粗糙的方法。根据实际数据,也许有更好的方法来定义阈值,可能基于数据背后的理论模型。我的意思是,我想您应该知道或至少对为什么分布中有尾巴的想法有所了解。

无论如何,无论您使用什么标准来定义threshold值(这完全取决于您),一旦有了它,您都可以将所有大于阈值的值简单地设置为NaN

df[0].loc[df[0] > threshold] = np.nan

免责声明:

此方法可能被认为是不合适或错误的,因为您正在篡改数据。我不知道您的最终目标是什么,但是要小心。

答案 1 :(得分:0)

您可以尝试使用RANSAC。使用偏度作为目标函数,并尝试将其最小化。这应该给您属于不偏斜分布的样本。 (ExampleExample with different modelExample