探索的データ解析(分類問題)

スポンサーリンク
Python




探索的データ解析(Exploratory data analysis:EDA)とはデータの確認作業です。一般的にデータ解析は、仮説検証的に行うものです。つまり、「恐らくこんな関係性があるであろうから、本当にそうなのか、はたまた違うのかを確認してみよう」などです。しかし、仮説にない関係性が存在するかもしれません。それを確認する作業がEDAです。現場感覚では発見できないものがEDAでは発見できる可能性があります。

今回はcancerデータセットを用いてEDAを確認していきましょう。

自身でデータでも分類問題のEDAができるようにコードを書きました。cancerデータセットで確認後は、ぜひ自身のデータで確認してみてください。新たな発見があるかもしれません。

必要なライブラリをインポート

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from sklearn.datasets import load_breast_cancer
import pandas_profiling
from autoviz.AutoViz_Class import AutoViz_Class
import warnings
warnings.filterwarnings('ignore')

データセットを整える

【超重要】はじめてのデータ収集方法

目的変数:ガンが良性(1)悪性(0)
説明変数:さまざまな検査結果(ここでは詳細は言及しません、ゴメンナサイ)

cancer = load_breast_cancer()       # データセットを "cancer" に格納する

# データセットをデータフレームの形に変換する
df=pd.DataFrame(data=cancer.data,columns=cancer.feature_names)
df['cancer']=cancer.target
df

上のコードはデータフレームにするためのコードです。
cancerのデータセットで実践する場合は上のコードを実行して下さい。
自身のデータを使用する場合は、以下のコードから実行して下さい。

df.info()

出力:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 569 entries, 0 to 568
Data columns (total 31 columns):
 #   Column                   Non-Null Count  Dtype  
---  ------                   --------------  -----  
 0   mean radius              569 non-null    float64
 1   mean texture             569 non-null    float64
 2   mean perimeter           569 non-null    float64
 3   mean area                569 non-null    float64
 4   mean smoothness          569 non-null    float64
 5   mean compactness         569 non-null    float64
 6   mean concavity           569 non-null    float64
 7   mean concave points      569 non-null    float64
 8   mean symmetry            569 non-null    float64
 9   mean fractal dimension   569 non-null    float64
 10  radius error             569 non-null    float64
 11  texture error            569 non-null    float64
 12  perimeter error          569 non-null    float64
 13  area error               569 non-null    float64
 14  smoothness error         569 non-null    float64
 15  compactness error        569 non-null    float64
 16  concavity error          569 non-null    float64
 17  concave points error     569 non-null    float64
 18  symmetry error           569 non-null    float64
 19  fractal dimension error  569 non-null    float64
 20  worst radius             569 non-null    float64
 21  worst texture            569 non-null    float64
 22  worst perimeter          569 non-null    float64
 23  worst area               569 non-null    float64
 24  worst smoothness         569 non-null    float64
 25  worst compactness        569 non-null    float64
 26  worst concavity          569 non-null    float64
 27  worst concave points     569 non-null    float64
 28  worst symmetry           569 non-null    float64
 29  worst fractal dimension  569 non-null    float64
 30  cancer                   569 non-null    int32  
dtypes: float64(30), int32(1)
memory usage: 135.7 KB

この出力は、変数のデータ数と欠損値、数値の種類を表します。

たとえば、0では、変数名のmean radiusのデータは569個ある、欠損値はなし(non-null)、数値の種類は小数点がある数値(float64)を表します。

データを訓練用とテスト用に分割する

EDAでも訓練用でデータに限ります。EDAをもとに解析するため、訓練用のデータに限らないと過学習を起こす可能性があるためです。
解析する前に訓練用のデータとテストのデータに分ける必要があります。

X = df.iloc[:,:-1] # 説明変数(最後の列以外)
y = df.iloc[:,-1]   # 目的変数(最後の列のみ)
# データを訓練用とテスト用に分割する
from sklearn.model_selection import train_test_split, GridSearchCV
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size = 0.25,
    random_state = 1,
    stratify = y)

訓練用のデータをデータフレームの形に整えます

df_train = pd.DataFrame(data=X_train, columns=X_train.columns)
series1 = pd.Series(data=y_train, name="cancer")
df_train = pd.concat([df_train,series1], axis=1)

訓練用のデータを可視化する

import dabl

plt.rcParams['figure.figsize'] = (18, 6)
plt.style.use('ggplot')
dabl.plot(df_train, target_col = 'cancer')

出力:

一番上の棒グラフは、がんが良性:1、悪性:0の数を表しています。

真ん中のヒストグラムは、良性:1、悪性:0で分けて、説明変数に差があるものを表しています。

一番下のグラフは、散布図でがんの良性と悪性でグループ分けしたグラフです。

ここでは、真ん中のグラフにある、差がある説明変数に焦点を絞って、データをみていきましょう。
真ん中のグラフにある、説明変数のみ抽出する。

df_train=df_train[['worst concave points','mean concave points','worst perimeter','worst radius','mean perimeter',
                  'mean radius','worst area','mean concavity','mean area','worst concavity','cancer']]

各データを可視化する

report = pandas_profiling.ProfileReport(df_train)
display(report)

出力:

こんな感じで、各変数ごとにヒストグラムや基本統計量を確認できます。
各変数の関係を散布図で確認してみましょう

sns.pairplot(df_train, hue='cancer')

出力:

緑(良性)と青(悪性)でグループ分けしています。

直感的に分かりやすいと思います。こんな感じでで、データを可視化することで、新たな発見により精度の高い分析ができる可能性があります。





コメント

タイトルとURLをコピーしました