KS检验-检验数据集的分布情况

基本含义:

Kolmogorov-Smirnov 检验 是一种非参数统计检验方法,用于判断数据集是否符合某种 分布,尤其是检验数据集是否符合正态分布。其基本原理是将数据集的累积分布函数与理论 分布函数进行比较,通过计算两者之间的最大差距来确定数据集是否符合理论分布。当最大 差距小于某个临界值时,认为数据集符合该理论分布。

计算公式:

(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 Statisticp-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的分享

好啦,希望能够帮助到大家!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是R语言中进行小数据量正态分布检验的方法: 1. Shapiro-Wilk检验 Shapiro-Wilk检验是一种常用的小样本正态性检验方法,它的原假设是数据符合正态分布。在R语言中,可以使用shapiro.test()函数进行Shapiro-Wilk检验。例如: ```R # 创建一个小样本数据集 x <- c(1.2, 2.3, 3.4, 4.5, 5.6) # 进行Shapiro-Wilk检验 shapiro.test(x) ``` 输出结果为: ``` Shapiro-Wilk normality test data: x W = 0.94591, p-value = 0.6619 ``` 其中,W为Shapiro-Wilk统计量,p-value为检验的p值。如果p-value小于显著性水平(通常为0.05),则拒绝原假设,即数据不符合正态分布。 2. Anderson-Darling检验 Anderson-Darling检验也是一种小样本正态性检验方法,它的原假设是数据符合某个指定的分布(例如正态分布)。在R语言中,可以使用ad.test()函数进行Anderson-Darling检验。例如: ```R # 创建一个小样本数据集 x <- c(1.2, 2.3, 3.4, 4.5, 5.6) # 进行Anderson-Darling检验 library(nortest) ad.test(x) ``` 输出结果为: ``` Anderson-Darling normality test data: x A = 0.424, p-value = 0.7875 ``` 其中,A为Anderson-Darling统计量,p-value为检验的p值。如果p-value小于显著性水平(通常为0.05),则拒绝原假设,即数据不符合正态分布。 3. Kolmogorov-Smirnov检验 Kolmogorov-Smirnov检验也是一种小样本正态性检验方法,它的原假设是数据符合某个指定的分布(例如正态分布)。在R语言中,可以使用ks.test()函数进行Kolmogorov-Smirnov检验。例如: ```R # 创建一个小样本数据集 x <- c(1.2, 2.3, 3.4, 4.5, 5.6) # 进行Kolmogorov-Smirnov检验 ks.test(x, "pnorm", mean(x), sd(x)) ``` 输出结果为: ``` One-sample Kolmogorov-Smirnov test data: x D = 0.29289, p-value = 0.4642 alternative hypothesis: two-sided ``` 其中,D为Kolmogorov-Smirnov统计量,p-value为检验的p值。如果p-value小于显著性水平(通常为0.05),则拒绝原假设,即数据不符合正态分布
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值