库存补单的数学模型
摘要
根据顾客对商品的需求,科学合理的制定库存补单决策对于自家商店发展具有重大的影响,进而成为商家关注的热点问题。本文研究的是补单的策略问题。
针对问题一,是典型的预测问题,要求我们能够准确的预测出未来五天的日销售量。由于日销售量是个非线性的关系,因此,本文采用的是BP神经网络模型,利用梯度降维法,由创建的神经元对数据的测试和训练结果的重合度,得出拟合的结果是比较准确的,由此本文预测出了各商品未来5天的销售情况。
针对问题二,要求求出上新量和延期比的分布范围和置信区间。本文先求出上新量和延期比的频率直方图,然后构建各自的qq图,由qq图可检验两个分布是呈现正态分布,根据构建出来的正态分布概率模型来求得上新量置信区间为[200 9002.6],延期比的置信区间为[-0.1320,0.4107]。
针对问题三,是在问题二的基础上进一步求出各个季度的上新量和延期比的置信区间,所用模型与问题二的一样,根据构建出来的正态分布概率模型来求得各自的置信区间。上新量各个季度的置信区间为[772.335,4253.664], [-961.2491,9227.499], [405.066,3771.497], [843.385,4308.501],延期比各个季度的置信区间为[-0.00391,0.49534], [-0.04169,0.51598], [-0.03977,0.47120],[0,0]。
针对问题四,是根据本文分析的结果来制定补单策略,根据我们求出的安全库存来制定补单策略,再分别根据日常销量和活动销量来制定我们的补单周期,使每次的补单量不会超过安全库存。本文分析出一般是以一周为周期即T=7(天),来不断更新库存,当商品处于淡季时,商家应该制定较为长的补单周期,一般为T=20(天)。
关键字:BP神经网络模型、梯度降维法、正态分布概率模型、安全库存
一、问题重述
1.1 问题的背景
商品的销量一直以来都是商家非常重视的一项指标,商家可以根据商品各种销量数据有针对性的做出一系列有价值的有计划的决策,进而提高自家商店的收益。因此,根据顾客对商品的需求,科学合理的制定库存补单决策对于自家商店发展具有重大的影响,进而成为商家关注的热点问题。
1.2 根据题目
提供的相关信息,可知如下数据可见:
附件1给出了相关商品2018年-2019年的日常销量
附件2 给出了商店相关商品的订单信息
1.3 需要解决的问题
问题一:根据2018年-2019年相关商品的历史销售量,预测相关商品未来近五天的销售量。
问题二:根据相关商品的订单信息中的上新量和延期比的分布情况,并给出其分布范围和置信区间。
问题三:根据相关商品的订单信息中各个季度货物的上新量和延期比的分布情况,并给出分布范围及置信区间。
问题四:根据附录一到附录二,制定合理的补单策略,写出具体操作流程。
二、模型假设
为简化问题,做出如下假设
(1)假设问题一中的未来5天预测与节日带来的购买欲无关。
(2)假设问题二中的货物的上新与外界的干扰因素无关。
(3)假设货物的延期量与货物的运输无关。
(4)假设当天商品的订单量即为商品的销售量。
(5)假设商品的退款量不影响商品的销售。
(6)假设所给材料数据真实有效
三、 符号说明
符号 | 含义 |
---|---|
m | 训练集中样本的数量 |
X’s | 输入变量 |
Y’s | 输出变量 |
(x,y) | 训练样本 |
θ i \theta_i θi | 模型参数 |
:= | 赋值符号 |
α \alpha α | 学习率 |
SS | 安全库存 |
L ˉ \bar{L} Lˉ | 提前期的平均值 |
d ˉ \bar{d} dˉ | 日平均需求量 |
z | 某服务水平下的标准个数 |
σ d \sigma_d σd | 日常需求的标准差 |
四、 问题分析
4.1 问题一分析:
根据特征变量与数据输出结果我们构建出三层结构的bp神经网络,通过使用梯度下降法进行反向传播得到参数值,之后通过训练出来的模型对新数据进行预测。
4.2 问题二分析:
我们将商品的首次下单量与上新前补单总下单量的总和记为货物的上新量,根据已有的数据,绘制商品销售量的分布直方图,且以商品销售量在每个分布区间的商品种类数作为代表点,得出新的数据,再次基础上运用QQ检验图检验代表点是否符合正态分布,进而构造正态分布概率模型,求得货物上新量以及货物延期比的分布范围以及置信区间。
4.3 问题三分析:
问题三是在问题二的基础上进一步分析,以季度为分割点将问题二细化。
4.4 问题四分析:
由于商品的日常销售量以及商品的安全库存直接影响到商品的补单策略,因此我们根据所得的安全库存公式,可以获得影响商品补单策略的间接因素。由于考虑到在实际问题中,影响商品补单策略的内部因素是十分之多且为复杂的,因此,为简化问题,我们根据不同情况,影响补单策略因素中的其中一个间接因素即补单周期是固定的,再进一步根据不同季度去制定合理的补单策略。
五、 模型建立与求解
5.1 问题一:
5.1.1 模型的准备:
BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。系统解决了多层神经网络隐含层连接权学习问题,人们把采用这种算法进行误差校正的多层前馈网络称为BP网。
BP神经网络具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决的异或和一些其他问题。从结构上讲,BP网络具有输入层、隐藏层和输出层;从本质上讲,BP算法就是以网络误差平方为目标函数、采用梯度下降法来计算目标函数的最小值。
5.1.2 模型建立
首先,根据我们已有的数据,输入变量,创建的神经元如图一所示
然后,根据我们已知数据,输入变量,得到的训练和测试效果如图二所示:
观察图二可知,我们所创建的神经元对数据的测试和训练结果基本重合,可以由此得出我们所拟合的结果是比较准确的。
5.1.3 模型的求解
经过图一与图二,对我们所创建神经元进行检验后,我们可设单变量(商品的销售量)线性回归的预测函数为:
h
θ
(
x
)
=
θ
0
+
θ
1
∗
x
(
1
)
\quad\quad\quad\quad h_\theta(x)=\theta_0+\theta_1*x \quad\quad\quad\quad\quad\quad\quad\quad\quad(1)
hθ(x)=θ0+θ1∗x(1)
其中
θ
i
(
i
=
0
,
1
)
\theta_i(i=0,1)
θi(i=0,1)为模型参数:
又由于平方误差函数为:
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
2
(
2
)
\quad\quad J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^i)-y^i)^2\quad\quad\quad\quad\quad(2)
J(θ0,θ1)=2m1i=1∑m(hθ(xi)−yi)2(2)
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
(
3
)
\quad\quad\quad\quad \theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1) \quad\quad\quad\quad\quad\quad\quad(3)
θj:=θj−α∂θj∂J(θ0,θ1)(3)
其中
α
\alpha
α为学习率,为一个固定常数,经过模型的不断检验,最终确定为0.00003
由(1)、(2)\(3)式可得:
θ
0
:
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
0
(
x
i
)
−
y
i
)
(
4
)
\quad\quad \theta_0:=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_0(x_i)-y_i)\quad\quad\quad\quad\quad\quad(4)
θ0:=θ0−αm1i=1∑m(h0(xi)−yi)(4)
θ
1
:
=
θ
1
−
α
1
m
∑
i
=
1
m
(
(
h
0
(
x
i
)
−
y
i
)
x
i
)
(
5
)
\quad\quad \theta_1:=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^{m}((h_0(x_i)-y_i)x_i)\quad\quad\quad\quad(5)
θ1:=θ1−αm1i=1∑m((h0(xi)−yi)xi)(5)
由(4)、(5)式,经过100次迭代,最终得到
θ
0
\theta_0
θ0和
θ
1
\theta_1
θ1的值,则将
θ
0
\theta_0
θ0和
θ
1
\theta_1
θ1代入(1)式,最终得到相关商品未来五天的预测销量如表1:(代码详见附录8.1)
5.2 问题二
5.2.1 模型的准备
根据已有的数据,构建货物上新量以及延期比的分布直方图,其次再根据其分布情况进行进一步的检验,其中运用QQ图检验货物上新量以及延期比是否符合正态分布。
5.2.2 模型的建立
以商品的首次下单量与上新前补单总下单量的总和记为货物的上新量,在此构建正态分布模型,货物上新量的分布情况如图三所示:(代码详见附录8.2)
进一步,我们根据所构造的图三货物上新量,以每个区间商品种类的数目为代表点,绘制QQ图如图所示(代码详见附录8.5):
直观图四,从图中可以看出,QQ对应点较为均匀地分布在 y = x y=x y=x 曲线附近,而且全部落在90%的接受区间,因此可以判断以货物种类数目为区间代表点的数列服从正态分布,因此我们建立了正态分布概率模型。
根据已有的数据,我们构建的货物延期比的分布直方图如图五所示(代码详见附录8.3):
综合图五、图六可得,货物延期比分布情况在进行图六的QQ图检验后可以判断其基本符合正态分布,因此我们建立正态分布的概率模型。
5.2.3 模型的求解
由于正态分布的概率密度函数为:
f
(
x
)
=
e
x
p
−
(
x
−
μ
)
2
2
σ
2
2
π
σ
(
6
)
\quad\quad\quad\quad f(x)=\frac{exp{\frac{-(x-\mu)^2}{2\sigma^2}}}{\sqrt{2\pi}\sigma} \quad\quad\quad\quad\quad\quad\quad\quad(6)
f(x)=2πσexp2σ2−(x−μ)2(6)
且货物上新量的的样本均值为:
X
ˉ
=
1
n
∑
i
=
1
n
x
i
(
7
)
\quad\quad\quad\quad\quad\quad\bar{X}=\frac{1}{n}\sum_{i=1}^{n}x_i\quad\quad\quad\quad\quad\quad\quad\quad\quad(7)
Xˉ=n1i=1∑nxi(7)
货物上新量的样本方差为:
S
n
=
1
n
∑
i
=
1
n
(
x
i
−
X
ˉ
)
2
(
8
)
\quad\quad\quad\quad S_n=\frac{1}{n}\sum_{i=1}^n(x_i-\bar{X})^2\quad\quad\quad\quad\quad\quad\quad\quad(8)
Sn=n1i=1∑n(xi−Xˉ)2(8)
货物延期比的的样本均值为:
Y
ˉ
=
1
n
∑
i
=
1
n
y
i
(
9
)
\quad\quad\quad\quad\quad\quad \bar{Y}=\frac{1}{n}\sum_{i=1}^ny_i\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad(9)
Yˉ=n1i=1∑nyi(9)
对货物延期比数据进行标准化即:
Z
=
Y
ˉ
−
μ
σ
/
n
(
10
)
\quad\quad\quad\quad\quad\quad\quad\quad Z=\frac{\bar{Y}-\mu}{\sigma/\sqrt{n}}\quad\quad\quad\quad\quad\quad\quad\quad\quad(10)
Z=σ/nYˉ−μ(10)
由于货物延期比的方差已知为3.014,则在给定置信水平,货物延期比在该置信水平下的置信区间为:
P
(
−
z
1
−
α
/
2
<
Z
<
z
1
−
α
/
2
)
=
1
−
α
(
11
)
\quad\quad\quad\quad P(-z_{1-\alpha/2<Z<z_{1-\alpha/2}})=1-\alpha\quad\quad\quad\quad\quad\quad(11)
P(−z1−α/2<Z<z1−α/2)=1−α(11)
即
P
(
Y
ˉ
−
z
1
−
α
/
2
σ
n
<
μ
<
Y
ˉ
+
z
1
−
α
/
2
σ
n
)
(
12
)
P(\bar{Y}-z_{1-\alpha/2}\frac{\sigma}{\sqrt{n}}<\mu<\bar{Y}+z_{1-\alpha/2}\frac{\sigma}{\sqrt{n}})\quad\quad\quad\quad\quad(12)
P(Yˉ−z1−α/2nσ<μ<Yˉ+z1−α/2nσ)(12)
其中 ,
z
1
−
α
/
2
=
1.96
z_{1-\alpha/2}=1.96
z1−α/2=1.96,n为一固定常数,即商品总类n=334;
综合(6)(7)(8)式可算出,货物上新量在总区间[200,25000]中,其置信水平为0.95的情况下置信区间为[200 9002.6]。(代码详见附录8.4)
同时,综合(9)(10)(11)(12)式可得算出,货物延期比在总区间在[0,1]中,其置信水平为0.95的情况下置信区间为[-0.1320,0.4107](代码详见附录8.6)。
5.3 问题三
5.3.1 模型的准备
由于问题二已经解释过相应的模型,考虑篇幅问题,此处不再进行解释。
5.3.2 模型的建立
问题三是在问题二的基础上,以季节为分割点,将上新量和延期比分为四个部分来进行分析其分布情况。本文是以该商家对货物的上新时间的安排作为各个季度的分割依据,以12,1,2月为第一季度,3,4,5,月为第二季度,6,7,8月为第三季度,9,10,11月为第四季度,进而分析各个季度货物上新量与货物延期比的分布情况以及置信区间,分析的模型跟问题二的一样。
于是,我们根据已有的数据和季度的划分情况,构造出各个季度的分布直方图如图七所示(直方图构建代码详见附录8.2):
综合图七与图八可得,我们运用QQ图对于每个季度货物上新量得分布情况进行检验后,由于QQ对应得点较为均匀得分布在曲线
y
=
x
y=x
y=x附近,且落点范围满足90%的的接受区间,因此我们可以建立正态分布概率模型。
观察图九,对于第一、第二以及第三季度的延期分布图,经过QQ图的检验,可以确定其分布情况式符合正态分布的。单分析第四季度,由于第四季度货物的延期比基本为0,因此不能用QQ图来检验其是否符合正态分布。
5.3.3 模型的求解
基于第二问的求解过程,可以求得以季度为时间单位,求得四个季度的上新量以及延期比在置信水平在0.95情况下的置信区间如表2:(求解代码详见附录8.4)
上新量置信区间 | 延期比置信区间 | |
---|---|---|
第一季度 | [772.335,4253.664] | [-0.00391,0.49534] |
第二季度 | [-961.2491,9227.499] | [-0.04169,0.51598] |
第三季度 | [405.066,3771.497] | [-0.03977,0.47120] |
第四季度 | [843.385,4308.501] | [0,0] |
5.4 问题四
5.4.1 模型的准备
对于商品的补单方案,我们引入商品安全库存的概念,安全库存即是指当不确定因素(订货期间需求增长、到货延期等)导致更高的预期需求或导致完成周期更长时的缓冲存货,安全库存用于满足提前期需求。在给定安全库存的条件下,平均存货可用订货批量的一半和安全库存来描述。
5.4.2 模型的建立
由于商品的日常销量影响着商品补单,我们从所给数据的三百多个商品中,依据商品销量的情况,构建出商品的销量分布情况图。由于三百多件商品中,其销售情况大致有几种规律,于是我们从中选出几个具有代表性的商品的销量情况,进一步分析以及制定不同情况下对商品的补单策略。
由图十一、十二、十三 这三个代表图我们可以得出,商品的日常销量波动不大,但个别季度和活动日对销售量的影响比较大。
由于安全库存计算公式为:
S
S
=
z
σ
d
2
(
L
ˉ
)
+
σ
L
2
(
d
ˉ
)
2
(
13
)
\quad\quad\quad\quad SS=z\sqrt{\sigma^2_d(\bar{L})+\sigma^2_L(\bar{d})^2}\quad\quad\quad\quad\quad\quad\quad\quad(13)
SS=zσd2(Lˉ)+σL2(dˉ)2(13)
由于提前周期的变异可以视为很小,因此,为简化库存问题,当提前周期 不变时,则(13)式可变为:
S
S
=
z
σ
d
2
(
L
ˉ
)
(
14
)
\quad\quad\quad\quad \quad\quad\quad\quad SS=z\sqrt{\sigma_d^2(\bar{L})}\quad\quad\quad\quad\quad\quad\quad\quad(14)
SS=zσd2(Lˉ)(14)
可设时间单位周期为 T( T=周、旬、月、季等),又由于
σ
T
2
=
T
σ
d
2
\sigma_T^2=T\sigma^2_d
σT2=Tσd2 ,
综上(13),(14)式可得安全库存的计算公式为:
S
S
=
z
σ
T
L
ˉ
T
(
15
)
\quad\quad\quad\quad\quad\quad\quad\quad SS=z\sigma T\sqrt{\frac{\bar{L}}{T}}\quad\quad\quad\quad\quad\quad\quad\quad\quad(15)
SS=zσTTLˉ(15)
由于商品的补单依据主要来源于商品已有的库存量大小,当安全库存越大,出现缺货的可能性越小,但库存越大,会导致商品堆积即剩余库存的出现。当安全库存越小,会导致商品供不应求的问题。因此,根据安全库存公式,对于商品的补单,我们应该根据不同商品的销量情况,制定固定的补单周期,将缺货保持在适当的水平,允许一定程度的缺货现象。
观察各时间段商品销量的情况,可知该商店的商品销量在某些固定的季节,商品是处于一种热销的状态,因此,在商品销售旺季时,我们补单周期应尽可能地短,一般以周为周期即
T
=
7
T=7
T=7 (天),不断更新库存;当商品处于淡季时,观察数据可以得到,商品地销售量是较为稳定的,且销量水平普遍不高,为降低过于乐观补单导致商品堆积的风险,此时商家应该制定较为长的补单周期,一般为
T
=
20
T=20
T=20 (天)。
与此同时,在合理制定固定的补单周期后,商家补单量以根据日常销量而定,对商品的补单量应满足周期内的商品供求。
六、 模型分析
6.1 模型优点
1、问题一采用的bp神经网络模型,通过叠加层数的神经网络能够以任意精度逼近任何非线性连续函数,就可以用来预测商品未来5天的销售情况,并且在局部的或者部分的神经元收到破坏后对全局的训练结果不会造成很大的影响,具有一定的容错能力。
2、问题二才用的正态分布概率模型,该模型能适用于连续型数据或者数据离散性小,数据基本能够符合正态分布的特点。对于社会上遇到的大部分问题,其概率分布规律基本都满足正态分布。
6.2 模型缺点
1、BP 神经网络算法的收敛速度慢:由于BP神经网络算法本质上为梯度下降法,它所要优化的目标函数是非常复杂的,因此,必然会出现“锯齿形现象”,这使得BP算法低效。
2、正态分布模型无法近似估算符合几何分布的问题,无法精确解决离散数据概率。
6.3 模型推广
推广一:如果已知一个运动员前几次训练的各项训练成绩,要求这一次训练的训练成绩,可以使用本文建立的模型
推广二:如果要求理想气体分子的速度分量,可以使用本文建立的模型。
七、 参考文献
[1]张美凤,邬华芝,封士祥,范天鹏.基于BP神经网络的热电偶数学建模方法研[J].软件导刊,2014,13(07):16-18.
[2]李奇明,徐德义.参数估计与假设检验:原理、方法与误区[J].大学教育,2018(02):40-42. [3]Wes McKinney 利用Python进行数据分析(第二版)北京:机械工业出版社,2018年
[4]赵俊.安全库存问题的应对措施.市场周刊新物流2005年32期
[5]伊戈尔·米洛瓦诺维奇 python数据可视化编程(第二版)北京:人民邮电出版社,2018年
[6]盛昼,谢式千,潘承毅 概率论与数理统计(第四版)北京:高等教育出版社,2008年
[7]周志华 机器学习 北京:清华大学出版社 2016年
八、附录
8.1 神经网络梯度下降法预测商品未来五天的销量
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
#读取数据
def readExcel():
df = pd.read_excel('附件1.xlsx',sheet_name='销量数据')
return df
def addTime(Y, M, D):
month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if Y%400==0 or (Y%100 and Y%4==0):
month[2] = 29
D+=1
if D>month[M]:
D = 1
M+=1
if M>12:
M = 1
Y+=1
return Y, M, D
def train(trainSetX, trainSetY, w, b):
r = []
for i in range(len(trainSetX)):
r.append(min(10, trainSetY[trainSetX[i]]))
r = np.array(r)
dataX = np.array(trainSetX)
dataY = dataX*w+b
#dataY = [max(x, 0) for x in dataY]
dz = (0.5*(dataY-r)*(dataY-r))
dw = (dataX*dz).sum()/(len(trainSetX))
db = dz.sum()/(len(trainSetX))
#print(dataY)
w = w - 0.000003 * dw
b = b - 0.000003 * db
#print(dw, db, dz.sum()/(len(trainSetX)), w, b)
return w, b, dz.sum()/(len(trainSetX))
def divGoods(idx, data):
sY = (int)(data['日期'][idx][0:4])
sM = (int)(data['日期'][idx][5:7])
sD = (int)(data['日期'][idx][8:10])
listY = []
x = idx+1
while True:
if data['货号'][x] != data['货号'][x - 1]:
break
Y = (int)(data['日期'][x][0:4])
M = (int)(data['日期'][x][5:7])
D = (int)(data['日期'][x][8:10])
sY, sM, sD = addTime(sY, sM, sD)
while sY != Y or sM != M or sD != D:
sY, sM, sD = addTime(sY, sM, sD)
listY.append(0)
listY.append(data['销售件数'][x])
x+=1
dataNums = len(listY)
listX = [i for i in range(dataNums)]
w = 0.00001
b = 0.00001
j = 1000
trainSet = random.sample(listX, (int)(dataNums * 0.7))
for i in range(10):
w, b, j = train(trainSet, listY, w, b)
ans = []
for i in range(5):
y = dataNums+i
ans.append(-(int)(y*w+b))
return ans,x
data = readExcel()
ans = []
dataNums = len(data)
x = 0
output = open('data.xls','w',encoding='gbk')
output.write('huohao\day1\day2\day3\day4\day5\n')
while x!=dataNums:
output.write(str(data['货号'][x]))
output.write('\t')
value, x = divGoods(x, data)
print(value)
for j in range(len(value)):
output.write(str(value[j]%100))
output.write('\t')
output.write('\n')
output.close()
8.2 上新量分布直方图的运算过程
import pandas as pd
# 柱形图-折线图
import pyecharts as pye
import _overlapped
import numpy as np
import math
import matplotlib.pyplot as plt
#统计每个区间的个数
def readExcel(x):
shang_xin = []
for i in range(len(x['上新前补单总下单量'])):
shang_xin.append(x['首次下单量'][i]+x['上新前补单总下单量'][i])
shang_xin.sort()
jian_ge = (max(shang_xin) - min(shang_xin))/10
yy = []
a1 = [];a2 = [];a3 = [];a4 = [];a5 = [];a6=[];a7=[];a8=[]
for i in range(len(x['上新日销量'])):
value = x['首次下单量'][i]+x['上新前补单总下单量'][i]
if value >= shang_xin[0] and value < shang_xin[0] + jian_ge/16:
a1.append(value)
elif value >= shang_xin[0] + jian_ge/16 and value < shang_xin[0] + jian_ge/16*3:
a2.append(value)
elif value >= shang_xin[0] + jian_ge/16*3 and value < shang_xin[0] + jian_ge/32*11:
a3.append(value)
elif value >= shang_xin[0] + jian_ge/32*11 and value < shang_xin[0] + jian_ge/16*10:
a4.append(value)
elif value >= shang_xin[0] + jian_ge/16*10 and value < shang_xin[0] + jian_ge/16*17:
a5.append(value)
elif value >= shang_xin[0] + jian_ge/16*17 and value < shang_xin[0] + jian_ge/16*30:
a6.append(value)
elif value >= shang_xin[0] + jian_ge/16*30 and value < shang_xin[0] + jian_ge/16*60:
a7.append(value)
elif value >= shang_xin[0] + jian_ge/16*60 and value < shang_xin[0] + jian_ge*10:
a8.append(value)
print(shang_xin[0], shang_xin[0] + jian_ge/16, shang_xin[0] + jian_ge/16*3, shang_xin[0]+jian_ge/32*11, shang_xin[0]+jian_ge/16*10,shang_xin[0]+jian_ge/16*17,
shang_xin[0] + jian_ge/16*30, shang_xin[0] + jian_ge/16*60, shang_xin[0] + jian_ge*10)
yy.append(len(a1))
yy.append(len(a2))
yy.append(len(a3))
yy.append(len(a4))
yy.append(len(a5))
yy.append(len(a6))
yy.append(len(a7))
yy.append(len(a8))
print(yy)
return yy
#生成图表
def createChart(my_list):
print(type(my_list))
xx = ['200-355','355-665','665-1052.5',
'1052.5-1750','1750-2835','2835-4850','4850-9500','9500-25000']
bar = pye.Bar()
bar.add('bar', xx, my_list)
line = pye.Line()
line.add('line', xx, my_list)
# bar.show()
bar.render(path='第二题上新量.html')
#求概率
def gaiLu(sum,list):
print('每个区间的个数为{0}'.format(list))
gai_lu = []
for i in range(len(list)):
gai_lu.append(round(list[i]/sum,2))
print('每个区间的概率为{0}'.format(gai_lu))
return gai_lu
#为做qq图批量生成数据
def mymatlab(zhong_wei,list):
k = []
for j in range(len(list)):
for m in range(list[j]):
k.append(zhong_wei[j])
print(k)
with open('第二题上新量.txt','a') as f:
f.write(str(k))
return k
#求均值方差
def ji_suan(zhong_wei,gailu,all_data):
my_jun_zhi = 0
print(zhong_wei)
for i in range(len(zhong_wei)):
my_jun_zhi += gailu[i] * zhong_wei[i]
print(my_jun_zhi)
#批量生成数据
# 求均值
arr_mean = np.mean(all_data)
# 求方差
arr_var = np.var(all_data)
print("均值为{0}".format(arr_mean))
print("方差为{0}".format(arr_var))
def main():
df = pd.read_excel('附件2.xlsx',sheet_name='汇总')
list = readExcel(df) #统计每个区间的个数
createChart(list)
sum = 0
for i in range(len(list)):
sum += list[i]
gg = gaiLu(sum, list)
zhong_wei = [200+(355-200)/2,355+(665-355)/2,665+(1052.5-665)/2,
1052.5+(1750-1052.5)/2,1750+(2835-1750)/2, 2835+(4850-2835)/2, 4850+(9500-4850)/2,9500+(25000-9500)/2 ]
xxx = [x+1 for x in range(8)]
#print("中位数为:{0}".format(zhong_wei)
all_data = mymatlab(xxx, list) # 为做qq图批量生成数据
ji_suan(zhong_wei, gg, all_data)# 求均值方差
if __name__ == '__main__':
main()
8.3 货物延期比的分布直方图
#处理第二题的延期比
import pandas as pd
# 柱形图-折线图
from pyecharts import Bar, Line
import numpy as np
import matplotlib.pyplot as plt
#读取按季度分的表格并统计每个区间的个数
def readExcel(x):
yy = []
a11 = [];a12 = [];a13 = []
a2 = [];a3 = [];a4 = [];a5 = [];a6 = [];a7 = []
for i in range(len(x['延期比'])):
if x['延期比'][i] == 0 :
a11.append(1)
if x['延期比'][i] > 0 and x['延期比'][i] < 0.02:
a12.append(2)
elif x['延期比'][i] >= 0.02 and x['延期比'][i] < 0.1:
a2.append(3)
elif x['延期比'][i] >= 0.1 and x['延期比'][i] < 0.2:
a3.append(4)
elif x['延期比'][i] >= 0.2 and x['延期比'][i] < 0.35:
a4.append(5)
elif x['延期比'][i] >= 0.35 and x['延期比'][i] < 0.5:
a5.append(6)
elif x['延期比'][i] >= 0.5 and x['延期比'][i] <= 1:
a6.append(7)
yy.append(len(a11))
yy.append(len(a12))
yy.append(len(a2))
yy.append(len(a3))
yy.append(len(a4))
yy.append(len(a5))
yy.append(len(a6))
return yy
#生成matlab需要数据
def createMatl(myData):
print(myData)
my_list = []
for i in range(myData[0]):
my_list.append(1)
for i in range(myData[1]):
my_list.append(2)
for i in range(myData[2]):
my_list.append(3)
for i in range(myData[3]):
my_list.append(4)
for i in range(myData[4]):
my_list.append(5)
for i in range(myData[5]):
my_list.append(6)
for i in range(myData[6]):
my_list.append(7)
return my_list
def createChart(my_list):
xx = ['0','0-0.02','0.02-0.1','0.1-0.2','0.2-0.35','0.35-0.5','0.5-1']
bar = Bar("第二题延期比")
bar.add('bar', xx, my_list)
line = Line()
line.add('line', xx, my_list)
print(111111)
bar.render(path='第二题延期比.html')
#求概率
def gaiLu(sum,list):
print('每个区间的个数为{0}'.format(list))
gai_lu = []
for i in range(len(list)):
gai_lu.append(round(list[i]/sum,2))
print('每个区间的概率为{0}'.format(gai_lu))
return gai_lu
#为做qq图批量生成数据
def mymatlab(zhong_wei,list):
k = []
for j in range(len(list)):
for m in range(list[j]):
k.append(zhong_wei[j])
print(k)
with open('第二题延期比.txt','a') as f:
f.write(str(k))
return k
#求均值方差
def ji_suan(zhong_wei,gailu,all_data):
sum = 0
print(zhong_wei)
for i in range(len(zhong_wei)):
sum += gailu[i] * zhong_wei[i]
print(sum)
#批量生成数据
# 求均值
arr_mean = np.mean(all_data)
# 求方差
arr_var = np.var(all_data)
print("均值为{0}".format(arr_mean))
print("方差为{0}".format(arr_var))
def main():
df = pd.read_excel('附件2.xlsx',sheet_name='汇总')
list = readExcel(df)
createChart(list)
sum = 0
for i in range(len(list)):
sum += list[i]
gg = gaiLu(sum, list)
zhong_wei = [0,0+(0.02-0)/2,0.02+(0.1-0.02)/2,0.1+(0.2-0.1)/2,0.2+(0.35-0.2)/2,0.35+(0.5-0.35)/2,0.5+(1-0.5)/2]
xxx = [x+1 for x in range(7)]
print("中位数为:{0}".format(zhong_wei))
all_data = mymatlab(xxx,list) #为做qq图批量生成数据
ji_suan(zhong_wei, gg,all_data) #求均值方差
if __name__ == '__main__':
main()
8.4 置信区间的运算原理以及过程
import numpy as np
import scipy as sp
import scipy.stats
def mean_confidence_interval(data, confidence=0.95):
a = 1.0*np.array(data)
n = len(a)
m, se = np.mean(a), scipy.stats.sem(a)
print(m, se)
h = se * sp.stats.t._ppf((1+confidence)/2., n-1)
return m, m-h, m+h
l, r, x= mean_confidence_interval([281.5,485,811,1626.5,2645.5,3664.5,4683.5,5906.5])
print(l, r, x)
8.5 QQ图检验是否符合正态分布的检验过程
function qqs(y)
y=y(:)';
y= sort(y);
NNS= length(y);
x= norminv(((1:NNS)- 0.375)./(NNS+ 0.25),0,1);
sigma = std(y);mu = mean(y);
y=(y-mu)/sigma;
xx= [min(x), max(x)];
yy= [min(y), max(y)];
plot(x,y,'.k',xx,yy)
grid on
title('第三季度延期比qq图')
8.6 第二题货物延期比置信区间的运算过程
clear;
clc;
Y=[0.069 0.000 0.004 0.047 0.217 0.000 0.016 0.000 0.247 0.094 0.079 0.027 0.194 0.156 0.038 0.425
0.000 0.000 0.017 0.201 0.006 0.057 0.000 0.517 0.294 0.159 0.092 0.672 0.112 0.305 0.432 0.711
0.560 0.302 0.443 0.458 0.321 0.694 0.711 0.048 0.424 0.317 0.130 0.386 0.055 0.000 0.053 0.313
0.402 0.209 0.232 0.165 0.294 0.432 0.401 0.262 0.129 0.082 0.141 0.107 0.060 0.009 0.674 0.545
0.241 0.044 0.027 0.635 0.287 0.048 0.153 0.139 0.166 0.551 0.653 0.385 0.009 0.323 0.195 0.099
0.436 0.019 0.059 0.222 0.025 0.100 0.000 0.049 0.006 0.092 0.235 0.042 0.013 0.179 0.002 0.022
0.000 0.000 0.000 0.026 0.098 0.303 0.005 0.273 0.083 0.000 0.084 0.005 0.017 0.020 0.027 0.002
0.351 0.003 0.199 0.088 0.000 0.052 0.024 0.111 0.000 0.012 0.000 0.110 0.223 0.001 0.034 0.000
0.000 0.011 0.008 0.001 0.000 0.144 0.076 0.043 0.052 0.018 0.015 0.055 0.080 0.006 0.098 0.004
0.136 0.020 0.029 0.019 0.001 0.107 0.003 0.000 0.019 0.038 0.128 0.083 0.003 0.014 0.023 0.000
0.155 0.000 0.180 0.009 0.017 0.034 0.000 0.004 0.467 0.197 0.241 0.004 0.287 0.067 0.041 0.091
0.537 0.047 0.000 0.011 0.217 0.011 0.023 0.070 0.031 0.299 0.042 0.715 0.000 0.287 0.048 0.113
0.126 0.001 0.462 0.432 0.026 0.521 0.005 0.001 0.000 0.003 0.005 0.009 0.008 0.001 0.028 0.180
0.000 0.010 0.032 0.015 0.178 0.020 0.080 0.705 0.384 0.000 0.021 0.000 0.000 0.000 0.000 0.041
0.311 0.256 0.006 0.000 0.024 0.028 0.223 0.410 0.320 0.723 0.359 0.028 0.042 0.010 0.114 0.000
0.016 0.010 0.392 0.000 0.042 0.501 0.264 0.007 0.000 0.142 0.148 0.184 0.378 0.110 0.125 0.162
0.183 0.047 0.015 0.191 0.169 0.062 0.441 0.046 0.490 0.585 0.259 0.335 0.010 0.066 0.347 0.057
0.302 0.115 0.079 0.040 0.010 0.159 0.050 0.024 0.239 0.015 0.701 0.086 0.488 0.122 0.076 0.165
0.102 0.000 0.057 0.000 0.090 0.089 0.119 0.020 0.449 0.296 0.249 0.550 0.000 0.000 0.000 0.012
0.008 0.023 0.000 0.000 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.940 0.082 0.136 0.000 0.002
0.986 0.000 0.000 0.006 0.000 0.000 0.091 0.000 0.000 0.000 0.000 0.000 0.000 ];
n=334
arvage2=sum(Y)/n
Xn2=3.0144303173574545
za=norminv(0.95)
c=arvage2-za*(Xn2/sqrt(n))
d=arvage2+za*(Xn2/sqrt(n))
8.7 上新分布直方图的绘制
import pandas as pd
# 柱形图-折线图
import pyecharts as pye
import _overlapped
import numpy as np
import math
import matplotlib.pyplot as plt
#读取数据
def readExcel():
df = pd.read_excel('附件2.xlsx',sheet_name='汇总')
return df
def mymatlab(zhong_wei,list):
k = []
for j in range(len(list)):
for m in range(list[j]):
k.append(zhong_wei[j])
print(k)
def createChart(my_list, x, xx):
print(type(my_list))
# xx = ['200-355','355-665','665-1052.5',
# '1052.5-1750','1750-2835','2835-4850','4850-9500','9500-25000']
bar = pye.Bar()
bar.add('bar', xx, my_list)
line = pye.Line()
line.add('line', xx, my_list)
bar.render(path='第三题上新量季度{}.html'.format(x))
def shangxinfenbu(data, x):
data.sort()
jian_ge = (max(data) - min(data))/10
yy = []
a1 = [];
a2 = [];
a3 = [];
a4 = [];
a5 = [];
a6 = [];
a7 = [];
a8 = [];
x1 = data[0]
x2 = data[0] + jian_ge / 16*5
x3 = data[0] + jian_ge / 16*15
x4 = data[0] + jian_ge / 16 * 19.395
x5 = data[0] + jian_ge / 16 * 37
x6 = data[0] + jian_ge / 16 * 70
x7 = data[0] + jian_ge / 16 * 95
x8 = data[0] + jian_ge / 16 * 120
x9 = data[0] + jian_ge * 10
for i in range(len(data)):
value = data[i]
if value >= x1 and value < x2:
a1.append(value)
elif value >= x2 and value < x3:
a2.append(value)
elif value >= x3 and value < x4:
a3.append(value)
elif value >= x4 and value < x5:
a4.append(value)
elif value >= x5 and value < x6:
a5.append(value)
elif value >= x6 and value < x7:
a6.append(value)
elif value >= x7 and value < x8:
a7.append(value)
elif value >= x8 and value < x9:
a8.append(value)
gb = [x1+(x2-x1)/2, x2+(x3-x2)/2, x3+(x4-x3)/2, x4+(x5-x4)/2, x5+(x6-x5)/2, x6+(x7-x6)/2, x7+(x8-x7)/2, x8+(x9-x8)/2]
print(gb)
xx = [(str)((int)(x1))+'-'+(str)((int)(x2)), (str)((int)(x2))+'-'+(str)((int)(x3)),(str)((int)(x3))+'-'+(str)((int)(x4)), (str)((int)(x4))+'-'+(str)((int)(x5)),
(str)((int)(x5))+'-'+(str)((int)(x6)), (str)((int)(x6))+'-'+(str)((int)(x7)), (str)((int)(x7))+'-'+(str)((int)(x8)),
(str)((int)(x8))+'-'+(str)((int)(x9))]
print(xx)
yy.append(len(a1))
yy.append(len(a2))
yy.append(len(a3))
yy.append(len(a4))
yy.append(len(a5))
yy.append(len(a6))
yy.append(len(a7))
yy.append(len(a8))
print(yy)
createChart(yy, x, xx)
xxx = [x1+1 for x1 in range(8)]
mymatlab(xxx, yy)
def createCharts(my_list, x, xx):
print(type(my_list))
# xx = ['200-355','355-665','665-1052.5',
# '1052.5-1750','1750-2835','2835-4850','4850-9500','9500-25000']
print(xx)
bar = pye.Bar()
bar.add('bar', xx, my_list)
bar.render(path='第三题延期比季度{}.html'.format(x))
def gailvbifenbu(x, xx):
yy = []
a11 = [];
a12 = [];
a13 = []
a2 = [];
a3 = [];
a4 = [];
a5 = [];
a6 = [];
a7 = []
x1 = 0
x2 = 0.015
x3 = 0.045
x4 = 0.15
x5 = 0.30
x6 = 0.5
x7 = 1
for i in range(len(x)):
if x[i] == x1:
a11.append(1)
if x[i] > x1 and x[i] < x2:
a12.append(2)
elif x[i] >= x2 and x[i] < x3:
a2.append(3)
elif x[i] >= x3 and x[i] < x4:
a3.append(4)
elif x[i] >= x4 and x[i] < x5:
a4.append(5)
elif x[i] >= x5 and x[i] < x6:
a5.append(6)
elif x[i] >= x6 and x[i] <= x7:
a6.append(7)
gb = [x1, x1 + (x2 - x1) / 2, x2 + (x3 - x2) / 2, x3 + (x4 - x3) / 2, x4 + (x5 - x4) / 2, x5 + (x6 - x5) / 2, x6 + (x7 - x6) / 2]
print(gb)
xxxx = [(str)(x1), (str)((x1)) + '-' + (str)((x2)), (str)((x2)) + '-' + (str)((x3)),
(str)((x3)) + '-' + (str)((x4)), (str)((x4)) + '-' + (str)((x5)),
(str)((x5)) + '-' + (str)((x6)), (str)((x6)) + '-' + (str)((x7))]
print(xxxx)
yy.append(len(a11))
yy.append(len(a12))
yy.append(len(a2))
yy.append(len(a3))
yy.append(len(a4))
yy.append(len(a5))
yy.append(len(a6))
print(yy)
createCharts(yy, xx,xxxx)
xxx = [x1 + 1 for x1 in range(8)]
mymatlab(xxx, yy)
def deal_with(data):
jidu1_shangxin = []
jidu1_yanqibi = []
jidu2_shangxin = []
jidu2_yanqibi = []
jidu3_shangxin = []
jidu3_yanqibi = []
jidu4_shangxin = []
jidu4_yanqibi = []
for i in range(333):
x = data['上新日期'][i].month
if x == 12 or x == 1 or x == 2:
jidu1_shangxin.append(data['首次下单量'][i]+data['上新前补单总下单量'][i])
jidu1_yanqibi.append(data['延期比'][i])
elif x >= 3 and x <= 5:
jidu2_shangxin.append(data['首次下单量'][i] + data['上新前补单总下单量'][i])
jidu2_yanqibi.append(data['延期比'][i])
elif x >= 6 and x <= 8:
jidu3_shangxin.append(data['首次下单量'][i] + data['上新前补单总下单量'][i])
jidu3_yanqibi.append(data['延期比'][i])
else:
jidu4_shangxin.append(data['首次下单量'][i] + data['上新前补单总下单量'][i])
jidu4_yanqibi.append(data['延期比'][i])
print(jidu4_yanqibi)
shangxinfenbu(jidu1_shangxin, 1)
shangxinfenbu(jidu2_shangxin, 2)
shangxinfenbu(jidu3_shangxin, 3)
shangxinfenbu(jidu4_shangxin, 4)
gailvbifenbu(jidu1_yanqibi, 1)
gailvbifenbu(jidu2_yanqibi, 2)
gailvbifenbu(jidu3_yanqibi, 3)
gailvbifenbu(jidu4_yanqibi, 4)
data = readExcel()
deal_with(data)