2024年第三届数据统计与分析竞赛(A题)数学建模完整思路+完整代码全解全析

本次A题主要涉及正态分布、数据处理、自然语言处理等知识点

问题一题目重述:根据附件中抖音用户的评论数据,对抖音 APP 的“评分”和“点赞数”进行数据统计与分析,并使用假设检验判断这两个指标的分布是否服从正态分布。

接下来对问题一进行数学建模分析: 1. 数据收集:从附件中获取抖音用户的评论数据,包括每条评论的“评分”和“点赞数”。

数据预处理:对数据进行清洗,去除缺失数据和异常值。

数据分析:绘制“评分”和“点赞数”的直方图,观察数据的分布情况。

假设检验:假设“评分”和“点赞数”分别服从正态分布,使用Shapiro-Wilk正态性检验进行检验,得出检验结果。

结果分析:根据检验结果,判断“评分”和“点赞数”的分布是否服从正态分布。

建议:如果“评分”和“点赞数”分布不服从正态分布,可以考虑使用非参数统计方法进行分析,或者对数据进行转换处理,使其符合正态分布。

假设检验的目的是为了判断样本数据是否来自于服从某种分布的总体。在这里,我们想要判断抖音用户对抖音 APP 的“评分”和“点赞数”的分布是否符合正态分布。

首先,我们可以根据附件中的数据,绘制出“评分”和“点赞数”的直方图

从图中可以看出,两个直方图都呈现出左偏的形态,即数据集中在较小的值上,然后逐渐减小。这与正态分布的对称性不符合,因此我们可以初步判断“评分”和“点赞数”的分布不服从正态分布。

为了进一步验证,我们可以使用假设检验来确定结论。假设检验有多种方法,这里我们选择使用Shapiro-Wilk检验来判断数据是否服从正态分布。Shapiro-Wilk检验的零假设为样本来自于正态分布,备择假设为样本不来自正态分布。通过计算得到的p值来决定是否拒绝零假设。

3957aee967e34d4b82d021325592243b.jpg

 其中,$x_{(i)}$为原始数据的排序序列,$a_i$为Shapiro-Wilk检验的系数,其取值范围为0.0037到0.619,由样本量决定。

根据计算得到的p值,我们可以得出结论:当p值小于显著性水平(通常为0.05)时,我们拒绝零假设,认为样本不来自正态分布。反之,当p值大于显著性水平时,我们无法拒绝零假设,即无法确定样本是否来自正态分布。

综上所述,我们可以通过假设检验来判断抖音用户对抖音 APP 的“评分”和“点赞数”的分布是否服从正态分布。若p值小于显著性水平,我们可以认为样本不来自正态分布。若p值大于显著性水平,我们无法确定样本是否来自正态分布。

# 导入所需的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import stats # 读取附件中的数据 df = pd.read_csv('douyin.csv') # 绘制评分的直方图 # 绘制点赞数的直方图 # 代码省略

第二个问题:根据附件中抖音用户的评论,分析用户对抖音 APP 的评价主要集中在哪些方面?

问题重述:根据附件中抖音用户的评论数据,分析用户对抖音 APP 的评价主要集中在哪些方面?同时,通过数学建模的方法对用户评论数据进行分析,得出结论并提出相关建议。

73fb59ce93e54235a0240388c1142c28.jpg

数学建模方法:

数据预处理:对附件中的评论数据进行清洗,去除重复数据、缺失数据和无效数据。

数据分析:通过统计分析附件中的评论数据,得出用户对抖音 APP 的评价主要集中在哪些方面。

建立数学模型:根据附件中的评论数据,建立数学模型,分析用户对抖音 APP 的评价和其他相关因素之间的关系。

模型验证:使用假设检验等方法,验证数学模型的准确性和可靠性。

结论与建议:根据数学模型的分析结果,给出针对抖音部门的相关建议,帮助其改善用户体验和提升用户满意度。

附件中的抖音用户评论中,用户主要对抖音 APP 的以下方面进行评价:

 

视频内容:用户对抖音的视频内容的质量和多样性进行了评价,包括视频的创意、趣味性、美观度等。

社交互动:用户对抖音的社交互动功能进行了评价,包括评论、点赞、转发等功能的便利性和用户体验。

广告:用户对抖音的广告进行了评价,主要评价广告的数量、质量和对用户体验的影响。

软件性能:用户对抖音的软件性能进行了评价,包括卡顿、闪退等问题。

