MatplotlibとSeabornを使ったビジュアルの作成

MatplotlibとSeabornのビジュアル作成

 

データの可視化は、データ作業において重要です。データの情報を生の形式で直接理解するのは難しいですが、可視化によって人々の興味や関与が引き起こされます。そのため、データの可視化を学ぶことは、データ分野で成功するために重要です。

Matplotlibは、Pythonで最も人気のあるデータ可視化ライブラリの一つです。非常に多機能であり、ほぼすべてのものをゼロから可視化することができます。このパッケージを使用して、可視化の多くの側面を制御することができます。

一方、Seabornは、Matplotlibの上に構築されたPythonのデータ可視化パッケージです。このパッケージには、さまざまな組み込みのテーマを備えた、よりシンプルなハイレベルのコードがあります。このパッケージは、見た目の良いクイックなデータ可視化をしたい場合に優れています。

この記事では、両方のパッケージを探索し、これらのパッケージを使用してデータを可視化する方法を学びます。さあ、始めましょう。

 

Matplotlibによる可視化

 

前述のように、Matplotlibは多機能なPythonパッケージであり、可視化のさまざまな側面を制御することができます。このパッケージはMatlabプログラミング言語に基づいていますが、Pythonで使用しています。

Matplotlibライブラリは、通常環境にすでに利用可能です。特にAnacondaを使用している場合は、既にインストールされていることがほとんどです。もしそうでない場合は、次のコードを使用してインストールできます。

pip install matplotlib

 

インストール後、以下のコードでMatplotlibパッケージをインポートします。

import matplotlib.pyplot as plt

 

Matplotlibで基本的なプロットを始めましょう。初めに、サンプルデータを作成します。

import numpy as np

x = np.linspace(0,5,21)
y = x**2

 

このデータを使用して、Matplotlibパッケージで折れ線プロットを作成します。

plt.plot(x, y, 'b')
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('サンプルプロット')

 

  上記のコードでは、Matplotlibの関数にデータ(xとy)を渡して、青い線で簡単な折れ線プロットを作成しています。さらに、上記のコードで軸ラベルとタイトルを制御しています。

次に、subplot関数を使用して複数のMatplotlibプロットを作成してみましょう。

plt.subplot(1,2,1)
plt.plot(x, y, 'b--')
plt.title('サブプロット1')
plt.subplot(1,2,2)
plt.plot(x, y, 'r')
plt.title('サブプロット2')

 

 

上記のコードでは、2つのプロットを横に並べて作成しています。subplot関数はプロットの位置を制御します。たとえば、plt.subplot(1,2,1)は、1行(最初のパラメーター)と2列(2番目のパラメーター)の2つのプロットを持つことを意味します。3番目のパラメーターは、現在参照しているプロットを制御します。したがって、plt.subplot(1,2,1)は、単一行と2つの列のプロットの最初のプロットを意味します。

これがMatplotlibの関数の基礎ですが、Matplotlibの可視化に対してより細かな制御をしたい場合は、オブジェクト指向メソッド(OOM)を使用する必要があります。OOMでは、図オブジェクトから直接可視化を生成し、指定されたオブジェクトから任意の属性を呼び出すことができます。

Matplotlib OOMを使用した例をご紹介します。

#図のインスタンス(キャンバス)を作成
fig = plt.figure()

#キャンバスに軸を追加
ax = fig.add_axes([0.1, 0.1, 0.7, 0.7]) #左、下、幅、高さ(0から1の範囲)

#キャンバス内の軸にプロットを追加
ax.plot(x, y, 'b')
ax.set_xlabel('Xラベル')
ax.set_ylabel('Yラベル')
ax.set_title('OOMでのプロット')

 

 

結果は作成したプロットに類似していますが、コードはより複雑です。最初は非生産的に思えましたが、OOMを使用することで、視覚化をほぼすべて制御できるようになりました。たとえば、上記のプロットでは、軸をキャンバス内の任意の位置に配置することができます。

OOMの使用と通常のプロット関数の使用との違いを見るために、2つのプロットとそれぞれの軸を重ねて表示してみましょう。

#figureインスタンス(キャンバス)を作成
fig = plt.figure()

#キャンバスに2つの軸を追加
ax1 = fig.add_axes([0.1, 0.1, 0.7, 0.7]) 
ax2 = fig.add_axes([0.2, 0.35, 0.2, 0.4]) 

#プロットをキャンバス内の各軸に追加
ax1.plot(x, y, 'b')
ax1.set_xlabel('Xラベル Ax 1')
ax1.set_ylabel('Yラベル Ax 1')
ax1.set_title('OOMを使用したプロット Ax 1')

