11. 種々のグラフ(Python の pandas と seaborn)

概要

今回の演習では、Python のライブラリ pandas と seaborn を用いて、データの可視化を行う。CSV ファイルからデータを読み込み、相関行列によるデータの概観と、散布図、ペア・プロット、ヒストグラム、カーネル密度推定、2変数の分布、回帰分析など、複数の種類のグラフの作成方法を学ぶ。

演習準備

この演習では Python を使用する。Python がインストールされていない場合は,下記の「Python 3.12 のインストール(Windows 上)」を展開し,手順に従いインストールすること。下記の「必要なライブラリのインストール」を実施すること。

Python 3.12 のインストール(Windows 上) [クリックして展開]

以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。

方法1:winget によるインストール

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install -e --id Python.Python.3.12 --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 AssociateFiles=1 InstallLauncherAllUsers=1"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

方法2:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

演習

■ ステップ 1 データファイルの準備

CSV データファイル iris.csv と planets.csv を配布する。各自、C:\iris.csv と C:\planets.csv にコピーすること。

古い C:\iris.csv が残っている場合には、新しい iris.csv で上書きすること。

USB メモリが使えない場合には、Web ブラウザを開き、以下の URL からダウンロードして、C:\iris.csv と C:\planets.csv にコピーすること。

◇ iris.csv(Microsoft Excel の画面)

(図:iris.csv を Excel で開いた画面)

◇ planets.csv(Microsoft Excel の画面)

(図:planets.csv を Excel で開いた画面)

■ ステップ 2 Python のパッケージ seaborn のインストール

ステップ 2 を行うには、インターネット接続が必要である。インターネット接続ができない場合は、ステップ 2 以降を宿題とする。

  1. コマンドプロンプトまたはターミナルを起動する
  2. 以下のコマンドを実行する
pip install seaborn

(図:pip install seaborn の実行結果)

ステップ 5 以降は、ステップ 2 が必要である。

■ ステップ 3 Spyder の設定

以下の手順で Spyder の設定を行う。

  1. Spyder を起動する
  2. Consoles メニューから「Open an IPython console」を選ぶ
  3. 「IPython console」をクリックする

(図:Spyder の設定画面)

■ ステップ 4 CSV ファイルを pandas のデータフレームに格納する

1. まず CSV ファイルのファイル名を確認する

以下、ファイル名が C:\planets.csv と C:\iris.csv であるとして説明を続ける。

2. データフレームに CSV ファイルを読み込む

import pandas as pd
planets = pd.read_csv(r"C:\planets.csv")
iris = pd.read_csv(r"C:\iris.csv")

※ Python では、ファイルパス中のバックスラッシュ \ がエスケープ文字として解釈される場合がある。上記のように文字列の前に r を付けて raw 文字列(バックスラッシュをエスケープ文字として解釈しない文字列)とするか、"C:\\planets.csv" のようにバックスラッシュを二重にするか、"C:/planets.csv" のようにスラッシュで代用すること。

3. planets の確認

head() は先頭 5 行を表示する関数である。

planets.head()

(図:planets.head() の実行結果)

4. iris の確認

iris.head()

(図:iris.head() の実行結果)

■ ステップ 5 可視化

(1) 準備

グラフ描画に必要なパッケージをインポートする。

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

(2) 相関行列

相関行列は、データフレーム内の各数値列間の相関係数を一覧表示するものである。相関係数は -1 から 1 の範囲の値をとり、1 に近いほど正の相関、-1 に近いほど負の相関、0 に近いほど相関がないことを示す。

iris.corr(numeric_only=True)

numeric_only=True は、数値列のみを対象として相関係数を計算するパラメータである。pandas のバージョンによっては、このパラメータを省略すると警告やエラーが発生する場合がある。

(図:iris の相関行列の出力結果)

出力結果を見ると、petal_length と petal_width の相関係数は約 0.96 であり、強い正の相関がある。一方、sepal_width と sepal_length の相関係数は約 -0.12 であり、相関がほぼないことがわかる。

(3) 散布図

散布図は、2 つの変数の関係を点の分布として可視化するグラフである。第 3 の変数を色で表現することで、値やカテゴリごとの傾向を同時に確認できる。2 変数間の相関や傾向を視覚的に確認したい場合に用いる。

◇ データフレーム: planets、列: distance, mass ※ number(惑星の番号)を使って色付け

hue は、指定した列の値に応じて点の色を変えるパラメータである。

sns.scatterplot(data=planets, x="distance", y="mass", hue="number")
plt.show()

(図:planets の散布図 1)

palette は、色の組み合わせ(カラーパレット)を指定するパラメータである。

sns.scatterplot(data=planets, x="distance", y="mass", hue="number", palette="deep")
plt.show()

(図:planets の散布図 2)

