[python] 散布図で集団データの分布状況を確認する方法!(seabornも解説)

グラフ作成

概要

こんにちは、すのくろです。

今回は散布図のグラフ作成方法について説明していきます。

下記の散布図のように、複数のデータの集団の違いを平均値ではなく、生データの分布を可視化していくやり方について確認です。

内容としては下記の通りです

・前半:matplotlibの「scatter()」

・後半:seabornの「pairplot()」

それでは早速やっていきましょう!

下準備

まずは下準備として必要なライブラリをインポートします。

この辺は毎度お馴染みのもので、コピペでOKです。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

続いて、グラフ作成用のデータを生成します。

x = np.random.randint(1, 100, 100)
y = np.random.randint(1, 100, 100)
z = np.random.randint(1, 10, 100)
data = np.array([x,y,z]).T
colname= ["x", "y", "type"]
df = pd.DataFrame(data, columns=colname)
df

### 3列100行のランダムデータを作成
# 	x	y	type
# 0	52	12	6
# 1	30	97	4
# 2	65	6	7
# 3	82	39	5
# 4	74	39	4
# ...	...	...	...

基本の散布図の作成

まずは基本の散布図の作成してみます。

plt.scatter(x, y)で作成します。

引数「alpha」は透明度です。なくても良いです。

# 散布図
plt.scatter(df["x"], df["y"], alpha=0.2) 
plt.xlabel('x')
plt.ylabel('y')

この散布図に、他のデータも続けてプロットすることもできます。

# 新しくdf2を作って、df1のグラフに重ねて描画
x = np.random.randint(50, 150, 100)
y = np.random.randint(50, 150, 100)
z = np.random.randint(1, 10, 100)
data = np.array([x,y,z]).T
colname= ["x", "y", "type"]
df2 = pd.DataFrame(data, columns=colname)

# 散布図
plt.scatter(df["x"], df["y"], alpha=0.2)
plt.scatter(df2["x"], df2["y"], alpha=0.2)

plt.xlabel('x')
plt.ylabel('y')

このように、散布図でデータの集団の分布の比較ができます。

ここまでが基本的な散布図の作成方法です。

あとは凡例などを他の棒グラフや折れ線グラフと同様に付け加えていってグラフを作成してもOKです。

参考記事

seabornを使ったデータ集団の比較

次に少し応用としてmatplotlibではなくseabornを使った散布図の作成方法について説明します。

import seaborn as sns

x = np.random.randint(1, 100, 100)
y = np.random.randint(1, 100, 100)
z = np.random.randint(1, 3, 100)
data = np.array([x,y,z]).T
colname= ["x", "y", "type"]
df = pd.DataFrame(data, columns=colname)

sns.pairplot(df, hue="type") 

コードの解説をしておきます。

初めに、

import seaborn as sns

で、seabornをインポートしておきます。seabornは高機能なグラフ作成ライブラリでmatplotlibの上位互換で少し複雑な図形を作成するのに向いているものです。

次に、

x = np.random.randint(1, 100, 100)
y = np.random.randint(1, 100, 100)
z = np.random.randint(1, 3, 100)
data = np.array([x,y,z]).T
colname= ["x", "y", "type"]
df = pd.DataFrame(data, columns=colname)

でデータを作成しています。dfの中身は下記のようなx,yのデータ100個とそれらの種類としてtype(1 or 2)が3列目にあるような表データです。

	x	y	type
0	45	37	1
1	18	11	2
2	9	8	1
3	55	57	1
4	64	56	1
...	...	...	...

最後に、グラフ描画として、

sns.pairplot(df, hue="type") 

でグラフを描画しています。

hueで指定したデータのカテゴリごとに、dfの各列同士の散布図を作成します。

今回は、dfはhueに指定した「type」を除くとxとyしかデータがないので、図としてはこのxyのセットの結果だけです。

しかし、もしデータの列数が多いと全組み合わせの散布図を出力して、計算に時間もかかり、みにくくなるため注意が必要です。

例えば下記の場合です。

x = np.random.randint(1, 100, 100)
y = np.random.randint(1, 100, 100)
a = np.random.randint(1, 100, 100)
b = np.random.randint(1, 100, 100)
c = np.random.randint(1, 100, 100)

z = np.random.randint(1, 3, 100)

data = np.array([x, y, a, b, c, z]).T
colname= ["x", "y", "a", "b", "c", "type"]
df = pd.DataFrame(data, columns=colname)

sns.pairplot(df, hue="type") 

このように、列数がx, y, a, b, cの五列だとこれだけ多くなります。

もしデータの中で必要なものだけ欲しい場合は下記のように、[ ]内にデータを検討したい列名とhueに指定する列名を指定してあげればOKです。

sns.pairplot(df[["x", "y", "type"]], hue="type") 

まとめ

今回は、散布図を作成する方法について説明しました。

基本として、plt.scatter(x, y)、

応用として、seaborn(df, hue=”OO”)

となります。

Pythonを中心としたプログラミングをより体系的に学びたいと言う方向けに、おすすめのオンラインスクールを2つ厳選して紹介していますので、こちらもよければご覧ください!

以上、ここまでお読みいただき、ありがとうございました!

コメント

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