1. 程式人生 > >python資料分析與挖掘實戰-第六章拓展偷漏稅使用者識別

python資料分析與挖掘實戰-第六章拓展偷漏稅使用者識別

第六章分別使用了LM神經網路和CART 決策樹構建了電力竊漏電使用者自動識別模型,章末提出了拓展思考--偷漏稅使用者識別。

專案要求:汽車銷售行業在稅收上存在多種偷漏稅情況導致政府損失大量稅收。汽車銷售企業的部分經營指標能在一定程度上評估企業的偷漏稅傾向,附件資料提供了汽車銷售行業納稅人的各個屬性和是否偷漏稅標識,請結合各個屬性,總結衡量納稅人的經營特徵,建立偷漏稅行為識別模型。

專案步驟:

  1. 資料初步探索分析
  2. 資料預處理
  3. 模型選擇與建立
  4. 模型比較
資料初步探索分析資料預處理模型選擇與建立模型比較

1.資料初步探索分析

一共124個樣本,16個屬性。

先用Excel看下不同銷售型別和銷售模式下的輸出頻率分佈。


                                                                       圖1 不同銷售型別下的偷漏稅頻率分佈


                                                                     圖2 不同銷售模式下的偷漏稅頻率分佈

可以看到所有銷售型別和銷售模式都有異常偷漏稅情況,由圖1可以看出來國產轎車異常數最高,但是與正常數相比,可以明顯看出來大客車的異常數遠高於正常數,說明大客車更多的存在偷漏稅情況。同樣由圖2可以看出來一級代理商、二級及二級以下代理商的更多的多的存在偷漏稅情況。

接下來用python進行分析。分異常和正常兩類看下數值型經營指標。

datafile = 'Taxevasion identification.xls'

df = pd.read_excel(datafile)
#print(data.describe().T)
df_normal = df.iloc[:,3:16][df[u"輸出"]=="正常"]
df_abnormal=df.iloc[:,3:16][df[u'輸出']=='異常']

df_normal.describe().T.to_excel('normal.xls')
df_abnormal.describe().T.to_excel('abnormal.xls')

異常

正常


2.資料預處理

無缺失值,暫不處理。主要對銷售型別、銷售模式以及輸出進行虛擬變數的建立。 

df1 = pd.get_dummies(df[u'銷售型別'],prefix='type')
df2 = pd.get_dummies(df[u'銷售模式'],prefix='model')
res = pd.get_dummies(df[u'輸出'],prefix='result')
df = pd.concat([df,df1,df2,res],axis=1)
df.drop([u'銷售型別',u'銷售模式',u'輸出'],axis=1,inplace = True)
#正常列去除,異常列作為結果 1表示異常 0表示正常
df.drop([u'result_正常'],axis=1,inplace=True)
df.rename(columns={u'result_異常':'result'},inplace = True)

3.模型選擇與建立

分別使用決策樹模型和邏輯迴歸模型。

3.1 決策樹模型

#決策樹模型

data = df.as_matrix()
shuffle(data)

p = 0.8
train = data[:int(len(data)*p),:]
test = data[int(len(data)*p):,:]

tree =  DecisionTreeClassifier()
X = train[:,1:-1]
Y = train[:,-1]
tree.fit(X,Y)
#儲存模型
joblib.dump(tree,'tree1.pkl')
#混淆矩陣
cm = confusion_matrix(Y,tree.predict(X))

plt.matshow(cm,cmap=plt.cm.Blues)
plt.colorbar()

for x in range(len(cm)): #資料標籤
  for y in range(len(cm)):
    plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')

plt.ylabel('True label') #座標軸標籤
plt.xlabel('Predicted label') #座標軸標籤
plt.show() #顯示作圖結果

訓練集混淆矩陣:

測試集:

決策樹模型在訓練集上準確率為100%,在測試集上準確率為88%。

3.2 邏輯迴歸模型

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=1.0,penalty='l1',tol=1e-6)
lr.fit(X,Y)

訓練集混淆矩陣:


樣本集:

邏輯迴歸模型訓練集準確率93%,測試集準確率72%。

各項屬性權重為:


可以看出來與最開始的分析相差不多,大客車和一級代理商都有很大可能存在偷漏稅情況。

3.模型比較

#兩個模型的roc曲線
fig,ax=plt.subplots()
fpr, tpr, thresholds = roc_curve(test[:,-1], tree.predict_proba(test[:,1:-1])[:,1], pos_label=1)
fpr2, tpr2, thresholds2 = roc_curve(test[:,-1], lr.predict_proba(test[:,1:-1])[:,1], pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label = 'ROC of CART', color = 'blue') #作出ROC曲線
plt.plot(fpr2, tpr2, linewidth=2, label = 'ROC of LR', color = 'green') #作出ROC曲線
plt.xlabel('False Positive Rate') #座標軸標籤
plt.ylabel('True Positive Rate') #座標軸標籤
plt.ylim(0,1.05) #邊界範圍
plt.xlim(0,1.05) #邊界範圍
plt.legend(loc=4) #圖例
plt.show() #顯示作圖結果


ROC曲線越靠近左上角,則模型效能越優,當兩個曲線做於同一個座標時,若一個模型的曲線完全包住另一個模型,則前者優,當兩者有交叉時,則看曲線下的面積,上圖明顯藍色線下的面積更大,即CART決策樹模型效能更優。 
由此可見,對於本文中的例子來說,CART決策樹模型不管從混淆矩陣來看,還是從ROC曲線來看,其效能都要優於邏輯迴歸模型。