「データ分析の結果を出したはいいけど、グラフを見てもなにを伝えればいいかわからない…」

そんな悩みを持ったことはありませんか?

実は、Claude APIとStreamlitを組み合わせると、グラフや集計結果をAIが自動で読み解いて、自然な日本語で説明してくれるWebアプリがサクッと作れるんです。

今回は、CSVデータをアップロードして統計情報とグラフを表示しつつ、その内容をClaudeが解説してくれるAIダッシュボードアプリをゼロから作っていきます。

Streamlitでの画面構築+Claude APIでのAI解説という組み合わせは、既存のClaude API入門記事とは別の切り口です。「分析ツールとしてどう使うか」という実務よりの視点でお届けします 😊

📌 この記事で作るもの・対象読者

data dashboard analytics
data dashboard analytics / Photo by Lukas Blazek via Pexels

完成イメージはこんな感じです。

  • CSVファイルをアップロードすると、基本統計量とグラフが自動表示される
  • 「このデータをAIに解説してもらう」ボタンを押すと、Claudeが分析コメントを生成する
  • すべてブラウザ上で動くWebアプリとして完成する

対象読者

  • Pythonとpandasをなんとなくさわったことがある方(初〜中級者)
  • StreamlitでWebアプリを作ってみたい方
  • Claude APIをデータ分析ツールに組み込む方法を知りたい方

難易度は「初〜中級」です。コードをコピーして動かすだけでもOKなように解説しますね。

🛠️ 使う技術スタック

今回使うライブラリはシンプルです。

  • Streamlit:PythonだけでWebアプリのUIが作れるフレームワーク
  • Claude API(anthropic):Anthropic社が提供するAI API
  • pandas:データ分析の定番ライブラリ
  • matplotlib / seaborn:グラフ描画

まずは必要なライブラリをインストールしておきましょう。

pip install streamlit anthropic pandas matplotlib seaborn

APIキーの準備も忘れずに。.envファイルか環境変数にANTHROPIC_API_KEYを設定しておいてください。

📂 ファイル構成

ファイルは2つだけ用意します。

ai_dashboard/
├── app.py          # メインのStreamlitアプリ
└── ai_analyst.py   # Claude APIを呼び出す関数

シンプルに分けることで、AIの部分とUI部分をそれぞれ独立して管理しやすくなります。

🤖 STEP 1|AI解説関数を作る(ai_analyst.py)

まず、Claudeにデータの説明を依頼する関数を作ります。

ポイントは、「プロンプトにデータの要約をテキストで渡す」という点です。Claudeはテキストを受け取るので、DataFrameをそのまま渡すのではなく、統計情報や列情報を文字列に変換してから送ります。

import anthropic
import pandas as pd

def build_data_summary(df: pd.DataFrame) -> str:
    """
    DataFrameの概要をテキストに変換してClaudeに渡せる形にする
    """
    summary_lines = []

    # 基本情報
    summary_lines.append(f"行数: {len(df)}行、列数: {len(df.columns)}列")
    summary_lines.append(f"列名と型: {dict(df.dtypes.astype(str))}")

    # 数値列の基本統計量
    numeric_df = df.select_dtypes(include='number')
    if not numeric_df.empty:
        stats = numeric_df.describe().round(2)
        summary_lines.append("\n【数値列の基本統計量】")
        summary_lines.append(stats.to_string())

    # 欠損値の情報
    missing = df.isnull().sum()
    if missing.any():
        summary_lines.append(f"\n【欠損値】{missing[missing > 0].to_dict()}")
    else:
        summary_lines.append("\n欠損値なし")

    return "\n".join(summary_lines)


def analyze_with_claude(df: pd.DataFrame, user_question: str = "") -> str:
    """
    DataFrameの要約をClaudeに送り、自然言語で分析コメントを取得する
    """
    client = anthropic.Anthropic()  # 環境変数からAPIキーを自動取得

    data_summary = build_data_summary(df)

    # 追加の質問がある場合は末尾に付け加える
    question_part = f"\n\n【ユーザーからの追加質問】\n{user_question}" if user_question else ""

    prompt = f"""あなたはデータアナリストです。
以下のデータセットの情報をもとに、わかりやすい日本語でデータの特徴・傾向・注目すべきポイントを解説してください。
専門用語には簡単な説明を添え、箇条書きも使いながら読みやすくまとめてください。

【データの概要】
{data_summary}{question_part}"""

    message = client.messages.create(
        model="claude-opus-4-5-20251101",
        max_tokens=1024,
        messages=[
            {"role": "user", "content": prompt}
        ]
    )

    return message.content[0].text

