在numpy / pandas生成相关数字

时间:2017-08-30 05:55:31

标签: python pandas numpy statistics correlation

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

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

我无法弄清楚如何使学生的科学标记与他们的数学标记高度相关,并且他们的历史和艺术标记不那么重要,但仍然与数学标记有些相关。 / p>

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

3 个答案:

答案 0 :(得分:2)

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

第1步

让我们导入multivariate_normal

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

答案 1 :(得分:1)

谢谢你们的回复;它们非常有用。我调整了谢尔盖提供的代码来生成我正在寻找的结果,这是大多数时候相对接近的数学和科学标记的记录,以及更独立的历史和艺术标记。

以下生成的数据看似合理:

{{1}}

下一步是让每个主题都有不同的意思,但我知道如何做到这一点。再次感谢。

example dataframe

答案 2 :(得分:0)

统计工具是协方差矩阵:https://en.wikipedia.org/wiki/Covariance。 每个单元格(i,j)代表变量i和变量j之间的依赖关系,因此在您的情况下,它可以介于数学和科学之间。如果没有依赖关系,则该值为0.

你所做的是假设协方差是对角矩阵,对角线上的值相同。因此,您需要做的是定义协方差矩阵,然后从具有numpy.random.multivariate_normal https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multivariate_normal.html或任何其他分布函数的高斯中绘制样本。