📋 このステップで学ぶこと
- ヒートマップ(heatmap)の基本と仕組み
- 相関係数の意味と計算方法
- 相関係数行列の可視化
- アノテーション(数値表示)の追加
- カラーマップの選択と使い分け
- マスクを使った三角形ヒートマップ
🔥 1. ヒートマップとは
ヒートマップの概要
ヒートマップ(Heat Map)は、データの値を色の濃淡で表現するグラフです。「ヒート(熱)」という名前の通り、値が大きいところは「熱い色(赤)」、小さいところは「冷たい色(青)」で表示することが多いです。
ヒートマップは、特に多くの変数間の関係を一目で把握したいときに威力を発揮します。数値の表(マトリックス)を見ても傾向がわかりにくいですが、色で表現すると「どこが高いか」「どこが低いか」が直感的にわかります。
💡 身近なヒートマップの例
ヒートマップは日常でもよく見かけます:
天気予報の気温マップ:暑い地域が赤、寒い地域が青
Webサイトのクリックマップ:よくクリックされる場所が赤
渋滞情報:混んでいる道路が赤、空いている道路が緑
サーモグラフィ:体温の高い部分が赤く表示
🎨 ヒートマップの特徴と用途
| 特徴 |
説明 |
具体例 |
| 色で直感的に理解 |
数値を見なくても傾向がわかる |
赤い部分が多い=高い値が多い |
| 多変数を同時に比較 |
複数の変数の関係を一度に表示 |
10個の変数の相関を1つの図で |
| パターンの発見 |
データの傾向やグループを視覚化 |
似た特徴を持つグループを発見 |
| 異常値の発見 |
他と違う色が目立つ |
異常に高い/低い値を即座に発見 |
【ヒートマップのイメージ】
行列形式のデータを色で表現:
変数A 変数B 変数C 変数D
変数A 1.0 0.8 0.2 -0.3
変数B 0.8 1.0 0.1 -0.5
変数C 0.2 0.1 1.0 0.7
変数D -0.3 -0.5 0.7 1.0
↓ ヒートマップで表示すると…
変数A 変数B 変数C 変数D
変数A 🔴 🟠 🟡 🔵
変数B 🟠 🔴 🟡 🔵
変数C 🟡 🟡 🔴 🟠
変数D 🔵 🔵 🟠 🔴
🔴 = 強い正の値(赤)
🟠 = 中程度の正の値(オレンジ)
🟡 = 弱い値/ゼロ付近(白〜黄)
🔵 = 負の値(青)
→ 色を見るだけで「どの変数同士が関係あるか」がわかる!
📊 2. 相関係数を理解しよう
相関係数とは何か
ヒートマップで最もよく使われるのが相関係数(correlation coefficient)の可視化です。相関係数とは、2つの変数がどれくらい一緒に変化するかを-1から1の数値で表したものです。
例えば、「身長が高い人ほど体重も重い傾向がある」という関係があれば、身長と体重には正の相関があると言います。逆に、「運動時間が長い人ほど体脂肪率が低い傾向がある」なら負の相関があります。
📊 相関係数の読み方
| 相関係数の範囲 |
意味 |
具体例 |
| 0.7 〜 1.0 |
強い正の相関(一方が増えると他方も増える) |
身長と体重、勉強時間とテスト点数 |
| 0.4 〜 0.7 |
中程度の正の相関 |
広告費と売上 |
| 0.2 〜 0.4 |
弱い正の相関 |
年齢と年収(傾向はあるが例外も多い) |
| -0.2 〜 0.2 |
ほぼ相関なし(無関係) |
血液型と性格 |
| -0.7 〜 -0.4 |
中程度の負の相関 |
価格と販売数 |
| -1.0 〜 -0.7 |
強い負の相関(一方が増えると他方は減る) |
運動時間と体脂肪率 |
⚠️ 相関と因果は違う!
相関係数が高くても、因果関係があるとは限りません。これはデータ分析でよくある間違いです。
例:アイスクリームの売上と水難事故の件数は相関が高いですが、「アイスを食べると溺れる」わけではありません。両方とも「夏になると増える」という共通の原因(気温)があるだけです。
相関は「一緒に変化する傾向」を示すだけで、「原因と結果」を示すものではないことを覚えておきましょう。
相関係数行列とは
複数の変数があるとき、すべてのペアの相関係数を計算して表にまとめたものを相関係数行列(correlation matrix)と呼びます。この行列をヒートマップで表示すると、どの変数同士が関係あるかが一目でわかります。
【相関係数行列のイメージ】
例:売上データの変数(売上、広告費、従業員数、店舗面積)
売上 広告費 従業員数 店舗面積
売上 1.00 0.85 0.72 0.68
広告費 0.85 1.00 0.45 0.52
従業員数 0.72 0.45 1.00 0.78
店舗面積 0.68 0.52 0.78 1.00
【読み方】
・対角線は常に1.00(自分自身との相関)
・売上と広告費 = 0.85(強い正の相関)→ 広告を増やすと売上も増える傾向
・従業員数と店舗面積 = 0.78(強い正の相関)→ 大きい店舗は従業員も多い
・対称行列(上三角と下三角が同じ値)
🔧 3. 基本的なヒートマップの作成
Seabornでヒートマップを作る
ヒートマップはSeabornのsns.heatmap()関数で簡単に作成できます。まずは基本的な使い方を見てみましょう。
📝 ステップ1: ライブラリの読み込み
ヒートマップ作成に必要なライブラリを読み込みます。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
【各ライブラリの役割】
import seaborn as sns
├── Seaborn: 統計的データ可視化ライブラリ
└── sns.heatmap()でヒートマップを作成
import matplotlib.pyplot as plt
├── Matplotlib: グラフ描画の基盤ライブラリ
└── グラフサイズやタイトルの設定に使用
import numpy as np
├── NumPy: 数値計算ライブラリ
└── 配列操作やマスク作成に使用
import pandas as pd
├── Pandas: データ分析ライブラリ
└── DataFrameで相関係数を計算
📝 ステップ2: サンプルデータの用意
まずは簡単なランダムデータでヒートマップを作ってみましょう。
# 5×5のランダムな数値データを生成
data = np.random.rand(5, 5)
【コードの意味】
np.random.rand(5, 5)
├── np.random: NumPyの乱数生成モジュール
├── rand(): 0〜1の一様乱数を生成
├── (5, 5): 5行5列の2次元配列を作成
└── 結果: [[0.23, 0.71, …], [0.52, 0.38, …], …]
【なぜランダムデータ?】
・まずは簡単なデータで動作確認
・実際の分析では、これがDataFrameや相関係数行列になる
📝 ステップ3: ヒートマップの描画
sns.heatmap()関数でヒートマップを作成します。
# グラフのサイズを設定
plt.figure(figsize=(8, 6))
# ヒートマップを作成
sns.heatmap(data)
# タイトルを追加
plt.title(‘基本的なヒートマップ’, fontsize=16, fontweight=’bold’, pad=15)
# レイアウトを自動調整
plt.tight_layout()
# グラフを表示
plt.show()
【sns.heatmap()の基本構文】
sns.heatmap(data)
├── data: 2次元配列またはDataFrame
└── 値に応じた色でセルを塗りつぶす
【他の関数の意味】
plt.figure(figsize=(8, 6))
└── グラフのサイズを設定(幅8インチ、高さ6インチ)
plt.title(…, pad=15)
└── pad: タイトルとグラフの間隔
plt.tight_layout()
└── 要素が重ならないよう自動調整
【この時点での出力】
・色のグラデーションでデータが表示される
・右側にカラーバー(色と値の対応)が表示される
・ただし、数値は表示されていない
数値を表示する(アノテーション)
ヒートマップに数値(アノテーション)を表示すると、正確な値も確認できます。annot=Trueを指定するだけです。
sns.heatmap(
data,
annot=True, # 数値を表示
fmt=’.2f’, # 小数点以下2桁で表示
cmap=’coolwarm’ # カラーマップを指定
)
【主要パラメータの詳細】
annot=True
├── annot: annotation(注釈)の略
├── True: 各セルに数値を表示
└── False: 数値を表示しない(デフォルト)
fmt=’.2f’
├── fmt: format(書式)の略
├── ‘.2f’: 小数点以下2桁の浮動小数点数
├── ‘.0f’: 整数表示
├── ‘.1%’: パーセント表示(小数1桁)
└── ‘d’: 整数(int型用)
cmap=’coolwarm’
├── cmap: colormap(カラーマップ)の略
├── ‘coolwarm’: 青→白→赤のグラデーション
├── 相関係数の可視化に最適
└── 負の値=青、ゼロ=白、正の値=赤
完成コード:数値付きヒートマップ
※ コードが長い場合は横スクロールできます
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 5×5のランダムデータを生成
data = np.random.rand(5, 5)
# グラフのサイズを設定
plt.figure(figsize=(10, 8))
# ヒートマップを作成(数値表示付き)
sns.heatmap(
data,
annot=True, # 数値を表示
fmt=’.2f’, # 小数点以下2桁
cmap=’coolwarm’ # 青→白→赤のカラーマップ
)
# タイトル
plt.title(‘数値付きヒートマップ’, fontsize=16, fontweight=’bold’, pad=15)
# レイアウト調整
plt.tight_layout()
# 表示
plt.show()
🔗 4. 相関係数行列の可視化
相関係数行列を計算する
実際のデータ分析では、DataFrameから相関係数行列を計算してヒートマップにします。Pandasの.corr()メソッドで簡単に計算できます。
📝 ステップ1: データの読み込み
Seabornに付属のサンプルデータセット「tips」を使います。
# Seabornのサンプルデータを読み込み
tips = sns.load_dataset(‘tips’)
# データの確認
print(tips.head())
【tipsデータセットの内容】
tips = sns.load_dataset(‘tips’)
├── レストランのチップに関するデータ
└── 244件のレコード
【含まれる列】
・total_bill: 合計金額
・tip: チップの金額
・sex: 性別
・smoker: 喫煙者かどうか
・day: 曜日
・time: 時間帯(Lunch/Dinner)
・size: 人数
【数値データのみが相関計算の対象】
・total_bill, tip, size(数値)→ 相関計算可能
・sex, smoker, day, time(カテゴリ)→ 相関計算不可
📝 ステップ2: 数値データのみを抽出
相関係数は数値データ同士でしか計算できないため、数値列のみを抽出します。
# 数値データのみを抽出
numeric_data = tips.select_dtypes(include=[‘float64’, ‘int64’])
print(numeric_data.head())
【コードの意味】
tips.select_dtypes(include=[‘float64’, ‘int64’])
├── select_dtypes(): 特定のデータ型の列だけを抽出
├── include: 含めるデータ型を指定
├── ‘float64’: 浮動小数点数(小数を含む数値)
├── ‘int64’: 整数
└── 結果: total_bill, tip, size の3列だけが残る
【なぜこの処理が必要?】
・.corr()は数値データにしか適用できない
・カテゴリデータ(sex, dayなど)を含めるとエラーになる
・自動的に数値列だけを抽出することで、安全に相関を計算
📝 ステップ3: 相関係数行列を計算
.corr()メソッドで相関係数行列を計算します。
# 相関係数行列を計算
correlation = numeric_data.corr()
print(correlation)
【出力結果】
total_bill tip size
total_bill 1.000000 0.675734 0.598315
tip 0.675734 1.000000 0.489299
size 0.598315 0.489299 1.000000
【読み方】
・対角線は常に1.0(自分自身との相関)
・total_billとtip = 0.68(中〜強い正の相関)
→ 会計金額が高いほどチップも高い傾向
・total_billとsize = 0.60(中程度の正の相関)
→ 人数が多いほど会計金額も高い傾向
・tipとsize = 0.49(中程度の正の相関)
→ 人数が多いほどチップも高い傾向
📝 ステップ4: ヒートマップで可視化
計算した相関係数行列をヒートマップで表示します。
sns.heatmap(
correlation,
annot=True, # 数値を表示
fmt=’.2f’, # 小数点以下2桁
cmap=’coolwarm’, # 青→白→赤の配色
center=0, # 0を白(中心)に設定
square=True, # セルを正方形に
linewidths=1, # セル間の線の太さ
cbar_kws={‘shrink’: 0.8} # カラーバーのサイズ
)
【追加パラメータの詳細】
center=0
├── カラーマップの中心値を指定
├── 0を中心にすると、白が「相関なし」を表す
├── 正の相関=赤系、負の相関=青系が直感的
└── 相関係数(-1〜1)の可視化では必須
square=True
├── 各セルを正方形にする
├── False: セルが長方形になる場合がある
└── True: 見た目が整う
linewidths=1
├── セル間の境界線の太さ
├── 0: 線なし
├── 1〜2: 適度な線
└── 線があるとセルが識別しやすい
cbar_kws={‘shrink’: 0.8}
├── cbar_kws: カラーバーのキーワード引数
├── shrink: カラーバーの長さを調整
├── 0.8: 元のサイズの80%
└── 図全体のバランスを調整
完成コード:相関係数行列のヒートマップ
※ コードが長い場合は横スクロールできます
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 数値データのみ抽出
numeric_data = tips.select_dtypes(include=[‘float64’, ‘int64′])
# 相関係数行列を計算
correlation = numeric_data.corr()
# グラフのサイズを設定
plt.figure(figsize=(10, 8))
# ヒートマップで可視化
sns.heatmap(
correlation,
annot=True, # 数値を表示
fmt=’.2f’, # 小数点以下2桁
cmap=’coolwarm’, # 青→白→赤の配色
center=0, # 0を白に設定
square=True, # セルを正方形に
linewidths=1, # セル間の線の太さ
cbar_kws={‘shrink’: 0.8} # カラーバーのサイズ
)
# タイトル
plt.title(‘tipsデータの相関係数行列’, fontsize=16, fontweight=’bold’, pad=15)
# レイアウト調整
plt.tight_layout()
# 表示
plt.show()
🎨 相関ヒートマップの読み方
| 色 |
意味 |
解釈 |
| 濃い赤 |
強い正の相関(0.7〜1.0) |
一方が増えると他方も増える |
| 薄い赤 |
中〜弱い正の相関(0.2〜0.7) |
ある程度一緒に増減する傾向 |
| 白 |
相関なし(-0.2〜0.2) |
2つの変数は無関係 |
| 薄い青 |
中〜弱い負の相関(-0.7〜-0.2) |
ある程度逆に動く傾向 |
| 濃い青 |
強い負の相関(-1.0〜-0.7) |
一方が増えると他方は減る |
🎨 5. カラーマップの選択
カラーマップとは
カラーマップ(colormap)は、数値を色に変換するルールです。どのカラーマップを選ぶかで、ヒートマップの見た目と読みやすさが大きく変わります。
カラーマップは大きく発散型と順序型の2種類に分けられます。データの性質に応じて適切なものを選びましょう。
🎨 カラーマップの種類と使い分け
| カラーマップ |
種類 |
配色 |
適した用途 |
| coolwarm |
発散型 |
青→白→赤 |
相関係数(-1〜1)、増減率 |
| RdYlGn |
発散型 |
赤→黄→緑 |
良い/悪いの評価、目標達成率 |
| viridis |
順序型 |
紫→緑→黄 |
0以上の値、色覚バリアフリー |
| Blues |
順序型 |
白→青 |
0以上の単調増加データ |
| YlOrRd |
順序型 |
黄→オレンジ→赤 |
ヒートマップ(熱さの表現) |
【発散型 vs 順序型の使い分け】
■ 発散型カラーマップ(coolwarm, RdYlGn)
├── 中心値がある場合に使用
├── 例: 相関係数(-1〜1で、0が中心)
├── 例: 前年比(-50%〜+50%で、0%が中心)
└── 中心からのズレが色の濃さでわかる
■ 順序型カラーマップ(viridis, Blues)
├── 0から始まる単調なデータに使用
├── 例: 売上(0円〜100万円)
├── 例: 人数(0人〜1000人)
└── 値が大きいほど色が濃い
【迷ったときの選び方】
・相関係数 → coolwarm(定番)
・それ以外で迷ったら → viridis(色覚バリアフリー)
カラーマップ比較のコード
※ コードが長い場合は横スクロールできます
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# サンプルデータ
np.random.seed(42)
data = np.random.rand(6, 6)
# 比較するカラーマップ
colormaps = [‘coolwarm’, ‘viridis’, ‘RdYlGn’, ‘Blues’]
# 2×2のサブプロット
fig, axes = plt.subplots(2, 2, figsize=(14, 12))
axes = axes.flatten() # 2次元配列を1次元に変換
# 各カラーマップでヒートマップを作成
for i, cmap in enumerate(colormaps):
sns.heatmap(
data,
annot=True,
fmt=’.2f’,
cmap=cmap,
ax=axes[i], # 描画先のサブプロットを指定
cbar_kws={‘shrink’: 0.8}
)
axes[i].set_title(f’カラーマップ: {cmap}’, fontsize=14, fontweight=’bold’)
# 全体のタイトル
plt.suptitle(‘カラーマップの比較’, fontsize=18, fontweight=’bold’)
# レイアウト調整
plt.tight_layout()
plt.show()
🔺 6. マスクで三角形ヒートマップを作る
なぜマスクを使うのか
相関係数行列は対称行列です。つまり、対角線を境に上半分と下半分が同じ値になります。同じ情報が2回表示されているのは冗長なので、マスクを使って半分だけ表示するとすっきりします。
【なぜ対称行列になるのか】
相関係数の性質:
・AとBの相関 = BとAの相関
・つまり correlation[A][B] = correlation[B][A]
例:
売上 広告費 従業員数
売上 1.00 0.85 0.72
広告費 0.85 1.00 0.45 ← 上三角と下三角が同じ
従業員 0.72 0.45 1.00
↓ マスクを適用すると…
売上 広告費 従業員数
売上 1.00
広告費 0.85 1.00
従業員 0.72 0.45 1.00
→ 情報量は同じなのに、すっきり見やすくなる!
📝 マスクの作り方
NumPyのnp.triu()関数を使って、上三角部分をマスクします。
# 相関係数行列と同じサイズのTrue/False配列を作成
# np.triu = 上三角(upper triangle)を取得
mask = np.triu(np.ones_like(correlation, dtype=bool))
【コードの意味】
np.ones_like(correlation, dtype=bool)
├── ones_like: correlationと同じ形状の配列を作成
├── dtype=bool: 要素をTrue/False(ブール値)にする
└── 結果: すべてがTrueの5×5配列
np.triu(…)
├── triu: upper triangular(上三角)の略
├── 対角線より上の要素をそのまま残す
├── 対角線より下の要素をFalseにする
└── 結果: 上三角がTrue、下三角がFalseのマスク
【マスクの仕組み】
[[True, True, True], ← 上三角をマスク(非表示)
[False, True, True],
[False, False, True]]
・True: その位置を非表示にする
・False: その位置を表示する
完成コード:三角形ヒートマップ
※ コードが長い場合は横スクロールできます
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 数値データのみ抽出
numeric_data = tips.select_dtypes(include=[‘float64’, ‘int64′])
# 相関係数行列を計算
correlation = numeric_data.corr()
# 上三角をマスク(非表示に)
mask = np.triu(np.ones_like(correlation, dtype=bool))
# グラフのサイズを設定
plt.figure(figsize=(10, 8))
# マスク付きヒートマップ
sns.heatmap(
correlation,
annot=True, # 数値を表示
fmt=’.2f’, # 小数点以下2桁
cmap=’coolwarm’, # 青→白→赤
center=0, # 0を白に
square=True, # 正方形のセル
linewidths=2, # セル間の線を太めに
linecolor=’white’, # 線の色を白に
mask=mask, # マスクを適用(上三角を非表示)
cbar_kws={‘shrink’: 0.8}
)
# タイトル
plt.title(‘相関係数行列(三角形表示)’, fontsize=16, fontweight=’bold’, pad=15)
# レイアウト調整
plt.tight_layout()
plt.show()
🎯 7. 実践例:irisデータセットの相関分析
完成度の高いヒートマップを作る
ここまで学んだテクニックを組み合わせて、実践的な相関分析を行います。irisデータセット(アヤメの花の計測データ)を使います。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# アヤメのデータセットを読み込み
iris = sns.load_dataset(‘iris’)
# 数値データのみ抽出
numeric_data = iris.select_dtypes(include=[‘float64′])
# 相関係数行列を計算
correlation = numeric_data.corr()
# 上三角をマスク
mask = np.triu(np.ones_like(correlation, dtype=bool))
# グラフのサイズを設定
plt.figure(figsize=(12, 10))
# 完成度の高いヒートマップ
sns.heatmap(
correlation,
annot=True, # 数値を表示
fmt=’.3f’, # 小数点以下3桁
cmap=’coolwarm’, # 青→白→赤
center=0, # 0を白に
square=True, # 正方形のセル
linewidths=2, # セル間の線
linecolor=’white’, # 線の色
mask=mask, # 上三角をマスク
cbar_kws={
‘label’: ‘相関係数’, # カラーバーにラベル
‘shrink’: 0.8,
‘aspect’: 20
},
annot_kws={
‘size’: 12, # 数値のフォントサイズ
‘weight’: ‘bold’ # 数値を太字に
}
)
# タイトル
plt.title(‘アヤメデータの特徴量相関分析’, fontsize=18, fontweight=’bold’, pad=20)
# 軸ラベルを見やすく
plt.xticks(rotation=45, ha=’right’, fontsize=11)
plt.yticks(rotation=0, fontsize=11)
# レイアウト調整
plt.tight_layout()
# 表示
plt.show()
# 強い相関を自動で見つける
print(“\n📊 強い相関(|r| > 0.8)を発見:”)
for i in range(len(correlation.columns)):
for j in range(i+1, len(correlation.columns)):
r = correlation.iloc[i, j]
if abs(r) > 0.8:
print(f” {correlation.columns[i]} ⇔ {correlation.columns[j]}: {r:.3f}”)
【出力例】
📊 強い相関(|r| > 0.8)を発見:
petal_length ⇔ petal_width: 0.963
sepal_length ⇔ petal_length: 0.872
sepal_length ⇔ petal_width: 0.818
【解釈】
・花びら(petal)の長さと幅は非常に強い相関(0.96)
→ 花びらが長いほど幅も広い傾向
・がく片(sepal)の長さと花びらの長さ/幅も強い相関
→ 大きい花は全体的に大きい傾向
📝 STEP 15 のまとめ
✅ このステップで学んだこと
| トピック |
重要ポイント |
| ヒートマップとは |
数値を色の濃淡で表現するグラフ。多変数の関係を一目で把握 |
| 相関係数 |
-1〜1で変数間の関係の強さを表す。0.7以上で強い相関 |
| annot=True |
セル内に数値を表示。fmt=’.2f’で小数2桁 |
| cmap(カラーマップ) |
相関係数にはcoolwarm、順序データにはviridis |
| center=0 |
相関係数では0を白(中心)に設定 |
| マスク |
np.triu()で上三角を非表示にして見やすく |
💡 最重要ポイント
ヒートマップは多変数の関係を一目で把握できる強力なツールです。特に相関係数行列の可視化では、以下の設定がベストプラクティスです:
cmap=’coolwarm’ + center=0 + mask(上三角)
ただし、相関が高くても因果関係があるとは限らないことを忘れずに!次のステップでは、ペアプロットで全変数の関係を一度に可視化する方法を学びます。
📝 実践演習
演習 1
基礎
5×5のランダムデータでヒートマップを作成し、数値を表示してください。カラーマップは’viridis’を使用してください。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# ランダムデータを生成
np.random.seed(42)
data = np.random.rand(5, 5)
# グラフのサイズを設定
plt.figure(figsize=(8, 6))
# ヒートマップを作成
sns.heatmap(
data,
annot=True, # 数値を表示
fmt=’.2f’, # 小数点以下2桁
cmap=’viridis’ # カラーマップを指定
)
# タイトル
plt.title(‘ランダムデータのヒートマップ’, fontsize=16, fontweight=’bold’, pad=15)
# レイアウト調整
plt.tight_layout()
plt.show()
ポイント:annot=Trueで数値表示、cmap=’viridis’で紫→緑→黄のカラーマップを使用しています。
演習 2
応用
tipsデータセットの数値変数の相関係数行列を計算し、coolwarmカラーマップでヒートマップを作成してください。center=0を指定してください。
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 数値データ抽出
numeric_data = tips.select_dtypes(include=[‘float64’, ‘int64′])
# 相関係数計算
correlation = numeric_data.corr()
# グラフのサイズを設定
plt.figure(figsize=(10, 8))
# ヒートマップを作成
sns.heatmap(
correlation,
annot=True, # 数値を表示
fmt=’.2f’, # 小数点以下2桁
cmap=’coolwarm’, # 青→白→赤
center=0, # 0を白に設定
square=True, # 正方形のセル
linewidths=1 # セル間の線
)
# タイトル
plt.title(‘tipsデータの相関係数行列’, fontsize=16, fontweight=’bold’, pad=15)
# レイアウト調整
plt.tight_layout()
plt.show()
ポイント:.corr()で相関係数行列を計算し、center=0で0を白(中心)に設定しています。
演習 3
発展
irisデータセットの相関係数行列を、マスクを使って三角形のヒートマップで表示してください。数値は小数3桁で表示し、軸ラベルを45度回転させてください。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# データ読み込み
iris = sns.load_dataset(‘iris’)
# 数値データ抽出
numeric_data = iris.select_dtypes(include=[‘float64′])
# 相関係数計算
correlation = numeric_data.corr()
# マスク作成(上三角)
mask = np.triu(np.ones_like(correlation, dtype=bool))
# グラフのサイズを設定
plt.figure(figsize=(12, 10))
# ヒートマップを作成
sns.heatmap(
correlation,
annot=True, # 数値を表示
fmt=’.3f’, # 小数点以下3桁
cmap=’coolwarm’, # 青→白→赤
center=0, # 0を白に
square=True, # 正方形のセル
linewidths=2, # セル間の線
linecolor=’white’, # 線の色
mask=mask, # 上三角をマスク
cbar_kws={‘label’: ‘相関係数’, ‘shrink’: 0.8}
)
# タイトル
plt.title(‘irisデータの相関分析(三角形表示)’, fontsize=18, fontweight=’bold’, pad=20)
# 軸ラベルを45度回転
plt.xticks(rotation=45, ha=’right’)
plt.yticks(rotation=0)
# レイアウト調整
plt.tight_layout()
plt.show()
ポイント:np.triu()でマスクを作成し、mask=maskで上三角を非表示にしています。plt.xticks(rotation=45, ha=’right’)で軸ラベルを45度回転させています。
❓ よくある質問
Q1: 相関係数が高いと、因果関係があるということですか?
いいえ、相関と因果は別物です。相関係数が高くても、それは「一緒に変化する傾向がある」だけで「原因と結果の関係がある」とは限りません。例えば、アイスクリームの売上と水難事故は相関が高いですが、アイスを食べると溺れるわけではありません。両方とも「夏になると増える」という共通の原因(気温)があるだけです。因果関係を証明するには、実験や統計的因果推論など、別の手法が必要です。
Q2: ヒートマップの数値が小さすぎて読めません。どうすればいいですか?
annot_kwsでフォントサイズを調整しましょう。例えばannot_kws={'size': 14}のように指定すると、数値のサイズが大きくなります。また、plt.figure(figsize=(12, 10))で図全体を大きくすることも効果的です。セルが多い場合は、数値を表示せずに色だけで見せる方法も検討してみてください。
Q3: カラーマップはどう選べばいいですか?
データの性質で選びましょう。-1〜1の相関係数のように中心値があるデータなら「coolwarm」や「RdYlBu」などの発散型。0以上の売上や人数などなら「viridis」や「Blues」などの順序型。良い/悪いの評価なら「RdYlGn」(赤=悪い、緑=良い)。迷ったら「coolwarm」(相関)か「viridis」(それ以外)を選べば間違いありません。また、viridisは色覚バリアフリーに配慮されています。
Q4: カテゴリデータ(文字列)の相関を見たいのですが、どうすればいいですか?
カテゴリデータは通常の相関係数では扱えません。選択肢としては、①ダミー変数に変換する(pd.get_dummies())、②クロス集計表とカイ二乗検定を使う、③カテゴリ用の相関指標(クラメールのV)を使う、などがあります。ただし、解釈には注意が必要なので、まずは数値データの相関から始めることをおすすめします。
Q5: 変数が多すぎてヒートマップが見にくいです。どうすればいいですか?
変数を絞るか、クラスタリングを使いましょう。①重要な変数だけに絞る(事前知識で選ぶ)、②sns.clustermap()を使って似た変数をグループ化する、③figureサイズを大きくして数値は非表示にする、④階層的に分析する(まず全体を概観し、気になる部分を詳細に)などの方法があります。20変数を超える場合は、まず変数選択を検討しましょう。
artnasekai
#artnasekai #学習メモ