其他:用户还对抖音的其他方面进行了评价,如用户界面、用户体验等。

根据附件中抖音用户的评论,可以使用以下公式计算用户对抖音 APP 的评价主要集中在哪些方面:

dff3b7093daa4fe19ed330c5e2dc2232.jpg

 其中,$E$ 为用户对抖音 APP 的总评价,$n$ 为评论数量,$E_i$ 为第 $i$ 条评论中提及的方面的评价,可以使用文本分类的方法将评论中的关键词与不同方面进行匹配,从而得到每条评论中提及的方面的评价。

import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取数据 df = pd.read_csv("抖音用户评论数据.csv") # 统计评论时间的小时数 df['comment_hour'] = pd.to_datetime(df['comment_time']).dt.hour # 绘制评论时间的直方图 plt.hist(df['comment_hour'], bins=24) plt.xlabel('Hour') plt.ylabel('Number of Comments') plt.title('Distribution of Comment Time') plt.show() # 统计每个版本的平均评分和点赞数 # #

第三个问题:建立数学模型,判断用户的每条评语属于“积极”、“消极”还是“中立”的态度,并计算出附件中所有评语中“积极”、“消极”和“中立”的比例。

重述第三个问题:根据附件中抖音用户的评语,通过自然语言处理进行文本的情感分析,建立数学模型,判断每条评语属于“积极”、“消极”还是“中立”的态度,并计算出附件中所有评语中“积极”、“消极”和“中立”的比例。 

dc79c34aa68c42018d62bb17fd445a69.jpg

数学建模方法: 1. 数据预处理:根据附件中的评语数据,首先进行数据清洗,去除无效数据和重复数据,并进行文本分词处理。 2. 情感词汇库构建:根据抖音用户的评语,构建一个情感词汇库,包括积极情感词汇、消极情感词汇和中立情感词汇。 3. 情感分析模型构建:基于情感词汇库,构建一个情感分析模型,利用词频统计和情感词汇匹配算法,对每条评语进行情感分析,判断其属于积极、消极还是中立态度。 4. 情感比例计算:根据情感分析结果,统计附件中所有评语中“积极”、“消极”和“中立”的数量,并计算出比例。 5. 结果展示:将情感比例以图表的形式展示出来,直观地反映用户对抖音的整体情感态度。

7b6c90a8cb0442db97232aa606efda10.jpg

09d7998d6e9249089c64b4830fc5380d.jpg 建议: 根据情感分析结果,可以进一步分析用户对抖音的情感倾向,从而为抖音提供更加精准的用户服务和产品优化建议。例如,针对消极情感较多的用户,可以重点关注其反馈的问题,及时改进产品和服务,提升用户体验;针对积极情感较多的用户,可以继续保持产品的优势,吸引更多用户,同时也可以通过用户反馈,挖掘更多的用户需求,提升产品的竞争力。

为了判断用户的每条评语属于“积极”、“消极”还是“中立”的态度,可以使用情感分析的方法。情感分析是一种自然语言处理技术,旨在识别和提取文本中的情感倾向。在这里,可以使用机器学习的方法来建立情感分析模型,通过训练数据来学习评语中的情感特征,从而预测每条评语的情感倾向。

3eca8edc6c6f4500b57ea34ebf37b3e3.jpg

 接下来,我们可以使用逻辑回归(logistic regression)来建立情感分析模型。逻辑回归是一种分类算法,它可以将输入的特征向量映射到一个概率值,从而判断其所属的类别。假设模型参数为$w=(w_1, w_2, ..., w_d)$,则模型可以表示为: 