ここが重要です。ポイントをまとめるとこんな感じです。

  • build_data_summary()でDataFrameを「テキスト情報」に変換している
  • 統計量・欠損値・列情報をまとめてClaudeに渡す
  • ユーザーからの追加質問があれば、プロンプトの末尾に付け足せる設計にしている

🖥️ STEP 2|StreamlitでUIを作る(app.py)

次に、ブラウザで動くWebアプリのUI部分を作ります。

Streamlitは「スクリプトを上から順番に実行してUIを描画する」という独特な仕組みです。ウィジェットの値が変わるたびにスクリプト全体が再実行されるという点を意識しておくと詰まりにくくなります。

import streamlit as st
import pandas as pd
import matplotlib
matplotlib.use("Agg")  # サーバー環境でGUIを使わない設定
import matplotlib.pyplot as plt
import seaborn as sns

# グラフの日本語が「□」に文字化けしないよう、日本語フォントを指定(Windows / Mac / Linux の順に候補)
plt.rcParams["font.family"] = ["Meiryo", "Hiragino Sans", "Noto Sans CJK JP", "sans-serif"]
from ai_analyst import analyze_with_claude

# ページ設定
st.set_page_config(
    page_title="AI データダッシュボード",
    page_icon="📊",
    layout="wide"
)

st.title("📊 AI データダッシュボード")
st.caption("CSVをアップロードすると、データの統計情報とグラフを表示します。AIにデータを解説させることもできます!")

# ファイルアップロードウィジェット
uploaded_file = st.file_uploader(
    label="CSVファイルをアップロードしてください",
    type=["csv"]
)

if uploaded_file is not None:
    # CSVを読み込む
    df = pd.read_csv(uploaded_file)

    st.success(f"✅ 読み込み完了!{len(df)}行 × {len(df.columns)}列のデータです")

    # データプレビュー
    with st.expander("🔍 データの先頭5行を確認する"):
        st.dataframe(df.head())

    # 基本統計量
    st.subheader("📈 基本統計量")
    numeric_df = df.select_dtypes(include='number')
    if not numeric_df.empty:
        st.dataframe(numeric_df.describe().round(2))
    else:
        st.info("数値列が見つかりませんでした")

    # グラフ描画セクション
    st.subheader("📉 グラフを見る")

    if not numeric_df.empty:
        col1, col2 = st.columns(2)

        with col1:
            # ヒストグラム(最初の数値列を使用)
            first_col = numeric_df.columns[0]
            fig1, ax1 = plt.subplots()
            sns.histplot(numeric_df[first_col].dropna(), ax=ax1, kde=True, color="steelblue")
            ax1.set_title(f"{first_col} の分布")
            st.pyplot(fig1)
            plt.close(fig1)  # メモリ解放

        with col2:
            # 相関ヒートマップ(列が2つ以上ある場合)
            if len(numeric_df.columns) >= 2:
                fig2, ax2 = plt.subplots()
                sns.heatmap(
                    numeric_df.corr().round(2),
                    annot=True,
                    cmap="coolwarm",
                    ax=ax2
                )
                ax2.set_title("相関ヒートマップ")
                st.pyplot(fig2)
                plt.close(fig2)
            else:
                st.info("相関ヒートマップには2列以上の数値列が必要です")

    # AI解説セクション
    st.subheader("🤖 AIにデータを解説してもらう")

    user_question = st.text_input(
        label="AIへの追加質問(任意)",
        placeholder="例:このデータで特に注目すべき傾向はありますか?"
    )

    if st.button("✨ Claudeに解説してもらう", type="primary"):
        with st.spinner("Claudeが分析中です...少々お待ちください"):
            result = analyze_with_claude(df, user_question)
        st.markdown("### 📝 Claudeの分析コメント")
        st.markdown(result)

else:
    st.info("👆 まずはCSVファイルをアップロードしてください")

コードのポイントをまとめるとこんな感じです。

  • st.file_uploader()でCSVをブラウザから受け取る
  • st.columns(2)で横並びの2カラムレイアウトを実現
  • st.spinner()でAI処理中のローディング表示ができる
  • plt.close(fig)でmatplotlibのメモリリークを防いでいる(地味に重要!)

▶️ STEP 3|アプリを起動する

ターミナルで以下のコマンドを実行するだけです。

streamlit run app.py

ブラウザが自動で開き、http://localhost:8501でアプリが表示されます。

Streamlitアプリの起動
Streamlitアプリの起動

試しに、Pythonで簡単なサンプルCSVを作ってアップロードしてみましょう。

