自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

大數(shù)據(jù) 數(shù)據(jù)分析 后端
本數(shù)據(jù)集共收集了發(fā)生在一個(gè)月內(nèi)的28010條數(shù)據(jù),包含以下字段: ['訂單編號(hào)', '總金額', '買家實(shí)際支付金額', '收貨地址', '訂單創(chuàng)建時(shí)間', '訂單付款時(shí)間 ', '退款金額']。

數(shù)據(jù)集簡(jiǎn)介

本數(shù)據(jù)集共收集了發(fā)生在一個(gè)月內(nèi)的28010條數(shù)據(jù),包含以下字段:

  • ['訂單編號(hào)', '總金額', '買家實(shí)際支付金額', '收貨地址', '訂單創(chuàng)建時(shí)間', '訂單付款時(shí)間 ', '退款金額']

7個(gè)字段說明:

  • 訂單編號(hào):訂單編號(hào);
  • 總金額:訂單總金額;
  • 買家實(shí)際支付金額:總金額 - 退款金額(在已付款的情況下)。金額為0(在未付款的情況下);
  • 收貨地址:各個(gè)省份;
  • 訂單創(chuàng)建時(shí)間:下單時(shí)間;
  • 訂單付款時(shí)間:付款時(shí)間;
  • 退款金額:付款后申請(qǐng)退款的金額。如無付過款,退款金額為0。

數(shù)據(jù)概覽: 

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

相關(guān)庫、函數(shù)和數(shù)據(jù)的導(dǎo)入

  1. # 相關(guān)庫和函數(shù)的導(dǎo)入 
  2.  
  3. import numpy as np 
  4. from sklearn import metrics 
  5. import math 
  6. import copy 
  7. import pandas as pd           
  8. import scipy as sp導(dǎo)入常用的基本庫 
  9.  
  10. import datetime as date                                 # 導(dǎo)入datetime庫 
  11. import seaborn as sns                                   # 導(dǎo)入seaborn庫,用于數(shù)據(jù)可視化 
  12. from IPython.display import display                     # 載入數(shù)據(jù)查看時(shí)需要使用的函數(shù) 
  13. from sklearn.model_selection import train_test_split    # 導(dǎo)入數(shù)據(jù)集劃分時(shí)需要使用的函數(shù) 
  14. from sklearn.metrics import confusion_matrix            # 導(dǎo)入生成混淆矩陣的函數(shù) 
  15. from sklearn.preprocessing import LabelEncoder          # 導(dǎo)入分類變量編碼時(shí)需要使用的函數(shù) 
  16. from sklearn.metrics import classification_report       # 導(dǎo)入分類結(jié)果評(píng)價(jià)時(shí)要用到的函數(shù) 
  17.  
  18. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis     # 導(dǎo)入LDA判別時(shí)需要使用的函數(shù) 
  19. from sklearn.naive_bayes import MultinomialNB           # 導(dǎo)入樸素貝葉斯時(shí)需要使用的額函數(shù) 
  20. from sklearn.neighbors import KNeighborsClassifier      # 導(dǎo)入KNN判別時(shí)需要使用的函數(shù) 
  21. from sklearn.tree import DecisionTreeClassifier         # 導(dǎo)入決策樹函數(shù) 
  22. from sklearn.neural_network import MLPClassifier        # 導(dǎo)入神經(jīng)網(wǎng)絡(luò)函數(shù) 
  23. from sklearn import svm                                 # 導(dǎo)入支持向量機(jī)函數(shù) 
  24.  
  25. from sklearn.model_selection import GridSearchCV        # 導(dǎo)入模型優(yōu)化方法中的網(wǎng)格搜索法需要用到的函數(shù) 
  26. from sklearn.cross_validation import KFold              # 導(dǎo)入模型評(píng)估時(shí)使用的函數(shù) 
  27.  
  28. # 數(shù)據(jù)導(dǎo)入 
  29.  
  30. dt = pd.read_csv('D:資料/數(shù)據(jù)分析/數(shù)據(jù)分析與數(shù)據(jù)挖掘/實(shí)戰(zhàn)演練/5(tmall_order_report)/tmall_order_report.csv',encoding='gbk',engine='python'

數(shù)據(jù)檢查與清洗

首先,查看一下數(shù)據(jù)集的變量類型:

  1. dt.dtypes                                               # 查看數(shù)據(jù)集有哪些變量  
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

然后,將變量中右側(cè)的空格去除(以免影響后續(xù)調(diào)用變量),并進(jìn)行重復(fù)值和缺失值檢查:

  1. dt.columns = dt.columns.str.rstrip()                    # 去除列名右側(cè)的空格 
  2. dt.duplicated().sum()                                   # 檢查數(shù)據(jù)是否有重復(fù)值,發(fā)現(xiàn)并沒有重復(fù)值 
  3. display(sum(dt.isnull().sum()))                         # 檢查數(shù)據(jù)集是否有缺失值  
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

檢查出來有缺失值(約占數(shù)據(jù)總量的12-15%),考慮原數(shù)據(jù)中是否是因?yàn)?ldquo;訂單付款時(shí)間”這一列存在缺失值而導(dǎo)致產(chǎn)生這樣的檢查結(jié)果:

  1. col = dt.columns.values.tolist()                        # 提取數(shù)據(jù)集中的所有列變量的名稱 
  2. col.remove('訂單付款時(shí)間')                               # 將訂單付款時(shí)間這一列去除 
  3. display(sum(dt[col].isnull().sum()))                    # 再次檢查是否有缺失值,發(fā)現(xiàn)并沒有缺失值,也就是缺失值均來自“訂單付款時(shí)間”這一列  
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

