読み込み中...

Pythonを使った散布図行列の基本と活用10選

散布図行列 徹底解説 Python
この記事は約24分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●散布図行列とは?

散布図行列は、複数の変数の組み合わせを一つの図にまとめて表示する手法です。

各変数がどのように他の変数と関連しているかを視覚的に理解することができます。

○散布図行列の定義と特徴

散布図行列は、データセット内の複数の変数を対にして散布図を作成し、それらを行列状に配置したものです。

行と列に変数を割り当て、対角線上には各変数のヒストグラムや密度プロットが表示されることが多いです。

非対角要素には、行と列の変数の組み合わせによる散布図が配置されます。

この方法により、データセット全体の構造や変数間の関係性を包括的に把握することが可能になります。

相関関係や外れ値、クラスタリングなどのパターンを簡単に識別できるのが大きな特徴です。

○Pythonでの散布図行列作成の利点

Pythonを使用して散布図行列を作成することには、多くの利点があります。

Pythonは豊富なデータ可視化ライブラリを提供しており、中でもSeabornやMatplotlibは散布図行列の作成に適しています。

Pythonの柔軟性により、データの前処理から可視化まで一貫して行うことができます。

また、大規模なデータセットでも効率的に処理が可能です。

さらに、カスタマイズ性が高く、見やすく情報量の多い散布図行列を作成できます。

○必要なライブラリと環境設定

Pythonで散布図行列を作成するために、いくつかの重要なライブラリが必要です。

主に使用するのは次のライブラリです。

  1. NumPy/数値計算用のライブラリ
  2. pandas/データ操作と分析用のライブラリ
  3. Matplotlib/基本的なプロット作成用のライブラリ
  4. Seaborn/統計データの可視化用のライブラリ

環境設定は比較的簡単です。

Anacondaなどの科学計算用Pythonディストリビューションを使用すれば、大抵のライブラリがプリインストールされています。

もし個別にインストールする場合は、次のようなコマンドでインストールできます。

pip install numpy pandas matplotlib seaborn

インストールが完了したら、Jupyter NotebookやVS Codeなどの開発環境で実際にコードを書いていくことができます。

●Python散布図行列の基本

散布図行列の基本を押さえたところで、実際にPythonを使って散布図行列を作成していきましょう。

初心者の方でも理解しやすいよう、ステップバイステップで解説していきます。

○サンプルコード1:シンプルな散布図行列の作成

まずは、最もシンプルな散布図行列を作成してみましょう。

ここでは、Seabornライブラリのpairplot関数を使用します。

この関数は、データフレーム内の数値列のペアごとに散布図を作成し、対角線上にはヒストグラムを表示します。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# サンプルデータの作成
data = pd.DataFrame({
    'X': [1, 2, 3, 4, 5],
    'Y': [2, 4, 5, 4, 5],
    'Z': [1, 3, 4, 3, 4]
})

# 散布図行列の作成
sns.pairplot(data)
plt.show()

このコードを実行すると、X、Y、Zの3変数の関係を示す3×3の散布図行列が生成されます。

対角線上にはそれぞれの変数のヒストグラムが表示され、非対角要素には変数間の散布図が表示されます。

○サンプルコード2:カスタマイズオプションの活用

次に、pairplot関数のカスタマイズオプションを活用して、より情報量の多い散布図行列を作成してみましょう。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# より大きなサンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'X': np.random.normal(0, 1, 100),
    'Y': np.random.normal(0, 1, 100),
    'Z': np.random.normal(0, 1, 100),
    'Category': np.random.choice(['A', 'B'], 100)
})

# カスタマイズされた散布図行列の作成
sns.pairplot(data, 
             hue='Category',  # カテゴリ別に色分け
             diag_kind='kde',  # 対角線上にKDE(カーネル密度推定)プロットを表示
             plot_kws={'alpha': 0.7},  # 散布図の透明度を設定
             diag_kws={'shade': True})  # KDEプロットに塗りつぶしを追加

plt.suptitle('Customized Scatter Plot Matrix', y=1.02)
plt.show()

