【scipy 基礎】--統計分佈

wang_yb發表於2023-11-28

scipy.stats子模組包含大量的機率分佈、彙總和頻率統計、相關函式和統計測試、掩蔽統計、核密度估計、準蒙特卡羅功能等等。

這個子模組可以幫助我們描述和分析資料,進行假設檢驗和擬合統計模型等。

1. 主要功能

具體來說,scipy.stats子模組包括以下主要功能:

類別 說明
連續統計分佈 包括正態分佈、指數分佈、卡方分佈、t分佈、F分佈等常見的連續機率分佈。這些分佈都有各自的密度函式、分佈函式、累積函式、隨機生成器和統計特性等。
分段統計分佈 包括伯努利分佈、二項分佈、泊松分佈、正態分佈、指數分佈等常見的離散機率分佈。這些分佈都有各自的密度函式、分佈函式、累積函式、隨機生成器和統計特性等。
統計測試 包括t檢驗、方差分析、卡方檢驗、相關係數檢驗、迴歸分析等常見的統計測試方法。這些測試方法可以用於假設檢驗和資料分析。
擬合統計模型 包括線性迴歸、邏輯迴歸、嶺迴歸等常見的迴歸模型,以及廣義線性模型等複雜模型。這些模型可以用於資料擬合和預測。
其他功能 包括分佈的隨機生成、分位數生成、隨機變數的數字特徵計算、矩母函式等其他實用功能。

2. 統計分佈示例

下面演示幾個透過scipy.stats子模組構建的統計分佈的示例。

2.1. 多項式分佈

多項式分佈是一種離散型機率分佈,用於描述在n次獨立重複試驗中,每次試驗中k個不同的結果出現的機率。其中n表示試驗次數,k表示要發生的結果數。

多項式分佈主要用於描述在實際問題中一些離散型隨機變數的機率分佈,
例如人類的壽命、產品的壽命、遺傳學中的多基因效應、網路中的連結數等。

構建一個多項式分佈的示例:
\(f(x_1,x_2,...,x_k;p_1,p_2,...,p_k,n)=\frac{n!}{x_1!...x_k!}p_1^{x_1}p_2^{x_2}...p_k^{x_k}\)

from scipy.stats import multinomial

N = 5
p = np.ones(N)/N

# 計算機率質量函式
multinomial.pmf([N,0,0,0,0], n=N, p=p)

# 基於引數n和p,從多項分佈中抽取隨機樣本
multinomial.rvs(n=100, p=p, size=5)
# 執行結果:
array([[25, 17, 16, 23, 19],
       [16, 23, 23, 19, 19],
       [19, 24, 14, 20, 23],
       [19, 22, 27, 16, 16],
       [15, 11, 30, 23, 21]])

