Pythonデータ分析入門:Matplotlib・Seabornによるデータ可視化と面接対策

MatplotlibとSeabornを使ったPythonデータ可視化の実践ガイド。グラフ作成、スタイリング、サブプロット、面接でよく出る質問まで網羅的に解説します。

PythonのMatplotlibとSeabornによるデータ可視化チュートリアル

データアナリティクスの面接において、Pythonによるデータ可視化スキルは最も頻繁にテストされる能力の一つです。採用担当者は、生データから読みやすいチャートを作成し、そのデザイン選択についてプレッシャーの中で説明できる候補者を求めています。

本チュートリアルでは、アナリストやデータサイエンティストの技術面接で主流となっているMatplotlib 3.10とSeaborn 0.13を取り上げます。すべてのコード例はPython 3.12以降でそのまま実行可能です。

面接のポイント

データアナリティクスの面接の多くには、データセットから15分以内にビジュアライゼーションを作成するライブコーディングラウンドが含まれています。以下のパターンは、まさにそのような演習に直結するものです。

Pythonデータ可視化環境のセットアップ

チャートのコードを書く前に、まず適切な依存関係を準備する必要があります。クリーンな仮想環境を使用することで、Matplotlib、Seaborn、そして共通基盤であるNumPy/Pandas間のバージョン衝突を回避できます。

bash
# setup.sh
python -m venv venv
source venv/bin/activate
pip install matplotlib==3.10.8 seaborn==0.13.2 pandas numpy

以下のスクリプトで正しくインストールされたか確認できます。

python
# verify_install.py
import matplotlib
import seaborn as sns
import pandas as pd

print(f"Matplotlib: {matplotlib.__version__}")
print(f"Seaborn: {sns.__version__}")
print(f"Pandas: {pd.__version__}")

依存関係の確認が完了したら、次はMatplotlibの基礎に進みます。MatplotlibはすべてのSeabornチャートの基盤となるライブラリです。

Matplotlibの基礎:Figure、Axes、オブジェクト指向API

Matplotlibには、pyplotステートマシンとオブジェクト指向(OO)インターフェースの2つのAPIがあります。OO APIはすべての要素に対する明示的な制御を提供し、プロフェッショナルなコードベースや面接で求められる標準的な方法です。

python
# bar_chart_oo.py
import matplotlib.pyplot as plt
import numpy as np

# 四半期売上データのサンプル
quarters = ["Q1", "Q2", "Q3", "Q4"]
revenue = [42_000, 58_000, 51_000, 67_000]

# FigureとAxesを明示的に作成
fig, ax = plt.subplots(figsize=(8, 5))

# 指定した色で棒グラフを描画
ax.bar(quarters, revenue, color="#2563eb", width=0.5)

# 軸ラベルを明確に設定 — 面接官はこれをチェックする
ax.set_xlabel("Quarter")
ax.set_ylabel("Revenue (USD)")
ax.set_title("Quarterly Revenue — 2025")

# y軸をドル表示にフォーマット
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))

# 上と右のスパインを非表示にしてクリーンな見た目に
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("quarterly_revenue.png", dpi=150)
plt.show()

面接官が注目するポイントは、plt.plot() ではなく明示的な fig, ax の作成、読みやすい軸ラベル、フォーマットされた目盛り値、そして不要な装飾(余分なスパイン)の削除です。これらの細かな選択が、本番環境レベルの思考力を示すことになります。

比較分析のためのサブプロット構築

面接では、複数の指標を横並びで比較することが頻繁に求められます。subplots() 関数がグリッドレイアウトでこれを処理します。

python
# subplots_comparison.py
import matplotlib.pyplot as plt
import numpy as np

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
users = [1200, 1350, 1500, 1420, 1680, 1820]
revenue = [24_000, 27_000, 30_000, 28_400, 33_600, 36_400]

# x軸を共有する2つの横並びプロット
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), sharey=False)

# 左パネル:ユーザー増加の折れ線グラフ
ax1.plot(months, users, marker="o", color="#2563eb", linewidth=2)
ax1.set_title("Monthly Active Users")
ax1.set_ylabel("Users")
ax1.spines[["top", "right"]].set_visible(False)

# 右パネル:売上の棒グラフ
ax2.bar(months, revenue, color="#16a34a", width=0.5)
ax2.set_title("Monthly Revenue")
ax2.set_ylabel("Revenue (USD)")
ax2.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax2.spines[["top", "right"]].set_visible(False)