このコードでは、次のようなカスタマイズを行っています。

  1. hueパラメータを使用して、カテゴリ別に色分けをしています。
  2. diag_kind='kde'で、対角線上にヒストグラムの代わりにKDEプロットを表示しています。
  3. plot_kwsdiag_kwsで、散布図とKDEプロットのスタイルを調整しています。
  4. plt.suptitle()で、図全体にタイトルを追加しています。

このカスタマイズされた散布図行列では、カテゴリ別の違いや、変数の分布がより明確に表現されています。

例えば、カテゴリAとBで変数の分布に違いがあるかどうかを簡単に確認できます。

○サンプルコード3:大規模データセットの取り扱い

大規模なデータセットを扱う場合、全てのデータポイントを散布図にプロットすると、図が見づらくなったり、処理に時間がかかったりする問題が発生します。

そのような場合には、データのサブセットを使用したり、2次元ヒストグラムを活用したりする方法があります。

ここでは、大規模データセットに対応した散布図行列の作成例を紹介します。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 大規模サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'X': np.random.normal(0, 1, 10000),
    'Y': np.random.normal(0, 1, 10000),
    'Z': np.random.normal(0, 1, 10000)
})

# 2次元ヒストグラムを使用した散布図行列の作成
g = sns.PairGrid(data)
g.map_diag(plt.hist, bins=30)
g.map_offdiag(plt.hexbin, gridsize=20, cmap='Blues')

plt.suptitle('Scatter Plot Matrix for Large Dataset', y=1.02)
plt.show()

このコードでは、seaborn.PairGridを使用して散布図行列の基本構造を作成し、map_diagmap_offdiagメソッドを使って各セルにプロットを追加しています。

対角線上にはヒストグラム、非対角要素には2次元ヒストグラム(ヘキサゴンビン)を表示しています。

この方法を使用すると、1万個のデータポイントを持つ大規模データセットでも、効率的に散布図行列を作成し、データの分布や関係性を視覚化することができます。

2次元ヒストグラムを使用することで、データの密度を色の濃淡で表現し、個々のデータポイントをプロットする場合よりも情報を読み取りやすくなっています。

●散布図行列で相関を視覚化

データ分析の醍醐味は、複雑な関係性を明らかにすることです。

散布図行列は、多変量データの相関を一目で把握できる素晴らしいツールです。

ここからは、より高度な視覚化テクニックを紹介します。

相関係数の表示、回帰直線の追加、カラーパレットの最適化など、プロ級の技を身につけましょう。

○サンプルコード4:相関係数の表示

相関係数は変数間の線形関係の強さを表す重要な指標です。

散布図行列に相関係数を追加することで、データの関係性をより明確に理解できます。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'A': np.random.normal(0, 1, 100),
    'B': np.random.normal(0, 1, 100),
    'C': np.random.normal(0, 1, 100)
})

# 相関係数を計算
corr = data.corr()

# 散布図行列の作成
g = sns.PairGrid(data)
g.map_upper(sns.scatterplot)
g.map_lower(sns.kdeplot)
g.map_diag(sns.histplot, kde=True)

# 相関係数を追加
def show_corr(x, y, ax=None, **kwargs):
    r = np.corrcoef(x, y)[0, 1]
    ax.text(0.5, 0.9, f'r = {r:.2f}', transform=ax.transAxes, ha='center')

g.map_upper(show_corr)

plt.tight_layout()
plt.show()

このコードでは、散布図行列の上三角部分に散布図と相関係数を、下三角部分にカーネル密度推定プロットを、対角線上にヒストグラムを表示しています。

相関係数はshow_corr関数で各プロットに追加されます。

相関係数を視覚化することで、変数間の関係性をより詳細に把握できます。

例えば、相関係数が0.8の場合は強い正の相関、-0.3の場合は弱い負の相関を示します。

○サンプルコード5:回帰直線の追加

回帰直線は、二変数間の関係性をより明確に表すことができます。

散布図に回帰直線を追加することで、データの傾向をさらに理解しやすくなります。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'X': np.random.normal(0, 1, 100),
    'Y': np.random.normal(0, 1, 100) + np.random.normal(0, 0.5, 100),
    'Z': np.random.normal(0, 1, 100) * 2 + np.random.normal(0, 0.5, 100)
})

# 回帰直線付きの散布図行列の作成
sns.pairplot(data, kind="reg", diag_kind="kde")
plt.suptitle('Scatter Plot Matrix with Regression Lines', y=1.02)
plt.tight_layout()
plt.show()

