跟着教程学习了一段时间数据分析,越学感觉坑越多。于是花了一个星期仔细看了下《利用Python进行数据分析》。写在这里主要是记录下,方便自己查看。

statsmodels简介

statsmodels是一个有很多统计模型的python库,能完成很多统计测试,数据探索以及可视化。它也包含一些经典的统计方法,比如贝叶斯方法和一个机器学习的模型。

statsmodels中的模型包括:

  • 线性模型(linear models),广义线性模型(generalized linear models),鲁棒线性模型(robust linear models)
  • 线性混合效应模型(Linear mixed effects models)
  • 方差分析(ANOVA)方法(Analysis of variance (ANOVA) methods)
  • 时间序列处理(Time series processes)和状态空间模型(state space models)
  • 广义矩估计方法(Generalized method of moments)

接下来我们用一些statsmodels中的工具,并了解如何使用Patsy公式和pandas DataFrame进行建模。

1、估计线性模型

statsmodels中的线性模型大致分为两种:基于数组的(array-based),和基于公式的(formula-based)。调用的模块为:

import statsmodels.api as sm
import statsmodels.formula.api as smf

为了演示如何使用,我们对一些随机数据生成一个线性模型:

import numpy as np
import pandas as pd
def dnorm(mean, variance, size=1):if isinstance(size, int):size = sizereturn mean + np.sqrt(variance) * np.random.randn(size)# For reproducibility
np.random.seed(12345)N = 100
X = 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
print(X.shape)
print(eps.shape)
(100, 3)
(100,)

真正的模型用的参数是beta,dnorm的功能是产生指定平均值和方差的随机离散数据,得到:

X[:5]
array([[-0.12946849, -1.21275292,  0.50422488],[ 0.30291036, -0.43574176, -0.25417986],[-0.32852189, -0.02530153,  0.13835097],[-0.35147471, -0.71960511, -0.25821463],[ 1.2432688 , -0.37379916, -0.52262905]])
y[:5]
array([ 0.42786349, -0.67348041, -0.09087764, -0.48949442, -0.12894109])

一个线性模型通常会有一个截距,这里我们用sm.add_constant函数添加一个截距列给X:

X_model = sm.add_constant(X)
X_model[:5]
array([[ 1.        , -0.12946849, -1.21275292,  0.50422488],[ 1.        ,  0.30291036, -0.43574176, -0.25417986],[ 1.        , -0.32852189, -0.02530153,  0.13835097],[ 1.        , -0.35147471, -0.71960511, -0.25821463],[ 1.        ,  1.2432688 , -0.37379916, -0.52262905]])

sm.OLS可以拟合(fit)普通最小二乘线性回归:

model = sm.OLS(y, X) 

fit方法返回的是一个回顾结果对象,包含预测模型的参数和其他一些诊断数据:

results = model.fit()
results.params
array([ 0.17826108,  0.22303962,  0.50095093])

在results上调用summary方法,可能得到一些详细的诊断数据:

results.summary()
OLS Regression Results
Dep. Variable: y R-squared: 0.430
Model: OLS Adj. R-squared: 0.413
Method: Least Squares F-statistic: 24.42
Date: Mon, 11 Dec 2017 Prob (F-statistic): 7.44e-12
Time: 00:01:30 Log-Likelihood: -34.305
No. Observations: 100 AIC: 74.61
Df Residuals: 97 BIC: 82.42
Df 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.283
x2 0.2230 0.046 4.818 0.000 0.131 0.315
x3 0.5010 0.080 6.237 0.000 0.342 0.660
Omnibus: 4.662 Durbin-Watson: 2.201
Prob(Omnibus): 0.097 Jarque-Bera (JB): 4.098
Skew: 0.481 Prob(JB): 0.129
Kurtosis: 3.243 Cond. No. 1.74

参数的名字通常为x1, x2,以此类推。假设所有的模型参数都在一个DataFrame里:

data = pd.DataFrame(X, columns=['col0', 'col1', 'col2'])
data['y'] = y
data.head()
col0 col1 col2 y
0 -0.129468 -1.212753 0.504225 0.427863
1 0.302910 -0.435742 -0.254180 -0.673480
2 -0.328522 -0.025302 0.138351 -0.090878
3 -0.351475 -0.719605 -0.258215 -0.489494
4 1.243269 -0.373799 -0.522629 -0.128941

现在我们可以使用statsmodels formula API(公式API)和Patsy的公式字符串:

results = smf.ols('y ~ col0 + col1 + col2', data=data).fit()
results.params
Intercept    0.033559
col0         0.176149
col1         0.224826
col2         0.514808
dtype: float64
results.tvalues
Intercept    0.952188
col0         3.319754
col1         4.850730
col2         6.303971
dtype: float64

可以看到statsmodel返回的结果是Series,而Series的索引部分是DataFrame的列名。当我们使用公式和pandas对象的时候,不需要使用add_constant。

如果得到新的数据,我们可以用预测模型的参数来进行预测:

results.predict(data[:5])
0   -0.002327
1   -0.141904
2    0.041226
3   -0.323070
4   -0.100535
dtype: float64

其他一些分析、诊断、可视化工具可以自己多尝试。

2、预测时序过程

statsmodels中的另一个类是用于时间序列分析的,其中有自动回归处理(autoregressive processes), 卡尔曼滤波(Kalman filtering),状态空间模型(state space models),多元回归模型(multivariate autoregressive models)。

