第十一届泰迪杯B题:产品订单的数据分析与需求预测_第十一届挑战赛b1-产品订单分析与需求预测 赛题数据-程序员宅基地

技术标签: 数据分析  数据挖掘  

赛题描述

一.问题背景

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

二.数据说明

附件中的训练数据(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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FUYUJIAN1/article/details/129687019

智能推荐

预处理(宏定义、文件包含、条件编译)_宏定义包含&-程序员宅基地

文章浏览阅读6.7k次,点赞4次,收藏8次。预处理(pre-treatment),是指在进行最后加工完善以前进行的准备过程,具体应用在不同的行业或领域,会有不同的解释。 一、含义程序设计中的预处理(Preprocess),程序设计领域,预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来支持宏调用。_宏定义包含&

考研从机械到计算机难吗,考研机械真的不行吗?-程序员宅基地

文章浏览阅读2.1k次。玛琪玛的头号舔狗楼主2021-03-15 12:00:53点灭只看此人举报21楼小孩思想,我是985机械转行的,985机械在17年都难考的要死,更别说现在了,本科学历不行能刷到你自闭,人家底子好的已经各种三维方程车国奖拿到手软了(就这样我同学还是380上岸),或者再怎么说也和学长组队混了个小奖,但是普本的可能连比赛名字都没听过,天坑专业是好考研,但是金字塔顶端一样卷得厉害,211机械硕士我没了解..._机械改行学计算机容易吗

史上最详细的Intellij IDEA开发教程-程序员宅基地

文章浏览阅读3.6k次。Intellij IDEA系列教材 (一)- 基础 - 教程步骤1:下载地址下载地址:https://www.jetbrains.com/idea/download/#section=windows 下载Ultimate,这个版本有对J2EE的支持,Community对WEB的支持没有那么全。 Ultimate可以免费试用一个月步骤2:也可以下载右上角的 ideaI..._idea开发教程

经纬度转换、换算_10448.847106这种经纬度怎么转换-程序员宅基地

文章浏览阅读592次。js中经纬度的换算_10448.847106这种经纬度怎么转换

springboot集成spring.kafka_spring.kafka.producer.buffer-memory-程序员宅基地

文章浏览阅读552次。springboot版本:2.0.4.RELEASE添加pom依赖<!--kafka,版本号跟springboot版本匹配--><dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artif..._spring.kafka.producer.buffer-memory

辨析读写json文件常用json.loads()、json.load()和json.dumps()、json.dump()区别及ensure_ascii参数_json5.loads-程序员宅基地

文章浏览阅读1.2k次。一句话概括json . loads 接受字符串json . load 接受文件对象json . dumps 输出为字符串json . dump 输出到文件。_json5.loads

随便推点

[WinApi] C#获取其他窗口文本框内容_c#获取其他程序界面内容、-程序员宅基地

文章浏览阅读3.7k次。声明部分:const int WM_GETTEXT = 0x000D;const int WM_GETTEXTLENGTH = 0x000E; [DllImport("user32.dll", EntryPoint = "SendMessageA")]public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, Byte[] lParam); [DllImport("user32.dll", EntryPoint_c#获取其他程序界面内容、

text-overflow属性_overline属性-程序员宅基地

文章浏览阅读2.2k次。text-overflow属性基本语法语法项目说明值clip|ellipsis|ellipsis-word默认值clip适用于块级元素或行内元素可否继承否取值简单说明:clip属性值表示不显示省略标记,而是简单地剪切。ellipsis属性值表示当对象内文本溢出时显示省略标记,省略标记插入的位置是最后一个字符。ellipsis-word表示当对象内文本溢出时显示省略标记,省略标记插入的位置是最后一个..._overline属性

在iOS设备中跑Python脚本_ios python解释器-程序员宅基地

文章浏览阅读3.2w次,点赞5次,收藏50次。在iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗。这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOS上python的IDE,如Python3IDE),可以执行输入的python语和本地的python文件。当然我想要的不是像这篇文章说的用python编写一整个iOS程序,而只是在iOS应用中嵌入pyth..._ios python解释器

python实现简单决策树(信息增益)——基于周志华的西瓜书数据-程序员宅基地

文章浏览阅读1.1k次。数据集如下: 1 色泽 根蒂 敲声 纹理 脐部 触感 好瓜 2 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是 3 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是 4 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是 5 青绿 蜷缩 沉闷 ..._用信息增益方法 画出西瓜数据集的决策树

mysql 更新一个字段(在他的后面添加字符串)_mysql update为某一字段加上固定字符串-程序员宅基地

文章浏览阅读3.4k次。更新一个字段,在它的后面加一个字符串,不查询数据库得到这个字段值 怎么添加?? 例如: 我的test表,有个user字段,我现在想在它后面加了另一个用户的名字 我在mysql数据库这样写UPDATE test SET user= user+ ',phpchina' WHERE id= '2';这样是不对的,mysql数据库把它当成数字相加了,user字段值变成0了。 应该:UPDAT..._mysql update为某一字段加上固定字符串

Linux之进程间通信——管道_linux进程间通信管道-程序员宅基地

文章浏览阅读1.8k次。管道是Linux中最古老的进程间通信的方式,本文介绍了进程间通信的相关概念,主要介绍了匿名管道和命名管道。_linux进程间通信管道