🍔

Azure OpenAI Assistants APIでできること、できないこと

2024/03/21に公開

Azure OpenAI Assistants API機能がプレビュー版で利用できますが、
どこまで分析業務で活用できるのかを検証、考察しました。

公式ドキュメント

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/assistant

概要

Assistantsの機能概要は、ファイルをアップロードして、Code Interpriterを有効にすると、
アップロードしたファイルをさまざまな処理を実行して解析して、回答に答えてくれる機能です。

別の言い方をすると、ファイルからデータを読み込み、データをpandasとかで解析、
結果を元にグラフを作って、解析もしてくれます。

データサイエンティストのEDAを代替してくれる夢のような機能ですが、
解析の精度ってどの程度?どういう活用方法がありそうか?
というところを触ってみた結果です。

対応ファイルはPDFやWord、csvなど様々ですが、今回はcsvのインプットで検証します。

Excelとかだと、Excelの内容次第ですが、セルの結合があると解析結果を間違えたり、
何かしらのシートが読めないとかでエラーになります。
テーブルのみにまとまったExcelとかだと読めますが、それってcsvとほぼ変わらないなということで。

※どのファイルでどこまでできるのか? グラフ化の活用などは、この記事では扱いません。

データ

渋谷区のオープンデータで、SHIBUYA OPEN DATAというサイトから、
2023/9と2024/1の施設利用者数データをCSVでダウンロードし利用。

渋谷区の主な施設利用概況(人数カウンター) 2024年1月
渋谷区の主な施設利用概況(人数カウンター) 2023年9月

https://city-shibuya-data.opendata.arcgis.com/search?tags=%25E7%25A9%25BA%25E9%2596%2593%2C%25E4%25BA%25A4%25E9%2580%259A

アシスタントの設定

  • 手順(システムプロンプトのようなもの、分析のロジックとかを書くと良さそう)
    あなたは渋谷区の街づくり課の職員で、施設利用に問題がないか、利用人数の促進を目標としています。
    渋谷区の施設の利用人数や滞留時間の添付資料を元にして回答します。

  • デプロイ
    gpt4-1106-previewのモデルを選択

質問

2023/9と2024/1の渋谷区の施設利用者の人数、滞留時間に大きな変化があったところを教えてください。

ログ

コードインタープリターを有効にしているので、ファイルのデータ処理などをした上で回答してくれますが、
そのデータの処理の概要が見れます。

