PythonでRのスクリプトを実行するではsubprocessモジュールを使ってRスクリプトを実行してみたが、やっぱりPythonからもっとシームレスにRを使ってみたい。そこで、rpy2でPandasのデータフレームをRのデータフレームに変換して、Rの関数で重回帰分析をやってみる。
Windows10のWSL(Ubuntu 18.04)。
さらに、Rを以下のコマンドでインストールしておく。
pipでrpy2をインストール。
Pandasのデータフレームを扱うにはtzlocalも必要なのでインストールしておく。
まずはRのデータフレームに変換するPandasデータムレームを用意する。
以下のようなデータフレームが作成される。
作成したPandasデータフレームをrpy2でRデータフレームに変換してみる。
結果は以下の通り。
Rのデータフレームに変換したものを、Rのlm関数で重回帰分析する。
計算過程のようなものがずらずらと出力されるが、最後にはちゃんと結果が出力される。
環境
Windows10のWSL(Ubuntu 18.04)。
さらに、Rを以下のコマンドでインストールしておく。
rpy2のインストール
pipでrpy2をインストール。
Pandasのデータフレームを扱うにはtzlocalも必要なのでインストールしておく。
Pandasデータフレームの作成
まずはRのデータフレームに変換するPandasデータムレームを用意する。
import pandas as pd
import numpy as np
# 日付データのインデックス作成
dates = pd.date_range(
start = '4/1/2019',
periods=30
)
# 乱数の固定
np.random.seed(100)
# 0-9の乱数で配列データ作成
y = np.random.randint(10, size=30)
x1 = y + np.random.randint(10, size=30)
x2 = np.random.randint(10, size=30)
values = np.stack([y, x1, x2], 1)
# データフレーム作成
df = pd.DataFrame(values, index=dates, columns=['y', 'x1', 'x2'])
print(df)
以下のようなデータフレームが作成される。
PandasデータフレームをRデータフレームに変換
作成したPandasデータフレームをrpy2でRデータフレームに変換してみる。
import rpy2.robjects as ro
from rpy2.robjects import pandas2ri
# PandasデータフレームをRデータフレームに変換
with ro.conversion.localconverter(ro.default_converter + pandas2ri.converter):
df_r = ro.conversion.py2rpy(df)
print(df_r)
結果は以下の通り。
PythonからRのlm関数を使って重回帰分析をする
Rのデータフレームに変換したものを、Rのlm関数で重回帰分析する。
import pandas as pd
import numpy as np
import rpy2.robjects as ro
from rpy2.robjects import pandas2ri, globalenv
from rpy2.robjects.packages import importr
# Rライブラリのインポート
base = importr('base')
stats = importr('stats')
# 日付データのインデックス作成
dates = pd.date_range(
start = '4/1/2019',
periods=30
)
# 乱数の固定
np.random.seed(100)
# 0-9の乱数で配列データ作成
values = np.random.randint(10, size=(30, 3))
# データフレーム作成
df = pd.DataFrame(values, index=dates, columns=['y', 'x1', 'x2'])
#print(df)
# PandasデータフレームをRデータフレームに変換
with ro.conversion.localconverter(ro.default_converter + pandas2ri.converter):
df_r = ro.conversion.py2rpy(df)
#print(df_r)
# Rのグローバル環境変数を設定
globalenv['df_r'] = df_r
# 重回帰分析
lm_model = stats.lm('y ~ x1 + x2', data=base.as_symbol('df_r'))
print(base.summary(lm_model))
計算過程のようなものがずらずらと出力されるが、最後にはちゃんと結果が出力される。
0 件のコメント:
コメントを投稿