このコードでは、sns.pairplot関数のkindパラメータを”reg”に設定することで、自動的に回帰直線が追加されます。

また、対角線上には密度推定プロットを表示しています。

回帰直線を追加することで、変数間の線形関係をより明確に視覚化できます。

線の傾きが急なほど、変数間の関係が強いことを示します。

○サンプルコード6:カラーパレットの最適化

適切なカラーパレットを選択することで、データの可読性と美しさを向上させることができます。

色の選択は、データの特性や目的に応じて行うことが重要です。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'A': np.random.normal(0, 1, 100),
    'B': np.random.normal(0, 1, 100),
    'C': np.random.normal(0, 1, 100),
    'Category': np.random.choice(['Group1', 'Group2', 'Group3'], 100)
})

# カスタムカラーパレットの定義
custom_palette = sns.color_palette("husl", 3)

# カスタムカラーパレットを使用した散布図行列の作成
sns.pairplot(data, hue='Category', palette=custom_palette, diag_kind="kde")
plt.suptitle('Scatter Plot Matrix with Optimized Color Palette', y=1.02)
plt.tight_layout()
plt.show()

このコードでは、sns.color_palette関数を使用してカスタムカラーパレットを定義し、sns.pairplot関数のpaletteパラメータに指定しています。

“husl”カラースペースを使用することで、視覚的に区別しやすい色の組み合わせを生成しています。

カラーパレットを最適化することで、カテゴリ別のデータ点をより明確に区別できるようになります。

色の選択は、データの特性や目的、さらには色覚多様性にも配慮して行うことが重要です。

●高度な散布図行列

ここまでの基本テクニックを押さえたところで、より高度な散布図行列の作成方法に挑戦してみましょう。

条件付き散布図行列、3次元データの可視化、インタラクティブな散布図行列など、プロ級のテクニックを紹介します。

○サンプルコード7:条件付き散布図行列

条件付き散布図行列は、特定の条件に基づいてデータをグループ化し、それぞれのグループごとに散布図行列を作成する手法です。

データのサブセットごとの関係性を比較するのに適しています。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'X': np.random.normal(0, 1, 300),
    'Y': np.random.normal(0, 1, 300),
    'Z': np.random.normal(0, 1, 300),
    'Category': np.random.choice(['A', 'B', 'C'], 300)
})

# 条件付き散布図行列の作成
g = sns.PairGrid(data, hue="Category", corner=True)
g.map_diag(sns.histplot, kde=True)
g.map_offdiag(sns.scatterplot)
g.add_legend()

plt.suptitle('Conditional Scatter Plot Matrix', y=1.02)
plt.tight_layout()
plt.show()

このコードでは、sns.PairGrid関数を使用して条件付き散布図行列を作成しています。

hueパラメータを使ってカテゴリ別に色分けし、corner=Trueを指定することで下三角形のみの散布図行列を生成しています。

条件付き散布図行列を使用することで、カテゴリごとのデータの分布や関係性の違いを一目で把握できます。

例えば、ある特定のカテゴリで変数間の相関が強くなるといった傾向を見つけることができます。

○サンプルコード8:3次元データの可視化

3次元データの可視化は、より複雑な関係性を理解するのに役立ちます。

散布図行列に3D散布図を組み込むことで、データの立体的な構造を把握できます。

import seaborn as sns
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'X': np.random.normal(0, 1, 100),
    'Y': np.random.normal(0, 1, 100),
    'Z': np.random.normal(0, 1, 100)
})

# 散布図行列と3D散布図の作成
fig = plt.figure(figsize=(12, 8))

# 2D散布図行列
ax1 = fig.add_subplot(121)
sns.scatterplot(data=data, x='X', y='Y', hue='Z', palette='viridis', ax=ax1)

# 3D散布図
ax2 = fig.add_subplot(122, projection='3d')
sc = ax2.scatter(data['X'], data['Y'], data['Z'], c=data['Z'], cmap='viridis')
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('Z')

plt.colorbar(sc)
plt.suptitle('2D and 3D Scatter Plots', y=1.02)
plt.tight_layout()
plt.show()

このコードでは、2D散布図と3D散布図を並べて表示しています。

3D散布図はAxes3Dを使用して作成し、Z軸の値をカラーマップで表現しています。

3次元データの可視化により、2次元では見えなかったデータの構造や関係性を発見できる可能性があります。

例えば、特定の平面上にデータが集中しているといった特徴を見つけることができます。

○サンプルコード9:インタラクティブな散布図行列

インタラクティブな可視化は、データ探索をより直感的かつ効率的にします。

Plotlyライブラリを使用して、ズームや選択が可能なインタラクティブな散布図行列を作成できます。

import plotly.express as px
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame({
    'A': np.random.normal(0, 1, 100),
    'B': np.random.normal(0, 1, 100),
    'C': np.random.normal(0, 1, 100),
    'D': np.random.normal(0, 1, 100)
})

# インタラクティブな散布図行列の作成
fig = px.scatter_matrix(data,
                        dimensions=['A', 'B', 'C', 'D'],
                        title='Interactive Scatter Plot Matrix')
fig.show()

このコードでは、Plotly Expressのscatter_matrix関数を使用してインタラクティブな散布図行列を作成しています。

インタラクティブな散布図行列を使用することで、データの詳細な部分まで探索することができます。

例えば、特定の領域にズームインしたり、外れ値を選択して詳細情報を確認したりすることができます。

●散布図行列のトラブルシューティング

データ可視化の道は決して平坦ではありません。

散布図行列を作成する過程で、様々な障害に遭遇することがあります。

しかし、焦らないでください。問題に直面することは、スキルアップの絶好の機会です。

ここでは、よくある問題とその解決策を紹介します。

○メモリエラーの対処法

大規模なデータセットを扱う際、メモリエラーに悩まされることがあります。

Pythonが利用可能なメモリを使い果たしてしまうのです。

対処法の一つは、データのサブサンプリングです。

全データの一部を抽出して可視化することで、メモリ使用量を削減できます。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 大規模なデータセットを生成
np.random.seed(0)
large_data = pd.DataFrame(np.random.randn(1000000, 4), columns=['A', 'B', 'C', 'D'])

# サブサンプリングを実行
sample_size = 10000
sampled_data = large_data.sample(n=sample_size, random_state=42)

# サブサンプリングしたデータで散布図行列を作成
sns.pairplot(sampled_data)
plt.show()

このコードでは、100万行のデータから1万行をランダムに抽出しています。

サンプルサイズは適宜調整してください。

また、データ型の最適化も効果的です。

例えば、整数データをint64からint32に変更することで、メモリ使用量を半減できます。

# データ型の最適化
optimized_data = large_data.astype({col: 'int32' for col in large_data.select_dtypes(include=['int64']).columns})

○描画速度の最適化テクニック

大量のデータ点を描画すると、処理に時間がかかることがあります。

描画速度を上げるには、いくつかテクニックがあります。

一つは、透明度を調整することです。

データ点が重なっている領域を視覚化しやすくなり、同時に描画速度も向上します。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame(np.random.randn(10000, 4), columns=['A', 'B', 'C', 'D'])

# 透明度を調整した散布図行列の作成
sns.pairplot(data, plot_kws={'alpha': 0.1})
plt.show()

この例では、alphaパラメータを0.1に設定しています。

値が小さいほど透明度が高くなります。

もう一つのテクニックは、2次元ヒストグラムの使用です。

個々の点を描画する代わりに、データの密度を色で表現します。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(0)
data = pd.DataFrame(np.random.randn(100000, 4), columns=['A', 'B', 'C', 'D'])

# 2次元ヒストグラムを使用した散布図行列の作成
sns.pairplot(data, kind='hist', diag_kind='kde')
plt.show()

この方法では、kind='hist'を指定して2次元ヒストグラムを作成し、対角線上には密度推定プロットを表示しています。

○データ型の互換性問題の解決

異なるデータ型が混在していると、散布図行列の作成時にエラーが発生することがあります。

例えば、数値データと文字列データが混在している場合です。

対処法として、データ型の変換や、適切な列の選択が挙げられます。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 混合データ型のサンプルデータフレーム
data = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [2.1, 3.2, 4.3, 5.4, 6.5],
    'C': ['red', 'blue', 'green', 'yellow', 'purple'],
    'D': [10, 20, 30, 40, 50]
})

