Прогнозирование прироста постоянного населения РФ
В данном примере мы рассмотрим экстраполяцию данных с использованием полиномов, их оценку и отображение.
Набор данных для экстраполяции - общий прирост постоянного населения РФ за период с 1990 по 2023 годы. Источник: витрина статистических данных Росстата.
Подключим библиотеку XLSX.jl
для получения и обработки набора данных.
Pkg.add(["XLSX"])
using XLSX;
Данные для интерполяции и экстраполяции приведены в файле Прирост населения РФ.xlsx
. Создадим вектора данных для анализа - годы подсчёта прироста населения и значения прироста населения.
file = "$(@__DIR__)/Прирост населения РФ.xlsx";
years = vec(XLSX.readdata(file, "Отчет!A4:A33")); # Вектор строчных значений формата "xxxx г."
Growth = vec(Int64.(XLSX.readdata(file, "Отчет!C4:C33"))); # Вектор целых чисел
В таблице данных значения лет подсчета прироста населения представлены в строчном формате вида "XXXX г."
. Такой формат не подходит для расчётов и отображения, поэтому создадим вектор лет подсчета прироста населения, выраженный в целочисленном формате.
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
Построим полученные данные на графике.
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 гг.")
Для прогнозирования данных загрузим и подключим библиотеку Polynomials.jl
.
Pkg.add("Polynomials")
using Polynomials;
Для дальнейшей экстраполяции данных рассчитаем полиномы - 1, 2, 3 и 6 порядков:
Numbers = Years.-1990;
pol1 = fit(Numbers,Growth,1);
pol2 = fit(Numbers,Growth,2);
pol3 = fit(Numbers,Growth,3);
pol6 = fit(Numbers,Growth,6);
Построим графики полиномов и исходные данные.
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 пор.")
Рассчитаем экстраполяцию данных для 2024 и 2025 гг.
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);
Построим графики полиномов, исходные и прогнозные данные.
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 пор.")
Как видно из построения, экстраполированные данные для различных порядков имеют значительный разброс значений.
Вывод
В этом примере мы рассмотрели экстраполяцию данных и их построение для различных порядков полиномов.