python - 在 numpy/pandas 中生成相关数

标签 python pandas numpy statistics correlation

我正在尝试生成 4 个科目的模拟学生成绩,其中学生记录是单行数据。此处显示的代码将生成均值为 60、标准差为 15 的正态分布随机数。

df = pd.DataFrame(15 * np.random.randn(5, 4) + 60, columns=['Math', 'Science', 'History', 'Art'])

我想不通的是如何让学生的科学分数与他们的数学分数高度相关,而他们的历史和艺术分数不那么高,但仍然与数学分数有一定的相关性。

我既不是统计学家也不是专家程序员,所以我希望有一个不太复杂但更容易理解的解决方案。

最佳答案

让我们将@Daniel 的建议放入代码中。

步骤 1

让我们导入 multivariate_normal :

import numpy as np
from scipy.stats import multivariate_normal as mvn

步骤 2

让我们构造协方差数据并生成数据:
cov = np.array([[1, 0.8,.7, .6],[.8,1.,.5,.5],[0.7,.5,1.,.5],[0.6,.5,.5,1]])
cov

array([[ 1. ,  0.8,  0.7,  0.6],
       [ 0.8,  1. ,  0.5,  0.5],
       [ 0.7,  0.5,  1. ,  0.5],
       [ 0.6,  0.5,  0.5,  1. ]])

这是关键步骤。注意,协方差矩阵有 1's在对角线中,当您从左到右步进时,协方差会减小。

现在我们已经准备好生成数据,让我们坐 1'000 个点:
scores = mvn.rvs(mean = [60.,60.,60.,60.], cov=cov, size = 1000)

健全性检查(从协方差矩阵到简单的相关性):
np.corrcoef(scores.T):

array([[ 1.        ,  0.78886583,  0.70198586,  0.56810058],
       [ 0.78886583,  1.        ,  0.49187904,  0.45994833],
       [ 0.70198586,  0.49187904,  1.        ,  0.4755558 ],
       [ 0.56810058,  0.45994833,  0.4755558 ,  1.        ]])

请注意,np.corrcoef期望您的数据在行中。

最后,让我们将您的数据放入 Pandas 的 DataFrame :
df = pd.DataFrame(data = scores, columns = ["Math", "Science","History", "Art"])
df.head()

    Math        Science     History     Art
0   60.629673   61.238697   61.805788   61.848049
1   59.728172   60.095608   61.139197   61.610891
2   61.205913   60.812307   60.822623   59.497453
3   60.581532   62.163044   59.277956   60.992206
4   61.408262   59.894078   61.154003   61.730079

步骤 3

让我们可视化我们刚刚生成的一些数据:
ax = df.plot(x = "Math",y="Art", kind="scatter", color = "r", alpha = .5, label = "Art, $corr_{Math}$ = .6")
df.plot(x = "Math",y="Science", kind="scatter", ax = ax, color = "b", alpha = .2, label = "Science, $corr_{Math}$ = .8")
ax.set_ylabel("Art and Science");

enter image description here

关于python - 在 numpy/pandas 中生成相关数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952895/

相关文章:

debugging - 可能是 Pandas 中的一个错误。我应该举报吗?如何?

python - 使用 pandas 查找时间序列数据中缺失的分钟数据

用上限和下限(钳位、剪裁、阈值)替换列表值的 Pythonic 方法?

python - 启动时仅显示 python 程序而不是 linux gui

python - 在 python 中删除字符串中的\x

python - python(pycrypto) 和 nodejs(crypto) 之间的加密 (aes-128-cbc) 不匹配

python - 将三列之间的数学运算结果附加到下一行

python - 如何将每一行中的数据重命名为pandas中的唯一编号?

python - 有没有办法让这个 numpy 操作更快?

javascript - 如何在 Pylons 中生成 'AJAX templates'?