跳轉到

8.3 連續分布#

本節目標#

  • 認識機率密度函數(pdf)與「機率即面積」的積分觀點(連結 5.3)
  • 使用 sympy.stats 的 Normal() 與 Uniform() 建立連續隨機變數
  • 對連續分布用 P() 計算區間機率
  • 熟悉標準常態分布的經典值 \(P(-1 < Z < 1)\) 等
  • 實驗:畫常態 pdf 並用 integrate 驗證面積

pdf 與積分#

連續隨機變數取任一「特定值」的機率為 0,機率只能落在區間上。此時改用機率密度函數(pdf) \(f(x)\) 描述分布:

\[ P(a < X \le b) = \int_a^b f(x)\, dx \]

pdf 必須滿足兩個條件:

\[ f(x) \ge 0, \qquad \int_{-\infty}^{\infty} f(x)\, dx = 1 \]

這正是第 5.3 節定積分「曲線下面積」的應用:機率就是 pdf 曲線下的面積。累積分布函數(cdf)定義為

\[ F(x) = P(X \le x) = \int_{-\infty}^{x} f(t)\, dt, \qquad F'(x) = f(x) \]

Uniform():均勻分布#

在區間 \([a, b]\) 上「等可能」落點的模型是均勻分布,其 pdf 為

\[ f(x) = \begin{cases} \dfrac{1}{b - a} & a \le x \le b \\ 0 & \text{其他} \end{cases} \]
from sympy.stats import Uniform, E, P, variance, density, cdf
from sympy import integrate, Symbol, simplify

X = Uniform('X', 0, 1)          # [0, 1] 上的均勻分布

print(density(X))               # UniformDistribution(0, 1)
print(E(X))                     # 1/2
print(variance(X))              # 1/12

# P(0.25 < X < 0.75) 就是 pdf 在該區間的積分
print(P(X < Rational(3, 4)) - P(X < Rational(1, 4)))   # 1/2

手算對照:pdf 為常數 \(1\) ,所以 \(P(1/4 < X < 3/4) = \int_{1/4}^{3/4} 1\, dx = 1/2\) 。用 integrate 直接驗證:

from sympy import integrate, Symbol, Rational

x = Symbol('x', real=True)
area = integrate(1, (x, Rational(1, 4), Rational(3, 4)))
print(area)          # 1/2

# 驗證 pdf 的兩個條件
print(integrate(1, (x, 0, 1)))           # 總面積 = 1
print(E(Uniform('U', 0, 1)))             # 1/2

Normal():常態分布#

常態分布 \(N(\mu, \sigma^2)\) 是最重要的連續分布,pdf 為著名的鐘形曲線:

\[ f(x) = \frac{1}{\sigma \sqrt{2\pi}}\, e^{-\frac{(x - \mu)^2}{2\sigma^2}} \]
from sympy.stats import Normal, E, P, variance, std, density, cdf
from sympy import simplify, pi, exp, sqrt, Symbol

X = Normal('X', mu=0, sigma=1)       # 標準常態 Z
print(simplify(density(X)(Symbol('x'))))
# sqrt(2)*exp(-x**2/2)/(2*sqrt(pi))

print(E(X))            # 0
print(variance(X))     # 1

Y = Normal('Y', mu=170, sigma=10)    # 例如:身高模型
print(E(Y))            # 170
print(std(Y))          # 10

注意 SymPy 的參數是 sigma(標準差),不是變異數。

連續分布的 P() 計算#

對連續隨機變數,P(條件) 會在內部對 pdf 積分,結果是精確符號值:

from sympy.stats import Normal, P
from sympy import Rational, sqrt, pi

Z = Normal('Z', 0, 1)

print(P(Z < 0))                  # 1/2(對稱性)
print(P(Z < 1))                  # sqrt(2)*(2 + erf(sqrt(2)/2))/4
print(P(Z < 1).evalf(6))         # 0.841345
print(P(Z > 2).evalf(6))         # 0.0227501
print(P(Rational(-1, 2) < Z).evalf(6))   # 0.691462

結果中的 erf 是誤差函數 \(\mathrm{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} dt\) ,常態cdf 正是用它表達的;這也解釋了為什麼常態機率沒有初等封閉形式、查表是必要的。

標準化與經典值#

若 \(X \sim N(\mu, \sigma^2)\) ,令

\[ Z = \frac{X - \mu}{\sigma} \]

則 \(Z \sim N(0, 1)\) 。標準化把任意常態問題化成標準常態查表問題。三個必背的經典值(68–95–99.7 法則):

\[ P(-1 < Z < 1) \approx 0.6827, \quad P(-2 < Z < 2) \approx 0.9545, \quad P(-3 < Z < 3) \approx 0.9973 \]

用 SymPy 精確驗證:

from sympy.stats import Normal, P, E
from sympy import Rational, simplify, nsimplify

Z = Normal('Z', 0, 1)
X = Normal('X', 170, 10)     # 身高模型

# 經典值
for k in [1, 2, 3]:
    p = P(-k < Z) - P(k < Z)          # P(-k < Z < k)
    print(f"P(-{k} < Z < {k}) =", p.evalf(4))

# 68–95–99.7
# P(-1 < Z < 1) ≈ 0.6827, P(-2 < Z < 2) ≈ 0.9545, P(-3 < Z < 3) ≈ 0.9973

# 標準化:P(160 < X < 180) 等價於 P(-1 < Z < 1)
p1 = P(160 < X) - P(180 < X)                    # SymPy 直接算
p2 = P(-1 < Z) - P(1 < Z)                       # 標準化後算
print(simplify(p1 - p2))                        # 0 → 兩者相等
print(p1.evalf(4))                              # 0.6827

# 另一個例子:P(X > 185) = P(Z > 1.5)
print((P(185 < X)).evalf(4))                    # 0.06681

動手實驗:畫常態 pdf 並用 integrate 驗證面積#

先畫出標準常態的鐘形曲線,並標出 \(\pm 1\) 之間的面積:

import matplotlib.pyplot as plt
import numpy as np
from sympy.stats import Normal, density
from sympy import Symbol, lambdify, integrate, sqrt, pi, exp

Z = Normal('Z', 0, 1)
x = Symbol('x', real=True)
f = lambdify(x, density(Z)(x), 'numpy')

xs = np.linspace(-4, 4, 400)
ys = f(xs)

plt.plot(xs, ys, 'b-', lw=2, label='N(0, 1) pdf')
x_fill = np.linspace(-1, 1, 100)
plt.fill_between(x_fill, f(x_fill), alpha=0.3,
                 label='P(-1 < Z < 1) ≈ 0.683')
plt.xlabel('x')
plt.ylabel('density')
plt.legend()
plt.show()

再用 integrate 從頭驗證 pdf 的性質與經典面積:

from sympy import integrate, Symbol, sqrt, pi, exp, simplify, N
from sympy.stats import Normal, P

x = Symbol('x', real=True)
f = exp(-x**2 / 2) / sqrt(2 * pi)     # 標準常態 pdf,手動輸入

from sympy import oo

# 條件一:總面積 = 1
print(integrate(f, (x, -oo, oo)))            # 1

# 條件二:對稱性 → P(Z < 0) = 1/2
print(integrate(f, (x, -oo, 0)))             # 1/2

# 經典值:P(-1 < Z < 1),SymPy 用 erf 表達
area = integrate(f, (x, -1, 1))
print(simplify(area))                        # erf(sqrt(2)/2)
print(N(area, 5))                            # 0.68269

# 與 sympy.stats 的 P() 對照
Z = Normal('Z', 0, 1)
print(N(P(-1 < Z) - P(1 < Z), 5))            # 0.68269

試著修改實驗:

  1. 把填色區域改成 \((-2, 2)\) 與 \((-3, 3)\) ,重畫圖形並驗證 95% 與 99.7%。
  2. 畫 \(N(0, 1)\) 、 \(N(0, 2)\) 、 \(N(2, 1)\) 三條 pdf 在同一張圖,觀察 \(\sigma\) 與 \(\mu\) 的效果。
  3. 對 Uniform('U', 0, 1) 畫 pdf 並用 integrate 驗證 \(E[U] = \int_0^1 x \, dx = 1/2\) (期望值也是積分: \(E[g(X)] = \int g(x) f(x)\, dx\) )。
  4. 用 lambdify 把 density(Y)(x)( \(Y \sim N(170, 10)\) )轉成函數,畫出身高分布並標出 \(160 \sim 180\) 的填色區域。

小結與練習#

  • 連續隨機變數用 pdf 描述,機率是 pdf 曲線下的面積: \(P(a < X \le b) = \int_a^b f(x)\, dx\)
  • Uniform(a, b) 與 Normal(mu, sigma) 是兩個基本連續模型;P() 自動完成符號積分
  • 常態機率以誤差函數 erf 表達,沒有初等封閉形式
  • 標準化 \(Z = (X - \mu)/\sigma\) 把任意常態化成 \(N(0, 1)\)
  • 68–95–99.7 法則: \(P(-k < Z < k) \approx 0.683, 0.955, 0.997\) ( \(k = 1, 2, 3\) )

練習

  1. 對 \(X \sim \mathrm{Uniform}(0, 2)\) ,手算並用 P() 驗證 \(P(1/2 < X < 3/2)\) 與 \(\mathrm{Var}(X)\) 。
  2. 對 \(Z \sim N(0, 1)\) ,求 \(P(|Z| < 0.5)\) 與 \(P(Z < -1)\) ,並說明後者與 \(P(Z > 1)\) 的關係。
  3. 某考試成績 \(\sim N(70, 8^2)\) ,求及格( \(\ge 60\) )機率與前 10% 的分數門檻(可用數值求解 solve)。
  4. 用 integrate 證明對任意 \(\mu, \sigma > 0\) , \(N(\mu, \sigma)\) 的 pdf 積分為 1。
  5. 用 E() 計算 \(E[Z^2]\) 與 \(E[Z^4]\) ,驗證標準常態的峰度(kurtosis) \(E[Z^4] = 3\) 。