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 でライブラリで読み込んで使う場合、以下のようなコードになります。

  1. function myFunction() {
  2. const spId = "スプレッドシート ID";
  3. const shName = "シート名";
  4. const dataRange = "A1:C3";
  5. const key = "OpenAI API キー"
  6.  
  7. Logger.log(test.aiAnalysis(spId, shName, dataRange, key));
  8.  
  9. // 任意の設定
  10. /**
  11. const system = ""; // システムプロンプト
  12. const user = ""; // ユーザープロンプト
  13. const model = ""; // デフォルトは gpt-4o
  14. const max_tokens = 1024; // デフォルトは 4096
  15. const temperature = 0; // デフォルトは 0.5
  16.  
  17. const specified = [system, user, model, max_tokens, temperature]
  18.  
  19. Logger.log(test.aiAnalysis(spId, shName, dataRange, key, specified));
  20. */
  21. }


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

  1. データを分析するために、以下のステップを踏みます:
  2.  
  3. ### 1. データの概要を把握
  4. まず、データの全体的な構造と各列の意味を把握します。データには以下の列があります:
  5. - 発生ID
  6. - 発生開始日
  7. - 品種
  8. - 使用回数
  9. - 棚番号
  10. - 収穫日
  11. - 積算温度(℃時)
  12. - 平均温度(℃)
  13. - 分散(温度)
  14. - 標準偏差(温度)
  15. - 平均湿度(%)
  16. - 分散(湿度)
  17. - 標準偏差(湿度)
  18. - タイミング
  19. - 品質
  20. - 収穫までの日数
  21. - 参考値
  22.  
  23. ### 2. データのクリーニング
  24. データに欠損値や異常値がないか確認し、必要に応じて処理します。
  25.  
  26. ### 3. 基本統計量の計算
  27. 各数値列の基本統計量(平均、標準偏差、最小値、最大値など)を計算します。
  28.  
  29. ### 4. データの可視化
  30. データの分布や相関関係を可視化するために、ヒストグラム、散布図、箱ひげ図などを作成します。
  31.  
  32. ### 5. 品質に影響を与える要因の特定
  33. 品質(良、優、可、不可)に影響を与える要因を特定するために、各要因と品質の関係を分析します。
  34.  
  35. ### 6. モデルの構築
  36. 品質を予測するためのモデルを構築します。例えば、ロジスティック回帰や決定木などを使用します。
  37.  
  38. ### 7. 結果の解釈と提言
  39. 分析結果を解釈し、品質向上のための提言を行います。
  40.  
  41. それでは、ステップごとに詳細に進めていきます。
  42.  
  43. ### 1. データの概要を把握
  44. データの全体的な構造を確認します。
  45.  
  46. ```python
  47. import pandas as pd
  48.  
  49. # データの読み込み
  50. data = pd.read_csv('data.csv')
  51.  
  52. # データの概要を表示
  53. print(data.info())
  54. print(data.head())
  55. ```
  56.  
  57. ### 2. データのクリーニング
  58. 欠損値や異常値がないか確認します。
  59.  
  60. ```python
  61. # 欠損値の確認
  62. print(data.isnull().sum())
  63.  
  64. # 異常値の確認(数値列の基本統計量を表示)
  65. print(data.describe())
  66. ```
  67.  
  68. 必要に応じて欠損値の補完や異常値の処理を行います。
  69.  
  70. ### 3. 基本統計量の計算
  71. 各数値列の基本統計量を計算します。
  72.  
  73. ```python
  74. # 基本統計量の計算
  75. print(data.describe())
  76. ```
  77.  
  78. ### 4. データの可視化
  79. データの分布や相関関係を可視化します。
  80.  
  81. ```python
  82. import matplotlib.pyplot as plt
  83. import seaborn as sns
  84.  
  85. # ヒストグラムの作成
  86. data.hist(bins=30, figsize=(20, 15))
  87. plt.show()
  88.  
  89. # 散布図行列の作成
  90. sns.pairplot(data)
  91. plt.show()
  92. ```
  93.  
  94. ### 5. 品質に影響を与える要因の特定
  95. 品質(良、優、可、不可)に影響を与える要因を特定します。
  96.  
  97. ```python
  98. # 品質と各要因の関係を分析
  99. sns.boxplot(x='品質', y='平均温度(℃)', data=data)
  100. plt.show()
  101.  
  102. sns.boxplot(x='品質', y='平均湿度(%)', data=data)
  103. plt.show()
  104.  
  105. # 相関行列の作成
  106. corr_matrix = data.corr()
  107. sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
  108. plt.show()
  109. ```
  110.  
  111. ### 6. モデルの構築
  112. 品質を予測するためのモデルを構築します。
  113.  
  114. ```python
  115. from sklearn.model_selection import train_test_split
  116. from sklearn.linear_model import LogisticRegression
  117. from sklearn.metrics import accuracy_score, classification_report
  118.  
  119. # 特徴量とターゲットの分割
  120. X = data[['平均温度(℃)', '平均湿度(%)', '積算温度(℃時)', '収穫までの日数']]
  121. y = data['品質']
  122.  
  123. # データの分割
  124. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  125.  
  126. # ロジスティック回帰モデルの構築
  127. model = LogisticRegression()
  128. model.fit(X_train, y_train)
  129.  
  130. # 予測と評価
  131. y_pred = model.predict(X_test)
  132. print(accuracy_score(y_test, y_pred))
  133. print(classification_report(y_test, y_pred))
  134. ```
  135.  
  136. ### 7. 結果の解釈と提言
  137. 分析結果を解釈し、品質向上のための提言を行います。
  138.  
  139. ```markdown
  140. # 結果の解釈
  141.  
  142. - 平均温度、平均湿度、積算温度、収穫までの日数が品質に影響を与えていることが分かりました。
  143. - ロジスティック回帰モデルにより、品質の予測精度は約XX%でした。
  144.  
  145. # 提言
  146.  
  147. - 平均温度をXX℃に保つことで、品質が向上する可能性があります。
  148. - 平均湿度をXX%に保つことで、品質が向上する可能性があります。
  149. - 収穫までの日数をXX日に調整することで、品質が向上する可能性があります。
  150. ```
  151.  
  152. 以上がデータ分析のステップです。具体的なデータを用いた分析の実行は、Pythonのコードを実際に実行する必要があります。


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

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


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