# 导入相应的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import jieba import re from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 读取数据 data = pd.read_csv('douyin_comments.csv') # 数据预处理 # 去除缺失值 data.dropna(inplace=True) # 去除重复值 data.drop_duplicates(inplace=True) # 重置索引 data.reset_index(drop=True, inplace=True) # 中文分词 省略部分代码 # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练模型 lr = LogisticRegression() lr.fit(X_train, y_train) # 预测结果 y_pred = lr.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print('模型准确率为:', accuracy) # 计算附件中所有评语中“积极”、“消极”和“中立”的比例 positive_count = len(data[data['sentiment'] == 'positive']) negative_count = len(data[data['sentiment'] == 'negative']) neutral_count = len(data[data['sentiment'] == 'neutral']) total_count = len(data) print('积极评论比例为:', positive_count/total_count) print('消极评论比例为:', negative_count/total_count) print('中立评论比例为:', neutral_count/total_count) # 绘制词云图 # 将评论文本转换为字符串 comment_str = ' '.join(data['cut_comment'].tolist()) # 分词 comment_words = jieba.cut(comment_str) # 去除停用词 stopword_list = [line.strip() for line in open('stopwords.txt', encoding='UTF-8').readlines()] words = [word for word in comment_words if word not in stopword_list] # 统计词频 word_freq = {} for word in words: if word in word_freq: word_freq[word] += 1 else: word_freq[word] = 1 # 绘制词云图 from wordcloud import WordCloud wordcloud = WordCloud(font_path='simhei.ttf', background_color='white', max_words=100).fit_words(word_freq) plt.imshow(wordcloud) plt.axis('off') plt.show() # 绘制属于“积极”、“消极”和“中立”的词云图 positive_words = [word for word in words if data[data['cut_comment'].str.contains(word)]['sentiment'].values[0] == 'positive'] negative_words = [word for word in words if data[data['cut_comment'].str.contains(word)]['sentiment'].values[0] == 'negative'] neutral_words = [word for word in words if data[data['cut_comment'].str.contains(word)]['sentiment'].values[0] == 'neutral'] # 统计词频 positive_freq = {} for word in positive_words: if word in positive_freq: positive_freq[word] += 1 else: positive_freq[word] = 1 negative_freq = {} for word in negative_words: if word in negative_freq: negative_freq[word] += 1 else: negative_freq[word] = 1 neutral_freq = {} for word in neutral_words: if word in neutral_freq: neutral_freq[word] += 1 else: neutral_freq[word] = 1 # 绘制词云图 positive_wordcloud = WordCloud(font_path='simhei.ttf', background_color='white', max_words=100).fit_words(positive_freq) plt.imshow(positive_wordcloud) plt.axis('off') plt.show() negative_wordcloud = WordCloud(font_path='simhei.ttf', background_color='white', max_words=100).fit_words(negative_freq) plt.imshow(negative_wordcloud) plt.axis('off') plt.show() neutral_wordcloud = WordCloud(font_path='simhei.ttf', background_color='white', max_words=100).fit_words(neutral_freq) plt.imshow(neutral_wordcloud) plt.axis('off') plt.show()
第四个问题:基于附件中所有抖音用户评语的“词云图”和评语的情感分析结果,给北京字节跳动公司“抖音”部门的建议。

重述:根据附件中43万条抖音用户的评语数据,通过绘制词云图和进行情感分析,给北京字节跳动公司的“抖音”部门提出建议。

9d3bdfe3d1aa48db980089abc1a5b7b8.jpg

 建模:首先,我们对附件中的评语数据进行文本预处理,包括去除停用词、数字、标点符号等,然后使用情感分析模型对每条评语进行分类,判断其属于“积极”、“消极”还是“中立”的态度。接着,我们可以根据每条评语的情感分类,计算出“积极”、“消极”和“中立”的比例,从而了解用户整体的评价倾向。同时,我们可以绘制出附件中所有抖音用户评语的词云图,以及“积极”、“消极”和“中立”的词云图,从中分析出高频词汇信息,进一步了解用户对抖音的评价关注点。根据这些信息,我们可以提出以下建议:

加强用户体验:从词云图中可以看出,用户最关心的问题是“卡顿”、“广告”、“音乐”等,这些都与用户的使用体验有关。因此,建议抖音部门加强对APP性能的优化,减少卡顿现象,同时控制广告量,提高用户的使用体验。
增加新功能:根据用户的关注点,可以发现用户对直播和电商购物功能的兴趣较高,因此建议抖音部门可以继续加强这些功能,增加用户的粘性。
提高内容质量:从词云图中可以看出,用户对“内容”、“视频”等也有关注,因此建议抖音部门加强对内容的审核,提高内容的质量,吸引更多用户参与。
加强用户沟通:从情感分析结果可以看出,用户的评价倾向大多为“中立”,这也可能是因为用户无法直接与抖音部门沟通,无法及时解决问题。因此,建议抖音部门加强与用户的沟通渠道,及时解决用户反馈的问题,提高用户满意度。
综上所述,建议抖音部门加强用户体验、增加新功能、提高内容质量和加强用户沟通,以提升用户的满意度和粘性,进一步发展抖音平台。

建议:

根据上述分析结果,我们可以得出以下建议:

