import pandas as pd
from kmodes.kmodes import KModes
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# 假设数据列名如下(请替换为实际的列名)
columns = ['售票服务', '候车服务', '乘车服务', '下车服务', '行李寄存和托运服务', '线路布局', '文化建设', '安全保障', '您的年龄', '出行目的', '地区']
# 加载csv数据并转换年龄字段为类别字段
data = pd.read_csv('ma.csv')
# 对年龄进行离散化或直接转为类别标签(例如:青年、中年、老年等)
# 这里假设已经有一个预处理步骤将其转化为字符串类别
# data['年龄类别'] = ...
# 确保所有待聚类列均为非数值类别
data_for_clustering = data[columns]
# 定义一个函数来计算SSE或类似的聚类效果度量值(这里以轮廓系数为例)
def calc_silhouette_kmodes(data, k_range):
sse_values = []
for k in k_range:
km = KModes(n_clusters=k, init='Cao', n_init=10)
clusters = km.fit_predict(data)
# 使用Hamming距离适应类别变量,但请注意Silhouette Score对于K-modes可能不是最优评价指标
sil = silhouette_score(data, clusters, metric='hamming')
sse_values.append(sil)
return sse_values
# 测试的k值范围
k_range = range(2, 11) # 从2到10个聚类
# 计算不同k值下的轮廓系数
sse_values = calc_silhouette_kmodes(data_for_clustering, k_range)
# 绘制轮廓系数随聚类簇数量变化的曲线
plt.figure(figsize=(10, 6))
plt.plot(k_range, sse_values, marker='o')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Silhouette Score')
plt.title('Elbow Method using Silhouette Score to determine the optimal number of clusters')
# 找出拐点,即轮廓系数最大或增长趋势明显放缓的点
plt.show()