Python

代表的な分析手法の確認(主成分分析⇒因子分析)②

前回の「主成分分析」に続き、因子分析を試してみたいと思います。

「主成分分析」については、以前の記事を参照してください。

代表的な分析手法の確認(主成分分析⇒因子分析)①主成分分析で因子分析に使う要素数の適正値を求めます。...

今回の環境(再掲)

今回利用するデータ

今回は「一般社団法人日本野球機構」の公式サイトより、2005年度から2021年度までの両リーグ個人打撃成績(規定打席以上)のデータをスクレイピングして取得したデータを使います。

今回試す分析手法

「主成分分析」で適切な要素数を求めた後、「因子分析」を行っていきます。

データの確保(再掲)

データの取得方法は以前の記事をご参照ください。

代表的な分析手法の確認(カイ二乗検定、t検定)(追記)「一般社団法人日本野球機構」の公式サイトに格納されている2005年以降のセ・パ両リーグのデータを取得しました。...

データ分析

因子分析とは

因子分析とは、多変量データに潜む共通因子を探り出すための手法として、消費者を理解するためによく使われる多変量解析手法です。

出典:株式会社マクロミル

使用するライブラリ

  • 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つの分析手法に囚われることなく、様々な手法を組み合わせながら、よりよい分析結果を求めていきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA