赞
踩
今年的美赛在一次又一次的日夜颠倒中结束了,相信每个人,在付出极大努力之后,会有酣畅淋漓的快感,也会认识到自己的不足。
这次的c题是一个纯粹的数据挖掘的题
涉及到的 知识有:
看到老美的题,作为一个中国人,完全不能做到native speaker,看到题目的那一刻真的有一种“一万个人心中有一万个哈姆雷特的感觉”。所以下面我先解读一下题目,然后提出这个问题的解决思路和相应的代码。
题目意思是让你提出指标作为公司对产品的跟踪指标,可讨论分析的指标很多,自由发挥(并不是让你一上来就把整个模型建好!)
把各个数据用图表的形式展现一下,怎么好看怎么来。
主要是将文本评价转化为量化数据,并融合到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 这个文件是自己创建的时间序列,分开来读取处理数据比较方便,里面的数据大概是这样的(这是一小段):
可以使用python或者excel作图,python的pandas也有画图的api,很方便:
最后会出来这样一张图,两条曲线我共用了一个y轴,因此star_rating 这条直线看上去像平的,这是不可取的,应当分别用不同的y轴
观察时间序列上加权综合评分的变化情况
怎么去确定各个量之间的权重呢?
这一块我觉得随便采用哪个都行,也没有什么明确的评判标准
还有一个思路是熵权法结合灰度关联分析
参考一下北京市的一次数学建模比赛:
b题最后也会生成一个综合评分随时间的变化图:
预测产品未来结局
这里介绍一下拟合的方法:
方法:拟合综合评分和时间这两个量,预测未来一段时间综合评分的变化。
拟合的方法有很多,可以先试试一阶线性拟合,再试试多项式拟合,多项式拟合效果貌似还可以
拟合的代码:
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")
这个的解题思路也很简单,对于每个时间点,都会有一个对应的综合评分,对于这个时间点后的一个月,也有一个综合评分,两个总和评分算关联系数即可(当然可以多取几个月,比如取之后的一个月,两个月,一直到十二个月)
这个指标不一定用综合评分,也可以用当月平均星级来求关联系数,如图:
考察文本打分和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
学会这两个,这种题以后应该能分分钟拿下了吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。