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

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