【Matplotlib入門 第3回】データで物語を語る!円グラフ・箱ひげ図・ヒートマップとスタイルシート活用術 🎨

「データの全体に対する割合を、ひと目で分かりやすく見せたいな。」
「複数のデータグループのばらつき具合や中央値を、コンパクトに比較したい!」
「相関行列みたいな2次元のデータを、色を使って直感的に表現するにはどうすればいいの?」

こんにちは! Pythonデータ可視化探検隊、隊長のPythonistaです! 前回の第2回では、散布図、ヒストグラム、そして複数のグラフを一枚にまとめるサブプロットについて学びましたね。これで、データの関係性や分布を視覚化する基本的なスキルが身につきました。

シリーズ第3回の今回は、さらに一歩進んで、データをより深く分析し、説得力のある「物語」として伝えるための高度なグラフ作成テクニックを探求します! 具体的には、

  • データの構成比を示す円グラフ (Pie Chart)
  • データの統計的な要約を視覚化する箱ひげ図 (Box Plot)
  • 行列データを色で表現するヒートマップ (Heatmap)

といった、より専門的で情報量の多いグラフの描き方を解説します。さらに、作成したグラフ全体の見た目を一瞬でプロフェッショナルなものに変えるスタイルシート機能もご紹介します。さあ、Matplotlibでデータストーリーテリングの世界を楽しみましょう!


1. 準備:モジュールのインポートと、グラフを美しくする「スタイルシート」

まずは、今回もMatplotlibとNumPyをインポートしておきましょう。

import matplotlib.pyplot as plt
import numpy as np

# 日本語フォント設定(文字化け対策、環境に合わせて)
plt.rcParams['font.family'] = 'IPAexGothic'

ワンランク上の見た目に! plt.style.use()

本格的なグラフ作成に入る前に、便利な機能をご紹介します。Matplotlibには、グラフ全体の見た目(色使い、フォントサイズ、グリッド線の有無など)を統一されたテーマで簡単に変更できる「スタイルシート」機能があります。plt.style.use('スタイル名') をコードの最初に一度だけ呼び出すだけで、それ以降に作成される全てのグラフの見た目が変わります。

人気のスタイルには、'ggplot'(R言語の有名な描画ライブラリ風)、'seaborn-v0_8-whitegrid'(別の可視化ライブラリSeaborn風)、'fivethirtyeight'(ニュースサイト風)などがあります。

# スタイルシートを設定してみる (これ以降のグラフに適用される)
plt.style.use('ggplot')

# 簡単なテストプロット
x = [1, 2, 3, 4]
y = [4, 6, 5, 8]
plt.figure(figsize=(4,3))
plt.plot(x, y)
plt.title('ggplot Style')
plt.show()


たった1行でグラフの印象が大きく変わりますね!この記事では、以降'ggplot'スタイルを適用した状態で進めます。


2. 全体に対する割合を示す:円グラフ (plt.pie())

円グラフは、各カテゴリが全体の中でどれくらいの割合を占めているかを示すのに適したグラフです。アンケート結果の割合表示などによく使われます。

2.1. 基本的な円グラフの作成

plt.pie(x, labels=None, autopct=None)

  • x: 各要素の値をリストで指定します。合計が100%になるように自動で計算されます。
  • labels: 各要素のラベルを文字列のリストで指定します。
  • autopct: 各要素のパーセンテージを表示する際の書式を指定します。'%1.1f%%'とすると、小数点以下1桁のパーセント表示になります。

他にも、特定の要素を円から少し離して強調するexplodeや、円の開始角度を指定するstartangleといった便利な引数があります。

import matplotlib.pyplot as plt

plt.style.use('ggplot')

labels = ['A社', 'B社', 'C社', 'その他']
sizes = [45, 30, 15, 10] # 合計が100でなくてもOK
explode = (0.1, 0, 0, 0)  # 最初の要素'A社'だけを少し離す

plt.figure(figsize=(7, 7))
plt.pie(sizes, 
        explode=explode, 
        labels=labels, 
        autopct='%1.1f%%', # パーセンテージ表示
        startangle=90,       # 90度の位置から開始
        shadow=True)

plt.axis('equal')  # この指定で円が真円になる
plt.title('市場シェア')
plt.show()

円グラフを使う際の注意点: 円グラフは直感的ですが、カテゴリ数が多すぎる(目安として6以上)場合や、各カテゴリの値が似通っている場合には、要素間の比較が難しくなるため、棒グラフなど他のグラフを検討する方が良いとされています。


3. データの分布を要約する:箱ひげ図 (plt.boxplot())

