Pythonの環境をシームレスに利用できるreticulateパッケージの関数、py_requireおよびimportを用いて、Pythonのライブラリscikit-learn(sklearn)による線形回帰モデルの構築をRコードのみでシミュレーションします。
以下に、データの作成からモデル構築、決定係数(\(R^2\))の算出、そして散布図と回帰直線の描画までを行うRのコードを示します。
必要なパッケージの読み込み
library(reticulate)
library(ggplot2)Pythonパッケージの要件を宣言
py_require()は、Rスクリプト内で必要なPythonパッケージを宣言し、環境を整える関数です。
Python仮想環境(通常はr-reticulate)にパッケージが存在するか確認し、なければインストールを促します。
py_require("scikit-learn")
# scikit-learnのバージョンを確認
import("sklearn")$`__version__`[1] "1.8.0"scikit-learnのlinear_modelモジュールをインポート
PythonのモジュールをRのオブジェクト(sklearn_lm)として読み込みます。
以降、Pythonで .を使ってアクセスするメソッドや属性は、Rでは $を使ってアクセスします(例:sklearn_lm$LinearRegression())。
# Pythonでの `from sklearn import linear_model` に相当
sklearn_lm <- import("sklearn.linear_model")シミュレーション用のダミーデータを作成
scikit-learnのモデルは、説明変数 \(X\) として「2次元配列(行:サンプル数、列:特徴量数)」を要求します。
そのため、Rの単なるベクトル x を matrix(x, ncol = 1) を使って縦ベクトルの行列に変換します。
seed <- 20260520
set.seed(seed) # 再現性のためのシード固定
x <- seq(1, 10, length.out = 50)
# y = 2x + 5 に正規乱数のノイズを加える
y <- 2 * x + 5 + rnorm(50, mean = 0, sd = 4)
# scikit-learnの説明変数(X)は2次元配列(行列やデータフレーム)である必要があるため変換
X <- matrix(x, ncol = 1)モデルの作成と学習(フィッティング)
# Pythonでの `model = linear_model.LinearRegression()` に相当
model <- sklearn_lm$LinearRegression()
# Pythonでの `model.fit(X, y)` に相当
model$fit(X, y)LinearRegression()回帰直線の予測値と決定係数(\(R^2\))の取得
model$score(X, y) を呼び出すことで、scikit-learnネイティブの機能を使って決定係数(\(R^2\))を直接計算します。
# 予測値の算出
y_pred <- model$predict(X)
# 決定係数(R^2スコア)の算出
r_squared <- model$score(X, y)
cat("決定係数 (R^2):", round(r_squared, 4), "\n")
cat("回帰係数 (傾き):", model$coef_, "\n")
cat("切片:", model$intercept_, "\n")決定係数 (R^2): 0.5168
回帰係数 (傾き): 1.755979
切片: 5.857182 散布図と回帰直線の描画
Python(scikit-learn)によるモデリングの結果(y_predなど)を、Rのライブラリ ggplot2 を利用して可視化します。
# 描画用のデータフレームを作成
df <- data.frame(X_val = x, Y_val = y, Y_pred = y_pred)
ggplot(df, aes(x = X_val)) +
geom_point(aes(y = Y_val), color = "blue", alpha = 0.6, size = 2) + # 散布図
geom_line(aes(y = Y_pred), color = "red", linewidth = 1.2) + # 回帰直線
labs(
title = "scikit-learnを用いた線形回帰モデル (Rから実行)",
subtitle = sprintf("決定係数 (R^2) = %.4f", r_squared),
x = "X",
y = "Y"
) +
theme_minimal()以上です。

