前回の「主成分分析」に続き、因子分析を試してみたいと思います。
「主成分分析」については、以前の記事を参照してください。

今回の環境(再掲)
今回利用するデータ
今回は「一般社団法人日本野球機構」の公式サイトより、2005年度から2021年度までの両リーグ個人打撃成績(規定打席以上)のデータをスクレイピングして取得したデータを使います。
今回試す分析手法
「主成分分析」で適切な要素数を求めた後、「因子分析」を行っていきます。
データの確保(再掲)
データの取得方法は以前の記事をご参照ください。

データ分析
因子分析とは
因子分析とは、多変量データに潜む共通因子を探り出すための手法として、消費者を理解するためによく使われる多変量解析手法です。
出典:株式会社マクロミル
使用するライブラリ
- NumPy
数値計算を効率的に行うためのライブラリです。
- Pandas
データ分析用のライブラリです。
- matplotlib
グラフ描画用のライブラリです。
- scikit-learn
機会学習用のライブラリです。
仮説
今回は分析結果をイメージできていないので、仮説の立案は割愛します。
コードの実装
主成分分析で求めた要素数を使ってコードを実装します。
なお、今回はこちらのサイトを多分に参考とさせて頂きました。
https://qiita.com/y_itoh/items/227cb33317ceb09199c2
出典:Qiita(@maskot1977様)
# ライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# データを読み込む
df = pd.read_csv("2005-2021_batter_all.csv")
df = df.drop(columns=df.columns[0:4]) #関係ない列を削除
# sklearnの標準化モジュールをインポート
from sklearn.preprocessing import StandardScaler
# データを変換する計算式を生成
sc = StandardScaler()
sc.fit(df)
# 実際にデータを変換
z = sc.transform(df)
# sklearnのFactorAnalysis(因子分析)クラスをインポート
from sklearn.decomposition import FactorAnalysis as FA
# 因子数を指定
n_components = 6 #前回求めた要素数
# 因子分析の実行
fa = FA(n_components, max_iter=5000) # モデルを定義
fitted = fa.fit_transform(z) # fitとtransformを一括処理
# 因子負荷量行列を取得する
fa.components_.T
# 変数Factor_loading_matrixに格納
Factor_loading_matrix = fa.components_.T
# データフレームに変換
pd.DataFrame(Factor_loading_matrix,columns=["第1因子", "第2因子", "第3因子", "第4因子", "第5因子", "第6因子"],index=[df.columns])
実行結果・考察
実行結果
実際に得られた因子分析結果のデータフレームは下表のとおりです。黄色セルの意味は後述します。
第1因子 | 第2因子 | 第3因子 | 第4因子 | 第5因子 | 第6因子 | |
打率 | 0.560840 | -0.461885 | -0.052555 | -0.082511 | 5.318072e-01 | -4.132351e-01 |
試合 | 0.495868 | -0.357631 | -0.080939 | -0.030426 | -3.589376e-01 | 4.602095e-01 |
打席 | 0.635732 | -0.494244 | -0.135559 | -0.006000 | -2.322433e-01 | 5.128221e-01 |
打数 | 0.639864 | -0.537451 | -0.134395 | -0.039257 | -4.140676e-01 | 3.253774e-01 |
得点 | 0.747756 | -0.224960 | -0.137611 | 0.183503 | 1.184497e-01 | 2.498204e-01 |
安打 | 0.758361 | -0.635361 | -0.123095 | -0.077798 | -9.381216e-11 | -6.745003e-11 |
二塁打 | 0.666331 | -0.257610 | 0.698425 | 0.042926 | -1.035054e-10 | 2.425702e-11 |
三塁打 | -0.065039 | -0.470199 | -0.161407 | 0.865234 | 4.388733e-11 | -2.614120e-11 |
本塁打 | 0.767290 | 0.639223 | -0.051221 | 0.005968 | -6.473386e-11 | 1.015773e-11 |
塁打 | 0.997747 | 0.039784 | -0.010342 | 0.053026 | -1.023628e-10 | -2.569245e-11 |
打点 | 0.805823 | 0.406492 | 0.056930 | -0.042072 | 5.071834e-03 | 3.250886e-02 |
盗塁 | -0.073810 | -0.470368 | -0.195200 | 0.266412 | 3.186693e-02 | 1.647668e-01 |
盗塁刺 | -0.111007 | -0.482732 | -0.214088 | 0.235713 | 7.201503e-03 | 1.247785e-01 |
犠打 | -0.434301 | -0.297468 | -0.119013 | 0.098082 | -1.573638e-01 | 2.372626e-02 |
犠飛 | 0.254522 | 0.061690 | 0.113042 | -0.087361 | -6.667232e-02 | 4.251028e-02 |
四球 | 0.389620 | 0.112004 | 0.000333 | 0.047419 | 5.470441e-01 | 6.946420e-01 |
故意四 | 0.285412 | 0.214231 | 0.022429 | -0.047147 | 3.010306e-01 | 9.448273e-02 |
死球 | 0.155609 | 0.034295 | 0.016815 | 0.033412 | 9.321476e-02 | 1.64357 |
三振 | 0.402444 | 0.394481 | -0.023237 | 0.146363 | -2.047908e-01 | 3.466762e-01 |
併殺打 | 0.266349 | 0.176102 | 0.090404 | -0.309339 | -1.699378e-01 | 3.141070e-03 |
長打率 | 0.826112 | 0.406187 | 0.070059 | 0.099039 | 2.903140e-01 | -2.099736e-01 |
出塁率 | 0.521507 | -0.126375 | -0.011965 | -0.015299 | 8.330644e-01 | 1.262160e-01 |
何が何だか分からないので、データの要約も出力します。
# 得られた出力の要約を表示
pd.DataFrame(Factor_loading_matrix,columns=["第1因子", "第2因子", "第3因子", "第4因子", "第5因子", "第6因子"],index=[df.columns]).describe()

データの要約を踏まえ、3/4分位数より高い値を上表では黄色く塗ってみました。
考察
このデータは規定打席到達者のデータですので、規定打席到達者に共通する因子は、「打点」、「長打率」、「故意四球」および「得点」であることが分かりました。
プロ野球セリーグにおいて、規定打席に到達するには「打点」、「長打率」、「故意四球」および「得点」が重要であると言えそうです。
まとめ
主成分分析を行ってから、因子分析を行うことで適切な分析を行うことができました。1つ1つの分析手法に囚われることなく、様々な手法を組み合わせながら、よりよい分析結果を求めていきます。