自然言語でSQLデータベースの内容を分析する

# 自然言語でPostgreSQLデータを分析する方法

この記事では、Claude AIとModel Context Protocol (MCP)を使用して、自然言語でPostgreSQLデータベースに問い合わせ、分析する方法を紹介します。特に函館市の人口統計データを例として使用し、データの可視化までの一連の流れを解説します。なお、クライアントはClaudDesktopを使用しています。

MCPとは？
https://modelcontextprotocol.io/introduction



## 目的

PostgreSQLデータベースに格納されているデータを、Model Context Protocol (MCP)経由で自然言語を使って分析し、視覚化すること。
今回のデータは公共データを用いました。

## 環境構築

### 1. PostgreSQLサーバーをDockerで起動
*SQLサーバ設定は本筋ではないので不要であれば読み飛ばしてください*
以下の`docker-compose.yaml`ファイルを使用して、PostgreSQLサーバーをDockerコンテナとして起動します。

```yaml
version: '3.8'

services:
  postgres:
    image: postgres:latest
    container_name: postgres-container
    restart: unless-stopped
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: pg1234
      POSTGRES_DB: hakodate
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5433:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - postgres-network

networks:
  postgres-network:
    driver: bridge

volumes:
  postgres-data:
    driver: local
```

以下のコマンドでDockerコンテナを起動します：

```bash
docker-compose up -d
```

これにより、PostgreSQLサーバーが以下の設定で起動します：
- データベース名: hakodate
- ユーザー名: postgres
- パスワード: pg1234
- ポート: 5433（ホスト側）/ 5432（コンテナ側）

### 2. MCPサーバーの設定

Model Context Protocol (MCP)サーバーを設定して、AIがデータベースと通信できるようにします。MCPサーバーの設定ファイルに以下の内容を追加します：

```json
{
  "postgres": {
    "command": "npx",
    "args": [
      "-y",
      "@modelcontextprotocol/server-postgres",
      "postgresql://postgres:pg1234@localhost:5433/hakodate"
    ]
  }
}
```

https://github.com/modelcontextprotocol/servers/blob/main/src/postgres/README.md

この設定により、Claudeなどの大規模言語モデル（LLM）が自然言語を使ってPostgreSQLデータベースにアクセスできるようになります。

## テストデータ追加
今回は函館市の人口推移データを使いました。データを追加するクエリはここでは割愛します。

https://www.city.hakodate.hokkaido.jp/docs/2018061900052/



## データ分析の実践

### 1. データベース接続のテスト

まず最初に、データベースに正常に接続できるかを確認します。ClaudeにPostgreSQLデータベースの内容を尋ねることで、接続テストを行います。

```
クエリ例： 「私のpostgresデータベースにはどのような情報が格納されていますか」
```

Claudeは以下のような情報を返してくれます：

- データベース名: hakodate
- スキーマ: public
- テーブル: population（人口統計データ）
- 列情報: year（年）、population（総人口）、male_population（男性人口）、female_population（女性人口）など
- レコード数: 20件（明治9年から平成27年までのデータ）

### 2. データの可視化

次に、データを視覚的に理解するためにグラフ化をリクエストします。

```
クエリ例： 「この統計情報をグラフ化してください」
```

Claudeは以下の3つの表示形式でデータを可視化してくれます：

1. **折れ線グラフ**: 函館市の総人口と男女別人口の推移
2. **棒グラフ**: 総人口のみの表示
3. **男女別内訳**: 男性と女性の人口を積み上げ棒グラフで表示

## 分析結果
このようなグラフと分析結果が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962731/3fb9d001-d513-41af-b21e-f1f43475d900.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962731/27c788c7-3154-4ddd-85a7-a3bb5268048e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962731/1a45349e-468a-4d8d-bf99-bc590a9ce326.png)

グラフから読み取れる主な傾向：

1. **人口増加期（明治～昭和中期）**:
   - 明治9年(1876年)の約18万人から昭和45年(1970年)の約32万人まで増加

2. **ピーク**: 
   - 昭和45年(1970年)に約32万人でピークを迎える

3. **人口減少期（昭和50年以降）**:
   - 昭和50年(1975年)から緩やかな減少傾向が続き、平成27年(2015年)には約26.6万人まで減少

4. **男女比の変化**:
   - 明治時代から昭和初期までは男性人口が女性より多い
   - 昭和22年(1947年)頃から女性人口が男性を上回るようになり、その後もその差は拡大

5. **戦後の人口変動**:
   - 昭和15年(1940年)から昭和22年(1947年)の間に人口が増加

## まとめ
さくっと試してみましたが小一時間程度でこれくらいの結果出せるのはAIの力ですかね。
分析ツール使わなくても簡単な分析ならAI使ってやった方が早い印象を受けました。
~~分析ツール難しくてつかいこなせｎ~~