第十一届泰迪杯B题:产品订单的数据分析与需求预测

  • Post author:
  • Post category:其他


赛题描述


一.问题背景

近年来企业外部环境越来越不确定,复杂多变的外部环境,让企业供应链面临较多难题。需求预测作为企业供应链的第一道防线,重要程度不言而喻,然而需求预测受多种因素的影响,导致预测准确率普遍较低,因此需要更加优秀的算法来解决这个问题。需求预测是基于历史数据和未来的预判得出的有理论依据的结论,有利于公司管理层对未来的销售及运营计划、目标,资金预算做决策参考;其次,需求预测有助于采购计划和安排生产计划的制定,减少受业务波动的影响。如果没有需求预测或者预测不准,公司内部很多关于销售、采购、财务预算等决策都只能根据经验而来了,会导致对市场预测不足,产生库存和资金的积压或不足等问题,增加企业库存成本。


二.数据说明

附件中的训练数据(order_train1.csv)提供了国内某大型制造企业在2015年9月1日至2018年12月20日面向经销商的出货数据(格式见表1),反应了该企业产品在不同销售区域的价格和需求等信息,包括:order_date(订单日期)、sales_region_code(销售区域编码)、item_code(产品编码)、first_cate_code (产品大类编码)、second_cate_code (产品细类编码)、sales_chan_name (销售渠道名称)、item_price (产品价格)和ord_qty (订单需求量)。

其中”订单日期”为某个需求量的日期;一个”产品大类编码”会对应多个”产品细类编码”;”销售渠道名称“分为online(线上)和offline(线下),”线上“是指淘宝和京东等电商平台,”线下“是指线下实体经销商。

附件中的预测数据(predict_sku1.csv)提供了需要预测产品的销售区域编码、产品编码、产品品类和产品细品类(格式见表2)。


三.需要解决的问题

1. 请对附件中的训练数据(order_train1.csv)进行深入地分析,可参照但不限于下述主题。

(1) 产品的不同价格对需求量的影响;

(2) 产品所在区域对需求量的影响,以及不同区域的产品需求量有何特性;

(3) 不同销售方式(线上和线下)的产品需求量的特性;

(4) 不同品类之间的产品需求量有何不同点和共同点;

(5) 不同时间段(例如月头、月中、月末等)产品需求量有何特性;

(6) 节假日对产品需求量的影响;

(7) 促销(如618、双十一等)对产品需求量的影响;

(8) 季节因素对产品需求量的影响。

2. 基于上述分析,建立数学模型,对附件预测数据(predict_sku1.csv)中给出的产品,预测未来3月(即2019年1月、2月、3月)的月需求量,将预测结果按照表3的格式保存为文件result1.xlsx,与论文一起提交。请分别按天、周、月的时间粒度进行预测,试分析不同的预测粒度对预测精度会产生什么样的影响。

代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

data = pd.read_csv('order_train0.csv')
data.head()

f11832b1e24b4df889afdd8e3146bfe4.png

data.info()

998fa06cc5e747959cde68fd5b77e854.png

分析产品的不同价格对需求量的影响

data['item_code']*******


21271    864
20973    790
21619    633
20501    532
20283    487
        ... 
21591      1
20377      1
21576      1
20409      1
20598      1
Name: item_code, Length: 1423, dtype: int64

选取具有代表性的频率前4产品,分析产品的不同价格对需求量的影响

data['item_code'].value_counts()
**************************************
**************************************

from scipy.stats import norm
************************************************
************************************************
ax2.plot(prices_1, norm.pdf(prices_1, np.mean(prices_1), np.std(prices_1)), 'k', linewidth=2)
plt.savefig('21271产品的不同价格对需求量的影响.png')
plt.show()

5db79180446d44a78b5113ec16856450.png

df_1 = data[data['item_code'] == 20973]
**************
***************
*****************
******************
ax1.bar(prices_1, sales_1, width=5, alpha=0.5)
ax2.plot(prices_1, norm.pdf(prices_1, np.mean(prices_1), np.std(prices_1)), 'k', linewidth=2)
plt.savefig('20973产品的不同价格对需求量的影响.png')
plt.show()

f7317d211d6a4c1db3ebafa6cf45f648.png

df_1 = data[data['item_code'] == 21619]
*************
****************
*******************
*************************
ax1.bar(prices_1, sales_1, width=5, alpha=0.5)
ax2.plot(prices_1, norm.pdf(prices_1, np.mean(prices_1), np.std(prices_1)), 'k', linewidth=2)
plt.savefig('21619产品的不同价格对需求量的影响.png')
plt.show()

70eeed110f164edb9ee10d8d9e132715.png

df_1 = data[data['item_code'] == 20501]
**********************************
************************************
***************************************
***************************************
ax1.bar(prices_1, sales_1, width=5, alpha=0.5)
ax2.plot(prices_1, norm.pdf(prices_1, np.mean(prices_1), np.std(prices_1)), 'k', linewidth=2)
plt.savefig('20501产品的不同价格对需求量的影响.png')
plt.show()

aa5e00f04f6147d989943c456ee63af5.png

可以发先产品的不同价格对需求量的影响 ,基本呈正态分布价格上升需求量也会上升但会存在一个阀值点从而价格继续上升而需求量下降。

40984b17711e47ff893e0499a7706e47.jpeg
产品所在区域对需求量的影响,以及不同区域的产品需求量有何特性

labels = ***
x = ********
plt.figure(figsize=(10, 5) ,dpi=300)
explode = [0.05,0,0,0,0] # 突出前1
colors = *
def make_autopct(values):
    def my_autopct(pct):
        **************
        ******************************
        # 同时显示数值和占比的饼图
        **********************************
    return my_autopct #同时显示实际值和占比
