2023年第十一屆泰迪杯數(shù)據(jù)挖掘挑戰(zhàn)賽B題
責任編輯:傳說的落葉 時間:2024-09-24 11:17
[導讀]【2023年第十一屆泰迪杯數(shù)據(jù)挖掘挑戰(zhàn)賽】B題:產品訂單的數(shù)據(jù)分析與需求預測 建模及python代碼詳解 問題一
1 題目
一.問題背景
近年來企業(yè)外部環(huán)境越來越不確定,復雜多變的外部環(huán)境,讓企業(yè)供應鏈面臨較多難題。
需求預測作為企業(yè)供應鏈的第一道防線,重要程度不言而喻,然而需求預測受多種因素的影響,導致預測準確率普遍較低,因此需要更加優(yōu)秀的算法來解決這個問題。需求預測是基于歷史數(shù)據(jù)和未來的預判得出的有理論依據(jù)的結論,有利于公司管理層對未來的銷售及運營計劃、目標,資金預算做決策參考;其次,需求預測有助于采購計劃和安排生產計劃的制定, 減少受業(yè)務波動的影響。如果沒有需求預測或者預測不準,公司內部很多關于銷售、采購、財務預算等決策都只能根據(jù)經驗而來了,會導致對市場預測不足,產生庫存和資金的積壓或不足等問題,增加企業(yè)庫存成本。
二.數(shù)據(jù)說明
附件中的訓練數(shù)據(jù)(order_train1.csv)提供了國內某大型制造企業(yè)在 2015 年 9 月 1日至 2018 年 12 月 20 日面向經銷商的出貨數(shù)據(jù)(格式見表 1),反應了該企業(yè)產品在不同銷售區(qū)域的價格和需求等信息,包括:order_date(訂單日期)、sales_region_code(銷售區(qū)域編碼)、item_code(產品編碼)、first_cate_code (產品大類編碼)、second_cate_code (產品細類編碼)、sales_chan_name (銷售渠道名稱)、item_price (產品價格)和 ord_qty (訂單需求量)。
表1:訓練數(shù)量(歷史數(shù)據(jù))的數(shù)據(jù)格式
其中“訂單日期”為某個需求量的日期;一個“產品大類編碼”會對應多個“產品細類編碼”;“銷售渠道名稱”分為 online(線上)和 offline(線下),“線上”是指淘寶和京東等電商平臺,“線下”是指線下實體經銷商。
附件中的預測數(shù)據(jù)(predict_sku1.csv)提供了需要預測產品的銷售區(qū)域編碼、產品編碼、產品品類和產品細品類(格式見表 2)。
表2:需要預測的產品的數(shù)據(jù)樣例
三.需要解決的問題
- 請對附件中的訓練數(shù)據(jù)(order_train1.csv)進行深入地分析,可參照但不限于下述主
題。
(1) 產品的不同價格對需求量的影響;
(2) 產品所在區(qū)域對需求量的影響,以及不同區(qū)域的產品需求量有何特性;
(3) 不同銷售方式(線上和線下)的產品需求量的特性;
(4) 不同品類之間的產品需求量有何不同點和共同點;
(5) 不同時間段(例如月頭、月中、月末等)產品需求量有何特性;
(6) 節(jié)假日對產品需求量的影響;
(7) 促銷(如 618、雙十一等)對產品需求量的影響;
(8) 季節(jié)因素對產品需求量的影響。
- 基于上述分析,建立數(shù)學模型,對附件預測數(shù)據(jù)(predict_sku1.csv)中給出的產品,預測未來 3 月(即 2019 年 1 月、2 月、3 月)的月需求量,將預測結果按照表 3 的格式保存為文件 result1.xlsx,與論文一起提交。請分別按天、周、月的時間粒度進行預測,試分析不同的預測粒度對預測精度會產生什么樣的影響。
2 問題分析
2.1 問題一
(1)產品的不同價格對需求量的影響
首先,讀取數(shù)據(jù)并提取item_price和ord_qty兩列數(shù)據(jù); 然后,根據(jù)item_price進行分組統(tǒng)計,計算每個價格區(qū)間的平均需求量; 最后,通過散點圖將不同價格區(qū)間的平均需求量進行可視化展示。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 讀取數(shù)據(jù)
df = pd.read_csv('data/order_train0.csv')
# 按照產品價格分組,并計算平均值
grouped = df.groupby('item_price')['ord_qty'].mean().reset_index()
# 使用 Matplotlib 畫圖
plt.figure(figsize=(10, 6))
plt.plot(grouped['item_price'], grouped['ord_qty'], 'o-')
plt.xlabel('Product Price')
plt.ylabel('Average Order Quantity')
plt.title('Relationship between Product Price and Order Quantity')
plt.savefig('img/1.png',dpi=300)
# 使用 Seaborn 畫圖
sns.set_style('darkgrid')
plt.figure(figsize=(10, 6))
sns.lineplot(x='item_price', y='ord_qty', data=grouped)
plt.xlabel('Product Price')
plt.ylabel('Average Order Quantity')
plt.title('Relationship between Product Price and Order Quantity')
plt.savefig('img/2.png',dpi=300)
從圖表中可以看出,產品價格與平均訂單需求量之間呈現(xiàn)出U形關系,即價格較低或較高時,訂單需求量較高;而當價格處于中間區(qū)間時,訂單需求量較低。這可能是因為價格過低會讓消費者覺得產品質量不高,而價格過高則會讓消費者覺得不值得購買。因此,合理的定價策略可以在一定程度上提高產品的銷售量。
也可以使用回歸模型(例如線性回歸、多項式回歸等)對產品價格和需求量之間的關系進行建模和預測,從而確定價格對需求量的影響。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 讀取數(shù)據(jù)
df = pd.read_csv('order_train1.csv')
# 繪制散點圖
sns.scatterplot(x='item_price', y='ord_qty', data=df)
# 繪制箱線圖
sns.boxplot(x='item_price', y='ord_qty', data=df)
# 使用線性回歸模型擬合
x = df[['item_price']]
y = df[['ord_qty']]
model = LinearRegression()
model.fit(x, y)
# 輸出模型系數(shù)和截距
print('Coefficients:', model.coef_)
print('Intercept:', model.intercept_)
(2)產品所在區(qū)域對需求量的影響,以及不同區(qū)域的產品需求量有何特性
可以通過對不同區(qū)域的需求量進行可視化分析,例如繪制直方圖、箱線圖等,查看需求量的分布情況。也可以使用ANOVA方差分析等方法來判斷不同區(qū)域之間的需求量是否存在顯著差異,從而確定產品所在區(qū)域對需求量的影響。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import f_oneway
# 讀取數(shù)據(jù)
df = pd.read_csv('order_train1.csv')
# 繪制直方圖
sns.histplot(x='ord_qty', hue='sales_region_code', data=df, kde=True)
# 繪制箱線圖
sns.boxplot(x='sales_region_code', y='ord_qty', data=df)
# 進行ANOVA方差分析
grouped_data = df.groupby('sales_region_code')['ord_qty'].apply(list)
。。。略,請下載完整代碼
print('F-value:', f_value)
print('P-value:', p_value)
(3)不同銷售方式(線上和線下)的產品需求量的特性
可以通過繪制不同銷售方式的需求量直方圖、箱線圖等方法來查看產品需求量的分布情況和差異。也可以使用t檢驗等方法來確定不同銷售方式之間的需求量是否存在顯著差異。
然后,我們可以按照銷售渠道名稱(sales_chan_name
)將數(shù)據(jù)分為線上和線下兩類,計算它們的訂單需求量(ord_qty
)的基本統(tǒng)計量,包括均值、中位數(shù)、最大值、最小值、標準差等,以了解它們的分布情況和差異性。
import pandas as pd
# 讀取數(shù)據(jù)
data = pd.read_csv('order_train1.csv')
# 查看數(shù)據(jù)
print(data.head())
# 將數(shù)據(jù)按照銷售渠道名稱分為線上和線下兩類
online_data = data[data['sales_chan_name'] == 'online']
offline_data = data[data['sales_chan_name'] == 'offline']
# 計算線上和線下訂單需求量的基本統(tǒng)計量
print('線上訂單需求量的基本統(tǒng)計量:')
print(online_data['ord_qty'].describe())
print('線下訂單需求量的基本統(tǒng)計量:')
print(offline_data['ord_qty'].describe())
除了計算訂單需求量的基本統(tǒng)計量之外,我們還可以通過可視化方式更加直觀地了解不同銷售方式下產品需求量的特性。在 Python 中,我們可以使用 Matplotlib 或者 Seaborn 庫進行數(shù)據(jù)可視化。
import seaborn as sns
# 設置圖形風格
sns.set(style="ticks", palette="pastel")
# 繪制箱線圖,分析線上和線下訂單需求量的分布情況
sns.boxplot(x="sales_chan_name", y="ord_qty", data=data)
# 顯示圖形
sns.despine(trim=True)
運行上述代碼,可以得到一個箱線圖,展示了線上和線下訂單需求量的分布情況。通過比較箱線圖的位置、大小和形狀等特征,我們可以了解不同銷售方式下產品需求量的差異性和分布情況。例如,如果線上訂單需求量的中位數(shù)明顯高于線下訂單需求量的中位數(shù),那么我們可以判斷線上銷售渠道對產品需求量的貢獻較大。
import matplotlib.pyplot as plt
# 提取線上和線下訂單需求量
online_ord_qty = data[data["sales_chan_name"] == "online"]["ord_qty"]
offline_ord_qty = data[data["sales_chan_name"] == "offline"]["ord_qty"]
# 繪制線上和線下訂單需求量直方圖
。。。略,請下載完整代碼
labels = ['Online', 'Offline']
plt.bar(labels, X)
plt.title('Distribution of Sales Channels')
plt.xlabel('Sales Channels')
plt.ylabel('Sales Volume')
plt.show()
核密度圖可以更加直觀地展示數(shù)據(jù)的分布情況,它可以通過對數(shù)據(jù)進行平滑處理,得到一條連續(xù)的曲線,反映了數(shù)據(jù)的概率密度分布情況。
import seaborn as sns
# 提取線上和線下訂單需求量
online_ord_qty = data[data["sales_chan_name"] == "online"]["ord_qty"]
offline_ord_qty = data[data["sales_chan_name"] == "offline"]["ord_qty"]
# 繪制線上和線下訂單需求量核密度圖
sns.kdeplot(online_ord_qty, shade=True, label="Online")
sns.kdeplot(offline_ord_qty, shade=True, label="Offline")
plt.legend(loc="upper right")
plt.title("Distribution of Order Quantity by Sales Channel")
plt.xlabel("Order Quantity")
plt.ylabel("Density")
plt.show()
從核密度圖中可以看出,線下銷售方式下的產品需求量分布相對于線上銷售方式更加集中,呈現(xiàn)出一個明顯的峰態(tài);而線上銷售方式下的產品需求量分布比較平滑,沒有出現(xiàn)明顯的峰態(tài)。同時,線下銷售方式下的產品需求量整體偏高,而線上銷售方式下的產品需求量整體偏低。
# 繪制散點圖
sns.scatterplot(data=train_data, x="item_price", y="ord_qty", hue="sales_chan_name")
從散點圖中可以看出,線下銷售方式下產品價格與需求量之間的關系似乎比線上銷售方式下更加緊密,而且線下銷售方式下有一些高價格、高需求量的異常值。但是需要注意的是,由于數(shù)據(jù)中的產品價格和需求量都是離散值,所以散點圖中的點是會有重疊的。
(4)不同品類之間的產品需求量有何不同點和共同點;
- 按照品類分組,計算每個品類的訂單需求量的平均值、中位數(shù)、標準差等統(tǒng)計指標;
- 繪制每個品類的訂單需求量的分布直方圖;
- 對于不同品類之間的需求量進行比較分析,找出不同品類之間的不同點和共同點。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 讀取數(shù)據(jù)
data = pd.read_csv('order_train1.csv')
# 按照品類分組,計算每個品類的訂單需求量的平均值、中位數(shù)、標準差等統(tǒng)計指標
category_demand = data.groupby('second_cate_code')['ord_qty'].agg(['mean', 'median', 'std'])
。。。略,請下載完整代碼
# 繪制每個品類的訂單需求量的分布直方圖
category_list = data['second_cate_code'].unique().tolist()
for category in category_list:
demand = data.loc[data['second_cate_code'] == category, 'ord_qty']
plt.hist(demand, bins=30)
plt.title(f'Cate:{category}')
plt.xlabel('Demand')
plt.ylabel('Frequency')
plt.show()
# 對于不同品類之間的需求量進行比較分析,找出不同品類之間的不同點和共同點
# 可以使用t檢驗、方差分析等統(tǒng)計方法
(5)不同時間段(例如月頭、月中、月末等)產品需求量有何特性;
- 將訂單日期按月份進行分組,計算每個月份的訂單需求量的平均值、中位數(shù)、標準差等統(tǒng)計指標;
- 繪制每個月份的訂單需求量的趨勢圖;
- 將每個月份的訂單需求量按照日期進行分組,分別計算月初、月中、月末的訂單需求量的平均值、中位數(shù)、標準差等統(tǒng)計指標;
- 對于不同時間段之間的需求量進行比較分析,找出不同時間段之間的不同點和共同點。
為了研究不同時間段產品需求量的特性,我們需要首先將訂單日期進行拆分,提取出月初、月中和月末三個時間段的需求量??梢允褂?pandas 中的 dt 屬性來獲取日期時間中的年、月、日、小時等信息。在這里,我們可以使用 pandas 中的 cut 函數(shù)對訂單日期進行分段,然后對不同時間段的訂單需求量進行統(tǒng)計。
import pandas as pd
# 讀取數(shù)據(jù)
data = pd.read_csv('order_train1.csv')
# 轉換訂單日期格式為 datetime 類型
data['order_date'] = pd.to_datetime(data['order_date'], format='%y/%m/%d')
# 根據(jù)訂單日期將數(shù)據(jù)進行排序
data = data.sort_values(by='order_date')
# 按照月初、月中、月末將訂單需求量進行分組
。。。略,請下載完整代碼
time_bins = [0, 10, 20, 31]
data['order_date_category'] = pd.cut(data['order_date'].dt.day, bins=time_bins, labels=time_labels)
# 統(tǒng)計不同時間段的訂單需求量
demand_by_time = data.groupby('order_date_category')['ord_qty'].sum()
# 繪制不同時間段的訂單需求量柱狀圖
demand_by_time.plot(kind='bar')
(6)節(jié)假日對產品需求量的影響:
節(jié)假日通常會對消費者的購買行為產生影響,因此對產品需求量也會有影響。在此問題中,我們可以選取國內的法定節(jié)假日,對節(jié)假日和非節(jié)假日進行對比分析。
為了分析節(jié)假日對產品需求量的影響,可以先對數(shù)據(jù)進行處理,找出所有的節(jié)假日以及對應的日期。在本數(shù)據(jù)集中,可以通過觀察訂單日期(order_date)列來確定節(jié)假日日期,例如春節(jié)、國慶節(jié)等。然后,可以計算出每個節(jié)假日的平均需求量,將其與普通日的需求量進行比較,從而分析節(jié)假日對產品需求量的影響。
- 加載數(shù)據(jù)集并進行數(shù)據(jù)預處理,將訂單日期(order_date)轉換為日期格式,然后根據(jù)日期確定是否為節(jié)假日,將其標記為1,否則標記為0。
- 根據(jù)標記將數(shù)據(jù)集分成兩部分,一部分為節(jié)假日數(shù)據(jù),一部分為非節(jié)假日數(shù)據(jù)。
- 對于節(jié)假日數(shù)據(jù)和非節(jié)假日數(shù)據(jù),計算每天的平均需求量。
- 將結果可視化,比較節(jié)假日和非節(jié)假日的平均需求量,觀察是否存在明顯差異。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import holidays
# 加載數(shù)據(jù)集并進行數(shù)據(jù)預處理
df = pd.read_csv('data/order_train0.csv')
df['order_date'] = pd.to_datetime(df['order_date'])
df['is_holiday'] = df['order_date'].isin(holidays.China(years=[2015,2016,2017,2018]))
df['is_holiday'] = df['is_holiday'].astype(int)
# 將數(shù)據(jù)集分成兩部分:節(jié)假日數(shù)據(jù)和非節(jié)假日數(shù)據(jù)
。。。略,請下載完整代碼
# 計算每天的平均需求量
holiday_demand = holiday_df.groupby(['order_date'])['ord_qty'].mean()
non_holiday_demand = non_holiday_df.groupby(['order_date'])['ord_qty'].mean()
# 可視化比較節(jié)假日和非節(jié)假日的平均需求量
plt.figure(figsize=(10,6))
plt.plot(holiday_demand.index, holiday_demand.values, label='Holiday')
plt.plot(non_holiday_demand.index, non_holiday_demand.values, label='Non-Holiday')
plt.title('Average demand on holiday vs non-holiday')
plt.xlabel('Date')
plt.ylabel('Average demand')
plt.legend()
plt.show()
(7)促銷對產品需求量的影響:
促銷活動通??梢蕴岣弋a品的銷售量,因此對產品需求量也會有影響。在此問題中,我們可以選取一些促銷活動,對促銷期和非促銷期進行對比分析。
- 對于促銷日數(shù)據(jù)和非促銷日數(shù)據(jù),計算每天的平均需求量。
- 將結果可視化,比較促銷日和非促銷日的平均需求量,觀察是否存在明顯差異。
- 比較促銷期和非促銷期的平均訂單需求量,以分析促銷對產品需求量的影響。
import pandas as pd
import matplotlib.pyplot as plt
# 加載數(shù)據(jù)集
df = pd.read_csv('data/order_train0.csv', parse_dates=['order_date'])
df['order_date'] = pd.to_datetime(df['order_date'], format='%y/%m/%d')
# 按照促銷日期將數(shù)據(jù)集分成兩部分
promo_dates = [pd.to_datetime('2016-06-18'), pd.to_datetime('2016-11-11')]
df_promo = df[df['order_date'].isin(promo_dates)]
df_nonpromo = df[~df['order_date'].isin(promo_dates)]
# 計算促銷和非促銷期間的每天平均需求量
。。。略,請下載完整代碼
# 可視化結果
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(promo_mean_qty.index, promo_mean_qty.values, label='Promo')
ax.plot(nonpromo_mean_qty.index, nonpromo_mean_qty.values, label='Non-Promo')
ax.set_xlabel('Date')
ax.set_ylabel('Average Demand')
ax.set_title('Impact of Promotions on Product Demand')
ax.legend()
plt.show()
比較促銷期和非促銷期的平均訂單需求量,以分析促銷對產品需求量的影響。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 1. 確定促銷期
promotions = ['2015/6/18', '2015/11/11', '2016/6/18', '2016/11/11', '2017/6/18', '2017/11/11', '2018/6/18']
# 2. 加載并預處理數(shù)據(jù)
df = pd.read_csv('data/order_train0.csv', parse_dates=['order_date'], dtype={'sales_region_code': 'str'})
df['is_promotion'] = df['order_date'].isin(promotions).astype(int)
df_agg = df.groupby(['order_date'])['ord_qty'].sum().reset_index()
# 3. 計算促銷期和非促銷期的訂單需求量
df_promo = df_agg[df_agg['order_date'].isin(promotions)]
df_nonpromo = df_agg[~df_agg['order_date'].isin(promotions)]
promo_mean = df_promo['ord_qty'].mean()
nonpromo_mean = df_nonpromo['ord_qty'].mean()
# 4. 可視化比較促銷期和非促銷期的訂單需求量
。。。略,請下載完整代碼
ax.bar(['Promotion', 'Non-promotion'], [promo_mean, nonpromo_mean])
ax.set_xlabel('Period')
ax.set_ylabel('Average order quantity')
ax.set_title('Effect of promotions on order quantity')
plt.show()
從條形圖中可以看出,參與促銷的產品平均需求量比沒有參與促銷的產品平均需求量要高。這表明促銷活動對產品需求量有積極的影響。
8、季節(jié)因素對產品需求量的影響
- 將訂單日期轉換為季節(jié),按季度聚合訂單需求量。
- 對于每個季節(jié),繪制訂單需求量的直方圖和核密度圖,以及訂單需求量與產品價格的散點圖。
import pandas as pd
import matplotlib.pyplot as plt
# 讀取數(shù)據(jù)
df = pd.read_csv('order_train1.csv')
# 將訂單日期轉換為季節(jié)
def date_to_season(date):
year, month, day = map(int, date.split('/'))
if month in (3, 4, 5):
return 'Spring'
elif month in (6, 7, 8):
return 'Summer'
elif month in (9, 10, 11):
return 'Autumn'
else:
return 'Winter'
df['Season'] = df['order_date'].apply(date_to_season)
# 按季度聚合訂單需求量
。。。略,請下載完整代碼
# 繪制直方圖和核密度圖
for season in ['Spring', 'Summer', 'Autumn', 'Winter']:
plt.figure(figsize=(8,6))
plt.hist(df[df['Season'] == season]['ord_qty'], bins=20, alpha=0.5, color='blue')
df[df['Season'] == season]['ord_qty'].plot(kind='density', secondary_y=True)
plt.title('Demand Distribution in ' + season)
plt.xlabel('Order Demand')
plt.ylabel('Frequency / Density')
plt.show()
# 繪制散點圖
for season in ['Spring', 'Summer', 'Autumn', 'Winter']:
plt.figure(figsize=(8,6))
plt.scatter(df[df['Season'] == season]['item_price'], df[df['Season'] == season]['ord_qty'], alpha=0.5)
plt.title('Demand vs. Price in ' + season)
plt.xlabel('Item Price')
plt.ylabel('Order Demand')
plt.show()
從結果中可以看出,不同季節(jié)的訂單需求量分布存在差異,例如冬季的訂單需求量普遍較高,而夏季的訂單需求量則普遍較低。此外,不同季節(jié)的訂單需求量與產品價格之間的關系也存在一定的差異,例如在春季和秋季,訂單需求量與產品價格之間存在一定的正相關關系,而在夏季和冬季則不存在明顯的相關性。
2.2 問題二
【2023年第十一屆泰迪杯數(shù)據(jù)挖掘挑戰(zhàn)賽】B題:產品訂單的數(shù)據(jù)分析與需求預測 建模及python代碼詳解 問題二
3 完整代碼
電腦瀏覽器打開
betterbench.top/#/49/detail
- 分享到:
- 首獎10000元〡六盤水老2024年10月21日
- 2024福州市倉山區(qū)“煙2024年10月21日
- “海陸豐饒·助企興農2024年10月18日
- 廣東江門市邑美鄉(xiāng)村2024年10月18日
- 2024年“長春禮物”征2024年10月18日
- 衡陽師范獲省計算機2024年10月16日
- 天津金街IP形象設計征2024年10月16日
- 獎金池21.9萬 第六屆黃2024年10月16日
- 首屆“云南禮物”高2024年10月16日
- 2024中國傳統(tǒng)建筑藝術2024年10月16日