Plotly Express⑥(散布図行列)

今回は散布図行列を表示します。

データの読み込み

まずはデータを読み込みます。

準備するデータはtipsデータセット(レストランの支払金額とチップの金額)です。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

tips = px.data.tips()
tips.head()

散布図行列

散布図行列を表示するためにはscatter_matrix関数を使用します。

各パラメータの設定値に関しては、コメントをご参照下さい。

[Google Colaboratory]

1
2
3
4
5
scatter_matrix_fig = px.scatter_matrix(tips,             # データセット
dimensions=["total_bill", "tip", "size"], # 描画対象の列名
color="time", # time列で色分け
symbol="smoker", # smoker列ごとにマーカの形状で分類
).show()

[実行結果]

散布図行列を表示することができました。

Plotly Express⑤(散布図)

今回は散布図を表示します。

データ読み込み

まずはデータを読み込みます。

読み込むデータはgapminderデータセット(年・国ごとの平均寿命と一人当たりのGDP)です。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

gapminder = px.data.gapminder()
gapminder.head()

[実行結果]

散布図

散布図を表示するためにはscatter関数を使用します。

各パラメータの設定値に関しては、コメントをご参照下さい。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
gapminder_2007 = gapminder.loc[gapminder["year"] == 2007]
px.scatter(
gapminder_2007,
x="gdpPercap", # 一人当たりのGDP
y="lifeExp", # 平均寿命
size="pop", # 要素の大きさ
color="continent", # 要素の色
hover_name="country", # ホバーツールのタイトル
log_x=True, # X軸を対数にとる
size_max=60, # 要素の大きさの最大値
).show()

[実行結果]

散布図を表示することができました。

(要素の大きさを指定しているのでバブルチャートということもできます)

Plotly Express④(ラインチャート)

今回はPlotly Expressを使って折れ線グラフを表示します。

ラインチャート

ラインチャートを表示するためにはline関数を使用します。

[Google Colaboratory]

1
2
3
4
5
import pandas as pd
import plotly.express as px

df = pd.DataFrame([[1, 1], [2, 5], [3, 4], [4, 8], [5, 2]], columns=["x", "y"])
px.line(df, x="x", y="y").show()

2次元のリストデータを作成し、それをデータフレームに変換し、line関数の第一引数に設定します。

[実行結果]

ラインチャート(折れ線グラフ)を表示することができました。

Plotly Express③(バブルチャート)

前回記事に引き続きバブルチャートを表示します。

バブルチャート(大陸ごと)

ファセットを利用すると、データをカテゴリごとに分割して可視化することができます。

