【五 (3)统计学知识-概型与概率分布python代码实现】

文章导航

【一 简明数据分析进阶路径介绍(文章导航)】

一、概率基础与性质

概率,是度量某一事件发生的可能性大小的数值。概率的基本性质包括:

  • 非负性:对于任意事件A,有P(A) ≥ 0。
  • 归一性:对于必然事件S,有P(S) = 1。
  • 可加性:对于互斥事件A和B,有P(A∪B) = P(A) + P(B)。

案例:投掷一枚均匀的硬币,正面朝上的概率为P(正) = 0.5,反面朝上的概率为P(反) = 0.5。由于正面和反面是互斥的,所以P(正∪反) = P(正) + P(反) = 1。

二、概型模型

1、古典概型

是一类具有有限个“等可能”发生的基本事件的概率模型。其特点是:试验结果的有限性和每一个试验结果出现的等可能性。古典概型是概率论中最直观和最简单的模型,但它只适用于试验结果的有限性和等可能性的场合。

2、几何概型

它的特点与古典概型相似,也是等可能性,但它的实验结果(基本事件)是无限多个的。

3、伯努利试验概型

是关于独立重复试验序列的一类重要的概率模型。在相同的条件下重复地、相互独立地进行的一种随机试验,叫做伯努利试验。伯努利试验只有两种可能的结果,即“成功”和“失败”。

三、组合和排序

1、组合

组合是指从一个较大(n个)对象群体中取出一定数目(r个)对象,但不必知道所选对象的确切顺序。换句话说,组合关注的是对象的选择,而不是它们的排列顺序。

想象一个魔法师的帽子里有很多不同颜色、形状和大小的宝石。如果魔法师想从帽子里选出三颗宝石用于施展魔法,他关注的是选出了哪些宝石,而不是这些宝石被选出的具体顺序。因为无论这三颗宝石是按照什么顺序被选出的,它们组合在一起的效果都是一样的。

2、排序

排序,或者说排列,是指从一个较大(n个)对象群体中取出一定数目(r个)对象进行排序,并得出排序方式的总数目。与组合不同,排列不仅关注对象的选择,还关注它们的排列顺序。

一个小型赛车比赛,假设有十辆赛车参加比赛,我们需要确定前三名的具体排名。这里,不仅需要考虑哪三辆车将占据前三名的位置,还需要明确它们之间的具体排名顺序。因为第一名、第二名和第三名的顺序对于比赛结果来说是非常重要的。

四、概率分布

1、离散型分布

①伯努利分布

伯努利分布是一个离散型概率分布,它描述的是只有两种可能结果(通常记为0和1)的单次随机试验。例如,抛硬币的结果(正面或反面)就是一个伯努利试验。

import numpy as np  
import matplotlib.pyplot as plt  
import seaborn as sns  
  
# 假设伯努利试验成功的概率为 p  
p = 0.6  # 假设成功的概率为60%  
  
# 生成伯努利分布的样本数据  
n_samples = 1000  # 样本数量  
bernoulli_samples = np.random.choice([0, 1], size=n_samples, p=[1-p, p])  
  
# 创建一个计数数组,用于统计0和1的出现次数  
counts = np.bincount(bernoulli_samples)  
  
# 准备x轴标签  
x = np.arange(len(counts))  
  
# 绘制条形图  
plt.figure(figsize=(8, 6))  
sns.barplot(x=x, y=counts, palette="Blues_d")  
  
# 设置x轴标签  
plt.xlabel('Outcome')  
plt.xticks(x, ['0 (Failure)', '1 (Success)'])  
  
# 设置y轴标签  
plt.ylabel('Frequency')  
  
# 设置标题  
plt.title(f'Bernoulli Distribution with p={p}')  
  
# 显示图形  
plt.show()

在这里插入图片描述

②二项分布

二项分布描述的是在n次独立的伯努利试验中,成功发生k次的概率。例如,抛硬币10次,正面朝上的次数。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
from scipy.stats import binom  
  
# 设置二项分布的参数  
n = 10  # 试验次数  
p = 0.5  # 成功概率  
  
# 生成二项分布的概率质量函数(PMF)  
k = np.arange(binom.ppf(0.01, n, p), binom.ppf(0.99, n, p))  
pmf_values = binom.pmf(k, n, p)  
  
# 使用seaborn绘制条形图  
plt.figure(figsize=(10, 6))  
sns.barplot(x=k, y=pmf_values, color="skyblue")  
  
# 设置标题和轴标签  
plt.title(f'Binomial Distribution (n={n}, p={p})')  
plt.xlabel('Number of Successes')  
plt.ylabel('Probability')  
  
# 显示图形  
plt.show()

在这里插入图片描述

③泊松分布

泊松分布是一种描述单位时间(或空间)内随机事件发生的次数的离散概率分布。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
from scipy.stats import poisson  
  
# 设置泊松分布的参数  
mu = 7  # 平均发生次数(泊松分布的λ参数)  
  
# 生成泊松分布的概率质量函数(PMF)的k值范围  
k = np.arange(poisson.ppf(0.01, mu), poisson.ppf(0.99, mu))  
  
# 计算对应k值的泊松分布概率  
pmf_values = poisson.pmf(k, mu)  
  
# 使用seaborn绘制条形图  
plt.figure(figsize=(10, 6))  
sns.barplot(x=k, y=pmf_values, color="skyblue")  
  
# 设置标题和轴标签  
plt.title(f'Poisson Distribution (λ={mu})')  
plt.xlabel('Number of Events')  
plt.ylabel('Probability')  
  
# 显示图形网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

2、连续型分布

①均匀分布

在均匀分布中,所有可能的取值都具有相同的概率。例如,抛一个公平的六面骰子,每个数字出现的概率都是1/6。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 生成均匀分布的样本数据  
a = 0  # 分布的下界  
b = 10  # 分布的上界  
n_samples = 1000  # 样本数量  
uniform_samples = np.random.uniform(a, b, size=n_samples)  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(uniform_samples, kde=True, bins=30, color="skyblue", alpha=0.7, label='Uniform Distribution')  
  
# 设置标题和轴标签  
plt.title('Uniform Distribution')  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

②指数分布

