Databricksアシスタントを用いたEDA(探索的データ分析)

[Databricksアシスタント](https://www.databricks.com/jp/product/databricks-assistant)でコードの生成はできるのは嬉しいのですが、個人的には「手元にあるデータのEDA(Explanatory Data Analysis)をクイックにできないかな」と思ってます。

なので、試行錯誤ですが、データの可視化を含むEDAをアシスタントの助けを借りてどこまでできるか探ってみます。

:::note
**注意**
大規模言語モデルの性質上、常に同じ回答、常に正しい回答が得られるわけではありません。必ず回答の動作を確認して活用してください。
:::

# Unity Catalogのテーブルの可視化

難易度低そうなところから。

> テーブルtakaakiyayoi_catalog.japan_covid_analysis.covid_casesを可視化したいので、Pythonコードを作成してください。

![Screenshot 2024-01-31 at 14.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0833aee5-3c86-c036-f1ce-ea0d68490b68.png)

```py
import seaborn as sns
import matplotlib.pyplot as plt

# テーブルをSparkデータフレームにロード
df = spark.read.table('takaakiyayoi_catalog.japan_covid_analysis.covid_cases')

# データフレームをPandasデータフレームに変換
pandas_df = df.toPandas()

# エリアごとの感染者数をプロット
sns.barplot(x='Area', y='Cases', data=pandas_df)
plt.xticks(rotation=45)  # エリアの名前を45度回転して表示
plt.xlabel('Area')
plt.ylabel('Cases')
plt.title('COVID-19 Cases per Area')
plt.show()
```

良さそう。だがしかし。
![Screenshot 2024-01-31 at 14.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3609b02d-5ec5-5c02-d7ed-27ed1b7a3117.png)

豆腐になってしまいました…。こちらですね。

https://boul.tech/mplsns-ja/

```py
%pip install japanize-matplotlib
dbutils.library.restartPython()
```
```py
import japanize_matplotlib
```

直りましたがコードを書いてしまいました。
![Screenshot 2024-01-31 at 14.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/57e01f95-773d-cfd7-b251-7afbcf3d7ded.png)

**Databricksアシスタントはこれまでのやりとりを覚えている**ので、追加でお願いします。

> 上のコードでは日本語が化けてしまうので直してください。

![Screenshot 2024-01-31 at 14.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b97f9f77-8c1d-dd88-84ec-e59f4a0caaf4.png)

直りましたが、これは`japanize-matplotlib`がインストールされていることを前提にしてます。
![Screenshot 2024-01-31 at 14.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6da9b5c7-3f71-8903-7ef6-098e143e979b.png)

> japanize_matplotlibのインストール方法を教えてください。

![Screenshot 2024-01-31 at 15.00.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1d8a90bb-3309-d39c-625c-dfc1b4c267b1.png)

なるほど。一度チャットセッションをクリアして最初からトライしてみます。
![Screenshot 2024-01-31 at 15.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2b6501ae-44b8-98a1-8193-8db48bbcb720.png)

> テーブルtakaakiyayoi_catalog.japan_covid_analysis.covid_casesを可視化したいので、Pythonコードを作成してください。matplotlibでは日本語が化けてしまうので最初に必要なライブラリをインストールするようにしてください。


```py
%pip install japanize_matplotlib

import japanize_matplotlib
import seaborn as sns
import matplotlib.pyplot as plt

# テーブルをSparkデータフレームにロード
df = spark.read.table('takaakiyayoi_catalog.japan_covid_analysis.covid_cases')

# データフレームをPandasデータフレームに変換
pandas_df = df.toPandas()

# エリアごとの感染者数をプロット
sns.barplot(x='Area', y='Cases', data=pandas_df)
plt.xticks(rotation=45)  # エリアの名前を45度回転して表示
plt.xlabel('エリア')
plt.ylabel('感染者数')
plt.title('エリア別 COVID-19 感染者数')
plt.show()
```

いけました。具体的に伝えること大事。
![Screenshot 2024-01-31 at 15.05.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ae3b2024-0bc5-ce9a-21ca-c734be1a17c3.png)

# 別のグラフを描かせる

> 都道府県別の感染者数比率を表す円グラフをプロットしたい

これですと、都道府県名の列が「都道府県」になってしまい、うまくいきませんでした。実際にはPrefectureです。なので、

> 都道府県別の感染者数比率を表す円グラフをプロットしたい。都道府県はPrefecture列に入っています。

```py
import pandas as pd
import matplotlib.pyplot as plt

# テーブルをSparkデータフレームにロード
df = spark.read.table('takaakiyayoi_catalog.japan_covid_analysis.covid_cases')

# データフレームをPandasデータフレームに変換
pandas_df = df.toPandas()

# 都道府県別の感染者数を集計
cases_by_prefecture = pandas_df['Prefecture'].value_counts()

# ラベルとして都道府県を取得
labels = cases_by_prefecture.index.tolist()

# 感染者数の割合を取得
sizes = cases_by_prefecture.values.tolist()

# 円グラフを作成
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title('都道府県別COVID-19感染者数比率')
plt.axis('equal')  # アスペクト比を揃える
plt.show()
```

いけた！と思ったら`value_count`してる…。
![Screenshot 2024-01-31 at 15.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/184ca765-292b-486d-2e90-6662d4c16842.png)

> 都道府県別の感染者数比率を表す円グラフをプロットしたい。都道府県はPrefecture列に入っています。感染者数はCasesに入ってます。

```py
import pandas as pd
import matplotlib.pyplot as plt

# テーブルをSparkデータフレームにロード
df = spark.read.table('takaakiyayoi_catalog.japan_covid_analysis.covid_cases')

# データフレームをPandasデータフレームに変換
pandas_df = df.toPandas()

# 都道府県別の感染者数を集計
cases_by_prefecture = pandas_df.groupby('Prefecture')['Cases'].sum()

# ラベルとして都道府県を取得
labels = cases_by_prefecture.index.tolist()

# 感染者数の割合を取得
sizes = cases_by_prefecture.values.tolist()

# 円グラフを作成
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title('都道府県別COVID-19感染者数比率')
plt.axis('equal')  # アスペクト比を揃える
plt.show()
```
![Screenshot 2024-01-31 at 15.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/99df4d4d-5ccf-8344-2919-60f41de702d6.png)

ちなみにplotly使えば文字化けに悩むことなかったですね。

> takaakiyayoi_catalog.japan_covid_analysis.covid_casesをplotlyで可視化したいので、Pythonコードを作成してください。

```py
# 必要なライブラリをインポート
import plotly.express as px
import pandas as pd

# データを読み込み
df = spark.table("takaakiyayoi_catalog.japan_covid_analysis.covid_cases")

# Spark DataFrameからPandas DataFrameに変換
df_pd = df.toPandas()

# Plotlyを使って可視化
fig = px.line(df_pd, x='date_timestamp', y='Cases', color='Prefecture', title='COVID-19 Cases by Prefecture')
fig.show()
```
![Screenshot 2024-01-31 at 16.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b131f0a9-a9d7-4f71-9cc2-af05a0b4f3af.png)

# 今日の学び

- アシスタントはチャットセッションにおける過去のやりとりを覚えているので、うまく動かない場合には前の文脈を踏まえてお願いする
- データ構造が伝わっていないときには明示的に列名などを伝える
- エラーが起きたら**診断エラー**ボタンを活用

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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