目录

前言

一、数据来源和处理

二、相关性检验

Ⅰ、图形说明

Ⅱ、相关矩阵

三、LSTM算法预测

四、BP神经网络预测


前言

        如何预测未来八年老龄化比率?作者从以下四个角度出发:GDP,医院数(医院包括综合医院、中医医院、中西医结合医院、民族医院、各类专科医院和护理院,不包括专科疾病防治院、妇幼保健院和疗养院。),自然增长率,15-64岁人群比率。经济的发展和医疗服务保障会促进人类平均寿命的延长,自然增长率则涉及到人口基数的变化,由于预测的是未来五年老龄化比率,15-64人群比率也要考虑在内。

        其他因素对老龄化也有很大影响,如不可抗力(自然灾害,疫情等),或因为作者知识水平有限,或为了简化模型,不考虑在内。如果你有相异的见解,欢迎一起交流。

一、数据来源和处理

        声明:本文所用数据都来自于国家统计局,特别感谢作者的信息检索老师,为数据的寻求提供了帮助。

        由于各方面的原因,国统局对65岁以上人群的连续(每年)统计从1990年开始,本文所用到的数据均为相同的时间跨度:1990-2022。补充:2023/2/19,国统局上尚未公布2022年医院数,以38000估计。

        附议Python文件处理代码:

f=open(r"C:\Users\username\Desktop\1.txt",'r').readlines()
#1.txt存放了复制粘贴的数据
g=open(r"C:\Users\username\Desktop\2.txt",'w')
#2.txt准备写入处理后的数据
for i in list(reversed(f[0].split())):#原年份为倒序,故reversed
    g.write(i+'\n')#注意要换行
g.close()

二、相关性检验

Ⅰ、图形说明

        p是经过处理后的数据,各列所代表的意义如下图。(想要完整数据的请私信)

python老龄化人口预测系统 人口老龄化趋势预测_开发语言

 将p归一化处理后(对每个指标),绘制五个指标在同一坐标系下的图

python老龄化人口预测系统 人口老龄化趋势预测_神经网络_02

 从中发现:

①15-64岁人口比率和>65的比率相关性较弱

②自然增长率与>65的比率大致呈负相关

③GDP与>65的比率大致呈正相关

④医院数大致与老龄化正相关

q=mapminmax(p',0,1);
ls=['r*--','go--','bd--','ys:','kx-.'];%linestyle
for i=1:5
    plot(1990:2022,q(i,:),ls(i));
    hold on
end
set(gca,'XTick',1990:3:2023);
legend('15-64比率','>65比率','自然增长率','GDP','医院数');
title('各数据归一化后在同一坐标轴的呈现');

Ⅱ、相关矩阵


>> corrcoef(p)

ans =

    1.0000    0.3315   -0.5089    0.3467    0.2950
    0.3315    1.0000   -0.8596    0.9920    0.9925
   -0.5089   -0.8596    1.0000   -0.8062   -0.8119
    0.3467    0.9920   -0.8062    1.0000    0.9940
    0.2950    0.9925   -0.8119    0.9940    1.0000

数据第二列(老龄化比率)和有强相关性(绝对值>=0.8)的有:第三列(自然增长率),第四列(GDP),第五列(医院数)

三、LSTM算法预测

        我们先用LSTM算法预测未来八个时间步的自然增长率,GDP,医院数

python老龄化人口预测系统 人口老龄化趋势预测_算法_03

clc;clear;
load('p.mat');
t={'自然增长率','GDP','医院总数'};
fore=zeros([3,8]);
for i=1:3
    subplot(1,3,i);
    fore(i,:)=fig(p(:,i+2)');
    title(t(i));
end

fig函数的定义

function [r] = fig(data) %r用来储存预测值
dataTrain = data;
mu = mean(dataTrain);
sig = std(dataTrain);
dataTrainStandardized = (dataTrain - mu) / sig;
XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);
numFeatures = 1;
numResponses = 1;
numHiddenUnits = 200;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];
options = trainingOptions('adam', ...
    'MaxEpochs',500, ...
    'GradientThreshold',0.1, ...
    'InitialLearnRate',0.001, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',100, ...
    'LearnRateDropFactor',0.1, ...
    'Verbose',0, ...
    'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,layers,options);
net = predictAndUpdateState(net,XTrain);
[net,YPred] = predictAndUpdateState(net,YTrain(end));
for i = 2:8 #预测8年的
    [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu');
end
YPred=YPred*sig+mu;
plot(1990:2022,data,'bo-',2023:2030,YPred,'r*-');
hold on
legend('data','pred')
r=YPred;
end

四、BP神经网络预测

        以1990-2022的数据为训练集进行训练搭建出网络,以此预测2023-2030的老龄化比率

q=[p(:,[3,4,5]);fore'];
input=q;
output=p(:,2);
%训练集,测试集
input_train=input(1:33,:)';
output_train=output(1:33,:)';
input_test=input(34:end,:)';
%数据归一化
[inputn,inputs]=mapminmax(input_train,-1,1);
[outputn,outputs]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputs);
net=newff(inputn,outputn,12);
%网络参数
net.trainparam.epochs=10000;
net.trainparam.lr=0.000001;
net.trainparam.goal=0.000001;
net.dividefcn='';
%bp神经网络训练
net=train(net,inputn,outputn);
an=sim(net,inputn_test);%用训练好的模型进行仿真
result=mapminmax('reverse',an,outputs);%预测结果反归一化
plot(1990:2022,output,'bo-',2023:2030,result,'r*-');
legend('1990-2022老龄化','2023-2027老龄化预测','location','northwest')
axis tight;

效果如下:

python老龄化人口预测系统 人口老龄化趋势预测_python老龄化人口预测系统_04

python老龄化人口预测系统 人口老龄化趋势预测_matlab_05