Python 中的正态分布

即使你不是统计学领域的人,你也一定接触过“正态分布”这个词。

概率分布是一种统计函数,描述获得随机变量可能取值的可能性。我们指的是当我们随机选取参数值时该参数可以取的值范围。

概率分布可以是离散的或连续的。

假设在一个城市,20-30 岁年龄段成年人的身高在 4.5 英尺到 7 英尺之间。

如果我们被要求随机挑选 1 个成年人并询问他/她(假设性别不影响身高)的身高是多少?没有办法知道高度是多少。但如果我们有城市中成年人的身高分布,我们就可以押注最可能的结果。

什么是正态分布?

正态分布也称为高斯分布或著名的形曲线人们可以互换使用这两个词,但含义相同。它是一个连续的概率分布。

正态分布的概率密度函数 (pdf):

正态分布的概率密度函数

其中,μ = 平均值,σ = 标准差,x = 输入值。

术语:

  • 平均值——平均值是通常的平均值。总点数之和除以总点数。
  • 标准差——标准差告诉我们数据的“分布”程度。它衡量每个观测值与平均值的距离。

看起来令人畏惧,不是吗?但这很简单。

1. 正态分布的示例实现

我们来看看下面的代码。我们将使用numpymatplotlib进行演示:

# 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( )方法需要locscale以及数据作为输入参数,并给出概率密度值。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 英尺之间的概率是多少?

曲线下面积在 4.5 至 6.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 英尺的概率会怎样?

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 中的实现。

快乐学习!