data-visualization について
データ可視化の選択と設計を支援するスキルで、チャート選び、Python のコード例、アクセシビリティへの配慮を扱います。データに合う図表を選び、結果を明確に伝えたいアナリストや開発者向けです。
主な機能
- 01データの関係に応じたチャート選択
- 02Python の描画コード例
- 03色とレイアウトの原則
- 04正確さと軸スケールの指針
- 05アクセシビリティのチェックリスト
活用シーン
- 01データセットに合うチャートの選択
- 02Python での可視化作成
- 03チャートの可読性と正確さの確認
- 04アクセシブルな可視化の準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ w95/ awesome-claude-corporate-skills --skill data-visualizationインストール後、Claude Code で/data-visualizationを入力して読み込まれたか確認します。
詳細
データ可視化スキル
効果的なデータ可視化を作成するための、グラフの選び方、Python による可視化コードのパターン、デザイン原則、アクセシビリティに関する考慮事項です。
グラフ選択ガイド
データの関係性に応じて選ぶ
| 表示する内容 | 最適なグラフ | 代替案 |
|---|---|---|
| 時間の経過に伴う傾向 | 折れ線グラフ | 面グラフ(累積値や構成を示す場合) |
| カテゴリ間の比較 | 縦棒グラフ | 横棒グラフ(カテゴリが多い場合)、ロリポップチャート |
| ランキング | 横棒グラフ | ドットプロット、傾斜グラフ(2 つの期間を比較する場合) |
| 全体に占める割合 | 積み上げ棒グラフ | ツリーマップ(階層構造の場合)、ワッフルチャート |
| 時間の経過に伴う構成 | 積み上げ面グラフ | 100%積み上げ棒グラフ(割合に注目する場合) |
| 分布 | ヒストグラム | 箱ひげ図(グループ間の比較)、バイオリンプロット、ストリッププロット |
| 相関(2 つの変数) | 散布図 | バブルチャート(3 つ目の変数をサイズで表す) |
| 相関(多数の変数) | ヒートマップ(相関行列) | ペアプロット |
| 地理的パターン | コロプレスマップ | バブルマップ、ヘックスマップ |
| 流れ/プロセス | サンキーダイアグラム | ファネルチャート(連続する段階) |
| 関係ネットワーク | ネットワークグラフ | コードダイアグラム |
| 目標に対する実績 | ブレットチャート | ゲージチャート(単一の KPI のみ) |
| 複数の KPI を同時に表示 | スモールマルチプル | グラフを個別に配置したダッシュボード |
特定のグラフを使わないほうがよい場合
- 円グラフ:カテゴリが 6 未満で、正確な割合より大まかな比較が重要な場合を除き、避けてください。人間は角度の比較が苦手です。代わりに棒グラフを使いましょう。
- 3D グラフ:使わないでください。認識を歪め、情報も増えません。
- 二軸グラフ:慎重に使ってください。相関があるように誤解させることがあります。使用する場合は、両方の軸に明確なラベルを付けてください。
- 積み上げ棒グラフ(カテゴリが多い場合):中央のセグメントを比較しにくくなります。代わりにスモールマルチプルやグループ化棒グラフを使いましょう。
- ドーナツグラフ:円グラフよりわずかに優れていますが、根本的な問題は同じです。単一の KPI を表示する場合に限って使いましょう。
Python による可視化コードのパターン
セットアップとスタイル
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import seaborn as sns
import pandas as pd
import numpy as np
# Professional style setup
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams.update({
'figure.figsize': (10, 6),
'figure.dpi': 150,
'font.size': 11,
'axes.titlesize': 14,
'axes.titleweight': 'bold',
'axes.labelsize': 11,
'xtick.labelsize': 10,
'ytick.labelsize': 10,
'legend.fontsize': 10,
'figure.titlesize': 16,
})
# Colorblind-friendly palettes
PALETTE_CATEGORICAL = ['#4C72B0', '#DD8452', '#55A868', '#C44E52', '#8172B3', '#937860']
PALETTE_SEQUENTIAL = 'YlOrRd'
PALETTE_DIVERGING = 'RdBu_r'
折れ線グラフ(時系列)
fig, ax = plt.subplots(figsize=(10, 6))
for label, group in df.groupby('category'):
ax.plot(group['date'], group['value'], label=label, linewidth=2)
ax.set_title('Metric Trend by Category', fontweight='bold')
ax.set_xlabel('Date')
ax.set_ylabel('Value')
ax.legend(loc='upper left', frameon=True)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# Format dates on x-axis
fig.autofmt_xdate()
plt.tight_layout()
plt.savefig('trend_chart.png', dpi=150, bbox_inches='tight')
棒グラフ(比較)
fig, ax = plt.subplots(figsize=(10, 6))
# Sort by value for easy reading
df_sorted = df.sort_values('metric', ascending=True)
bars = ax.barh(df_sorted['category'], df_sorted['metric'], color=PALETTE_CATEGORICAL[0])
# Add value labels
for bar in bars:
width = bar.get_width()
ax.text(width + 0.5, bar.get_y() + bar.get_height()/2,
f'{width:,.0f}', ha='left', va='center', fontsize=10)
ax.set_title('Metric by Category (Ranked)', fontweight='bold')
ax.set_xlabel('Metric Value')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')
ヒストグラム(分布)
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(df['value'], bins=30, color=PALETTE_CATEGORICAL[0], edgecolor='white', alpha=0.8)
# Add mean and median lines
mean_val = df['value'].mean()
median_val = df['value'].median()
ax.axvline(mean_val, color='red', linestyle='--', linewidth=1.5, label=f'Mean: {mean_val:,.1f}')
ax.axvline(median_val, color='green', linestyle='--', linewidth=1.5, label=f'Median: {median_val:,.1f}')
ax.set_title('Distribution of Values', fontweight='bold')
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
ax.legend()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.savefig('histogram.png', dpi=150, bbox_inches='tight')
ヒートマップ
fig, ax = plt.subplots(figsize=(10, 8))
# Pivot data for heatmap format
pivot = df.pivot_table(index='row_dim', columns='col_dim', values='metric', aggfunc='sum')
sns.heatmap(pivot, annot=True, fmt=',.0f', cmap='YlOrRd',
linewidths=0.5, ax=ax, cbar_kws={'label': 'Metric Value'})
ax.set_title('Metric by Row Dimension and Column Dimension', fontweight='bold')
ax.set_xlabel('Column Dimension')
ax.set_ylabel('Row Dimension')
plt.tight_layout()
plt.savefig('heatmap.png', dpi=150, bbox_inches='tight')
スモールマルチプル
categories = df['category'].unique()
n_cats = len(categories)
n_cols = min(3, n_cats)
n_rows = (n_cats + n_cols - 1) // n_cols
fig, axes = plt.subplots(n_rows, n_cols, figsize=(5*n_cols, 4*n_rows), sharex=True, sharey=True)
axes = axes.flatten() if n_cats > 1 else [axes]
for i, cat in enumerate(categories):
ax = axes[i]
subset = df[df['category'] == cat]
ax.plot(subset['date'], subset['value'], color=PALETTE_CATEGORICAL[i % len(PALETTE_CATEGORICAL)])
ax.set_title(cat, fontsize=12)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# Hide empty subplots
for j in range(i+1, len(axes)):
axes[j].set_visible(False)
fig.suptitle('Trends by Category', fontsize=14, fontweight='bold', y=1.02)
plt.tight_layout()
plt.savefig('small_multiples.png', dpi=150, bbox_inches='tight')
数値フォーマット用ヘルパー
def format_number(val, format_type='number'):
"""Format numbers for chart labels."""
if format_type == 'currency':
if abs(val) >= 1e9:
return f'${val/1e9:.1f}B'
elif abs(val) >= 1e6:
return f'${val/1e6:.1f}M'
elif abs(val) >= 1e3:
return f'${val/1e3:.1f}K'
else:
return f'${val:,.0f}'
elif format_type == 'percent':
return f'{val:.1f}%'
elif format_type == 'number':
if abs(val) >= 1e9:
return f'{val/1e9:.1f}B'
elif abs(val) >= 1e6:
return f'{val/1e6:.1f}M'
elif abs(val) >= 1e3:
return f'{val/1e3:.1f}K'
else:
return f'{val:,.0f}'
return str(val)
# Usage with axis formatter
ax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x, p: format_number(x, 'currency')))
Plotly によるインタラクティブなグラフ
import plotly.express as px
import plotly.graph_objects as go
# Simple interactive line chart
fig = px.line(df, x='date', y='value', color='category',
title='Interactive Metric Trend',
labels={'value': 'Metric Value', 'date': 'Date'})
fig.update_layout(hovermode='x unified')
fig.write_html('interactive_chart.html')
fig.show()
# Interactive scatter with hover data
fig = px.scatter(df, x='metric_a', y='metric_b', color='category',
size='size_metric', hover_data=['name', 'detail_field'],
title='Correlation Analysis')
fig.show()
デザイン原則
色
- 目的を持って色を使う:色はデータを表すために使い、装飾には使わないでください
- 伝えたい要点を強調する:重要な知見には明るいアクセントカラーを使い、それ以外はすべてグレーにします
- 連続データ:順序のある値には、単一色相のグラデーション(明色から暗色)を使います
- 発散データ:意味のある中心値を持つデータには、中間点を中立色とした 2 色相のグラデーションを使います
- カテゴリデータ:区別しやすい色相を使います。6~8 色を超えると混乱しやすくなります
- 赤と緑だけの配色を避ける:男性の 8%は赤緑色覚異常です。基本となる色の組み合わせには、青とオレンジを使いましょう
タイポグラフィ
- タイトルで知見を示す:「月別売上高」より「売上高が前年同期比で 23%増加」のほうが効果的です
- サブタイトルで背景を補足する:日付範囲、適用したフィルター、データソースを示します
- 軸ラベルを読みやすくする:可能な限り、ラベルを 90 度回転させないでください。代わりに短くするか、折り返します
- データラベルで正確さを補う:すべての棒ではなく、重要な点に付けます
- 注釈で強調する:テキスト注釈で特定の点を示します
レイアウト
- 不要な要素を減らす:情報を伝えないグリッド線、枠線、背景は取り除きます
- 意味のある順序で並べる:自然な順序(月、段階など)がある場合を除き、カテゴリはアルファベット順ではなく値順に並べます
- 適切なアスペクト比にする:時系列グラフは縦より横を長くし(3:1~2:1)、比較グラフはより正方形に近い形でもかまいません
- 余白を確保する:グラフを詰め込みすぎないでください。それぞれの可視化に十分なスペースを設けます
正確性
- 棒グラフは必ずゼロから始めます:95から100までの棒グラフでは、5%の差が誇張されます。
- 折れ線グラフではゼロ以外を基準にできます:変動の範囲に意味がある場合に使用します。
- パネル間でスケールを統一します:複数のグラフを比較する場合は、同じ軸範囲を使用します。
- 不確実性を示します:データが不確かな場合は、エラーバー、信頼区間、または範囲を表示します。
- 軸にラベルを付けます:数値の意味を読者に推測させないでください。
アクセシビリティに関する考慮事項
色覚多様性
- データ系列の区別を色だけに頼らないでください。
- パターン塗りつぶし、異なる線種(実線、破線、点線)、または直接ラベルを追加します。
- 色覚シミュレーター(例:Coblis、Sim Daltonism)で確認します。
- 色覚に配慮したパレットを使用します:
sns.color_palette("colorblind")
スクリーンリーダー
- グラフの重要な知見を説明する代替テキストを含めます。
- ビジュアライゼーションと併せて、代替となるデータテーブルを提供します。
- 意味の明確なタイトルとラベルを使用します。
一般的なアクセシビリティ
- データ要素と背景のコントラストを十分に確保します。
- ラベルの文字サイズは最低10pt、タイトルは最低12ptにします。
- 空間上の位置だけで情報を伝えないでください(ラベルを追加します)。
- 印刷も考慮します:白黒でもグラフは機能しますか?
アクセシビリティのチェックリスト
ビジュアライゼーションを共有する前に:
- 色がなくてもグラフが機能する(パターン、ラベル、または線種で系列を区別できる)
- 標準のズームレベルで文字が読みやすい
- タイトルがデータだけでなく、そこから得られる知見を説明している
- 軸に単位が付いている
- 凡例が明確で、データを隠さない位置にある
- データソースと対象期間が記載されている
コメント
Markdown 対応