見出し画像

Pythonで散布図を描く。

(1)散布図を描く。

 グラフの作成に関するアーカイブです。今回は散布図になります。

(2)使うデータ

 いつもどおりirisデータです。

(3)実際に描いてみる

 今回のコードはこちらです。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

df = pd.read_csv('iris.csv')
print(df)
print(df.describe())

plt.xticks(np.arange(0, 11, 1))
plt.xlim(0, 10)
plt.yticks(np.arange(0, 7, 1))
plt.ylim(0, 6)

plt.title('散布図')
plt.xlabel('がくの長さ')
plt.ylabel('がくの幅')

plt.grid(linestyle='dotted')

plt.scatter(df['sepal.length'], df['sepal.width'])

#線形回帰します。
slope, intercept, r_value, p_value, slope_std_error = stats.linregress(df['sepal.length'], df['sepal.width'])
predict_y = slope * df['sepal.length'] + intercept
plt.plot(df['sepal.length'], predict_y, color='black', linestyle='solid', linewidth = 1)

r = round(r_value, 3)
p = round(p_value, 4)

plt.text(1, 5.5, 'p-value=' + str(p), va='bottom')
plt.text(1, 5.3, 'Pearson R=' + str(r), va='bottom')

plt.show()

 出来上がりの図はこちらです。

画像1

 以下、解説です。なお1~16行目は過去の記事をご覧ください。

■17行目

plt.scatter(df['sepal.length'], df['sepal.width'])

 散布図を描くコードです。散布図はもちろん、x軸y軸の2値が必要です。今回はそれぞれdf['sepal.length']df['sepal.width']を指定しています。最低限必要なコードはplt.scatter(x, y)になります。

■18~21行目

#線形回帰します。
slope, intercept, r_value, p_value, slope_std_error = stats.linregress(df['sepal.length'], df['sepal.width'])
predict_y = slope * df['sepal.length'] + intercept
plt.plot(df['sepal.length'], predict_y, color='black', linestyle='solid', linewidth = 1)

 線形回帰をするためのコードです。Excelだと2回くらいクリックすればできますが、Pythonだと若干長いコードになります。
いくつか方法はありますが、ここではstats.linregress(x, y)で線形回帰します。slope, intercept, r_value, p_value, slope_std_errorは、特定の呪文のようなものですので、気にしなくても良いです。それぞれ、傾き、切片、相関係数、P値、標準偏差になります。
 predict_y = slope * df['sepal.length'] + interceptで、y=ax+bの形で式を指定します。この式をグラフにプロットするのが、plt.plot(df['sepal.length'], predict_y, color='black', linestyle='solid', linewidth = 1)になります。ここでは、色や線の種類、線幅を指定しています。

■21~24行目

r = round(r_value, 3)
p = round(p_value, 4)
plt.text(1, 5.5, 'p-value=' + str(p), va='bottom')
plt.text(1, 5.3, 'Pearson R=' + str(r), va='bottom')

 ここでは、相関係数とそのp値をグラフに打ち込んでいます。これらは、上述のとおりすでに計算していますね。ちなみに、上記の例では、ピアソンの相関係数を計算していますが、Scipyを用いることでスピアマンの相関係数など他の統計量も計算できます。分析対象のデータの特徴に合わせて使い分けてください。また、Excelだと決定係数がプロットされますが、個人的には相関係数が大事に思います。決定係数を打ち込みたい人は、上述のrを2乗させて、プロットすればOKだと思います。

(4)まとめ

 散布図は、Excelでも簡単に描けるし、線形回帰も簡単です。なぜ、あえてPythonでやるのか?例えば、x軸の変数を固定して、y軸を複数の変数に変更してグラフを描きたい!と思ったとき、Excelでは1つ1つのグラフを描かなければいけませんが、Pythonだとfor文をかませることで一瞬でグラフ化が可能になります。とくにp値をグラフに打ち込むのは、Excelだと若干面倒に思います。急いで1つのグラフを作成しなければならない状況なら、Excelで良いと思います。論文にするなら、少しこだわってグラフを作成するのが良いのではないでしょうか。

(5)参考

 今回は特にありません。