statsmodels
是一个Python
模块,它提供对许多不同统计模型估计的类和函数,并且可以进行统计测试和统计数据的探索。
说实话,statsmodels
这个词我总是记不住,但是国宝“熊猫”这个单词pandas
我还是记得住的,因此每次我打开statsmodels
的方式是:
pandas
,然后进入pandas官网documentation
进入对应标签页面pandas Ecosystem
标签pandas
生态环境就下的第一个标签就是Statsmodels
库,选择该标签由此也可看出,Statsmodels
库是非常有用的,否则怎么能放在 pandas 生态环境下的第一个标签
上呢?
查看Statsmodels
的目录,发现其包含了24个主要标签,我们打开源文件,省略所有test目录
后可以看到其目录树如下:
│ api.py
│ info.py
│ test.txt
│ version.py
│ __init__.py
│
├─base
│ │ covtype.py
│ │ data.py
│ │ elastic_net.py
│ │ l1_cvxopt.py
│ │ l1_slsqp.py
│ │ l1_solvers_common.py
│ │ model.py
│ │ optimizer.py
│ │ wrapper.py
│ │ _constraints.py
│ │ _penalties.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─compat
│ │ collections.py
│ │ counter.py
│ │ numpy.py
│ │ ordereddict.py
│ │ pandas.py
│ │ python.py
│ │ scipy.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─datasets
│ │ template_data.py
│ │ utils.py
│ │ __init__.py
│ │
│ ├─anes96
│ │ │ anes96.csv
│ │ │ data.py
│ │ └─ __init__.py
│ │
│ │
│ ├─cancer
│ │ │ cancer.csv
│ │ │ data.py
│ │ └─ __init__.py
│ │
│ │
│ ├─ccard
│ │ │ ccard.csv
│ │ │ data.py
│ │ └─ __init__.py
│ │
│ ├─china_smoking
│ │ │ china_smoking.csv
│ │ │ data.py
│ │ │ __init__.py
│ │ │
│ │
│ ├─co2
│ │ │ co2.csv
│ │ │ data.py
│ │ │ __init__.py
│ │ │
│ │
│ ├─committee
│ │ │ committee.csv
│ │ │ data.py
│ │ │ __init__.py
│ │ │
│ │
│ ├─copper
│ │ │ copper.csv
│ │ │ data.py
│ │ │ __init__.py
│ │ │
│ │
│ ├─cpunish
│ │ │ cpunish.csv
│ │ │ data.py
│ │ │ __init__.py
│ │ │
│ │
│ ├─elnino
│ │ │ data.py
│ │ │ elnino.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─engel
│ │ │ data.py
│ │ │ engel.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─fair
│ │ │ data.py
│ │ │ fair.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─fertility
│ │ │ data.py
│ │ │ fertility.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─grunfeld
│ │ │ data.py
│ │ │ grunfeld.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─heart
│ │ │ data.py
│ │ │ heart.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─longley
│ │ │ data.py
│ │ │ longley.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─macrodata
│ │ │ data.py
│ │ │ macrodata.csv
│ │ │ macrodata.dta
│ │ │ __init__.py
│ │ │
│ │
│ ├─modechoice
│ │ │ data.py
│ │ │ modechoice.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─nile
│ │ │ data.py
│ │ │ nile.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─randhie
│ │ │ data.py
│ │ │ randhie.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─scotland
│ │ │ data.py
│ │ │ scotvote.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─spector
│ │ │ data.py
│ │ │ spector.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─stackloss
│ │ │ data.py
│ │ │ stackloss.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─star98
│ │ │ data.py
│ │ │ star98.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─statecrime
│ │ │ data.py
│ │ │ statecrime.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─strikes
│ │ │ data.py
│ │ │ strikes.csv
│ │ │ __init__.py
│ │ │
│ │
│ ├─sunspots
│ │ │ data.py
│ │ │ sunspots.csv
│ │ │ __init__.py
│ │ │
│ │
│ └─tests
│ └─ ...(省略)
│
├─discrete
│ │ discrete_margins.py
│ │ discrete_model.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─distributions
│ │ edgeworth.py
│ │ empirical_distribution.py
│ │ mixture_rvs.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─duration
│ │ api.py
│ │ hazard_regression.py
│ │ survfunc.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─emplike
│ │ aft_el.py
│ │ api.py
│ │ descriptive.py
│ │ elanova.py
│ │ elregress.py
│ │ koul_and_mc.py
│ │ originregress.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─formula
│ │ api.py
│ │ formulatools.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─genmod
│ │ api.py
│ │ cov_struct.py
│ │ generalized_estimating_equations.py
│ │ generalized_linear_model.py
│ │ _prediction.py
│ │ _tweedie_compound_poisson.py
│ │ __init__.py
│ │
│ ├─families
│ │ │ family.py
│ │ │ links.py
│ │ │ varfuncs.py
│ │ │ __init__.py
│ │ │
│ │ └─tests
│ │ └─ ...(省略)
│ │
│ └─tests
│ └─ ...(省略)
│
├─graphics
│ │ api.py
│ │ boxplots.py
│ │ correlation.py
│ │ dotplots.py
│ │ factorplots.py
│ │ functional.py
│ │ gofplots.py
│ │ mosaicplot.py
│ │ plottools.py
│ │ plot_grids.py
│ │ regressionplots.py
│ │ tsaplots.py
│ │ tukeyplot.py
│ │ utils.py
│ │ _regressionplots_doc.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─imputation
│ │ mice.py
│ │ ros.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─interface
│ │ __init__.py
│ │
│ └─__pycache__
│ __init__.cpython-36.pyc
│
├─iolib
│ │ api.py
│ │ foreign.py
│ │ openfile.py
│ │ smpickle.py
│ │ stata_summary_examples.py
│ │ summary.py
│ │ summary2.py
│ │ table.py
│ │ tableformatting.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─miscmodels
│ │ api.py
│ │ count.py
│ │ nonlinls.py
│ │ tmodel.py
│ │ try_mlecov.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─multivariate
│ │ pca.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
│
├─nonparametric
│ │ api.py
│ │ bandwidths.py
│ │ kde.py
│ │ kdetools.py
│ │ kernels.py
│ │ kernel_density.py
│ │ kernel_regression.py
│ │ linbin.cp36-win_amd64.pyd
│ │ smoothers_lowess.py
│ │ smoothers_lowess_old.py
│ │ _kernel_base.py
│ │ _smoothers_lowess.cp36-win_amd64.pyd
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─regression
│ │ feasible_gls.py
│ │ linear_model.py
│ │ mixed_linear_model.py
│ │ quantile_regression.py
│ │ recursive_ls.py
│ │ _prediction.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─resampling
│ │ __init__.py
│ │
│ └─__pycache__
│ __init__.cpython-36.pyc
│
├─robust
│ │ norms.py
│ │ robust_linear_model.py
│ │ scale.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─sandbox
│ │ bspline.py
│ │ contrast_old.py
│ │ cox.py
│ │ descstats.py
│ │ formula.py
│ │ gam.py
│ │ infotheo.py
│ │ km_class.py
│ │ mle.py
│ │ multilinear.py
│ │ pca.py
│ │ predict_functional.py
│ │ rls.py
│ │ survival.py
│ │ survival2.py
│ │ sysreg.py
│ │ utils_old.py
│ │ __init__.py
│ │
│ ├─archive
│ │ │ linalg_covmat.py
│ │ │ linalg_decomp_1.py
│ │ │ tsa.py
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ linalg_covmat.cpython-36.pyc
│ │ linalg_decomp_1.cpython-36.pyc
│ │ tsa.cpython-36.pyc
│ │ __init__.cpython-36.pyc
│ │
│ ├─datarich
│ │ │ factormodels.py
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ factormodels.cpython-36.pyc
│ │ __init__.cpython-36.pyc
│ │
│ ├─distributions
│ │ │ copula.py
│ │ │ estimators.py
│ │ │ extras.py
│ │ │ genpareto.py
│ │ │ gof_new.py
│ │ │ multivariate.py
│ │ │ mv_measures.py
│ │ │ mv_normal.py
│ │ │ otherdist.py
│ │ │ quantize.py
│ │ │ sppatch.py
│ │ │ transformed.py
│ │ │ transform_functions.py
│ │ │ try_max.py
│ │ │ try_pot.py
│ │ │ __init__.py
│ │ │
│ │ ├─examples
│ │ │ │ ex_extras.py
│ │ │ │ ex_fitfr.py
│ │ │ │ ex_gof.py
│ │ │ │ ex_mvelliptical.py
│ │ │ │ ex_transf2.py
│ │ │ │ matchdist.py
│ │ │ └─ __init__.py
│ │ │
│ │ └─tests
│ │ └─ ...(省略)
│ │
│ ├─mcevaluate
│ │ │ arma.py
│ │ └─ __init__.py
│ │
│ │
│ ├─nonparametric
│ │ │ densityorthopoly.py
│ │ │ dgp_examples.py
│ │ │ kde2.py
│ │ │ kdecovclass.py
│ │ │ kernels.py
│ │ │ kernel_extras.py
│ │ │ smoothers.py
│ │ │ testdata.py
│ │ │ __init__.py
│ │ │
│ │ └─tests
│ │ └─ ...(省略)
│ │
│ ├─panel
│ │ │ correlation_structures.py
│ │ │ mixed.py
│ │ │ panelmod.py
│ │ │ panel_short.py
│ │ │ random_panel.py
│ │ │ sandwich_covariance.py
│ │ │ sandwich_covariance_generic.py
│ │ │ __init__.py
│ │ │
│ │ └─tests
│ │ └─ ...(省略)
│ │
│ ├─regression
│ │ │ anova_nistcertified.py
│ │ │ ar_panel.py
│ │ │ example_kernridge.py
│ │ │ gmm.py
│ │ │ kernridgeregress_class.py
│ │ │ ols_anova_original.py
│ │ │ onewaygls.py
│ │ │ penalized.py
│ │ │ predstd.py
│ │ │ runmnl.py
│ │ │ sympy_diff.py
│ │ │ tools.py
│ │ │ treewalkerclass.py
│ │ │ try_catdata.py
│ │ │ try_ols_anova.py
│ │ │ try_treewalker.py
│ │ │ __init__.py
│ │ │
│ │ └─tests
│ │ └─ ...(省略)
│ │
│ ├─stats
│ │ │ contrast_tools.py
│ │ │ diagnostic.py
│ │ │ ex_newtests.py
│ │ │ multicomp.py
│ │ │ runs.py
│ │ │ stats_dhuard.py
│ │ │ stats_mstats_short.py
│ │ │ __init__.py
│ │ │
│ │ └─tests
│ │ └─ ...(省略)
│ │
│ ├─tests
│ │ └─ ...(省略)
│ │
│ ├─tools
│ │ │ cross_val.py
│ │ │ mctools.py
│ │ │ tools_pca.py
│ │ │ try_mctools.py
│ │ └─ __init__.py
│ │
│ │
│ └─tsa
│ │ diffusion.py
│ │ diffusion2.py
│ │ example_arma.py
│ │ fftarma.py
│ │ garch.py
│ │ movstat.py
│ │ try_arma_more.py
│ │ try_fi.py
│ │ try_var_convolve.py
│ │ varma.py
│ └─ __init__.py
│
│
├─src
│ │ __init__.py
│ │
│ └─__pycache__
│ __init__.cpython-36.pyc
│
├─stats
│ │ anova.py
│ │ api.py
│ │ base.py
│ │ contingency_tables.py
│ │ contrast.py
│ │ correlation_tools.py
│ │ descriptivestats.py
│ │ diagnostic.py
│ │ gof.py
│ │ inter_rater.py
│ │ mediation.py
│ │ moment_helpers.py
│ │ multicomp.py
│ │ multitest.py
│ │ multivariate_tools.py
│ │ outliers_influence.py
│ │ power.py
│ │ proportion.py
│ │ sandwich_covariance.py
│ │ stattools.py
│ │ tabledist.py
│ │ weightstats.py
│ │ _adnorm.py
│ │ _lilliefors.py
│ │ __init__.py
│ │
│ ├─libqsturng
│ │ │ CH.r
│ │ │ LICENSE.txt
│ │ │ make_tbls.py
│ │ │ qsturng_.py
│ │ │ __init__.py
│ │ │
│ │ └─tests
│ │ └─ ...(省略)
│ │
│ └─tests
│ └─ ...(省略)
│
├─tools
│ │ catadd.py
│ │ data.py
│ │ decorators.py
│ │ dump2module.py
│ │ eval_measures.py
│ │ grouputils.py
│ │ linalg.py
│ │ numdiff.py
│ │ parallel.py
│ │ print_version.py
│ │ rootfinding.py
│ │ sm_exceptions.py
│ │ testing.py
│ │ tools.py
│ │ transform_model.py
│ │ web.py
│ │ wrappers.py
│ │ _testing.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
└─tsa
│ adfvalues.py
│ api.py
│ arima_model.py
│ arima_process.py
│ arma_mle.py
│ ar_model.py
│ descriptivestats.py
│ mlemodel.py
│ seasonal.py
│ stattools.py
│ tsatools.py
│ varma_process.py
│ x13.py
│ _bds.py
│ __init__.py
│
├─base
│ │ datetools.py
│ │ tsa_model.py
│ │ __init__.py
│ │
│ └─tests
│ │ test_base.py
│ │ test_datetools.py
│ └─ __init__.py
│
├─filters
│ │ api.py
│ │ bk_filter.py
│ │ cf_filter.py
│ │ filtertools.py
│ │ hp_filter.py
│ │ _utils.py
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─interp
│ │ denton.py
│ │ __init__.py
│ │
│ └─tests
│ │ test_denton.py
│ └─ __init__.py
│
│
├─kalmanf
│ │ kalmanfilter.py
│ │ kalman_loglike.cp36-win_amd64.pyd
│ └─ __init__.py
│
├─regime_switching
│ │ markov_autoregression.py
│ │ markov_regression.py
│ │ markov_switching.py
│ │ _hamilton_filter.cp36-win_amd64.pyd
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
├─statespace
│ │ api.py
│ │ dynamic_factor.py
│ │ kalman_filter.py
│ │ kalman_smoother.py
│ │ mlemodel.py
│ │ representation.py
│ │ sarimax.py
│ │ structural.py
│ │ tools.py
│ │ varmax.py
│ │ _statespace.cp36-win_amd64.pyd
│ │ __init__.py
│ │
│ └─tests
│ └─ ...(省略)
│
└─tests
└─ ...(省略)
在介绍各个类别函数的时候,首先介绍一下Statsmodels
强大的预处理函数
自版本0.5以来,statsmodels
允许用户使用R语言的公式来匹配统计模型。在内部,statsmodels
使用patsy
包将公式和数据转换为模型拟合中使用的矩阵。
公式框架非常强大;下面的例子只触及表面。对公式语言的完整描述可以在patsy
文档中找到
dmatrices
是一个很好用的预处理函数,功能如下
Notice that dmatrices has
注意到dmatrices具有以下几个功能
split the categorical Region variable into a set of indicator variables.
将分类区域变量分解为一组指示器变量。
added a constant to the exogenous regressors matrix.
增加了一个常数给外源的回归矩阵。
returned pandas DataFrames instead of simple numpy arrays. This is useful because DataFrames allow statsmodels to carry-over meta-data (e.g. variable names) when reporting results.
返回数据是Pandas的DataFrames,而不是简单的numpy数组。这是有用的,因为DataFrames允许statsmo模型在报告结果时对元数据(例如变量名)进行处理。
得到处理好的数据后,我们即可进行一些统计分析,最常用的就是
Fitting a model in statsmodels typically involves 3 easy steps:
在statsmomodel中安装一个模型通常需要3个简单的步骤:
Use the model class to describe the model
使用模型类来描述模型
Fit the model using a class method
使用类方法来匹配模型
Inspect the results using a summary method
使用摘要方法检查结果
比如下面一个例子:
import statsmodels.api as sm
import pandas as pd
from patsy import dmatrices
import statsmodels
df = sm.datasets.get_rdataset("Guerry", "HistData").data
vars = ['Department', 'Lottery', 'Literacy', 'Wealth', 'Region']
df = df[vars]
df = df.dropna()
y, X = dmatrices('Lottery ~ Literacy + Wealth + Region', data=df, return_type='dataframe')
mod = sm.OLS(y, X)
res = mod.fit()
预处理函数已经讲完,后面将一个一个简单学习各个模型的使用。