メインコンテンツへスキップ
見出し画像

書記が数学やるだけ#574 主成分分析の計算,数量化3類

    主成分分析について,今回は因子負荷量をメインに見ていく。


    問題

    スクリーンショット 2022-09-12 20.56.06


    説明

    主成分分析の原理について復習:


    スクリーンショット 2022-09-12 20.56.37


    因子負荷量は主成分と元の変数との相関係数で,固有ベクトルと主成分により表される。

    スクリーンショット 2022-09-12 20.58.27


    解答

    相関行列に対して固有値問題を解くことは,主成分を求める操作に相当する。

    数学やるだけ解答#574_page-0001


    数学やるだけ解答#574_page-0002


    数学やるだけ解答#574_page-0003


    因子負荷量が固有値と主成分から求められることを示しておく。

    数学やるだけ解答#574-2_page-0001


    簡単な数値について手計算でやってみる。

    数学やるだけ解答#574_page-0004


    今回は「wine」データを用いてみる。これは13項目の特徴量と3種類のラベルから構成される。

    import numpy as np
    import pandas as pd
    from pandas import DataFrame
    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline 
    from sklearn import datasets
    from sklearn.decomposition import PCA,TruncatedSVD
    
    #wineデータセット
    dataset = datasets.load_wine()
    target_names = dataset.target_names
    targets = dataset.target
    feature_names = dataset.feature_names
    features = dataset.data
    df = DataFrame(features, columns = feature_names)
    df.head()

    スクリーンショット 2022-09-13 20.27.51


    事前に標準化を行っておく。

    #標準化
    from sklearn.preprocessing import StandardScaler
    dfSS = DataFrame(StandardScaler().fit_transform(df), columns = feature_names)
    dfSS


    主成分分析を実行してみる。

    #主成分分析の実行
    pca = PCA()
    pca.fit(dfSS)
    
    #データを主成分空間に写像
    feature = pca.transform(dfSS)
    # 主成分得点
    pd.DataFrame(feature, columns=["PC{}".format(x + 1) for x in range(len(df.columns))])

    スクリーンショット 2022-09-13 20.31.26


    寄与率の計算を行う。

    # 寄与率
    pd.DataFrame(pca.explained_variance_ratio_, index=["PC{}".format(x + 1) for x in range(len(df.columns))])

    スクリーンショット 2022-09-13 20.32.43


    累積寄与率の可視化より,例えばPC5までで80%以上説明できていることがわかる。

    # 累積寄与率を図示する
    import matplotlib.ticker as ticker
    plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
    plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
    plt.xlabel("Number of principal components")
    plt.ylabel("Cumulative contribution rate")
    plt.grid()
    plt.show()

    画像11


    因子負荷量を可視化することで,各特徴量の大まかな性質の推測ができる。

    #因子負荷量の可視化
    plt.figure(figsize=(6, 6))
    for x, y, name in zip(pca.components_[0], pca.components_[1], df.columns[0:]):
       plt.text(x, y, name)
    plt.scatter(pca.components_[0], pca.components_[1], alpha=0.8)
    plt.grid()
    plt.xlabel("PC1")
    plt.ylabel("PC2")
    plt.show()

    画像12


    本記事のもくじはこちら:


    あなたへのおすすめ