Seaborn入門:データ可視化を始める第一歩 – Pythonで美しく効果的なグラフを作成する
データ分析を行う上で、可視化は不可欠なステップです。数値の羅列だけでは気づけないパターン、トレンド、外れ値などを、グラフを通して直感的に把握することができます。Pythonには様々なデータ可視化ライブラリがありますが、その中でも特に統計的なグラフ作成に強みを持つのが「Seaborn」です。
Seabornは、Pythonの主要な可視化ライブラリであるMatplotlibの上に構築されており、より洗練されたデザインのグラフを、より少ないコードで生成できるように設計されています。この記事では、Seabornを使ってデータ可視化を始めるための第一歩として、基本的な使い方から様々なグラフの種類、カスタマイズ方法までを網羅的に解説します。
この記事は、以下のような方を対象としています。
- Pythonでのデータ分析を始めたばかりの方
- Matplotlibを使ったことはあるが、Seabornに興味がある方
- 美しく、統計的な意味合いを持つグラフを手軽に作成したい方
- データから meaningful な洞察を得るための可視化スキルを身につけたい方
さあ、Seabornの世界へ足を踏み入れ、データ可視化の楽しさを体験しましょう。
第1章: Seabornの世界へようこそ
データ可視化は、データ分析の初期段階である「探索的データ分析(EDA: Exploratory Data Analysis)」において中心的な役割を果たします。データがどのような分布をしているか、変数間にどのような関係があるかなどを視覚的に確認することで、分析の方針を立てたり、仮説を検証したりする手助けとなります。
Pythonの主要な可視化ライブラリとしては、Matplotlibが最も基本的な存在です。Matplotlibは非常に柔軟性が高く、様々な種類のグラフを作成できますが、その分コードが長くなりがちであったり、デフォルトのデザインがあまり洗練されていなかったりするという側面もあります。
ここでSeabornの出番です。SeabornはMatplotlibを基盤としながら、特に統計的なデータ可視化を容易にするための高レベルなインターフェースを提供します。
Seabornの特徴
- 美しいデフォルトスタイル: Matplotlibよりも洗練された、見栄えの良いグラフをデフォルトで提供します。
- 統計的可視化に特化: 回帰分析のプロット、分布の比較、カテゴリ間の関係性など、統計的な概念を表現するグラフが豊富に用意されています。
- Pandas DataFrameとの連携: PandasのDataFrameと非常に親和性が高く、列名を指定するだけで簡単にデータを扱えます。
- 複雑なグラフを簡単に: 複数のサブプロットを持つグラフや、条件による色分け・サイズ分けなども直感的に指定できます。
つまり、Seabornは「統計的な洞察を得るためのグラフを、美しく、効率的に作成したい」という目的に最適なライブラリと言えます。
1.1 Seabornのインストール
SeabornはPythonの外部ライブラリなので、使用するにはインストールが必要です。最も一般的なインストール方法は、pipコマンドまたはcondaコマンドを使用することです。
pipを使用する場合:
bash
pip install seaborn matplotlib pandas
SeabornはMatplotlibとPandasに依存しているため、通常はこれらのライブラリも一緒にインストールします。
condaを使用する場合 (AnacondaやMinicondaを使っている場合):
bash
conda install seaborn matplotlib pandas
いずれかのコマンドを実行すれば、Seabornをすぐに使い始める準備ができます。
1.2 Seabornのインポート
インストールが完了したら、PythonスクリプトやJupyter NotebookでSeabornを使用するためにインポートを行います。慣例として、Seabornは sns
というエイリアスでインポートされます。また、SeabornはMatplotlibの上に構築されているため、グラフの表示やカスタマイズのためにMatplotlibも一緒にインポートするのが一般的です。
python
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd # データ操作のために必要
これで、SeabornとMatplotlib、そしてデータを扱うためのPandasを使用する準備が整いました。
第2章: データを用意する
Seabornでグラフを作成するためには、可視化したいデータが必要です。SeabornはPandasのDataFrameと非常に相性が良いので、データはDataFrame形式で準備するのが最も一般的です。
2.1 Pandas DataFrameの重要性
Seabornの多くの関数は、data
引数にPandas DataFrameを受け取り、x
や y
、hue
などの引数にそのDataFrameの列名を文字列で指定することで動作します。これにより、データとグラフのマッピングが直感的になり、コードが読みやすくなります。
例えば、DataFrame df
に ‘sepal_length’ と ‘petal_length’ という列がある場合、これらの列を使って散布図を描くには以下のようにします。
“`python
df はデータフレーム
sns.scatterplot(x=’sepal_length’, y=’petal_length’, data=df)
plt.show() # Matplotlibの関数でグラフを表示
“`
このように、列名を指定するだけでグラフが描けるのは、SeabornがPandas DataFrameをデータソースとして想定しているためです。
2.2 Seabornに付属するサンプルデータセット
Seabornには、入門者向けにいくつかのサンプルデータセットが付属しています。これらは seaborn.load_dataset()
関数を使って簡単に読み込むことができ、Seabornの様々なグラフ機能を試すのに非常に便利です。
よく使われるサンプルデータセットには以下のようなものがあります。
'tips'
: レストランのチップに関するデータ(合計金額、チップ額、性別、喫煙者かどうか、曜日、時間帯、人数)'iris'
: アヤメの種類とがく片・花弁の長さ・幅に関するデータ'titanic'
: タイタニック号の乗客に関するデータ(生存/死亡、客室クラス、性別、年齢、運賃など)'penguins'
: ペンギンの種類、島の場所、くちばしやフリッパーのサイズ、体重などに関するデータ
サンプルデータセットを読み込むには、以下のようにします。
python
tips_df = sns.load_dataset('tips')
iris_df = sns.load_dataset('iris')
titanic_df = sns.load_dataset('titanic')
penguins_df = sns.load_dataset('penguins')
これらのデータセットを使って、早速Seabornのグラフ作成を体験してみましょう。
2.3 データの基本的な確認
グラフを作成する前に、読み込んだデータがどのような構造をしているか、どのような列が含まれているかなどを確認することは非常に重要です。Pandasの基本的なメソッドを使ってデータを確認しましょう。ここでは tips_df
を例にとります。
“`python
データの最初の5行を表示
print(tips_df.head())
データセットの基本情報(列名、データ型、欠損値の有無など)を表示
print(tips_df.info())
量的データの統計的要約(平均、標準偏差、最小値、最大値など)を表示
print(tips_df.describe())
データセットの形状(行数、列数)を表示
print(tips_df.shape)
列名のリストを表示
print(tips_df.columns)
“`
これらの確認作業を行うことで、どの列が量的変数で、どの列が質的変数(カテゴリ変数)か、欠損値はどのくらいあるかなどを把握でき、適切なグラフの種類を選択するのに役立ちます。
第3章: 基本的なグラフを作成する – 単変量解析
単変量解析とは、1つの変数に注目してそのデータの分布や特徴を調べる分析手法です。Seabornは、単変量解析のための様々なグラフを提供しています。
3.1 量的変数の分布
身長、体重、金額など、連続的な数値を取る量的変数の分布を可視化するのに適したグラフです。
ヒストグラム (histplot
)
ヒストグラムは、量的変数の値をいくつかの区間(ビン)に分け、各区間に含まれるデータの数を棒の高さで表すグラフです。データの分布の形状、中心、広がり、モード(最頻値)などを把握するのに使われます。
“`python
tipsデータセットの合計金額(total_bill)のヒストグラム
sns.histplot(x=’total_bill’, data=tips_df)
plt.title(‘Distribution of Total Bill Amount’) # グラフタイトル
plt.xlabel(‘Total Bill’) # X軸ラベル
plt.ylabel(‘Frequency’) # Y軸ラベル
plt.show()
“`
主な引数:
x
またはy
: 分布を見たい量的変数の列名を指定します。data
: 使用するDataFrameを指定します。bins
: ビンの数を指定します。省略するとSeabornが自動的に決定します。kde
: Trueにすると、ヒストグラムの上にカーネル密度推定曲線も重ねて表示します。
カーネル密度推定 (kdeplot
)
カーネル密度推定(KDE: Kernel Density Estimation)は、ヒストグラムよりも滑らかな分布曲線を描くための手法です。各データ点の周辺にカーネル(重み関数)を置き、それらを合計することで全体の分布密度を推定します。データの形状をよりスムーズに表現したい場合に適しています。
“`python
tipsデータセットの合計金額(total_bill)のKDEプロット
sns.kdeplot(x=’total_bill’, data=tips_df)
plt.title(‘Kernel Density Estimate of Total Bill Amount’)
plt.xlabel(‘Total Bill’)
plt.ylabel(‘Density’)
plt.show()
“`
主な引数:
x
またはy
: 分布を見たい量的変数の列名を指定します。data
: 使用するDataFrameを指定します。bw_adjust
: バンド幅を調整します。小さいほどギザギザになり、大きいほど滑らかになります(デフォルトは1)。fill
: Trueにすると、曲線の下の領域を塗りつぶします。
分布プロット (高レベル関数 displot
)
displot
は、Seabornの高レベルインターフェースの一つで、単変量の分布(ヒストグラム、KDE、ECDFなど)を簡単に描くための関数です。kind
引数でグラフの種類を切り替えられます。また、col
や row
引数を使って、カテゴリ変数でデータを分割し、複数の分布を一度に表示する「ファセット」を作成するのに便利です。
“`python
displotでヒストグラムとKDEを重ねて表示
sns.displot(x=’total_bill’, data=tips_df, kde=True)
plt.suptitle(‘Distribution of Total Bill (with KDE)’, y=1.02) # タイトルを少し上に表示
plt.show()
sex (性別)で分けて合計金額の分布を比較 (ファセット)
sns.displot(x=’total_bill’, data=tips_df, col=’sex’, kde=True)
plt.suptitle(‘Distribution of Total Bill by Sex’, y=1.02)
plt.show()
“`
主な引数:
x
またはy
: 分布を見たい量的変数の列名を指定します。data
: 使用するDataFrameを指定します。kind
:'hist'
,'kde'
,'ecdf'
のいずれかを指定します。col
,row
: 指定したカテゴリ変数でデータを分割し、列または行方向にサブプロットを配置します。hue
: 指定したカテゴリ変数によって、同じAxes内に異なる色で分布を描きます。
displot
は、単変量解析を始める際にまず試すと良い便利な関数です。
3.2 質的変数の分布
性別、カテゴリ、地域など、有限個のカテゴリを取る質的変数の分布を可視化するのに適したグラフです。
カウントプロット (countplot
)
カウントプロットは、質的変数の各カテゴリに含まれるデータ点の数を棒の高さで表すグラフです。各カテゴリの出現頻度を比較するのに使われます。ヒストグラムの質的変数版と考えることができます。
“`python
tipsデータセットの曜日(day)ごとのデータ数
sns.countplot(x=’day’, data=tips_df)
plt.title(‘Number of Observations per Day’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Count’)
plt.show()
sex (性別)ごとのデータ数
sns.countplot(y=’sex’, data=tips_df) # y軸にカテゴリを指定することも可能
plt.title(‘Number of Observations per Sex’)
plt.xlabel(‘Count’)
plt.ylabel(‘Sex’)
plt.show()
“`
主な引数:
x
またはy
: 頻度を数えたい質的変数の列名を指定します。data
: 使用するDataFrameを指定します。hue
: 指定したカテゴリ変数によって、各棒をさらに分割し、グループごとの頻度を表示します。
“`python
曜日ごとにsexで分けてカウント
sns.countplot(x=’day’, hue=’sex’, data=tips_df)
plt.title(‘Number of Observations per Day by Sex’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Count’)
plt.show()
“`
カウントプロットは、質的変数の構成比や、複数の質的変数間の関係性を確認するのに非常に役立ちます。
第4章: 変数間の関係を可視化する – 二変量解析
二変量解析とは、2つの変数間にどのような関係があるかを調べる分析手法です。Seabornは、変数間の関係性を様々な方法で可視化するためのグラフを豊富に提供しています。関係性を可視化することで、相関、傾向、グループ間の違いなどを発見することができます。
4.1 量的変数 vs 量的変数
2つの量的変数間の関係性を可視化する場合に主に使われます。
散布図 (scatterplot
)
散布図は、2つの量的変数の値をそれぞれX軸とY軸に対応させ、データ点をプロットしたグラフです。変数間の相関関係(正の相関、負の相関、無相関)、データのばらつき、外れ値などを視覚的に把握できます。
“`python
tipsデータセットのtotal_billとtipの散布図
sns.scatterplot(x=’total_bill’, y=’tip’, data=tips_df)
plt.title(‘Total Bill vs Tip’)
plt.xlabel(‘Total Bill ($)’)
plt.ylabel(‘Tip ($)’)
plt.show()
“`
Seabornの散布図は、さらに hue
, size
, style
といった引数を使って、3つ以上の変数を同時に表現することができます。これらはそれぞれ色、点のサイズ、点の形状を制御します。
“`python
sexで色分け、sizeでサイズ分けした散布図
sns.scatterplot(x=’total_bill’, y=’tip’, hue=’sex’, size=’size’, data=tips_df)
plt.title(‘Total Bill vs Tip by Sex and Party Size’)
plt.xlabel(‘Total Bill ($)’)
plt.ylabel(‘Tip ($)’)
plt.show()
“`
主な引数:
x
,y
: X軸、Y軸に対応させる量的変数の列名を指定します。data
: 使用するDataFrameを指定します。hue
: カテゴリ変数や量的変数を指定すると、データ点がその値によって色分けされます。size
: 量的変数を指定すると、データ点がその値によってサイズが変わります。style
: カテゴリ変数を指定すると、データ点がその値によって形状が変わります。
折れ線グラフ (lineplot
)
折れ線グラフは、主に時間の経過や順序を持つカテゴリにおける量的変数の変化を追うために使用されます。データ点がX軸の値でソートされ、線で結ばれます。Seabornの lineplot
は、デフォルトで平均値や信頼区間を表示する機能を持っています。
“`python
flightsデータセット (Seabornのサンプルデータ) を読み込む
flights_df = sns.load_dataset(‘flights’)
年ごとの乗客数の推移
sns.lineplot(x=’year’, y=’passengers’, data=flights_df)
plt.title(‘Total Passengers per Year’)
plt.xlabel(‘Year’)
plt.ylabel(‘Passengers’)
plt.show()
monthごとの乗客数の推移 (年間平均)
sns.lineplot(x=’month’, y=’passengers’, data=flights_df)
plt.title(‘Average Passengers per Month (Across Years)’)
plt.xlabel(‘Month’)
plt.ylabel(‘Average Passengers’)
plt.show()
yearで色分けしてmonthごとの推移を表示
sns.lineplot(x=’month’, y=’passengers’, hue=’year’, data=flights_df)
plt.title(‘Passengers per Month by Year’)
plt.xlabel(‘Month’)
plt.ylabel(‘Passengers’)
plt.show()
“`
主な引数:
x
,y
: X軸、Y軸に対応させる変数の列名を指定します。X軸は通常、順序を持つ変数です。data
: 使用するDataFrameを指定します。hue
,size
,style
:scatterplot
と同様に、これらの引数で多変量表現が可能です。estimator
: データを集計する関数(デフォルトは平均値np.mean
)。ci
: 信頼区間のサイズを指定します ('sd'
で標準偏差、整数でパーセンテージ、None
で非表示)。デフォルトは95%信頼区間です。
リレーショナルプロット (高レベル関数 relplot
)
relplot
は、scatterplot
と lineplot
を統合した高レベルインターフェースです。kind
引数で散布図か折れ線グラフかを選択できます。displot
と同様に、col
や row
引数を使ってファセットを作成するのに非常に便利です。
“`python
relplotで散布図 (dayでファセット)
sns.relplot(x=’total_bill’, y=’tip’, data=tips_df, kind=’scatter’, col=’day’)
plt.suptitle(‘Total Bill vs Tip by Day’, y=1.02)
plt.show()
relplotで折れ線グラフ (yearでファセット, monthごとの乗客数)
sns.relplot(x=’month’, y=’passengers’, data=flights_df, kind=’line’, row=’year’, height=2, aspect=2) # heightとaspectで図のサイズを調整
plt.suptitle(‘Passengers per Month by Year’, y=1.02)
plt.show()
“`
relplot
は、複数のカテゴリに分けて量的変数間の関係性を見たい場合に、コード量を大幅に削減できます。
4.2 質的変数 vs 量的変数
カテゴリ変数と量的変数間の関係性を可視化する場合に主に使われます。カテゴリごとの量的変数の分布や統計量を比較するのに適しています。
棒グラフ (barplot
)
Seabornの barplot
は、質的変数の各カテゴリにおける量的変数の平均値を棒の高さで表します。デフォルトで信頼区間も表示されるため、カテゴリ間の平均値の差に統計的な意味があるかどうかの目安にもなります。
“`python
曜日(day)ごとのtotal_billの平均値
sns.barplot(x=’day’, y=’total_bill’, data=tips_df)
plt.title(‘Average Total Bill per Day’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Average Total Bill ($)’)
plt.show()
sex (性別)ごとのtipの平均値
sns.barplot(x=’sex’, y=’tip’, data=tips_df)
plt.title(‘Average Tip per Sex’)
plt.xlabel(‘Sex’)
plt.ylabel(‘Average Tip ($)’)
plt.show()
“`
barplot
は、hue
引数を使って、さらに別のカテゴリ変数でグループ分けした平均値を比較することもできます。
“`python
曜日ごとにsexで分けてtotal_billの平均値を比較
sns.barplot(x=’day’, y=’total_bill’, hue=’sex’, data=tips_df)
plt.title(‘Average Total Bill per Day by Sex’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Average Total Bill ($)’)
plt.show()
“`
主な引数:
x
またはy
: 質的変数の列名を指定します。y
またはx
: 量的変数の列名を指定します(棒の高さに対応)。data
: 使用するDataFrameを指定します。hue
: 指定したカテゴリ変数でグループ分けし、同じカテゴリ内に並べて棒を表示します。estimator
: 集計関数(デフォルトは平均値np.mean
)。ci
: 信頼区間のサイズ(デフォルトは95%)。
箱ひげ図 (boxplot
)
箱ひげ図(Box Plot)は、質的変数の各カテゴリにおける量的変数の分布の要約統計量を視覚的に表現します。箱は中央値、第一四分位数(Q1)、第三四分位数(Q3)を示し、ひげはデータの範囲(通常はQ1 – 1.5IQR から Q3 + 1.5IQR の間、IQRは四分位範囲 Q3-Q1)を示します。ひげの外側にある点は外れ値としてプロットされます。データのばらつき、中央値、四分位数、外れ値を把握するのに非常に役立ちます。
“`python
曜日(day)ごとのtotal_billの箱ひげ図
sns.boxplot(x=’day’, y=’total_bill’, data=tips_df)
plt.title(‘Total Bill Distribution per Day (Box Plot)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Total Bill ($)’)
plt.show()
smoker (喫煙者かどうか)ごとのtipの箱ひげ図
sns.boxplot(x=’smoker’, y=’tip’, data=tips_df)
plt.title(‘Tip Distribution by Smoker Status (Box Plot)’)
plt.xlabel(‘Smoker’)
plt.ylabel(‘Tip ($)’)
plt.show()
“`
箱ひげ図も hue
引数でグループ分けが可能です。
“`python
dayごとにsexで分けてtotal_billの箱ひげ図
sns.boxplot(x=’day’, y=’total_bill’, hue=’sex’, data=tips_df)
plt.title(‘Total Bill Distribution per Day by Sex (Box Plot)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Total Bill ($)’)
plt.show()
“`
主な引数:
x
またはy
: 質的変数の列名を指定します。y
またはx
: 量的変数の列名を指定します。data
: 使用するDataFrameを指定します。hue
: 指定したカテゴリ変数でグループ分けします。
バイオリンプロット (violinplot
)
バイオリンプロットは、箱ひげ図とKDEプロットを組み合わせたようなグラフです。箱ひげ図のように要約統計量(中央値、四分位数など)を示しつつ、KDEのようにデータ分布の形状を滑らかな曲線で表現します。データの分布がどのように集中しているかをより詳細に把握したい場合に適しています。
“`python
曜日(day)ごとのtotal_billのバイオリンプロット
sns.violinplot(x=’day’, y=’total_bill’, data=tips_df)
plt.title(‘Total Bill Distribution per Day (Violin Plot)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Total Bill ($)’)
plt.show()
“`
violinplot
の特徴的な引数として split=True
があります。これは hue
引数と組み合わせて使うことで、同じカテゴリ内で2つのグループの分布を左右に分けて表示し、比較しやすくします。
“`python
dayごとにsexで分けてtotal_billのバイオリンプロット (split)
sns.violinplot(x=’day’, y=’total_bill’, hue=’sex’, split=True, data=tips_df)
plt.title(‘Total Bill Distribution per Day by Sex (Violin Plot)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Total Bill ($)’)
plt.show()
“`
主な引数:
x
またはy
: 質的変数の列名を指定します。y
またはx
: 量的変数の列名を指定します。data
: 使用するDataFrameを指定します。hue
: 指定したカテゴリ変数でグループ分けします。split
:hue
と組み合わせた場合に、同じカテゴリ内でグループを左右に分けて表示するかどうか (True
またはFalse
)。inner
: バイオリン内部に表示する要素 ('box'
,'quartile'
,'point'
,None
)。
Swarmプロット (swarmplot
)
Swarmプロットは、質的変数の各カテゴリに対して、量的変数の各データ点をプロットするグラフです。データ点が重ならないように少しずらしてプロットされるため、箱ひげ図やバイオリンプロットでは見えにくいデータ点の密度や、個々のデータ点の値を確認できます。データ数が少ない場合や、箱ひげ図/バイオリンプロットと組み合わせて使う場合に有効です。
“`python
曜日(day)ごとのtotal_billのSwarmプロット
sns.swarmplot(x=’day’, y=’total_bill’, data=tips_df)
plt.title(‘Total Bill Distribution per Day (Swarm Plot)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Total Bill ($)’)
plt.show()
箱ひげ図とSwarmプロットを重ねて表示
sns.boxplot(x=’day’, y=’total_bill’, data=tips_df, color=”.9″) # 箱ひげ図を薄い色で背景に
sns.swarmplot(x=’day’, y=’total_bill’, data=tips_df)
plt.title(‘Total Bill Distribution per Day (Box Plot + Swarm Plot)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Total Bill ($)’)
plt.show()
“`
Swarmプロットも hue
引数でグループ分けが可能です。
“`python
dayごとにsexで分けてtotal_billのSwarmプロット
sns.swarmplot(x=’day’, y=’total_bill’, hue=’sex’, data=tips_df)
plt.title(‘Total Bill Distribution per Day by Sex (Swarm Plot)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Total Bill ($)’)
plt.show()
“`
主な引数:
x
またはy
: 質的変数の列名を指定します。y
またはx
: 量的変数の列名を指定します。data
: 使用するDataFrameを指定します。hue
: 指定したカテゴリ変数でグループ分けします。
カテゴリカルプロット (高レベル関数 catplot
)
catplot
は、barplot
, boxplot
, violinplot
, swarmplot
など、カテゴリ変数を含む様々なグラフを統合した高レベルインターフェースです。kind
引数でグラフの種類を切り替えられます。relplot
や displot
と同様に、col
や row
引数を使ってファセットを作成するのに非常に便利です。
“`python
catplotで箱ひげ図 (dayとsmokerでファセット)
sns.catplot(x=’sex’, y=’total_bill’, data=tips_df, kind=’box’, col=’day’, row=’smoker’, height=3, aspect=.8)
plt.suptitle(‘Total Bill Distribution by Sex, Day, and Smoker’, y=1.02)
plt.show()
catplotでバイオリンプロット (dayでファセット, sexでhue)
sns.catplot(x=’day’, y=’total_bill’, data=tips_df, kind=’violin’, col=’smoker’, hue=’sex’, split=True, height=4, aspect=.7)
plt.suptitle(‘Total Bill Distribution by Day, Smoker, and Sex’, y=1.02)
plt.show()
“`
catplot
は、カテゴリ変数と量的変数の関係性を、複数のカテゴリで分割して比較したい場合に非常に強力なツールです。
4.3 質的変数 vs 質的変数
2つの質的変数間の関係性を直接的に表現するSeabornの専用関数は限られますが、countplot
の hue
引数を使ったり、データを集計してヒートマップなどを使用したりする方法があります。
例えば、tips_df
の day
と time
の組み合わせごとのデータ数を把握したい場合、countplot
と hue
を使います。
“`python
曜日と時間帯ごとのデータ数
sns.countplot(x=’day’, hue=’time’, data=tips_df)
plt.title(‘Number of Observations per Day and Time’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Count’)
plt.show()
“`
また、Pandasでクロス集計を行い、その結果をヒートマップで表示するという方法もあります。
“`python
曜日と時間帯ごとのデータ数をクロス集計
day_time_counts = tips_df.groupby([‘day’, ‘time’]).size().unstack(fill_value=0)
print(day_time_counts)
クロス集計結果をヒートマップで表示
sns.heatmap(day_time_counts, annot=True, fmt=’d’, cmap=’Blues’)
plt.title(‘Count of Observations per Day and Time’)
plt.xlabel(‘Time’)
plt.ylabel(‘Day of the Week’)
plt.show()
“`
このように、Seabornのグラフだけでなく、Pandasと組み合わせることで様々なクロス分析を可視化できます。
第5章: 変数間の関係を可視化する – 多変量解析
3つ以上の変数間の関係性を一度に可視化する場合に使われるグラフです。
5.1 相関行列のヒートマップ (heatmap
)
ヒートマップは、行列形式のデータの値を色の濃淡で表現するグラフです。特に、複数の量的変数間の相関関係を一覧で確認するのに非常によく使われます。PandasのDataFrameの .corr()
メソッドで相関行列を計算し、その結果をヒートマップで表示するのが典型的な使い方です。
“`python
tipsデータセットの量的変数間の相関行列を計算
tips_corr = tips_df[[‘total_bill’, ‘tip’, ‘size’]].corr()
print(tips_corr)
相関行列のヒートマップ
sns.heatmap(tips_corr, annot=True, cmap=’coolwarm’, fmt=”.2f”) # annot=Trueで数値表示, fmtで表示桁数
plt.title(‘Correlation Matrix of Tips Dataset’)
plt.show()
“`
主な引数:
data
: 可視化したい行列形式のデータを指定します(Pandas DataFrameやNumPy配列)。annot
:True
にすると、各セルに数値を注釈として表示します。fmt
:annot=True
の場合に、数値の表示フォーマットを指定します。cmap
: カラーマップを指定します。'coolwarm'
は相関行列に適しています。linewidths
,linecolor
: セル間の線の太さや色を指定します。
ヒートマップは、多数の変数間の関係性を一目で把握するのに非常に効果的です。
5.2 ペアプロット (pairplot
)
ペアプロットは、DataFrame内の全量的変数間の全ての組み合わせについて、散布図を行列形式で表示するグラフです。対角線上には、各変数の分布(デフォルトではヒストグラムまたはKDE)が表示されます。これにより、データセット全体の変数間の関係性を概観できます。
“`python
tipsデータセットの量的変数間のペアプロット
sns.pairplot(tips_df)
plt.suptitle(‘Pair Plot of Tips Dataset’, y=1.02) # タイトルを上に表示
plt.show()
irisデータセットのペアプロット (speciesで色分け)
sns.pairplot(iris_df, hue=’species’)
plt.suptitle(‘Pair Plot of Iris Dataset by Species’, y=1.02)
plt.show()
“`
pairplot
は、hue
引数を指定することで、カテゴリ変数に基づいてデータ点を色分けし、カテゴリごとの変数間の関係性や分布の違いを同時に確認できます。
主な引数:
data
: 使用するDataFrameを指定します。vars
: ペアプロットに含める量的変数の列名のリストを指定します(省略すると全量的変数)。hue
: 指定したカテゴリ変数でデータ点を色分けします。kind
: 対角線上に表示するグラフの種類 ('scatter'
,'kde'
)。diag_kind
: 対角線上に表示するグラフの種類 ('auto'
,'hist'
,'kde'
,None
)。
pairplot
は、データセットの初期探索において、変数間の関係性を広く浅く確認するのに非常に便利な関数です。
5.3 ジョイントプロット (jointplot
)
ジョイントプロットは、2つの量的変数間の散布図(または他のリレーショナルプロット)と、それぞれの変数の周辺分布(マージナル分布)を同時に表示するグラフです。中心に2変数間の関係性、上下左右にそれぞれの変数の単変量分布が表示されるため、変数間の関係とそれぞれの分布を一度に把握できます。
“`python
tipsデータセットのtotal_billとtipのジョイントプロット (散布図とヒストグラム)
sns.jointplot(x=’total_bill’, y=’tip’, data=tips_df, kind=’scatter’)
plt.suptitle(‘Joint Plot of Total Bill and Tip’, y=1.02)
plt.show()
total_billとtipのジョイントプロット (KDE)
sns.jointplot(x=’total_bill’, y=’tip’, data=tips_df, kind=’kde’)
plt.suptitle(‘Joint Plot of Total Bill and Tip (KDE)’, y=1.02)
plt.show()
“`
主な引数:
x
,y
: 2つの量的変数の列名を指定します。data
: 使用するDataFrameを指定します。kind
: 中心に表示するリレーショナルプロットと、周辺に表示する単変量分布の種類をまとめて指定します。'scatter'
(散布図 + ヒストグラム),'kde'
(KDE + KDE),'hist'
(ヒストグラム + ヒストグラム),'reg'
(回帰直線付き散布図 + ヒストグラム),'resid'
(残差プロット + ヒストグラム) などがあります。hue
: 指定したカテゴリ変数で色分け(一部の kind でのみ有効)。
ジョイントプロットは、特定の2変数間の関係性を詳細に掘り下げたい場合に役立ちます。
第6章: グラフをカスタマイズする
Seabornは美しいデフォルトスタイルを提供しますが、グラフの見た目をさらに調整したい場合や、より多くの情報を盛り込みたい場合があります。SeabornはMatplotlibの上に構築されているため、多くのMatplotlibの関数を使ってSeabornで作成したグラフをカスタマイズできます。
6.1 Matplotlibとの連携
Seabornのグラフ関数には、大きく分けて2つのタイプがあります。
- Axes-level functions:
scatterplot
,barplot
,boxplot
,histplot
,kdeplot
,heatmap
など。これらはMatplotlibのAxes
オブジェクト上にグラフを描画します。通常、plt.subplots()
などでAxes
オブジェクトを作成し、そのax
引数に渡して使用します。引数にax
を渡さなかった場合は、現在のAxes
(plt.gca()
) に描画されます。これらの関数は、Axes
オブジェクトを返します。 - Figure-level functions:
relplot
,catplot
,displot
,jointplot
,pairplot
など。これらはMatplotlibのFigure
オブジェクト全体を管理し、複数のAxes
を含むグラフ(ファセットやマージナル分布など)を作成します。これらの関数は、FacetGrid
やJointGrid
といったSeaborn独自のオブジェクトを返します。これらのオブジェクトには、グラフ全体のタイトルを設定したり、各Axesにアクセスしたりするためのメソッドが用意されています。
Axes-level function のカスタマイズ:
Axes-level function で作成したグラフのタイトルや軸ラベルなどのカスタマイズは、Matplotlibの plt
関数や、描画に使用した Axes
オブジェクトのメソッドを使って行います。
python
fig, ax = plt.subplots(figsize=(8, 6)) # FigureとAxesを作成
sns.scatterplot(x='total_bill', y='tip', data=tips_df, ax=ax) # 作成したAxesに描画
ax.set_title('Total Bill vs Tip') # Axesのメソッドでタイトルを設定
ax.set_xlabel('Total Bill ($)') # AxesのメソッドでX軸ラベルを設定
ax.set_ylabel('Tip ($)') # AxesのメソッドでY軸ラベルを設定
plt.show()
plt.title()
, plt.xlabel()
, plt.ylabel()
なども現在のAxesに対して機能しますが、複数のAxesを扱う場合や、よりオブジェクト指向的にコードを書きたい場合は、Axesオブジェクトのメソッドを使う方が明確です。
Figure-level function のカスタマイズ:
Figure-level function は独自のオブジェクトを返します。これらのオブジェクトを使って、全体のタイトルや、各サブプロットのタイトル・ラベルを設定します。
python
g = sns.relplot(x='total_bill', y='tip', data=tips_df, col='day', kind='scatter') # Figure-level関数
g.fig.suptitle('Total Bill vs Tip by Day', y=1.02) # Figure全体のタイトル
g.set_axis_labels("Total Bill ($)", "Tip ($)") # 全てのサブプロットの軸ラベル
g.set_titles("Day: {col_name}") # 各サブプロットのタイトル (ファセット変数の値を埋め込める)
plt.show()
このように、使用したSeaborn関数の種類(Axes-levelかFigure-levelか)によって、カスタマイズ方法が異なります。
6.2 スタイルの設定
Seabornは、グラフ全体の見た目を簡単に変更できるスタイル設定機能を持っています。
sns.set_theme()
: グラフの見た目を一括で設定します。デフォルトでは'darkgrid'
スタイルが適用されます。style
,palette
,font
,font_scale
,color_codes
,rc
などの引数で詳細に設定できます。sns.set_style()
: グラフの背景スタイルを設定します。'darkgrid'
,'whitegrid'
,'dark'
,'white'
,'ticks'
などのプリセットがあります。sns.set_palette()
: グラフで使用されるデフォルトのカラーパレットを設定します。sns.despine()
: グラフの上下左右の枠線のうち、特に右側と上側の線を削除し、すっきりした見た目にします。
“`python
スタイルを変更
sns.set_style(‘whitegrid’)
sns.set_palette(‘pastel’) # カラーパレットを変更
sns.barplot(x=’day’, y=’total_bill’, data=tips_df)
plt.title(‘Average Total Bill per Day (Pastel, whitegrid)’)
sns.despine() # 上と右の枠線を削除
plt.show()
元のデフォルトスタイルに戻す場合 (または別のテーマを設定)
sns.set_theme() # デフォルトスタイルに戻す
“`
sns.set_theme()
を使うと、スタイル、パレット、フォントスケールなどをまとめて設定できるので便利です。
6.3 タイトル、ラベル、凡例
前述の通り、タイトルと軸ラベルはMatplotlibの関数 (plt.title()
, plt.xlabel()
, plt.ylabel()
) またはAxesオブジェクトのメソッド (ax.set_title()
, etc.) で設定します。Figure-level関数では、返されるオブジェクトのメソッドを使います。
凡例もMatplotlibの機能で制御できます。Seabornが自動的に凡例を作成した場合、それを調整するには plt.legend()
を呼び出したり、Axesオブジェクトの ax.legend()
メソッドを使ったりします。
“`python
hueを使ったグラフ
sns.scatterplot(x=’total_bill’, y=’tip’, hue=’sex’, data=tips_df)
plt.title(‘Total Bill vs Tip by Sex’)
plt.xlabel(‘Total Bill ($)’)
plt.ylabel(‘Tip ($)’)
凡例の位置を調整したい場合など
plt.legend(title=’Gender’, loc=’upper left’)
plt.show()
“`
6.4 図のサイズと解像度
グラフ全体のサイズは、Matplotlibの plt.figure(figsize=(width, height))
で作成したFigureオブジェクトに依存します。SeabornのAxes-level関数は、このFigure内のAxesに描画されます。
python
plt.figure(figsize=(10, 5)) # 横10インチ、縦5インチの図を作成
sns.histplot(x='total_bill', data=tips_df)
plt.title('Distribution of Total Bill (Larger)')
plt.show()
Figure-level関数 (relplot
, catplot
, displot
) は、height
と aspect
引数を使って、各サブプロットのサイズとアスペクト比を制御します。Figure全体のサイズは、これらのサブプロットの配置とサイズから自動的に決まります。
python
sns.catplot(x='day', y='total_bill', data=tips_df, kind='box', col='sex', height=4, aspect=.7) # 各サブプロットの高さ4, 幅は高さ*0.7
plt.suptitle('Total Bill Distribution per Day by Sex', y=1.02)
plt.show()
6.5 色とパレット
色はデータ可視化において非常に重要な要素です。Seabornは豊富なカラーパレットを提供しており、データの種類(定性的、順序、連続)に応じて適切なパレットを選択できます。
sns.color_palette()
: 指定したパレットの色のリストを返します。引数なしで呼び出すと現在のパレットを返します。sns.palplot()
: パレットの色を視覚的に確認できます。- パレットの種類:
- 定性的パレット: 異なるカテゴリを区別するのに使用 (例:
'deep'
,'pastel'
,'Set1'
,'tab10'
) - 順序パレット: 順序を持つカテゴリや、量的変数を段階的に表現するのに使用 (例:
'Blues'
,'Greens'
,'OrRd'
) - 連続パレット: 量的変数のグラデーション表現に使用 (例:
'viridis'
,'plasma'
,'coolwarm'
)
- 定性的パレット: 異なるカテゴリを区別するのに使用 (例:
多くのSeaborn関数は palette
引数を持っており、ここでパレット名を指定できます。
“`python
特定のパレットを指定してbarplotを描画
sns.barplot(x=’day’, y=’total_bill’, data=tips_df, palette=’viridis’)
plt.title(‘Average Total Bill per Day (viridis palette)’)
plt.show()
hueと組み合わせてパレットを指定
sns.boxplot(x=’day’, y=’total_bill’, hue=’sex’, data=tips_df, palette=’Set2′)
plt.title(‘Total Bill Distribution per Day by Sex (Set2 palette)’)
plt.show()
“`
6.6 注釈の追加
グラフにテキストや矢印などの注釈を追加することで、特定のデータ点や領域に注目させることができます。これはMatplotlibの plt.annotate()
関数やAxesオブジェクトの ax.annotate()
メソッドを使って行います。
“`python
sns.scatterplot(x=’total_bill’, y=’tip’, data=tips_df)
plt.title(‘Total Bill vs Tip’)
plt.xlabel(‘Total Bill ($)’)
plt.ylabel(‘Tip ($)’)
例: 最もチップ額が高いデータ点に注釈を付ける
max_tip_row = tips_df.loc[tips_df[‘tip’].idxmax()]
plt.annotate(f”Max Tip: ${max_tip_row[‘tip’]:.2f}”,
xy=(max_tip_row[‘total_bill’], max_tip_row[‘tip’]), # 注釈を付ける座標
xytext=(max_tip_row[‘total_bill’] + 5, max_tip_row[‘tip’]), # 注釈テキストの座標
arrowprops=dict(facecolor=’black’, shrink=0.05)) # 矢印のスタイル
plt.show()
“`
注釈は、伝えたいメッセージを明確にするために非常に有効な手段です。
第7章: 高度な機能と実践的なヒント
7.1 ファセットによる多次元データの可視化 (再確認)
第3章や第4章で触れた displot
, relplot
, catplot
といったFigure-level関数は、col
や row
引数を使って、指定したカテゴリ変数でデータを分割し、それぞれのサブグループに対して同じ種類のグラフを並べて描画する「ファセットグリッド」を簡単に作成できます。これは、複数のカテゴリ変数を含むデータを分析する際に、各カテゴリの組み合わせにおける変数間の関係性や分布の違いを比較するのに非常に強力です。
例えば、tips
データを使って、「曜日別」かつ「時間帯別」に「合計金額とチップ額の関係性」を見たい場合、relplot
に col='day'
と row='time'
を指定することで、8つのサブプロット(4つの曜日 × 2つの時間帯)を含むファセットグリッドを作成できます。
python
sns.relplot(x='total_bill', y='tip', data=tips_df, kind='scatter', col='day', row='time', height=2.5, aspect=.8)
plt.suptitle('Total Bill vs Tip by Day and Time', y=1.02)
plt.show()
このようなグラフは、多くの情報を一度に、かつ比較しやすい形で提示できるため、複雑なデータの探索に欠かせません。
より低レベルな制御が必要な場合は、FacetGrid
クラスを直接使うこともできます。Figure-level関数は、内部的に FacetGrid
や PairGrid
, JointGrid
を使用しています。
7.2 統計量の推定と表示 (信頼区間など)
Seabornは統計的グラフに特化しているため、barplot
や lineplot
のように、デフォルトで集計値(平均値など)と信頼区間を表示する機能を持っています。信頼区間は、集計値の推定値のばらつきを示し、異なるグループ間の差が統計的に有意であるかどうかの目安となります。
信頼区間は ci
引数で制御できます。
ci=95
(デフォルト): 95%信頼区間を表示します。ci="sd"
: 標準偏差を表示します。ci=None
: 信頼区間を非表示にします。
“`python
信頼区間を非表示にしたbarplot
sns.barplot(x=’day’, y=’total_bill’, data=tips_df, ci=None)
plt.title(‘Average Total Bill per Day (without CI)’)
plt.xlabel(‘Day of the Week’)
plt.ylabel(‘Average Total Bill ($)’)
plt.show()
“`
7.3 どのグラフを選ぶべきか?
データの種類(量的か質的か)と、可視化したい目的(分布を見たいのか、関係性を見たいのか、比較したいのか)によって、適切なグラフの種類は異なります。以下に簡単なガイドを示します。
- 1つの量的変数の分布:
histplot
,kdeplot
,displot
- 1つの質的変数の分布:
countplot
- 2つの量的変数間の関係性:
scatterplot
,lineplot
(時系列など),relplot
,jointplot
- 質的変数と量的変数間の関係性:
barplot
(平均値比較),boxplot
,violinplot
(分布比較),swarmplot
(データ点表示),catplot
- 複数の量的変数間の相関:
heatmap
(相関行列),pairplot
(全組み合わせの散布図) - 3つ以上の変数間の関係性:
hue
,size
,style
を使ったグラフ、またはrelplot
,catplot
,displot
,pairplot
のcol
,row
,hue
を組み合わせたファセット
このガイドを参考に、様々なグラフを試してみて、あなたのデータと目的に最適なグラフを見つけてください。
7.4 ストーリーを語る可視化
グラフは単なるデータの図示ではありません。分析結果やデータから得られた洞察を、他の人々に分かりやすく伝えるためのツールです。良いグラフは、データが語る「ストーリー」を明確に表現します。
ストーリーを語る可視化のためには、以下の点を意識しましょう。
- 明確なタイトルと軸ラベル: グラフが何を表しているか、各軸が何を意味しているかを誰にでも理解できるようにします。
- 適切なグラフの種類: データとメッセージに合ったグラフを選びます。
- 効果的な色の使い方: 色を使って重要な要素を強調したり、カテゴリを区別したりします。色の使いすぎや、特定の情報伝達に不向きなカラーパレットは避けましょう。
- 不要な要素の削除: 枠線、グリッド線、凡例など、メッセージ伝達の邪魔になる要素は削除または控えめに表示します。
sns.despine()
や Matplotlibの軸設定などが役立ちます。 - 注釈の追加: 特定のポイントやトレンドを強調したい場合は、注釈を加えます。
- 一貫性: 複数のグラフを作成する場合、スタイルや色使いに一貫性を持たせると、分析全体がよりまとまって見えます。
Seabornの提供する美しいデフォルトスタイルや豊富なカスタマイズ機能は、この「ストーリーテリング」を強力にサポートしてくれます。
まとめ
この記事では、Pythonのデータ可視化ライブラリSeabornの基本的な使い方から、様々なグラフの種類、そしてカスタマイズ方法までを詳細に解説しました。
Seabornは、Matplotlibの上に構築された高レベルなライブラリとして、特に統計的なデータ可視化においてその真価を発揮します。Pandas DataFrameとの親和性が高く、少ないコードで洗練されたデザインのグラフを作成できるため、データ分析の効率と表現力を高めるのに役立ちます。
学習した主なポイントを振り返りましょう。
- Seabornは
import seaborn as sns
でインポートし、Matplotlib (import matplotlib.pyplot as plt
) と共に使用します。 - データはPandas DataFrameで準備するのが最も一般的です。
sns.load_dataset()
で手軽にサンプルデータを試せます。- 単変量解析には
histplot
,kdeplot
,countplot
,displot
など。 - 二変量解析(関係性)には
scatterplot
,lineplot
,barplot
,boxplot
,violinplot
,swarmplot
,relplot
,catplot
など。 - 多変量解析には
heatmap
,pairplot
,jointplot
など。 relplot
,catplot
,displot
はファセット作成に便利な高レベル関数です。- グラフのカスタマイズには、Matplotlibの関数やAxes/Figureオブジェクトのメソッドを使用します。
sns.set_style()
,sns.set_palette()
,sns.set_theme()
などで全体のスタイルを設定できます。- データと目的に応じて適切なグラフを選択することが重要です。
Seabornの機能は非常に多岐にわたります。この記事で紹介したのはその基本的な部分に過ぎません。さらにSeabornを深く学ぶためには、以下のステップに進むことをお勧めします。
- 他のSeabornギャラリーの探索: Seabornの公式サイトには、様々な種類のグラフの例とそのコードが豊富に掲載されています。気になるグラフがあれば、そのコードを参考に実際に手を動かしてみましょう。
- 詳細なドキュメントの参照: Seabornの公式ドキュメントは非常に充実しています。各関数の詳細な説明や引数について調べたい場合は、ドキュメントを参照しましょう。
- 実際のデータを使った練習: あなた自身のデータを使って、様々なグラフを作成してみてください。データの特徴に合わせてカスタマイズする経験は、スキル向上に不可欠です。
- 他のライブラリとの連携: データの取得・前処理にはPandas、数値計算にはNumPy、機械学習にはscikit-learnなど、他のPythonライブラリと組み合わせてデータ分析全体のワークフローの中で可視化を活用しましょう。
- インタラクティブ可視化: グラフにマウスオーバーで情報を表示したり、ズームやパンなどの操作ができるインタラクティブな可視化が必要な場合は、PlotlyやBokehといったライブラリも検討してみましょう。
データ可視化は、単にきれいな絵を作るだけでなく、データから洞察を引き出し、その洞察を効果的に伝えるための powerful なスキルです。Seabornは、このスキルを習得する上で非常に優れたツールとなるでしょう。
この記事が、あなたのSeabornを使ったデータ可視化の旅の良い出発点となることを願っています。ぜひ、様々なデータを可視化し、データが語るストーリーを発見する楽しさを体験してください。