四十四、Python中的statsmodels模块

@Author:Runsen

文章目录

statsmodels入门

这个非常简单的案例研究旨在让您快速上手 statsmodels。从原始数据开始,我们将展示估计统计模型和绘制诊断图所需的步骤。我们只使用由statsmodels它或它pandas和patsy 依赖项提供的函数。

来源:http://www.statsmodels.org/stable/gettingstarted.html

import statsmodels.api as sm
import pandas
from patsy import dmatrices # patsy用于描述统计模型和使用类似公式构建设计矩阵R
#下载了Guerry数据集,这是一组历史数据,用于支持Andre-Michel Guerry在1833年 关于法国道德统计的论文。

df = sm.datasets.get_rdataset("Guerry", "HistData").data
df.head()
deptRegionDepartmentCrime_persCrime_propLiteracyDonationsInfantsSuicidesMainCity...Crime_parentsInfanticideDonation_clergyLotteryDesertionInstructionProstitutesDistanceAreaPop1831
01EAin288701589037509833120350392:Med...71606941554613218.3725762346.03
12NAisne26226552151890114572128312:Med...4823638822432765.9457369513.00
23CAllier2674779251310973170441141212:Med...46427666168534161.9277340298.26
34EBasses-Alpes12935728946273323018142381:Sm...7012378032292351.3996925155.90
45EHautes-Alpes17488817469696223076161711:Sm...222364793571320.2805549129.10

5 rows × 23 columns

df.columns
Index(['dept', 'Region', 'Department', 'Crime_pers', 'Crime_prop', 'Literacy',
       'Donations', 'Infants', 'Suicides', 'MainCity', 'Wealth', 'Commerce',
       'Clergy', 'Crime_parents', 'Infanticide', 'Donation_clergy', 'Lottery',
       'Desertion', 'Instruction', 'Prostitutes', 'Distance', 'Area',
       'Pop1831'],
      dtype='object')
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 86 entries, 0 to 85
Data columns (total 23 columns):
dept               86 non-null int64
Region             85 non-null object
Department         86 non-null object
Crime_pers         86 non-null int64
Crime_prop         86 non-null int64
Literacy           86 non-null int64
Donations          86 non-null int64
Infants            86 non-null int64
Suicides           86 non-null int64
MainCity           86 non-null object
Wealth             86 non-null int64
Commerce           86 non-null int64
Clergy             86 non-null int64
Crime_parents      86 non-null int64
Infanticide        86 non-null int64
Donation_clergy    86 non-null int64
Lottery            86 non-null int64
Desertion          86 non-null int64
Instruction        86 non-null int64
Prostitutes        86 non-null int64
Distance           86 non-null float64
Area               86 non-null int64
Pop1831            86 non-null float64
dtypes: float64(2), int64(18), object(3)
memory usage: 15.5+ KB
# 在地区Region  85 non-null object有缺失值
df = df.dropna()

法国86个省的识字率是否与19世纪20年代皇家彩票的人均赌注有关。

我们需要控制每个部门的财富水平,在回归方程的右侧包含一系列虚拟变量,以控制由于区域效应而导致的未观察到的异质性。

使用普通最小二乘回归(OLS)估计模型。

# 使用patsy的dmatrices函数来创建设计矩阵
#  y 是一个 N×1关于人均彩票投注数据的一栏(彩票)。X 是 N×7带有截距, 识字和财富变量,以及4个区域二进制变量
y, X = dmatrices('Lottery ~ Literacy + Wealth + Region', data=df, return_type='dataframe')
y[:3]
Lottery
041.0
138.0
266.0
X[:3]
InterceptRegion[T.E]Region[T.N]Region[T.S]Region[T.W]LiteracyWealth
01.01.00.00.00.037.073.0
11.00.01.00.00.051.022.0
21.00.00.00.00.013.061.0
# 模型拟合和总结
mod = sm.OLS(y, X)    # Describe model

res = mod.fit()       # Fit model

print(res.summary())   # Summarize model
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                Lottery   R-squared:                       0.338
Model:                            OLS   Adj. R-squared:                  0.287
Method:                 Least Squares   F-statistic:                     6.636
Date:                Thu, 09 May 2019   Prob (F-statistic):           1.07e-05
Time:                        18:02:22   Log-Likelihood:                -375.30
No. Observations:                  85   AIC:                             764.6
Df Residuals:                      78   BIC:                             781.7
Df Model:                           6                                         
Covariance Type:            nonrobust                                         
===============================================================================
                  coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------
Intercept      38.6517      9.456      4.087      0.000      19.826      57.478
Region[T.E]   -15.4278      9.727     -1.586      0.117     -34.793       3.938
Region[T.N]   -10.0170      9.260     -1.082      0.283     -28.453       8.419
Region[T.S]    -4.5483      7.279     -0.625      0.534     -19.039       9.943
Region[T.W]   -10.0913      7.196     -1.402      0.165     -24.418       4.235
Literacy       -0.1858      0.210     -0.886      0.378      -0.603       0.232
Wealth          0.4515      0.103      4.390      0.000       0.247       0.656
==============================================================================
Omnibus:                        3.049   Durbin-Watson:                   1.785
Prob(Omnibus):                  0.218   Jarque-Bera (JB):                2.694
Skew:                          -0.340   Prob(JB):                        0.260
Kurtosis:                       2.454   Cond. No.                         371.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
res.params
Intercept      38.651655
Region[T.E]   -15.427785
Region[T.N]   -10.016961
Region[T.S]    -4.548257
Region[T.W]   -10.091276
Literacy       -0.185819
Wealth          0.451475
dtype: float64
# 应用Rainbow测试线性度
print(sm.stats.linear_rainbow(res))#第一个数字是F统计量,第二个数字是p值。
sm.graphics.plot_partregress('Lottery', 'Wealth', ['Region', 'Literacy'],
                          data=df, obs_labels=False)
(0.847233997615691, 0.6997965543621644)

对于statsmodels确实是一个值得学习的机器学习库

参考:http://www.statsmodels.org/stable/gettingstarted.html

刘润森! CSDN认证博客专家 Python Java 前端
17年就读于东莞XX学院化学工程与工艺专业,GitChat作者。Runsen的微信公众号是"Python之王",因为Python入了IT的坑,从此不能自拔。公众号内容涉及Python,Java计算机、杂谈。干货与情怀同在。喜欢的微信搜索:「Python之王」。个人微信号:RunsenLiu。不关注我公号一律拉黑!!!
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值