スプレッドシート上のデータの分析を AI(GPT)に手伝ってもらう GAS ライブラリを作りました。Google Apps Script 上で直接分析、または分析の提案を受けることができます(どういった分析になるかはデータによります)。
GAS ライブラリは、欠損値・重複値の探索を行う GAS ライブラリ以来、久しぶりに作りました。ライブラリ化しておくことで、いつでもお手軽に使えます。
GPT を使用するため、OpenAI の API キーが必要となります。
スクリプト ID
1kwJbmRU1hKumO3I_HeO2leId8SiTojKsdZOx5DsYTUWrqkrenj9OEq3W
ライブラリの追加方法:
- ライブラリの追加から上記スクリプト ID を入力して「検索」を押下
- バージョンを選択、任意の 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 を用いた分析手順を解説してくれていますね。
デフォルトでは、ざっくりしたプロンプトで指示しているのですが、具体的な指示を与えれば、より詳細な分析もしてくれると思います。