Databricksでipywidgetsを使ってみる

以下の記事で説明しているipywidgetsをDatabricksノートブック上で使ってみます。

https://qiita.com/taka_yayoi/items/afa752b1441165cb5b18

サンプルノートブックの日本語訳はこちらです。

https://github.com/taka-yayoi/public_repo/tree/main/ipywidgets

このノートブックでは、データサイエンティストがどのように新たなデータセットをブラウズするのかをウォークスルーします。

# クラスターの作成

Databricksランタイム11.0以降が稼働するクラウスターを作成して起動します。
![Screen Shot 2022-07-13 at 20.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f9268fd4-ca90-714d-422b-5a153fdda1ca.png)

# ノートブックの実行

上述のノートブックをインポートして実行してきます。

## データのロード

ここで使用するbike-sharingデータセットには、日付、気候、登録ユーザーによって、あるいはカジュアルにレンタルされた自転車の数を含む日毎のデータ2年分が含まれています。 

```py:Python
sparkDF = spark.read.csv("/databricks-datasets/bikeSharing/data-001/day.csv", header="true", inferSchema="true")
display(sparkDF)
```

![Screen Shot 2022-07-13 at 20.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a5acacfc-8295-f4e7-e57a-6665d0e9ea3a.png)

## データの探索

データセットを探索する一般的な方法は、関係性を見出すために変数をプロットすることです。次のセルでは、日毎にレンタルされた自転車の総数と、その日に記録された気温の散布図を作成します。

```py:Python
pdf = sparkDF.toPandas()
pdf.plot.scatter(x='temp', y='cnt')
```

![Screen Shot 2022-07-13 at 20.11.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d0195cd7-de9a-9013-5229-2783544b55a3.png)

異なる説明変数と目的変数を簡単に参照できるようにするために、関数を作成することもできます。

```py:Python
def f(x ='temp', y = 'cnt'):
  pdf.plot.scatter(x=x, y=y)
```

これで、関係性をプロットするために任意の2つのカラム名を指定することができます。

![Screen Shot 2022-07-13 at 20.12.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7aa68478-e6dc-c50a-6903-36c5e178bf18.png)

## ipywidgetsの活用

ipywidgetsを用いることで、ご自身のプロットにインタラクティブなコントローラを追加することができます。`@interact`[デコレーター](https://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html)を用いることで、1行のコードでインタラクティブなウィジェットを定義することができます。

以下のセルを実行した後、y軸に`cnt`、x軸にデフォルト値である`temp`を持つプロットが表示されます。`fit=True`のデフォルト値のため、プロットには回帰曲線が含まれます。

x軸に異なる値を選択するために、上のプロットのwidgetセレクターを使用したり、回帰曲線の表示のオンオフを行うことができます。ウィジェット用いて選択を行うと、即座にプロットに反映されます。

異なるタイプのipywidgetsに関しては、[ipywidgetsのドキュメント](https://ipywidgets.readthedocs.io/en/7.7.0/index.html)をご覧ください。

```py:Python
import ipywidgets as widgets
import seaborn as sns 
from ipywidgets import interact

# このコードでは、リスト ['temp', 'atemp', 'hum', 'windspeed'] によってドロップダウンメニューウィジェットが作成されます。 
# 変数にTrue/Falseを設定すると (`fit=True`) チェックボックスウィジェットが作成されます。
@interact(column=['temp', 'atemp', 'hum', 'windspeed'], fit=True)
def f(column='temp', fit=True):
  sns.lmplot(x=column, y='cnt', data=pdf, fit_reg=fit)
```

インタラクティブに操作できるグラフが表示されます。
![Screen Shot 2022-07-13 at 20.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/63ad0dd8-1cd8-c278-912d-2b38b9d3102a.png)

ドロップダウンからカラムを選択すると、即座にグラフが描画されます。
![Screen Shot 2022-07-13 at 20.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/83cfeb74-7934-d988-497c-c5d640be8efe.png)

チェックボックスで回帰曲線のオンオフを切り替えることができます。
![Screen Shot 2022-07-13 at 20.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/157e6cc0-07f5-1406-43ea-45d45a4aa2ff.png)

次のコマンドでは、ドロップダウンメニューを用いることで、ヒストグラムに任意の気候変数をプロットすることができます。また、ヒストグラムのビンの数を指定するためにスライダーを使うことができます。

```py:Python
# このコードでは、 `(bins=(2, 20, 2)` が2から20の間で2ごとの値を指定できる整数値スライダーウイジェットを定義します。
@interact(bins=(2, 20, 2), value=['temp', 'atemp', 'hum', 'windspeed'])
def plot_histogram(bins, value):
  pdf = sparkDF.toPandas()
  pdf.hist(column=value, bins=bins)
```

![Screen Shot 2022-07-13 at 20.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6af8d2f2-d830-d91a-473e-7360761aba1d.png)

スライダーを操作することでヒストグラムの解像度を変更することができます。
![Screen Shot 2022-07-13 at 20.16.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f3b0633f-acdd-f1cd-bd8d-22dacb6be115.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)