让我们用自动回归结果和噪音模拟一个时间序列数据:

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

这种数据有AR(2)结构(two lags,延迟两期),延迟参数是0.8和-0.4。当我们拟合一个AR模型,我们可能不知道延迟的期间是多少,所以可以在拟合时设一个比较大的延迟数字:

MAXLAGS = 5
model = sm.tsa.AR(values)
results = model.fit(MAXLAGS)

结果里的预测参数,第一个是解决,之后是两个延迟(lags):

results.params
array([-0.00616093,  0.78446347, -0.40847891, -0.01364148,  0.01496872,0.01429462])

利用Python进行数据分析笔记-pandas建模(statsmodels篇)相关推荐

  1. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍 一、pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主

    利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍 一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目 ...

  2. 利用Python进行数据分析笔记-pandas建模(Patsy篇)

    跟着教程学习了一段时间数据分析,越学感觉坑越多.于是花了一个星期仔细看了下<利用Python进行数据分析>.写在这里主要是记录下,方便自己查看. import numpy as np im ...

  3. python数据分析pandas_利用Python进行数据分析笔记-pandas建模(Patsy篇)

    跟着教程学习了一段时间数据分析,越学感觉坑越多.于是花了一个星期仔细看了下<利用Python进行数据分析>.写在这里主要是记录下,方便自己查看. import numpy as np im ...

  4. 利用python进行数据分析 笔记_利用python进行数据分析(O#039;Relly)学习笔记-一团网...

    利用python进行数据分析(O'Relly)学习笔记 1.第一个bug import pandas plot(arrange(10)) #报错name 'plot' is not defined. ...

  5. 利用python进行数据分析 笔记_利用python进行数据分析--(阅读笔记一)

    原博文 2016-06-17 23:21 − 以此记录阅读和学习<利用Python进行数据分析>这本书中的觉得重要的点! 第一章:准备工作 1.一组新闻文章可以被处理为一张词频表,这张词频 ...

  6. 利用Python进行数据分析笔记(基本功能--描述性统计的概述与计算)

    pandas对象装配了一个常用数学.统计学方法的集合.其中大部分属于归约或汇总统计的类别,这些方法从DataFrame的行或列中抽取一个Series或一系列值的单个值(如总或平均值).与NumPy数组 ...

  7. 利用python进行数据分析论文_利用Python进行数据分析之pandas的高级用法

    pandas 前面我们学习了pandas两种基本的数据结构Series和DataFrame以及基本功能,这节我们学习一下其他的略高级用法. 汇总和计算描述统计 df.sum(axis=1) #求和,全 ...

  8. 【赠书】pandas创始人手把手教你利用Python进行数据分析

    周末就要到了,本次给大家赠送5本Python技术书籍,这次赠送的书籍是<利用Python进行数据分析>. 这是一本什么样的书 Python是目前数据科学领域的王者语言,众多科学家.工程师. ...

  9. 学完可以解决90%以上的数据分析问题-利用python进行数据分析第二版(代码和中文笔记)...

    <利用python进行数据分析>是数据分析的基础教程,绝大部分数据分析师的入门教材,目前已经升级到第二版.本站搜集了教材的第二版原版代码进行中文翻译和注释,并做了一定的笔记.基本上只需要看 ...

最新文章

  1. Qt开发环境的下载地址
  2. 【TP5.0】tp5.0实现连接多个数据库,实现类似3.2M(‘table’,'prefix_','db_config2')的CURD操作...
  3. 这是一个测试:测试博客在浏览器中是否可以显示数学内容以及代码格式
  4. 摩根溪创始人:Coinbase应该购买纽约证券交易所
  5. python课设带报告_20193103陈柏维《Python程序设计》实验四报告
  6. 几种web报表打印方案的比较
  7. TMS570LC43xx SylixOS can 驱动
  8. linux sqluldr2命令,sqluldr2 linux64
  9. 十大简单易用的免费在线HTML编辑器
  10. 英语单词词性顺口溜_英语十大词性顺口溜
  11. Prometheus监控报警系统入门
  12. FPGA实战篇——【2】按键控制LED灯闪烁
  13. 汤普森算法_什么是汤普森采样(Thompson sampling)?
  14. tic-tac-toe游戏(简单判断)
  15. Matlab 读取欧空局*.N1卫星遥感图像
  16. 中冠百年|工薪族怎么投资理财
  17. 滤波器原理及其作用计算机网络,什么是滤波器?滤波器原理及其作用是什么?...
  18. 浅谈集合转换成数组的方法--toArray()与toArray(T[] a)
  19. PHP Web开发框架Laravel如何配置
  20. STM32如何配置HAL库

热门文章

  1. [SMOJ2116]诺诺的队列
  2. 涅普计划-PHP入门
  3. 数据分析报告,就该这么写!超详细攻略奉上
  4. MySQl安装与学习,内附SQlyog
  5. 读书笔记:[AWL]-2021.9.7
  6. 探店视频批量剪辑神器,批量生成音画同步探店视频,好物视频和团购达人视频
  7. java纳秒级时间戳_golang的time包:秒、毫秒、纳秒时间戳输出方式
  8. 飞桨领航团武汉长沙回顾|识别皮肤病,一秒记笔记,AI还有哪些惊喜?
  9. chrome插件-图片放大预览-imagus
  10. bmp图片灰度化和二值化