PythonとNumpyを使用した主成分分析  因子負荷量と固有ベクトル

はじめに

本記事では、PythonとNumpyを使用して主成分分析を行い、因子負荷量と固有ベクトルについて解説します。主成分分析は多次元データを扱う際に有用な手法の1つであり、因子負荷量と固有ベクトルは主成分分析によって得られる情報の解釈に必要な概念です。

主成分分析の概要

主成分分析は、多次元データを2次元または3次元のグラフにプロットすることができるようにするために、データの次元数を減らすための手法です。主成分分析は、元のデータの分散を最大化するように主成分を求め、それらの主成分を用いて元のデータを近似的に表現します。

主成分分析の基本的な理論

主成分分析では、元のデータから主成分を求めます。主成分は、元のデータの分散を最大化するように求められ、その分散は、元のデータの分散を主成分の分散と残差の分散に分解したものです。

PythonとNumpyを用いた主成分分析の実装方法

PythonとNumpyを使用して主成分分析を実装するには、numpy.linalg.eig関数を使用します。この関数は、正方行列の固有値と固有ベクトルを求めることができます。固有値は主成分の分散に対応し、固有ベクトルは主成分の方向を示します。

import numpy as np
# データの読み込み
data = np.loadtxt("data.csv", delimiter=",")
# データの標準化
data = (data - np.mean(data, axis=0)) / np.std(data, axis=0)
# 共分散行列の計算
cov = np.cov(data, rowvar=False)
# 固有値と固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eig(cov)
# 固有値の降順ソート
sort_idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sort_idx]
eigenvectors = eigenvectors[:, sort_idx]
# 主成分の抽出
pcs = eigenvectors[:, :2]
# 主成分スコアの計算
pcs_score = np.dot(data, pcs)
print("主成分1の分散: {}".format(eigenvalues[0]))
print("主成分2の分散: {}".format(eigenvalues[1]))
print("主成分1の寄与率: {}".format(eigenvalues[0] / np.sum(eigenvalues)))
print("主成分2の寄与率: {}".format(eigenvalues[1] / np.sum(eigenvalues)))
print("因子負荷量1: {}".format(pcs[0]))
print("因子負荷量2: {}".format(pcs[1]))
print("主成分スコア1: {}".format(pcs_score[:, 0]))
print("主成分スコア2: {}".format(pcs_score[:, 1]))

主成分分析で得られる固有ベクトルの解釈

固有ベクトルは、主成分の方向を示すために用いられます。固有ベクトルの各成分は、元のデータの各変数が主成分にどの程度寄与するかを表します。すなわち、各成分は因子負荷量と呼ばれ、主成分分析によって得られる主成分を解釈する際に必要な概念です。

因子負荷量の計算とその意味

因子負荷量は、各変数が主成分にどの程度寄与するかを表す指標です。因子負荷量が大きい変数ほど、その主成分の方向に寄与していることを示します。因子負荷量は、主成分分析によって得られる固有ベクトルの各成分であり、以下の式で計算されます。

因子負荷量 = sqrt(固有値) × 固有ベクトルの各成分

因子負荷量と固有ベクトルを用いたデータ解析の具体的な事例

以下は、主成分分析を用いたデータ解析の具体的な事例です。

例えば、ある大学の入試試験結果が以下のように与えられているとします。

科目 得点1 得点2 得点3 得点4 得点5
国語 70 75 80 85 90
数学 80 85 90 95 100
英語 75 80 85 90 95

このデータを主成分分析にかけ、2次元のグラフにプロットすることを考えます。まず、データをnumpy配列として読み込みます。

import numpy as np
# データの読み込み
data = np.array([[70, 75, 80, 85, 90],
                 [80, 85, 90, 95, 100],
                 [75, 80, 85, 90, 95]])

次に、データを標準化します。

# データの標準化
data = (data - np.mean(data, axis=0)) / np.std(data, axis=0)

共分散行列を計算します。

# 共分散行列の計算
cov = np.cov(data, rowvar=False)

固有値と固有ベクトルを求めます。

# 固有値と固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eig(cov)

固有値を降順にソートし、主成分を抽出します。

# 固有値の降順ソート
sort_idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sort_idx]
eigenvectors = eigenvectors[:, sort_idx]
# 主成分の抽出
pcs = eigenvectors[:, :2]

主成分スコアを計算します。

# 主成分スコアの計算
pcs_score = np.dot(data, pcs)

因子負荷量を計算します。

# 因子負荷量の計算
loading = np.sqrt(eigenvalues) * eigenvectors

まとめ

本記事では、PythonとNumpyを使用して主成分分析を行い、因子負荷量と固有ベクトルについて解説しました。主成分分析は多次元データを扱う際に有用な手法であり、因子負荷量と固有ベクトルは主成分分析によって得られる情報の解釈に必要な概念です。