結(jié)果表明,缺失值僅來自“訂單付款時(shí)間”這一列。接下來就是處理缺失值,處理的思路可以是先計(jì)算出各訂單付款時(shí)間和下單時(shí)間的平均值,然后用下單時(shí)間 + 平均值,作為缺失值的填補(bǔ)對(duì)象:

  1. c = np.array(['訂單創(chuàng)建時(shí)間','訂單付款時(shí)間'])             # 提取訂單創(chuàng)建時(shí)間、付款時(shí)間這兩列的列名 
  2. for i in c: 
  3.     dt[i] = pd.to_datetime(dt[i])                       # 將訂單創(chuàng)建時(shí)間、付款時(shí)間由object類型轉(zhuǎn)為datetime類型,方便運(yùn)算 
  4. for i in range(0,dt.shape[0]): 
  5.     if (dt['訂單付款時(shí)間'].iloc[i] < dt['訂單創(chuàng)建時(shí)間'].iloc[i]) == True
  6.         dt['訂單付款時(shí)間'].iloc[i] = dt['訂單付款時(shí)間'].iloc[i] + date.timedelta(days=1)     # 將訂單付款時(shí)間 < 訂單創(chuàng)建時(shí)間的時(shí)間數(shù)據(jù)往后加1天(因?yàn)樵瓟?shù)據(jù)中沒有考慮日期差異情況)  
  7. mu = np.mean(dt['訂單付款時(shí)間']-dt['訂單創(chuàng)建時(shí)間'])       # 計(jì)算時(shí)間差的均值,用于之后進(jìn)行缺失值替換 
  8. for i in range(0,dt.shape[0]): 
  9.     if pd.isnull(dt['訂單付款時(shí)間'].iloc[i]) == True:    # 進(jìn)行缺失值填補(bǔ) 
  10.         dt['訂單付款時(shí)間'].iloc[i] = dt['訂單創(chuàng)建時(shí)間'].iloc[i] + mu 

在填補(bǔ)完成之后,再次檢查缺失值和重復(fù)值的情況:

  1. display(sum(dt.isnull().sum()))                         # 再次檢查數(shù)據(jù)集是否有缺失值,發(fā)現(xiàn)已經(jīng)處理完了,但是還要檢查是否增加正確 
  2. display(dt.duplicated().sum())                          # 再次檢查數(shù)據(jù)是否有重復(fù)值,發(fā)現(xiàn)并沒有重復(fù)值,發(fā)現(xiàn)也沒有重復(fù)值 
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

結(jié)果顯示已經(jīng)沒有缺失值和重復(fù)值了。

描述性分析

首先,對(duì)訂單總金額進(jìn)行描述性分析:

  1. display(dt['總金額'].describe())                        # 查看訂單總金額的情況,發(fā)現(xiàn)最大的訂單價(jià)格達(dá)到了188320元,最小的則只有1元,平均訂單價(jià)為107元左右  
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

從描述統(tǒng)計(jì)的結(jié)果中可以看到,最大的訂單價(jià)格達(dá)到了188320元,最小的只有1元,平均訂單價(jià)在107元左右,中位數(shù)為1元,說明應(yīng)該是一個(gè)左偏分布,即大部分訂單的價(jià)格應(yīng)該都不高。然后查看買家實(shí)際支付金額為0(支付未完成)的訂單比例:

  1. sum(dt['買家實(shí)際支付金額']==0) / dt.shape[0]             # 查看買家實(shí)際支付金額為0(也就是支付未完成)的訂單比例,占比約為32.3%  
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

從結(jié)果中可以看到,大概有32.3%的買家未完成支付,這一比例還是比較高的。再看看訂單付款時(shí)間相比于訂單創(chuàng)建時(shí)間的延遲情況:

  1. display((dt['訂單付款時(shí)間']-dt['訂單創(chuàng)建時(shí)間']).describe())     # 查看訂單付款時(shí)間相比于訂單創(chuàng)建時(shí)間的延遲情況,發(fā)現(xiàn)最慢的支付延遲了接近1天,而大部分訂單在10分鐘內(nèi)就完成了支付 

 Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

從中可以看到,最慢的支付延遲了接近1天,而大部分訂單在10分鐘內(nèi)就完成了支付。最后,來對(duì)收貨地址情況進(jìn)行描述性分析:

  1. siz = dt.groupby(dt['收貨地址']).size()                 # 對(duì)收貨地址進(jìn)行分組統(tǒng)計(jì) 
  2. idx_sort = np.argsort(-siz)                            # 對(duì)分組統(tǒng)計(jì)的結(jié)果進(jìn)行降序排序 
  3. display(siz[idx_sort].head())                          # 查看降序排序的結(jié)果的前5名,發(fā)現(xiàn)收貨地址選擇上海、廣東、江蘇、浙江、北京的最多 
  4. siz[idx_sort].tail()                                   # 查看降序排序的結(jié)果的最后5名,發(fā)現(xiàn)收貨地址選擇湖北、新疆、寧夏、青海和西藏的最少,其中湖北可能受疫情影響所致 
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

從結(jié)果中可以看到,收貨地址選擇上海、廣東、江蘇、浙江、北京的最多,而選湖北、新疆、寧夏、青海和西藏的最少,其中湖北可能受疫情影響所致。

建模預(yù)處理

首先,進(jìn)行特征構(gòu)建,并生成用于建模的數(shù)據(jù)集,處理過程如下:

  1. d1 = (dt['訂單付款時(shí)間']-dt['訂單創(chuàng)建時(shí)間'])            # 輸出訂單付款和創(chuàng)建之間的時(shí)間差,作為一個(gè)新變量 
  2. d1 = (d1 / np.timedelta64(1, 's')).astype(int)        # 將時(shí)間差的格式進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換為按秒計(jì)數(shù),并把格式變?yōu)?/span>int類型 
  3. le_train = LabelEncoder()                             # 使用從sklearn.preprocessing中import的LabelEncoder對(duì)分類數(shù)據(jù)進(jìn)行編碼,以便于后續(xù)使用交叉驗(yàn)證建模  
  4. le_train.fit(dt['收貨地址'].tolist())                  # 對(duì)模型進(jìn)行訓(xùn)練 
  5. d2 = le_train.transform(dt['收貨地址'].tolist())       # 轉(zhuǎn)化數(shù)據(jù),作為第2個(gè)變量 
  6. d3 = np.zeros(dt.shape[0])                            # 構(gòu)建一個(gè)全為0的數(shù)組 
  7. for i in range(0,dt.shape[0]): 
  8.     if (dt['總金額'].iloc[i]-dt['買家實(shí)際支付金額'].iloc[i]) == dt['退款金額'].iloc[i]: 
  9.         d3[i] = 1                                     # 生成一個(gè)新變量(類別變量),當(dāng)買家有支付(無論退不退款)時(shí)為1,沒有支付時(shí)為0(無支付時(shí)上述等式不成立,實(shí)際支付金額和退款金額均為0),表明支付的情況 
  10. dt_use = np.vstack((d1,d2,d3)).T                      # 生成用于建模分析的數(shù)據(jù)集,np.vstack用于數(shù)組的垂直連接   

