预测俄罗斯联邦常住人口的增长
在这个例子中,我们将考虑使用多项式的数据外推,它们的评估和显示。
外推的数据集是1990年至2023年期间俄罗斯联邦常住人口的总增长。 资料来源:[Rosstat统计数据展示](https://showdata.gks.ru/finder /)。
连接图书馆 XLSX.jl 以接收并处理一组数据。
In [ ]:
Pkg.add(["XLSX"])
In [ ]:
using XLSX;
文件中提供了插值和外推的数据 Прирост населения РФ.xlsx. 让我们创建用于分析的数据向量-计算人口增长的年份和人口增长的值。
In [ ]:
file = "$(@__DIR__)/Прирост населения РФ.xlsx";
years = vec(XLSX.readdata(file, "Отчет!A4:A33")); # Вектор строчных значений формата "xxxx г."
Growth = vec(Int64.(XLSX.readdata(file, "Отчет!C4:C33"))); # Вектор целых чисел
在数据表中,人口增长年份的值以小写格式显示,如 "XXXX г.". 这种格式不适合计算和显示,因此我们将创建用于计算人口增长的年份向量,以整数格式表示。
In [ ]:
Years = convert(Vector{Int64}, zeros(length(years))); # Вектор для получения значений
i = 1
for year in years
Years[i] = parse(Int64, year[1:4]) # Получаем из строки только первые 4 значения и преобразуем в Int64
i += 1
end
让我们在图表上绘制获得的数据。
In [ ]:
using Plots
plotlyjs()
plot(Years, Growth,
shape = :circle, ms = 3,
legend = :topright, label = "Исходные данные",
ylims = (minimum(Growth)-5e4, maximum(Growth)+5e4),
xlabel = "Год", ylabel = "Прирост населения, чел.",
title = "Прирост населения РФ в 1990 - 2023 гг.")
Out[0]:
要预测数据,请下载并连接库 Polynomials.jl.
In [ ]:
Pkg.add("Polynomials")
using Polynomials;
为了进一步推断数据,我们计算多项式-1,2,3和6阶。:
In [ ]:
Numbers = Years.-1990;
pol1 = fit(Numbers,Growth,1);
pol2 = fit(Numbers,Growth,2);
pol3 = fit(Numbers,Growth,3);
pol6 = fit(Numbers,Growth,6);
让我们绘制多项式和初始数据的图形。
In [ ]:
scatter(Years, Growth,
label = "Исходные данные", legend = :topright,
ylims = (minimum(Growth)-5e4, maximum(Growth)+5e4),
xlabel = "Год", ylabel = "Прирост населения, чел.",
title = "Прирост населения РФ в 1990 - 2023 гг.")
plot!(Years, pol1.(Numbers), label="Полином 1 пор.")
plot!(Years, pol2.(Numbers), label="Полином 2 пор.")
plot!(Years, pol3.(Numbers), label="Полином 3 пор.")
plot!(Years, pol6.(Numbers), label="Полином 6 пор.")
Out[0]:
让我们计算2024年和2025年的数据外推。
In [ ]:
Extra_Years = [2024, 2025];
Extra_Numbers = [34, 35];
Extra_G_1 = (pol1.(Extra_Numbers));
Extra_G_2 = (pol2.(Extra_Numbers));
Extra_G_3 = (pol3.(Extra_Numbers));
Extra_G_6 = (pol6.(Extra_Numbers));
#Numbers = vcat(Numbers, Extra_Numbers);
让我们绘制多项式,初始和预测数据的图形。
In [ ]:
Plots.scatter(Years, Growth,
label = "Исходные данные", legend = :top,
ylims = (minimum(Extra_G_3)-5e4, maximum(Extra_G_6)+5e4),
xlabel = "Год", ylabel = "Прирост населения, чел.")
Plots.plot!(Years, pol1.(Numbers), label = "Полином 1 пор.")
Plots.plot!(Years, pol2.(Numbers), label = "Полином 2 пор.")
Plots.plot!(Years, pol3.(Numbers), label = "Полином 3 пор.")
Plots.plot!(Years, pol6.(Numbers), label = "Полином 6 пор.", color = :orange)
Plots.scatter!(Extra_Years, Extra_G_1, color = :red, shape = :xcross, label = "Экстраполяция 1 пор.")
Plots.scatter!(Extra_Years, Extra_G_2, color = :green, shape = :xcross, label = "Экстраполяция 2 пор.")
Plots.scatter!(Extra_Years, Extra_G_3, color = :violet, shape = :xcross, label = "Экстраполяция 3 пор.")
Plots.scatter!(Extra_Years, Extra_G_6, color = :orange, shape = :xcross, label = "Экстраполяция 6 пор.")
Out[0]:
从构造中可以看出,不同阶数的外推数据具有显着的值范围。
结论
在这个例子中,我们检查了各种多项式阶数的数据外推及其构造。