2019/10/22
RからPythonへの道(5)
今回はPythonで「4. ggplot」を実行する話をします。Rでお馴染みのグラフ化ツールggplot2のPython版です。Rでも以前はggplotパッケージと言われていたのが、種々の更新を経てggplot2になったとのこと(余談)。まず、例として『みんなのR(第二版)』に記載の単回帰のコードを利用させてもらいます。 Rのコードは以下の通りです。
data(father.son, package = 'UsingR')実行結果は以下の通りです。
library(ggplot2)
ggplot(father.son, aes(x=fheight, y=sheight)) +
geom_point() +
geom_smooth(method = "lm") +
labs(x="Fathers", y="Sons")

次に、Pythonにこのコードを実装しますが、その前にライブラリggplot(ggplot2ではないので注意)を以下のコマンドでインストールします。
pip install ggplotまず初めに、何も調べずに書いたコードは以下の通りで、案の定エラーが出ました。
# エラーの出るコード1データファイルfather_son.csvはRで読み込んだデータをcsvファイルに保存したものを使いました。実行した時のエラーは以下の通り。
import numpy as np
import pandas as pd
df = pd.read_csv('father_son.csv')
print(df.head())
ggplot(df, aes(x = fheight, y = sheight)) + geom_point() + geom_smooth(method = "lm") + labs(x = "Fathers", y = "Sons")

① utils.py
私の環境では以下のフォルダ内に該当ファイルがありましたので、中身のコードを一箇所修正しました。
/Users/x...x/anaconda3/envs/py37/lib/python3.7/site-packages/ggplot

このファイルは以下のフォルダ内にありましたので、二箇所修正しました。
/Users/x...x/anaconda3/envs/py37/lib/python3.7/site-packages/ggplot/stats

# エラーの出るコード2実行すると以下のエラーが出ました。
import numpy as np
import pandas as pd
from ggplot import *
df = pd.read_csv('father_son.csv')
p = ggplot(aes(x='fheight', y="sheight"), data=df)
print(p + geom_point() + geom_smooth(method = "lm") + labs(x="Fathers",y="Sons"))

結局、別途回帰分析をして、直線を描画することにしました。回帰分析は以前のブログを参考に、scikit-learnのlinear_modelを使いました。最終的には以下のコードに落ち着きました。
import numpy as np実行結果は以下の通り。
import pandas as pd
from ggplot import *
from sklearn import linear_model
df = pd.read_csv('father_son.csv')
# Linear Regression
x = df['fheight'].values.reshape(-1, 1) # np.ndarray
y = df['sheight'].values.reshape(-1, 1) # np.ndarray
lrm = linear_model.LinearRegression()
lrm.fit_intercept = True
lrm.fit(x, y)
print('< y = ax + b >')
print('Slope = ', (lrm.coef_[0])[0] )
print('Intercept = ', lrm.intercept_[0])
print('R-squared = ', lrm.score(x, y))
p = ggplot(aes(x='fheight', y="sheight"), data=df)
print(p + geom_point() + geom_abline(intercept = lrm.intercept_[0], slope = (lrm.coef_[0])[0], color="blue") + labs(x="Fathers",y="Sons"))
< y = ax + b >
Slope = 0.5140930386233077
Intercept = 33.886604354077924
R-squared = 0.2513401022491373

『RからPythonへの道』バックナンバー
(1) はじめに
(2) 0. 実行環境(作業環境)
(3) 1. PythonからRを使う方法
2. RからPythonを使う方法
(4) 3. データフレーム