size就是隨機樣本的個數,相當於返回的二維陣列的行數。
每行資料的數目就是引數p的長度(也就是程式碼中的N)。
每行資料加起來的就是 引數n(上面的示例中,二維陣列每行加起來的100

2.2. \(\beta\)分佈

\(\beta\)分佈是一種連續型機率分佈,用於描述區間[0,1]內某一隨機變數的機率分佈形態。
\(\beta\)分佈的機率密度函式由兩個引數αβ確定,它們分別控制分佈的左端點和右端點以及分佈的形狀。

\(\beta\)分佈主要用於描述在實際問題中一些變數在區間[0,1]內的機率分佈形態,
例如人類的能力、測試的得分、金融市場的收益率等。

構建一個\(\beta\)分佈的示例:
\(\begin{align*} f(x;a,b) = \frac{\varGamma(a+b)x^{a-1}(1-x)^{b-1}}{\varGamma(a)\varGamma(b)} \quad\quad 0 \le x \le 1 \end{align*}\)

from scipy.stats import beta

# 三種不同的 a,b 係數,分別為:
# a<b; a==b; a>b
params = [(1.5, 5.5), (5.5, 5.5), (5.5, 1.5)]
for p in params:
    a, b = p
    mean, var, skew, kurt = beta.stats(a, b, moments="mvsk")
    print(
        "平均數:{:.2f}, 方差:{:.2f}, 偏態:{:.2f}, 峰度係數:{:.2f}".format(
            mean,
            var,
            skew,
            kurt,
        )
    )

# 執行結果:
平均數:0.21, 方差:0.02, 偏態:0.88, 峰度係數:0.43
平均數:0.50, 方差:0.02, 偏態:0.00, 峰度係數:-0.43
平均數:0.79, 方差:0.02, 偏態:-0.88, 峰度係數:0.43

三種不同的分佈繪製成圖形的話:

from scipy.stats import beta
import numpy as np
import matplotlib.pyplot as plt

params = [(1.5, 5.5), (5.5, 5.5), (5.5, 1.5)]
labels = ["a=1.5,b=5.5", "a=5.5,b=5.5", "a=5.5,b=1.5"]
for idx, p in enumerate(params):
    a, b = p
    x = np.linspace(beta.ppf(0, a, b), beta.ppf(1, a, b), 100)
    plt.plot(x, beta.pdf(x, a, b),label=labels[idx])

plt.legend(loc="upper center")
plt.show()

image.png

從圖中可以體會,a, b兩個引數對分佈的影響。

2.3. 高斯分佈

高斯分佈,也稱為正態分佈(Normal distribution),是一種連續機率分佈,在自然界和社會科學領域中廣泛存在。
它的機率密度函式呈鐘形曲線,兩頭低,中間高,左右對稱,因此也被稱為鐘形曲線

高斯分佈主要用於描述許多自然現象和社會科學中的機率分佈形態,
例如人類的身高、人類的智商、動物的壽命、人類的壽命、產品的壽命、遺傳學中的多基因效應、網路中的連結數等。

構建一個高斯分佈的示例:
\(\begin{align*} f(x;\mu,\sigma)=\frac{1}{\sqrt{2\pi\sigma^2}}exp(-\frac{(x-\mu)^2}{\sigma^2}) \quad\quad -\infty \lt x \le \infty \end{align*}\)

from scipy.stats import norm

params = [(1, 2),(2, 2),(2, 1)]

for p in params:
    mu, sigma = p
    mean, var = norm.stats(loc=mu, scale=sigma, moments='mv')
    print(
        "平均數:{:.2f}, 方差:{:.2f}".format(
            mean,
            var,
        )
    )

# 執行結果:
平均數:1.00, 方差:4.00
平均數:2.00, 方差:4.00
平均數:2.00, 方差:1.00

從執行結果可以看出,\(\mu\)引數會影響結果的平均數\(\sigma\)引數則影響結果的方差

將結果繪製成圖形更好理解一些:

from scipy.stats import norm
import matplotlib.pyplot as plt

params = [(1, 2),(2, 2),(2, 1)]
labels = ["mu=1,sigma=2", "mu=2,sigma=2", "mu=2,sigma=1"]

for idx, p in enumerate(params):
    mu, sigma = p
    x = np.linspace(norm.ppf(0.01, mu, sigma), norm.ppf(0.99, mu, sigma), 100)
    plt.plot(x, norm.pdf(x, mu, sigma), label=labels[idx])

plt.legend(loc="upper left")
plt.show()

image.png
從圖中來看,\(\mu\)引數控制圖形左右偏移程度\(\sigma\)引數控制圖形的陡峭程度

3. 總結

總之,scipy.stats子模組為統計學和資料分析提供了豐富的工具和函式,可以幫助我們進行各種統計分析和資料處理任務。

不過,統計是一個非常大的領域,其中有些主題還是超出了 SciPy 的範圍,並被其他Python軟體包涵蓋。
比如其中一些比較著名的是statsmodelsPyMCscikit-learn等等。
遇到scipy.stats難以處理的問題時,可以看看這些庫中是否已經有解決方案。

相關文章