ax2.plot(x, y, 'r--')
ax2.set_xlabel('Xラベル Ax 2')
ax2.set_ylabel('Yラベル Ax 2')
ax2.set_title('OOMを使用したプロット Ax 2')

 

 

上記のコードでは、plt.figure関数でキャンバスオブジェクトを指定し、その図オブジェクトからこれらのプロットを生成しました。1つのキャンバス内には何個でも軸を追加し、その中に視覚化プロットを配置することができます。

subplot関数を使用して、図と軸オブジェクトを自動的に作成することも可能です。

fig, ax = plt.subplots(nrows = 1, ncols =2)

ax[0].plot(x, y, 'b--')
ax[0].set_xlabel('Xラベル')
ax[0].set_ylabel('Yラベル')
ax[0].set_title('OOMを使用したプロット subplot 1')

 

 

subplots関数を使用すると、図と軸オブジェクトのリストを作成します。上記の関数では、プロットの数と1行に2つの列プロットの位置を指定しています。

軸オブジェクトは、アクセスできるすべてのプロットの軸のリストです。上記のコードでは、リストの最初のオブジェクトにアクセスしてプロットを作成します。結果は、1つは折れ線プロットで埋められたプロットで、もう1つは軸のみのプロットです。

subplotsは軸オブジェクトのリストを生成するため、以下のコードのようにイテレートすることもできます。

fig, axes = plt.subplots(nrows = 1, ncols =2)

for ax in axes:

    ax.plot(x, y, 'b--')
    ax.set_xlabel('Xラベル')
    ax.set_ylabel('Yラベル')
    ax.set_title('OOMを使用したプロット')

plt.tight_layout()

 

 

必要なプロットを生成するためにコードを調整することができます。また、プロットが重なる可能性があるため、tight_layout関数も使用します。

次に、Matplotlibプロットを制御するために使用できるいくつかの基本的なパラメータを試してみましょう。まず、キャンバスとピクセルサイズを変更してみましょう。

fig = plt.figure(figsize = (8,4), dpi =100)

 

   

パラメータfigsizeは、幅と高さの2つの数値(width、height)のタプルを受け入れます。結果は上記のプロットに類似しています。

次に、プロットに凡例を追加してみましょう。

fig = plt.figure(figsize = (8,4), dpi =100)

ax = fig.add_axes([0.1, 0.1, 0.7, 0.7])

ax.plot(x, y, 'b', label = '最初の線')
ax.plot(x, y/2, 'r', label = '2番目の線')
ax.set_xlabel('Xラベル')
ax.set_ylabel('Yラベル')
ax.set_title('OOMと凡例を使用したプロット')
plt.legend()

 

 

プロットにラベルパラメータを割り当て、凡例関数を使用することで、ラベルを凡例として表示することができます。

最後に、以下のコードを使用してプロットを保存することができます。

fig.savefig('visualization.jpg')

 

上記に示される折れ線グラフ以外にも特別なプロットがたくさんあります。これらのプロットには、以下の関数を使用してアクセスすることができます。作業に役立ついくつかのプロットを試してみましょう。

散布図

折れ線グラフではなく、以下のコードを使用して特徴量の関係を可視化する散布図を作成することができます。

plt.scatter(x,y)

 

 

ヒストグラム

ヒストグラムプロットは、ビンに表されるデータの分布を可視化します。

plt.hist(y, bins = 5)

 

 

箱ひげ図

箱ひげ図は、データの分布を四分位数に分割して可視化するビジュアライゼーション技術です。

plt.boxplot(x)

 

 

円グラフ

円グラフは、データ内のカテゴリ値の数値比率を表す円形のプロットです。

freq = [2,4,1,3]
fruit = ['りんご', 'バナナ', 'ぶどう', '梨']
plt.pie(freq, labels = fruit)

 

 

Matplotlibライブラリにはまだ特殊なプロットがたくさんありますので、こちらで確認してみてください。

 

Seabornによる可視化

 

Seabornは、Matplotlibをベースにした統計的な可視化のためのPythonパッケージです。Seabornの特徴は、優れたスタイルで可視化を簡素化している点です。また、Seabornの多くのAPIはMatplotlibに結びついているため、両方のパッケージを同時に使用することができます。

Seabornパッケージを試してみましょう。パッケージをインストールしていない場合は、以下のコードを使用してインストールすることができます。

pip install seaborn

 

Seabornには、テストに使用できるサンプルデータセットを取得するための組み込みAPIがあります。このデータセットを使用して、Seabornで様々な可視化を作成します。

import seaborn as sns

tips = sns.load_dataset('tips')
tips.head()

 

 

上記のデータを使用して、分布、カテゴリ、関係、行列のプロットを含むSeabornプロットを探索します。

分布プロット

Seabornで最初に試すプロットは、数値的な特徴の分布を可視化する分布プロットです。以下のコードを使用してそれを行うことができます。

sns.displot(data = tips, x = 'tip')

 

 

デフォルトでは、displot関数はヒストグラムプロットを生成します。プロットを滑らかにする場合は、KDEパラメータを使用することができます。

sns.displot(data = tips, x = 'tip', kind = 'kde')

 

 

分布プロットは、hueパラメータを使用してDataFrameのカテゴリ値に基づいて分割することもできます。

sns.displot(data = tips, x = 'tip', kind = 'kde', hue = 'smoker')

 

 

さらに、rowパラメータやcolパラメータを使用してプロットをさらに分割することもできます。このパラメータを使用することで、カテゴリ値の組み合わせで分割された複数のプロットが生成されます。

sns.displot(data = tips, x = 'tip', kind = 'kde', hue = 'smoker', row = 'time', col = 'sex')

 

 

データ分布を表示するもう一つの方法は、boxplotを使用することです。Seabornは、次のコードで可視化を容易に行うことができます。

sns.boxplot(data = tips, x = 'time', y = 'tip')

 

 

バイオリンプロットを使用すると、ボックスプロットとKDEを組み合わせたデータ分布を表示することができます。

 

最後に、バイオリンプロットとスワームプロットを組み合わせることで、データポイントをプロットに表示することもできます。

sns.violinplot(data = tips, x = 'time', y = 'tip')
sns.swarmplot(data = tips, x = 'time', y = 'tip', palette = 'Set1')

 

 

カテゴリプロット

カテゴリプロットは、カテゴリデータで可視化を行うためのさまざまなSeaborn APIです。利用可能なプロットのいくつかを探ってみましょう。

まず、カウントプロットを作成してみましょう。

sns.countplot(data = tips, x = 'time')

 

 

カウントプロットは、カテゴリ値の頻度を示すバーを表示します。プロットにカウント数を表示したい場合は、Matplotlibの関数をSeabornのAPIと組み合わせる必要があります。

p = sns.countplot(data = tips, x = 'time')
p.bar_label(p.containers[0])

 

 

hueパラメータを拡張して、以下のコードで頻度値を表示することもできます。

p = sns.countplot(data = tips, x = 'time', hue = 'sex')
for container in p.containers:
    ax.bar_label(container)

 

 

次に、バープロットを作成してみましょう。バープロットは、エラーバーを使用してデータの集計を示すカテゴリプロットです。

sns.barplot(data = tips, x = 'time', y = 'tip')

 

 

バープロットは、カテゴリと数値の特徴を組み合わせて集計統計量を提供します。デフォルトでは、バープロットは平均集計関数と信頼区間95%のエラーバーを使用します。 

集約関数を変更したい場合、関数をestimatorパラメータに渡すことができます。

import numpy as np
sns.barplot(data = tips, x = 'time', y = 'tip', estimator = np.median)

 

 

関係プロット

関係プロットは、特徴間の関係を示すための視覚化技術です。データセット内に存在するパターンを特定するために主に使用されます。

まず、散布図を使用して特定の数値的特徴間の関係を示します。

sns.scatterplot(data = tips, x = 'tip', y = 'total_bill')

 

 

散布図を分布プロットと組み合わせることで、ジョイントプロットを作成できます。

sns.jointplot(data = tips, x = 'tip', y = 'total_bill')

 

 

最後に、DataFrame内の特徴間のペアワイズ関係を自動的にプロットするために、pairplotを使用できます。

sns.pairplot(data = tips)

 

 

行列プロット

行列プロットは、データをカラーコーディングされた行列として視覚化するために使用されます。特徴間の関係を見るために使用されるか、データ内のクラスタを認識するのに役立ちます。

例えば、データセットからの相関データ行列があります。

tips.corr()

 

 

上記のデータセットをカラーコーディングされたプロットで表現することで、データをより良く理解することができます。そのため、ヒートマッププロットを使用します。

sns.heatmap(tips.corr(), annot = True)

 

 

行列プロットは、データセット内の値を推測し、既存の類似性に基づいてクラスタを作成するヒエラルキカルスタリングプロットも生成できます

sns.clustermap(tips.pivot_table(values = 'tip', index = 'size', columns = 'day').fillna(0))

 

結論

 

データの可視化は、データの内容を迅速に理解するためにデータ世界の重要な部分です。データの可視化のための標準的なPythonパッケージはMatplotlibとSeabornです。この記事では、パッケージの主な使用方法を学び、作業をサポートするいくつかの可視化手法を紹介しました。  Cornellius Yudha Wijayaはデータサイエンスアシスタントマネージャー兼データライターです。Allianz Indonesiaでフルタイムで働きながら、ソーシャルメディアや執筆メディアを通じてPythonとデータのヒントを共有することが好きです。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more