◇ データフレーム: iris、列: petal_length, petal_width ※ species(品種)を使って色付け

sns.scatterplot(data=iris, x="petal_length", y="petal_width", hue="species")
plt.show()

(図:iris の散布図)

出力結果を見ると、品種ごとに petal_length と petal_width の分布が異なることがわかる。setosa は他の 2 品種と明確に分離しており、versicolor と virginica は一部重なりがある。

(4) ペア・プロット

ペア・プロットは、データフレーム内の全数値列の組み合わせについて散布図を行列状に一覧表示するグラフである。対角線上にはそれぞれの列のヒストグラムまたはカーネル密度推定が表示される。多数の変数間の関係を一度に俯瞰したい場合に用いる。

◇ データフレーム: iris

sns.pairplot(iris, hue="species")
plt.show()

(図:iris のペア・プロット)

出力結果を見ると、petal_length と petal_width の組み合わせでは品種ごとのクラスタが明確に分かれている。一方、sepal_width と sepal_length の組み合わせでは品種間の重なりが大きい。

(5) ヒストグラムの基本

ヒストグラムは、データの度数分布を棒グラフで表現するものである。横軸にデータの階級(区間)、縦軸に度数(データの個数)をとる。1 つの変数について、分布の形状、中心、ばらつきを把握したい場合に用いる。

◇ データフレーム: iris ※ species を使って色付け

sns.histplot(data=iris, x="sepal_length", hue="species")
plt.show()

(図:iris のヒストグラム、species で色分け)

◇ データフレーム: planets、列: year

bins は、ヒストグラムの階級(区間)の区切り位置を指定するパラメータである。aspect は、グラフの縦横比(幅 ÷ 高さ)を指定するパラメータである。

※ 横軸は 1985, 1986, …, 2014。縦横比は 2.5

sns.displot(data=planets, x="year", bins=range(1985, 2016), aspect=2.5)
plt.show()

(図:planets の year のヒストグラム)

出力結果から、年ごとの惑星の発見数の推移を読み取ることができる。

◇ データフレーム: planets、列: year ※ number を使って色付け

※ 横軸は 1985, 1986, …, 2014。縦横比は 2.5

sns.displot(data=planets, x="year", hue="number", bins=range(1985, 2016), aspect=2.5)
plt.show()

(図:planets の year のヒストグラム、number で色分け)

◇ データフレーム: iris、列: sepal_length

※ 横軸は 4.0, 4.1, …, 7.9。縦横比は 1.8

sns.displot(data=iris, x="sepal_length", bins=np.arange(40, 81) / 10, aspect=1.8)
plt.show()

(図:iris の sepal_length のヒストグラム)

◇ データフレーム: iris、列: sepal_length ※ species を使って色付け

※ 横軸は 4.0, 4.1, …, 7.9。縦横比は 1.8

sns.displot(data=iris, x="sepal_length", hue="species", bins=np.arange(40, 81) / 10, aspect=1.8)
plt.show()

(図:iris の sepal_length のヒストグラム、species で色分け)

(6) ヒストグラムとカーネル密度推定の組み合わせ

カーネル密度推定は、データの分布を滑らかな曲線で推定する手法である。ヒストグラムが階級幅に依存した離散的な表現であるのに対し、カーネル密度推定は連続的な分布の形状を表現できる。この節では、ヒストグラムにカーネル密度推定の曲線を重ねて表示する方法を扱う。

kde=True を指定すると、カーネル密度推定の曲線がヒストグラムに重ねて描画される。

◇ データフレーム: planets、列: year

sns.displot(data=planets, x="year", kde=True)
plt.show()

(図:planets の year の分布、カーネル密度推定付き)

出力結果を見ると、ヒストグラムの棒に加えて滑らかな曲線が描かれ、発見数の増減傾向がより明確にわかる。

◇ データフレーム: iris、列: sepal_length

sns.displot(data=iris, x="sepal_length", kde=True)
plt.show()

(図:iris の sepal_length の分布、カーネル密度推定付き)

出力結果から、sepal_length の分布の形状と対称性の程度を確認できる。

(7) 2 変数の分布

この節では、2 つの変数の同時分布を可視化する方法を扱う。sns.jointplot() は、中央に 2 変数の分布を、上側と右側に各変数の周辺分布を表示する関数である。kind は、中央のグラフの種類を指定するパラメータであり、"scatter"(散布図)、"kde"(カーネル密度推定)、"hist"(ヒストグラム)、"hex"(六角形ビニング:2 次元平面を六角形の格子で区切り、各格子内のデータ数を色で表現する手法)、"reg"(回帰分析)、"resid"(残差プロット)を指定できる。

2 変数間の関係と各変数の周辺分布を同時に把握したい場合に用いる。

◇ 散布図と周辺ヒストグラム(既定の表示)

データフレーム: iris、列: petal_length, petal_width

sns.jointplot(data=iris, x="petal_length", y="petal_width")
plt.show()

(図:iris の 2 変数分布、散布図と周辺ヒストグラム)

出力結果を見ると、中央の散布図から petal_length と petal_width に強い正の相関があることがわかり、上側と右側のヒストグラムからそれぞれの変数の分布形状も同時に確認できる。

◇ カーネル密度推定による 2 変数分布(kind="kde")

sns.jointplot(data=iris, x="petal_length", y="petal_width", kind="kde")
plt.show()

(図:iris の 2 変数分布、等高線によるカーネル密度推定)

中央に等高線で密度の高い領域が表示され、データが集中している箇所を把握できる。

◇ 塗りつぶしカーネル密度推定による 2 変数分布(kind="kde", fill=True)

fill=True は、カーネル密度推定の等高線の内側を色で塗りつぶすパラメータである。

sns.jointplot(data=iris, x="petal_length", y="petal_width", kind="kde", fill=True)
plt.show()

(図:iris の 2 変数分布、塗りつぶしカーネル密度推定)

等高線の内側が色で塗りつぶされ、密度の高低がより直感的にわかる。

◇ 周辺分布付きカーネル密度推定

sns.jointplot(data=iris, x="petal_length", y="petal_width", kind="kde", marginal_kws=dict(fill=True))
plt.show()

(図:iris の 2 変数分布、周辺分布を塗りつぶしたカーネル密度推定)

周辺分布のカーネル密度推定も塗りつぶし表示とすることで、分布の形状をより視覚的に把握できる。

◇ 2 次元ヒストグラムによる 2 変数分布(kind="hist")

sns.jointplot(data=iris, x="petal_length", y="petal_width", kind="hist")
plt.show()

(図:iris の 2 変数分布、2 次元ヒストグラム)

2 次元の格子状に区切った各領域のデータ数を色の濃淡で表現する。

kind の選び方として、データ点の個々の位置を確認したい場合は "scatter"、分布の密度を滑らかに把握したい場合は "kde"、大量のデータ点が重なって見づらい場合は "hex" が適している。

(8) 回帰分析

回帰分析は、2 変数間の関係を直線で近似し、一方の変数から他方の変数を予測するモデルを可視化する手法である。散布図に回帰直線と信頼区間を重ねて表示することで、変数間の傾向を定量的に把握できる。2 変数間の線形な関係性を確認したい場合に用いる。

◇ データフレーム: iris、列: petal_length, petal_width

sns.regplot(data=iris, x="petal_length", y="petal_width")
plt.show()

(図:iris の回帰分析)

出力結果を見ると、回帰直線の周囲に薄い色で信頼区間が表示されている。petal_length が大きくなるにつれて petal_width も大きくなるという正の線形関係が確認できる。

◇ 周辺分布付き回帰分析(kind="reg")

sns.jointplot(data=iris, x="petal_length", y="petal_width", kind="reg")
plt.show()

(図:iris の回帰分析、周辺分布付き)

sns.jointplot()kind="reg" を指定すると、中央に回帰直線付きの散布図、上側と右側に各変数の周辺分布が表示される。

グラフの使い分けのまとめ

以下に、本演習で扱った各グラフの特徴と適した用途を整理する。

相関行列は、全変数間の相関係数を数値で一覧表示する。多数の変数の中から相関の強い組み合わせを素早く特定したい場合に適している。

散布図は、2 変数間の関係を点の分布で表現する。特定の 2 変数間の相関や傾向を詳細に確認したい場合に適している。

ペア・プロットは、全変数の組み合わせの散布図を一覧表示する。データ全体の変数間の関係を俯瞰したい場合に適している。変数の数が多い場合はグラフが小さくなるため、まず全体を俯瞰し、注目すべき変数の組み合わせを見つけるという使い方が効果的である。

ヒストグラムは、1 変数の度数分布を棒グラフで表現する。分布の形状、中心、ばらつきを直感的に把握したい場合に適している。

カーネル密度推定は、1 変数の分布を滑らかな曲線で推定する。ヒストグラムでは階級幅の選び方によって見え方が変わるが、カーネル密度推定は連続的な分布の形状をより安定して表現できる。ヒストグラムと重ねて表示することで、両者の長所を併せ持つ可視化ができる。

2 変数の分布(jointplot)は、2 変数の同時分布と各変数の周辺分布を同時に表示する。2 変数間の関係だけでなく、それぞれの変数の周辺分布も同時に把握したい場合に適している。

回帰分析は、散布図に回帰直線と信頼区間を重ねて表示する。2 変数間の線形な関係性を確認し、予測の傾向を視覚的に把握したい場合に適している。