《利用Python進行數據分析》13章(中二)建模庫介紹

《利用Python進行數據分析》13章(中二)建模庫介紹

來自專欄 Python程序員7 人贊了文章

前文傳送門:

【翻譯】《利用Python進行數據分析·第2版》第1章 準備工作

【翻譯】《利用Python進行數據分析·第2版》第2章(上)Python語法基礎,IPython和Jupyter

【翻譯】《利用Python進行數據分析·第2版》第2章(中)Python語法基礎,IPython和Jupyter

【翻譯】《利用Python進行數據分析·第2版》第2章(下)Python語法基礎,IPython和Jupyter

【翻譯】《利用Python進行數據分析·第2版》第3章(上)Python的數據結構、函數和文件

【翻譯】《利用Python進行數據分析·第2版》第3章(中)Python的數據結構、函數和文件

【翻譯】《利用Python進行數據分析·第2版》第3章(下)Python的數據結構、函數和文件

【翻譯】《利用Python進行數據分析·第2版》第4章(上)NumPy基礎:數組和矢量計算

【翻譯】《利用Python進行數據分析·第2版》第4章(中)NumPy基礎:數組和矢量計算

【翻譯】《利用Python進行數據分析·第2版》第4章(下)NumPy基礎:數組和矢量計算

【翻譯】《利用Python進行數據分析·第2版》第5章(上)pandas入門

【翻譯】《利用Python進行數據分析·第2版》第5章(中)pandas入門

【翻譯】《利用Python進行數據分析·第2版》第5章(下)pandas入門

【翻譯】《利用Python進行數據分析·第2版》第6章(上) 數據載入、存儲與文件格式

【翻譯】《利用Python進行數據分析·第2版》第6章(中) 數據載入、存儲與文件格式

【翻譯】《利用Python進行數據分析·第2版》第6章(下) 數據載入、存儲與文件格式

【翻譯】《利用Python進行數據分析·第2版》第7章(上)數據清洗和準備

【翻譯】《利用Python進行數據分析·第2版》第7章(中) 數據清洗和準備

【翻譯】《利用Python進行數據分析·第2版》第7章(下) 數據清洗和準備

【翻譯】《利用Python進行數據分析·第2版》第8章(上) 數據規整:聚合、合併和重塑

【翻譯】《利用Python進行數據分析·第2版》第8章(中) 數據規整:聚合、合併和重塑

【翻譯】《利用Python進行數據分析·第2版》第8章(下) 數據規整:聚合、合併和重塑

【翻譯】《利用Python進行數據分析·第2版》第9章(上) 繪圖和可視化

【翻譯】《利用Python進行數據分析·第2版》第9章(中) 繪圖和可視化

【翻譯】《利用Python進行數據分析·第2版》第9章(下) 繪圖和可視化

【翻譯】《利用Python進行數據分析·第2版》第10章(上) 數據聚合與分組運算

【翻譯】《利用Python進行數據分析·第2版》第10章(中) 數據聚合與分組運算

【翻譯】《利用Python進行數據分析·第2版》第10章(下) 數據聚合與分組運算

【翻譯】《利用Python進行數據分析·第2版》第11章(上) 時間序列

【翻譯】《利用Python進行數據分析·第2版》第11章(中) 時間序列

【翻譯】《利用Python進行數據分析·第2版》第11章(中二) 時間序列

【翻譯】《利用Python進行數據分析·第2版》第11章(下) 時間序列

【翻譯】《利用Python進行數據分析·第2版》第12章(上) pandas高級應用

【翻譯】《利用Python進行數據分析·第2版》第12章(中) pandas高級應用

【翻譯】《利用Python進行數據分析·第2版》第12章(下) pandas高級應用

【翻譯】《利用Python進行數據分析·第2版》第13章(上) Python建模庫介紹

【翻譯】《利用Python進行數據分析·第2版》第13章(中) Python建模庫介紹

13.3 statsmodels介紹

statsmodels是Python進行擬合多種統計模型、進行統計試驗和數據探索可視化的庫。Statsmodels包含許多經典的統計方法,但沒有貝葉斯方法和機器學習模型。

statsmodels包含的模型有:

  • 線性模型,廣義線性模型和健壯線性模型
  • 線性混合效應模型
  • 方差(ANOVA)方法分析
  • 時間序列過程和狀態空間模型
  • 廣義矩估計

下面,我會使用一些基本的statsmodels工具,探索Patsy公式和pandasDataFrame對象如何使用模型介面。

估計線性模型

statsmodels有多種線性回歸模型,包括從基本(比如普通最小二乘)到複雜(比如迭代加權最小二乘法)的。

statsmodels的線性模型有兩種不同的介面:基於數組,和基於公式。它們可以通過API模塊引入:

import statsmodels.api as smimport statsmodels.formula.api as smf

為了展示它們的使用方法,我們從一些隨機數據生成一個線性模型:

def dnorm(mean, variance, size=1): if isinstance(size, int): size = size, return mean + np.sqrt(variance) * np.random.randn(*size)# For reproducibilitynp.random.seed(12345)N = 100X = np.c_[dnorm(0, 0.4, size=N), dnorm(0, 0.6, size=N), dnorm(0, 0.2, size=N)]eps = dnorm(0, 0.1, size=N)beta = [0.1, 0.3, 0.5]y = np.dot(X, beta) + eps

