我正在尝试在4个科目中生成模拟学生成绩,其中学生记录是单行数据。此处显示的代码将生成正态分布的随机数,平均值为60,标准差为15。
df = pd.DataFrame(15 * np.random.randn(5, 4) + 60, columns=['Math', 'Science', 'History', 'Art'])
我无法弄清楚如何使学生的科学标记与他们的数学标记高度相关,并且他们的历史和艺术标记不那么重要,但仍然与数学标记有些相关。 / p>
我既不是统计学家也不是专家程序员,所以我希望能找到一种不太复杂但更容易理解的解决方案。
答案 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");
答案 1 :(得分:1)
谢谢你们的回复;它们非常有用。我调整了谢尔盖提供的代码来生成我正在寻找的结果,这是大多数时候相对接近的数学和科学标记的记录,以及更独立的历史和艺术标记。
以下生成的数据看似合理:
{{1}}
下一步是让每个主题都有不同的意思,但我知道如何做到这一点。再次感谢。
答案 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或任何其他分布函数的高斯中绘制样本。