import pandas as pd
import numpy as np

# サンプルCSVを生成するスクリプト
np.random.seed(42)
df = pd.DataFrame({
    "月": range(1, 13),
    "売上(万円)": np.random.randint(100, 500, 12),
    "訪問者数": np.random.randint(1000, 5000, 12),
    "転換率(%)": np.round(np.random.uniform(1.5, 5.0, 12), 2)
})
df.to_csv("sample_sales.csv", index=False)
print("sample_sales.csv を作成しました!")
サンプルCSV生成スクリプトの実行結果
サンプルCSV生成スクリプトの実行結果

このCSVをアプリにアップロードすると、売上・訪問者数・転換率の統計情報とグラフが表示されます。さらに「Claudeに解説してもらう」ボタンを押すと、AIが傾向をコメントしてくれます 🎉

CSVを読み込んだ直後の画面
実行結果①:CSVをアップロードすると、読み込み結果と基本統計量が表示されます
ヒストグラムと相関ヒートマップ
実行結果②:グラフ表示。ヒストグラムは最初の数値列(このサンプルでは「月」)が対象なので、見たい列を選べるようにする方法は後半の「応用②」で紹介しています
Claudeの分析コメント
実行結果③:「Claudeに解説してもらう」を押すと、AIがデータの傾向を日本語で解説します(冒頭部分)

💡 応用アイデア:AI解説をもっとリッチにする

基本形ができたら、少し手を加えるだけでぐっと実用的になります。

① 解説スタイルをユーザーが選べるようにする

たとえば「経営者向け」「エンジニア向け」「初心者向け」などのペルソナをセレクトボックスで選ばせて、プロンプトに追加するだけで、同じデータでも説明の粒度を変えられます。

# app.py の AI解説セクションに追加
audience = st.selectbox(
    "解説のスタイルを選んでください",
    ["一般的なビジネス向け", "エンジニア向け(技術的に詳しく)", "初心者向け(やさしく)"]
)

# ai_analyst.py の prompt に追加
prompt = f"""あなたはデータアナリストです。
解説対象: {audience}

以下のデータの特徴・傾向を解説してください。
..."""

② 複数グラフの列をユーザーが選べるようにする

st.selectbox()に数値列の一覧を渡せば、「どの列のグラフを見るか」をインタラクティブに切り替えられます。

# 数値列の一覧をセレクトボックスに渡す
selected_col = st.selectbox(
    "ヒストグラムで確認したい列を選んでください",
    options=numeric_df.columns.tolist()
)

fig, ax = plt.subplots()
sns.histplot(numeric_df[selected_col].dropna(), ax=ax, kde=True)
st.pyplot(fig)
plt.close(fig)

🔥 よくあるハマりポイントと対処法

実際に作ってみると、いくつかつまずきやすいポイントがあります。確認しておきましょう。

matplotlibのグラフが複数回表示される

Streamlitではplt.show()を使わず、st.pyplot(fig)を使うのが基本です。plt.show()を使うと意図しない表示になることがあります。また、plt.close(fig)を毎回呼ぶことでメモリの重複を防げます。

APIキーが読み込まれない

Streamlitアプリでは、.envファイルを自動で読み込んでくれません。python-dotenvを使うか、st.secrets(Streamlit Cloud用)を使うのがおすすめです。

# .envを手動で読み込む場合
from dotenv import load_dotenv
load_dotenv()  # app.pyの先頭に追加

大きなCSVで処理が重い

Claude APIに渡すテキストが長すぎるとエラーになることがあります。df.head(100)のように行数を絞って要約を作るか、統計量だけ渡すように調整しましょう。

まとめ

今回は、Claude APIとStreamlitを組み合わせて、データ分析結果をAIが自然言語で解説するWebアプリを作りました。

全体の流れを振り返るとこんな感じです。

  1. CSVをアップロードしてDataFrameとして読み込む
  2. 統計情報とグラフをStreamlitで表示する
  3. DataFrameの概要をテキスト化してClaudeに渡す
  4. Claudeが分析コメントを生成して画面に表示する

「グラフは作れるけど、説明が苦手…」という方にとって、このアプローチは一気に解決できるかもしれません!

Streamlitのシンプルさと、Claudeの言語生成能力を掛け合わせると、意外と短いコードでリッチなAIツールが作れるんですよね。ぜひ自分のデータで試してみてください 😊

応用として、複数ファイルの比較分析や、時系列データの予測コメント生成なども面白いテーマです。次のステップとして挑戦してみるのもおすすめですよ!

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る
実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。