forked from luchobenitez/monda-guasu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kmeans1.R
138 lines (109 loc) · 3.5 KB
/
kmeans1.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
if (!require(knitr)) {
install.packages("knitr")
library(knitr)
}
# Instalar y cargar los paquetes necesarios
if (!require(dplyr)) {
install.packages("dplyr")
library(dplyr)
}
if (!require(ggplot2)) {
install.packages("ggplot2")
library(ggplot2)
}
if (!require(cluster)) {
install.packages("cluster")
library(cluster)
}
if (!require(factoextra)) {
install.packages("factoextra")
library(factoextra)
}
if (!require(scales)) {
install.packages("scales")
library(scales)
}
if (!require(umap)) {
install.packages("umap")
library(umap)
}
if (!require(plotly)) {
install.packages("plotly")
library(plotly)
}
# Leer el CSV resultante del query de SQL
# Asegúrate de tener el archivo kmeans_data.csv en tu directorio de trabajo
df <- read.csv("kmeans_data.csv")
# Ordenar df por count y limitar a los primeros 100000 por razones computacionales. Eliminar valores NA
df <- df %>%
arrange(desc(count)) %>%
head(100000) %>%
na.omit()
# Separar la columna id
id_col <- df$serialtarjeta
df_corr <- df %>% select(-serialtarjeta)
# Encontrar las mejores columnas para el clustering usando correlación
corr_matrix <- cor(df_corr)
corr_with_id <- corr_matrix[1,]
best_cols <- names(corr_with_id[abs(corr_with_id) > 0.1])
cat("Best columns for clustering:", best_cols, "\n")
# Graficar la matriz de correlación usando un mapa de calor
# Guardar la matriz de correlación como objeto
heatmap <- ggplot(corr_matrix, aes(x=Var1, y=Var2, fill=value)) +
geom_tile() +
scale_fill_gradient2(low="white", high="blue") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Normalizar los datos
df_norm <- scale(df[best_cols])
# Determinar el número óptimo de clusters usando KneeLocator
distortions <- c()
n_columns <- length(best_cols) + 1
for (k in 1:(n_columns - 1)) {
kmeans <- kmeans(df_norm, centers = k)
distortions <- c(distortions, kmeans$tot.withinss)
}
# Guardar gráfico de número óptimo de clusters
kl_plot <- fviz_nbclust(df_norm, FUN = kmeans, method = "wss") + theme_minimal()
# Ajustar el modelo KMeans utilizando el número óptimo de clusters
optimal_clusters <- kl$data$NbCluster[which.min(kl$data$gap)]
kmeans <- kmeans(df_norm, centers = optimal_clusters)
# Agregar las etiquetas de cluster y la columna id al dataframe
df$cluster <- kmeans$cluster
df$serialtarjeta <- id_col
# Imprimir los tamaños de los clusters
print(table(df$cluster))
# Crear un gráfico de dispersión de los datos coloreados por cluster
# Guardar el gráfico de dispersión
scatter_plot <- ggplot(df, aes(x = avg_consecutivoevento, y = count, color = as.factor(cluster))) +
geom_point() +
scale_y_log10() +
scale_x_log10() +
theme_minimal()
# Abrir dispositivo de gráficos PDF
pdf("results.pdf")
# Imprimir gráficos en el archivo PDF
print(heatmap)
print(kl_plot)
print(scatter_plot)
# Cerrar dispositivo de gráficos PDF y guardar el archivo
dev.off()
# Ajustar UMAP a los datos normalizados
set.seed(42)
umap_model <- umap(df_norm, metric = "euclidean")
# Agregar las coordenadas UMAP al dataframe
df$umap_x <- umap_model$layout[, 1]
df$umap_y <- umap_model$layout[, 2]
# Crear un gráfico de dispersión de los datos coloreados por cluster
umap_plot <- ggplot(df, aes(x = umap_x, y = umap_y, color = as.factor(cluster))) +
geom_point() +
theme_minimal()
# Imprimir el gráfico de dispersión UMAP
print(umap_plot)
# Para guardar el gráfico de dispersión UMAP en el archivo PDF
pdf("results_with_umap.pdf")
print(heatmap)
print(kl_plot)
print(scatter_plot)
print(umap_plot)
dev.off()