Pythonの練習5

Pythonを使って主成分分析&クラスター分析を試行
はじめに主成分分析

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.mplot3d.axes3d as p3
from sklearn import datasets
from sklearn.decomposition import PCA
#テキストファイルを読み込む sep='\s+'はスペース区切りの意味,タブの場合はt
#今回使用したのは,3科目のテストの点数データ
data = pd.read_csv('test.txt', sep='\s+',index_col=0)
#ここがメインとなる主成分分析を実行する行
pca = PCA()
feature = pca.fit(data)
feature = pca.transform(data)

pd.DataFrame(feature, columns=["PC{}".format(x + 1) for x in range(len(data.columns))])
#PCAの結果を図面を作成,ここでは主成分1と2を横軸・縦軸に設定し,作図
plt.figure()
plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8, c=list(data.iloc[:, 0]))
plt.grid()
plt.xlabel("PC1")
plt.ylabel("PC2")
for x, y, name in zip(feature[:, 0], feature[:, 1], list(data.index)):
plt.text(x, y, name, alpha=0.8, size=10)
plt.xlim(20, -20)
plt.ylim(20, -20)
plt.savefig('./fig/pca1.png')

次にクラスター分析に挑戦

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
#主成分分析と同様にテキストファイルを読み込む ここでは2科目のテストの結果を利用
data = pd.read_csv('./test2.txt', sep='\s+' ,index_col=0)

#dataをプロットする場合
data.plot(kind='scatter', x=data.columns[0], y=data.columns[1], grid=True)
for x, y, name in zip(data.iloc[:, 0], data.iloc[:, 1], list(data.index)):
plt.text(x, y, name, alpha=0.8, size=10)
#クラスター数を5,学習回数を50回に設定して試行
kmeans_model = KMeans(n_clusters=5, max_iter=50, random_state=10).fit(data.iloc[:, :])
#分析した結果を作図
labels = kmeans_model.labels_
fig = plt.figure()
color_codes = {0:'red', 1:'blue', 2:'green', 3:'black', 4:'yellow'}
colors = [color_codes[i] for i in labels]
for x, y, name in zip(data.iloc[:, 0], data.iloc[:, 1], list(data.index)):
plt.text(x, y, name, alpha=0.8, size=10)
plt.scatter(data.iloc[:, 0], data.iloc[:, 1], alpha=0.8, color=colors)
plt.savefig('./fig/cluster.png')

実際にきちんと分析をする際には,多数のデータから主成分分析を用いて次元数を減らして,その上でクラスター分析を用いて詳細に分類するという流れが良さそう

コメントを残す

メールアドレスが公開されることはありません。