AIはまぁまぁ難しいデータの前処理をやってくれるか？

AIは日々賢くなり、仕事に使わない日がないです。最近考えるのは、AIにどの仕事とを渡そうか・・・。

それを考えるためには今日はヒトがやりたくないデータの前処理を、AIチャンがどれくらいやってくれるのか？というのを観察してみます。

今回AIには、家計調査というひと月の家庭の支出を知れるデータを前処理してもらいます（総務省統計局）。これは、マーケティングなどに役立つデータです。

それをChatGPTのo3を使って試してみました。やることをまとめると次のようになります。

使うツール: ChatGPT 
使うモデル: o3
前処理するデータ: 家計調査（家計支出編）　時系列データ（二人以上の世帯）: [URL](https://www.stat.go.jp/data/kakei/longtime/index.html)

実は以前、WEB+DB Pressさんに記事を書かせていただいたときに、この前処理を紹介しました。pandasを使ってまぁまぁ短いコードで処理できるのですが、これが出来れば脱初心者といえるのではないかなぁと思っているデータです。

記事のリポジトリ: ３章: https://github.com/mazarimono/webdb_notebook/blob/master/chapter-3_colab.ipynb

結論から行くと、o3はこの程度のデータなら、前処理してくれます。

実際のチャットは次のURLからみれると思います。  [Chat履歴](https://chatgpt.com/share/6817ebca-e744-8010-a0a4-8fbf47654a70)

## データを渡して前処理してもらう

o3を使うときは、もう結構雑に指示をしてしまいます・・・。o3が上司になった場合が怖い・・・。

```
次のデータを上手く使えるようにできますか？
```

とすると、試行時間は次の画像のように2分34秒と長考なのですが、出来たといってくれます。

![スクリーンショット 2025-05-03 091120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85433/3cce2f1d-a0b2-474b-b8cf-e5d7913158c9.png)

「ほんまにできたん～？？？」ということで、ちょっとデータを使ってグラフでも作ってもらいましょう。以前、このデータを使って講演などする際に良く扱った「米とパンの支出額の推移」を見てみましょう。

```
パンとコメの消費額の変化を作って下さい
```

![スクリーンショット 2025-05-03 092024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85433/380b9074-67f9-46e8-91e4-836206d69415.png)

はい、以前の傾向から、足元のコメ価格の上昇の影響で、一気にコメへの支出額が増えていることが分かります。キレイに前処理出来てそうやな・・・。

## どんな風に考えてるんだろ？

o3の面白いところは思考過程が見れるところです。これを見ながら、処理方法を学ぶことが出来ます。ちなみに、o3はこういう作業を行う場合、Pythonを使って処理しています。

作業の思考で面白いところを拾いながら、観察してみましょう。

### 前処理あるある。まずデータが読み込めない

空気を読んで、何をするか考え始めてくれるo3ちゃん。出来ない上司でごめんなさい・・・。

```
ユーザーが「次のデータを上手く使えるようにできますか？」と言っています。どうやらCSVファイルをアップロードしたようです。そのデータを効果的に使うためには、まずその内容を確認して、必要な処理を考えるべきです。良いアプローチとして、データの要約、カラムの確認、そして次にどんな処理を行うかを提案するのが良いかもしれません。
```

例によってエンコーディングのエラーで読めない問題に当たります。しかし、これは何度か試行したあと思考には出さずに、encodingに'shift-jis'を渡してクリアします。

```
pandasのバージョンによって、エラーの処理方法が異なるかもしれません。エンコーディングのエラーをどう扱うか、encoding_errorsというオプションを使ってみるべきかもしれませんね。どちらの方法が適切か確認し、エラーが発生した場合にどう対処するか考えつつ進めていきます。
```

### データの前処理を考え始める

データが読み込めると、データを観察しながら、どうやって前処理するかの検討をはじめます。

```
どうやら、日本語でラベルが付けられたデータセットのようですね。列が多く、いくつかは「Unnamed」になっているみたいです。データの形状は188行、308列。このデータは月ごとの家計支出などを含んでいるのかもしれません。まずは最初の数行を確認して、内容を把握してみようと思います。
```

ほう。

```
ファイルにはメタデータ行があるようです。最初の2行に2000年などが含まれ、3行目には月のラベル、4行目に数値が表示されています。このデータを有効に活用するには、ヘッダ行を特定し、データを整形する必要があります。具体的には、最初の2行をスキップし、3行目をヘッダーとして設定し、'Unnamed'列を削除して長い形式に変換する方法を提案します。ただし、最初に列情報を解析する必要がありますね。
```

データの数を基に、データの時系列がどういう感じになっているかも考え、データ作りをしてくれます。

```
データセットには2000年から2025年までの各年ごとの12ヶ月分のデータがあり、12ヶ月 × 26年 = 312列のはずですが、最初の6列がメタデータとしてあるので318列になるはずっと予想します。しかし、実際には308列しかないので、いくつかの月や年が欠けている可能性があります。これを確認するために、列の数を計算してみます。
```

普段前処理する場合邪魔だと思う、csv内のデータ名などの要素ですが、それもうまく使って、色々考えてくれることもわかります。データ作りのヒントになるかも。

```
2025年は2ヶ月分のみ、恐らく2025年2月まで。データセットは、日本の2人以上世帯の支出カテゴリに関する月次の時系列データだと考えられます。このデータを整理して、分析やトレンドのプロットに適した形式に変換する必要があります。サンプルとして、1変数で整理されたデータフレームを示す案がありますが、最初に高レベルで、まずは先頭10行を確認し、変数名を特定することにします。
```

などなどしている間に方針をまとめてくれてしまいます。

```
「消費支出」の変数について、サンプルのクリーンデータフレームを作成しようと思います。これを説明するのに関数を利用して、データを整理し、可視化しやすくします。データの整形や加工の手順を簡潔に示すことで、分析やさらなるステップをスムーズに進められるようにしたいと考えています。

提供されたデータは、2000年から2025年の2人以上の世帯の消費支出と属性に関する月次データのようです。このデータにはいくつかの解析用途があります:

消費パターンの時系列解析。

年ごとのインフレなど。

季節的な傾向。

提案するワークフローは次の通りです:

pandasを使ってデータをクリーンアップ。

データを長い形式に変換（melt）。

年+月を日時形式に変換。

関心のある変数を抽出し、平均や成長率を計算。
最初の数行を見せるように、データフレームを整理した結果を表示するのも良さそうです。

```

なんという。o3チャン賢すぎる。ここから処理しながらデータを作ったりいろいろしてくれます。

## コード

出してくれているコードは次のようになっています。

```python
df_raw = pd.read_csv("h-mon-a (2).csv", encoding="shift_jis")

# ── ヘッダ処理 ──
df = df_raw.iloc[3:].reset_index(drop=True)          # 先頭3行はメタ情報
df = df.rename(columns={"Unnamed: 5": "item"})       # 品目名列

# 年・月ラベルを前方補完して “YYYY-MM” → datetime
years = df_raw.iloc[0].ffill()
months = df_raw.iloc[2]

date_cols = {
    col: pd.to_datetime(
        f"{years[col].rstrip('年')}-{months[col].rstrip('月').zfill(2)}-01"
    )
    for col in df.columns[6:]                       # 6列目以降が月次
}

df_long = (
    df.melt(id_vars=df.columns[:6], value_vars=date_cols.keys(),
            var_name="orig_col", value_name="value")
      .assign(date=lambda d: d["orig_col"].map(date_cols))
      .drop(columns="orig_col")
```

これを実行すると、コード通りロングなデータが出てきます。人間が生データを見るにはワイドがいいが、まぁそれも指示すれば直してくれるし、そもそも人間がその辺りを扱わなくなるのかもしれない・・（チェックは必須だが

出来たデータは次のような感じです。

![スクリーンショット 2025-05-05 075737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85433/7c79917d-96cb-4078-9d67-1f8d4390f014.png)


ちなみにこのコードを実行してみたColabは次のリンク先にあります。　[Colabノートブック]()

## まとめ

こんな感じで、o3を使うと前処理にちょっと考える時間が必要だなぁという感じのデータも、ササっと前処理してくれました。毎回o3チャンに処理させるのでなく、作ってくれた再利用するというのもいい使い方かなぁと思います。こういうのも仕事のデザインかもしれませんね。

ちなみにこの記事はcursorを使いながらも、人手で書いています。執筆は趣味ととらえているので、AIには渡せません。（執筆時間: 42分）