
散布図とは、2つの変数の関係を表すために用いされる、データの可視化のひとつです。
X軸の変数、Y軸の変数に対応したデータがひとつの点で表されます。
X軸の変数とY軸の変数が関係ないのか(点がバラバラ)
関係しているのか(右上がり、右下がり、V字やシグモイド曲線など)
などが、グラフで確認できます。
環境設定はAnacondaからのJupyter Labとし、scikit-learnのボストン住宅価格で練習してみましょう。
【2021年最新】WindowsでAnacondaをインストールする方法
【2021年最新】M1 mac でanacondaをインストールする方法
必要なライブラリをインポート
import pandas as pd # データの形を整えるのも import matplotlib.pyplot as plt # 図を描くためのもの1 import seaborn as sns # 図を描くためのもの2 %matplotlib inline # jupyterで図を表示させる plt.style.use('ggplot') # 図のスタイルを決める、今回は「ggplot」 import japanize_matplotlib # 図に日本語を表示させる import warnings # 警告メッセージを表示させない warnings.filterwarnings('ignore') # 上と同じ print(sns.__version__) # seabornのバージョンを確認
出力:
0.11.0
seabornのバージョンは、0.11.0 です。
図のスタイルは過去記事を参照して下さい。
【Python】matplotlib.styleでいろんなグラフを描く(棒グラフ編)
【Python】matplotlib.styleでいろんなグラフを描く(ヒストグラム編)
データをデータフレームに形を整える
from sklearn.datasets import load_boston boston = load_boston() df = pd.DataFrame(boston.data, columns=boston.feature_names) df['PRICE'] = boston.target df
出力:
簡単な散布図を描く
plt.scatter(df['PRICE'], df['RM']) plt.show()
出力:
簡単なコードで散布図が描画されました。右上がりになっているように見えます。
では、コードを見ていきましょう。
解説
このグラフでは少し分かりずらいので、グラフをカスタマイズしてみましょう。
散布図をカスタマイズする
plt.figure(figsize=(8,5),dpi=150) plt.scatter(df['PRICE'], df['RM'], s=30, alpha=0.5, c='black',edgecolors="w") plt.title('散布図', fontsize=30) plt.xlabel('PRICE', fontsize=20) plt.ylabel('RM', fontsize=20) plt.show()
出力:
解説
これは、例としただけなので、みなさんも解説をもとに、カスタマイズしてみて下さい。
プレゼン資料にする場合は、図を高解像にしたほうが見た目が良くなります(dpi)。
データ数が多くなると、点の大きさを小さく(s)、点を透過させる(alpha)、などの対処が必要です。
searbornで散布図を描く
sns.jointplot(x='PRICE', y='RM', data=df, kind='reg', size=7) plt.xlabel('PRICE', fontsize=20) plt.ylabel('RM', fontsize=20)
出力:
解説
この少ないコードで、散布図だけでなく、X軸とY軸のデータのヒストグラムも描画されます。
非常に便利ですね。わたしはよく使います。
散布図で回帰線を描く
plt.figure(figsize=(12,8)) sns.regplot(x='PRICE', y='RM', data=df, ci=99) plt.title('回帰線', fontsize=30) plt.xlabel('PRICE', fontsize=20) plt.ylabel('RM', fontsize=20)
出力:
解説
上のjointplotでも回帰線は描画できますが、こちらの方がシンプルでいいかもしれません。
信頼区間は好みやデータの性質で判断して、数値を指定して下さい。
散布図をたくさん描く
sns.pairplot(data=df, vars=["INDUS","NOX","RM","AGE","LSTAT","PRICE"], corner=True)
出力:
解説
vars=以下のコードはなくでもいいですが、このコードは処理が遅いので、図にしたい変数の指定と、重複した図は非表示にしたほうがいいでしょう。
タイタニックのデータで散布図を描く
df = sns.load_dataset('titanic') # タイタニックのデータを df に入れる
sns.set(style="darkgrid") plt.figure(figsize=(10,7)) sns.scatterplot(data=df, x='fare', y='age')
群分けした散布図を描く
2行目のコードにある、style= で群分けしたい変数(特徴量)を指定する。
plt.figure(figsize=(10,7)) sns.scatterplot(data=df, x='fare', y='age',style='survived')
点の形が変わる。0は●、1は×になった。
2行目のコードにある、size= で群分けしたい変数(特徴量)を指定する。
plt.figure(figsize=(10,7)) sns.scatterplot(data=df, x='fare', y='age', size='survived') plt.show()
点の大きさが変わった。0は大きい●、1は小さい●になった。
2行目のコードにある、hue= で群分けしたい変数(特徴量)を指定する。
plt.figure(figsize=(10,7)) sns.scatterplot(data=df, x='fare', y='age', hue='survived') plt.show()
点の色が変わった。0は青色、1オレンジ色になった。
いろいろな群分けをいっぺんにしてみる。
plt.figure(figsize=(10,7)) sns.scatterplot(data=df, x='fare', y='age', hue='survived', style='pclass', size='sex') plt.show()
少し複雑だが、さまざまな群分けでデータの可視化ができる。
群分けを2つの散布図で描く
col= で群分けしたい変数(特徴量)を指定する。
sns.relplot(data=df, x='fare', y='age', col='survived', kind='scatter') plt.show()
2群に別れたグラフが2つ作成される。
さらに、群分けができる。
sns.relplot(data=df, x='fare', y='age', col='survived', hue='sex', kind='scatter') plt.show()
このあたりまでグラフを作成できれば、散布図は問題なく使いこなせるでしょう。細かいカスタマイズは、まだまだできるが、次の機会にしておきます。
コメント