# 数値データのみを選択
numeric_data = data.select_dtypes(include=[np.number])

# 数値データのみで散布図行列を作成
sns.pairplot(numeric_data)
plt.show()

この例では、select_dtypesメソッドを使用して数値データのみを選択しています。

文字列データは除外されるため、エラーを回避できます。

●実世界での活用例

散布図行列は、単なる可視化ツールではありません。

実際のデータ分析現場で、重要な洞察を得るための強力な武器となります。

ここでは、散布図行列の実践的な活用例を紹介します。

○サンプルコード10:機械学習モデルの特徴選択

機械学習モデルの性能は、使用する特徴(変数)の選択に大きく依存します。

散布図行列は、有用な特徴を選択する際の強力な味方です。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

# Irisデータセットの読み込み
iris = load_iris()
data = pd.DataFrame(iris.data, columns=iris.feature_names)
data['target'] = iris.target

# 散布図行列の作成
sns.pairplot(data, hue='target', diag_kind='kde')
plt.suptitle('Iris Dataset - Feature Selection', y=1.02)
plt.show()

このコードでは、有名なIrisデータセットを使用しています。

散布図行列を作成することで、各特徴間の関係性と、目的変数(花の種類)との関連を視覚的に確認できます。

例えば、「petal length」と「petal width」の間に強い相関があることが分かります。

また、「sepal length」と「sepal width」は種の分類にあまり役立たないことも見て取れます。

○金融データ分析での応用

金融分野では、複数の経済指標や市場データの関係を理解することが重要です。

散布図行列は、複雑な金融データの関係性を一目で把握するのに役立ちます。

import pandas as pd
import yfinance as yf
import seaborn as sns
import matplotlib.pyplot as plt

# 株価データの取得
tickers = ['AAPL', 'GOOGL', 'MSFT', 'AMZN']
data = yf.download(tickers, start="2022-01-01", end="2023-01-01")['Adj Close']

# 日次リターンの計算
returns = data.pct_change().dropna()

# 散布図行列の作成
sns.pairplot(returns, diag_kind='kde')
plt.suptitle('Stock Returns Correlation', y=1.02)
plt.show()

この例では、主要テクノロジー企業の株価データを使用しています。

日次リターンの散布図行列を作成することで、各銘柄間の相関関係を視覚化しています。

例えば、AppleとMicrosoftの株価リターンに強い正の相関があることが分かるかもしれません。

一方で、他の銘柄との相関が弱い銘柄があれば、ポートフォリオの分散投資に適している可能性があります。

○生命科学研究でのデータ可視化

生命科学分野では、多くの変数が複雑に絡み合っています。

散布図行列は、遺伝子発現データや臨床試験データの分析に威力を発揮します。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 仮想的な臨床試験データの生成
np.random.seed(0)
n_patients = 100
data = pd.DataFrame({
    'Age': np.random.normal(50, 15, n_patients),
    'Blood_Pressure': np.random.normal(120, 20, n_patients),
    'Cholesterol': np.random.normal(200, 30, n_patients),
    'Blood_Sugar': np.random.normal(100, 20, n_patients),
    'BMI': np.random.normal(25, 5, n_patients),
    'Disease_Risk': np.random.choice(['Low', 'Medium', 'High'], n_patients)
})

# 散布図行列の作成
sns.pairplot(data, hue='Disease_Risk', diag_kind='kde')
plt.suptitle('Clinical Trial Data Visualization', y=1.02)
plt.show()

このコードでは、仮想的な臨床試験データを使用しています。

年齢、血圧、コレステロール値などの変数間の関係を可視化し、疾患リスクとの関連を探ることができます。

例えば、血圧とコレステロール値の間に正の相関があり、両方が高い患者は疾患リスクが高くなる傾向があることが分かるかもしれません。

まとめ

Pythonを使用することで、簡単かつ効果的に散布図行列を作成できることを解説してきました。

Pythonと散布図行列を使いこなすことで、データ分析のスキルを大きく向上させることができます。

本記事で学んだテクニックを実際のプロジェクトに適用し、データから価値ある情報を引き出してください。

好奇心を持ち続け、学習を続けることで、データサイエンティストとしての能力を磨いていってください。