日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2025/3/15 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数模笔记-StatsModels 统计回归(3)模型数据的准备 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

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


歡迎關(guān)注 Youcans 原創(chuàng)系列,每周更新數(shù)模筆記

Python數(shù)模筆記-PuLP庫(kù)
Python數(shù)模筆記-StatsModels統(tǒng)計(jì)回歸
Python數(shù)模筆記-Sklearn
Python數(shù)模筆記-NetworkX
Python數(shù)模筆記-模擬退火算法

使用 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 pddfData = 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,000fileName= './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í)際工作中,在開(kāi)始建立模型和擬合分析之前,還要對(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ì)填充缺失值或替換缺失值,在此就不做介紹了。
  
  (2)重復(fù)數(shù)據(jù)的處理
  
  對(duì)于重復(fù)數(shù)據(jù),通常會(huì)刪除重復(fù)行。使用 pandas 中的 .duplicated() 可以查詢(xún)重復(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ù)值明顯偏離樣本集中其它樣本的觀(guān)測(cè)值,也稱(chēng)為離群點(diǎn)。異常值可以通過(guò)箱線(xiàn)圖、正態(tài)分布圖進(jìn)行識(shí)別,也可以通過(guò)回歸、聚類(lèi)建模進(jìn)行識(shí)別。
  
  箱線(xiàn)圖技術(shù)是利用數(shù)據(jù)的分位數(shù)識(shí)別其中的異常點(diǎn)。箱形圖分析也超過(guò)本文的內(nèi)容,不能詳細(xì)介紹了。只能籠統(tǒng)地說(shuō)通過(guò)觀(guān)察箱形圖,可以查看整體的異常情況,進(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è)月本公司牙膏銷(xiāo)售量、價(jià)格、廣告費(fèi)用及同期的市場(chǎng)均價(jià)。
  (1)分析牙膏銷(xiāo)售量與價(jià)格、廣告投入之間的關(guān)系,建立數(shù)學(xué)模型;
  (2)估計(jì)所建立數(shù)學(xué)模型的參數(shù),進(jìn)行統(tǒng)計(jì)分析;
  (3)利用擬合模型,預(yù)測(cè)在不同價(jià)格和廣告費(fèi)用下的牙膏銷(xiāo)售量。
  
  本問(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)一元線(xiàn)性回歸 # v2.0: 調(diào)用 statsmodels 實(shí)現(xiàn)多元線(xiàn)性回歸 # v3.0: 從文件讀取數(shù)據(jù)樣本 # 日期:2021-05-06 # Copyright 2021 YouCans, XUPTimport numpy as np import pandas as pd import statsmodels.api as sm import matplotlib.pyplot as plt# 主程序 = 關(guān)注 Youcans,分享原創(chuàng)系列 https://blog.csdn.net/youcans = 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)為 0dfOpenFile = 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ù)類(lèi)型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 # 銷(xiāo)售價(jià)格x2 = dfData.average # 市場(chǎng)均價(jià)x3 = dfData.advertise # 廣告費(fèi)x4 = dfData.difference # 價(jià)格差,x4 = x1 - x2X = 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 + emodel = 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, XUPTreturn#= 關(guān)注 Youcans,分享原創(chuàng)系列 https://blog.csdn.net/youcans = if __name__ == '__main__':main()

4.3 程序運(yùn)行結(jié)果:

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



歡迎關(guān)注 Youcans 原創(chuàng)系列,每周更新數(shù)模筆記

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

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


    Python數(shù)模筆記-PuLP庫(kù)(1)線(xiàn)性規(guī)劃入門(mén)
    Python數(shù)模筆記-PuLP庫(kù)(2)線(xiàn)性規(guī)劃進(jìn)階
    Python數(shù)模筆記-PuLP庫(kù)(3)線(xiàn)性規(guī)劃實(shí)例
    Python數(shù)模筆記-NetworkX(1)圖的操作
    Python數(shù)模筆記-NetworkX(2)最短路徑
    Python數(shù)模筆記-NetworkX(3)條件最短路徑
    Python數(shù)模筆記-StatsModels 統(tǒng)計(jì)回歸(1)簡(jiǎn)介
    Python數(shù)模筆記-StatsModels 統(tǒng)計(jì)回歸(2)線(xiàn)性回歸
    Python數(shù)模筆記-StatsModels 統(tǒng)計(jì)回歸(3)模型數(shù)據(jù)的準(zhǔn)備
    Python數(shù)模筆記-StatsModels 統(tǒng)計(jì)回歸(4)可視化
    Python數(shù)模筆記-Sklearn (1)介紹
    Python數(shù)模筆記-Sklearn (2)聚類(lèi)分析
    Python數(shù)模筆記-Sklearn (3)主成分分析
    Python數(shù)模筆記-Sklearn (4)線(xiàn)性回歸
    Python數(shù)模筆記-Sklearn (5)支持向量機(jī)
    Python數(shù)模筆記-模擬退火算法(1)多變量函數(shù)優(yōu)化
    Python數(shù)模筆記-模擬退火算法(2)約束條件的處理
    Python數(shù)模筆記-模擬退火算法(3)整數(shù)規(guī)劃問(wèn)題
    Python數(shù)模筆記-模擬退火算法(4)旅行商問(wèn)題

    總結(jié)

    以上是生活随笔為你收集整理的Python数模笔记-StatsModels 统计回归(3)模型数据的准备的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。