fig.suptitle("Product Metrics — H1 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("product_metrics.png", dpi=150)
plt.show()

sharey=False を使用することで、各パネルが独立してスケールされます。ドル建ての売上と件数としてのユーザー数は異なる桁数を持つためです。suptitle は両方のサブプロットの上に全体のタイトルを追加します。

面接でよくあるミス

多くの候補者があらゆるグラフに plt.plot() を使用してしまいます。面接官が第2軸の追加や特定のサブプロットの調整を求めたとき、pyplot方式では対応できなくなります。常に fig, ax = plt.subplots() をデフォルトにすることが推奨されます。

Seabornの統計プロット:分布から相関まで

SeabornはMatplotlibの上に構築されており、統計的な可視化に特化しています。Matplotlibでは手動の設定が必要な部分も、Seabornはデータ構造から妥当なデフォルト値を推論してくれます。

分布分析は面接で最も一般的なタスクの一つであり、単一の関数呼び出しで実現できます。

python
# distribution_analysis.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 2部門の給与データをシミュレート
np.random.seed(42)
data = pd.DataFrame({
    "salary": np.concatenate([
        np.random.normal(75_000, 12_000, 200),  # Engineering
        np.random.normal(65_000, 10_000, 150),  # Marketing
    ]),
    "department": ["Engineering"] * 200 + ["Marketing"] * 150
})

# 給与分布を比較するKDEプロット
fig, ax = plt.subplots(figsize=(10, 5))
sns.kdeplot(
    data=data,
    x="salary",
    hue="department",        # カテゴリで自動分割
    fill=True,               # 曲線の下を塗りつぶす
    alpha=0.4,
    palette=["#2563eb", "#dc2626"],
    ax=ax                    # 明示的なAxesにアタッチ
)

ax.set_title("Salary Distribution by Department")
ax.set_xlabel("Annual Salary (USD)")
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("salary_distribution.png", dpi=150)
plt.show()

hue パラメータがデータを自動的に分割し、fill=True により重複する領域が視覚化されます。このパターン(カテゴリ別の分布グループ化)は、ほぼすべてのアナリティクス面接で出題されます。

Data Analyticsの面接対策はできていますか?

インタラクティブなシミュレーター、flashcards、技術テストで練習しましょう。

相関行列のSeabornヒートマップ

相関ヒートマップは、数値変数間の関係を一目で明らかにします。面接官はこれを使って、候補者が多重共線性を特定したり、強い特徴量間の関係を見抜けるかをテストします。

python
# correlation_heatmap.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# ECメトリクスをシミュレート
np.random.seed(42)
n = 500
page_views = np.random.poisson(15, n)
time_on_site = page_views * 2.5 + np.random.normal(0, 5, n)
cart_adds = np.random.binomial(page_views, 0.3)
purchases = np.random.binomial(cart_adds, 0.4)

df = pd.DataFrame({
    "page_views": page_views,
    "time_on_site": time_on_site,
    "cart_adds": cart_adds,
    "purchases": purchases
})

# ピアソン相関を計算
corr_matrix = df.corr()

fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(
    corr_matrix,
    annot=True,              # セルに相関値を表示
    fmt=".2f",               # 小数点以下2桁
    cmap="RdBu_r",           # 0を中心とした発散カラーマップ
    vmin=-1, vmax=1,         # 一貫性のための固定スケール
    square=True,             # 正方形のセル
    linewidths=0.5,
    ax=ax
)

ax.set_title("E-commerce Metrics Correlation")
plt.tight_layout()
plt.savefig("correlation_heatmap.png", dpi=150)
plt.show()

発散型の RdBu_r カラーマップにより、正の相関は青、負の相関は赤で表現されます。これは面接官が期待する慣例です。vmin=-1vmax=1 を設定することで、実際のデータ範囲に関係なくカラースケールが解釈可能な状態を保ちます。

プロフェッショナルなプレゼンテーション向けのチャートスタイリング

Matplotlibのデフォルト出力は古い印象を与えます。数行の設定で、チャートをプレゼンテーション対応のビジュアルに変換でき、面接での細部への注意力を示すことができます。

python
# professional_styling.py
import matplotlib.pyplot as plt
import seaborn as sns

# Seabornの組み込みテーマを適用
sns.set_theme(
    style="whitegrid",       # グリッド線付きのクリーンな背景
    palette="muted",         # プロフェッショナルなカラーパレット
    font_scale=1.1           # やや大きめのテキスト
)

# Matplotlibのグローバル設定をオーバーライド
plt.rcParams.update({
    "figure.facecolor": "white",
    "axes.facecolor": "white",
    "font.family": "sans-serif",
    "axes.titlesize": 14,
    "axes.labelsize": 12,
})

スクリプトの先頭で sns.set_theme() を適用すると、以降のすべてのチャートに一貫したスタイリングが反映されます。面接中にチャートごとのフォーマット調整に時間を費やすことを避けられます。

バージョンに関する注意

Seaborn 0.13では、set_style()set_palette() の個別呼び出しが非推奨になりました。統合された set_theme() 関数がこの両方を置き換えます。Stack Overflowの古い回答には依然として非推奨のAPIが記載されている場合がありますが、2026年の面接では使用を避けることが推奨されます。

データ可視化に関するよくある面接質問

コーディング以外にも、面接官は可視化のベストプラクティスに関する概念的な理解を問います。以下の質問は、データアナリティクスおよびデータサイエンスの面接で一貫して出題されるものです。

棒グラフと折れ線グラフはどのように使い分けるべきか? 棒グラフは離散的なカテゴリ(部門、製品タイプ、地域)間の比較を表示します。折れ線グラフは連続的または順序付きの区間(時系列、逐次測定)における傾向を示します。順序のないカテゴリに折れ線グラフを使用すると、隣接するバー間に誤った関係を暗示することになります。

誤解を招くチャートとは何か? 切り詰められたy軸、異なるスケールの二重y軸、2Dデータに対する3D効果、恣意的に選択された時間範囲は、すべて認知を歪めます。修正方法は、棒グラフではy軸をゼロから開始し、軸を明示的にラベル付けし、データを隠す装飾要素を避けることです。

カラーパレットの選択がデータ解釈にどう影響するか? 連続パレット(明→暗)は、温度や収益など順序付きデータに適しています。発散パレット(中立点で交わる2色相)は、損益や相関係数などの中点からの偏差を強調します。カテゴリカルパレットは、無関係なグループに異なる色相を使用します。色覚異常対応パレット(Seabornの colorblindmuted など)はアクセシビリティを確保し、シニア候補者を見分けるポイントとなります。

plt.show()plt.savefig() の違いは? plt.show() はインタラクティブウィンドウに図を描画し、その後figure状態をクリアします。plt.savefig() は状態をクリアせずにファイルに書き込みます。show() の後に savefig() を呼ぶと空のファイルが生成されます(よくあるバグ)。正しい順序は、まず savefig() を実行し、次に show() です。

総合演習:エンドツーエンドの面接課題

典型的な持ち帰り課題やライブコーディング演習では、データの読み込み、クリーニング、そして複数のチャートタイプが組み合わされます。以下の例は、アナリティクスチームの実際の面接課題を再現したものです。

python
# interview_exercise.py
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

sns.set_theme(style="whitegrid", palette="muted", font_scale=1.05)

# 12ヶ月のプロダクトデータをシミュレート
np.random.seed(42)
months = pd.date_range("2025-01", periods=12, freq="MS")
df = pd.DataFrame({
    "month": months,
    "revenue": np.cumsum(np.random.normal(5000, 2000, 12)) + 50_000,
    "customers": np.cumsum(np.random.poisson(50, 12)) + 500,
    "churn_rate": np.clip(np.random.normal(0.05, 0.015, 12), 0.01, 0.12)
})

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# パネル1:売上トレンド
axes[0].plot(df["month"], df["revenue"], marker="o", color="#2563eb")
axes[0].set_title("Revenue Trend")
axes[0].set_ylabel("Revenue (USD)")
axes[0].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
axes[0].tick_params(axis="x", rotation=45)
axes[0].spines[["top", "right"]].set_visible(False)

# パネル2:顧客増加
axes[1].bar(df["month"], df["customers"], color="#16a34a", width=20)
axes[1].set_title("Customer Growth")
axes[1].set_ylabel("Total Customers")
axes[1].tick_params(axis="x", rotation=45)
axes[1].spines[["top", "right"]].set_visible(False)

# パネル3:解約率と閾値ライン
axes[2].plot(df["month"], df["churn_rate"], marker="s", color="#dc2626")
axes[2].axhline(y=0.05, color="gray", linestyle="--", label="Target: 5%")
axes[2].set_title("Monthly Churn Rate")
axes[2].set_ylabel("Churn Rate")
axes[2].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"{x:.1%}"))
axes[2].tick_params(axis="x", rotation=45)
axes[2].spines[["top", "right"]].set_visible(False)
axes[2].legend()

