【问题标题】:Scipy Normaltest with multi-columns dataset具有多列数据集的 Scipy Normaltest
【发布时间】:2020-06-27 18:55:12
【问题描述】:

我有一个包含 100 行和 21 列的数据集,其中列是变量。我想知道这些变量是否来自多元正态分布。 因此,我使用了 Scipy 库中的 de Normaltest,但我无法理解结果。这是我的代码:

import pandas as pd
from scipy import stats

df = pd.DataFrame(np.random.random(2100).reshape(100,21)) # dataset (100x21)
k2, p = stats.normaltest(df)

在这个例子中,p 是一个 21 数组而不是单个值。谁能解释一下如何解释这个数组?

【问题讨论】:

    标签: python multivariate-testing scipy.stats


    【解决方案1】:

    如果p[x]<0.05,您可以假设x 列中的值不是正态分布的。因为使用正态性检验,零假设是总体呈正态分布。 p0.5 时,数据呈正态分布。您可以轻松地使用正态分布对其进行测试:

    import pandas as pd
    from scipy import stats
    df = pd.DataFrame(np.random.normal(0,1,2100).reshape(100,21)) # dataset (100x21)
    k2, p = stats.normaltest(df)
    print (p)
    

    输出是

        [0.97228661 0.49017509 0.97373345 0.97404468 0.03498392 0.61963074
     0.07712131 0.52632157 0.29887186 0.30822356 0.14416431 0.11015074
     0.81773481 0.52919266 0.81859869 0.24855451 0.16817784 0.0117747
     0.76860707 0.40384319 0.97038048]
    

    其中大多数大于 0.05。

    对于多元正态性检验,您可以尝试 Henze-Zirkler 检验:

    import pingouin as pg
    normal, p = pg.multivariate_normality(df, alpha=.05)
    

    其中 0.05 是显着值(您可以根据需要更改它,它不会影响您获得的 p 值。)

    【讨论】:

    • 非常感谢您的回复。但是,我不明白为什么输出是一个 21 数组,数组的每个元素代表什么?
    • 这是因为使用“stats.normaltest()”可以测试每列中的数字是否正态分布,因此 21 个 p 值 = 21 列。我将回答可能的多元正态性检验,你能试试并告诉我吗? (我在安装包时遇到了某种问题)
    • 如果我理解正确的话,stats.normaltest() 不是多元正态检验。这是一个单变量正态测试,可用于同时测试多个变量。我已经尝试过你的测试,这是我的输出:正常:False p:0.04797787634013723
    • 是的,在您的情况下不应该使用它。这就是为什么你从 stats.normaltest() 得到这个 p 值数组的原因。
    • 我使用了 pingouin 包和 pg.multivariate_normality(x, $\alpha$)。但是我发现如果 x 的维度大于 50,函数返回 nan 作为 p 值。我不知道为什么。
    猜你喜欢
    • 2012-10-28
    • 2012-10-02
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2022-01-01
    • 2021-06-27
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多