Python数学建模StatsModels统计回归模型数据的准备

目录
  • 1、读取数据文件
    • (1)读取 .csv 文件:
    • (2)读取 .xls 文件:
    • (3)读取 .txt 文件:
  • 2、数据文件的拆分与合并
    • (1)将 Excel 文件分割为多个文件
    • (2)将 多个 Excel 文件合并为一个文件
  • 3、数据的预处理
    • (1)缺失数据的处理
    • (2)重复数据的处理
    • (3)异常值处理
  • 4、Python 例程(Statsmodels)
    • 4.1 问题描述
    • 4.2 Python 程序
    • 4.3 程序运行结果:
  • 版权说明:

1、读取数据文件

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

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

使用 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 pd
    dfData = 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,000
        fileName= './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, XUPT
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
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 默认为 0
            dfOpenFile = 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 - x2
    X = np.column_stack((x0,x1,x2,x3,x4))  #[x0,x1,x2,...,x4]
    # 建立模型与参数估计
    # Model 1:Y = b0 + b1*X1 + b2*X2 + b3*X3 + b4*X4 + e
    model = 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, XUPT
    return
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.33
OLS 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

版权说明:

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

以上就是Python数学建模StatsModels统计回归模型数据的准备的详细内容,更多关于数学建模StatsModels统计回归模型数据准备的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python数学建模库StatsModels统计回归简介初识

    目录 1.关于 StatsModels 2.文档 3.主要功能 4.获取和安装 1.关于 StatsModels statsmodels(http://www.statsmodels.org)是一个Python库,用于拟合多种统计模型,执行统计测试以及数据探索和可视化. 2.文档 最新版本的文档位于: https://www.statsmodels.org/stable/ 3.主要功能 1.线性回归模型: 普通最小二乘法 广义最小二乘法 加权最小二乘法 具有自回归误差的最小二乘法 分位数回归 递

  • Python数据可视化 pyecharts实现各种统计图表过程详解

    1.pyecharts介绍 Echarts是一款由百度公司开发的开源数据可视化JS库,pyecharts是一款使用python调用echarts生成数据可视化的类库,可实现柱状图,折线图,饼状图,地图等统计图表. 2.柱状图 适用场合是二维数据集(每个数据点包括两个值x和y),但只有一个维度需要比较,用于显示一段时间内的数据变化或显示各项之间的比较情况. 优点: 利用柱子的高度,反映数据的差异,肉眼对高度差异很敏感. 缺点: 只适用中小规模的数据集. 柱状图最基本用法 from pyechart

  • 利用python实现周期财务统计可视化

    正文之前 上午给爸爸打了个电话庆祝他50岁生日,在此之前搞了个大扫除,看了会知乎,到实验室已经十一点多了.约喜欢的妹子吃饭失败,以至于工作积极性收到了打击,所以就写个程序来统计下开学十一天的财务消费情况,更清楚的认识自己. 正文 废话不多说,先放代码: import matplotlib.pyplot as plt import matplotlib from pylab import mpl plt.rcParams['font.sans-serif']=['SimHei'] def getA

  • Python数学建模StatsModels统计回归之线性回归示例详解

    目录 1.背景知识 1.1 插值.拟合.回归和预测 1.2 线性回归 2.Statsmodels 进行线性回归 2.1 导入工具包 2.2 导入样本数据 2.3 建模与拟合 2.4 拟合和统计结果的输出 3.一元线性回归 3.1 一元线性回归 Python 程序: 3.2 一元线性回归 程序运行结果: 4.多元线性回归 4.1 多元线性回归 Python 程序: 4.2 多元线性回归 程序运行结果: 5.附录:回归结果详细说明 1.背景知识 1.1 插值.拟合.回归和预测 插值.拟合.回归和预测

  • Python数学建模StatsModels统计回归可视化示例详解

    目录 1.如何认识可视化? 2.StatsModels 绘图工具包 (Graphics) 3.Matplotlib 绘图工具包 4.Seaborn 绘图工具包 5.多元回归案例分析(Statsmodels) 5.1 问题描述 5.2 问题分析 观察数据分布特征 观察数据间的相关性 建模与拟合 6.Python 例程(Statsmodels) 6.1 问题描述 6.2 Python 程序 6.3 程序运行结果: 1.如何认识可视化? 需要指出的是,虽然不同绘图工具包的功能.效果会有差异,但在常用功

  • Python数学建模StatsModels统计回归模型数据的准备

    目录 1.读取数据文件 (1)读取 .csv 文件: (2)读取 .xls 文件: (3)读取 .txt 文件: 2.数据文件的拆分与合并 (1)将 Excel 文件分割为多个文件 (2)将 多个 Excel 文件合并为一个文件 3.数据的预处理 (1)缺失数据的处理 (2)重复数据的处理 (3)异常值处理 4.Python 例程(Statsmodels) 4.1 问题描述 4.2 Python 程序 4.3 程序运行结果: 版权说明: 1.读取数据文件 回归分析问题所用的数据都是保存在数据文件

  • 浅谈Python数学建模之数据导入

    目录 一.数据导入是所有数模编程的第一步 二.在程序中直接向变量赋值 2.1.为什么直接赋值? 2.2.直接赋值的问题与注意事项 三.Pandas 导入数据 3.1.Pandas 读取 Excel 文件 3.2.Pandas 读取 csv 文件 3.3.Pandas 读取文本文件 3.4.Pandas 读取其它文件格式 四.数据导入例程 一.数据导入是所有数模编程的第一步 编程求解一个数模问题,问题总会涉及一些数据. 有些数据是在题目的文字描述中给出的,有些数据是通过题目的附件文件下载或指定网址

  • 初学python数学建模之数据导入(小白篇)

    目录 1. 数据导入是所有数模编程的第一步 2. 在程序中直接向变量赋值 2.1 为什么直接赋值? 2.2 直接赋值的问题与注意事项 例程 1:将数据导入作为单独的函数 例程 2:将数据导入集中写成一段,放在程序的起始部分 3. Pandas 导入数据 3.1 Pandas 读取 Excel 文件 pd.read_excel() 的主要参数: pd.read_excel() 使用实例: 3.2 Pandas 读取 csv 文件 Pandas 使用 pandas.read_csv() 函数读取 E

  • python数学建模(SciPy+ Numpy+Pandas)

    目录 前言 SciPy 学习 SciPy基本操作 1-求解非线性方程(组) 2-积分 3-最小二乘解 4-最大模特征值及对应的特征向量 Numpy学习(续) 1 Numpy 数学函数 1-1三角函数 2-舍入函数 2-1 numpy.around() 2-2 numpy.floor() 2-3 numpy.ceil() 3 Numpy算术函数 Pandas学习(续) Pandas 数据排序 DataFrame的排序 Pandas字符串处理 前言 SciPy 是一个开源的 Python 算法库和数

  • python数学建模是加深Numpy和Pandas学习

    目录 前言 Numpy 学习 1-numpy.array 2-numpy.empty 3-numpy.zeros 4-numpy.ones NumPy 从已有的数组创建数组 1-numpy.asarray 2-numpy.frombuffer 3-numpy.fromiter NumPy 从数值范围创建数组 1-numpy.arange 2-numpy.linspace 3-numpy.logspace 综合运用[array.arange.linspace.lonspace]: 综合运用[one

  • python数学建模之Numpy 应用介绍与Pandas学习

    目录 Numpy学习 1 Numpy 介绍与应用 1-1Numpy是什么 2 NumPy Ndarray 对象 3 Numpy 数据类型 4 Numpy 数组属性 Pandas学习 1 pandas新增数据列 2 Pandas数据统计函数 3 Pandas对缺失值的处理 总结 Numpy学习 1 Numpy 介绍与应用 1-1Numpy是什么 NumPy 是一个运行速度非常快的数学库,一个开源的的python科学计算库,主要用于数组.矩阵计算,包含: 一个强大的N维数组对象 ndarray广播功

  • 浅谈Python数学建模之线性规划

    目录 一.求解方法.算法和编程方案 1.1.线性规划问题的求解方法 1.2.线性规划的最快算法 1.3.选择适合自己的编程方案 二.PuLP库求解线性规划问题 2.1.线性规划问题的描述 2.2.PuLP 求解线性规划问题的步骤 2.3.Python例程:线性规划问题 三.小结 一.求解方法.算法和编程方案 线性规划 (Linear Programming,LP) 是很多数模培训讲的第一个算法,算法很简单,思想很深刻. 线性规划问题是中学数学的内容,鸡兔同笼就是一个线性规划问题.数学规划的题目在

随机推荐