こんにちは。医師で人工知能の研究を行っているTommy(Twitter:@obgyntommy)です。
今回は、seabornの使い方の【前編】【後編】で習得した、グラフの描画方法を使って、実際のデータを使った解析をしていきます。
seabornの使い方の前編、後編の記事については以下になります。まだ学習していない、という方は先に学習しましょう。
PythonのライブラリSeabornの使い方【前編】
続きを見る
PythonのライブラリSeabornの使い方【後編】
続きを見る
それでは、早速課題に取り組みましょう。
seabornの練習問題|使用するデータ
UCI(Union Cycliste Internationale)が提供している乳癌の診断データを使用します。
データの大元は以下の2つです。
データソース
UCI Machine Learning Repository
続きを見る
Kaggleのデータ
Breast Cancer Wisconsin (Diagnostic) Data Set | Kaggle
続きを見る
今回は、導入のしやすから、「scikit-learn」にあるデータを使います。
scikit-learnのライブラリインストールされていない方は、まずインストールしましょう。
In[]
1 2 3 4 5 | # ターミナル、端末、コマンドプロンプトからは pip install scikit-learn # Jupyter note bookからの場合 !pip install scikit-learn |
seabornの練習問題|データの準備
まずはデータの準備をします。
下記の4つのデータを使ってグラフを描画してデータの特徴を捉える練習をしましょう。
- diagnosis: 乳房組織の診断 0=悪性、1=良性
- radius_mean: 中心から境界までの平均距離
- perimeter_mean: 腫瘍のコアの平均サイズ
- mean area: 平均面積
ライブラリとデータ読み込み
下記を実行してみましょう。
seabornでは pandasのDataFrame を使うことが多いので、まずは以下の様に変換します。
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import matplotlib.pyplot as plt import seaborn as sns sns.set() import numpy as np import pandas as pd from sklearn.datasets import load_breast_cancer data = load_breast_cancer() # numpy to pandas columns = ['diagnosis', 'radius_m', 'perimeter_m', 'area_m'] bc = pd.DataFrame(columns=columns) bc['diagnosis'] = data.target bc['radius_m'] = data.data[:,0] bc['perimeter_m'] = data.data[:,2] bc['area_m'] = data.data[:,3] bc.head() |
Out[]
データは569個
ずつあります。
また、全データの数と種類も確認してみましょう。
In[]
1 2 | print(data.data.shape) print(data.feature_names) |
Out[]
1 2 3 4 5 6 7 8 9 10 | (569, 30) ['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness' 'mean compactness' 'mean concavity' 'mean concave points' 'mean symmetry' 'mean fractal dimension' 'radius error' 'texture error' 'perimeter error' 'area error' 'smoothness error' 'compactness error' 'concavity error' 'concave points error' 'symmetry error' 'fractal dimension error' 'worst radius' 'worst texture' 'worst perimeter' 'worst area' 'worst smoothness' 'worst compactness' 'worst concavity' 'worst concave points' 'worst symmetry' 'worst fractal dimension'] |
30項目のデータがありますね。課題を完了した後も、このデータを自習用に使ってみてください。
seabornの課題
以下のグラフを実際に描いてみましょう。
課題のグラフ
- 棒グラフ
- 散布図と近似直線
- ヒストグラムと散布図を並べて表示
- 相関係数をヒートマップで表示
- ボックスプロットを3つ並べて表示
それでは各々のグラフを描く際の仕様について見ていきましょう。
diagnosisの棒グラフ
以下の様にラベル付けを行います。
diagnosisの定義
- diagnosisの 0 :悪性の数の棒グラフ
- diagnosisの 1 :良性の数の棒グラフ
散布図と近似直線
以下、2つの散布図と近似直線を書いてみましょう。
radius_m vs perimeter_m
radius_m vs area_m
Tips
- これを見ることで各々の特徴量の関係性(相関の有無)がわかります。
ヒストグラムと散布図を並べて表示
対象データは下記3つです。
radius_m
perimeter_m
area_m
Tips
- これを見ることでそのデータの分布や相関が各変数対応した形でわかります。
相関係数をヒートマップで表示
対象データは下記の3つです。
- radius_m
- perimeter_m
- area_m
Tips
- お互いの変数の相関の強さがわかります。
ボックスプロットを3つ並べて表示
$x$ 軸と$y$ 軸について
- $x$ 軸診断結果である
diagnosis
(0:悪性、1:良性) - $y$ 軸には下記それぞれの項目の数値
$y$ 軸の項目
radius_m
perimeter_m
area_m
Tips:
- これを見ることで診断結果と特徴量の関係性がわかります。
- 例えば、悪性のがん細胞は大きいなどです。
演習
演習のJupyter notebookをご利用される方は演習(google driveリンク)を参照いただければと思います。
Google colaboratory の使い方が分からない方は以下の記事を参考にして下さい。
Google Colaboratoryの使い方【完全マニュアル】
続きを見る
diagnosisの棒グラフ
仕様
1 2 3 4 | """ diagnosisの悪性、良性のカウントの棒グラフを作ってください。 参照:グラフの表示の「countplot(棒グラフ)」 """ |
Out[]
散布図と近似直線
仕様
1 2 3 4 | """ 「radius_m」と「perimeter_m」を使って、散布図と近似直線を書いてください。 参考:グラフ表示の「seaborn.jointplot」 """ |
Out[]
仕様
1 2 3 4 | """ 「radius_m」と「area_m」を使って、散布図と近似直線を書いてください。 参考:グラフ表示の「seaborn.jointplot」 """ |
Out[]
ヒストグラムと散布図を並べて表示
仕様
1 2 3 4 | """ 「radius_m」、「perimeter_m」、「area_m」それぞれのヒストグラムと散布図を描画してください。 参考:グラフ表示の「複数表示」 """ |
Out[]
相関係数をヒートマップで表示
仕様
1 2 3 4 | """ 「radius_m」、「perimeter_m」、「area_m」の相関係数のヒートマップを表示してください。 参考:グラフ表示の「ヒートマップ」 """ |
Out[]
ボックスプロットを3つ並べて表示
仕様
1 2 3 4 5 6 7 8 9 | """ 「radius_m」、「perimeter_m」、「area_m」それぞれのボックスプロット(箱ひげ)を描画してください。 ボックスプロットは横に3つ並べて表示してください。 参考:グラフ表示の「ボックスプロット」 参考:グラフ表示の「複数表示」 注意:subplotsで1行指定している場合は、axesは1次配列になります。 """ |
Out[]
解答
演習を行って頂いた方は、解答例(google driveリンク)を参照して下さい。
diagnosisの棒グラフ
In[]
1 2 3 4 5 | """ diagnosisの悪性、良性のカウントの棒グラフを作ってください。 参照:グラフの表示の「countplot(棒グラフ)」 """ sns.countplot(x='diagnosis', data=bc) |
散布図と近似直線
In[]
1 2 3 4 5 | """ 「radius_m」と「perimeter_m」を使って、散布図と近似直線を書いてください。 参考:グラフ表示の「seaborn.jointplot」 """ sns.jointplot(x='radius_m', y='perimeter_m', data=bc, kind='reg') |
In[]
1 2 3 4 5 | """ 「radius_m」と「area_m」を使って、散布図と近似直線を書いてください。 参考:グラフ表示の「seaborn.jointplot」 """ sns.jointplot(x='radius_m', y='area_m', data=bc, kind='reg') |
ヒストグラムと散布図を並べて表示
In[]
1 2 3 4 5 | """ 「radius_m」、「perimeter_m」、「area_m」それぞれのヒストグラムと散布図を描画してください。 参考:グラフ表示の「複数表示」 """ sns.pairplot(data=bc[['radius_m', 'perimeter_m', 'area_m']]) |
相関係数をヒートマップで表示
In[]
1 2 3 4 5 6 | """ 「radius_m」、「perimeter_m」、「area_m」の相関係数のヒートマップを表示してください。 参考:グラフ表示の「ヒートマップ」 """ sns.heatmap(bc[['radius_m', 'perimeter_m', 'area_m']].corr(), vmin=-1.0, vmax=1.0, annot=True, fmt=".2f") |
ボックスプロットを3つ並べて表示
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | """ 「radius_m」、「perimeter_m」、「area_m」それぞれのボックスプロット(箱ひげ)を描画してください。 ボックスプロットは横に3つ並べて表示してください。 参考:グラフ表示の「ボックスプロット」 参考:グラフ表示の「複数表示」 注意:subplotsで1行指定している場合は、axesは1次配列になります。 """ # subplots(行, 列, figsize=(幅, 高さ)) fig, axes = plt.subplots(1, 3, figsize=(15, 5)) sns.boxplot(x='diagnosis', y='radius_m', data=bc, ax=axes[0]) sns.boxplot(x='diagnosis', y='perimeter_m', data=bc, ax=axes[1]) sns.boxplot(x='diagnosis', y='area_m', data=bc, ax=axes[2]) |
今回の課題は以上となります。お疲れ様でした。