
書記が数学やるだけ#574 主成分分析の計算,数量化3類
主成分分析について,今回は因子負荷量をメインに見ていく。
問題
説明
主成分分析の原理について復習:
因子負荷量は主成分と元の変数との相関係数で,固有ベクトルと主成分により表される。
解答
相関行列に対して固有値問題を解くことは,主成分を求める操作に相当する。
因子負荷量が固有値と主成分から求められることを示しておく。
簡単な数値について手計算でやってみる。
今回は「wine」データを用いてみる。これは13項目の特徴量と3種類のラベルから構成される。
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from sklearn import datasets
from sklearn.decomposition import PCA,TruncatedSVD
#wineデータセット
dataset = datasets.load_wine()
target_names = dataset.target_names
targets = dataset.target
feature_names = dataset.feature_names
features = dataset.data
df = DataFrame(features, columns = feature_names)
df.head()事前に標準化を行っておく。
#標準化
from sklearn.preprocessing import StandardScaler
dfSS = DataFrame(StandardScaler().fit_transform(df), columns = feature_names)
dfSS主成分分析を実行してみる。
#主成分分析の実行
pca = PCA()
pca.fit(dfSS)
#データを主成分空間に写像
feature = pca.transform(dfSS)
# 主成分得点
pd.DataFrame(feature, columns=["PC{}".format(x + 1) for x in range(len(df.columns))])寄与率の計算を行う。
# 寄与率
pd.DataFrame(pca.explained_variance_ratio_, index=["PC{}".format(x + 1) for x in range(len(df.columns))])累積寄与率の可視化より,例えばPC5までで80%以上説明できていることがわかる。
# 累積寄与率を図示する
import matplotlib.ticker as ticker
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution rate")
plt.grid()
plt.show()因子負荷量を可視化することで,各特徴量の大まかな性質の推測ができる。
#因子負荷量の可視化
plt.figure(figsize=(6, 6))
for x, y, name in zip(pca.components_[0], pca.components_[1], df.columns[0:]):
plt.text(x, y, name)
plt.scatter(pca.components_[0], pca.components_[1], alpha=0.8)
plt.grid()
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.show()本記事のもくじはこちら:












