总目录:Python数据分析整理
之后马上要学习朴素贝叶斯算法了,为之后的学习做好铺垫,重新用python实现了一下数据正态性的检验。根据数据的均值方差,求出小于某个值的概率,或者根据概率求出这个值是多少。
python实现非标准正态分布下概率密度有关计算
- 原理
- 代码实现
- 实例
- 数据集
- 代码分析
原理
参考文章正态分布下的累积概率
代码实现
normal_eval.py(我自己命名的,后面会导入)
from scipy import stats
# 前提!!!!!数据服从正态分布
# 求小于x的概率,即x左侧的面积
# mean,std为平均值和标准差,默认0,1,即标准正态分布
# std > 0
def get_p(x, mean=0, std=1):
z = (x-mean)/std
p = stats.norm.cdf(z)
return p
# 求概率密度大于p时,x的值;即左侧面积为p时,x的值
# mean,std为平均值和标准差,默认0,1,即标准正态分布
# 0 < p < 1, std > 0
def get_x(p, mean=0, std=1):
z = stats.norm.ppf(p)
x = z*std + mean
return x
# 测试
if __name__ == '__main__':
print(get_p(2))
print(get_x(0.3))
# 非标准正态分布计算
print('此分布下值小于89的概率:', get_p(89, 83, 7))
print('此分布下95%置信区间:', get_x(0.025, 83, 7), '-', get_x(0.975, 83, 7))
实例
数据集
test.txt
编号 班级 语文成绩
1 1 86
2 1 90
3 1 89
4 1 79
5 1 73
6 1 91
7 1 94
8 1 85
9 1 86
10 1 77
11 2 94
12 2 88
13 2 79
14 2 67
15 2 87
16 2 84
17 2 82
18 2 71
19 2 86
20 2 74
21 3 86
22 3 93
23 3 91
24 3 85
25 3 79
26 3 73
27 3 81
28 3 83
29 3 89
30 3 90
这是在SPSS生成的图,可以直观展示之后的分析
代码分析
import pandas as pd
from scipy import stats
import normal_eval
data = pd.read_csv('test.txt', sep='\t')
print(data.head())
# 均值
mean = data['语文成绩'].mean()
print('均值:', mean)
# 方差
std = data['语文成绩'].std()
print('标准差:', std)
# 正态检验
d, p = stats.kstest(data['语文成绩'], 'norm', (mean, std))
# 如果p<0.05,拒绝原假设,认为数据不符合正态分布,不用后面继续分析了,下班
# 如果p>0.05,接受原假设,认为数据符合正态分布,继续分析
print('p值:', p)
print('随便抽个小朋友成绩小于80分的概率:', normal_eval.get_p(80, mean, std))
print('随便抽个小朋友成绩大于87分的概率:', 1 - normal_eval.get_p(87, mean, std))
print('班上成绩前30%应该大于的分数:', normal_eval.get_x(0.7, mean, std))
print('班上成绩后30%应该小于的分数:', normal_eval.get_x(0.3, mean, std))
输出结果:
编号 班级 语文成绩
0 1 1 86
1 2 1 90
2 3 1 89
3 4 1 79
4 5 1 73
均值: 83.73333333333333
标准差: 7.143520494649069
p值: 0.5789764316726012
随便抽个小朋友成绩小于80分的概率: 0.3006200101601507
随便抽个小朋友成绩大于87分的概率: 0.32373099736401
班上成绩前30%应该大于的分数: 87.4793991432677
班上成绩后30%应该小于的分数: 79.98726752339897