人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

Python數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸模型數(shù)據(jù)的準(zhǔn)備

發(fā)布日期:2021-12-23 18:16 | 文章來(lái)源:腳本之家

1、讀取數(shù)據(jù)文件

回歸分析問(wèn)題所用的數(shù)據(jù)都是保存在數(shù)據(jù)文件中的,首先就要從數(shù)據(jù)文件讀取數(shù)據(jù)。

數(shù)據(jù)文件的格式很多,最常用的是 .csv,.xls 和 .txt 文件,以及 sql 數(shù)據(jù)庫(kù)文件的讀取 。

使用 pandas 從數(shù)據(jù)文件導(dǎo)入數(shù)據(jù)的程序最為簡(jiǎn)單,示例如下:

(1)讀取 .csv 文件:

 df = pd.read_csv("./example.csv", engine="python", encoding="utf_8_sig")
 # engine="python"允許處理中文路徑,encoding="utf_8_sig"允許讀取中文數(shù)據(jù)

(2)讀取 .xls 文件:

df = pd.read_excel("./example.xls", sheetname='Sheet1', header=0, encoding="utf_8_sig")
 # sheetname 表示讀取的sheet,header=0 表示首行為標(biāo)題行, encoding 表示編碼方式

(3)讀取 .txt 文件:

 df = pd.read_table("./example.txt", sep="\t", header=None)
 # sep 表示分隔符,header=None表示無(wú)標(biāo)題行,第一行是數(shù)據(jù)

2、數(shù)據(jù)文件的拆分與合并

統(tǒng)計(jì)回歸所需處理的數(shù)據(jù)量可能非常大,必要時(shí)需對(duì)文件進(jìn)行拆分或合并,也可以用 pandas 進(jìn)行處理,示例如下:

(1)將 Excel 文件分割為多個(gè)文件

 # 將 Excel 文件分割為多個(gè)文件
 import pandas as pd
 dfData = pd.read_excel('./example.xls', sheetname='Sheet1')
 nRow, nCol = dfData.shape  # 獲取數(shù)據(jù)的行列
 # 假設(shè)數(shù)據(jù)共有198,000行,分割為 20個(gè)文件,每個(gè)文件 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)將 多個(gè) Excel 文件合并為一個(gè)文件

 # 將多個(gè) Excel 文件合并為一個(gè)文件
 import pandas as pd
 ## 兩個(gè) Excel 文件合并
 #data1 = pd.read_excel('./example0.xls', sheetname='Sheet1')
 #data2 = pd.read_excel('./example1.xls', sheetname='Sheet1')
 #data = pd.concat([data1, data2])
 # 多個(gè) 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)
 # = 關(guān)注 Youcans,分享原創(chuàng)系列 https://blog.csdn.net/youcans =

3、數(shù)據(jù)的預(yù)處理

在實(shí)際工作中,在開始建立模型和擬合分析之前,還要對(duì)原始數(shù)據(jù)進(jìn)行數(shù)據(jù)預(yù)處理(data preprocessing),主要包括:缺失值處理、重復(fù)數(shù)據(jù)處理、異常值處理、變量格式轉(zhuǎn)換、訓(xùn)練集劃分、數(shù)據(jù)的規(guī)范化、歸一化等。

數(shù)據(jù)預(yù)處理的很多內(nèi)容已經(jīng)超出了 Statsmodels 的范圍,在此只介紹最基本的方法:

(1)缺失數(shù)據(jù)的處理

導(dǎo)入的數(shù)據(jù)存在缺失是經(jīng)常發(fā)生的,最簡(jiǎn)單的處理方式是刪除缺失的數(shù)據(jù)行。使用 pandas 中的 .dropna() 刪除含有缺失值的行或列,也可以 對(duì)特定的列進(jìn)行缺失值刪除處理 。

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

有時(shí)也會(huì)填充缺失值或替換缺失值,在此就不做介紹了?!?/p>

(2)重復(fù)數(shù)據(jù)的處理

對(duì)于重復(fù)數(shù)據(jù),通常會(huì)刪除重復(fù)行。使用 pandas 中的 .duplicated() 可以查詢重復(fù)數(shù)據(jù)的內(nèi)容,使用 .drop_duplicated() 可以刪除重復(fù)數(shù)據(jù),也可以對(duì)指定的數(shù)據(jù)列進(jìn)行去重。

 dfNew = dfData.drop_duplicates(inplace=True)  # 刪除重復(fù)的數(shù)據(jù)行