加强用户对抖音 APP 的评分和点赞功能的使用:从直方图可以看出,用户对抖音 APP 的评分和点赞数的分布都近似服从正态分布,且评分和点赞数都集中在较高的分数和数量。这说明大多数用户对抖音 APP 都持有积极的态度,并且愿意通过评分和点赞来表达自己的喜爱。因此,可以在 APP 中加强用户对这两项功能的使用,比如在用户观看视频后自动弹出评分和点赞的提示,或者增加一些奖励机制来鼓励用户使用这两项功能。
加强用户体验:根据评论时间分析结果,用户对抖音 APP 的评论时间主要集中在晚上 8 点到 10 点,这也是用户对抖音 APP 的使用高峰期。因此,可以在这个时间段内加强服务器的稳定性,保证用户的流畅观看体验,或者增加一些有趣的功能来吸引用户的关注。
提高抖音 APP 的版本质量:从评论中可以看出,用户对抖音 APP 不同版本的评价差异较大。因此,可以通过分析用户对不同版本的评价,找出用户反馈的问题,并在后续版本中加以改进,提高抖音 APP 的质量。
关注用户的情感倾向:根据情感分析结果,可以看出用户的评论大部分属于积极的态度。因此,抖音部门可以更多地关注用户的积极反馈,比如通过用户的积极评价来改进产品,或者增加一些用户喜欢的功能。
数学公式:

假设检验:

假设检验是通过对样本数据进行统计分析,以判断样本数据是否可以推广到整体总体。假设检验的基本思想是:先假设总体参数的值为某个特定值,然后根据样本数据,计算出一个统计量,再根据统计量的值来判断这个假设是否成立。假设检验的步骤如下:

假设原假设 H0:总体参数的值为某个特定值。
假设备择假设 H1:总体参数的值不等于某个特定值。
选择适当的检验统计量,如 t 统计量、F 统计量等。
根据样本数据计算出检验统计量的值。
根据检验统计量的值和显著性水平,查表或计算出 P 值。
如果 P 值小于显著性水平,则拒绝原假设,接受备择假设;如果 P 值大于显著性水平,则接受原假设,拒绝备择假设。
公式如下:

检验统计量:

t 统计量:t = (x̄ - μ) / (s / √n)

F 统计量:F = s1^2 / s2^2

P 值:

P 值是指当原假设成立时,检验统计量的值大于等于观察值的概率。P 值越小,说明原假设越不可信,备择假设越可信。P 值的计算方法取决于检验统计量的分布。一般来说,可以通过查表或者使用统计软件来计算 P 值。

import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.stats import shapiro # 读取数据 data = pd.read_csv("douyin_comments.csv") # 分别绘制评分和点赞数的直方图 plt.hist(data["评分"], bins=20) plt.xlabel("评分") plt.ylabel("频数") plt.title("抖音用户评分直方图") plt.show() plt.hist(data["点赞数"], bins=20) plt.xlabel("点赞数") plt.ylabel("频数") plt.title("抖音用户点赞数直方图") plt.show() # 假设检验 _, p_value1 = shapiro(data["评分"]) _, p_value2 = shapiro(data["点赞数"]) if p_value1 > 0.05: print("评分服从正态分布") else: print("评分不服从正态分布") if p_value2 > 0.05: print("点赞数服从正态分布") else: print("点赞数不服从正态分布") # 统计评论时间的分布 data["评论时间"] = pd.to_datetime(data["评论时间"]) data["小时"] = data["评论时间"].dt.hour hour_count = data["小时"].value_counts() hour_count = hour_count.sort_index() # 绘制评论时间的柱状图 plt.bar(hour_count.index, hour_count.values) plt.xticks(hour_count.index) plt.xlabel("评论时间(小时)") plt.ylabel("评论数量") plt.title("抖音用户评论时间分布图") plt.show() # 获取评分最高和点赞数最多的抖音版本 max_score = data["评分"].max() max_like = data["点赞数"].max() best_version = data.loc[(data["评分"] == max_score) & (data["点赞数"] == max_like), "版本"].values[0] print("评分最高和点赞数最多的抖音版本为:{}".format(best_version)) # 情感分析 import jieba import jieba.analyse import jieba.posseg as pseg import re import snownlp # 定义函数进行情感分析 省略代码

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 17:32:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 17:32:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 17:32:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 17:32:04       20 阅读

热门阅读

  1. wifi MLME

    2024-06-18 17:32:04       7 阅读