2020年美国大学生数学建模竞赛C题数据的价值解题全过程文档及程序

2020年美国大学生数学建模竞赛

C题 数据的价值

原题再现:

  亚马逊在线商城为客户购买商品后提供了一个评级和评估的机会。个人评级-称为“星级评级”-即允许购买者使用1(低评级,低满意度)到5(高评级,高满意度)的等级来表达他们对产品的满意度。此外,客户还可以提交文本的消息(称为“评论”),以表达对产品的进一步意见和信息。其他客户可以在这些评论上提交有帮助或没有帮助的评级(称为“帮助性评级”),以帮助他们自己的产品购买决策。公司使用这些数据来深入了解他们参与的市场、参与的时机以及产品功能设计选择的潜在成功性。
  阳光公司计划在网上市场推出并销售三种新产品:微波炉、婴儿奶嘴和吹风机。他们已聘请您的团队作为顾问,通过客户提供的历史评级和评论,以确定与其他竞争产品相关的关键模式、关系、度量和参数,以 1)告知他们的在线销售战略,2)确定潜在的重要设计特征,以增强产品的吸引力。 Sunshine 公司过去曾使用数据来指导销售策略,但他们以前从未使用过这种特殊的组合和类型的数据(关系型数据库)。阳光公司特别感兴趣的是这些数据中基于时间的模式,以及它们是如何帮助公司打造成功产品的(时间和产品的交互影响)。
  为了帮助您,Sunshine 的数据中心为您提供了三个用于此项目的数据文件:hair_dryer.tsv、microwave.tsv 和 pacifier.tsv。这些数据代表了亚马逊市场上销售的微波炉、婴儿奶嘴和吹风机在数据所示时间段内的客户提供的评级和评价。还提供了数据标签定义的词汇表。提供的数据文件包含您应用于此问题的唯一数据。
  任务
  1. 分析提供的三个产品数据集,根据识别,描述和支持的数学证据,确定有意义的定量和/或定性的模式、关系、度量和参数,这些数据将在星级,评论和帮助等级之内和之间进行,这将有助于Sunshine 公司在他们的三个新的在线销售的产品取得成功。
  2. 使用您的分析解决Sunshine 公司市场总监的以下特定问题和要求:(建议仔细阅读原文,这里有大量的数学和经济学的术语、翻译并不是很准确)
  a. 一旦阳光公司的三款产品在网络市场上销售,根据对其信息量最大的评级和评论确定数据衡量标准。
  b. 识别并讨论每个数据集中基于时间的度量和模式,这些度量和模式可能表明产品在在线市场上的声誉在增加或减少。
  c. 基于文本的度量值和基于评级的度量值的组合,确定最能指示潜在的成功或失败产品的度量值。
  d. 基于文本的度量值和基于评级的度量值的组合,确定最能指示潜在的成功或失败产品的度量值。
  e. 基于文本的评论的描述特征,如“热情”、“失望”等,是否与评星等级密切相关?
  3. 写一封一到两页的信给阳光公司的市场总监,总结你的团队的分析和结果。包括你的团队最自信地向市场总监推荐的结果的具体理由。

整体求解过程概述(摘要)

  我们从评论的相关性、星级和有用度评级、产品品牌评级、产品声誉预测和星级对评论的影响四个方面进行数据分析和信息挖掘,从而提出可靠的销售策略和产品改进建议。

  首先,经过数据预处理后,我们通过NLTK工具对文本数据进行分词和初步情感分析,并将其量化为情感得分,范围为[-1,1]。采用数据可视化、描述性统计和相关性分析等方法,进一步构建多元Logistic回归模型,分析有用度评级与评论长度、星级和复合度的关系。结果表明,帮助度评级与评论长度呈倒置的“U型”关系,与星级呈正“U型”关系。

  下一步,我们根据评级和评估模型进行分析。构建LDA分析模型,查找每个产品的主题特征,并在此基础上提出产品的改进建议。同时,我们从主题特征总结了影响产品销售的五个指标,即质量、价格、外观、服务和尺寸。然后利用基于文本相似度的计算机搜索算法计算每条评论的指数得分。此外,我们将评分与层次分析过程相结合,确定每个指标的权重,构建加权品牌评分体系。最后,我们通过系统聚类对所有产品品牌进行聚类,以选择有潜力的优质品牌,并将其推荐给阳光公司。

  进一步计算评论和星级的综合得分,并将其作为产品的美誉度,有利于通过时间序列分析预测三种产品的未来美誉度。它描述了这三种产品具有季节性特征,在不久的将来可能会保持稳定的季节性周期。但三款产品声誉综合评分高峰时间存在差异,进一步分析表明,在声誉评分高峰期,产品销售数字较大,阳光公司可以据此制定销售计划。

  最后,我们分析了星级评定与评论之间的关系。通过建立分布式滞后模型,发现客户当期的评论会受到其他客户评分和评论的影响。同时,我们观察到情绪评分和星级评分之间的时变同步性,很明显,包含正面词的评论会导致更高的星级评分,而包含负面词的评论会导致较低的星级评分。换句话说,星级评定与特定质量描述符之间存在很强的相关性。

模型假设:

  我们在模型中做了几个假设。稍后,我们可能会放宽其中一些假设,以优化我们的模型,使其更适用于复杂的现实环境。

  1.所有评论均来自客户,没有自动评论。

  2.没有故意试图在客户评分和评论中抹黑产品。

  3.未经验证的订单不会在亚马逊上销售。数据集中已确认销售额的总和为总销售额。

  4.亚马逊藤蔓认证会员的审查具有很高的可信度。

