1. 必要なライブラリのインポートとデータの読み込み
import pandas as pd
import numpy as np
from scipy import stats
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
file_path = '1999年全国31个省份城镇居民家庭平均每人全年消费性支出数据.csv'
data = pd.read_csv(file_path, encoding='gbk')
data.head()
data.info()
2. データの前処理
data.isnull().any()
データに欠損値が見られなかったため、欠損値補完の工程は省略します。
3. データの標準化
X = data.iloc[:, 1:]
X.head()
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(np.round(X_scaled, 2))
4. エルボー法によるクラスタ数の推定
K = range(1, 11)
distortions = []
for k in K:
kmeans = KMeans(n_clusters=k)
kmeans.fit(X_scaled)
distortions.append(
sum(np.min(cdist(X_scaled, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X_scaled.shape[0]
)
plt.plot(K, distortions, 'bx--')
plt.title('Elbow Method')
plt.xlabel('クラスタ数')
plt.ylabel('Inertia')
plt.show()
5. KMeansによるクラスタリング
best_k = 2
kmeans = KMeans(n_clusters=best_k, random_state=42)
kmeans.fit(X_scaled)
labels = kmeans.labels_
data['クラスタ'] = labels
data.head()
6. 結果の可視化
sns.scatterplot(x='食品', y='医疗', hue='クラスタ', data=data, palette='viridis', s=70)
plt.title('KMeans クラスタリング結果')
plt.xlabel('食品')
plt.ylabel('医療')
plt.legend()
plt.show()