(3)異常值處理

數(shù)據(jù)中可能包括異常值, 是指一個(gè)樣本中的數(shù)值明顯偏離樣本集中其它樣本的觀測(cè)值,也稱為離群點(diǎn)。異常值可以通過(guò)箱線圖、正態(tài)分布圖進(jìn)行識(shí)別,也可以通過(guò)回歸、聚類建模進(jìn)行識(shí)別。

箱線圖技術(shù)是利用數(shù)據(jù)的分位數(shù)識(shí)別其中的異常點(diǎn)。箱形圖分析也超過(guò)本文的內(nèi)容,不能詳細(xì)介紹了。只能籠統(tǒng)地說(shuō)通過(guò)觀察箱形圖,可以查看整體的異常情況,進(jìn)而發(fā)現(xiàn)異常值。

 dfData.boxplot()  # 繪制箱形圖

對(duì)于異常值通常不易直接刪除,需要結(jié)合具體情況進(jìn)行考慮和處理。使用 pandas 中的 .drop() 可以直接刪除異常值數(shù)據(jù)行,或者使用判斷條件來(lái)判定并刪除異常值數(shù)據(jù)行。

 # 按行刪除,drop() 默認(rèn) axis=0 按行刪除
 dfNew = dfData.drop(labels=0)# 按照行號(hào) labels,刪除 行號(hào)為 0 的行
 dfNew = dfData.drop(index=dfData[dfData['A']==-1].index[0])# 按照條件檢索,刪除 dfData['A']=-1 的行

4、Python 例程(Statsmodels)

4.1 問(wèn)題描述

數(shù)據(jù)文件中收集了 30個(gè)月本公司牙膏銷售量、價(jià)格、廣告費(fèi)用及同期的市場(chǎng)均價(jià)。
  (1)分析牙膏銷售量與價(jià)格、廣告投入之間的關(guān)系,建立數(shù)學(xué)模型;
 ?。?)估計(jì)所建立數(shù)學(xué)模型的參數(shù),進(jìn)行統(tǒng)計(jì)分析;
 ?。?)利用擬合模型,預(yù)測(cè)在不同價(jià)格和廣告費(fèi)用下的牙膏銷售量。

本問(wèn)題及數(shù)據(jù)來(lái)自:姜啟源、謝金星,數(shù)學(xué)模型(第 3版),高等教育出版社。
需要說(shuō)明的是,本文例程并不是問(wèn)題最佳的求解方法和結(jié)果,只是使用該問(wèn)題及數(shù)據(jù)示范讀取數(shù)據(jù)文件和數(shù)據(jù)處理的方法。

4.2 Python 程序

# LinearRegression_v3.py
# v1.0: 調(diào)用 statsmodels 實(shí)現(xiàn)一元線性回歸
# v2.0: 調(diào)用 statsmodels 實(shí)現(xiàn)多元線性回歸
# v3.0: 從文件讀取數(shù)據(jù)樣本
# 日期: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():
 # 讀取數(shù)據(jù)文件
 readPath = "../data/toothpaste.csv"  # 數(shù)據(jù)文件的地址和文件名
 try:
  if (readPath[-4:] == ".csv"):
dfOpenFile = pd.read_csv(readPath, header=0, sep=",")  # 間隔符為逗號(hào),首行為標(biāo)題行
# dfOpenFile = pd.read_csv(filePath, header=None, sep=",")  # sep: 間隔符,無(wú)標(biāo)題行
  elif (readPath[-4:] == ".xls") or (readPath[-5:] == ".xlsx"):  # sheet_name 默認(rèn)為 0
dfOpenFile = pd.read_excel(readPath, header=0)  # 首行為標(biāo)題行
# dfOpenFile = pd.read_excel(filePath, header=None)  # 無(wú)標(biāo)題行
  elif (readPath[-4:] == ".dat"):  # sep: 間隔符,header:首行是否為標(biāo)題行
dfOpenFile = pd.read_table(readPath, sep=" ", header=0)  # 間隔符為空格,首行為標(biāo)題行
# dfOpenFile = pd.read_table(filePath,sep=",",header=None) # 間隔符為逗號(hào),無(wú)標(biāo)題行
  else:
print("不支持的文件格式。")
  print(dfOpenFile.head())
 except Exception as e:
  print("讀取數(shù)據(jù)文件失?。簕}".format(str(e)))
  return
 # 數(shù)據(jù)預(yù)處理
 dfData = dfOpenFile.dropna()  # 刪除含有缺失值的數(shù)據(jù)
 print(dfData.dtypes)  # 查看 df 各列的數(shù)據(jù)類型
 print(dfData.shape)  # 查看 df 的行數(shù)和列數(shù)
 # colNameList = dfData.columns.tolist()  # 將 df 的列名轉(zhuǎn)換為列表 list
 # print(colNameList)  # 查看列名列表 list
 # featureCols = ['price', 'average', 'advertise', 'difference']  # 篩選列,建立自變量列名 list
 # X = dfData[['price', 'average', 'advertise', 'difference']]  # 根據(jù)自變量列名 list,建立 自變量數(shù)據(jù)集
 # 準(zhǔn)備建模數(shù)據(jù):分析因變量 Y(sales) 與 自變量 x1~x4  的關(guān)系
 y = dfData.sales  # 根據(jù)因變量列名 list,建立 因變量數(shù)據(jù)集
 x0 = np.ones(dfData.shape[0])  # 截距列 x0=[1,...1]
 x1 = dfData.price  # 銷售價(jià)格
 x2 = dfData.average  # 市場(chǎng)均價(jià)
 x3 = dfData.advertise  # 廣告費(fèi)
 x4 = dfData.difference  # 價(jià)格差,x4 = x1 - x2
 X = np.column_stack((x0,x1,x2,x3,x4))  #[x0,x1,x2,...,x4]
 # 建立模型與參數(shù)估計(jì)
 # Model 1:Y = b0 + b1*X1 + b2*X2 + b3*X3 + b4*X4 + e
 model = sm.OLS(y, X)  # 建立 OLS 模型
 results = model.fit()  # 返回模型擬合結(jié)果
 yFit = results.fittedvalues  # 模型擬合的 y 值
 print(results.summary())  # 輸出回歸分析的摘要
 print("\nOLS model: Y = b0 + b1*X + ... + bm*Xm")
 print('Parameters: ', results.params)  # 輸出:擬合模型的系數(shù)
 # 擬合結(jié)果繪圖
 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 程序運(yùn)行結(jié)果:

period  price  average  advertise  difference  sales
0 13.85  3.80 5.50 -0.057.38
1 23.75  4.00 6.75  0.258.51
2 33.70  4.30 7.25  0.609.52
3 43.70  3.70 5.50  0.007.50
4 53.60  3.85 7.00  0.259.33
OLS Regression Results
==============================================================================
Dep. Variable:salesR-squared:  0.895
Model:OLSAdj. R-squared:0.883
Method:  Least SquaresF-statistic:74.20
Date: Fri, 07 May 2021Prob (F-statistic):  7.12e-13
Time:11:51:52Log-Likelihood:  3.3225
No. Observations:30AIC: 1.355
Df Residuals: 26BIC: 6.960
Df Model:3 
Covariance Type:nonrobust 
==============================================================================
  coef std err tP>|t|[0.0250.975]
------------------------------------------------------------------------------
const 8.03682.4803.2410.003 2.94013.134
x1-1.11840.398  -2.8110.009-1.936-0.300
x2 0.26480.1991.3320.195-0.144 0.674
x3 0.49270.1253.9380.001 0.236 0.750
x4 1.38320.2884.7980.000 0.791 1.976
==============================================================================
Omnibus:0.141Durbin-Watson: 1.762
Prob(Omnibus):0.932Jarque-Bera (JB): 0.030
Skew:0.052Prob(JB):0.985
Kurtosis:  2.885Cond. 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

版權(quán)說(shuō)明:

本問(wèn)題及數(shù)據(jù)來(lái)自:姜啟源、謝金星,數(shù)學(xué)模型(第 3版),高等教育出版社
本文內(nèi)容及例程為作者原創(chuàng),并非轉(zhuǎn)載書籍或網(wǎng)絡(luò)內(nèi)容。

以上就是Python數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸模型數(shù)據(jù)的準(zhǔn)備的詳細(xì)內(nèi)容,更多關(guān)于數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸模型數(shù)據(jù)準(zhǔn)備的資料請(qǐng)關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部