使用している言語
Python3
前提・実現したいこと
因子分析を実行したい!!
のですが、その際に、因子得点、共通性、独自性、因子負荷行列もデータフレームとして出力したいのですが、どうすればよいのか見当が付きません。。。
言い換えると、
◆”def my_scaler(X, df_columns)”と、”def my_fa(X_sc, Y, n)”の関数の中で行われている操作を解読できないので、各行でそのような操作が実行されているのかを教えていただきたいです。
◆因子得点、共通性、独自性、因子負荷行列もデータフレームとして出力したい
※なお、以下のコートは
https://hk29.hatenablog.jp/entry/2018/06/09/010424
を参考に書きました。
該当のソースコード
import pandas as pd import numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as patches from sklearn import datasets from sklearn import linear_model from sklearn.preprocessing import StandardScaler from sklearn.decomposition import FactorAnalysis as FA def my_load_dataset(): # データセットを読み込みXとYで返す boston = datasets.load_boston() boston_df=pd.DataFrame(boston.data) # 説明変数Xをpandas形式に変換 boston_df.columns = boston.feature_names # カラム名を挿入 boston_df['PRICE'] = pd.DataFrame(boston.target) # 目的変数Yをカラム名PRICEで追記 x_df = boston_df.drop("PRICE", axis=1) # Xデータのみ抽出。pandas形式で列名有り #Y_df = boston_df.loc[:,['PRICE']] # Yデータのみ抽出。pandas形式で列名有り y = boston_df.PRICE # Yデータのみ抽出。カラム名を指定して抽出のため、列名はない df_columns = boston.feature_names return x_df, y, df_columns # XYデータをタプルで返す。[]を付けた場合はリストとなる。 def my_scaler(X, df_columns): # 説明変数Xを標準化 scaler = StandardScaler() x_sc = scaler.fit_transform(X) ### plot # sklearnの上記のようなfit関連の実行後、データの書式がnumpy形式となりカラム(列)名が無くなる。 # そのため、再度、pandas形式に変換する(次の2行)。これはグラフの軸名で使用するため。 x_sc = pd.DataFrame(x_sc) x_sc.columns = df_columns return x_sc def my_fa(X_sc, Y, n): # 因子分析 fa = FA(n_components=n, max_iter=500) fa.fit(X_sc) print("fa.components_") print(fa.components_) x_fa = fa.fit_transform(X_sc) ### plot x_data = x_fa[:,0] y_data = x_fa[:,1] fa0 = fa.components_[0] fa1 = fa.components_[1] plt.figure(figsize=(20,20)) plt.scatter(x_data, y_data, c=Y/len(set(Y)), marker=".") for i in range(fa0.shape[0]): plt.arrow(0, 0, fa0[i]*1.5, fa1[i]*1.5, color='r', width=0.0005, head_width=0.07, alpha=0.8) plt.text(fa0[i]*1.8, fa1[i]*1.8, X_sc.columns.values[i], color='r', fontsize = 18) plt.xlim([-2.5,2.5]) plt.ylim([-2.5,2.5]) plt.xlabel('Factor 1', fontsize = 20) plt.ylabel('Factor 2', fontsize = 20) plt.title(str(n)+" factor", fontsize = 20) plt.tick_params(labelsize = 18) plt.grid() c = patches.Circle(xy=(0, 0), radius=1, ec='r', fill=False) plt.axes().add_patch(c) #plt.show() plt.savefig("FA_" + str('%02g' %n) + '.png') if __name__ == '__main__': # データセットを読み込み次のの3つを返す。X, Y, 説明変数Xのカラム(列)名 data = my_load_dataset() X = data[0] Y = data[1] df_columns = data[2] print(X) # 説明変数Xを標準化 X_sc = my_scaler(X, df_columns) print(X_sc) # 因子分析 mycheck_Num=[2,3,12,13] for i in mycheck_Num: print(i) my_fa(X_sc, Y, i)
補足情報(FW/ツールのバージョンなど)
Python3
Anaconda navigator 1.9.12
Spyder3.3.6
あなたの回答
tips
プレビュー