【Streamlit】相関関係を可視化:散布図行列の作成

Streamlit
この記事は約7分で読めます。

こんにちは、JS2IIUです。
データ分析に欠かせないのが、そもそものデータをよく観察する、ということです。複数の変数間の関係性を一度に把握するために散布図行列を描いてみるのもよく使われる手法です。Streamlit上で散布図行列を表示させてみましょう。今回もよろしくお願いします。

1. はじめに

データ分析では、「変数同士の関係性(=相関)」を理解することがとても重要です。特に数値データが複数ある場合、それぞれの関係を一つひとつグラフにして確認するのは手間がかかります。

そこで便利なのが 散布図行列(Pair Plot) です。これは、複数の変数間の関係性を一度に可視化できるグラフで、データ同士の傾向や相関の有無を直感的に把握することができます。

本記事では、PythonのWebアプリフレームワーク「Streamlit」を使って、散布図行列を手軽に表示するアプリを作成してみましょう。

2. 散布図行列とは?

散布図行列(Pair Plot) は、複数の変数同士のペアごとに散布図を並べて表示したグラフです。
たとえば、「身長・体重・年齢」といった3つの数値データがある場合、それぞれの組み合わせ(身長×体重、身長×年齢、体重×年齢)で散布図を描いて、相関を視覚的に確認できます。

また、対角線上にはヒストグラム(各変数の分布)が表示されることが多く、変数ごとの傾向もわかりやすくなっています。

3. 使用するライブラリの紹介

今回のアプリでは、以下のライブラリを使います。

ライブラリ役割
StreamlitWebアプリの作成(streamlit
Seaborn散布図行列の作成(sns.pairplot()
Pandasデータ操作(DataFrameの扱い)
Matplotlibグラフの表示補助(pyplot

いずれもPythonでよく使われる標準的なライブラリなので、安心して使えます。

4. サンプルデータの準備

今回は、Seabornに内蔵されている「iris(アヤメの花データ)」を使用します。
このデータセットには、花びらやがく片の長さ・幅などが記録されており、相関関係の分析には最適です。

まず、以下のようにしてデータを読み込みましょう。

Python
import seaborn as sns

# irisデータを読み込む
df = sns.load_dataset("iris")

# データの先頭を確認
print(df.head())

出力されるデータの例:

Plaintext
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
...

5. Streamlitアプリの実装

5.1 最小構成のアプリ

まずは、基本的な散布図行列を表示するだけのシンプルなStreamlitアプリを作ってみましょう。

Python
import streamlit as st
import seaborn as sns
import matplotlib.pyplot as plt

# データの読み込み
df = sns.load_dataset("iris")

# タイトル表示
st.title("散布図行列の表示アプリ")

# ペアプロットを作成
fig = sns.pairplot(df)

# グラフをStreamlit上に表示
st.pyplot(fig)

このコードを app.py などの名前で保存して、ターミナルから以下のコマンドを実行すると…

Bash
streamlit run app.py

ブラウザ上に散布図行列が表示されるはずです!

5.2 インタラクティブに列を選択する

次は、表示する列をユーザーが選べる ように、サイドバーに選択機能を追加してみましょう。

Python
import streamlit as st
import seaborn as sns
import matplotlib.pyplot as plt

# データ読み込み
df = sns.load_dataset("iris")

# タイトル
st.title("選べる散布図行列")

# サイドバーで列選択
columns = df.select_dtypes(include='number').columns.tolist()
selected_cols = st.sidebar.multiselect("表示する数値列を選んでください", columns, default=columns)

# 選択された列がある場合のみ描画
if selected_cols:
    fig = sns.pairplot(df[selected_cols])
    st.pyplot(fig)
else:
    st.warning("1つ以上の列を選択してください。")

このコードでは、数値列のみを対象として multiselect で選択肢を提供し、ユーザーが選んだ列だけを使って散布図行列を描画します。

6. 応用:カテゴリによる色分け(hueの活用)

データにカテゴリ(分類)変数がある場合、それを色分けして表示することで、より深い洞察が可能になります。

Irisデータには species(品種)というカテゴリ列があるので、hue パラメータにそれを指定してみましょう。

Python
import streamlit as st
import seaborn as sns
import matplotlib.pyplot as plt

# データ読み込み
df = sns.load_dataset("iris")

# タイトル
st.title("カテゴリを色分けした散布図行列")

# 数値列の選択
columns = df.select_dtypes(include='number').columns.tolist()
selected_cols = st.multiselect("表示する数値列を選んでください", columns, default=columns)

# 色分け対象(カテゴリ変数)の選択
hue_col = st.selectbox("色分けするカテゴリ列を選んでください", df.select_dtypes(include='object').columns)

# グラフ表示
if selected_cols:
    fig = sns.pairplot(df[selected_cols + [hue_col]], hue=hue_col)
    st.pyplot(fig)
else:
    st.warning("1つ以上の数値列を選択してください。")

これにより、例えば「setosa」「versicolor」「virginica」ごとの違いが一目でわかるようになります。

7. まとめ

  • 散布図行列(Pair Plot) は、複数の変数間の関係を一度に可視化できる便利なツールです。
  • PythonのStreamlitを使えば、数行のコードでWebアプリとして実装可能です。
  • インタラクティブに列を選んだり、カテゴリごとに色分けしたりすることで、分析の幅も広がります。

今後は、CSVファイルのアップロード機能を追加することで、自分のデータを分析するアプリに発展させることも可能です!

8. 参考リンク

最後に書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。Poetryについても詳しく説明されています。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました