Engee 文档
Notebook

俄罗斯联邦常住人口增长预测

在本示例中,我们将考虑使用多项式对数据进行推断、评估和显示。

外推法的数据集是 1990 年至 2023 年期间俄罗斯联邦常住人口的增长总量。资料来源资料来源:俄罗斯联邦统计局统计数据展示

让我们连接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;
   Resolving package versions...
  No Changes to `/user/.project/Project.toml`
  No Changes to `/user/.project/Manifest.toml`

为了进一步推断数据,我们将计算 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]:

从结构图中可以看出,不同阶次的外推数据在数值上有很大的差异。

结论

在本例中,我们了解了不同多项式阶数的数据外推和绘图方法。