2024年5月28日火曜日

スプレッドシートのデータ分析を AI(GPT)に手伝ってもらう GAS ライブラリを作成しました


スプレッドシート上のデータの分析を AI(GPT)に手伝ってもらう GAS ライブラリを作りました。Google Apps Script 上で直接分析、または分析の提案を受けることができます(どういった分析になるかはデータによります)。

GAS ライブラリは、欠損値・重複値の探索を行う GAS ライブラリ以来、久しぶりに作りました。ライブラリ化しておくことで、いつでもお手軽に使えます。

GPT を使用するため、OpenAI の API キーが必要となります。


スクリプト ID

1kwJbmRU1hKumO3I_HeO2leId8SiTojKsdZOx5DsYTUWrqkrenj9OEq3W


ライブラリの追加方法:

  1. ライブラリの追加から上記スクリプト ID を入力して「検索」を押下
  2. バージョンを選択、任意の ID を指定して「追加」を押下

※ バージョンは最新のもの、もしくは「HEAD(開発モード)」を指定してください。

「HEAD(開発モード)」であれば常に最新の状態が維持されますが、バージョンに反映前の変更も加わりますので、予期せぬ不具合が発生する可能性があります(まぁ、最新バージョンでもありますが)。


使い方:

スクリプトの実行方法は、以下の通りです。

ライブラリの追加の際に指定した任意の ID.aiAnalysis(スプレッドシート ID, シート名, データ範囲, OpenAI の API キー, [システムプロンプト, ユーザープロンプト, 使用するモデル(default: gpt-4o), 生成する文章の最大トークン数(default: 4096), 生成された文章のランダムさ(default: 0.5)]*任意)

戻り値として GPT による回答を返します。

リファレンスはこちら


例えば test という ID でライブラリで読み込んで使う場合、以下のようなコードになります。

function myFunction() {
  const spId = "スプレッドシート ID";
  const shName = "シート名";
  const dataRange = "A1:C3";
  const key = "OpenAI API キー"

  Logger.log(test.aiAnalysis(spId, shName, dataRange, key));

  // 任意の設定
  /**
  const system = ""; // システムプロンプト
  const user = ""; // ユーザープロンプト
  const model = ""; // デフォルトは gpt-4o
  const max_tokens = 1024; // デフォルトは 4096
  const temperature = 0; // デフォルトは 0.5

  const specified = [system, user, model, max_tokens, temperature]

  Logger.log(test.aiAnalysis(spId, shName, dataRange, key, specified));
   */
}


以下は、試しに2020-2021年の原木椎茸の栽培データを投げてみた結果です。

データを分析するために、以下のステップを踏みます:

### 1. データの概要を把握
まず、データの全体的な構造と各列の意味を把握します。データには以下の列があります:
- 発生ID
- 発生開始日
- 品種
- 使用回数
- 棚番号
- 収穫日
- 積算温度(℃時)
- 平均温度(℃)
- 分散(温度)
- 標準偏差(温度)
- 平均湿度(%)
- 分散(湿度)
- 標準偏差(湿度)
- タイミング
- 品質
- 収穫までの日数
- 参考値

### 2. データのクリーニング
データに欠損値や異常値がないか確認し、必要に応じて処理します。

### 3. 基本統計量の計算
各数値列の基本統計量(平均、標準偏差、最小値、最大値など)を計算します。

### 4. データの可視化
データの分布や相関関係を可視化するために、ヒストグラム、散布図、箱ひげ図などを作成します。

### 5. 品質に影響を与える要因の特定
品質(良、優、可、不可)に影響を与える要因を特定するために、各要因と品質の関係を分析します。

### 6. モデルの構築
品質を予測するためのモデルを構築します。例えば、ロジスティック回帰や決定木などを使用します。

### 7. 結果の解釈と提言
分析結果を解釈し、品質向上のための提言を行います。

それでは、ステップごとに詳細に進めていきます。

### 1. データの概要を把握
データの全体的な構造を確認します。

```python
import pandas as pd

# データの読み込み
data = pd.read_csv('data.csv')

# データの概要を表示
print(data.info())
print(data.head())
```

### 2. データのクリーニング
欠損値や異常値がないか確認します。

```python
# 欠損値の確認
print(data.isnull().sum())

# 異常値の確認(数値列の基本統計量を表示)
print(data.describe())
```

必要に応じて欠損値の補完や異常値の処理を行います。

### 3. 基本統計量の計算
各数値列の基本統計量を計算します。

```python
# 基本統計量の計算
print(data.describe())
```

### 4. データの可視化
データの分布や相関関係を可視化します。

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

# ヒストグラムの作成
data.hist(bins=30, figsize=(20, 15))
plt.show()

# 散布図行列の作成
sns.pairplot(data)
plt.show()
```

### 5. 品質に影響を与える要因の特定
品質(良、優、可、不可)に影響を与える要因を特定します。

```python
# 品質と各要因の関係を分析
sns.boxplot(x='品質', y='平均温度(℃)', data=data)
plt.show()

sns.boxplot(x='品質', y='平均湿度(%)', data=data)
plt.show()

# 相関行列の作成
corr_matrix = data.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()
```

### 6. モデルの構築
品質を予測するためのモデルを構築します。

```python
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report

# 特徴量とターゲットの分割
X = data[['平均温度(℃)', '平均湿度(%)', '積算温度(℃時)', '収穫までの日数']]
y = data['品質']

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ロジスティック回帰モデルの構築
model = LogisticRegression()
model.fit(X_train, y_train)

# 予測と評価
y_pred = model.predict(X_test)
print(accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
```

### 7. 結果の解釈と提言
分析結果を解釈し、品質向上のための提言を行います。

```markdown
# 結果の解釈

- 平均温度、平均湿度、積算温度、収穫までの日数が品質に影響を与えていることが分かりました。
- ロジスティック回帰モデルにより、品質の予測精度は約XX%でした。

# 提言

- 平均温度をXX℃に保つことで、品質が向上する可能性があります。
- 平均湿度をXX%に保つことで、品質が向上する可能性があります。
- 収穫までの日数をXX日に調整することで、品質が向上する可能性があります。
```

以上がデータ分析のステップです。具体的なデータを用いた分析の実行は、Pythonのコードを実際に実行する必要があります。


Python を用いた分析手順を解説してくれていますね。

デフォルトでは、ざっくりしたプロンプトで指示しているのですが、具体的な指示を与えれば、より詳細な分析もしてくれると思います。


本ライブラリに関する今後の更新は cultivationdata.net で行います。 note に引っ越しました。