Недавно меня познакомили с методами кластеризации, потому что мне дали задание найти «профили» или «шаблоны» профессоров моего университета на основе опроса, на который они должны были ответить. Я изучал некоторые из доступных вариантов для этого и наткнулся на алгоритм кластеризации k-средних. Поскольку большая часть моих данных является категориальной, мне пришлось выполнить однократное кодирование (преобразование категориальной переменной в векторы с одним столбцом 0-1), и сразу после этого я провел корреляционный анализ в Excel, чтобы исключить некоторые избыточные переменные. После этого я использовал python с библиотеками pandas, numpy, matplotlib и sklearn для выполнения проверки оптимального числа кластеров (метод локтя), а затем, наконец, запустил k-means.
Это код Раньше я импортировал .csv с данными опроса профессоров и запускал метод локтя:
# loads the .csv dataframe (DF)
df = pd.read_csv('./dados_selecionados.csv', sep=",")
# prints the df
print(df)
#list for the sum of squared distances
SQD = []
#cluster number for testing in elbow method
num_clusters = 10
# runs k-means for each cluster number
for k in range(1,num_clusters+1):
kmeans = KMeans(n_clusters=k)
kmeans.fit(df)
SQD.append(kmeans.inertia_)
# sets up the plot and show it
plt.figure(figsize=(16, 8))
plt.plot(range(1, num_clusters+1), SQD, 'bx-')
plt.xlabel('Número de clusters')
plt.ylabel('Soma dos quadrados das distâncias de cada ponto ao centro de seu cluster')
plt.title('Método do cotovelo')
plt.show()
Это сюжет для метода локтя.
По цифре я решил go с 3 кластерами. После этого я запускаю k-means для 3 кластеров и отправляю данные кластера в .xlsx со следующим кодом:
# runs k-means
kmeans = KMeans(n_clusters=3, max_iter=100,verbose=2)
kmeans.fit(df)
clusters = kmeans.fit_predict(df)
# dict to store clusters data
cluster_dict=[]
for c in clusters:
cluster_dict.append(c)
# prints the cluster dict
cluster_dict
# adds the cluster information as a column in the df
df['cluster'] = cluster_dict
# saves the df as a .xlsx
df.to_excel("3_clusters_k_means_selecionado.xlsx")
# shows the resulting df
print(df)
# shows each separate cluster
for c in clusters:
print(df[df['cluster'] == c].head(10))
Мое главное право сомнения заключается в том, как провести разумный анализ данных каждого кластера, чтобы понять как они создавались? Я начал использовать средства для каждой переменной, а также условное форматирование в Excel, чтобы увидеть, появятся ли какие-то шаблоны, и они вроде как действительно появились, но я думаю, что это не лучший вариант.
И я также собираюсь использовать этот пост, чтобы спросить какие-либо рекомендации по всему методу. Возможно, некоторые из моих шагов были не самыми лучшими.