首页 > 其他分享 >卡方分布和 Zipf 分布模拟及 Seaborn 可视化教程

卡方分布和 Zipf 分布模拟及 Seaborn 可视化教程

时间:2024-06-04 19:44:06浏览次数:13  
标签:Seaborn df Zipf np 分布 卡方 data

卡方分布

简介

卡方分布是一种连续概率分布,常用于统计学中进行假设检验。它描述了在独立抽样中,每个样本的平方偏差之和的分布。卡方分布的形状由其自由度 (df) 参数决定,自由度越大,分布越平缓。

参数

卡方分布用两个参数来定义:

df:自由度,表示卡方分布的形状。自由度必须为正整数。
size:输出数组的形状。

公式

卡方分布的概率密度函数 (PDF) 为:

f(x) = (x^(df/2 - 1) * np.exp(-x/2)) / (2^(df/2) * Gamma(df/2))    for x >= 0

其中:

f(x):表示在 x 点的概率密度。
x:非负实数。
df:自由度。
np.exp(-x/2):指数函数。
Gamma(df/2):伽马函数。

生成卡方分布数据

NumPy 提供了 random.chisquare() 函数来生成服从卡方分布的随机数。该函数接受以下参数:

df:自由度。
size:输出数组的形状。

示例:生成 10 个自由度为 5 的卡方分布随机数:

import numpy as np

data = np.random.chisquare(df=5, size=10)
print(data)

可视化卡方分布

Seaborn 库提供了便捷的函数来可视化分布,包括卡方分布。

示例:绘制 1000 个自由度为 5 的卡方分布随机数的分布图:

import seaborn as sns
import numpy as np

data = np.random.chisquare(df=5, size=1000)
sns.distplot(data)
plt.show()

练习

  1. 模拟 20 个自由度为 10 的卡方分布随机数,并绘制它们的分布图。
  2. 比较不同自由度下卡方分布形状的变化。
  3. 利用卡方分布来进行卡方检验,假设某枚硬币是公平的,即正面朝上的概率为 0.5。抛掷硬币 100 次,并计算正面朝上的次数是否服从二项分布。

解决方案

import seaborn as sns
import numpy as np
from scipy import stats

# 1. 模拟随机数并绘制分布图
data = np.random.chisquare(df=10, size=20)
sns.distplot(data)
plt.show()

# 2. 比较不同自由度下分布形状的变化
df_values = [2, 5, 10, 20]
for df in df_values:
    data = np.random.chisquare(df=df, size=1000)
    sns.distplot(data, label=f"df={df}")
plt.legend()
plt.show()

# 3. 进行卡方检验
heads = np.random.binomial(n=100, p=0.5)
chi2_stat, p_value = stats.chisquare(heads, f_exp=50)
print("卡方统计量:", chi2_stat)
print("p 值:", p_value)

# 由于 p 值大于 0.05,无法拒绝原假设,即可以认为硬币是公平的。

瑞利分布

简介

瑞利分布是一种连续概率分布,常用于描述信号处理和雷达系统中的幅度分布。它表示在一个随机变量的平方根服从指数分布时,该随机变量的分布。

参数

瑞利分布用一个参数来定义:

scale:尺度参数,控制分布的平坦程度。较大的尺度参数使分布更加平坦,两侧尾部更加分散。默认为 1。

公式

瑞利分布的概率密度函数 (PDF) 为:

f(x) = (x scale) / (scale^2 np.exp(-x^2 / (2 scale^2)))    for x >= 0

其中:

f(x):表示在 x 点的概率密度。
x:非负实数。
scale:尺

Zipf分布

简介

Zipf分布,又称为Zeta分布,是一种离散概率分布,常用于描述自然语言、人口统计学、城市规模等领域中具有幂律特征的数据分布。它体现了“少数服从多数”的现象,即排名越靠前的元素出现的频率越高。

参数

Zipf分布用一个参数来定义:

a:分布参数,控制分布的形状。a越小,分布越偏向于少数元素,越接近幂律分布。默认为 2。

公式

Zipf分布的概率质量函数 (PMF) 为:

P(k) = 1 / (k ^ a)    for k >= 1

其中:

P(k):表示第 k 个元素出现的概率。
k:元素的排名,从 1 开始。
a:分布参数。

生成Zipf分布数据

NumPy提供了random.zipf()函数来生成服从Zipf分布的随机数。该函数接受以下参数:

a:分布参数。
size:输出数组的形状。

示例:生成10个服从Zipf分布的随机数,分布参数为2:

import numpy as np

data = np.random.zipf(a=2, size=10)
print(data)

可视化Zipf分布

Seaborn库提供了便捷的函数来可视化分布,包括Zipf分布。

示例:绘制1000个服从Zipf分布的随机数的分布图,分布参数为2:

import seaborn as sns
import numpy as np

data = np.random.zipf(a=2, size=1000)
sns.distplot(data)
plt.show()

练习

  1. 模拟不同分布参数下Zipf分布形状的变化。
  2. 利用Zipf分布来模拟一个城市的规模分布,并计算排名前10的城市人口占总人口的比例。
  3. 比较Zipf分布与幂律分布的异同。

解决方案

import seaborn as sns
import numpy as np

# 1. 模拟不同分布参数下Zipf分布形状的变化
a_values = [1.5, 2, 2.5, 3]
for a in a_values:
    data = np.random.zipf(a=a, size=1000)
    sns.distplot(data, label=f"a={a}")
plt.legend()
plt.show()

2. 模拟城市规模分布并计算人口比例

population = np.random.zipf(a=2, size=100)
top10_population = population[:10].sum()
total_population = population.sum()
print("排名前10的城市人口:", top10_population)
print("排名前10的城市人口比例:", top10_population / total_population)

3. Zipf分布与幂律分布的比较

Zipf分布和幂律分布都描述了“少数服从多数”的现象,即排名越靠前的元素出现的频率越高。

但是,Zipf分布的参数化程度更高,可以更精确地描述不同领域的幂律现象。幂律分布则更通用,但缺乏Zipf分布对参数的控制能力。

具体来说,Zipf分布的PMF为:

P(k) = 1 / (k ^ a)

幂律分布的PMF为:

P(k) = C / k ^ alpha

其中,C为归一化常数。

可见,Zipf分布的参数a控制了分布的倾斜程度,而幂律分布的参数alpha则控制了分布的整体形状。

此外,Zipf分布通常用于描述离散数据,而幂律分布则可以用于描述离散和连续数据。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

标签:Seaborn,df,Zipf,np,分布,卡方,data
From: https://www.cnblogs.com/xiaowange/p/18231582

相关文章

  • 多项分布模拟及 Seaborn 可视化教程
    多项分布简介多项分布是二项分布的推广,它描述了在n次独立试验中,k种不同事件分别出现次数的离散概率分布。与二项分布只能有两种结果(例如成功/失败)不同,多项分布可以有k种(k≥2)及以上的不同结果。参数多项分布用三个参数来定义:n:试验次数,表示重复相同实验的次数。pvals:一......
  • Anaconda安装Python的seaborn库
      本文介绍在Anaconda的环境中,安装Python语言中,常用的一个绘图库seaborn模块的方法。  seaborn模块是基于Matplotlib的数据可视化库,它提供了一种更简单、更漂亮的界面来创建各种统计图形。seaborn模块主要用于数据探索、数据分析和数据可视化,使得我们在Python中创建各种统计......
  • python画图报错:OSError: 'seaborn-whitegrid' is not a valid package style
    解决方法:https://stackoverflow.com/questions/78019854/matplotlib-seaborn-whitegrid-is-not-a-valid-package-style?newreg=7ee17d6cd10c4182b08284391596644b代码:importmatplotlib.pyplotaspltplt.style.available效果:这个问题说明对应的样式package不存在,查......
  • Python利用Seaborn绘制ROC和PR曲线以及AUC与AUPR的计算
    目录一、ROC和PR曲线定义1.1ROC曲线与AUROC1.2PR曲线与AUPRC二、环境需求三、样例数据四、Seaborn绘制ROC和PR曲线4.1ROC曲线绘制和AUROC计算4.2PR曲线绘制和AUPRC计算五、参考文献一、ROC和PR曲线定义1.1ROC曲线与AUROC  ROC曲线[1],[2](ReceiverOpera......
  • Python使用Matplotlib和Seaborn绘制箱线图
    目录一、箱线图定义二、Matplotlib与Seaborn简介三、绘制箱线图的样例数据四、Python绘制箱线图4.1Matplotlib绘制箱线图4.2Seaborn绘制箱线图五、参考文献一、箱线图定义  箱形图(Boxplot),又称盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分布情况的......
  • NumPy 均匀分布模拟及 Seaborn 可视化教程
    均匀分布简介均匀分布是一种连续概率分布,表示在指定范围内的所有事件具有相等的发生概率。它常用于模拟随机事件,例如生成随机数或选择随机样本。参数均匀分布用两个参数来定义:a:下限,表示分布的最小值。b:上限,表示分布的最大值。公式均匀分布的概率密度函数(PDF)为:f(x)=......
  • NumPy 均匀分布模拟及 Seaborn 可视化教程
    均匀分布简介均匀分布是一种连续概率分布,表示在指定范围内的所有事件具有相等的发生概率。它常用于模拟随机事件,例如生成随机数或选择随机样本。参数均匀分布用两个参数来定义:a:下限,表示分布的最小值。b:上限,表示分布的最大值。公式均匀分布的概率密度函数(PDF)为:f......
  • NumPy 泊松分布模拟与 Seaborn 可视化技巧
    泊松分布简介泊松分布是一种离散概率分布,用于描述在给定时间间隔内随机事件发生的次数。它常用于模拟诸如客户到达商店、电话呼叫接入中心等事件。参数泊松分布用一个参数来定义:λ:事件发生的平均速率,表示在单位时间内事件发生的平均次数。公式泊松分布的概率质量函数(PMF)......
  • NumPy 二项分布生成与 Seaborn 可视化技巧
    二项分布简介二项分布是一种离散概率分布,用于描述在固定次数的独立试验中,事件“成功”的次数的概率分布。它通常用于分析诸如抛硬币、做选择题等具有两个结果(成功或失败)的事件。参数二项分布用三个参数来定义:n:试验次数,表示重复相同实验的次数。p:每次试验中成功事件发生的概......
  • NumPy 正态分布与 Seaborn 可视化指南
    正态分布(高斯分布)简介正态分布(也称为高斯分布)是一种非常重要的概率分布,它描述了许多自然和人为现象的数据分布情况。正态分布的形状呈钟形,其峰值位于平均值处,两侧对称下降。特征正态分布可以用两个参数来完全描述:均值(μ):表示数据的平均值,分布的峰值位于μ处。标准差(σ):表示......