Advertisement
korenizla

agnes

Apr 16th, 2023 (edited)
1,911
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 4.15 KB | None | 0 0
  1. library(factoextra)
  2. library(cluster)
  3. library(ggplot2)
  4. library(dplyr)
  5. library(dendextend)
  6. library(reshape2)
  7. library(RColorBrewer)
  8.  
  9. data <- read.csv("Kvartiry_Ufa.csv")
  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. ggheatmap +
  34.   geom_text(aes(Var2, Var1, label = value), color = "black", size = 4) +
  35.   theme(
  36.     axis.title.x = element_blank(),
  37.     axis.title.y = element_blank(),
  38.     panel.grid.major = element_blank(),
  39.     panel.border = element_blank(),
  40.     panel.background = element_blank(),
  41.     axis.ticks = element_blank(),
  42.     legend.justification = c(1, 0),
  43.     legend.position = c(0.6, 0.7),
  44.     legend.direction = "horizontal")+
  45.   guides(fill = guide_colorbar(barwidth = 7, barheight = 1,
  46.                                title.position = "top", title.hjust = 0.5))
  47.  
  48. # исходя из матрицы корреляции необходимо избавиться от living area
  49. drop <- c("living_area")
  50. data = data[,!(names(data) %in% drop)]
  51.  
  52. # проведем кластеризацию методом agnes и представим в виде дендрограммы
  53. agn <- agnes(data, stand = TRUE, method = "complete") %>% as.dendrogram
  54.  
  55. # отобразим дендрограмму agnes
  56. fviz_dend(agn,
  57.           main="Дендрограмма - complete",
  58.           xlab = "Квартиры", ylab = "Расстояние", sub = "")
  59.  
  60. # вычислим количество кластеров методом локтя
  61. fviz_nbclust(data, FUN = hcut, method = "wss")
  62. n_clust <- 3
  63.  
  64. # проведем срез дендрограммы
  65. # указав количество кластеров полученных в результате метода локтя
  66. cttr <- cutree(as.hclust(agn), k = n_clust)
  67.  
  68. # отобразим дендрограмму
  69. fviz_dend(agn, k = n_clust, cex = 0.5,
  70.           k_colors = "Set2",
  71.           color_labels_by_k = TRUE,
  72.           main="Дендрограмма",
  73.           xlab = "Квартиры", ylab = "Расстояние", sub = "",
  74.           rect = TRUE,
  75.           rect_border = "Set2",
  76.           rect_fill = TRUE)
  77.  
  78. # отобразим кластеризацию с использованием метода главных компонентов
  79. fviz_cluster(list(data = data, cluster = cttr),
  80.              palette = "Set2",
  81.              ellipse.type = "convex",
  82.              repel = TRUE,
  83.              show.clust.cent = TRUE, ggtheme = theme_minimal())
  84.  
  85. # отобразим диаграмму рассеяния признаков
  86. pairs(data, col = brewer.pal(n = n_clust, name = "Set2")[cttr], upper.panel=NULL)
  87.  
  88. # необходимо избавиться от незначительных признаков
  89. drop <- c("floors_total", "ceiling_height", "rooms")
  90. data_vs = data[,!(names(data) %in% drop)]
  91.  
  92. # отобразим диаграмму рассеяния признаков с учетом кластеризации agnes
  93. pairs(data_vs, col = brewer.pal(n = n_clust, name = "Set2")[cttr], upper.panel=NULL)
  94.  
  95. # calculate means per group
  96. agn_centers <- aggregate(data, by = list(cttr), FUN = mean)
  97.  
  98. # загрузим датасет с описанием центров кластеров
  99. # write.csv(agn_centers, "agnes_centers.csv", row.names=FALSE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement