Iris データセットの主成分分析プロット(Python, matplotlib, seaborn を使用)

Iris データセットの主成分分析を行い,第1主成分スコアと第2主成分スコアをプロットする.

主成分分析により次元削減ができる.

ある花の属性は、「5.1 3.5 1.4 0.2」という4つの数値属性を持ち、 別の花の属性は、「4.9 3.0 1.4 0.2」という4つの数値属性を持つとする。

数値属性の個数のことを「次元」と言ったりする。

上で書いた花は、どちらも4次元である。

次元が大きすぎると、解析がうまく行かなかったり、人工知能の学習がうまくいかないという可能性がある。 元のデータで、互いの類似性を保ったままで、より少ない個数の数値属性を作ることを 次元削減という。

目次

  1. 前準備
  2. Iris データセットの準備
  3. Iris データセットの主成分分析プロット

Google Colaboratory のページ:

次のリンクをクリックすると,Google Colaboratoryノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコード等を編集したり再実行したりができる.編集した場合でも,他の人に影響が出たりということはない.そして,編集後のものを,各自の Google ドライブ内に保存することもできる.

https://colab.research.google.com/drive/1nWjnjxgPrldV75OCUcp3RFEV_baeCs4D?usp=sharing

1. 前準備

Python の準備(Windows,Ubuntu 上)

サイト内の関連ページ

関連する外部ページPython の公式ページ: https://www.python.org/

Python の numpy,pandas,matplotlib,seaborn,scikit-learn のインストール

2. Iris データセットの準備

  1. Iris データセットの読み込み
    import pandas as pd
    import seaborn as sns
    sns.set()
    iris = sns.load_dataset('iris')
    
  2. データの確認
    print(iris.head())
    
  3. 形と次元を確認

    配列(アレイ)の形: サイズは 150 ×5.次元数は 2. 最後の列は,iris.target は花の種類のデータである

    print(iris.shape)
    print(iris.ndim)
    
  4. Iris データセットの0, 1, 2, 3列目を表示
    print( iris.iloc[:,0:4] )
    

3. Iris データセットの主成分分析プロット

  1. 主成分分析プロットの前準備
    import numpy as np
    import sklearn.decomposition
    %matplotlib inline
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    
    # 主成分分析
    def prin(A, n):
        pca = sklearn.decomposition.PCA(n_components=n)
        return pca.fit_transform(A)
    
    # 主成分分析で2つの成分を得る
    def prin2(A):
        return prin(A, 2)
    
    # M の最初の2列を,b で色を付けてプロット.b はラベル
    def scatter_label_plot(M, b, alpha):
        a12 = pd.DataFrame( M[:,0:2], columns=['a1', 'a2'] )
        f = pd.factorize(b)
        a12['target'] = f[0]
        g = sns.scatterplot(x='a1', y='a2', hue='target', data=a12, palette=sns.color_palette("hls", np.max(f[0]) + 1), legend="full", alpha=alpha)
        # lenend を書き換え
        labels=f[1]
        for i, label in enumerate(labels):
            g.legend_.get_texts()[i].set_text(label) 
        plt.show()
    
    # 主成分分析プロット
    def pcaplot(A, b, alpha):
        scatter_label_plot(prin2(A), b, alpha)
    
  2. 主成分分析プロット

    Iris データセットの0, 1, 2, 3列目については, 主成分分析により,サイズ 150 × 4 を,150 × 2 に変換

    X = iris.iloc[:,0:4].to_numpy()
    y = iris.iloc[:,4]
    
    pcaplot(X, y, 0.4)