箱ひげ図は、データのばらつき具合を統計的に要約して表現するグラフです。データの最小値、第1四分位数(Q1)、中央値(メディアン, Q2)、第3四分位数(Q3)、最大値を一度に示し、外れ値の存在も確認できます。複数のデータグループの分布を比較するのに非常に強力です。

3.1. 箱ひげ図の見方

かっこデータサイエンスぶろぐ総務省統計局の解説を見るとわかりやすいです。

3.2. 基本的な箱ひげ図の作成

複数のデータグループ(今回は正規分布に従う3つのグループ)を作成し、その分布を箱ひげ図で比較してみましょう。

import matplotlib.pyplot as plt
import numpy as np

plt.style.use('ggplot')
np.random.seed(10) # 結果を固定するためのシード

# 3つの異なるデータグループを生成
data1 = np.random.normal(100, 10, 200) # 平均100, 標準偏差10
data2 = np.random.normal(80, 20, 200)  # 平均80, 標準偏差20
data3 = np.random.normal(90, 15, 200)  # 平均90, 標準偏差15

data_to_plot = [data1, data2, data3]

plt.figure(figsize=(8, 6))
plt.boxplot(data_to_plot, patch_artist=True) # patch_artist=Trueで箱の塗りつぶしが可能になる

plt.title('データグループの分布比較')
plt.xticks([1, 2, 3], ['グループ1', 'グループ2', 'グループ3'])
plt.ylabel('値')
plt.show()

このグラフから、グループ2は中央値が低いものの、ばらつき(箱の長さやひげの範囲)が最も大きいことなどが一目で分かります。


4. 2次元データを色で表現:ヒートマップ (plt.imshow())

ヒートマップは、行列や2次元配列の各セルの値を、色の濃淡や種類の違いで表現するグラフです。相関行列の可視化や、地理的なデータの表現、Webサイトのクリック分析など、様々な場面で使われます。

pyplotには直接的なヒートマップ関数はありませんが、画像を表示するためのimshow()関数を応用することで簡単に作成できます。

import matplotlib.pyplot as plt
import numpy as np

plt.style.use('ggplot')
np.random.seed(1)

# 5x5のランダムな相関行列風データを作成
data_matrix = np.random.rand(5, 5)
data_matrix = (data_matrix + data_matrix.T) / 2 # 対称行列に
np.fill_diagonal(data_matrix, 1.0) # 対角成分を1に

labels = ['項目A', '項目B', '項目C', '項目D', '項目E']

fig, ax = plt.subplots(figsize=(7, 7))
# imshowでヒートマップを描画
im = ax.imshow(data_matrix, cmap='viridis') # cmapでカラーマップを指定

# カラーバーを追加
cbar = fig.colorbar(im)
cbar.set_label('相関係数', rotation=-90, va="bottom")

# 軸の目盛りとラベルを設定
ax.set_xticks(np.arange(len(labels)))
ax.set_yticks(np.arange(len(labels)))
ax.set_xticklabels(labels)
ax.set_yticklabels(labels)
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

# 各セルに数値を表示
for i in range(len(labels)):
    for j in range(len(labels)):
        text = ax.text(j, i, f"{data_matrix[i, j]:.2f}",
                       ha="center", va="center", color="w")

ax.set_title("相関行列のヒートマップ")
fig.tight_layout()
plt.show()



imshow()で2次元配列を画像としてプロットし、cmapで色付けのルールを指定します。さらに、カラーバーや各セルに数値を表示することで、より情報量の多いグラフになります。


まとめ:多彩なグラフで、データから深い洞察を得よう!

今回は、Matplotlib入門シリーズの第3回として、データ分析やプレゼンテーションで役立つ3つの応用的なグラフ作成方法を学びました。

  • 円グラフ (plt.pie()): 全体に対する構成比を視覚的に示す。
  • 箱ひげ図 (plt.boxplot()): データの分布(中央値、ばらつき、外れ値)を要約し、グループ間比較を容易にする。
  • ヒートマップ (plt.imshow()): 2次元データを色の濃淡で表現し、パターンを直感的に把握する。
  • そして、plt.style.use()を使うことで、グラフ全体の見た目を簡単に向上させる方法も学びました。

これらのグラフを使いこなせるようになると、単にデータを提示するだけでなく、データの中から意味のある「物語」や「洞察」を見つけ出し、それを他者に効果的に伝えることができるようになります。目的やデータの種類に応じて、最適なグラフを選択する能力は、データサイエンティストにとって非常に重要なスキルです。

Matplotlibの旅はまだまだ続きます。次回は、より細かなグラフのスタイル設定や、図の中に図を配置する方法、3Dプロットなど、さらに高度な可視化テクニックについて探求していくかもしれません。お楽しみに!

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