然后是對(duì)數(shù)據(jù)集進(jìn)行劃分,形成訓(xùn)練集和測(cè)試集,為之后的建模做準(zhǔn)備:

  1. x_train,x_test, y_train, y_test = train_test_split(dt_use[:,0:2],dt_use[:,2:3],test_size=0.25, random_state=0)     # 使用從sklearn.model_selection中import的train_test_split函數(shù)進(jìn)行訓(xùn)練集、測(cè)試集的劃分 
  2. print('訓(xùn)練集的自變量數(shù)據(jù)的維度',x_train.shape) 
  3. print('訓(xùn)練集的因變量量數(shù)據(jù)的維度',x_test.shape) 
  4. print('測(cè)試集的自變量數(shù)據(jù)的維度',y_train.shape)           
  5. print('測(cè)試集的因變量數(shù)據(jù)的維度',y_test.shape)          # 查看數(shù)據(jù)集劃分后的維度情況  
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

數(shù)據(jù)建模

首先,構(gòu)建初始的模型,這里完成的是分類預(yù)測(cè)任務(wù),選擇經(jīng)典的幾個(gè)模型,分別是 SVM、LDA、樸素貝葉斯NB、KNN判別、決策樹Detree和神經(jīng)網(wǎng)絡(luò)Network:

  1. models = {}                                           # 構(gòu)建一個(gè)models集合 
  2. models['SVM'] = svm.SVC()                             # 支持向量機(jī)模型 
  3. models['LDA'] = LinearDiscriminantAnalysis()          # LDA判別模型 
  4. models['NB'] = MultinomialNB()                        # 樸素貝葉斯模型 
  5. models['KNN'] = KNeighborsClassifier()                # KNN判別模型 
  6. models['Detree'] = DecisionTreeClassifier()           # 決策樹模型 
  7. models['Network'] = MLPClassifier()                   # 神經(jīng)網(wǎng)絡(luò)模型 

然后,對(duì)模型進(jìn)行訓(xùn)練和分析:

  1. target_names = ['有支付','沒有支付']                   # 生成類別的名稱 
  2. for key in models: 
  3.     models[key].fit(x_train,y_train)                  # 模型訓(xùn)練 
  4.     display(confusion_matrix(y_test,models[key].predict(x_test)))                                               # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出混淆矩陣 
  5.     print(classification_report(y_test,models[key].predict(x_test),target_names=target_names))                  # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出預(yù)測(cè)的分類評(píng)價(jià) 
  6.     print('\n')    

SVM模型的混淆矩陣和準(zhǔn)確率: 

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

LDA模型的混淆矩陣和準(zhǔn)確率: 

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

樸素貝葉斯NB模型的混淆矩陣和準(zhǔn)確率: 

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

KNN判別模型的混淆矩陣和準(zhǔn)確率: 

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

決策樹Detree模型的混淆矩陣和準(zhǔn)確率: 

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

神經(jīng)網(wǎng)絡(luò)Network模型的混淆矩陣和準(zhǔn)確率: 

Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

從上述結(jié)果中可以看到,SVM和KNN的準(zhǔn)確率較高。下面對(duì)樸素貝葉斯NB模型進(jìn)行調(diào)參,看是否能改善其預(yù)測(cè)準(zhǔn)確率:

  1. param_grid_nb = {'alpha':[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}    # 設(shè)定貝葉斯模型中不同alpha值 
  2. model_nb_ty = MultinomialNB()                          # 設(shè)定貝葉斯的模型 
  3. kfold = KFold(10, 6)                                   # 采用10折交叉驗(yàn)證,初始隨機(jī)起點(diǎn)為6 
  4. grid = GridSearchCV(estimator=model_nb_ty,  
  5.                     param_grid=param_grid_nb, scoring='neg_mean_squared_error', cv=kfold)         # 設(shè)置網(wǎng)格搜索的模型 
  6. grid_result = grid.fit(x_train, y_train)               # 利用構(gòu)建好的模型對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練,搜索最優(yōu)的k值 
  7. print('最優(yōu):%s 使用%s' % (grid_result.best_score_, grid_result.best_params_))                     # 輸出最優(yōu)的參數(shù)情況 
  8. nb_model = MultinomialNB(alpha=0)                      # 根據(jù)模型調(diào)參的結(jié)果,重新設(shè)定樸素貝葉斯模型 
  9. nb_model.fit(x_train,y_train)                          # 模型訓(xùn)練 
  10. display(confusion_matrix(y_test,nb_model.predict(x_test)))                                        # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出混淆矩陣 
  11. print(classification_report(y_test,nb_model.predict(x_test),target_names=target_names))           # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出預(yù)測(cè)的分類評(píng)價(jià),發(fā)現(xiàn)并沒有什么改進(jìn)  
Python數(shù)據(jù)分析難?手把手教你處理上萬條京東訂單數(shù)據(jù)(附源碼)

調(diào)參后的結(jié)果和調(diào)參前并沒有多少改善,說明NB模型在本次預(yù)測(cè)中受限于數(shù)據(jù)情況,而不是模型參數(shù)。

最后放上全過程的代碼,供大家學(xué)習(xí)使用:

  1. ### 數(shù)據(jù)分析前期準(zhǔn)備工作 ### 
  2.  
  3. # 相關(guān)庫和函數(shù)的導(dǎo)入 
  4.  
  5. import numpy as np 
  6. from sklearn import metrics 
  7. import math 
  8. import copy 
  9. import pandas as pd           
  10. import scipy as sp 
  11. import matplotlib.pyplot as plt               # 導(dǎo)入常用的基本庫 
  12.  
  13. import datetime as date                                 # 導(dǎo)入datetime庫 
  14. import seaborn as sns                                   # 導(dǎo)入seaborn庫,用于數(shù)據(jù)可視化 
  15. from IPython.display import display                     # 載入數(shù)據(jù)查看時(shí)需要使用的函數(shù) 
  16. from sklearn.model_selection import train_test_split    # 導(dǎo)入數(shù)據(jù)集劃分時(shí)需要使用的函數(shù) 
  17. from sklearn.metrics import confusion_matrix            # 導(dǎo)入生成混淆矩陣的函數(shù) 
  18. from sklearn.preprocessing import LabelEncoder          # 導(dǎo)入分類變量編碼時(shí)需要使用的函數(shù) 
  19. from sklearn.metrics import classification_report       # 導(dǎo)入分類結(jié)果評(píng)價(jià)時(shí)要用到的函數(shù)   
  20.  
  21. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis     # 導(dǎo)入LDA判別時(shí)需要使用的函數(shù) 
  22. from sklearn.naive_bayes import MultinomialNB           # 導(dǎo)入樸素貝葉斯時(shí)需要使用的額函數(shù) 
  23. from sklearn.neighbors import KNeighborsClassifier      # 導(dǎo)入KNN判別時(shí)需要使用的函數(shù) 
  24. from sklearn.tree import DecisionTreeClassifier         # 導(dǎo)入決策樹函數(shù) 
  25. from sklearn.neural_network import MLPClassifier        # 導(dǎo)入神經(jīng)網(wǎng)絡(luò)函數(shù) 
  26. from sklearn import svm                                 # 導(dǎo)入支持向量機(jī)函數(shù) 
  27.  
  28. from sklearn.model_selection import GridSearchCV        # 導(dǎo)入模型優(yōu)化方法中的網(wǎng)格搜索法需要用到的函數(shù) 
  29. from sklearn.cross_validation import KFold              # 導(dǎo)入模型評(píng)估時(shí)使用的函數(shù) 
  30.  
  31. # 全局設(shè)定 
  32.  
  33. plt.rcParams['font.sans-serif']=['SimHei']              # 設(shè)定中文字符的顯示設(shè)定 
  34.  
  35. # 數(shù)據(jù)導(dǎo)入 
  36.  
  37. dt = pd.read_csv('D:資料/數(shù)據(jù)分析/數(shù)據(jù)分析與數(shù)據(jù)挖掘/實(shí)戰(zhàn)演練/5(tmall_order_report)/tmall_order_report.csv',encoding='gbk',engine='python'
  38.  
  39.  
  40.  
  41. ### 數(shù)據(jù)整理與查看 ### 
  42.  
  43. # 數(shù)據(jù)檢查與清洗 
  44.  
  45. dt.dtypes                                               # 查看數(shù)據(jù)集有哪些變量 
  46.  
  47. dt.columns = dt.columns.str.rstrip()                    # 去除列名右側(cè)的空格 
  48.  
  49. dt.duplicated().sum()                                   # 檢查數(shù)據(jù)是否有重復(fù)值,發(fā)現(xiàn)并沒有重復(fù)值 
  50.  
  51. display(sum(dt.isnull().sum()))                         # 檢查數(shù)據(jù)集是否有缺失值 
  52.  
  53. col = dt.columns.values.tolist()                        # 提取數(shù)據(jù)集中的所有列變量的名稱 
  54.  
  55. col.remove('訂單付款時(shí)間')                               # 將訂單付款時(shí)間這一列去除 
  56.  
  57. display(sum(dt[col].isnull().sum()))                    # 再次檢查是否有缺失值,發(fā)現(xiàn)并沒有缺失值,也就是缺失值均來自“訂單付款時(shí)間”這一列 
  58.  
  59. c = np.array(['訂單創(chuàng)建時(shí)間','訂單付款時(shí)間'])             # 提取訂單創(chuàng)建時(shí)間、付款時(shí)間這兩列的列名 
  60.  
  61. for i in c: 
  62.     dt[i] = pd.to_datetime(dt[i])                       # 將訂單創(chuàng)建時(shí)間、付款時(shí)間由object類型轉(zhuǎn)為datetime類型,方便運(yùn)算 
  63.  
  64. for i in range(0,dt.shape[0]): 
  65.     if (dt['訂單付款時(shí)間'].iloc[i] < dt['訂單創(chuàng)建時(shí)間'].iloc[i]) == True
  66.         dt['訂單付款時(shí)間'].iloc[i] = dt['訂單付款時(shí)間'].iloc[i] + date.timedelta(days=1)     # 將訂單付款時(shí)間 < 訂單創(chuàng)建時(shí)間的時(shí)間數(shù)據(jù)往后加1天(因?yàn)樵瓟?shù)據(jù)中沒有考慮日期差異情況)  
  67.  
  68. mu = np.mean(dt['訂單付款時(shí)間']-dt['訂單創(chuàng)建時(shí)間'])       # 計(jì)算時(shí)間差的均值,用于之后進(jìn)行缺失值替換 
  69.  
  70. for i in range(0,dt.shape[0]): 
  71.     if pd.isnull(dt['訂單付款時(shí)間'].iloc[i]) == True:    # 進(jìn)行缺失值填補(bǔ) 
  72.         dt['訂單付款時(shí)間'].iloc[i] = dt['訂單創(chuàng)建時(shí)間'].iloc[i] + mu 
  73.  
  74. display(sum(dt.isnull().sum()))                         # 再次檢查數(shù)據(jù)集是否有缺失值,發(fā)現(xiàn)已經(jīng)處理完了,但是還要檢查是否增加正確 
  75.  
  76. display(dt.duplicated().sum())                          # 再次檢查數(shù)據(jù)是否有重復(fù)值,發(fā)現(xiàn)并沒有重復(fù)值,發(fā)現(xiàn)也沒有重復(fù)值 
  77.  
  78. # 描述性分析 
  79.  
  80. display(dt['總金額'].describe())                        # 查看訂單總金額的情況,發(fā)現(xiàn)最大的訂單價(jià)格達(dá)到了188320元,最小的則只有1元,平均訂單價(jià)為107元左右 
  81.  
  82. sum(dt['買家實(shí)際支付金額']==0) / dt.shape[0]             # 查看買家實(shí)際支付金額為0(也就是支付未完成)的訂單比例,占比約為32.3% 
  83.  
  84. display((dt['訂單付款時(shí)間']-dt['訂單創(chuàng)建時(shí)間']).describe())     # 查看訂單付款時(shí)間相比于訂單創(chuàng)建時(shí)間的延遲情況,發(fā)現(xiàn)最慢的支付延遲了接近1天,而大部分訂單在10分鐘內(nèi)就完成了支付 
  85.  
  86. siz = dt.groupby(dt['收貨地址']).size()                 # 對(duì)收貨地址進(jìn)行分組統(tǒng)計(jì) 
  87. idx_sort = np.argsort(-siz)                            # 對(duì)分組統(tǒng)計(jì)的結(jié)果進(jìn)行降序排序 
  88. display(siz[idx_sort].head())                          # 查看降序排序的結(jié)果的前5名,發(fā)現(xiàn)收貨地址選擇上海、廣東、江蘇、浙江、北京的最多 
  89. siz[idx_sort].tail()                                   # 查看降序排序的結(jié)果的最后5名,發(fā)現(xiàn)收貨地址選擇湖北、新疆、寧夏、青海和西藏的最少,其中湖北可能受疫情影響所致 
  90.  
  91.  
  92.  
  93. ### 建模預(yù)處理 ### 
  94.  
  95. # 特征構(gòu)建 
  96.  
  97. d1 = (dt['訂單付款時(shí)間']-dt['訂單創(chuàng)建時(shí)間'])            # 輸出訂單付款和創(chuàng)建之間的時(shí)間差,作為一個(gè)新變量 
  98. d1 = (d1 / np.timedelta64(1, 's')).astype(int)        # 將時(shí)間差的格式進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換為按秒計(jì)數(shù),并把格式變?yōu)?/span>int類型 
  99.  
  100. le_train = LabelEncoder()                             # 使用從sklearn.preprocessing中import的LabelEncoder對(duì)分類數(shù)據(jù)進(jìn)行編碼,以便于后續(xù)使用交叉驗(yàn)證建模  
  101. le_train.fit(dt['收貨地址'].tolist())                  # 對(duì)模型進(jìn)行訓(xùn)練 
  102. d2 = le_train.transform(dt['收貨地址'].tolist())       # 轉(zhuǎn)化數(shù)據(jù),作為第2個(gè)變量 
  103.  
  104. d3 = np.zeros(dt.shape[0])                            # 構(gòu)建一個(gè)全為0的數(shù)組 
  105.  
  106. for i in range(0,dt.shape[0]): 
  107.     if (dt['總金額'].iloc[i]-dt['買家實(shí)際支付金額'].iloc[i]) == dt['退款金額'].iloc[i]: 
  108.         d3[i] = 1                                     # 生成一個(gè)新變量(類別變量),當(dāng)買家有支付(無論退不退款)時(shí)為1,沒有支付時(shí)為0(無支付時(shí)上述等式不成立,實(shí)際支付金額和退款金額均為0),表明支付的情況 
  109.  
  110. dt_use = np.vstack((d1,d2,d3)).T                      # 生成用于建模分析的數(shù)據(jù)集,np.vstack用于數(shù)組的垂直連接    
  111.  
  112. # 數(shù)據(jù)集劃分 
  113.  
  114. x_train,x_test, y_train, y_test = train_test_split(dt_use[:,0:2],dt_use[:,2:3],test_size=0.25, random_state=0)     # 使用從sklearn.model_selection中import的train_test_split函數(shù)進(jìn)行訓(xùn)練集、測(cè)試集的劃分 
  115.  
  116. print('訓(xùn)練集的自變量數(shù)據(jù)的維度',x_train.shape) 
  117. print('訓(xùn)練集的因變量量數(shù)據(jù)的維度',x_test.shape) 
  118. print('測(cè)試集的自變量數(shù)據(jù)的維度',y_train.shape)           
  119. print('測(cè)試集的因變量數(shù)據(jù)的維度',y_test.shape)          # 查看數(shù)據(jù)集劃分后的維度情況 
  120.  
  121.  
  122.  
  123. ### 數(shù)據(jù)建模 ### 
  124.  
  125. # 初始模型構(gòu)建 
  126.  
  127. models = {}                                           # 構(gòu)建一個(gè)models集合 
  128.  
  129. models['SVM'] = svm.SVC()                             # 支持向量機(jī)模型 
  130.  
  131. models['LDA'] = LinearDiscriminantAnalysis()          # LDA判別模型 
  132.  
  133. models['NB'] = MultinomialNB()                        # 樸素貝葉斯模型 
  134.  
  135. models['KNN'] = KNeighborsClassifier()                # KNN判別模型 
  136.  
  137. models['Detree'] = DecisionTreeClassifier()           # 決策樹模型 
  138.  
  139. models['Network'] = MLPClassifier()                   # 神經(jīng)網(wǎng)絡(luò)模型 
  140.  
  141. # 模型訓(xùn)練與分析 
  142.  
  143. target_names = ['有支付','沒有支付']                   # 生成類別的名稱 
  144.  
  145. for key in models: 
  146.     models[key].fit(x_train,y_train)                  # 模型訓(xùn)練 
  147.     display(confusion_matrix(y_test,models[key].predict(x_test)))                                               # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出混淆矩陣 
  148.     print(classification_report(y_test,models[key].predict(x_test),target_names=target_names))                  # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出預(yù)測(cè)的分類評(píng)價(jià) 
  149.     print('\n'
  150.      
  151. # 模型調(diào)參(NB模型) 
  152.  
  153. param_grid_nb = {'alpha':[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}    # 設(shè)定貝葉斯模型中不同alpha值 
  154.  
  155. model_nb_ty = MultinomialNB()                          # 設(shè)定貝葉斯的模型 
  156.  
  157. kfold = KFold(10, 6)                                   # 采用10折交叉驗(yàn)證,初始隨機(jī)起點(diǎn)為6 
  158.  
  159. grid = GridSearchCV(estimator=model_nb_ty,  
  160.                     param_grid=param_grid_nb, scoring='neg_mean_squared_error', cv=kfold)         # 設(shè)置網(wǎng)格搜索的模型 
  161.  
  162. grid_result = grid.fit(x_train, y_train)               # 利用構(gòu)建好的模型對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練,搜索最優(yōu)的k值 
  163.  
  164. print('最優(yōu):%s 使用%s' % (grid_result.best_score_, grid_result.best_params_))                     # 輸出最優(yōu)的參數(shù)情況 
  165.  
  166. nb_model = MultinomialNB(alpha=0)                      # 根據(jù)模型調(diào)參的結(jié)果,重新設(shè)定樸素貝葉斯模型 
  167.  
  168. nb_model.fit(x_train,y_train)                          # 模型訓(xùn)練 
  169.  
  170. display(confusion_matrix(y_test,nb_model.predict(x_test)))                                        # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出混淆矩陣 
  171.  
  172. print(classification_report(y_test,nb_model.predict(x_test),target_names=target_names))           # 對(duì)y_test進(jìn)行預(yù)測(cè),輸出預(yù)測(cè)的分類評(píng)價(jià),發(fā)現(xiàn)并沒有什么改進(jìn) 

 

 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2017-05-18 12:45:35

數(shù)據(jù)分析數(shù)據(jù)理解數(shù)據(jù)

2015-10-26 09:24:30

微信公眾號(hào)數(shù)據(jù)分析

2021-09-03 08:58:00

數(shù)據(jù)分析可視化

2021-09-30 18:27:38

數(shù)據(jù)倉庫ETL

2021-11-09 09:01:36

Python網(wǎng)絡(luò)爬蟲Python基礎(chǔ)

2021-09-18 14:26:49

Linux Linux 啟動(dòng)流程Linux 系統(tǒng)

2020-04-14 10:20:12

MySQL數(shù)據(jù)庫死鎖

2024-10-16 11:40:47

2011-04-21 10:32:44

MySQL雙機(jī)同步

2020-11-27 07:38:43

MongoDB

2021-05-10 06:48:11

Python騰訊招聘

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2020-06-17 08:35:12

數(shù)據(jù)分析Python代碼

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2020-10-12 08:19:43

Python爬蟲網(wǎng)頁數(shù)據(jù)

2021-03-29 23:03:04

數(shù)據(jù)集數(shù)據(jù)庫科學(xué)

2021-02-06 14:55:05

大數(shù)據(jù)pandas數(shù)據(jù)分析

2021-09-22 08:51:34

Android

2022-11-06 14:46:28

腳本windows文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)