本文已对所有数据进行分析,整合,进而得出模型。
本文中的打折力度代码数据输入方面用的是小数,不是百分比
根据考虑分析打折力度与商品销售额以及利润率的关系,我们采用了以下方法和步骤:
方法:
- 通过计算皮尔逊系数,我们评估了每月商品打折力度、销售额和利润率之间的相关性,并判断它们是否存在线性关系。
- 利用线性回归拟合这些变量,进一步探究它们之间的关系。
步骤:
1. 首先,我们计算了每月商品打折力度、销售额和利润率之间的皮尔逊系数,以量化它们之间的相关性程度。皮尔逊系数的值介于-1到1之间,接近1表示强正相关,接近-1表示强负相关,接近0表示无相关性。
2. 然后,我们使用线性回归模型拟合这些变量,建立了一条线性方程来描述打折力度对销售额和利润率的影响。通过最小二乘法和逐步回归分析,我们求解出了线性回归方程的参数。
3. 为了验证模型的准确性,我们随机挑选了每天的商品数据(样本足够大)来对上面得出的三者之间关系的模型方程进行检验,并观察原打折力度与模型预测打折力度的对比图。然后,我们再以随机数据为输入,使用神经网络模型进行商品打折力度、销售额和利润率的预测。我们随机选择一些每天商品的数据作为输入,并将其输入到模型中进行预测。
4. 随后,我们将预测结果与方程计算得出的数据进行比较,评估模型的准确性和预测能力。通过对比预测值与计算值之间的差异,我们可以判断模型的性能如何。
5. 最终,我们得出结论:商品的打折力度、利润率和销售额之间存在线性关系,其中利润率和销售额对打折力度具有显著的线性影响。
一,皮尔逊相关系数分析
将附件1,附件2中的数据进行整合并分析,计算得出从2016年11月30日到2019年1月2日期间每个月的商品数据:销售额,利润率和打折力度。将这些数据用皮尔逊相关系数进行分析,得到以下数据:
% 输入数据
discount = [0.2517, 0.3207, 0.2699, 0.2648, 0.2665, 0.2678, 0.2650, 0.2643, ...
0.2715, 0.2684, 0.2751, 0.2787, 0.2744, 0.2638, 0.2721, 0.2749, 0.2810, 0.2896,...
0.2842, 0.2836, 0.2875, 0.2846, 0.2835, 0.2792, 0.2857, 0.2757, 0.2708];
sales = [11104.80, 1104087.84, 662119.52, 651867.68, 823893.84,...
1100639.84, 1547199.28, 1520090.56, 2039060.16, 2289794.04,...
2262374.28, 2204134.68, 2101942.28, 2453501.92, 2897217.60,...
2310510.92, 2826602.00, 3759005.80, 3809616.28, 4285677.08, ...
5058333.84, 6517889.76, 5862866.12, 6168656.48, 6614655.48, 7970261.44, 384550.32];
profit_margin = [0.11, 0.21, 0.18, 0.18, 0.17, 0.17, 0.18, 0.17, 0.18, 0.17, 0.17,...
0.18, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21, 0.20, 0.18, 0.16, 0.16, 0.15, 0.17, 0.15, 0.15];
% 计算皮尔逊相关系数
correlation_sales = corrcoef(discount, sales);
correlation_profit = corrcoef(discount, profit_margin);
% 输出结果
fprintf('打折力度与销售额的皮尔逊相关系数: %.4f\n', correlation_sales(1,2));
fprintf('打折力度与利润率的皮尔逊相关系数: %.4f\n', correlation_profit(1,2));
打折力度与销售额的皮尔逊相关系数: 0.3845
打折力度与利润率的皮尔逊相关系数: 0.5148
打折力度与销售额的皮尔逊相关系数为0.3845。皮尔逊相关系数的取值范围在-1到1之间,表示两个变量之间的线性相关程度。在这种情况下,0.3845接近于0.4,表明打折力度和销售额之间存在一定程度的正相关关系,但相关性不是非常强。换句话说,打折力度的提高会对销售额产生一定的影响,但这种影响可能不是非常显著。
打折力度与利润率的皮尔逊相关系数为0.5148。这个系数接近于0.5,表明打折力度与利润率之间存在一定的正相关关系。这意味着随着打折力度的提高,利润率可能会略微增加。然而,相对于销售额与打折力度之间的相关性,打折力度与利润率之间的相关性稍强。
二,建立模型
基于以上分析,我们采用回归分析模型,并通过拟合数据点来预测和解释销售额与利润率对应打折力度的变化:
打折力度=A+B*利润率+C*销售额
然后我们在MATLAB使用回归分析中的逐步回归分析法对数据进行拟合,获取到模型中的系数:
% 销售额数据
sales = [11104.80, 1104087.84, 662119.52, 651867.68, 823893.84, 1100639.84, 1547199.28,...
1520090.56, 2039060.16, 2289794.04, 2262374.28, 2204134.68, 2101942.28, 2453501.92, ...
2897217.60, 2310510.92, 2826602.00, 3759005.80, 3809616.28, 4285677.08, 5058333.84,...
6517889.76, 5862866.12, 6168656.48, 6614655.48, 7970261.44, 384550.32];
% 利润率数据
profit_margin = [0.11, 0.21, 0.18, 0.18, 0.17, 0.17, 0.18, 0.17, 0.18, 0.17, ...
0.17, 0.18, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21, 0.20, 0.18, 0.16, 0.16, 0.15, 0.17, 0.15, 0.15];
% 打折力度数据
discount_rate = [0.2517, 0.3207, 0.2699, 0.2648, 0.2665, 0.2678, 0.2650, 0.2643, ...
0.2715, 0.2684, 0.2751, 0.2787, 0.2744, 0.2638, 0.2721, 0.2749, 0.2810, 0.2896,...
0.2842, 0.2836, 0.2875, 0.2846, 0.2835, 0.2792, 0.2857, 0.2757, 0.2708];
% 组合输入变量
X = [ones(length(discount_rate), 1), profit_margin', sales'];
% 逐步回归分析
[b,se,pVals,inmodel,stats,nextstep,history] = stepwisefit(X, discount_rate');
% 提取回归系数及统计信息
coefficients = b .* se;
pValues = pVals;
fStat = stats.fstat;
% 打印结果
disp('打折力度 = A + B * 利润率 + C * 销售额');
disp(['A = ', num2str(b(1)), ', SE = ', num2str(se(1)), ', p-value = ', num2str(pValues(1))]);
disp(['B = ', num2str(b(2)), ', SE = ', num2str(se(2)), ', p-value = ', num2str(pValues(2))]);
disp(['C = ', num2str(b(3)), ', SE = ', num2str(se(3)), ', p-value = ', num2str(pValues(3))]);
% 进行回归分析
[b, bint, r, rint, stats] = regress(discount_rate', X);
% 提取统计信息
mse = stats(4); % 均方根误差
rsquare = stats(1); % R方
adjrsquare = 1 - (1 - rsquare) * (length(discount_rate)-1) / (length(discount_rate)-length(b)); % 调整R方
% 计算常量模型的F统计量
y_mean = mean(discount_rate);
ssr_const = sum((discount_rate - y_mean).^2);
fstat_const = (ssr_const / (length(X(1,:))-1)) / mse;
% 打印结果
disp(['均方根误差 (MSE): ', num2str(mse)]);
disp(['R^2: ', num2str(rsquare)]);
disp(['调整 R^2: ', num2str(adjrsquare)]);
disp(['F 统计量 (常量模型): ', num2str(fstat_const)]);
通过逐步回归分析的结果,我们可以得到以下信息:
A的模型系数为0,p值为1。根据p值大于0.05的结果,我们可以认为A项与打折力度之间的关系不显著。这意味着在模型中,常数项A对打折力度没有线性影响。由于B的p值小于0.05,我们可以认为商品的利润率与打折力度之间存在显著的线性关系。同样地,由于C的p值小于0.05,我们可以认为商品的销售额与打折力度之间存在显著的线性关系。
综上所述,根据模型的系数和统计指标,商品的打折力度、商品利润率以及商品销售额之间存在线性关系,其中利润率和销售额对打折力度有显著的线性影响。
最终得到打折力度,利润率与销售额三者之间关系的模型方程:
(y是打折力度,X1是利润率,X2是销售额)
三,验证
(一)随机数据检验
为了验证模型是否可以有效的预测销售额与利润率对应打折力度的变化,随机挑选每日的商品数据(样本足够大)来对上面得出的模型方程进行检验:
sales = Untitled(:,2);
% 利润率数据
profit_margin = Untitled(:,4);
% 打折力度数据
original_discount = Untitled(:,3);
% 计算公式
calculated_discount = 0.33046 * profit_margin + 2.4245e-09 * sales;
figure;
plot(original_discount, 'b-', 'LineWidth', 2);
hold on;
plot(calculated_discount, 'r--', 'LineWidth', 2);
hold off;
xlabel('数据点');
ylabel('打折力度');
title('原打折力度与模型预测的打折力度对比');
legend('原打折力度', '模型预测打折力度');
grid on;
注意:这里的数据输入=Untitled(:,数字),是已经把计算后的数据导入到MATLAB中成矩阵形式,再使用的。
通过对比图,可以观察得到我们建立的回归分析模型方程是具备准确性和预测能力的,所以该模型通过检验。
(二)神经网络模型验证
使用一个多层前馈神经网络 (feedforward neural network),将销售额和利润率作为输入,通过训练预测商品的打折力度。为了初始化这个模型,我们设定两个权重参数。接下来,使用特定的优化算法 (trainlm) 进行训练,并使用均方差作为损失函数来优化模型的拟合程度。并进行1000次的迭代。
为了评估模型训练过程中的学习状态和性能改进,需要看模型的收敛趋势。通过绘制损失函数随时间的变化曲线图,来观察训练过程中的损失函数值的变化来观察模型的收敛趋势。
% 数据
profit_margin = [0.11, 0.21, 0.18, 0.18, 0.17, 0.17, 0.18, 0.17, 0.18, 0.17, ...
0.17, 0.18, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21, 0.20, 0.18, 0.16, 0.16, 0.15, 0.17, 0.15, 0.15];
discount_rate = [0.2517, 0.3207, 0.2699, 0.2648, 0.2665, 0.2678, 0.2650, 0.2643, ...
0.2715, 0.2684, 0.2751, 0.2787, 0.2744, 0.2638, 0.2721, 0.2749, 0.2810, 0.2896,...
0.2842, 0.2836, 0.2875, 0.2846, 0.2835, 0.2792, 0.2857, 0.2757, 0.2708];
X = [sales', profit_margin'];
y = discount_rate';
net = feedforwardnet(10); % 设定隐层节点数为10
net.trainFcn = 'trainlm'; % 选择均方差作为优化算法
net.trainParam.epochs = 1000;
[net,tr] = train(net, X', y'); % 转置数据,返回训练结果
loss = tr.perf;
plot(1:length(loss), loss);
xlabel('迭代次数或训练轮次');
ylabel('损失函数的值');
title('损失函数随时间的折线图');
可以观测到损失函数随时间的折线图呈现先下降后平稳的趋势,下降通常表示在训练过程中损失函数的值逐渐降低。这说明神经网络的拟合能力在训练中逐渐增强,模型对训练数据的预测误差逐渐减小。损失函数的下降趋势会逐渐变缓并趋于平稳,这可能是因为模型已经找到了全局或局部最优解。这在实际应用中可能是一个令人满意的结果,表示模型已经达到了最佳的拟合效果。
然后随机代入一条数据进行预测:
% 销售额数据
sales = [11104.80, 1104087.84, 662119.52, 651867.68, 823893.84, 1100639.84, 1547199.28,...
1520090.56, 2039060.16, 2289794.04, 2262374.28, 2204134.68, 2101942.28, 2453501.92, ...
2897217.60, 2310510.92, 2826602.00, 3759005.80, 3809616.28, 4285677.08, 5058333.84,...
6517889.76, 5862866.12, 6168656.48, 6614655.48, 7970261.44, 384550.32];
% 利润率数据
profit_margin = [0.11, 0.21, 0.18, 0.18, 0.17, 0.17, 0.18, 0.17, 0.18, 0.17, ...
0.17, 0.18, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21, 0.20, 0.18, 0.16, 0.16, 0.15, 0.17, 0.15, 0.15];
% 打折力度数据
discount_rate = [0.2517, 0.3207, 0.2699, 0.2648, 0.2665, 0.2678, 0.2650, 0.2643, ...
0.2715, 0.2684, 0.2751, 0.2787, 0.2744, 0.2638, 0.2721, 0.2749, 0.2810, 0.2896,...
0.2842, 0.2836, 0.2875, 0.2846, 0.2835, 0.2792, 0.2857, 0.2757, 0.2708];
X = [sales', profit_margin'];
y = discount_rate';
net = feedforwardnet(10); % 设定隐层节点数为10
net = configure(net, X', y'); % 转置数据
net.trainFcn = 'trainlm'; % 选择均方差作为优化算法
net.trainParam.epochs = 1000;
net = train(net, X', y'); % 转置数据
sample = randi(size(X, 1));
estimated_discount = sim(net, X(sample,:)');
disp(['神经网络模型对商品打折力度的预测值:', num2str(estimated_discount)]);
-
sample = randi(size(X, 1));
这一行代码是生成一个随机数,用于随机选择一个样本进行预测。X
是输入特征矩阵,size(X, 1)
返回矩阵X
的行数,randi(size(X, 1))
会生成一个介于1和size(X, 1)
之间的随机整数,作为随机选择的样本索引,保存在sample
变量中。 -
estimated_discount = sim(net, X(sample,:)');
这一行代码使用已经训练好的神经网络模型net
对随机选择的样本进行预测。X(sample,:)
表示从特征矩阵X
中选择第sample
行的特征值。加上单引号'
是为了进行转置,将其转换为一个列向量。sim(net, X(sample,:)')
利用模型net
对这个样本进行预测,并将预测结果赋值给estimated_discount
变量。
因此,这2段代码的主要目的是从输入特征矩阵 X
中随机选择一个样本,并使用预训练的神经网络模型 net
对该样本进行预测,预测结果保存在 estimated_discount
变量中。
运行就会得到以下结果:
为了更好检验模型的性能,再随机抽取10条每日的商品数据做进一步检测:
% 销售额数据
sales = [11104.80, 1104087.84, 662119.52, 651867.68, 823893.84, 1100639.84, 1547199.28,...
1520090.56, 2039060.16, 2289794.04, 2262374.28, 2204134.68, 2101942.28, 2453501.92, ...
2897217.60, 2310510.92, 2826602.00, 3759005.80, 3809616.28, 4285677.08, 5058333.84,...
6517889.76, 5862866.12, 6168656.48, 6614655.48, 7970261.44, 384550.32];
% 利润率数据
profit_margin = [0.11, 0.21, 0.18, 0.18, 0.17, 0.17, 0.18, 0.17, 0.18, 0.17, ...
0.17, 0.18, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21, 0.20, 0.18, 0.16, 0.16, 0.15, 0.17, 0.15, 0.15];
% 打折力度数据
discount_rate = [0.2517, 0.3207, 0.2699, 0.2648, 0.2665, 0.2678, 0.2650, 0.2643, ...
0.2715, 0.2684, 0.2751, 0.2787, 0.2744, 0.2638, 0.2721, 0.2749, 0.2810, 0.2896,...
0.2842, 0.2836, 0.2875, 0.2846, 0.2835, 0.2792, 0.2857, 0.2757, 0.2708];
% 将销售额和利润率放入输入矩阵
X = [sales', profit_margin'];
y = discount_rate';
% 创建神经网络模型
net = feedforwardnet(10); % 设定隐层节点数为10
% 配置神经网络模型
net = configure(net, X', y'); % 转置数据
% 设置训练参数
net.trainFcn = 'trainlm'; % 选择均方差作为优化算法
net.trainParam.epochs = 1000;
% 训练神经网络模型
net = train(net, X', y'); % 转置数据
% 构建待预测的输入数据:销售额,利润率
new_sample = [104318.20 ,0.19 ];
% 对待预测的输入数据进行归一化处理
normalized_sample = (new_sample - mean(X)) ./ std(X);
% 使用神经网络模型预测打折力度
predicted_discount = sim(net, normalized_sample');
disp(['商品打折力度的预测值:', num2str(predicted_discount)])
然后将预测值统计一下,与回归模型计算的数据进行对比
在原来建立回归模型代码的基础上加上下面代码,计算出模型方程的打折力度值
profit_margin1 = reshape(XLSX(:, 3), [], 1);
sales1 = reshape(XLSX(:, 1), [], 1);
X = [ones(length(sales1), 1), profit_margin1, sales1];
discount = X * b;
disp('打折力度:');
disp(discount);
销售额 | 利润 | 利润率 | 打折力度 | 打折力度(预测值) | 回归模型计算的打折力度 |
104318.20 | 16565.49 | 0.19 | 0.28 | 0.28 | 0.2762 |
169425.28 | 19586.23 | 0.13 | 0.28 | 0.26 | 0.2566 |
291904.24 | 45739.18 | 0.19 | 0.26 | 0.27 | 0.2767 |
163808.24 | 23613.30 | 0.17 | 0.29 | 0.27 | 0.2698 |
98796.16 | 15065.73 | 0.18 | 0.28 | 0.28 | 0.2729 |
27844.40 | 4906.28 | 0.21 | 0.33 | 0.30 | 0.2826 |
33400.32 | 4721.24 | 0.16 | 0.26 | 0.25 | 0.2661 |
224431.92 | 30054.77 | 0.15 | 0.29 | 0.27 | 0.2633 |
98228.08 | 12337.68 | 0.14 | 0.27 | 0.26 | 0.2597 |
11104.80 | 1105.66 | 0.11 | 0.25 | 0.25 | 0.2496 |
发现预测值与计算值差不多,模型方程通过检验。
本文思路是基于以下文章,详细过程可前往阅读。
韦碧鹏,黎会兰,蒙仁.关于薄利多销问题的建模分析[J].柳州职业技术学院学报,2022,22(03):125-130.