這裡,我使用了「真實」模型和可知參數beta。此時,dnorm可用來生成正太分布數據,帶有特定均值和方差。現在有:

In [66]: X[:5]Out[66]: array([[-0.1295, -1.2128, 0.5042], [ 0.3029, -0.4357, -0.2542], [-0.3285, -0.0253, 0.1384], [-0.3515, -0.7196, -0.2582], [ 1.2433, -0.3738, -0.5226]])In [67]: y[:5]Out[67]: array([ 0.4279, -0.6735, -0.0909, -0.4895,-0.1289])

像之前Patsy看到的,線性模型通常要擬合一個截距。sm.add_constant函數可以添加一個截距的列到現存的矩陣:

In [68]: X_model = sm.add_constant(X)In [69]: X_model[:5]Out[69]: array([[ 1. , -0.1295, -1.2128, 0.5042], [ 1. , 0.3029, -0.4357, -0.2542], [ 1. , -0.3285, -0.0253, 0.1384], [ 1. , -0.3515, -0.7196, -0.2582], [ 1. , 1.2433, -0.3738, -0.5226]])

sm.OLS類可以擬合一個普通最小二乘回歸:

In [70]: model = sm.OLS(y, X)

這個模型的fit方法返回了一個回歸結果對象,它包含估計的模型參數和其它內容:

In [71]: results = model.fit()In [72]: results.paramsOut[72]: array([ 0.1783, 0.223 , 0.501 ])

對結果使用summary方法可以列印模型的詳細診斷結果:

In [73]: print(results.summary())OLS Regression Results ==============================================================================Dep. Variable: y R-squared: 0.430Model: OLS Adj. R-squared: 0.413Method: Least Squares F-statistic: 24.42Date: Mon, 25 Sep 2017 Prob (F-statistic): 7.44e-12Time: 14:06:15 Log-Likelihood: -34.305No. Observations: 100 AIC: 74.61Df Residuals: 97 BIC: 82.42Df Model: 3 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975]------------------------------------------------------------------------------x1 0.1783 0.053 3.364 0.001 0.073 0.283x2 0.2230 0.046 4.818 0.000 0.131 0.315x3 0.5010 0.080 6.237 0.000 0.342 0.660==============================================================================Omnibus: 4.662 Durbin-Watson: 2.201Prob(Omnibus): 0.097 Jarque-Bera (JB): 4.098Skew: 0.481 Prob(JB): 0.129Kurtosis: 3.243 Cond. No.1.74==============================================================================Warnings:[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

這裡的參數名為原始的名字x1, x2等等。假設所有的模型參數都在一個DataFrame中:

In [74]: data = pd.DataFrame(X, columns=[col0, col1, col2])In [75]: data[y] = yIn [76]: data[:5]Out[76]: col0 col1 col2 y0 -0.129468 -1.212753 0.504225 0.4278631 0.302910 -0.435742 -0.254180 -0.6734802 -0.328522 -0.025302 0.138351 -0.0908783 -0.351475 -0.719605 -0.258215 -0.4894944 1.243269 -0.373799 -0.522629 -0.128941

現在,我們使用statsmodels的公式API和Patsy的公式字元串:

In [77]: results = smf.ols(y ~ col0 + col1 + col2, data=data).fit()In [78]: results.paramsOut[78]: Intercept 0.033559col0 0.176149col1 0.224826col2 0.514808dtype: float64In [79]: results.tvaluesOut[79]: Intercept 0.952188col0 3.319754col1 4.850730col2 6.303971dtype: float64

觀察下statsmodels是如何返回Series結果的,附帶有DataFrame的列名。當使用公式和pandas對象時,我們不需要使用add_constant。

給出一個樣本外數據,你可以根據估計的模型參數計算預測值:

In [80]: results.predict(data[:5])Out[80]: 0 -0.0023271 -0.1419042 0.0412263 -0.3230704 -0.100535dtype: float64

statsmodels的線性模型結果還有其它的分析、診斷和可視化工具。除了普通最小二乘模型,還有其它的線性模型。

估計時間序列過程

statsmodels的另一模型類是進行時間序列分析,包括自回歸過程、卡爾曼濾波和其它態空間模型,和多元自回歸模型。

用自回歸結構和雜訊來模擬一些時間序列數據:

init_x = 4import randomvalues = [init_x, init_x]N = 1000b0 = 0.8b1 = -0.4noise = dnorm(0, 0.1, N)for i in range(N): new_x = values[-1] * b0 + values[-2] * b1 + noise[i] values.append(new_x)

這個數據有AR(2)結構(兩個延遲),參數是0.8和-0.4。當你和AR模型,你可能不知道滯後項的個數,因此可以用較多的滯後量來擬合這個模型:

In [82]: MAXLAGS = 5In [83]: model = sm.tsa.AR(values)In [84]: results = model.fit(MAXLAGS)

結果中的估計參數首先是截距,其次是前兩個參數的估計值:

In [85]: results.paramsOut[85]: array([-0.0062, 0.7845, -0.4085, -0.0136, 0.015 , 0.0143])

更多的細節以及如何解釋結果超出了本書的範圍,可以通過statsmodels文檔學習更多。


推薦閱讀:

0019數據處理:數據計算之加減乘除和平均數
一起學習數據分析專欄正式開通!撒花
種一棵樹最好的時間是十年前,而後是現在
機器學習搞定移動數據分析
四月將至,B站這些番值得回味

TAG:Python | 數據分析 | 建模 |