基本含义:
计算公式:
(1)KS Statistic两个分布之间的最大差异
(2)p值
p值的计算如下:
代码实现:
(1)案例
目前有一个“学生成绩表.xlsx”,使用使用KS检验来研究“语文”“数学”“英语”三科各自的数据分布情况是否符合正态分布。
(2)python代码实现
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
from pylab import mpl
# 设置中文显示字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 读取 Excel 文件
file_path = '学生成绩表.xlsx' # 请替换为你的文件路径
df = pd.read_excel(file_path, sheet_name='Sheet1')
# 需要分析的科目
subjects = ['语文', '数学', '英语']
# 存储KS检验的结果
results = {}
# 对每一科进行KS检验
for subject in subjects:
# KS检验,将各科成绩与相同均值和标准差的正态分布进行比较
statistic, p_value = stats.kstest(df[subject], 'norm', args=(df[subject].mean(), df[subject].std()))
results[subject] = {'KS Statistic': statistic, 'p-value': p_value}
# 将结果转换为 DataFrame 以便查看
ks_results_df = pd.DataFrame(results).T
# 打印检验结果
print("KS检验结果:")
print(ks_results_df)
# 可视化每个科目的成绩分布与正态分布的对比
for subject in subjects:
plt.figure(figsize=(8, 6))
# 生成正态分布的曲线
mean = df[subject].mean()
std = df[subject].std()
x = sorted(df[subject])
y = stats.norm.pdf(x, mean, std)
# 画出实际分布的直方图
plt.hist(df[subject], bins=15, density=True, alpha=0.6, color='g', label=f'{subject} 成绩分布')
# 画出理论正态分布的曲线
plt.plot(x, y, 'r--', label='正态分布')
plt.title(f'{subject} 成绩分布 vs 正态分布')
plt.xlabel(f'{subject} 成绩')
plt.ylabel('概率密度')
plt.legend()
# 显示图像
plt.show()
核心代码:
statistic, p_value = stats.kstest(df[subject], 'norm', args=(df[subject].mean(), df[subject].std()))
①stats.kstest函数
专门计算KS检验,标准形式为:stats.kstest(value1,value2,value3)
value1:代表我们输入的数据,也就是df[subject]“语文”成绩数组(以语文为例)。
value2:代表的是我们要跟什么函数进行比对,因为我们这里要检验的是正态分布,所以为'norm'
value3:输入计算用的额外参数,对于不同的分布需要传递的参数不同,对于正态分布而言,需要传递正态分布的均值和标准差,也就是df[subject].mean(), df[subject].std()
返回值有2个,分别是KS Statistic和p-value。
②正态分布曲线
y = stats.norm.pdf(x, mean, std)
对于每一个 x
(即每个成绩),使用均值 mean
和标准差 std
,计算出正态分布的概率密度函数值 y
。这个函数是正态分布的公式:
(3)效果
①语文成绩数据分布
②数学成绩数据分布
③英语成绩数据分布
(4)结果分析
从结果中的 p-value 来看,三科的 p 值均大于 0.05,表明我们无法拒绝原假设(即这些数据符合正态分布)。因此,初步认为这三科的数据分布接近正态分布。
源文件获取:
上述所用的表格文件如下:
通过网盘分享的文件:学生成绩表.zip
链接: https://pan.baidu.com/s/1FkOVTVF4n_RY6QofYcTE_A?pwd=vnwt 提取码: vnwt
--来自百度网盘超级会员v5的分享
好啦,希望能够帮助到大家!