2020 全国大学生数学建模竞赛C题思路+代码

您所在的位置:网站首页 美赛2021c题思路 2020 全国大学生数学建模竞赛C题思路+代码

2020 全国大学生数学建模竞赛C题思路+代码

2023-10-01 01:04| 来源: 网络整理| 查看: 265

题目链接:天翼云盘 珍藏美好生活 家庭云|网盘|文件备份|资源分享

前言

又是一年数据挖掘题型,第一次接触这种题型还是在去年的mathorcup上,这种题的难度就在于指标的建立和数据的处理上。后面会出一份关于数据挖掘题型,我的相关经验,常用的工具和代码。

下面的一,二问实际都在解决

贷不贷款?贷款金额多少? 数据清洗

这道题的附件数据没有出现缺省或者异常数据,因此对于数据的预处理,更多的是根据问题的需求来做的。

将是否违约,违约设置为1,不违约设置为0

信誉等级ABCD分别对应4,3,2,1

发票状态,有效发票为a,作废发票为b

我将销项和进项所有数据,以公司代码为区别,提取到了不同的sheet当中,对于该公司有效发票数,作废发票数,负数发票数,方便对数据观察。

# 遍历所有sheet数据 for xsn in sn.sheet_names[1:]: # 读取文件 datas = pd.read_excel(file_pos, sheet_name=xsn) datas['date']=pd.to_datetime(datas['date'],format='%Y/%m/%d') datas.set_index('date', drop=True) # 找到全部公司名称代号 code_list = list(set(list((datas['code'])))) for name in code_list: tmp_datas = datas[datas['code'] == name] tmp_datas.index = range(len(tmp_datas)) # 转换日期未object类型 tmp_datas['date'] = [x.strftime('%Y/%m/%d') for x in tmp_datas['date']] count1 = tmp_datas['tax_status'].value_counts() tmp_datas['a_count'] = list(count1)[0] if(len(count1) > 1): tmp_datas['b_count'] = list(count1)[1] tmp2 = tmp_datas[tmp_datas['cost'] < 0] tmp_datas['neg_value_tax'] = len(tmp2) if xsn == sn.sheet_names[1]: tmp_datas.to_excel(writer1,sheet_name=name,index=False) else: tmp_datas.to_excel(writer2,sheet_name=name,index=False)

负数发票:在之前购买的物品,并开具了相关正向发票,后来退货所以开具了值为负数的发票,抵消前面正数发票的值。

提取到信息:

部分公司数据记录很少,或者时间跨度大,需要综合数据指标,抵消数据数量和跨度大的影响有些负数发票,在之前找不到对应的正数发票,可能是因为在数据记录日期之前购买的,在之后退款,因此在附件中找不到记录。 问题一 建立指标

进项发票作废率,进项负数发票率,进项每月平均交易额,进项每月交易次数,

销项发票作废率,销项负数发票率,销项每月平均交易额,销项每月交易次数,销售收入增长率

提取出相关指标到附件

