本篇说明
上前一篇内容“描述性统计分析:考试成绩分析”,已经把“19级财管管理会计”科目考试成绩进行了描述性统计分析。想必您已经对成绩总体情况,以及分班级成绩情况有了基本的了解。
然而,在上一篇分析最后,我进行了hist和kde分析并画出了便于大家认知的统计图。那么,画出hist和kde的目的是什么呢?在上文并没有进行分析和说明。其实质是为了本文进行分布拟合和预测做前导。
本文将在前一篇“描述性统计分析:考试成绩分析”基础之上,继续做分析。
主要完成以下几个重要任务,这几个点也是经济类、管理类专业做数据分布拟合和预测的痛点。
- 成绩数据经验分布的猜想;
- 根据猜想对成绩数据进行猜想分布的拟合;
- 对分布进行检验;
- 预测。
如果不清楚前因,请先阅读前文:
对分布的经验判断
import numpy as np
import pandas as pd
from scipy.stats import beta ,kstest
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_excel('19财管管理会计成绩.xlsx')
data =df['glkj'].tolist()
该数据集为excel表格"19财管管理会计成绩.xlsx":
- class:班级。19财管1—19财管6。分类变量。
- glkj:管理会计,该科目考试成绩。可度量变量。
- 成绩整体分布情况,在前一篇文中已经介绍过,不清楚的可以查阅前一篇内容。
- 对该图分布进行经验分析和判断:从图上可以清楚的看到,分布的特征是严重“左偏”,峰值附近分布很窄,收尾很快。
- 有这种特征的分布有很多:beta分布、genextreme分布等。
感兴趣的话,可以对不限于上面两种分布进行拟合,形态如下图所示:
基于经验的判断:拟合beta分布
a_glkj, b_glkj, loc_glkj, scale_glkj = beta.fit(data)
#a_glkj, b_glkj, loc_glkj, scale_glkj为拟合beta分布返回的分布参数值。
- 结果:
(a_glkj, b_glkj, loc_glkj, scale_glkj)
(91.93, 1.65, -564.81, 665)
分布检验:Kolmogorov-Smirnov test
cdf = stats.beta.cdf
stats.kstest(rvs=data, cdf, args=(a_glkj, b_glkj, loc_glkj, scale_glkj), N=20, alternative='two-sided', mode='auto')
- 结果:
KstestResult(statistic=0.05016, pvalue=0.3581)
- p>0.05:在0.05水平上,没有理由说它不服从beta分布。
- 即:19财管管理会计成绩符合beta分布。
- 分布参数为:
(a_glkj, b_glkj, loc_glkj, scale_glkj)
(91.93, 1.65, -564.81, 665)
给定参数的理论分布:beta
bins=np.linspace(start=data.min(),
stop=data.max(), num=30, endpoint=True)
ax1= sns.distplot(data,bins=bins,
norm_hist=True,hist=True,
kde=False,label='19财管管理会计成绩hist')
plt.legend(loc='best')
x = np.linspace(data.min(), data.max(), 100)
y = beta.pdf(x, a_glkj, b_glkj, loc_glkj, scale_glkj)
ax1 = plt.plot(x, y, 'c', linewidth=3, label='19财管管理会计成绩pdf')
plt.legend(loc='best')
根据理论分布进行预测
- beta分布:给定参数下的理论 pdf
fig, ax = plt.subplots(1, 1)
mean, var, skew, kurt =beta.stats(a_glkj,b_glkj,loc_glkj,scale_glkj, moments='mvsk')
min_x = beta.ppf(0.001, a_glkj, b_glkj, loc_glkj, scale_glkj)
max_x = beta.ppf(0.999, a_glkj, b_glkj, loc_glkj, scale_glkj)
x = np.linspace(start= min_x, stop= max_x, num= 400,endpoint=True)
y = beta.pdf(x, a_glkj, b_glkj, loc_glkj, scale_glkj)
ax.plot(x, y,'r-', lw=3, alpha=0.4, label='19财管管理会计成绩beta pdf')
ax.legend(loc='best')
- beta分布:给定参数下的理论 cdf
z = beta.cdf(x, a_glkj, b_glkj, loc_glkj, scale_glkj)
plt.plot(x, z ,'r-', lw=3, alpha=0.4, label='19财管管理会计成绩beta cdf')
plt.legend()
plt.show()
预测
- 预测:分数<=X分的概率
beta.cdf([43,60,80,90,100], a_glkj, b_glkj, loc_glkj, scale_glkj)
结果:array([0.001, 0.01, 0.13, 0.43, 0.97])
按既定的数据分布预测,考60分以下的概率仅仅为1%。如此低的不及格率。
- 预测:概率=X% 下的分数
beta.ppf([0.001, 0.5, 0.999], a_glkj, b_glkj, loc_glkj, scale_glkj)
结果:array([ 41.81, 90.65, 100])