指数分布是一种连续概率分布,描述了事件之间的时间间隔。例如,顾客到达商店的时间间隔。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 生成指数分布的样本数据  
lambda_param = 0.5  # 指数分布的λ参数,控制分布的速率  
n_samples = 1000  # 样本数量  
exponential_samples = np.random.exponential(scale=1/lambda_param, size=n_samples)  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(exponential_samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Exponential Distribution')  
  
# 设置标题和轴标签  
plt.title('Exponential Distribution (λ={})'.format(lambda_param))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

③正态分布/高斯分布

正态分布是一种连续概率分布,其概率密度函数曲线呈钟形,关于均值对称,是最常见的连续型概率分布。它描述了许多自然现象,例如人的身高或考试的分数。高斯分布由均值和标准差决定。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 生成正态分布的样本数据  
mean = 0  # 正态分布的均值  
std_dev = 1  # 正态分布的标准差  
n_samples = 1000  # 样本数量  
normal_samples = np.random.normal(mean, std_dev, size=n_samples)  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(normal_samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Normal Distribution')  
  
# 设置标题和轴标签  
plt.title('Normal/Gaussian Distribution (μ={}, σ={})'.format(mean, std_dev))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

④对数正态分布

如果一个随机变量的对数服从正态分布,那么该变量服从对数正态分布。它常用于描述某些偏态分布的数据,如某些金融资产的收益。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 生成对数正态分布的样本数据  
mu = 0  # 对数正态分布的均值(对数尺度)  
sigma = 1  # 对数正态分布的标准差(对数尺度)  
n_samples = 1000  # 样本数量  
normal_samples = np.random.normal(mu, sigma, size=n_samples)  
lognormal_samples = np.exp(normal_samples)  # 对正态分布样本取指数得到对数正态分布样本  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(lognormal_samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Log-normal Distribution')  
  
# 设置标题和轴标签  
plt.title('Log-normal Distribution (μ={}, σ={})'.format(mu, sigma))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

⑥幂律分布

描述了事件发生的频率与其排名之间的关系,常用于描述社会网络、城市规模等现象。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 幂律分布的参数  
xmin = 1  # 幂律分布的最小值  
alpha = 2.5  # 幂律分布的指数参数(也称为形状参数)  
  
# 生成幂律分布的样本数据  
def generate_powerlaw_samples(xmin, alpha, size):  
    samples = []  
    while len(samples) < size:  
        # 使用逆变换采样生成符合幂律分布的样本  
        u = np.random.rand(size)  
        x = xmin * (1 - u) ** (-1 / alpha)  
        # 过滤掉超出范围的样本  
        samples.extend(x[x > 0].tolist())  
        # 如果生成的样本足够,则退出循环  
        if len(samples) >= size:  
            break  
    return np.array(samples[:size])  
  
n_samples = 100  # 样本数量  
powerlaw_samples = generate_powerlaw_samples(xmin, alpha, n_samples)  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(powerlaw_samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Power-law Distribution')  
  
# 设置标题和轴标签  
plt.title('Power-law Distribution (xmin={}, α={})'.format(xmin, alpha))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

⑦帕累托分布

常用于描述社会、经济现象中的不平等性,如财富和收入的分布。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 帕累托分布的参数  
xm = 1  # 最小尺度参数(也称为位置参数)  
alpha = 1.5  # 形状参数(也称为形状指数)  
  
# 生成帕累托分布的样本数据  
def generate_pareto_samples(xm, alpha, size):  
    u = np.random.rand(size)  
    samples = xm / (u ** (1 / alpha) - 1)  
    return samples  
  
n_samples = 100  # 样本数量  
pareto_samples = generate_pareto_samples(xm, alpha, n_samples)  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(pareto_samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Pareto Distribution')  
  
# 设置标题和轴标签  
plt.title('Pareto Distribution (xm={}, α={})'.format(xm, alpha))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

⑧韦伯分布

常用于描述设备的故障时间分布。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
from scipy.stats import weibull_min  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 韦伯分布的参数  
c = 1  # 尺度参数  
k = 2  # 形状参数  
  
# 生成韦伯分布的样本数据  
size = 1000  # 样本数量  
samples = weibull_min.rvs(k, size=size, scale=c)  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Weibull Distribution')  
  
# 设置标题和轴标签  
plt.title('Weibull Distribution (c={}, k={})'.format(c, k))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

3、特定应用分布

①卡方分布

卡方分布通常用于检验观测频率与期望频率之间的差异,或者检验一个或多个变量的独立性。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
from scipy.stats import chi2  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 卡方分布的参数  
df = 3  # 自由度  
  
# 生成卡方分布的样本数据  
size = 1000  # 样本数量  
samples = chi2.rvs(df, size=size)  
  
# 使用seaborn的histplot绘制直方图  
plt.figure(figsize=(10, 6))  
sns.histplot(samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Chi-Squared Distribution')  
  
# 设置标题和轴标签  
plt.title('Chi-Squared Distribution (df={})'.format(df))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

②学生T分布

T分布用于小样本统计推断,特别是当总体标准差未知时。T检验就是基于T分布的。

import numpy as np  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 设置随机种子以获得可重复的结果  
np.random.seed(0)  
  
# 学生T分布的参数  
df = 3  # 自由度  
  
# 生成学生T分布的样本数据  
size = 500  # 样本数量  
samples = np.random.standard_t(df, size)  
  
# 创建一个图形和轴对象  
plt.figure(figsize=(10, 6))  
  
# 使用seaborn的histplot绘制直方图  
sns.histplot(samples, kde=True, bins='auto', color="skyblue", alpha=0.7, label='Student\'s t-Distribution')  
  
# 设置标题和轴标签  
plt.title('Student\'s t-Distribution (df={})'.format(df))  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
  
# 显示图例  
plt.legend()  
  
# 显示网格  
plt.grid(True)  
  
# 显示图形  
plt.show()

在这里插入图片描述

五、期望与方差

1、期望

期望,也称为均值,是随机变量所有可能取值的平均值。它反映了随机变量在大量重复试验中的平均水平。

一个抽奖活动,每次抽奖都有机会获得不同数量的奖金。如果抽奖次数足够多,你获得的平均奖金金额就是期望。比如,抽奖活动有50%的概率获得10元,50%的概率获得20元,那么期望就是(10元×50% + 20元×50%)= 15元。

2、方差

方差则是用来描述随机变量取值与其期望之间的偏离程度。方差越大,说明随机变量的取值越离散,波动越大;方差越小,说明取值越集中,波动越小。

一个射击游戏,玩家的目标是击中靶心。如果大部分玩家的射击结果都集中在靶心附近,那么射击结果的方差就很小,说明玩家的射击水平比较稳定。但如果射击结果分散在靶子的各个角落,甚至打到靶子外面,那么方差就很大,说明玩家的射击水平不够稳定。

3、结合

将期望和方差结合在一个案例中。假设你正在考虑投资两种不同的股票。股票A的期望收益率较高,但方差也很大,意味着它有可能带来高额回报,但同样存在较大的风险。而股票B的期望收益率较低,但方差较小,相对稳定。在做出投资决策时,你需要根据自己的风险承受能力和投资目标来权衡这两个因素。

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值