for xsn in sn.sheet_names[1:]: # 读取文件 datas = pd.read_excel(file_pos, sheet_name=xsn) code_list = list(set(list((datas['code'])))) for name in code_list: tmp_datas = datas[datas['code'] == name] tmp_datas.index = range(len(tmp_datas)) insert_datas.append(name) # 作废数 cacel_count = len(tmp_datas[tmp_datas['tax_status'] == 'b']) # 有效数 valid_count = len(tmp_datas[tmp_datas['tax_status'] == 'a']) # 发票作废率 count1 = (cacel_count / (cacel_count + valid_count))*100 # 负数发票数 neg_count = len(tmp_datas[tmp_datas['cost'] < 0]) # 负数发票率 count2 = (neg_count / valid_count) * 100 # 转换时间 tmp_datas['date'] = [x.strftime('%Y/%m/%d') for x in tmp_datas['date']] # 时间最大值 max_time = tmp_datas.iloc[0:,1].max() # 时间最小值 min_time = tmp_datas.iloc[0:,1].min() # 时间差 diff_time = months(max_time, min_time) + 1 # 有效票 valid_tax = tmp_datas[tmp_datas['tax_status'] == 'a'] # 平均月交易额 avg_money = valid_tax['totle_cost'].sum() / diff_time # 平均每月交易次数 trans_count = len(tmp_datas) / diff_time insert_datas += [count1, count2, avg_money, trans_count,] if flag: df1.loc[len(df1)] = insert_datas df1.to_excel(writer1,sheet_name='进项信息',index=False) else: merge_time = tmp_datas.groupby(tmp_datas['date']).sum() # 销售收入增长率 income_info= list((merge_time['cost'] - merge_time['cost'].shift(1)).fillna(1)) diff_time_day = days(max_time,min_time) income_tax = (sum(income_info) / diff_time_day)*100 insert_datas.append(income_tax) df2.loc[len(df2)] = insert_datas df2.to_excel(writer1,sheet_name='销项信息',index=False) insert_datas = [] flag = False

并将是否违约插入到最后一列

# 提取是否违约的列表 m = [] for name in code_list: m.append(datas[datas['code']==name]['break_contract'].tolist()[0]) df1.loc[:,len(df1)] = m df1.to_excel(writer3,sheet_name='sheet1',index=False) 建立模型 Logistics违约率预测模型

使用Logistics违约预测模型,代入所有的指标数据为自变量,是否违约为因变量,预测出违约率。

X=datas[['进项发票作废率','进项负数发票率','进项每月平均交易额','进项每月交易次数','销项发票作废率','销项负数发票率','销项每月平均交易额','销项每月交易次数','销售收入增长率']] y=datas['是否违约'] X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2,random_state=2020) X_validation, X_test, y_validation, y_test = train_test_split(X_test,y_test, test_size=0.1,random_state=2020) model = LogisticRegression() model.fit(X_train,y_train) a=model.predict_proba(X_validation) result=[] for i in range(len(a)): if a[i][1]>0.5: result.append(1) else: result.append(0) from sklearn import metrics print('误差: %.4f' % (1-metrics.recall_score(y_validation,result,average='weighted')))

最终得到一张我们的分析表格

通过预测是否违约,我们就能解决贷不贷款的问题。

贷款金额

贷款金额的确认,根据该公司不违约率在所有公司中的权重,乘以总贷款金额确认:

\[r_{i}=\frac{1-Z_{i}}{\sum_{j=1}^{123}\left(1-Z_{i}\right)} \times M \]

因此,我们得到的贷款金额是违约率和贷款总金额组成的关系式,这在第二问中能起到重要作用。

贷款年利率

绘制出年利率与客户流失率图,可以分析出两者应该是有关系的。利用SPSS拟合出不同信誉等级,年利率与客户流失率的关系式。

信誉等级R平方关系式A0.9977y = 37.97x^3-258.57x^2+640.944*x -1.121B0.9982y = 33.995x^3-225.051x^2+552.829*x-1.017C0.9982y = 32.157x^3-207.386x^2+504.717*x-0.973

银行获利=贷款金额x贷款年利率x(1-利率对于信誉评级客户流失率)

在贷款金额确认,贷款年利率范围在0.4~1.5的情况下,利用上面拟合的关系式,我们能够暴力跑出最优年利率。

double turnover_rate(double x, char ch) { double y = 0, result = 0; switch (ch) { case 'A': y = 37.969520 * pow(x, 3) - 258.570452 * pow(x, 2) + 640.944427 * x - 1.121484; result = x * (1 - y / 100.0); break; case 'B': y = 33.994698 * pow(x, 3) - 225.050538 * pow(x, 2) + 552.829151 * x - 1.016503; result = x * (1 - y / 100.0); break; case 'C': y = 32.156864 * pow(x, 3) - 207.385880 * pow(x, 2) + 504.716993 * x - 0.973497; result = x * (1 - y / 100.0); break; default: cout


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3