【问题标题】:Categorical variables usage in pandas for ANOVA and regression?大熊猫中用于方差分析和回归的分类变量?
【发布时间】:2019-10-09 13:11:09
【问题描述】:

准备一个小玩具示例:

import pandas as pd
import numpy as np

high, size = 100, 20
df = pd.DataFrame({'perception': np.random.randint(0, high, size),
                   'age': np.random.randint(0, high, size),
                   'outlook': pd.Categorical(np.tile(['positive', 'neutral', 'negative'], size//3+1)[:size]),
                   'smokes': pd.Categorical(np.tile(['lots', 'little', 'not'], size//3+1)[:size]),
                   'outcome': np.random.randint(0, high, size)
                  })
df['age_range'] = pd.Categorical(pd.cut(df.age, range(0, high+5, size//2), right=False,
                             labels=["{0} - {1}".format(i, i + 9) for i in range(0, high, size//2)]))
np.random.shuffle(df['smokes'])

这会给你类似的东西:

In [2]: df.head(10)
Out[2]:
   perception  age   outlook  smokes  outcome age_range
0          13   65  positive  little       22   60 - 69
1          95   21   neutral    lots       95   20 - 29
2          61   53  negative     not        4   50 - 59
3          27   98  positive     not       42   90 - 99
4          55   99   neutral  little       93   90 - 99
5          28    5  negative     not        4     0 - 9
6          84   83  positive    lots       18   80 - 89
7          66   22   neutral    lots       35   20 - 29
8          13   22  negative    lots       71   20 - 29
9          58   95  positive     not       77   90 - 99

目标:找出outcome 的可能性,给定{perception, age, outlook, smokes}

次要目标:弄清楚每一列对于确定outcome 的重要性。

第三个目标:证明关于分布的属性(这里我们是随机生成的,所以随机分布应该暗示null hypothesis是真的?)


显然,这些都是statistical hypothesis testing 可以找到的问题。在 pandas 中回答这些问题的正确方法是什么?

【问题讨论】:

  • One-hot 编码器和softmax?
  • 很想在 TensorFlow 中为此构建一个 NN。但是,我确实想获得 p 值以及所有这些。所以最终可能会采用两种方法,p 值方法对于 pandas/statsmodel/numpy/researchpy 来说似乎已经成熟。我是什么意思?
  • 您提出了一个重要问题,但现在您离题了。建议暂时忘记构建模型,而是专注于categorical variable treatment统计上正确的方法。通过询问如何衡量分类变量和连续变量之间的相互作用,可以进一步丰富这个问题。想想吧。
  • 这听起来像是one versus all classification 的一个很好的用例。对于您的预测器,您可以使用 pd.get_dummies 或 sklearn 中的一个热编码器。
  • statsmodels 的线性回归将为您提供每个特征的 p 值。如果您正在寻找对回归预测的信心,请查看:docs.seldon.io/projects/alibi/en/v0.2.0/methods/…,也许您可​​以将其调整为回归而不是分类

标签: pandas numpy scipy anova hypothesis-test


【解决方案1】:

找出outcome给定列的可能性和特征重要性(1和2)

分类数据

由于数据集包含分类值,我们可以使用LabelEncoder()将分类数据转换为数值数据。

from sklearn.preprocessing import LabelEncoder

enc = LabelEncoder()
df['outlook'] = enc.fit_transform(df['outlook'])
df['smokes'] = enc.fit_transform(df['smokes'])

结果

df.head()

   perception  age  outlook  smokes  outcome age_range
0          67   43        2       1       78     0 - 9
1          77   66        1       1       13     0 - 9
2          33   10        0       1        1     0 - 9
3          74   46        2       1       22     0 - 9
4          14   26        1       2       16     0 - 9

在不创建任何模型的情况下,我们可以利用chi-squared testp-valuecorrelation matrix来确定关系。

相关矩阵

import matplotlib.pyplot as plt
import seaborn as sns

corr = df.iloc[:, :-1].corr()
sns.heatmap(corr,
            xticklabels=corr.columns,
            yticklabels=corr.columns)
plt.show()

卡方检验和 p 值

from sklearn.feature_selection import chi2

res = chi2(df.iloc[:, :4], df['outcome'])
features = pd.DataFrame({
    'features': df.columns[:4],
    'chi2': res[0],
    'p-value': res[1]
})

结果

features.head()

     features         chi2        p-value
0  perception  1436.012987  1.022335e-243
1         age  1416.063117  1.221377e-239
2     outlook    61.139303   9.805304e-01
3      smokes    57.147404   9.929925e-01

随机生成的数据,所以零假设为真。我们可以通过尝试将正态曲线拟合到outcome 来验证这一点。

分布

import scipy as sp

sns.distplot(df['outcome'], fit=sp.stats.norm, kde=False)
plt.show()

从图中我们可以得出结论,数据不符合正态分布(因为它是随机生成的。)

注意:由于数据都是随机生成的,因此您的结果可能会有所不同,具体取决于数据集的大小。

参考文献

【讨论】:

  • 分类数据编码也可以使用pd.get_dummies()
  • get_dummies 只给我 0 或 1,这里我有 3 个选项。谢谢@skillsmuggler,所以我应该认为这些p-values 表明这些列是独立的;并且χ² test 值不适合χ²-distribution,所以无法拒绝null hypothesis? - 最后,您的相关矩阵显示出很强的对角线,因此是真的吗?
  • get_dummies 执行OneHot encoding。它将单个分类列拆分为每个因子的二进制 (0/1) 列。
  • 您对null hypothesis 的看法是正确的。不能考虑相关矩阵的对角线。我们只考虑相关矩阵中的upper or lower triangle。对角线元素对应于同一列之间的coefficient of correlation,始终为1Reference
猜你喜欢
  • 2015-01-29
  • 2012-05-23
  • 2016-03-12
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2022-11-11
  • 2020-09-24
相关资源
最近更新 更多