実行ログ
{
  "object": "list",
  "data": [
    {
      "id": "step_2JqneqV2n2eBXjTvHryieHVI",
      "object": "thread.run.step",
      "created_at": 1710951262,
      "run_id": "run_IidoEwdMyXT9i0ccOPqWdfxJ",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710951298,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_yHnVQWlIvv8W1mxT2ngqjYZ6"
        }
      }
    },
    {
      "id": "step_h8g3zOsH0xZcwgFldq4nAWn0",
      "object": "thread.run.step",
      "created_at": 1710951204,
      "run_id": "run_IidoEwdMyXT9i0ccOPqWdfxJ",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "tool_calls",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710951262,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "tool_calls",
        "tool_calls": [
          {
            "id": "call_5Tngvwnus4Umga5RJRbl1ZRk",
            "type": "code_interpreter",
            "code_interpreter": {
              "input": "# 施設ごとの合計入館数と平均滞留時間を求める\r\naggregate_sep2023 = data_sep2023.groupby('施設名称').agg({'入館数': 'sum', '平均滞留時間': 'mean'}).reset_index()\r\naggregate_jan2024 = data_jan2024.groupby('施設名称').agg({'入館数': 'sum', '平均滞留時間': 'mean'}).reset_index()\r\n\r\n# 変化率を計算するために、2024年1月のデータと2023年9月のデータを結合する\r\nmerged_data = pd.merge(aggregate_jan2024, aggregate_sep2023, on=\"施設名称\", suffixes=('_jan2024', '_sep2023'))\r\n\r\n# 利用者数の変化率と滞留時間の変化率を計算\r\nmerged_data['利用者数変化率'] = ((merged_data['入館数_jan2024'] - merged_data['入館数_sep2023']) / merged_data['入館数_sep2023']) * 100\r\nmerged_data['滞留時間変化率'] = ((merged_data['平均滞留時間_jan2024'] - merged_data['平均滞留時間_sep2023']) / merged_data['平均滞留時間_sep2023']) * 100\r\n\r\n# 変化率の絶対値が大きい施設を特定する\r\n# 一定のしきい値(例:50%)を超えた場合に大きな変化と定義する(しきい値は調整可能)\r\nthreshold = 50\r\nsignificant_changes = merged_data[(abs(merged_data['利用者数変化率']) > threshold) | (abs(merged_data['滞留時間変化率']) > threshold)]\r\nsignificant_changes[['施設名称', '入館数_sep2023', '入館数_jan2024', '利用者数変化率', '平均滞留時間_sep2023', '平均滞留時間_jan2024', '滞留時間変化率']]",
              "outputs": [
                {
                  "type": "logs",
                  "logs": "             施設名称  入館数_sep2023  入館数_jan2024   利用者数変化率  平均滞留時間_sep2023  \\\n17  地域交流センター西原・分室          938          950  1.279318       17.916616   \n\n    平均滞留時間_jan2024    滞留時間変化率  \n17       28.053509  56.578163  "
                }
              ]
            }
          }
        ]
      }
    },
    {
      "id": "step_TgMVgaH23j3YmC4651ed4soL",
      "object": "thread.run.step",
      "created_at": 1710951168,
      "run_id": "run_IidoEwdMyXT9i0ccOPqWdfxJ",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710951204,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_tWpAK4839bCYLcUqorCDTf5E"
        }
      }
    },
    {
      "id": "step_wAMNHHU8BzRBO3sAXMDoVMC7",
      "object": "thread.run.step",
      "created_at": 1710951158,
      "run_id": "run_IidoEwdMyXT9i0ccOPqWdfxJ",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "tool_calls",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710951168,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "tool_calls",
        "tool_calls": [
          {
            "id": "call_HlsEGXQH3tOLfi40uWsLNczB",
            "type": "code_interpreter",
            "code_interpreter": {
              "input": "# 2023年9月のデータと2024年1月のデータのカラムを比較して、どのようなデータが含まれているか確認\r\ncolumns_sep2023 = data_sep2023.columns\r\ncolumns_jan2024 = data_jan2024.columns\r\n\r\ncolumns_sep2023, columns_jan2024",
              "outputs": [
                {
                  "type": "logs",
                  "logs": "(Index(['日時', '日付', '時刻', '時刻2', '施設名称', '入館数', '退館数', '滞留数', '平均滞留人数',\n        '平均滞留時間', '最大滞留人数', '最大滞留時刻', '施設コード', 'ObjectId'],\n       dtype='object'),\n Index(['日時', '日付', '時刻', '時刻2', '施設名称', '入館数', '退館数', '滞留数', '平均滞留人数',\n        '平均滞留時間', '最大滞留人数', '最大滞留時刻', '施設コード', 'ObjectId'],\n       dtype='object'))"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "id": "step_lOLB2r5G1BjyJsWkPoyfqiQe",
      "object": "thread.run.step",
      "created_at": 1710951123,
      "run_id": "run_IidoEwdMyXT9i0ccOPqWdfxJ",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710951158,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_KmCR7MPKwoxStHQvvmmEYNEN"
        }
      }
    },
    {
      "id": "step_2hI9vL7NI2NAnNIjWHCi3v1y",
      "object": "thread.run.step",
      "created_at": 1710951086,
      "run_id": "run_IidoEwdMyXT9i0ccOPqWdfxJ",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "tool_calls",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710951123,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "tool_calls",
        "tool_calls": [
          {
            "id": "call_5mavA2qwMPJMoBbjrjgx2Zrb",
            "type": "code_interpreter",
            "code_interpreter": {
              "input": "import pandas as pd\r\n\r\n# ファイルのパスを設定\r\nfile_path_sep2023 = '/mnt/data/assistant-HUDBXzNPDTFNtcLYXEM8RlEJ'\r\nfile_path_jan2024 = '/mnt/data/assistant-0gRke98GySn8v8U2wLFhooxB'\r\n\r\n# ファイルを読み込む\r\ntry:\r\n    data_sep2023 = pd.read_csv(file_path_sep2023)\r\nexcept Exception as e:\r\n    error_sep2023 = str(e)\r\n\r\ntry:\r\n    data_jan2024 = pd.read_csv(file_path_jan2024)\r\nexcept Exception as e:\r\n    error_jan2024 = str(e)\r\n\r\n# エラーが発生しているか確認\r\nif 'error_sep2023' in locals():\r\n    print(f\"September 2023 Data Error: {error_sep2023}\")\r\nelse:\r\n    print(\"Preview of September 2023 Data:\")\r\n    display(data_sep2023.head())\r\n\r\nif 'error_jan2024' in locals():\r\n    print(f\"January 2024 Data Error: {error_jan2024}\")\r\nelse:\r\n    print(\"\\nPreview of January 2024 Data:\")\r\n    display(data_jan2024.head())",
              "outputs": [
                {
                  "type": "logs",
                  "logs": "Preview of September 2023 Data:\n\nPreview of January 2024 Data:\n"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "id": "step_jQ95dST17Fc27w0mqZ0PhcAl",
      "object": "thread.run.step",
      "created_at": 1710951078,
      "run_id": "run_IidoEwdMyXT9i0ccOPqWdfxJ",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710951086,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_RHi7jFtHLD3qxACLf8P0Q5xe"
        }
      }
    }
  ],
  "first_id": "step_2JqneqV2n2eBXjTvHryieHVI",
  "last_id": "step_jQ95dST17Fc27w0mqZ0PhcAl",
  "has_more": false
}

処理時間は、このログの一番上のcompleted_atから一番下のcreated_atを引いた時間になりそう。
今回でいうと、220秒かかってそう。

回答

変化のしきい値を50%と設定した結果、以下のような変化が見られました:
施設「地域交流センター西原・分室」の利用者数(入館数)は2023年9月から2024年1月にかけて約1.28%増加しました。
その一方で、「地域交流センター西原・分室」の平均滞留時間は2023年9月の約17.92時間から2024年1月の約28.05時間に増加し、その変化率は約56.58%となり、大きな変化となりました。

このデータに基づいて、「地域交流センター西原・分室」の施設利用に関して、特に滞留時間の増加に着目して、利用状況を詳細に調査することをお勧めします。利用者数の増加は比較的小さいものでしたが、滞留時間の増加が顕著ですので、この点について利用客や施設管理者からのフィードバックをもとに、施設サービスの改善や更なる利用促進策を検討するべきでしょう。

回答考察

施設ごとの合計入館数と平均滞留時間を求める

というロジックはぱっと見良さそう

Excelでグラフで比較してみると

  • 2024/1のデータを見ると、1/1~1/3はそもそも営業していなさそう
  • 2024/1/20に異常値がありそう(イベントのデータに引っ張られたくないなら中央値の方が良い?)
  • ぱっと見の平均は変化があまりなさそう
  • 合計入館数を比べると、938→950で分析結果の数字は合ってそう(スクリプトの実行だから当たり前ですが、ここを信用できるのは嬉しい)

一定のしきい値(例:50%)を超えた場合に大きな変化と定義する(しきい値は調整可能)

閾値の設定は全体で見てからの設定というわけではなさそうですが、調整可能と書いてあるので、
まー良いと思いました。

その一方で、「地域交流センター西原・分室」の平均滞留時間は2023年9月の約17.92時間から2024年1月の約28.05時間に増加し、その変化率は約56.58%となり、大きな変化となりました。

グラフで見ると、2024/1/3、1/4に平均滞留時間が700時間を超えるような数値になり、
明らかにデータがおかしい

この結果を踏まえると、データがおかしいという指摘を出してほしいところです。

もっというと、平均滞留時間と書いてありますが、単位は明記されていないので、秒だったら大した問題でもない
気がしますし、分だったら一人の担当者が人通りがあるところで作業していたせいとか、
時間だったらデータがおかしいとか、その辺まで言ってくれると素晴らしいなと。

もう一回聞く

この滞留時間の変化は何が原因と考えられそう?

回答

両期間の「地域交流センター西原・分室」のデータを見ると、いくつかの統計的な変化が確認できます:
2023年9月:
入館数は合計938回で平均2.83回/時刻。
平均滞留時間は約17.92時間。
平均滞留人数は0.86人/時刻。
2024年1月:
入館数は合計950回で平均2.77回/時刻。
平均滞留時間は約28.05時間。
平均滞留人数は1.04人/時刻。

特に、2024年1月のデータでは平均滞留時間が約56.58%増加しており、これは一部の日時で非常に長い滞留時間の値を示していることが原因かもしれません。長い滞留時間の値はイベントや特定のプログラムの開催、あるいはデータ収集の誤りなどによる可能性があります。

ただし、これらの数字だけから正確な原因を特定することは難しく、さらに詳細な分析が必要です。例えば、施設内での特定のイベントのスケジュール、キャンペーン実施状況、季節や天候による影響、また施設のリニューアルや設備の故障等があったか、などの情報が役立つかもしれません。

データの詳細なパターンを見るために、時間帯別の滞留時間の推移を把握し、特定の日や時間帯で異常な値が記録されていないかをさらに調べることが有効です。また、利用者のフィードバックやスタッフからの観察も有用な情報源となります。

この段階では、利用者数や滞留時間の異常値を特定するためのさらなる分析を進めるか、施設管理者や利用者からの追加情報を収集して、原因を探る必要があります。

実行ログ
{
  "object": "list",
  "data": [
    {
      "id": "step_kahxSTtsWedQcLIWm86VIgAO",
      "object": "thread.run.step",
      "created_at": 1710954780,
      "run_id": "run_NhOvjgQ8lg0UyraCvb20laC1",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710954934,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_VBv65bzNkkROggIz2mZuoITE"
        }
      }
    },
    {
      "id": "step_GeWzbBkLjJWfkhvbx44Rltwk",
      "object": "thread.run.step",
      "created_at": 1710954704,
      "run_id": "run_NhOvjgQ8lg0UyraCvb20laC1",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "tool_calls",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710954780,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "tool_calls",
        "tool_calls": [
          {
            "id": "call_VAhJrBLyxlkoiCZkjBfvyv63",
            "type": "code_interpreter",
            "code_interpreter": {
              "input": "import pandas as pd\r\n\r\n# ファイルのパスを設定\r\nfile_path_sep2023 = '/mnt/data/assistant-HUDBXzNPDTFNtcLYXEM8RlEJ'\r\nfile_path_jan2024 = '/mnt/data/assistant-0gRke98GySn8v8U2wLFhooxB'\r\n\r\n# 再度ファイルを読み込む\r\ndata_sep2023 = pd.read_csv(file_path_sep2023)\r\ndata_jan2024 = pd.read_csv(file_path_jan2024)\r\n\r\n# 確認する施設「地域交流センター西原・分室」に絞ったデータを抽出\r\nspecific_facility_sep2023 = data_sep2023[data_sep2023['施設名称'] == '地域交流センター西原・分室']\r\nspecific_facility_jan2024 = data_jan2024[data_jan2024['施設名称'] == '地域交流センター西原・分室']\r\n\r\n# それぞれの月のデータから特定のイベントや異常がないかどうか、または他の特徴的な変化が見られるかを確認するための記述統計と先頭のデータを表示\r\n(specific_facility_sep2023.describe(), specific_facility_jan2024.describe(), specific_facility_sep2023.head(), specific_facility_jan2024.head())",
              "outputs": [
                {
                  "type": "logs",
                  "logs": "(              入館数         退館数         滞留数      平均滞留人数      平均滞留時間      最大滞留人数  \\\n count  331.000000  331.000000  331.000000  331.000000  331.000000  324.000000   \n mean     2.833837    2.891239    0.685801    0.857402   17.916616    4.046296   \n std      2.897157    3.141166    1.500831    0.692053   15.024517    3.128965   \n min      0.000000    0.000000    0.000000    0.000000    0.000000    1.000000   \n 25%      0.500000    0.000000    0.000000    0.500000   10.600000    3.000000   \n 50%      2.000000    2.000000    0.000000    0.700000   15.000000    3.000000   \n 75%      4.000000    4.000000    1.000000    1.000000   21.050000    4.000000   \n max     21.000000   22.000000   14.000000    4.600000  132.800000   15.000000   \n \n              施設コード     ObjectId  \n count        331.0   331.000000  \n mean   208010200.0  4979.259819  \n std            0.0  2871.917847  \n min    208010200.0    34.000000  \n 25%    208010200.0  2518.000000  \n 50%    208010200.0  4981.000000  \n 75%    208010200.0  7478.000000  \n max    208010200.0  9924.000000  ,\n               入館数         退館数         滞留数      平均滞留人数      平均滞留時間      最大滞留人数  \\\n count  342.000000  342.000000  342.000000  342.000000  342.000000  317.000000   \n mean     2.777778    2.757310    0.880117    1.038889   28.053509    4.895899   \n std      3.508311    3.436417    2.424269    1.089449   73.582888    6.566015   \n min      0.000000    0.000000    0.000000    0.000000    0.000000    1.000000   \n 25%      0.000000    0.000000    0.000000    0.400000    7.825000    3.000000   \n 50%      2.000000    2.000000    0.000000    0.800000   13.300000    3.000000   \n 75%      4.000000    4.000000    1.000000    1.400000   24.050000    4.000000   \n max     45.000000   42.000000   39.000000    8.600000  677.000000   43.000000   \n \n              施設コード      ObjectId  \n count        342.0    342.000000  \n mean   208010200.0   5142.801170  \n std            0.0   2966.397322  \n min    208010200.0     47.000000  \n 25%    208010200.0   2630.000000  \n 50%    208010200.0   5166.000000  \n 75%    208010200.0   7690.500000  \n max    208010200.0  10247.000000  ,\n                    日時        日付             時刻       時刻2           施設名称  入館数  \\\n 33    2023/09/01 9:00  2023/9/1  09:00 - 10:00   9:00:00  地域交流センター西原・分室    2   \n 49   2023/09/01 16:00  2023/9/1  16:00 - 17:00  16:00:00  地域交流センター西原・分室    1   \n 97   2023/09/01 10:00  2023/9/1  10:00 - 11:00  10:00:00  地域交流センター西原・分室    3   \n 117  2023/09/01 19:00  2023/9/1  19:00 - 20:00  19:00:00  地域交流センター西原・分室    3   \n 148  2023/09/01 20:00  2023/9/1  20:00 - 21:00  20:00:00  地域交流センター西原・分室    0   \n \n      退館数  滞留数  平均滞留人数  平均滞留時間  最大滞留人数    最大滞留時刻      施設コード  ObjectId  \n 33     3    0     0.3     7.5     1.0   9:04:00  208010200        34  \n 49     1    0     0.7    12.5     3.0  10:36:00  208010200        50  \n 97     3    0     0.3     8.0     3.0  10:36:00  208010200        98  \n 117    2    1     0.6    11.6     3.0  10:36:00  208010200       118  \n 148    0    1     0.7    13.2     3.0  10:36:00  208010200       149  ,\n                    日時        日付             時刻       時刻2           施設名称  入館数  \\\n 46    2024/01/01 9:00  2024/1/1  09:00 - 10:00   9:00:00  地域交流センター西原・分室    0   \n 76   2024/01/01 10:00  2024/1/1  10:00 - 11:00  10:00:00  地域交流センター西原・分室    0   \n 91   2024/01/01 16:00  2024/1/1  16:00 - 17:00  16:00:00  地域交流センター西原・分室    0   \n 121  2024/01/01 19:00  2024/1/1  19:00 - 20:00  19:00:00  地域交流センター西原・分室    0   \n 129  2024/01/01 17:00  2024/1/1  17:00 - 18:00  17:00:00  地域交流センター西原・分室    0   \n \n      退館数  滞留数  平均滞留人数  平均滞留時間  最大滞留人数 最大滞留時刻      施設コード  ObjectId  \n 46     0    0     0.0     0.0     NaN    NaN  208010200        47  \n 76     0    0     0.0     0.0     NaN    NaN  208010200        77  \n 91     0    0     0.0     0.0     NaN    NaN  208010200        92  \n 121    0    0     0.0     0.0     NaN    NaN  208010200       122  \n 129    0    0     0.0     0.0     NaN    NaN  208010200       130  )"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "id": "step_44XbcMG9D5R5sbsA77c2Zi1R",
      "object": "thread.run.step",
      "created_at": 1710954672,
      "run_id": "run_NhOvjgQ8lg0UyraCvb20laC1",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "tool_calls",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710954704,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "tool_calls",
        "tool_calls": [
          {
            "id": "call_IB3MRkH4aRfaffmXjAhRDoAy",
            "type": "code_interpreter",
            "code_interpreter": {
              "input": "# まずはアップロードされた両ファイルの詳細な内容を確認するために全てのデータを確認する\nall_data_sep2023 = data_sep2023\nall_data_jan2024 = data_jan2024\n\n# 確認する施設「地域交流センター西原・分室」に絞ったデータを抽出\nspecific_facility_sep2023 = data_sep2023[data_sep2023['施設名称'] == '地域交流センター西原・分室']\nspecific_facility_jan2024 = data_jan2024[data_jan2024['施設名称'] == '地域交流センター西原・分室']\n\n# それぞれの月のデータから特定のイベントや異常がないかどうか、または他の特徴的な変化が見られるかを確認する\ndisplay(specific_facility_sep2023.describe())\ndisplay(specific_facility_jan2024.describe())\ndisplay(specific_facility_sep2023.head())\ndisplay(specific_facility_jan2024.head())",
              "outputs": []
            }
          }
        ]
      }
    },
    {
      "id": "step_ruoVNrts8TyQYCU484UoM8uk",
      "object": "thread.run.step",
      "created_at": 1710954581,
      "run_id": "run_NhOvjgQ8lg0UyraCvb20laC1",
      "assistant_id": "asst_Ev7RTFkNKOZkBM60UAFIaqZR",
      "thread_id": "thread_bO3Fx0En4u7UPOmIGTRYSeM4",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1710954672,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_3UTcTH5rgS3QklEkm1Tpl4rg"
        }
      }
    }
  ],
  "first_id": "step_kahxSTtsWedQcLIWm86VIgAO",
  "last_id": "step_ruoVNrts8TyQYCU484UoM8uk",
  "has_more": false
}

データがおかしい可能性なども言及してくれました。

今回は353秒かかってそう。

まとめ

分析の方向性を数十秒で出したり、やりたいことを聞いてやり方が正しいかを確認していけば良いので、
Assistantを使ったデータ分析は初手として有効だなーと感じました。

初手と言ったのは、ブラッシュアップしていくには応答が遅すぎるので、大体の方向性が見えたら、
そのままデータを見て分析していった方が現状は早いような気がしました。

ただ、時間が許すのであれば、Assistantで深ぼっていくことでもある程度分析できそうです。

※code_interpreterを見れば、前処理とかわかるので、code_interpreterの中身を抽出してと指示をするのも有効かと。

前処理のコードをコピペできるように出力して

と聞いたら、40秒くらいで、下記を返してくれました。

import pandas as pd

# ファイルのパスを設定
file_path_sep2023 = '/mnt/data/assistant-HUDBXzNPDTFNtcLYXEM8RlEJ'
file_path_jan2024 = '/mnt/data/assistant-0gRke98GySn8v8U2wLFhooxB'

# ファイルを読み込む
data_sep2023 = pd.read_csv(file_path_sep2023)
data_jan2024 = pd.read_csv(file_path_jan2024)

# 施設ごとの合計入館数と平均滞留時間を求める
aggregate_sep2023 = data_sep2023.groupby('施設名称').agg({'入館数': 'sum', '平均滞留時間': 'mean'}).reset_index()
aggregate_jan2024 = data_jan2024.groupby('施設名称').agg({'入館数': 'sum', '平均滞留時間': 'mean'}).reset_index()

# 変化率を計算するために、2024年1月のデータと2023年9月のデータを結合する
merged_data = pd.merge(aggregate_jan2024, aggregate_sep2023, on="施設名称", suffixes=('_jan2024', '_sep2023'))

# 利用者数の変化率と滞留時間の変化率を計算
merged_data['利用者数変化率'] = ((merged_data['入館数_jan2024'] - merged_data['入館数_sep2023']) / merged_data['入館数_sep2023']) * 100
merged_data['滞留時間変化率'] = ((merged_data['平均滞留時間_jan2024'] - merged_data['平均滞留時間_sep2023']) / merged_data['平均滞留時間_sep2023']) * 100

# 変化率の絶対値が大きい施設を特定する
# 一定のしきい値(例:50%)を超えた場合に大きな変化と定義する(しきい値は調整可能)
threshold = 50
significant_changes = merged_data[(abs(merged_data['利用者数変化率']) > threshold) | (abs(merged_data['滞留時間変化率']) > threshold)]
significant_changes[['施設名称', '入館数_sep2023', '入館数_jan2024', '利用者数変化率', '平均滞留時間_sep2023', '平均滞留時間_jan2024', '滞留時間変化率']]

分析中にAssistantを開いておいて、何か作る、観点を切り替える際の初手利用が有効かと。

あと、アシスタントとかデータ分析に限ったものではありませんが、データ項目の定義をしっかり
プロンプトで伝えることが大事だと。

ヘッドウォータース

Discussion