企业做假账偷税漏税的行为社会普遍,偷税漏税行为是违法行为,也直接影响政府财政收入。通过数据挖掘分析企业偷漏税行为,提高查缺查漏效率减。通过对于汽车销售企业的经营指标数据的分析和挖掘,以达到一定程度上对企业的偷漏税倾向的了解。本次数据分析所用的样本数据提供了汽车销售行业纳税人的各种经营指标属性和偷税漏税标签,提取纳税人经营特征可以建立偷漏税行为识别模型。
数据整理和查看
1.导入所需要的package
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlob inline
from keras.models import Sequential
from keras.layers.core import Dense,Activation
from sklearn.tree import DecisionTreeClassifier
from sklearn.metric import confusion_matrix
from skleran.metric import roc_curve
2.读取数据
filename = 'taxes_EDA.xls'
data = pd.read_excel(filename,index_col = '纳税人编号')
data.head(5)
数据是经过标准化处理的,各项数值已经控制到0-1的范围内。
#查看数据信息
data.info()
标签类型分别有销售类型,销售模式,汽车销售平均毛利,维修毛利,企业维修收入占销售收入比重 增值税税负,存货周转率,成本费用利润率,整体理论税负,整体税负控制数,办牌率,单台办牌手续费收入,代办保险率,保费返还率等十四个维度,以及输出这一标签。样本数据总共124个。
探索性数据分析 (EDA)
分析汽车行业销售模式的分析
data.describe()
企业维修收入占销售收入比重、增值税税负、存货周转率、办牌率、单台办牌手续费收入、代办保险率最小值皆为零。
error_model = data[data['输出']=='异常']['销售模式'].value_counts()
error_model.plot(kind = 'barh' , facecolor='#CDF76F')
plt.show()
error_model_pd = pd.DataFrame()
model = data['销售模式'].value_counts()
error_model_pd['所有有销售模式'] = model
error_model = data[data['输出']=='异常']['销售模式'].value_counts()
error_model_pd['异常销售模式'] = error_model
error_model_pd['占比'] = (data[data['输出']=='异常']['销售模式'].value_counts())/(data['销售模式'].value_counts())
error_model_pd
可以看出异常销售模式中,4S店销售数量最大,但按照占比来看,4S店以下,一级代理商、二级、二级以下、多类型经营店有着严重的偷税漏税倾向。
error_taxes = data[data['输出']=='异常']['销售类型'].value_counts()
error_taxes.plot(kind = 'barh' , facecolor='#CDF76F')
plt.show()
error_cata_pd = pd.DataFrame()
model = data['销售类型'].value_counts()
error_cata_pd['所有有销售类型'] = model
error_cata = data[data['输出']=='异常']['销售类型'].value_counts()
error_cata_pd['异常销售类型'] = error_cata
error_cata_pd['占比'] = (data[data['输出']=='异常']['销售类型'].value_counts())/(data['销售类型'].value_counts())
error_cata_pd.sort_values('占比',ascending=False)
可以看出国产轿车的数量极大,但是大车型更加有偷税漏税的可能性。
数据处理
离散型变量并无大小关系,运用map映射进行离散分类变量变换。
data['销售模式']=data['销售模式'].map({
'4S店':1,
'一级代理商':2,
'二级及二级以下代理商':3,
'多品牌经营店':4,
'其它':5
})
data['销售类型']=data['销售类型'].map({
'大客车':1,
'商用货车':2,
'卡车及轻卡':3,
'微型面包车':4,
'工程车':5,
'其它':6,
'国产轿车':7,
'进口轿车':8
})
data['输出']=data['输出'].map({
'正常':1,
'异常':0
})
模型建立
将数据按照二八原则分为训练集和测试集,
p = 0.8
data_t = data.as_matrix()
train = data_t[:int(len(data)*p),:]
test = data_t[int(len(data)*p):,:]
train[:,:14]
train[:,14]
1.运用keras的神经网络进行建模。设定输入节点数为14,输出节点数为1,隐藏层节点数为20,使用Adam方法求解。在隐藏层使用Relu(x) = max(x, 0) 做为激活函数。
from keras.models import Sequential
from keras.layers.core import Dense,Activation
net = Sequential()
net.add(Dense(input_dim = 14,output_dim = 20))
net.add(Activation('relu'))
net.add(Dense(input_dim = 20,output_dim = 1))
net.add(Activation('sigmoid'))
net.compile(loss = 'binary_crossentropy',optimizer = 'adam')
net.fit(train[:,:14],train[:,14],nb_epoch=1000,batch_size=10)
损失函数收敛为0.2030
predict_result = net.predict_classes(train[:,:14]).reshape(len(train))
cm_plot(train[:,14], predict_result).show() #显示混淆矩阵可视化结果
#自定义混淆矩阵可视化函数
def cm_plot(y, yp):
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y, yp)
plt.matshow(cm, cmap=plt.cm.Greens)
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')
return plt
from sklearn.metrics import roc_curve #导入ROC曲线函数
predict_result = net.predict(test[:,:14]).reshape(len(test))
fpr, tpr, thresholds = roc_curve(test[:,14], predict_result, pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label = 'ROC of LM')
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()
分类准确率为(59+33) / (59+33+3+4) = 92.9%
ROC图像
2.利用决策树建模,最深深度为4
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(max_depth=4)
tree.fit(train[:,:14], train[:,14])
cm_plot(train[:,14], tree.predict(train[:,:14])).show()
分类准确率为(59+35) / (59+35+3+2) = 94.9%
fpr , tpr , thresholds = roc_curve(test[:,14],tree.predict_proba(test[:,:14])[:,1],pos_label=1)
plt.plot(fpr,tpr,linewidth = 2 , label = 'ROC of CART')
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图像
DecisionTree的ROC图像更接近左上角,右下面积更大,分类性能更好,故而选择DecisionTree模型。
ps:尝试过数据变换运用one-shot编码变换,但是后面进行神经网络和决策树时,却容易过拟合,在训练集表现极其良好,但测试集成绩并不好。故而换为最简单的map映射。
sale_cata = pd.get_dummies(data['销售类型'],prefix = 'sale')
sale_model = pd.get_dummies(data['销售模式'],prefix = 'model')
data = pd.concat([data,sale_cata,sale_model],axis = 1)
data = data.drop('销售类型',axis=1)
data = data.drop('销售模式',axis=1)
data_target = data['输出']
data = data.drop('输出',axis = 1)
data = pd.concat([data,data_target],axis=1)
data_map = {
'正常':1,
'异常':0,
}
data['输出'] = data['输出'].map(data_map)
网友评论