2020数学建模美赛C题完整解答(结合代码)

今年的美赛在一次又一次的日夜颠倒中结束了,相信每个人,在付出极大努力之后,会有酣畅淋漓的快感,也会认识到自己的不足。

这次的c题是一个纯粹的数据挖掘的题

涉及到的 知识有:

  • 文本情感分析
  • 文本聚类(可选)
  • 关联分析
  • 拟合(或者神经网络预测)

美赛的难点之读题

看到老美的题,作为一个中国人,完全不能做到native speaker,看到题目的那一刻真的有一种“一万个人心中有一万个哈姆雷特的感觉”。所以下面我先解读一下题目,然后提出这个问题的解决思路和相应的代码。

第一大题:

题目意思是让你提出指标作为公司对产品的跟踪指标,可讨论分析的指标很多,自由发挥(并不是让你一上来就把整个模型建好!)

把各个数据用图表的形式展现一下,怎么好看怎么来。

第二大题:

a题

主要是将文本评价转化为量化数据,并融合到star_rating中,地出一个综合评判一个用户评价的综合指标(加权综合评分)

解决方法和思路:

利用每天的数据计算star_rating的总和,

统计每天往前的评论总数量作为销量的代理变量,star_rating的总和/满分为好评率

然后可以作图了:

数据的读入和处理可以用python的pandas工具,会用的话解决本题将事半功倍:

读入数据:

data = pd.read_csv('hair_dryer.tsv', sep='\t', header=0)
date = pd.read_csv('day_s.csv', header=0)

day_s.csv 这个文件是自己创建的时间序列,分开来读取处理数据比较方便,里面的数据大概是这样的(这是一小段):

mark

可以使用python或者excel作图,python的pandas也有画图的api,很方便:

最后会出来这样一张图,两条曲线我共用了一个y轴,因此star_rating 这条直线看上去像平的,这是不可取的,应当分别用不同的y轴

b题

观察时间序列上加权综合评分的变化情况

怎么去确定各个量之间的权重呢?

  • 主观赋权法
  • 熵权法
  • 灰度关联分析

这一块我觉得随便采用哪个都行,也没有什么明确的评判标准

还有一个思路是熵权法结合灰度关联分析

参考一下北京市的一次数学建模比赛:

mark

b题最后也会生成一个综合评分随时间的变化图:

mark

c题

预测产品未来结局

  • 可以用神经网络预测时间时间序列
  • 拟合

这里介绍一下拟合的方法:

方法:拟合综合评分和时间这两个量,预测未来一段时间综合评分的变化。

拟合的方法有很多,可以先试试一阶线性拟合,再试试多项式拟合,多项式拟合效果貌似还可以

拟合的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error


# synthesis score regression
def regression_s(product_name):
    data = pd.read_csv('total_score/' + product_name + ".csv")
    data_x = np.array(data['review_date'])
    data_y = np.array(data['total_score'])
    x_train, test_x, y_train, test_y = train_test_split(data_x, data_y, test_size=0.33, random_state=1)
    x = x_train.reshape(-1, 1)
    model = LinearRegression()
    model.fit(x, y_train)
    test_x = test_x.reshape(-1, 1)
    weights = np.polyfit(x_train, y_train, 4)
    ans = np.poly1d(weights)
    print("y=", ans)
    model = np.poly1d(weights)
    xp = np.linspace(test_x.min(), test_x.max(), 70)
    pred_plot = model(xp)
    pred = model(test_x)
    plt.scatter(test_x, test_y, facecolor='blue', edgecolor='blue')
    plt.plot(xp, pred_plot, color='red')
    plt.title("synthesis score regression")
    plt.ylabel(product_name + ' synthesis score')
    plt.savefig('total_score/' + product_name + '.png', dpi=200, bbox_inches='tight')
    plt.show()
    MAE = mean_squared_error(test_y, pred.flatten())
    MSE = mean_absolute_error(test_y, pred.flatten())
    print("MSE", MSE)
    print("MAE", MAE)


if __name__ == '__main__':
    regression_s("hair_dryer")

mark

d题

这个的解题思路也很简单,对于每个时间点,都会有一个对应的综合评分,对于这个时间点后的一个月,也有一个综合评分,两个总和评分算关联系数即可(当然可以多取几个月,比如取之后的一个月,两个月,一直到十二个月)

这个指标不一定用综合评分,也可以用当月平均星级来求关联系数,如图:

mark

e题

考察文本打分和star_rating的相关性,直接用star_rating和对评论的打分做相关系数就行,这题应该是最简单的了吧。

最后说一下怎么算相关系数:

python的pandas库里有一个函数 pd.DataFrame.corr()

这个函数提供了计算相关系数的接口:

DataFrame.corr(method=‘pearson’, min_periods=1)

参数说明:

  • method:可选值为{‘pearson’, ‘kendall’, ‘spearman’}

  • min_periods:样本最少的数据量

返回值:各类型之间的相关系数DataFrame表格。

当然还有别的方法,但是做数据挖掘这块,pandas是必不可少的工具。

总结

做这种类型的题,思路简单,但是实现起来需要有一定的数据挖掘方面的知识

一个很重要的工具:pandas

另外建议学习一下numpy

学会这两个,这种题以后应该能分分钟拿下了吧。

返回值:各类型之间的相关系数DataFrame表格。

当然还有别的方法,但是做数据挖掘这块,pandas是必不可少的工具。

总结

做这种类型的题,思路简单,但是实现起来需要有一定的数据挖掘方面的知识

一个很重要的工具:pandas

另外建议学习一下numpy

学会这两个,这种题以后应该能分分钟拿下了吧。

公众号:“文化人爱读水许传”
mark

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章