Python进行统计建模


Posted in Python onAugust 10, 2020

前言

大家好,在之前的文章中我们已经讲解了很多Python数据处理的方法比如读取数据、缺失值处理、数据降维等,也介绍了一些数据可视化的方法如Matplotlib、pyecharts等,那么在掌握了这些基础技能之后,要进行更深入的分析就需要掌握一些常用的建模方法,本文将讲解如何利用Python进行统计分析。和之前的文章类似,本文只讲如何用代码实现,不做理论推导与过多的结果解释(事实上常用的模型可以很轻松的查到完美的推导与解析)。因此读者需要掌握一些基本的统计模型比如回归模型、时间序列等。

Statsmodels简介

在Python 中统计建模分析最常用的就是Statsmodels模块。Statsmodels是一个主要用来进行统计计算与统计建模的Python库。主要有以下功能:

  • 探索性分析:包含列联表、链式方程多重插补等探索性数据分析方法以及与统计模型结果的可视化图表,例如拟合图、箱线图、相关图、时间序列图等
  • 回归模型:线性回归模型、非线性回归模型、广义线性模型、线性混合效应模型等
  • 其他功能:方差分析、时间序列分析等模型的参数估计与估计参数的假设检验等

安装 brew install Statsmodels
文档 github.com/statsmodels/statsmodels

线性回归模型:普通最小二乘估计

线性模型有普通最小二乘(OLS)广义最小二乘(GLS)、加权最小二乘(WLS)等,Statsmodels对线性模型有较好的支持,来看个最简单的例子:普通最小二乘(OLS)

首先导入相关包

%matplotlib inline
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
from statsmodels.sandbox.regression.predstd import wls_prediction_std
np.random.seed(9876789)

然后创建数据,先设置样本量为100

nsample = 100 #样本数量

然后设置x1和x2,x1是0到10等差排列,x2是x1的平方

x = np.linspace(0, 10, 100)
X = np.column_stack((x, x**2))

再设置beta、误差项与响应变量y

beta = np.array([1, 0.1, 10])
e = np.random.normal(size=nsample)
X = sm.add_constant(X)
y = np.dot(X, beta) + e

接着建立回归模型

model = sm.OLS(y, X) 
results = model.fit()
print(results.summary())

查看模型结果

Python进行统计建模

是不是和R语言输出的结果形式很接近?回归系数值、P-value、R-squared等评估回归模型的参数值全部都有,还可以使用dir(results)获得全部变量的值并调取出来

print('Parameters: ', results.params)
print('R2: ', results.rsquared)

那么回归模型的就是y=1.3423-0.0402x1+10.0103x2,当然这个模型可以继续优化那么就交给读者完成。接下来我们来绘制一下样本点与回归曲线

y_fitted = results.fittedvalues
fig, ax = plt.subplots(figsize=(8,6))
ax.plot(x, y, 'o', label='data')
ax.plot(x, y_fitted, 'r--.',label='OLS')
ax.legend(loc='best')

Python进行统计建模

时间序列:ARMA

关于时间序列的模型有很多,我们选择ARMA模型示例,首先导入相关包并生成数据

%matplotlib inline
import numpy as np
import statsmodels.api as sm
import pandas as pd
from statsmodels.tsa.arima_process import arma_generate_sample
np.random.seed(12345)

arparams = np.array([.75, -.25])
maparams = np.array([.65, .35])

arparams = np.r_[1, -arparams]
maparams = np.r_[1, maparams]
nobs = 250
y = arma_generate_sample(arparams, maparams, nobs)

接着,我们可以添加一些日期信息。对于本例,我们将使用pandas时间序列并建立模型

dates = sm.tsa.datetools.dates_from_range('1980m1', length=nobs)
y = pd.Series(y, index=dates)
arma_mod = sm.tsa.ARMA(y, order=(2,2))
arma_res = arma_mod.fit(trend='nc', disp=-1)

Python进行统计建模

最后再做一下预测

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10,8))
fig = arma_res.plot_predict(start='1999-06-30', end='2001-05-31', ax=ax)
legend = ax.legend(loc='upper left')

Python进行统计建模

回归诊断:估计回归模型

首先导入相关包

%matplotlib inline
from statsmodels.compat import lzip
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.stats.api as sms
import matplotlib.pyplot as plt

然后加载数据

url = 'https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/HistData/Guerry.csv'
dat = pd.read_csv(url)

拟合模型

results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()

查看结果

print(results.summary())

Python进行统计建模

回归诊断:残差的正态性

Jarque-Bera test:

name = ['Jarque-Bera', 'Chi^2 two-tail prob.', 'Skew', 'Kurtosis']
test = sms.jarque_bera(results.resid)
lzip(name, test)
####结果
[('Jarque-Bera', 3.3936080248431666),
('Chi^2 two-tail prob.', 0.1832683123166337),
('Skew', -0.48658034311223375),
('Kurtosis', 3.003417757881633)]

Omni test:

name = ['Chi^2', 'Two-tail probability']
test = sms.omni_normtest(results.resid)
lzip(name, test)
####结果
[('Chi^2', 3.713437811597181), ('Two-tail probability', 0.15618424580304824)]

回归诊断:异方差

Breush-Pagan test:

name = ['Lagrange multiplier statistic', 'p-value',
    'f-value', 'f p-value']
test = sms.het_breuschpagan(results.resid, results.model.exog)
lzip(name, test)
###结果
[('Lagrange multiplier statistic', 4.893213374093957),
('p-value', 0.08658690502352209),
('f-value', 2.503715946256434),
('f p-value', 0.08794028782673029)]
Goldfeld-Quandt test

name = ['F statistic', 'p-value']
test = sms.het_goldfeldquandt(results.resid, results.model.exog)
lzip(name, test)
####结果
[('F statistic', 1.1002422436378152), ('p-value', 0.3820295068692507)]

回归诊断:多重共线性

检查多重共线性可以使用

np.linalg.cond(results.model.exog)

结果是702.1792145490062,说明存在较强多重共线性。

结束语

以上就是Statsmodels的基本功能介绍,如果熟悉R的读者会发现很多命令与R是类似的。最后想多说一句,全文没有出现太多模型的理论知识,因为这些模型的推导过程随便百度一搜都能得到十分详细的优质回答,因此在学会如何用计算机实现之后必须要回过头去理解模型里每一个参数是怎样得到,又有哪些含义才算真正搞定。

以上就是Python进行统计建模的详细内容,更多关于Python统计建模的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中for循环控制语句用法实例
Jun 02 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
numpy中矩阵合并的实例
Jun 15 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
python后端接收前端回传的文件方法
Jan 02 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
linux 下selenium chrome使用详解
Apr 02 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
利用Python如何实时检测自身内存占用
May 09 Python
python实现学生管理系统开发
Jul 24 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 #Python
拿来就用!Python批量合并PDF的示例代码
Aug 10 #Python
Python 发送邮件方法总结
Aug 10 #Python
Python getattr()函数使用方法代码实例
Aug 10 #Python
Python matplotlib模块及柱状图用法解析
Aug 10 #Python
Python如何操作docker redis过程解析
Aug 10 #Python
基于Python实现下载网易音乐代码实例
Aug 10 #Python
You might like
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
2018/12/20 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
Html5定位终极解决方案
2020/02/05 HTML / CSS
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
公交公司毕业生求职信
2014/02/15 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
建筑工地大门标语
2014/06/18 职场文书
爱护公共设施标语
2014/06/24 职场文书
科学发展观活动总结
2014/08/28 职场文书