OpeaAI API×LangChain×Streamlitで作るデータ分析コンペで必須！！簡単EDAアプリ！無料試し利用可能！

## 概要
本記事では、CSV形式のデータと可視化したい内容のプロンプトを入力するだけで、簡単にEDA（探索的データ分析）を行うことができる「データ分析EDAアプリ」を開発した手順とポイントを紹介します。このアプリケーションは、OpenAI APIとLangchain、Streamlitを組み合わせて開発しました。可視化ライブラリとしては、matplotlibを活用しています。

データコンペに参加する方や、データをすばやく把握したい方に向けた効率的なツールです。

## 開発経緯
開発した経緯としては、何か生成AIを使ったアプリを開発したいと思ったのと、私はよくkaggle等のデータ分析コンペに参加するのですが、毎回コンペの際にEDAのためのコードを記載する手間を省いて早くモデルの作成、予測、評価を行いたい！と思っていたことでこちらのアプリを作ろうと思いました！

## 使用技術

- **言語**: Python
- **ライブラリ**: 
  - langchain
  - langchain_core
  - langchain-openai
  - opeanai
  - streamlit
  - matplotlib
  - japanize-matplotlib (日本語対応のため)
  - pandas
  - numpy
  - python-dotenv

---

## 機能概要

### アプリの流れ

1. ユーザーがCSVファイルをアップロード。（こちらの例ではタイタニック問題のデータを利用しています。）
![スクリーンショット 2024-10-10 1.18.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/454ffdab-a4c8-c234-ed1a-81395c46383b.png)
2. ユーザーが「〇〇カラムごとの平均売上を可視化してください」などのプロンプトを入力。
![スクリーンショット 2024-10-10 1.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/a20f8c14-6376-7111-d7db-2cb006117120.png)

3. GPT-4を利用して、自動でデータに合わせたPythonコードを生成。
4. 生成されたコードでデータを分析し、matplotlibを使ってStreamlit上で可視化。
![スクリーンショット 2024-10-10 1.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/f4201eb7-f2e1-4896-ea32-e186b6f4fa19.png)
5. エラーハンドリングにより、失敗時には最大3回までコード修正を試みます。
![スクリーンショット 2024-10-10 1.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/39f97a3c-139f-1b06-f38e-9b9cd91f245f.png)

### 使用したCSVファイルの構造
- 1行目にカラム名を持つ標準的なCSVファイルを使用します。
![スクリーンショット 2024-10-10 1.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/974b47cf-b4ed-58b6-c6d0-4a5dde71e800.png)

---

## 開発の詳細

### 1. 使用技術
- **GPT-4（gpt-4o-mini）**: データ分析に必要なコードを生成。
- **Langchain**: ChatPromptTemplateなどを活用し、OpenAIモデルを呼び出す処理を簡略化。
- **Streamlit**: Webアプリケーションのフロントエンドとして活用し、ファイルのアップロードや結果の表示を担当。
- **matplotlib**: 可視化ライブラリとして利用し、データの視覚化を実現。
- **japanize-matplotlib**: 日本語対応のため、グラフタイトルや軸ラベルの文字化けを防止。

### 2. エラーハンドリング
- **コード生成のエラー**: 可視化が失敗した場合、3回まで自動的にコードを修正し、再試行。3回失敗すると、再度プロンプトを要求して、コストの無駄遣いを防止します。
- **データ未アップロード時の対応**: Streamlitの`st.file_uploader`でファイルをアップロードしないとプロンプトが入力できないように制御。

### 3. 開発の課題とその解決策

#### 課題1: 日本語の文字化け
日本語を含むグラフタイトルや軸ラベルで文字化けが発生する問題。
- **解決策**: `japanize-matplotlib`をインポートすることで、日本語表示をサポート。

#### 課題2: トークン制限による生成コードの切れ
生成されるコードに不要なコメントや冗長な内容が含まれ、トークン制限を超える問題。
- **解決策**: LangchainのChatPromptTemplateで不要なコメントや冗長な部分を排除し、トークン数を適切に管理。

#### 課題3: APIキーの管理
GitHubにAPIキーを公開せずにアプリを使用する方法。
- **解決策**: Streamlitの`secrets management`を使用し、APIキーを安全に管理。Pythonのバージョンをアプリ環境に合わせることが重要。

---

## Streamlitでのデプロイ手順

1. **GitHubにコードを公開**: まず、アプリのコードをGitHubにプッシュします。
2. **Streamlit Community Cloudに登録**: [Streamlit Community Cloud](https://streamlit.io/cloud)にサインアップし、ログイン。
3. **アプリのデプロイ**: 
   - `Create App`をクリック。
   ![スクリーンショット 2024-10-10 1.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/6f5d62ea-b5f1-923e-56ff-56d49a13d40f.png)
   - 「Deploy from an app already in a GitHub repo.」を選択し、リポジトリ、ブランチ、メインファイルを指定。
![スクリーンショット 2024-10-10 0.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/daec6a7a-7134-8a53-05ba-575262a1da3b.png)
![スクリーンショット 2024-10-10 1.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/9ebafe52-bc15-12b3-d739-dda822eb5156.png)

    - APIキーの設定: `Advanced settings`の`secrets`欄にAPIキーを設定。(こちらのPython versionをしっかりと開発環境に揃えないとAPIキーが取得できないのでご注意ください、)
![スクリーンショット 2024-10-10 1.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877268/9d213ab2-b401-7f8a-d350-551a5e9df107.png)
5. **デプロイ完了**: `Deploy!`ボタンを押してデプロイ。

---

## 結論

この「データ分析EDAアプリ」を使えば、手間をかけずにデータの内容を視覚化し、分析を効率化することが可能でき、早く本来の目的であるデータ予測に映ることを手助けしてくれると思います！。
下記にコードのリンクを添付しておくので、データ分析コンペに参加する際は是非こちらのアプリケーションを使ってみてください！

また、streamlit community coludでデプロイしているのでよかったら使ってみてください。
使ってみた感想をコメントでお待ちしております！
- [アプリ リンク](https://data-eda-app-p3jgxxukprpk4mpqfjftmh.streamlit.app/)

- [GitHub リンク](https://github.com/tailand2000/Data-EDA-App)