Statsmodels庫介紹與常用方法
Statsmodels 是一個強大的 Python 庫,專注于統計建模和數據分析,廣泛應用于經濟學、金融、生物統計等領域。它提供了豐富的統計模型、假設檢驗和數據探索工具,適合進行回歸分析、時間序列分析等任務。本文將介紹 Statsmodels 的核心功能,并通過代碼示例展示其常用方法。
Statsmodels 簡介
Statsmodels 建立在 NumPy 和 SciPy 的基礎上,提供了易于使用的接口來實現線性回歸、廣義線性模型(GLM)、時間序列分析(如 ARIMA)、假設檢驗等功能。與 Scikit-learn 不同,Statsmodels 更側重于統計推斷,提供詳細的統計結果(如 p 值、置信區間等),適合需要深入分析的場景。
安裝 Statsmodels:
pip install statsmodels
常用方法與代碼示例
以下是 Statsmodels 中常用的功能模塊及其方法,附帶代碼示例。
- 線性回歸(Linear Regression)
Statsmodels 的 OLS(普通最小二乘法)是進行線性回歸的核心工具。它可以擬合模型并返回詳細的統計結果。
示例:簡單線性回歸
import numpy as np
import statsmodels.api as sm
import pandas as pd# 生成示例數據
np.random.seed(0)
X = np.random.rand(100, 1) * 10
y = 2 * X.flatten() + np.random.normal(0, 1, 100)# 添加常數項(截距)
X = sm.add_constant(X)# 擬合 OLS 模型
model = sm.OLS(y, X).fit()# 輸出模型摘要
print(model.summary())
說明:
sm.add_constant:為自變量添加常數列以擬合截距。
model.summary():輸出詳細的統計結果,包括 R2、系數、p 值等。
2. 廣義線性模型(GLM)
GLM 擴展了線性回歸,適用于非正態分布的因變量(如二項分布、泊松分布)。
示例:邏輯回歸(Logistic Regression)
import statsmodels.api as sm
import pandas as pd# 加載示例數據集
data = sm.datasets.get_rdataset("iris", "datasets").data
# 二分類:將鳶尾花數據集簡化為二分類問題
data = data[data['Species'].isin(['setosa', 'versicolor'])]
X = data[['Sepal.Length', 'Sepal.Width']]
y = (data['Species'] == 'setosa').astype(int)# 添加常數項
X = sm.add_constant(X)# 擬合邏輯回歸模型
model = sm.GLM(y, X, family=sm.families.Binomial()).fit()# 輸出結果
print(model.summary())
說明:
sm.GLM:指定 family 參數(如 Binomial)以實現邏輯回歸。
結果包括系數、標準誤、z 值等,便于假設檢驗。
3. 時間序列分析(ARIMA)
Statsmodels 提供強大的時間序列分析工具,如 ARIMA 模型,適用于預測和建模時間序列數據。
示例:ARIMA 模型
import statsmodels.api as sm
import pandas as pd# 加載示例數據集(空氣乘客數據)
data = sm.datasets.get_rdataset("AirPassengers", "datasets").data
y = data['value']# 擬合 ARIMA(1,1,1) 模型
model = sm.tsa.ARIMA(y, order=(1, 1, 1)).fit()# 預測未來 12 個時間點
forecast = model.forecast(steps=12)
print("預測值:", forecast)# 繪制結果
import matplotlib.pyplot as plt
plt.plot(y, label='實際值')
plt.plot(range(len(y), len(y) + 12), forecast, label='預測值')
plt.legend()
plt.savefig('arima_forecast.png')
說明:
sm.tsa.ARIMA:指定 (p,d,q) 參數以定義模型階數。
forecast:用于預測未來值。
使用 matplotlib 繪制結果,保存為圖片。
4. 假設檢驗
Statsmodels 提供多種統計檢驗工具,如 t 檢驗、卡方檢驗等。
示例:獨立樣本 t 檢驗
import statsmodels.stats.api as sm_stats
import numpy as np# 生成兩組樣本數據
np.random.seed(0)
group1 = np.random.normal(10, 2, 50)
group2 = np.random.normal(11, 2, 50)# 執行 t 檢驗
t_stat, p_value, df = sm_stats.ttest_ind(group1, group2)
print(f"t 統計量: {t_stat}, p 值: {p_value}")
說明:
ttest_ind:用于比較兩組獨立樣本的均值差異。
輸出 t 統計量和 p 值,用于判斷顯著性。
更多的用法請查看官方文檔,https://www.statsmodels.org/。
SciPy庫介紹與常用方法
SciPy 是一個基于 Python 的開源科學計算庫,廣泛應用于數學、科學和工程領域。它建立在 NumPy 的基礎上,提供了高效的數值計算工具,涵蓋優化、積分、插值、信號處理、線性代數等功能。本文將介紹 SciPy 的核心功能,并通過代碼示例展示其常用方法。
SciPy 簡介
SciPy 是一個模塊化的庫,包含多個子模塊,每個子模塊專注于特定領域的計算任務,例如:
scipy.optimize
:優化算法scipy.integrate
:數值積分scipy.interpolate
:插值scipy.signal
:信號處理scipy.linalg
:線性代數scipy.stats
:統計分析
SciPy 與 NumPy、Matplotlib 等庫無縫集成,適合科學計算和數據分析。
安裝 SciPy:
pip install scipy
常用方法與代碼示例
以下是 SciPy 中幾個常用子模塊及其方法的介紹,附帶代碼示例。
- 優化(Optimization)
scipy.optimize 提供了多種優化算法,用于尋找函數的最優解(如最小值)。
示例:最小化函數
import numpy as np
from scipy.optimize import minimize# 定義目標函數
def objective(x):return x[0]**2 + x[1]**2# 初始猜測
x0 = np.array([1.0, 1.0])# 最小化目標函數
result = minimize(objective, x0, method='BFGS')
print("最優解:", result.x)
print("最小值:", result.fun)
說明:
minimize:通過指定優化方法(如 BFGS)尋找函數最小值。
輸出包括最優參數 result.x 和目標函數值 result.fun。
2. 數值積分(Integration)
scipy.integrate 提供了數值積分工具,適用于單重積分、雙重積分等。
示例:單重積分
from scipy.integrate import quad# 定義被積函數
def f(x):return np.sin(x)# 計算 sin(x) 從 0 到 π 的積分
result, error = quad(f, 0, np.pi)
print("積分結果:", result)
print("估計誤差:", error)
說明:
quad:計算定積分,返回積分結果和誤差估計。
上述例子計算 sin(x) 從 0 到 π 的積分為 2。
3. 插值(Interpolation)
scipy.interpolate 用于在離散數據點之間進行插值,生成平滑的函數。
示例:一維插值
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt# 生成示例數據
x = np.linspace(0, 10, 10)
y = np.sin(x)# 創建線性插值函數
f_linear = interp1d(x, y, kind='linear')# 生成密集的 x 值用于繪制插值結果
x_dense = np.linspace(0, 10, 100)
y_linear = f_linear(x_dense)# 繪制結果
plt.plot(x, y, 'o', label='數據點')
plt.plot(x_dense, y_linear, '-', label='線性插值')
plt.legend()
plt.savefig('interpolation.png')
說明:
interp1d:生成一維插值函數,支持線性、二次、三次插值等。
使用 Matplotlib 繪制原始數據點和插值曲線。
4. 線性代數(Linear Algebra)
scipy.linalg 提供了豐富的線性代數工具,如矩陣分解、求逆、特征值計算等。
示例:求解線性方程組
from scipy.linalg import solve
import numpy as np# 定義系數矩陣 A 和常數向量 b
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])# 求解 Ax = b
x = solve(A, b)
print("解:", x)
說明:
solve:求解線性方程組 Ax = b,返回解向量 x。
上述例子解方程組 3x + y = 9, x + 2y = 8。
5. 統計分析(Statistics)
scipy.stats 提供概率分布、統計檢驗等工具。
示例:正態分布擬合
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt# 生成正態分布的樣本數據
np.random.seed(0)
data = np.random.normal(loc=0, scale=1, size=1000)# 擬合正態分布
mu, sigma = norm.fit(data)
print("均值:", mu, "標準差:", sigma)# 繪制數據直方圖和擬合曲線
plt.hist(data, bins=30, density=True, alpha=0.5, label='數據')
x = np.linspace(-3, 3, 100)
plt.plot(x, norm.pdf(x, mu, sigma), 'r-', label='擬合正態分布')
plt.legend()
plt.savefig('normal_fit.png')
說明:
norm.fit:擬合正態分布,估計均值和標準差。
使用 norm.pdf 繪制概率密度函數。
更多詳細信息請查閱官方文檔,https://docs.scipy.org/doc/scipy/