facet_col“continent”を指定し、大陸ごとに別のグラフで描画します。(10行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
facet_fig = px.scatter(
gapminder,
x="gdpPercap",
y="lifeExp",
log_x=True,
hover_name="country",
size="pop",
size_max=40,
color="continent",
facet_col="continent", # 大陸ごとのグラフに分割
width=1200 # グラフの横幅
)
facet_fig.update_xaxes(tickfont={"size": 8}) # X軸ラベルのフォントサイズ
facet_fig.show()

[実行結果]

バブルチャート(年ごと)

データセットには年のデータ含まれています。(これまではすべての年のデータをまとめて描画していました。)

アニメーション機能を使って年ごとのバブルチャートを描画します。(12行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
animation_fig = px.scatter(
gapminder,
x="gdpPercap",
y="lifeExp",
log_x=True,
hover_name="country",
size="pop",
size_max=40,
color="continent",
facet_col="continent",
width=1200,
animation_frame="year", # 年ごとのデータでアニメーション
)
animation_fig.update_xaxes(tickfont={"size": 8})
animation_fig.show()

[実行結果]

グラフの下に再生ボタンスライダーが表示され、年ごとにバブルチャートを切り替えることができます。

スライダを操作すると、指定した年のデータ描画されます。

まとめ

最初の散布図では以下の2つの情報しか表現できませんでした。

  • 一人あたりのGDP
  • 平均寿命

Plotly Expressでインタラクティブな可視化を行うことにより、次のような情報も合わせて確認できるようになりました。

  • 国名
    ホバーツールで表示。
  • 人口
    バブルの大きさで表示。
  • 大陸名
    バブルの色またはグラフの分割で表示。

  • アニメーションまたはスライドで表示切替。

Plotly Express②(バブルチャート)

前回記事から引き続き、gapminderデータセットを使います。

バブルチャート

人口の情報を散布図に加え、点の大きさで表現したバブルチャートを描画します。

また大陸(continent列)ごとに要素を色分けします。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
px.scatter(
gapminder,
x="gdpPercap",
y="lifeExp",
log_x=True,
hover_name="country",
size="pop", # 人口を点の大きさで表現
size_max=40, # 点の大きさの最大値
color="continent", # 大陸ごとに色分け
width=800 # グラフの横幅
).show()

[実行結果]

より多くの情報を得られるようになりました。

凡例(グラフ右上に表示)をクリックすると大陸ごとに表示・非表示を切り替えることができます。

ヨーロッパとアメリカのみを表示すると次のようなグラフになります。

[実行結果]

特定の要素にカーソルを合わせると、ホバーツールが表示され座標の情報に加え、国名・大陸名・人口の情報を確認することができます。

Plotly Express①(インタラクティブなグラフ)

Plotly Express

Ploty Expressはplotly.pyのラッパーで、簡潔なコードでデータを可視化できます。

Ploty Expressは以下のような機能をもち、多次元のデータを高い表現力で可視化できます。

  • 複数種類のグラフを組み合わせた可視化
  • ファセットによる可視化
    データを分割して複数のグラフに可視化
  • アニメーションによる可視化
    データを分割してフレームに描画して可視化

データの読み込み

gapminderデータセットを読み込みます。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

gapminder = px.data.gapminder()
gapminder.head()

[実行結果]

では一人当たりのGDP(gdpPercap列)平均寿命(lifeExp列)を可視化していきます。

pandasでの可視化

まずpandasplotメソッドを使って可視化を行います。

logxオプションにTrueを指定し、X軸は対数で表示しています。

[Google Colaboratory]

1
2
%matplotlib inline
gapminder.plot.scatter(x="gdpPercap", y="lifeExp", logx=True, xlim=[100, 1e6])

[実行結果]

上記の散布図では一人あたりGDP平均寿命の関係は分かるものの、具体的な値は座標から読み取るしかありません。

また国名(country列)人口(pop列)など、ほかの列の情報はこのグラフから読み取ることはできません。

Express Plotlyでの可視化

Plotly Expressを使って可視化を行います。

[Google Colaboratory]

1
2
3
4
5
6
7
8
px.scatter(
gapminder,
x="gdpPercap",
y="lifeExp",
log_x=True,
hover_name="country",
width=800 # グラフの横幅
).show()

[実行結果]

上図はpandasで作成したグラフと同じグラフのように見えますが、特定の要素にカーソルを合わせると、下記の図のようにホバーツールが表示されます。

[実行結果]

ホバーツールからは要素の値が確認でき、各座標の情報に加えて国名も見て取ることができます。

AutoML⑬(PyCaretでクラスタリング)

エルボー図

前回構築したクラスタリングモデルのエルボー図を表示します。

[Google Colaboratory]

1
plot_model(kmeans, plot = "elbow")

[実行結果]

急激に変化している箇所を最適なクラスタ数と判断することができます。

シルエット図

次にシルエット図を表示します。

[Google Colaboratory]

1
plot_model(kmeans, plot = "silhouette")

[実行結果]

各バーの縦幅が同じくらいになっていれば均等に分割できていると判断することができます。

クラスタリング

predict_model関数に、構築したモデルとデータを渡すとクラスタリング(グループ化)を行うことができます。

[Google Colaboratory]

1
2
ret = predict_model(kmeans, data=df_iris)
ret

[実行結果]

クラスタ番号がClusterとして追加されています。

このようにクラスタリングに関しても、複数アルゴリズムでのモデル構築や、エルボー図やシルエット図での評価まで簡単に行うことができました。

AutoML

AutoMLを使って、非常に短いコードでモデルの構築や評価を行うことができました。

AIモデル構築の分野はますます便利になっていき、より簡単にモデル構築ができるようになってきています。

AutoML⑫(PyCaretでクラスタリング)

PyCaretを使って、教師なし学習(クラスタリング)を行っていきます。

データの読み込みと前処理

まずアイリスデータを読み込みます。

[Google Colaboratory]

1
2
3
4
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df_iris = pd.DataFrame(iris.data, columns = iris.feature_names)

次にsetup関数を使って前処理を行います。

[Google Colaboratory]

1
2
3
4
5
from pycaret.clustering import *
data_clust = setup(data = df_iris,
normalize = False,
session_id = 0,
silent=True)

silentオプションにTrueを設定し、型推定の確認をスキップしています。(5行目)

[実行結果]

クラスタリング一覧

PyCaretが提供しているクラスタリング一覧を確認してみます。

[Google Colaboratory]

1
models()

[実行結果]

クラスタリングに関するいろいろなアルゴリズムが提供されていることが分かります。

クラスタリングモデルの作成

create_model関数に“kmeans”を指定し、クラスタリングモデルを作成します。

[Google Colaboratory]

1
2
kmeans = create_model("kmeans", num_clusters=3)
print(kmeans)

[実行結果]

SilhouetteCalinski-Harabaszなどの評価指数が表示されました。

Cluster PCA Plot

クラスタリング結果を可視化します。

[Google Colaboratory]

1
plot_model(kmeans)

[実行結果]

PCAが可視化され、きれいに分類されていることが確認できます。

PCAとは主成分分析のことで、特徴量を抽出することによって、次元削除や可視化をすることが可能になります。

AutoML⑪(PyCaretで分類モデル評価)

PyCaretでいろいろな評価指標グラフを表示していきます。

evaluate_modelダイアログ

evaluate_modelを実行すると、様々な評価指標を確認することができます。

[Google Colaboratory]

1
evaluate_model(tuned_ridge)

[実行結果]

Feature Importance

plot_model“feature”を渡すと、Feature Importanceのグラフを表示することができます。

[Google Colaboratory]

1
plot_model(tuned_ridge, "feature")

[実行結果]

worst concave pointsが高いことが確認できます。

Confusion Matrix

plot_model“confusion_matrix”を渡すと、Confusion Matrixのグラフを表示することができます。

[Google Colaboratory]

1
plot_model(tuned_ridge, plot = "confusion_matrix")

[実行結果]

精度よく分類されていることが分かります。

Class Prediction Error Plot

plot_model“error”を渡すと、Class Prediction Error Plotのグラフを表示することができます。

[Google Colaboratory]

1
plot_model(tuned_ridge, "error")

[実行結果]

横軸にカテゴリが表示され、予測が積み上げ棒で表示されています。

モデルがどのカテゴリで問題を抱えているか、カテゴリごとにどのような不正解があるのかを確認できます。

異なるモデルの長所と短所、およびデータセットにおける特有の課題の発見に役立ちます。

モデルの確定と推論

モデルを確定させて推論を実施します。

推論には、モデル構築に使っていないUnseenデータ(残り10%)を使用します。(2行目)

[Google Colaboratory]

1
2
3
final_ridge = finalize_model(tuned_ridge)
predictions = predict_model(final_ridge, data=tg_df_unseen)
print(predictions)

[実行結果(一部略)]

予測値がLabelとして追加されています。

確定したモデルは回帰モデルと同じように、ファイルに保存することができ、そのファイルを読み込むことでモデルの再利用が可能です。

以上が、PyCaretを使って分類モデルを構築して推論を行うフローになります。

AutoML⑩(PyCaret 分類モデル構築)

PyCaretで分類モデルを構築してみます。

データの取得

まず、乳がんのデータセットを読み込みます。

[Google Colaboratory]

1
2
3
4
5
6
import pandas as pd
from sklearn.datasets import load_breast_cancer
load_data = load_breast_cancer()
tg_df_all = pd.DataFrame(load_data.data, columns = load_data.feature_names)
tg_df_all["y"] = load_data.target
tg_df_all

前処理はPyCaretに任せるのでここではデータの加工は行いません。

[実行結果(一部略)]

データ分割

モデル構築に使う訓練データ(90%)とモデル構築に使わないUnseenデータ(10%)に分割します。

[Google Colaboratory]

1
2
3
4
5
tg_df = tg_df_all.sample(frac=0.90, random_state=0).reset_index(drop=True)
tg_df_unseen = tg_df_all.drop(tg_df.index).reset_index(drop=True)
print("All Data: " + str(tg_df.shape))
print("Data for Modeling: " + str(tg_df.shape))
print("Unseen Data For Predictions: " + str(tg_df_unseen.shape))

[実行結果]

前処理

PyCaretを使って前処理を行います。

[Google Colaboratory]

1
2
3
4
5
6
7
from pycaret.classification import *
ret = setup(data = tg_df,
target = "y",
session_id = 0,
normalize = False,
train_size = 0.6,
silent = True)

PyCaretの分類系ライブラリをインポートしています。(1行目)
setup関数パラメータsilentにTrueを指定し、型推定の確認をスキップしています。(7行目)

[実行結果]

分類モデル一覧

PyCaretが提供している分類モデル一覧を確認します。

[Google Colaboratory]

1
models()

[実行結果]

モデル評価一覧

compare_models関数を使って、各モデルを構築し評価一覧を表示します。

sort“F1”を設定しているので、F1評価の高い順に表示します。

[Google Colaboratory]

1
compare_models(sort = "F1", fold = 10)

[実行結果]

分類モデルの評価指標でモデル評価一覧が表示されました。

F1基準でExtra Trees Cassifierモデルの評価が1番高いことが確認できます。

パラメータチューニング

2番目に精度が良くて、速度が速いRidge Classifierのチューニングを行います。

まずはチューニングなしで実行してみます。

create_model関数に、Ridge ClassifierのID ridge を設定し実行します。

[Google Colaboratory]

1
ridge = create_model("ridge", fold = 10)

[実行結果]

F1の平均は0.9686になりました。

次はハイパーパラメータのチューニングを行います。

optimize引数に対象指標F1n_iter(パラメータ探索回数)100を設定しtune_model関数を実行します。

[Google Colaboratory]

1
2
tuned_ridge = tune_model(ridge, optimize = "F1", fold = 10, n_iter = 100)
tuned_ridge

[実行結果]

F1が0.9686から0.9709に向上したことが確認できました。