问题重述:

  阳光公司计划在网上市场上推出和销售微波炉、吹风机和婴儿奶嘴。为了了解这三个商品市场并制定销售策略,有必要分析客户反馈数据。我们将根据给定的数据完成以下任务:
  为阳光公司制定销售策略。
  确定可提高产品可取性的潜在重要设计特征。为了完成上述两项任务,我们的具体工作如下:
  分析星级、有益投票和评论之间的关系。
  对评论和评分进行深入分析,分辨产品的优缺点,从而对产品改进提出建议。
  根据评论和评级的分析建立产品评级体系,选择优质的品牌产品推荐给阳光公司进行销售。
  建立声誉评分体系,预测声誉发展趋势。
  分析当前评价是否受到先前星级评分和评价的影响。
  分析基于文本的评论的特定质量描述符是否与评级级别密切相关。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

import pandas as pd
from snownlp import SnowNLP
import re
from gensim import corpora,models
#from nltk.tokenize import word_tokenize
data = pd.DataFrame(test2)
print(type(data))
#data_null = data.drop_duplicates()
#data_null.to_csv('C:/Users/lenovo/Desktop/comments_null.csv')
#data_null_comments = data_null['contents']
#data_null_comments.to_csv('C:/Users/lenovo/Desktop/contents.txt',index=False,enco
ding='utf-8')
#data_len = data_null_comments[data_null_comments.str.len()>4]
#print(data_len)
#data_len.to_csv('contents.txt',index=False,encoding='utf-8')
coms = []
coms = data[0].apply(lambda x:SnowNLP(x).sentiments)
data_post = data[coms>=0.01]
data_neg = data[coms<0.01]
print(data_post)
print(data_neg)
data_post[0].to_csv(&apos;C:/Users/lenovo/Desktop/comments_positive.txt&apos;,encoding=&apos
;utf-8&apos;,header=None)
data_neg[0].to_csv(&apos;C:/Users/lenovo/Desktop/comments_negative.txt&apos;,encoding=&apos
;utf-8-sig&apos;,header=None)
with open(&apos;C:/Users/lenovo/Desktop/comments_positive.txt&apos;,encoding=&apos;utf-8&ap
os;) as fn1:
string_data1 = fn1.read()
pattern = re.compile(u&apos;\t|\n|\.|-|——|||||,||;|\)|\(|\?|"&apos;)
string_data1 = re.sub(pattern, &apos;&apos;, string_data1) 
print(string_data1)
fp = open(&apos;C:/Users/lenovo/Desktop/comments_post.txt&apos;,&apos;a&apos;,encoding
=&apos;utf8&apos;)
fp.write(string_data1 + &apos;\n&apos;)
fp.close()
with open(&apos;C:/Users/lenovo/Desktop/comments_nagative.txt&apos;,encoding=&apos;utf-8&a
pos;) as fn2:
string_data2 = fn2.read()
pattern = re.compile(u&apos;\t|\n|\.|-|——|||||,||;|\)|\(|\?|"&apos;)
string_data2 = re.sub(pattern, &apos;&apos;, string_data2)
print(string_data2)
fp = open(&apos;C:/Users/lenovo/Desktop/comments_neg.txt&apos;,&apos;a&apos;,encoding
=&apos;utf8&apos;)
fp.write(string_data2 + &apos;\n&apos;)
fp.close()
data1 = pd.read_csv(&apos;C:/Users/lenovo/Desktop/comments_post.txt&apos;,encoding=&apos;utf
-8&apos;,header=None)
data2 = pd.read_csv(&apos;C:/Users/lenovo/Desktop/comments_neg.txt&apos;,encoding=&apos;utf
-8&apos;,header=None)
#mycut = lambda s: &apos; &apos;.join(word_tokenize(s))
#data1 = data1[0].apply(mycut)
#data2 = data2[0].apply(mycut)
#mycut = lambda s: &apos; &apos;.join(word_tokenize(s))
data1 = data1[0]
data2 = data2[0]
data1.to_csv(&apos;C:/Users/lenovo/Desktop/comments_post_cut.txt&apos;,index=False,header=Fa
lse,encoding=&apos;utf-8&apos;)
data2.to_csv(&apos;C:/Users/lenovo/Desktop/comments_neg_cut.txt&apos;,index=False,header=Fal
se,encoding=&apos;utf-8&apos;)
print(data2)
post = pd.read_csv(&apos;C:/Users/lenovo/Desktop/comments_post_cut.txt&apos;,encoding=&apos
;utf-8&apos;,header=None,error_bad_lines=False)
neg = pd.read_csv(&apos;C:/Users/lenovo/Desktop/comments_neg_cut.txt&apos;,encoding=&apos;
utf-8&apos;,header=None,error_bad_lines=False)
stop = pd.read_csv(&apos;C:/Users/lenovo/Desktop/stoplist.txt&apos;,encoding=&apos;utf-8&apos;
,header=None,sep=&apos;tipdm&apos;,engine=&apos;python&apos;)
stop = [&apos; &apos;,&apos;&apos;] + list(stop[0])
post[1] = post[0].apply(lambda s: s.split(&apos; &apos;))
post[2] = post[1].apply(lambda x: [i for i in x if i not in stop])
neg[1] = neg[0].apply(lambda s: s.split(&apos; &apos;))
neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop])
post_dict = corpora.Dictionary(post[2])
post_corpus = [post_dict.doc2bow(i) for i in post[2]]
post_lda = models.LdaModel(post_corpus, num_topics=4, id2word=post_dict)
for i in range(3):
print(post_lda.print_topic(i))
print(&apos)
neg_dict = corpora.Dictionary(neg[2])
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]]
neg_lda = models.LdaModel(neg_corpus, num_topics=4, id2word=neg_dict)
for i in range(3):
print(neg_lda.print_topic(i))
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

猜你喜欢

转载自blog.csdn.net/weixin_43292788/article/details/131822531