plt.pie(x,labels=labels, ********************)
plt.title('不同区域的产品需求量特性')
plt.legend(loc='center right', bbox_to_anchor=(1.2, 0.75), ncol=1)
plt.savefig('不同区域的产品需求量特性.png',bbox_inches = 'tight')
plt.show()

bfe84634e0a04b6e93ce457d60147d59.png

不同销售方式(线上和线下)的产品需求量的特性

labels = df_2.groupby('first_cate_code')['ord_qty'].sum().index
x = df_2.groupby('first_cate_code')['ord_qty'].sum().values
plt.figure(figsize=(5, 5) ,dpi=300)
*
plt.savefig('线下产品各大类需求量.png',bbox_inches = 'tight')
plt.show()


labels = df_3.groupby('first_cate_code')['ord_qty'].sum().index
x = df_3.groupby('first_cate_code')['ord_qty'].sum().values
*
plt.savefig('线上产品各大类需求量.png',bbox_inches = 'tight')
plt.show()


labels = df_2.groupby('second_cate_code')['ord_qty'].sum().index
x = df_2.groupby('second_cate_code')['ord_qty'].sum().values
*
plt.show()

labels = df_3.groupby('second_cate_code')['ord_qty'].sum().index
x = df_3.groupby('second_cate_code')['ord_qty'].sum().values
*
plt.show()

31b561c2a70740428f570c46a3fae966.jpeg

不同时间段(例如月头、月中、月末等)产品需求量有何特性

427ca44a66c242f8871a2f76d49e0a5f.png

详细代码+qq2869955900


节假日对产品需求量的影响

import ****

def is_chinese_holiday(date):
    """
    判断指定日期是否是中国法定节假日(不包括调休)
    """
    # 判断是否是周末(周六或周日)
    if date.weekday() == 5 or date.weekday() == 6:
        return False
    # 判断是否是元旦
    **
    return False
data['holiday'] = data['order_date']***


df_7 = data[data['holiday'] == True] # 节假日数据
df_8 = data[data['holiday'] == False] # 非节假日数据

x_1 = df_7.groupby('first_cate_code')['ord_qty'].mean().index
y_1 = df_7.groupby('first_cate_code')['ord_qty'].mean().values
x_2 = df_8.groupby('first_cate_code')['ord_qty'].mean().index
****
for i, j in zip(x_2, y_2):
    plt.text(i, j, "%.4f" % j, ha="center", va="bottom", fontsize=10)
plt.savefig('节假日与非节假日各产品大类平均订单需求量.png',bbox_inches = 'tight')
plt.show()


x_1 = df_7.groupby('second_cate_code')['ord_qty'].mean().index
y_1 = df_7.groupby('second_cate_code')['ord_qty'].mean().values
x_2 = df_8.groupby('second_cate_code')['ord_qty'].mean().index
y_2 = df_8.groupby('second_cate_code')['ord_qty'].mean().values
plt.figure(figsize=(8, 4), dpi = 300)
******
for i, j in zip(x_2, y_2):
    plt.text(i, j, "%.4f" % j, ha="center", va="bottom", fontsize=10)
plt.savefig('节假日与非节假日各产品细类平均订单需求量.png',bbox_inches = 'tight')
plt.show()

3f39ea3335e24c2fb3a99e036a21f6fc.png

季节因素对产品需求量的影响
product_codes = df_9.groupby('first_cate_code')['ord_qty'].mean().index
spring = df_9.groupby('first_cate_code')['ord_qty'].mean().values
summer = df_10.groupby('first_cate_code')['ord_qty'].mean().values
autumn = df_11.groupby('first_cate_code')['ord_qty'].mean().values
winter = df_12.groupby('first_cate_code')['ord_qty'].mean().values

# 绘制图形
****
index = np.arange(len(product_codes))
bar_width = 0.2
opacity = 0.8

****

# 设置x轴标签
ax.set_xlabel('产品大类')
# 设置y轴标签
ax.set_ylabel('产品平均需求量')
# 设置图形标题
ax.set_title('春夏秋冬各产品大类平均产品需求量')
# 设置x轴刻度
ax.set_xticks(index + 2*bar_width)
ax.set_xticklabels(product_codes)
# 设置图例
ax.legend()
plt.savefig('春夏秋冬各产品大类平均产品需求量.png',bbox_inches = 'tight')
# 显示图形
plt.show()



product_codes = df_9.groupby('second_cate_code')['ord_qty'].mean().index
spring = df_9.groupby('second_cate_code')['ord_qty'].mean().values
summer = df_10.groupby('second_cate_code')['ord_qty'].mean().values
autumn = df_11.groupby('second_cate_code')['ord_qty'].mean().values
winter = df_12.groupby('second_cate_code')['ord_qty'].mean().values

# 绘制图形
***
index = np.arange(len(product_codes))
bar_width = 0.2
opacity = 0.8

****

# 设置x轴标签
ax.set_xlabel('产品细类')
# 设置y轴标签
ax.set_ylabel('产品平均需求量')
# 设置图形标题
ax.set_title('春夏秋冬各产品细类平均产品需求量')
# 设置x轴刻度
ax.set_xticks(index + 2*bar_width)
ax.set_xticklabels(product_codes)
# 设置图例
ax.legend()
plt.savefig('春夏秋冬各产品细类平均产品需求量.png',bbox_inches = 'tight')
# 显示图形
plt.show()

35f1f02ef35742c1bc855bf79211a247.png

源码+q 2869955900



版权声明:本文为FUYUJIAN1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。