Документация Engee
Notebook

Прогнозирование прироста постоянного населения РФ

В данном примере мы рассмотрим экстраполяцию данных с использованием полиномов, их оценку и отображение.

Набор данных для экстраполяции - общий прирост постоянного населения РФ за период с 1990 по 2023 годы. Источник: витрина статистических данных Росстата.

Подключим библиотеку XLSX.jl для получения и обработки набора данных.

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]:

Как видно из построения, экстраполированные данные для различных порядков имеют значительный разброс значений.

Вывод

В этом примере мы рассмотрели экстраполяцию данных и их построение для различных порядков полиномов.