今度は、さらに分析関係の書籍をベースに、ちゃんと因子分析を実施したいと思います。因子スコア(因子得点)について調べてもなかなか難しい感じの記載でどうしたらいいかわからなかったですが、ちゃんと調べて公式に当てはめて演算してみます。
因子スコア(因子得点)について、再度確認する
因子スコアの出し方が今ひとつわかっていなかったのですが、因子スコア(因子得点)は、以下で出すものらしい。
標準化したデータ行列 × 相関係数の逆行列 × 因子負荷量
×:ベクトル積。numpy.dot で実行できる。
以下で、因子スコア(因子得点)を出す関数を定義しておいて、そのあと出力する
#ライブラリとデータを読み込む
import pandas as pd
import numpy as np
plt.rcParams['font.family'] = 'IPAexMincho'
data=pd.read_csv("./syougakusei.csv")
data2=data.set_index("番号")
from sklearn.preprocessing import scale
from factor_analyzer import FactorAnalyzer
def factor_score_get(X, loadings):
#scaleを実施すると標準化のデータがlistで返るので、元カラムをくっつけておく:問題なし
Xs = pd.DataFrame(scale(X),columns=X.columns.values)
#np.linalg.inv()で逆行列を作れる
#corrは、ピアソンの積率相関係数がデフォルトのため、引数なしにする
#Xを標準化したものの相関関数を出して、さらに逆行列にしたもの(Xc_r)を作成:問題なし
Xc_r=np.linalg.inv(Xs.corr())
#材料が揃ったので、DataFrameにした因子スコアを返す:積部分にエラーなし。カラム部分の構成でエラーらしい
return(pd.DataFrame(np.dot(Xs,np.dot(Xc_r,loadings)),columns=pd.DataFrame(loadings).columns.values,index=X.index.values))
#因子数2でfaを設定する
fa=FactorAnalyzer(n_factors=2,rotation="promax",impute="drop")
#データを読み込む
fa.fit(data)
#定義した関数で出たものと、元データをindexで横結合
pd.concat([data,factor_score_get(data, fa.loadings_)],axis=1)