【初心者向け】seaborn入門 | Pythonを使ってデータを綺麗に可視化してみよう!

Seabornとは

Seaborn (シーボーン) とは、Pythonの可視化ライブラリの一つです。

SeabornはMatplotlibの機能をより美しく、より簡単に実現するための可視化ライブラリです。

Seabornの特徴として、Matplotlibベースで作られているため、折れ線グラフや棒グラフ、散布図などの基本的なグラフ描画はMatplotlibの機能を利用していることが挙げられます。

公式ドキュメント

Seabornのインストール

pipコマンドを用いたSeabornのインストールは下記のコマンドをMacの方はターミナル、Windowsの方はコマンドプロンプト場で実行することでインストールが出来ます。

pip install seaborn

問題を報告するJupyter Notebookをお使いの方は、起動したNotebookのセルに、先頭に!マークをつけて実行することでインストールすることが出来ます。

!pip install seaborn

散布図行列

まず始めに、Seabornで描画するために、Seabornの読み込みをしましょう。

import seaborn as sns

問題を報告する上記で読み込むことが可能です。Seabornではよくsnsという名前で読み込むことがありますので、snsという別名をつけております。まずはチュートリアルとして、Seabornがあらかじめ用意してあるデータを使って可視化をしていきます。今回はアイリスデータに対して、散布図行列で可視化します。

散布図行列とは複数の変数がある場合に、全ての2変数同士の組み合わせに対して散布図を作成し、行列の形式に並べたものです。散布図行列は、複数の変数の相関関係を視覚的に捉えることができます。

Seabornで散布図行列を可視化する場合、pairplot()を用います。

import seaborn as sns # こちらにも再度記述
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# アヤメのデータの読み込み ※左のirisは変数名で、右側のirisはirisという花のデータセットを読み込む設定です。
iris = sns.load_dataset("iris")
# データに含まれる全ての数値変数同士での散布図を描画

# 今回はirisという変数を渡していますが、Pandasのデータフレーム(DataFrame)型を渡すことで、散布図行列を描画出来ます。
sns.pairplot(iris) # 散布図行列
plt.show()

ちなみに、Pandasのデータフレームを用いて、pairplotをする場合、そのデータフレームにNaN値がある場合pairplotできません。ですのでpairplotするには、NaNの行を削除するか、NaNを0に置き換えた上で実行する必要があります。pairplotはデータフレーム内にある全ての数値項目の各ペアの散布図を描画しますが、hueオプションを使うとことで色分けも可能です。

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

# 引数hueにcolumnを指定することで、データを色分けすることが可能です。
# 今回引数に渡すcolumnはirisデータセットのspecies columnです。
# hueは色合い、色調などを意味する単語です。
sns.pairplot(iris, hue="species")
plt.show()

※上記の画像はお使いの実行環境によって色などが異なる場合があります。

jointplot(散布図)

Seabornでは、jointplot関数を利用することで、ヒストグラムつきの散布図を作成することが可能です。

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

iris = sns.load_dataset("iris")

#ヒストグラムつきの散布図を作成
sns.jointplot(x='sepal_width', y='petal_length', data=iris)
plt.show()

またkindオプションにregを指定すると散布図に加え、回帰直線を引いてくれます。

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

iris = sns.load_dataset("iris")
#ヒストグラムつきの散布図を作成
sns.jointplot(x='sepal_width', y='petal_length', data=iris, kind='reg')
plt.show()

kindにはreg以外にも、resid(残差誤差)、kde(カーネル密度推定を用いた等高線風の描画)、hex(六角形のヒートマップ)なども指定する事が出来ます。

countplot

countplotは、カテゴリカルデータに対するプロットで、データの件数を集計し、グラフとして可視化します。coutplot関数を利用します。

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

# titanic以外にもチップの関係に関するデータなどもあります。
# tips = sns.load_dataset("tips")  # お店の食事時間と会計総額とチップの関係のデータの読み込み
titanic = sns.load_dataset("titanic") # ※左のtitanicは変数名で、右側のtitanicはtitanic号データセットを読み込むという設定です。
sns.countplot(x="class", data=titanic)
plt.show()

※上記の画像はお使いの実行環境によって色などが異なる場合があります。

boxplot

boxplotは、2種類のカテゴリデータを含んだ数値データのばらつきを可視化する際に利用します。boxplot関数を利用します。

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

titanic = sns.load_dataset("titanic") # ※左のtitanicは変数名で、右側のtitanicはtitanic号データセットを読み込むという設定です。
sns.boxplot(x="survived", y="age", data=titanic)
plt.show()

violinplot

violinplotは2種類のカテゴリデータを含んだ数値データの違いを可視化する際に利用します。violinplot関数を利用します。

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

titanic = sns.load_dataset("titanic") # ※左のtitanicは変数名で、右側のtitanicはtitanic号データセットを読み込むという設定です。
sns.violinplot(x="survived", y="age", data=titanic)
plt.show()

棒グラフ

棒グラフを作成する場合は、barplot関数を使います。平均値を計算した上で棒グラフを表示してくれます。横軸と縦軸はxとy変数に、棒グラフのカテゴリーデータはhueに、そしてデータセットはdata変数に代入します。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# ※左のtitanicは変数名で、右側のtitanicはtitanic号データセットを読み込むという設定です。
titanic = sns.load_dataset("titanic")
sns.barplot(x="sex", y="survived", hue="class", data=titanic);
plt.show()

また、黒い縦棒の事をエラーバーと呼ばれます。デフォルトでは、95%の信頼区間(Confidence interval,CI)というのを使っています。※信頼区間とは、母集団の真の値が含まれることが、かなり確信(confident)できる数値範囲の事です。

ヒストグラムの描画

distplotメソッドを使うことでヒストグラムを描画することが出来ます。seabornのバージョンが0.11.0以上の場合はdistplot()が将来廃止される可能性があるため、displot()を使うようにしましょう。引数にいくつかオプションとして渡すことが出来ます。kderugの値をTrueに変えて試して見てください。kdeはカーネル密度推定(なめらかなヒストグラム)の描画に関するオプションで、binsはx軸の刻み目の指定のオプションになります。

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

a = np.random.normal(size=30)
"""
引数の説明
bins ヒストグラムの柱の幅・数を設定
kde カーネル密度推定のグラフを重ねて描くかどうか(True/False)
rug 各データの詳細な位置をグラフの下部分に短い線で示すかどうか
axlabel x軸のラベル
"""
# ヒストグラムを描画
sns.distplot(a, kde=False, rug=False, bins=10) 
plt.show()

displot()を用いてヒストグラムを描画した場合

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
print(sns.__version__) # Seabornのバージョンの確認
a = np.random.normal(size=30)

# ヒストグラムを描画
sns.displot(a) 
plt.show()

※変数aの値が実行毎にランダムで変わるため、以下とは違った描画になる点注意ください。

catplot

catplotを用いると、散布図や箱ひげ図、棒グラフなど描画することが出来ます。catplotの引数のkindにグラフの種類を指定する事で様々な種類のグラフを可視化できます。今回は、countplotを用いずにcatplotkindcountを指定して、各カテゴリの数に対してプロットしています。(カテゴリ毎の分布を可視化する用途で利用してみます。)

import seaborn as sns

df = sns.load_dataset("tips")
# xにはカテゴリ変数を渡す
sns.catplot(x = 'smoker', data=df, kind='count')

kindに渡せるパラメータとして、count以外にも、stripswarmboxviolinbarpointなどがあります。気になった方は、公式ドキュメントも合わせて確認してみてください。seaborn.catplot

ヒートマップの描画

heatmap関数を使うことで、簡単にヒートマップやグレースケール画像データをグラフ化することができます。データサイエンスでは相関の強さを数値化した相関係数を表にした相関表や、機械学数の分類問題に関して分類結果を可視化した混同行列と呼ばれるものを可視化するときによく用いられます。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
# シード値を0に固定
np.random.seed(0)
sns.set()

uniform_data = np.random.rand(100, 100)
# ヒートマップのグラフか
ax = sns.heatmap(uniform_data)
plt.axis("off")
plt.show()

Pythonを効率よく学ぶには?

Pythonを効率よく学ぶには、普段からPythonを利用している現役のデータサイエンティストや機械学習エンジニアに質問できる環境で学ぶことです。
質問し放題かつ、体系的に学べる動画コンテンツでデータ分析技術を学びたい方は、オンラインで好きな時間に勉強できるAI Academy Bootcampがオススメです。受講料も業界最安値の35,000円(6ヶ月間質問し放題+オリジナルの動画コンテンツ、テキストコンテンツの利用可能)なので、是非ご活用ください。