Python数模笔记-StatsModels 统计回归(3)模型数据的准备

1、读取数据文件

回归分析问题所用的数据都是保存在数据文件中的,首先就要从数据文件读取数据。

数据文件的格式很多,最常用的是 .csv,.xls 和 .txt 文件,以及 sql 数据库文件的读取 。


欢迎关注 Youcans 原创系列,每周更新数模笔记

Python数模笔记-PuLP库
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn
Python数模笔记-NetworkX
Python数模笔记-模拟退火算法

使用 pandas 从数据文件导入数据的程序最为简单,示例如下:

(1)读取 .csv 文件:

    df = pd.read_csv("./example.csv", engine="python", encoding="utf_8_sig")# engine="python"允许处理中文路径,encoding="utf_8_sig"允许读取中文数据

(2)读取 .xls 文件:

df = pd.read_excel("./example.xls", sheetname='Sheet1', header=0, encoding="utf_8_sig")# sheetname 表示读取的sheet,header=0 表示首行为标题行, encoding 表示编码方式

(3)读取 .txt 文件:

    df = pd.read_table("./example.txt", sep="\t", header=None)# sep 表示分隔符,header=None表示无标题行,第一行是数据


2、数据文件的拆分与合并

统计回归所需处理的数据量可能非常大,必要时需对文件进行拆分或合并,也可以用 pandas 进行处理,示例如下:
  (1)将 Excel 文件分割为多个文件

    # 将 Excel 文件分割为多个文件import pandas as pddfData = pd.read_excel('./example.xls', sheetname='Sheet1')nRow, nCol = dfData.shape  # 获取数据的行列# 假设数据共有198,000行,分割为 20个文件,每个文件 10,000行for i in range(0, int(nRow/10000)+1):saveData = dfData.iloc[i*10000+1:(i+1)*10000+1, :]  # 每隔 10,000fileName= './example_{}.xls'.format(str(i))saveData.to_excel(fileName, sheet_name = 'Sheet1', index = False)

(2)将 多个 Excel 文件合并为一个文件

    # 将多个 Excel 文件合并为一个文件import pandas as pd## 两个 Excel 文件合并#data1 = pd.read_excel('./example0.xls', sheetname='Sheet1')#data2 = pd.read_excel('./example1.xls', sheetname='Sheet1')#data = pd.concat([data1, data2])# 多个 Excel 文件合并dfData = pd.read_excel('./example0.xls', sheetname='Sheet1')for i in range(1, 20):fileName = './example_{}.xls'.format(str(i))dfNew = pd.read_excel(fileName)dfData = pd.concat([dfData, dfNew])dfData.to_excel('./example', index = False)# = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =


3、数据的预处理

在实际工作中,在开始建立模型和拟合分析之前,还要对原始数据进行数据预处理(data preprocessing),主要包括:缺失值处理、重复数据处理、异常值处理、变量格式转换、训练集划分、数据的规范化、归一化等。

数据预处理的很多内容已经超出了 Statsmodels 的范围,在此只介绍最基本的方法:

(1)缺失数据的处理

导入的数据存在缺失是经常发生的,最简单的处理方式是删除缺失的数据行。使用 pandas 中的 .dropna() 删除含有缺失值的行或列,也可以 对特定的列进行缺失值删除处理 。

    dfNew = dfData.dropna(axis = 0))  # 删除含有缺失值的行

有时也会填充缺失值或替换缺失值,在此就不做介绍了。
  
  (2)重复数据的处理
  
  对于重复数据,通常会删除重复行。使用 pandas 中的 .duplicated() 可以查询重复数据的内容,使用 .drop_duplicated() 可以删除重复数据,也可以对指定的数据列进行去重。

    dfNew = dfData.drop_duplicates(inplace=True)  # 删除重复的数据行

(3)异常值处理

数据中可能包括异常值, 是指一个样本中的数值明显偏离样本集中其它样本的观测值,也称为离群点。异常值可以通过箱线图、正态分布图进行识别,也可以通过回归、聚类建模进行识别。
  
  箱线图技术是利用数据的分位数识别其中的异常点。箱形图分析也超过本文的内容,不能详细介绍了。只能笼统地说通过观察箱形图,可以查看整体的异常情况,进而发现异常值。

    dfData.boxplot()  # 绘制箱形图

对于异常值通常不易直接删除,需要结合具体情况进行考虑和处理。使用 pandas 中的 .drop() 可以直接删除异常值数据行,或者使用判断条件来判定并删除异常值数据行。

    # 按行删除,drop() 默认 axis=0 按行删除dfNew = dfData.drop(labels=0)   # 按照行号 labels,删除 行号为 0 的行dfNew = dfData.drop(index=dfData[dfData['A']==-1].index[0])   # 按照条件检索,删除 dfData['A']=-1 的行


4、Python 例程(Statsmodels)

4.1 问题描述

数据文件中收集了 30个月本公司牙膏销售量、价格、广告费用及同期的市场均价。
  (1)分析牙膏销售量与价格、广告投入之间的关系,建立数学模型;
  (2)估计所建立数学模型的参数,进行统计分析;
  (3)利用拟合模型,预测在不同价格和广告费用下的牙膏销售量。
  
  本问题及数据来自:姜启源、谢金星,数学模型(第 3版),高等教育出版社。
  需要说明的是,本文例程并不是问题最佳的求解方法和结果,只是使用该问题及数据示范读取数据文件和数据处理的方法。

4.2 Python 程序


# LinearRegression_v3.py
# v1.0: 调用 statsmodels 实现一元线性回归
# v2.0: 调用 statsmodels 实现多元线性回归
# v3.0: 从文件读取数据样本
# 日期:2021-05-06
# Copyright 2021 YouCans, XUPTimport numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt# 主程序 = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
def main():# 读取数据文件readPath = "../data/toothpaste.csv"  # 数据文件的地址和文件名try:if (readPath[-4:] == ".csv"):dfOpenFile = pd.read_csv(readPath, header=0, sep=",")  # 间隔符为逗号,首行为标题行# dfOpenFile = pd.read_csv(filePath, header=None, sep=",")  # sep: 间隔符,无标题行elif (readPath[-4:] == ".xls") or (readPath[-5:] == ".xlsx"):  # sheet_name 默认为 0dfOpenFile = pd.read_excel(readPath, header=0)  # 首行为标题行# dfOpenFile = pd.read_excel(filePath, header=None)  # 无标题行elif (readPath[-4:] == ".dat"):  # sep: 间隔符,header:首行是否为标题行dfOpenFile = pd.read_table(readPath, sep=" ", header=0)  # 间隔符为空格,首行为标题行# dfOpenFile = pd.read_table(filePath,sep=",",header=None) # 间隔符为逗号,无标题行else:print("不支持的文件格式。")print(dfOpenFile.head())except Exception as e:print("读取数据文件失败:{}".format(str(e)))return# 数据预处理dfData = dfOpenFile.dropna()  # 删除含有缺失值的数据print(dfData.dtypes)  # 查看 df 各列的数据类型print(dfData.shape)  # 查看 df 的行数和列数# colNameList = dfData.columns.tolist()  # 将 df 的列名转换为列表 list# print(colNameList)  # 查看列名列表 list# featureCols = ['price', 'average', 'advertise', 'difference']  # 筛选列,建立自变量列名 list# X = dfData[['price', 'average', 'advertise', 'difference']]  # 根据自变量列名 list,建立 自变量数据集# 准备建模数据:分析因变量 Y(sales) 与 自变量 x1~x4  的关系y = dfData.sales  # 根据因变量列名 list,建立 因变量数据集x0 = np.ones(dfData.shape[0])  # 截距列 x0=[1,...1]x1 = dfData.price  # 销售价格x2 = dfData.average  # 市场均价x3 = dfData.advertise  # 广告费x4 = dfData.difference  # 价格差,x4 = x1 - x2X = np.column_stack((x0,x1,x2,x3,x4))  #[x0,x1,x2,...,x4]# 建立模型与参数估计# Model 1:Y = b0 + b1*X1 + b2*X2 + b3*X3 + b4*X4 + emodel = sm.OLS(y, X)  # 建立 OLS 模型results = model.fit()  # 返回模型拟合结果yFit = results.fittedvalues  # 模型拟合的 y 值print(results.summary())  # 输出回归分析的摘要print("\nOLS model: Y = b0 + b1*X + ... + bm*Xm")print('Parameters: ', results.params)  # 输出:拟合模型的系数# 拟合结果绘图fig, ax = plt.subplots(figsize=(10, 8))ax.plot(range(len(y)), y, 'bo', label='sample')ax.plot(range(len(yFit)), yFit, 'r--', label='predict')ax.legend(loc='best')  # 显示图例plt.show()  # YouCans, XUPTreturn#= 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
if __name__ == '__main__':main()

4.3 程序运行结果:

   period  price  average  advertise  difference  sales
0       1   3.85     3.80       5.50       -0.05   7.38
1       2   3.75     4.00       6.75        0.25   8.51
2       3   3.70     4.30       7.25        0.60   9.52
3       4   3.70     3.70       5.50        0.00   7.50
4       5   3.60     3.85       7.00        0.25   9.33OLS Regression Results                            
==============================================================================
Dep. Variable:                  sales   R-squared:                       0.895
Model:                            OLS   Adj. R-squared:                  0.883
Method:                 Least Squares   F-statistic:                     74.20
Date:                Fri, 07 May 2021   Prob (F-statistic):           7.12e-13
Time:                        11:51:52   Log-Likelihood:                 3.3225
No. Observations:                  30   AIC:                             1.355
Df Residuals:                      26   BIC:                             6.960
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          8.0368      2.480      3.241      0.003       2.940      13.134
x1            -1.1184      0.398     -2.811      0.009      -1.936      -0.300
x2             0.2648      0.199      1.332      0.195      -0.144       0.674
x3             0.4927      0.125      3.938      0.001       0.236       0.750
x4             1.3832      0.288      4.798      0.000       0.791       1.976
==============================================================================
Omnibus:                        0.141   Durbin-Watson:                   1.762
Prob(Omnibus):                  0.932   Jarque-Bera (JB):                0.030
Skew:                           0.052   Prob(JB):                        0.985
Kurtosis:                       2.885   Cond. No.                     2.68e+16
==============================================================================OLS model: Y = b0 + b1*X + ... + bm*Xm
Parameters:  const    8.036813
x1      -1.118418
x2       0.264789
x3       0.492728
x4       1.383207

在这里插入图片描述



欢迎关注 Youcans 原创系列,每周更新数模笔记

版权说明:

  1. 本问题及数据来自:姜启源、谢金星,数学模型(第 3版),高等教育出版社
  2. 本文内容及例程为作者原创,并非转载书籍或网络内容。。

YouCans 原创作品
Copyright 2021 YouCans, XUPT
Crated:2021-05-06


Python数模笔记-PuLP库(1)线性规划入门
Python数模笔记-PuLP库(2)线性规划进阶
Python数模笔记-PuLP库(3)线性规划实例
Python数模笔记-NetworkX(1)图的操作
Python数模笔记-NetworkX(2)最短路径
Python数模笔记-NetworkX(3)条件最短路径
Python数模笔记-StatsModels 统计回归(1)简介
Python数模笔记-StatsModels 统计回归(2)线性回归
Python数模笔记-StatsModels 统计回归(3)模型数据的准备
Python数模笔记-StatsModels 统计回归(4)可视化
Python数模笔记-Sklearn (1)介绍
Python数模笔记-Sklearn (2)聚类分析
Python数模笔记-Sklearn (3)主成分分析
Python数模笔记-Sklearn (4)线性回归
Python数模笔记-Sklearn (5)支持向量机
Python数模笔记-模拟退火算法(1)多变量函数优化
Python数模笔记-模拟退火算法(2)约束条件的处理
Python数模笔记-模拟退火算法(3)整数规划问题
Python数模笔记-模拟退火算法(4)旅行商问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络反向传导算法

假设我们有一个固定样本集 ,它包含 个样例。我们可以用批量梯度下降法来求解神经网络。具体来讲,对于单个样例 ,其代价函数为: 这是一个(二分之一的)方差代价函数。给定一个包含 个样例的数据集&#xff…

Python数模笔记-StatsModels 统计回归(4)可视化

1、如何认识可视化? 图形总是比数据更加醒目、直观。解决统计回归问题,无论在分析问题的过程中,还是在结果的呈现和发表时,都需要可视化工具的帮助和支持。  欢迎关注 Youcans 原创系列,每周更新数模笔记 Python数…

梯度检验与高级优化

众所周知,反向传播算法很难调试得到正确结果,尤其是当实现程序存在很多难于发现的bug时。举例来说,索引的缺位错误(off-by-one error)会导致只有部分层的权重得到训练,再比如忘记计算偏置项。这些错误会使你…

Python数模笔记-Sklearn (1)介绍

1、SKlearn 是什么 Sklearn(全称 SciKit-Learn),是基于 Python 语言的机器学习工具包。 Sklearn 主要用Python编写,建立在 Numpy、Scipy、Pandas 和 Matplotlib 的基础上,也用 Cython编写了一些核心算法来提高性能。…

自编码算法与稀疏性

目前为止,我们已经讨论了神经网络在有监督学习中的应用。在有监督学习中,训练样本是有类别标签的。现在假设我们只有一个没有带类别标签的训练样本集合 ,其中 。自编码神经网络是一种无监督学习算法,它使用了反向传播算法&#…

