即使你不是统计学领域的人,你也一定接触过“正态分布”这个词。
概率分布是一种统计函数,描述获得随机变量可能取值的可能性。我们指的是当我们随机选取参数值时该参数可以取的值范围。
概率分布可以是离散的或连续的。
假设在一个城市,20-30 岁年龄段成年人的身高在 4.5 英尺到 7 英尺之间。
如果我们被要求随机挑选 1 个成年人并询问他/她(假设性别不影响身高)的身高是多少?没有办法知道高度是多少。但如果我们有城市中成年人的身高分布,我们就可以押注最可能的结果。
什么是正态分布?
正态分布也称为高斯分布或著名的钟形曲线。人们可以互换使用这两个词,但含义相同。它是一个连续的概率分布。
正态分布的概率密度函数 (pdf):
其中,μ = 平均值,σ = 标准差,x = 输入值。
术语:
看起来令人畏惧,不是吗?但这很简单。
1. 正态分布的示例实现
我们来看看下面的代码。我们将使用numpy和matplotlib进行演示:
# Importing required libraries import numpy as np import matplotlib.pyplot as plt # Creating a series of data of in range of 1-50. x = np.linspace( 1 , 50 , 200 ) #Creating a Function. def normal_dist(x , mean , sd): prob_density = (np.pi * sd) * np.exp( - 0.5 * ((x - mean) / sd) * * 2 ) return prob_density #Calculate mean and Standard deviation. mean = np.mean(x) sd = np.std(x) #Apply function to the data. pdf = normal_dist(x,mean,sd) #Plotting the Results plt.plot(x,pdf , color = 'red' ) plt.xlabel( 'Data points' ) plt.ylabel( 'Probability Density' ) |
2. 正态分布的性质
正态分布密度函数仅接受数据点以及平均值和标准差,并抛出一个我们称为概率密度的值。
我们可以通过改变平均值和标准差来改变钟形曲线的形状。
更改平均值将使曲线向该平均值移动,这意味着我们可以通过更改平均值来改变曲线的位置,同时曲线的形状保持不变。
曲线的形状可以通过标准偏差的值来控制。较小的标准差将导致曲线紧密相连,而较高的值将导致曲线更加分散。
正态分布的一些优秀特性:
- 平均值、众数和中位数都相等。
- 曲线下的总面积等于 1。
- 曲线围绕平均值对称。
经验法则告诉我们:
- 68% 的数据落在平均值的一个标准差范围内。
- 95% 的数据落在平均值的两个标准差之内。
- 99.7% 的数据落在平均值的三个标准差之内。
它是迄今为止所有统计数据中最重要的分布之一。正态分布很神奇,因为大多数自然发生的现象都遵循正态分布。例如,血压、智商分数、身高遵循正态分布。
使用正态分布计算概率
要找到正态分布中某个值出现在某个范围内的概率,我们只需找到该范围内曲线下方的面积即可。即我们需要对密度函数进行积分。
由于正态分布是连续分布,因此曲线下的面积代表概率。
在详细讨论之前,我们先来了解一下什么是标准正态分布。
标准正态分布与平均值 = 0、标准差 = 1 的正态分布类似。
Z = (x-μ)/ σ
上面的 z 值也称为z 分数。z 分数让您了解数据点与平均值的距离。
如果我们打算手动计算概率,我们将需要在z 表中查找 z 值以查看累积百分比值。Python 为我们提供了模块来为我们完成这项工作。让我们开始吧。
1. 创建正态曲线
我们将使用scipy.norm
类函数来计算正态分布的概率。
假设我们有一个城镇成年人身高的数据,并且数据服从正态分布,我们有足够的样本量,均值等于 5.3,标准差为 1。
该信息足以制作正态曲线。
# import required libraries from scipy.stats import norm import numpy as np import matplotlib.pyplot as plt import seaborn as sb # Creating the distribution data = np.arange( 1 , 10 , 0.01 ) pdf = norm.pdf(data , loc = 5.3 , scale = 1 ) #Visualizing the distribution sb.set_style( 'whitegrid' ) sb.lineplot(data, pdf , color = 'black' ) plt.xlabel( 'Heights' ) plt.ylabel( 'Probability Density' ) |
该类norm.pdf( )
方法需要loc
和scale
以及数据作为输入参数,并给出概率密度值。loc
只不过是平均值,而scale
是数据的标准差。该代码与我们在上一节中创建的代码类似,但要短得多。
2. 计算特定数据出现的概率
现在,如果我们被要求从这个分布中随机挑选一个人,那么这个人的身高小于 4.5 英尺的概率是多少?
如果从分布中随机选择,则上图所示的曲线下面积将是人的身高小于 4.5 英尺的概率。让我们看看如何在 python 中计算这个值。
曲线下的面积只不过是密度函数与极限的积分,等于 -∞ 到 4.5。
norm(loc = 5.3 , scale = 1 ).cdf( 4.5 ) |
0.211855 或 21.185%
上面的单行代码发现,如果从平均值为 5.3、标准差为 1 的正态分布中随机选择一个人,则该人的身高将低于 4.5 英尺的概率为21.18 % 。
norm
我们用平均值和标准差初始化类的对象,然后使用.cdf( )
方法传递一个值,我们需要找到累积概率值。累积分布函数 (CDF) 计算给定 x 值的累积概率。
从-∞到∞的累积概率值将等于1。
现在,我们再次被要求从这个分布中随机挑选一个人,那么这个人的身高在 6.5 到 4.5 英尺之间的概率是多少?
cdf_upper_limit = norm(loc = 5.3 , scale = 1 ).cdf( 6.5 ) cdf_lower_limit = norm(loc = 5.3 , scale = 1 ).cdf( 4.5 ) prob = cdf_upper_limit - cdf_lower_limit print (prob) |
0.673074 或 67.30%
上面的代码首先计算从-无穷大到6.5的累积概率值,然后计算从-无穷大到4.5的累积概率值。如果我们从 6.5 的 cdf 中减去 4.5 的 cdf,我们得到的结果就是限制 6.5 和 4.5 之间的曲线下方的面积。
现在,如果我们被问到随机选择的人的身高超过 6.5 英尺的概率会怎样?
很简单,我们知道曲线下的总面积等于1,如果我们计算从-∞到6.5的累积概率值,然后用1减去它,结果就是随机选择一个人的身高的概率6.5 英尺以上
cdf_value = norm(loc = 5.3 , scale = 1 ).cdf( 6.5 ) prob = 1 - cdf_value print (prob) |
0.115069 或 11.50%。
需要理解的内容有很多,但我鼓励所有人继续练习这个基本概念以及使用 python 的实现。
上述实现的完整代码:
# import required libraries from scipy.stats import norm import numpy as np import matplotlib.pyplot as plt import seaborn as sb # Creating the distribution data = np.arange( 1 , 10 , 0.01 ) pdf = norm.pdf(data , loc = 5.3 , scale = 1 ) #Probability of height to be under 4.5 ft. prob_1 = norm(loc = 5.3 , scale = 1 ).cdf( 4.5 ) print (prob_1) #probability that the height of the person will be between 6.5 and 4.5 ft. cdf_upper_limit = norm(loc = 5.3 , scale = 1 ).cdf( 6.5 ) cdf_lower_limit = norm(loc = 5.3 , scale = 1 ).cdf( 4.5 ) prob_2 = cdf_upper_limit - cdf_lower_limit print (prob_2) #probability that the height of a person chosen randomly will be above 6.5ft cdf_value = norm(loc = 5.3 , scale = 1 ).cdf( 6.5 ) prob_3 = 1 - cdf_value print (prob_3) |
结论
在本文中,我们了解了正态分布、正态曲线是什么样子,以及最重要的是它在 Python 中的实现。
快乐学习!