Кластеризация регионов РФ в Julia
Автор
Решение задачи кластеризации регионов РФ по типу экономики
с выбором числа кластеров
1. Ввод исходных данных, нормализация данных и реализация алгоритма kmeans
In [ ]:
using RDatasets, Clustering, Plots, PlotThemes
using DataFrames, Query
import XLSX
using StatsPlots
using Random
Random.seed!(123)
#ввод социально-экономических показателей регионов РФ
Regdata = XLSX.readxlsx("/user/Clasters/REG_RU.xlsx")
Regtab1 = Regdata["dan02"]
Regtab00 = Regtab1[2:82, 5:7]
Regtab00 = Float64.(Regtab00)
XX = Regtab00
#нормирование значений элементов массива XX
XX1 = XX[:, 1]
XX2 = XX[:, 2]
XX3 = XX[:, 3]
SUMX = XX1 + XX2 + XX3
XX[:, 1] = (XX[:, 1] ./ SUMX) .* 100
XX[:, 2] = (XX[:, 2] ./ SUMX) .* 100
XX[:, 3] = (XX[:, 3] ./ SUMX) .* 100
XX[:, 1:3]
Reg = Regtab1[2:82, 1]
print("Введите число кластеров:2,3,4,5,6,7, 8 \n")
num = readline()
Ncl = tryparse(Int64, num)
println("Число заданных кластеров = ", Ncl)
#Ncl=6
#println("Число заданных кластеров = ", Ncl)
XXtr = transpose(XX[:, 1:3])
result = kmeans(XXtr, Ncl); # запустить K-средних для Ncl кластеров
Y = result.assignments[:, 1] # получить назначения точек кластерам
c = counts(result) # получить размеры кластеров
M = result.centers # получить центры кластеров
#println(Y)
println("Размеры кластеров\n $c")
println("Центры кластеров:")
for i in 1:3
println("$(M[i,1:Ncl])")
end
Tab = hcat(Reg, XX, Y)
Tabdf = DataFrame(Tab, :auto)
Tabdf = Tabdf[1:81, :]
Tabdf.x1 = convert(Vector{String}, Tabdf.x1)
Tabdf.x2 = convert(Vector{Float64}, Tabdf.x2)
Tabdf.x3 = convert(Vector{Float64}, Tabdf.x3)
Tabdf.x4 = convert(Vector{Float64}, Tabdf.x4)
Tabdf.x5 = convert(Vector{Int64}, Tabdf.x5)
Tabdf[:, 2:4] = @.round(Tabdf[:, 2:4]);
global Tabdf;
2.Графическое представление результатов решения задачи кластеризации
In [ ]:
dfM1 = DataFrame(M', [:x2, :x3, :x4])
colkl = floor.(Int, Tabdf.x5);
plotly()
theme(:dao)
scatter(Tabdf.x2, Tabdf.x3, Tabdf.x4, legend= false, wsize=(1000, 650),
hovers=Tabdf.x1, color=colkl, ms=4, ma=0.7)
for i in 1:Ncl
#@show [dfM[i, 1] dfM[i, 2] dfM[i, 3]]
clast = string(i)
Centr = "Центр кластера" * " " * clast
scatter!([dfM1.x2[i]],[dfM1.x3[i]],[dfM1.x4[i]], hovers=Centr, mc=:black, ms=5, ma=0.9)
end
titstr = "Кластеризация регионов РФ по структуре производства (алгоритм kmeans)." * " " * "Число кластеров= $Ncl"
xlabel!("PI_N %")
ylabel!("Pcx_N %")
zlabel!("PP_N %")
title!(titstr)
#legend = :topleft
Out[0]:
3.Табличное представление результатов решения задачи кластеризации
In [ ]:
Tab=Tabdf
Tab = select(Tab, "x1" => "Регион", "x2" => "Добыча %", "x3" => "Агро % ", "x4" => "Индустрия %", "x5" => "Кластер")
@show Tab;