Python数模笔记-Sklearn(2)聚类分析

1、分类的分类 分类的分类?没错,分类也有不同的种类,而且在数学建模、机器学习领域常常被混淆。 首先我们谈谈有监督学习(Supervised learning)和无监督学习(Unsupervised learning)&#xff…

可视化自编码器训练结果

训练完(稀疏)自编码器,我们还想把这自编码器学到的函数可视化出来,好弄明白它到底学到了什么。我们以在1010图像(即n100)上训练自编码器为例。在该自编码器中,每个隐藏单元i对如下关于输入的函数…

Python数模笔记-Sklearn(3)主成分分析

主成分分析(Principal Components Analysis,PCA)是一种数据降维技术,通过正交变换将一组相关性高的变量转换为较少的彼此独立、互不相关的变量,从而减少数据的维数。 1、数据降维 1.1 为什么要进行数据降维&#xff1…

稀疏自编码器一览表

下面是我们在推导sparse autoencoder时使用的符号一览表: 符号含义训练样本的输入特征,.输出值/目标值. 这里 可以是向量. 在autoencoder中,.第 个训练样本输入为 时的假设输出,其中包含参数 . 该输出应当与目标值 具有相同的…

Python数模笔记-Sklearn(4)线性回归

1、什么是线性回归? 回归分析(Regression analysis)是一种统计分析方法,研究自变量和因变量之间的定量关系。回归分析不仅包括建立数学模型并估计模型参数,检验数学模型的可信度,也包括利用建立的模型和估计的模型参数…

Python数模笔记-Sklearn(5)支持向量机

支持向量机(Support vector machine, SVM)是一种二分类模型,是按有监督学习方式对数据进行二元分类的广义线性分类器。 支持向量机经常应用于模式识别问题,如人像识别、文本分类、手写识别、生物信息识别等领域。 1、支持向量机&…

矢量化编程

当使用学习算法时,一段更快的代码通常意味着项目进展更快。例如,如果你的学习算法需要花费20分钟运行完成,这意味着你每个小时能“尝试”3个新主意。但是假如你的程序需要20个小时来运行,这意味着你一天只能“尝试”一个新主意&am…

Python数模笔记-NetworkX(1)图的操作

1、NetworkX 图论与网络工具包 NetworkX 是基于 Python 语言的图论与复杂网络工具包,用于创建、操作和研究复杂网络的结构、动力学和功能。 NetworkX 可以以标准和非标准的数据格式描述图与网络,生成图与网络,分析网络结构,构建…

逻辑回归的向量化实现样例

逻辑回归的向量化实现样例 我们想用批量梯度上升法对logistic回归分析模型进行训练,其模型如下: 让我们遵从公开课程视频与CS229教学讲义的符号规范,设 ,于是 ,, 为截距。假设我们有m个训练样本{(, ) ,...…

Python数模笔记-NetworkX(2)最短路径

1、最短路径问题的常用算法 最短路径问题是图论研究中的经典算法问题,用于计算图中一个顶点到另一个顶点的最短路径。 欢迎关注 Youcans 原创系列,每周更新数模笔记 Python数模笔记-PuLP库 Python数模笔记-StatsModels统计回归 Python数模笔记-Sklearn…

神经网络向量化

神经网络向量化 在本节,我们将引入神经网络的向量化版本。在前面关于神经网络介绍的章节中,我们已经给出了一个部分向量化的实现,它在一次输入一个训练样本时是非常有效率的。下边我们看看如何实现同时处理多个训练样本的算法。具体来讲&…

Python数模笔记-NetworkX(3)条件最短路径

1、带有条件约束的最短路径问题 最短路径问题是图论中求两个顶点之间的最短路径问题,通常是求最短加权路径。 条件最短路径,指带有约束条件、限制条件的最短路径。例如,顶点约束,包括必经点或禁止点的限制;边的约束&…

简单技能之程序调试入门

简单技能之程序调试入门 黑盒测试 等价类划分

Python数模笔记-NetworkX(4)最小生成树

1、生成树和最小生成树 1.1 生成树 连通的无圈图称为树,就是不包含循环的回路的连通图。 对于无向连通图,生成树(Spanning tree)是原图的极小连通子图,它包含原图中的所有 n 个顶点,并且有保持图连通的最…

Python数模笔记-NetworkX(5)关键路径法

关键路径法(Critical path method,CPM)是一种计划管理方法,通过分析项目过程中工序进度安排寻找关键路径,确定最短工期,广泛应用于系统分析和项目管理。 1、拓扑序列与关键路径 1.1 拓扑序列 一个大型工程…