fig.suptitle("Product Dashboard — FY 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("interview_dashboard.png", dpi=150)
plt.show()

この演習では、統一されたレイアウト内で3つのチャートタイプ、適切な軸フォーマット、解約目標の参照ライン、一貫したスタイリングを実演しています。これらはまさに面接官が採点する要素です。

まとめ

  • Matplotlibのオブジェクト指向API(fig, ax = plt.subplots())は完全な制御を提供し、プロフェッショナルおよび面接の場で求められる標準的な方法です
  • Seabornの hue パラメータと組み込みの統計関数(KDE、ヒートマップ)は、最小限のコードでグループ分析を処理します
  • 発散カラーマップと固定スケール(vmin=-1, vmax=1)を使用した相関ヒートマップは、アナリティクス面接の定番です
  • 空の出力ファイルを避けるために、必ず savefig()show() の前に呼び出すことが重要です
  • クリーンなスタイリング(スパインの削除、フォーマットされた目盛りラベル、明示的なタイトル)は、面接官に本番品質の思考力を示します
  • 時間制限下でのマルチパネルダッシュボード構築を練習することが推奨されます。ほとんどのライブコーディングラウンドでは、可視化タスクごとに10〜15分が割り当てられます

タグ

#python
#matplotlib
#seaborn
#data-visualization
#data-analytics
#interview

共有

関連記事