千家信息网

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

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章主要介绍"Python数学建模StatsModels统计回归模型数据的准备有哪些",在日常操作中,相信很多人在Python数学建模StatsModels统计回归模型数据的准备有哪些问题上存在疑
千家信息网最后更新 2024年09月22日Python数学建模StatsModels统计回归模型数据的准备有哪些

这篇文章主要介绍"Python数学建模StatsModels统计回归模型数据的准备有哪些",在日常操作中,相信很多人在Python数学建模StatsModels统计回归模型数据的准备有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"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, XUPTimport numpy as npimport pandas as pdimport statsmodels.api as smimport matplotlib.pyplot as pltdef 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    returnif __name__ == '__main__':    main()

4.3 程序运行结果:

   period  price  average  advertise  difference  sales0       1   3.85     3.80       5.50       -0.05   7.381       2   3.75     4.00       6.75        0.25   8.512       3   3.70     4.30       7.25        0.60   9.523       4   3.70     3.70       5.50        0.00   7.504       5   3.60     3.85       7.00        0.25   9.33OLS Regression Results                            ==============================================================================Dep. Variable:                  sales   R-squared:                       0.895Model:                            OLS   Adj. R-squared:                  0.883Method:                 Least Squares   F-statistic:                     74.20Date:                Fri, 07 May 2021   Prob (F-statistic):           7.12e-13Time:                        11:51:52   Log-Likelihood:                 3.3225No. Observations:                  30   AIC:                             1.355Df Residuals:                      26   BIC:                             6.960Df 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.134x1            -1.1184      0.398     -2.811      0.009      -1.936      -0.300x2             0.2648      0.199      1.332      0.195      -0.144       0.674x3             0.4927      0.125      3.938      0.001       0.236       0.750x4             1.3832      0.288      4.798      0.000       0.791       1.976==============================================================================Omnibus:                        0.141   Durbin-Watson:                   1.762Prob(Omnibus):                  0.932   Jarque-Bera (JB):                0.030Skew:                           0.052   Prob(JB):                        0.985Kurtosis:                       2.885   Cond. No.                     2.68e+16==============================================================================OLS model: Y = b0 + b1*X + ... + bm*XmParameters:  const    8.036813x1      -1.118418x2       0.264789x3       0.492728x4       1.383207

到此,关于"Python数学建模StatsModels统计回归模型数据的准备有哪些"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 文件 处理 模型 缺失 标题 数学 多个 问题 分析 统计 准备 价格 程序 结果 预处理 数学建模 广告 方法 样本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北安卓智能化软件开发 最火的软件开发方向 国家税务总局服务器续购 继电保护网络安全典型案例 IIS浏览不了数据库 网络安全审查新政策 西南有没有网络安全教育基地 我的世界2b2t服务器号中国版 济南定制化国产服务器什么价格 服务器系统如何更新驱动 漳州开发区禾苒网络技术工作室 许昌网络技术服务 数据库通用访问类的优势有哪些 网络安全班会主题设计方案 怎么把数据库翻译成中文 查kdb数据库是什么版本 三层架构如何符合自己的数据库 网络安全导航 计算机wifi无线网络安全 安徽采购系统管理软件开发 沙坪坝区工商软件开发服务代理商 c sql删除数据库 集成商做网络安全有资质要求吗 mit-bth数据库 链接服务器无响应是什么情况 软件开发项目税点 学生校园网络安全教育 网络技术真实案例 定期分享网络安全学习资料和教程 黎明杀机无法连接内容服务器
0