Claude APIとStreamlitでAIダッシュボードアプリを作る!データ分析結果を自然言語で説明するWebアプリ入門
「データ分析の結果を出したはいいけど、グラフを見てもなにを伝えればいいかわからない…」
そんな悩みを持ったことはありませんか?
実は、Claude APIとStreamlitを組み合わせると、グラフや集計結果をAIが自動で読み解いて、自然な日本語で説明してくれるWebアプリがサクッと作れるんです。
今回は、CSVデータをアップロードして統計情報とグラフを表示しつつ、その内容をClaudeが解説してくれるAIダッシュボードアプリをゼロから作っていきます。
Streamlitでの画面構築+Claude APIでのAI解説という組み合わせは、既存のClaude API入門記事とは別の切り口です。「分析ツールとしてどう使うか」という実務よりの視点でお届けします 😊
📌 この記事で作るもの・対象読者

完成イメージはこんな感じです。
- 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でアプリが表示されます。

試しに、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をアプリにアップロードすると、売上・訪問者数・転換率の統計情報とグラフが表示されます。さらに「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アプリを作りました。
全体の流れを振り返るとこんな感じです。
- CSVをアップロードしてDataFrameとして読み込む
- 統計情報とグラフをStreamlitで表示する
- DataFrameの概要をテキスト化してClaudeに渡す
- Claudeが分析コメントを生成して画面に表示する
「グラフは作れるけど、説明が苦手…」という方にとって、このアプローチは一気に解決できるかもしれません!
Streamlitのシンプルさと、Claudeの言語生成能力を掛け合わせると、意外と短いコードでリッチなAIツールが作れるんですよね。ぜひ自分のデータで試してみてください 😊
応用として、複数ファイルの比較分析や、時系列データの予測コメント生成なども面白いテーマです。次のステップとして挑戦してみるのもおすすめですよ!
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





