Advertisement
korenizla

Untitled

Apr 22nd, 2023 (edited)
1,798
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 5.31 KB | None | 0 0
  1. # подключение библиотек
  2. library (factoextra)
  3. library (cluster)
  4. library(ggplot2)
  5. library(dplyr)
  6. library(reshape2)
  7. library(RColorBrewer)
  8.  
  9. data <- read.csv("Kvartiry_Ufa.csv", sep = ",")
  10.  
  11. # вычисляем корреляцию признаков
  12. cormat <- round(cor(data),2)
  13. # изменяем форму и удлиняем корреляционную матрицу
  14. melted_cormat <- melt(cormat)
  15. # оставим в матрице только ее верхний треугольник
  16. get_upper_tri <- function(cormat){
  17.   cormat[lower.tri(cormat)]<- NA
  18.   return(cormat)
  19. }
  20. upper_tri <- get_upper_tri(cormat)
  21. melted_cormat <- melt(upper_tri, na.rm = TRUE)
  22. # строим хитмэп
  23. ggheatmap <- ggplot(data = melted_cormat, aes(Var2, Var1, fill = value))+
  24.   geom_tile(color = "white")+
  25.   scale_fill_gradient2(low = "blue", high = "red", mid = "white",
  26.                        midpoint = 0, limit = c(-1,1), space = "Lab",
  27.                        name="Pearson\nCorrelation") +
  28.   theme_minimal()+
  29.   theme(axis.text.x = element_text(angle = 45, vjust = 1,
  30.                                    size = 12, hjust = 1))+
  31.   coord_fixed()
  32.  
  33. # расположим значения на хитмэпе
  34. ggheatmap +
  35.   geom_text(aes(Var2, Var1, label = value), color = "black", size = 4) +
  36.   theme(
  37.     axis.title.x = element_blank(),
  38.     axis.title.y = element_blank(),
  39.     panel.grid.major = element_blank(),
  40.     panel.border = element_blank(),
  41.     panel.background = element_blank(),
  42.     axis.ticks = element_blank(),
  43.     legend.justification = c(1, 0),
  44.     legend.position = c(0.6, 0.7),
  45.     legend.direction = "horizontal")+
  46.   guides(fill = guide_colorbar(barwidth = 7, barheight = 1,
  47.                                title.position = "top", title.hjust = 0.5))
  48.  
  49. # исходя из матрицы корреляции необходимо избавиться от living area
  50. drop <- c("living_area")
  51. data = data[,!(names(data) %in% drop)]
  52.  
  53. # стандартизируем значения для корректной кластеризации
  54. data_scaled <- scale(data)
  55.  
  56. # определим оптимальное количество кластеров методом локтя
  57. fviz_nbclust(data_scaled, kmeans, method = "wss")
  58. # определим оптимальное количество кластеров методом силуэта
  59. # устанавливаем максимальное количество кластеров для тестирования
  60. k.max <- 10
  61.  
  62. # используем функцию fviz_nbclust с методом силуэта
  63. silhouette_nb <- fviz_nbclust(iris[, -5], kmeans, method = "silhouette", k.max = k.max)
  64. # достаем оптимальное значение
  65. n_clust <- silhouette_nb$optimal
  66.  
  67. # определяем диапазон значений nstart для проверки
  68. nstart_range <- seq(1, 20, by = 1)
  69.  
  70. # создаем пустой вектор для хранения средней ширины силуэта
  71. avg_silhouette <- vector(length = length(nstart_range))
  72.  
  73. # перебираем каждое значение nstart и вычисляем среднюю ширину силуэта
  74. for (i in seq_along(nstart_range)) {
  75.   set.seed(123) # установили начальное значение для воспроизводимости
  76.   km <- kmeans(iris[, -5], centers = n_clust, nstart = nstart_range[i])
  77.   avg_silhouette[i] <- mean(silhouette(km$cluster, dist(iris[, -5])))
  78. }
  79.  
  80. # отображаем среднюю ширину силуэта для каждого значения nstart
  81. plot(nstart_range, avg_silhouette, type = "b", xlab = "nstart", ylab = "Average silhouette width")
  82.  
  83. # находим оптимальное значение nstart методом силуэта
  84. optimal_nstart <- nstart_range[which.max(avg_silhouette)]
  85.  
  86. # выведем оптимальное значение nstart
  87. cat("Optimal nstart value:", optimal_nstart)
  88.  
  89. # проведем кластеризацию методом kmeans
  90. km <- kmeans(data_scaled, n_clust, nstart = optimal_nstart)
  91. # сохраним вектор с кластером в отдельной переменной
  92. grp <- km$cluster
  93.  
  94. # отобразим кластеризацию с использованием метода главных компонентов
  95. fviz_cluster(km, data_scaled,
  96.              palette = "Set2", ggtheme = theme_minimal())
  97.  
  98. # отобразим диаграмму рассеяния признаков
  99. pairs(data, col = brewer.pal(n = n_clust, name = "Set2")[grp], upper.panel=NULL)
  100.  
  101. # необходимо избавиться от незначительных признаков
  102. drop <- c("floors_total", "ceiling_height", "rooms", "studio")
  103. data_vs = data[,!(names(data) %in% drop)]
  104.  
  105. # отобразим диаграмму рассеяния признаков с учетом кластеризации
  106. pairs(data_vs, col = brewer.pal(n = n_clust, name = "Set2")[grp], upper.panel=NULL)
  107.  
  108. # посмотрим на расположение центроидов кластеров
  109. km$centers
  110. km_centroids <- aggregate(data, by=list(cluster=km$cluster), mean)
  111. km_centroids
  112. # загрузим датасет с описанием центров кластеров
  113. write.csv(km_centroids, "pr_km_centers.csv", row.names=FALSE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement