data-visualization について
data-visualization は、構造化データをチャートに変換する AI エージェント向けスキルです。分析上の問いに応じてチャートを選び、静的またはインタラクティブな可視化を作成します。データ探索、レポート、ダッシュボードに利用できます。
主な機能
- 01分析目的に応じたチャート選択
- 02matplotlib と seaborn による静的チャート作成
- 03plotly によるインタラクティブチャート作成
- 04プロット用データの準備
- 05ラベル、凡例、注釈の追加
- 06PNG、SVG、HTML への出力
活用シーン
- 01カテゴリ間のデータ比較
- 02時系列の傾向表示
- 03変数間の関係や分布の探索
- 04レポート用チャートやインタラクティブなダッシュボードの作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ seb1n/ awesome-ai-agent-skills --skill data-visualizationインストール後、Claude Code で/data-visualizationを入力して読み込まれたか確認します。
詳細
データビジュアライゼーション
このスキルを使うと、AI エージェントは構造化データを意味のある視覚表現に変換できます。エージェントは、データと質問の内容に基づいて適切なグラフの種類を選択し、matplotlib と seaborn を使って公開品質の静的なグラフを作成し、plotly でインタラクティブなビジュアライゼーションを作成します。確立されたデータビジュアライゼーションの原則に従い、明瞭さ、正確さ、視覚的な魅力を確保します。
ワークフロー
-
データと質問を把握します。 データセットの構造(変数の数、種類(数値、カテゴリ、時間)や、ユーザーが強調したい関係性や比較)を調べます。グラフの選択は、データ単独よりも質問によって大きく左右されます。
-
適切なグラフの種類を選択します。 分析の目的に合った視覚形式を選びます。カテゴリの比較には棒グラフ、時間の推移には折れ線グラフ、2つの連続変数の関係には散布図、分布にはヒストグラム、ばらつきや外れ値には箱ひげ図、相関行列や密なカテゴリグリッドにはヒートマップを使います。
-
プロット用にデータを準備します。 必要に応じて、データを集計、ピボット、または再形成します。棒グラフではカテゴリ軸を値で並べ替えます。時系列データは適切な粒度にリサンプリングします。プロットに NaN 値が入り、空白やエラーが発生しないようにします。
-
適切なスタイルでビジュアライゼーションを作成します。 一貫したカラーパレット、読みやすい軸ラベル、説明的なタイトル、適切な凡例を設定します。不要なグリッド線、枠線、装飾など、グラフのノイズを取り除きます。出力先(レポート、スライド、ダッシュボード)に合った図のサイズを使用します。
-
コンテキストと注釈を追加します。 注釈、基準線、または網掛け領域を使って、重要なデータポイントを強調します。役立つ場合は、要約統計量をグラフに直接追加します(例:箱ひげ図の中央値の線、散布図の傾向線)。コンテキストを加えることで、グラフは単なる装飾から分析へと変わります。
-
エクスポートまたは表示します。 レポート用の静的なグラフは PNG または SVG で保存し、ダッシュボードや探索用にはインタラクティブな HTML をレンダリングします。印刷品質の出力には DPI を 150 以上に設定します。
対応テクノロジー
- matplotlib — あらゆる視覚要素を細かく制御できる、基盤となるプロットライブラリ
- seaborn — 適切なデフォルト設定と組み込みテーマを備えた統計ビジュアライゼーション
- plotly — ホバーツールチップ、ズーム、パンに対応したインタラクティブなグラフ
- plotly.express — インタラクティブなグラフをすばやく作成できる簡潔な API
グラフの種類の選び方
| 目標 | グラフの種類 | ライブラリ |
|---|---|---|
| カテゴリを比較する | 棒グラフ(縦または横) | matplotlib, seaborn |
| 時間の推移を示す | 折れ線グラフ | matplotlib, plotly |
| 2つの変数の関係を調べる | 散布図 | seaborn, plotly |
| 変数の分布を示す | ヒストグラムまたは KDE | seaborn |
| グループ間の分布を比較する | 箱ひげ図またはバイオリンプロット | seaborn |
| 相関行列を表示する | ヒートマップ | seaborn |
| 構成・割合を示す | 積み上げ棒グラフまたは円グラフ | matplotlib |
| ユーザーによる探索を可能にする | インタラクティブなグラフ | plotly |
使用方法
エージェントにデータセットと、何を可視化したいかの説明を渡します。必要に応じて、グラフの種類、色の好み、出力形式、図の寸法も指定できます。グラフの種類を指定しない場合、エージェントが最適な方法を選択します。
例
例 1:matplotlib と seaborn を使った売上ダッシュボード
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("quarterly_sales.csv", parse_dates=["date"])
sns.set_theme(style="whitegrid", palette="viridis")
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle("Q4 2024 Sales Dashboard", fontsize=16, fontweight="bold")
# 1. Monthly revenue trend
monthly = df.resample("M", on="date")["revenue"].sum()
axes[0, 0].plot(monthly.index, monthly.values, marker="o", linewidth=2)
axes[0, 0].set_title("Monthly Revenue Trend")
axes[0, 0].set_ylabel("Revenue ($)")
axes[0, 0].tick_params(axis="x", rotation=45)
# 2. Revenue by region (horizontal bar)
region = df.groupby("region")["revenue"].sum().sort_values()
axes[0, 1].barh(region.index, region.values, color=sns.color_palette("viridis", len(region)))
axes[0, 1].set_title("Revenue by Region")
axes[0, 1].set_xlabel("Total Revenue ($)")
# 3. Units sold distribution (histogram)
axes[1, 0].hist(df["units_sold"], bins=30, edgecolor="white", alpha=0.8)
axes[1, 0].axvline(df["units_sold"].median(), color="red", linestyle="--", label="Median")
axes[1, 0].set_title("Units Sold Distribution")
axes[1, 0].legend()
# 4. Revenue vs. discount scatter with regression
sns.regplot(data=df, x="discount", y="revenue", ax=axes[1, 1],
scatter_kws={"alpha": 0.4, "s": 15}, line_kws={"color": "red"})
axes[1, 1].set_title("Revenue vs. Discount")
plt.tight_layout()
plt.savefig("sales_dashboard.png", dpi=150, bbox_inches="tight")
plt.show()
例 2:plotly を使ったインタラクティブなビジュアライゼーション
import pandas as pd
import plotly.express as px
df = pd.read_csv("global_sales.csv")
# Interactive scatter with size, color, and hover data
fig = px.scatter(
df,
x="marketing_spend",
y="revenue",
size="units_sold",
color="region",
hover_data=["product_name", "quarter"],
title="Marketing Spend vs Revenue by Region",
labels={
"marketing_spend": "Marketing Spend ($)",
"revenue": "Revenue ($)",
"units_sold": "Units Sold"
},
template="plotly_white"
)
fig.update_traces(marker=dict(opacity=0.7, line=dict(width=1, color="DarkSlateGrey")))
# Add a trend line annotation
fig.add_annotation(
x=45000, y=320000,
text="Strong ROI cluster:<br>low spend, high revenue",
showarrow=True, arrowhead=2,
font=dict(size=12, color="darkblue")
)
fig.write_html("interactive_scatter.html")
fig.show()
# Users can hover over points to see product_name and quarter,
# zoom into clusters, and toggle regions on/off via the legend.
ベストプラクティス
- 見た目ではなく、分析上の問いに基づいてグラフの種類を選びます。相関についての問いであれば、パターンが見られない散布図でも適切な選択です。
- 色分けするカテゴリは7つ以下にします。それを超える場合は、1つの凡例に色を詰め込むのではなく、ファセット化やスモールマルチプルを使います。
- 軸には必ず単位を付け、人が読みやすい数値形式を使います(例:「1200000」ではなく「$1.2M」)。
- 差を誇張しないよう、棒グラフのY軸はゼロから始めます。折れ線グラフでは、絶対値より変化に注目する場合、軸を途中から始めてもかまいません。
- デフォルトでは、色覚多様性に配慮したパレット(viridis、cividis、またはColorBrewerの質的データ向けセット)を使います。
- 文書やプレゼンテーションに掲載するグラフは、150 DPI以上で書き出します。
エッジケース
- 1つのグラフにカテゴリが多すぎる場合。 棒グラフの棒が15本を超える場合は、上位N件を表示して残りを「その他」にまとめるか、ツリーマップに切り替えます。
- 散布図で点が重なる場合。 数千個の点が重なる場合は、透明度(
alpha=0.3)、ジッター、またはヘックスビン/2D密度プロットを使います。 - 軸ラベルが長い場合。 テキストを読みやすくするため、ラベルを45度回転する、省略記号を使って短くする、または横棒グラフに切り替えます。
- 欠損値によって折れ線グラフに途切れが生じる場合。 小さな欠損(1~2点)は線形補間し、破線で示します。欠損が大きい場合は、連続しているように見せないよう線を途切れさせます。
- データが極端に偏っている場合。 対数スケールの軸を適用し、軸ラベルに変換内容を明記します(例:「Revenue (log scale)」)。