Bamba news

線形回帰を実装してみよう!わかりやすく解説

【スマホからでも実行可能】線形回帰をPythonで実践的に学びたい方必見!この記事では、機械学習の基本的な手法である線形回帰の仕組みから、具体的なPythonコードを用いた実装方法、モデルの評価までをステップバイステップで丁寧に解説します。データ分析や予測モデル構築の第一歩を踏み出しましょう。


線形回帰とは? – 実践編

前回までの入門編、活用例編では、線形回帰がどのようなもので、どんな場面で使われるのかを見てきました。今回は、いよいよ実践編です。実際にPythonというプログラミング言語を使って、線形回帰モデルを作り、動かしてみましょう。

「プログラミングなんてやったことない…」という方でも大丈夫です。一つ一つの手順を追いながら、ゆっくりと進めていきますので、ご安心ください。

記事の最後に、環境構築なしでスマホからでも即実行可能なGoogle Colabノートブックをご用意しています。

今回のゴール

この実践編では、以下の3つのステップで線形回帰を体験します。

  1. 準備運動: 線形回帰を動かすための道具(ライブラリ)を準備します。
  2. やってみよう(単回帰分析): 一つの原因から結果を予測するシンプルな線形回帰を実装します。例えば、「部屋の広さ」から「家賃」を予測するようなイメージです。
  3. もう少し複雑に(重回帰分析): 複数の原因から結果を予測する線形回帰を実装します。例えば、「部屋の広さ」と「駅からの距離」から「家賃」を予測するようなイメージです。
  4. 作ったモデルを評価してみよう: 作成した予測モデルが、どのくらいうまく予測できているのかを確認する方法を学びます。

専門的な言葉はできるだけ避け、わかりやすさを最優先に進めていきます。肩の力を抜いて、一緒に線形回帰の世界を体験してみましょう。


1. 準備運動:必要な道具(ライブラリ)を揃えよう

まずは、Pythonで線形回帰を行うために必要な「道具」を準備します。プログラミングの世界では、便利な機能がたくさん詰まった道具箱のことを「ライブラリ」と呼びます。

今回使う主なライブラリは以下の通りです。

  • NumPy(ナンパイ): 数値計算を効率的に行うためのライブラリです。たくさんの数字の集まり(配列)を扱ったり、数学的な計算をしたりするのに役立ちます。
  • scikit-learn(サイキットラーン): 機械学習のための非常に有名なライブラリです。線形回帰だけでなく、様々な予測モデルを簡単に作ることができます。
  • Matplotlib(マットプロットリブ): データをグラフにして見やすくするためのライブラリです。予測結果を視覚的に確認するのに使います。

これらのライブラリを使うためには、お使いのPython環境にインストールする必要があります。もしインストールされていない場合は、コマンドプロンプトやターミナルで以下のようなコマンドを実行してインストールしてください。

pip install numpy scikit-learn matplotlib

準備ができたら、さっそくPythonのコードを書いていきましょう。まずは、これらのライブラリを使えるように読み込むことから始めます。

# 数値計算のためのライブラリ NumPy を読み込む
import numpy as np

# 機械学習ライブラリ scikit-learn から線形回帰モデルを読み込む
from sklearn.linear_model import LinearRegression

# グラフ描画ライブラリ Matplotlib を読み込む
import matplotlib.pyplot as plt

# 日本語フォント設定(お使いの環境によっては不要、または設定変更が必要な場合があります)
# 例: plt.rcParams['font.family'] = 'Meiryo' # Windowsの場合
# 例: plt.rcParams['font.family'] = 'IPAexGothic' # Linux/macOSでIPAフォントをインストールしている場合
# ご自身の環境に合わせて設定してください。設定が難しい場合は、グラフのラベルが英語になることをご了承ください。

これで準備運動は完了です。いよいよ線形回帰モデルを作っていきます。


2. やってみよう(単回帰分析):シンプルな予測に挑戦

ここでは、最も基本的な「単回帰分析」を実装します。単回帰分析とは、一つの原因(説明変数) から 一つの結果(目的変数) を予測する手法です。

例えば、「勉強時間」と「テストの点数」の関係を考えてみましょう。一般的に、勉強時間が長ければ長いほど、テストの点数は高くなる傾向があると考えられます。この関係性を数式で表し、未知の勉強時間からテストの点数を予測するのが単回帰分析の目的です。

2-1. データの準備

まずは、予測モデルを作るための元となるデータが必要です。ここでは、練習用に簡単なデータを作ってみましょう。勉強時間(原因)とテストの点数(結果)の架空のデータです。

# 勉強時間 (時間) - これが原因となる数値(説明変数)です
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
# reshape(-1, 1) は、scikit-learnが扱いやすいようにデータの形を整えるおまじないです。

# テストの点数 (点) - これが結果となる数値(目的変数)です
y = np.array([30, 35, 50, 60, 65, 70, 80, 85, 90, 95])

X が勉強時間、y がテストの点数を表しています。例えば、1時間勉強したら30点、5時間勉強したら65点だった、というデータです。

2-2. 予測モデルの作成と学習

次に、このデータを使って線形回帰モデルを作成し、勉強時間とテストの点数の関係性を学習させます。

# 線形回帰モデルの器(インスタンス)を作る
model_single = LinearRegression()

# 作ったモデルに、用意したデータ(勉強時間 X と テストの点数 y)を渡して学習させる
model_single.fit(X, y)

たったこれだけで、モデルの学習は完了です。fit という命令が、データ Xy の関係性を分析し、最適な直線を引こうと頑張ってくれます。

2-3. 学習結果の確認

モデルがどのような直線を学習したのか確認してみましょう。直線は、「傾き」と「切片(Y軸との交点)」で表されます。

  • 傾き(係数): 勉強時間が1時間増えると、テストの点数が何点上がるかを示します。
  • 切片: 勉強時間が0時間だった場合の予測点数を示します(実際には0時間で点が取れるわけではないので、あくまで数式上の出発点です)。
# 学習したモデルの傾き(係数)を表示
print(f"傾き (係数): {model_single.coef_[0]}")

# 学習したモデルの切片を表示
print(f"切片: {model_single.intercept_}")

実行すると、例えば「傾き: 7.0」「切片: 23.0」のような結果が表示されるはずです(数値はデータの作り方によって多少変わります)。これは、「テストの点数 ≒ 7.0 × 勉強時間 + 23.0」という関係性をモデルが学習したことを意味します。

2-4. 新しいデータで予測してみる

学習したモデルを使って、新しい勉強時間からテストの点数を予測してみましょう。例えば、4.5時間勉強した場合や、11時間勉強した場合の点数を予測してみます。

# 予測したい新しい勉強時間
new_study_time = np.array([[4.5], [11.0]]) # 2つの値を同時に予測してみる

# 学習済みモデルを使って予測する
predicted_scores = model_single.predict(new_study_time)

# 予測結果を表示
for time, score in zip(new_study_time.flatten(), predicted_scores):
    print(f"{time} 時間勉強した場合の予測点数: {score:.2f} 点")

predict という命令で、学習済みのモデルが新しいデータに対して予測を行ってくれます。

2-5. 結果をグラフで見てみよう

最後に、元のデータと学習した直線、そして予測結果をグラフで見てみましょう。視覚的に確認することで、モデルがどのようにデータを捉えているかがよくわかります。

# 元のデータを点でプロット
plt.scatter(X, y, color='blue', label='実際のデータ')

# 学習した直線を描画
plt.plot(X, model_single.predict(X), color='red', label='予測された直線')

# 新しいデータで予測した点をプロット(もしあれば)
# 今回は new_study_time の予測結果もプロットしてみましょう
plt.scatter(new_study_time, predicted_scores, color='green', marker='X', s=100, label='新しいデータの予測値')

# グラフのタイトルやラベルを設定
plt.title('勉強時間とテストの点数の関係(単回帰)')
plt.xlabel('勉強時間 (時間)')
plt.ylabel('テストの点数 (点)')
plt.legend() # 凡例を表示
plt.grid(True) # グリッド線を表示
plt.show()

このグラフを見ると、赤い直線が青い点の集まり(実際のデータ)の傾向をうまくとらえようとしていることがわかります。緑のバツ印が、先ほど予測した新しい勉強時間に対する点数です。


3. もう少し複雑に(重回帰分析):複数の原因から予測

単回帰分析では一つの原因から結果を予測しましたが、現実の世界では、一つの結果に対して複数の要因が絡み合っていることがほとんどです。例えば、家賃は部屋の広さだけでなく、駅からの距離、築年数など、様々な要因によって決まります。

このように、複数の原因(説明変数) から 一つの結果(目的変数) を予測する手法を「重回帰分析」と呼びます。

3-1. データの準備

ここでは、架空の不動産データを使って重回帰分析を試してみましょう。家賃(結果)に対して、部屋の広さ(原因1)と駅からの距離(原因2)が影響すると仮定します。

# 部屋の広さ (平方メートル) と 駅からの距離 (分) - これらが原因となる数値(説明変数)です
X_multi = np.array([
    [30, 10],  # 広さ30平米, 駅から10分
    [40, 5],   # 広さ40平米, 駅から5分
    [25, 15],
    [50, 3],
    [35, 12],
    [45, 8],
    [20, 20],
    [60, 2],
    [28, 18],
    [55, 6]
])

# 家賃 (万円) - これが結果となる数値(目的変数)です
y_rent = np.array([8, 15, 6, 20, 7, 16, 5, 25, 5.5, 18])

X_multi は、各物件の「広さ」と「駅からの距離」をまとめたものです。y_rent が対応する家賃です。

3-2. 予測モデルの作成と学習

モデルの作成と学習の手順は、単回帰分析の時とほとんど同じです。

# 重回帰分析用の線形回帰モデルの器を作る
model_multi = LinearRegression()

# 用意したデータ(広さと距離 X_multi と 家賃 y_rent)を渡して学習させる
model_multi.fit(X_multi, y_rent)

scikit-learnのLinearRegressionは、入力される説明変数の数に応じて、単回帰も重回帰も自動的に処理してくれます。

3-3. 学習結果の確認

重回帰分析の場合、傾き(係数)は各説明変数に対して一つずつ計算されます。

# 学習したモデルの各説明変数に対する傾き(係数)を表示
print(f"傾き (係数): {model_multi.coef_}")
# 1番目の係数が「広さ」に対するもの、2番目の係数が「駅からの距離」に対するもの

# 学習したモデルの切片を表示
print(f"切片: {model_multi.intercept_}")

例えば、「傾き: [0.5, -0.8]」「切片: 3.0」のような結果が得られたとします。 これは、予測式が「家賃 ≒ 0.5 × 広さ - 0.8 × 駅からの距離 + 3.0」のようになったことを意味します。 広さが1平方メートル増えると家賃が0.5万円上がり、駅からの距離が1分増えると家賃が0.8万円下がる、という関係性を学習したことになります。(実際の数値はデータの作り方で変わります)

3-4. 新しいデータで予測してみる

新しい物件情報(広さと駅からの距離)から家賃を予測してみましょう。

# 予測したい新しい物件情報 [広さ, 駅からの距離]
new_properties = np.array([
    [38, 7],   # 広さ38平米, 駅から7分
    [22, 12]   # 広さ22平米, 駅から12分
])

# 学習済みモデルを使って予測する
predicted_rents = model_multi.predict(new_properties)

# 予測結果を表示
for prop, rent in zip(new_properties, predicted_rents):
    print(f"広さ {prop[0]}平米, 駅から {prop[1]}分 の物件の予測家賃: {rent:.2f} 万円")

このように、複数の情報を使って予測ができるのが重回帰分析の強みです。

3-5. 結果の可視化(少し工夫が必要)

重回帰分析の場合、説明変数が2つあると、予測結果は3次元空間上の平面になります。これを2次元のグラフで完全に表現するのは難しいですが、工夫次第で傾向を掴むことは可能です。

例えば、一つの説明変数を固定して、もう一つの説明変数と目的変数の関係をプロットしたり、3Dプロットを使ったりする方法があります。ここでは、簡単のため、実際の値と予測値を比較する形でプロットしてみましょう。

# 実際の家賃と予測された家賃を比較する
predicted_y_rent = model_multi.predict(X_multi) # 学習データに対する予測値

plt.figure(figsize=(8, 6))
plt.scatter(y_rent, predicted_y_rent, color='purple')
plt.plot([min(y_rent), max(y_rent)], [min(y_rent), max(y_rent)], color='red', linestyle='--') # 理想的な予測線 (y=x)
plt.title('実際の家賃 vs 予測された家賃(重回帰)')
plt.xlabel('実際の家賃 (万円)')
plt.ylabel('予測された家賃 (万円)')
plt.grid(True)
plt.show()

このグラフでは、点が赤い破線(実際の値と予測値が完全に一致する線)に近いほど、モデルの予測が正確であることを示します。


4. 作ったモデルを評価してみよう

線形回帰モデルを作って予測ができるようになりましたが、そのモデルが「どのくらいうまく予測できているのか?」を客観的に知ることも重要です。モデルの性能を測るための指標がいくつかあります。

ここでは、代表的な評価指標である「決定係数(R-squared, R2R^2」を紹介します。

決定係数は、モデルが元のデータのばらつき(変動)をどれだけ説明できているかを示す値で、0から1の間の値を取ります。1に近いほど、モデルの当てはまりが良い(よく説明できている)と解釈できます。

scikit-learnを使えば、決定係数も簡単に計算できます。

4-1. 単回帰モデルの評価

まずは、先ほど作成した勉強時間とテストの点数の単回帰モデル(model_single)の決定係数を計算してみましょう。

# 単回帰モデルの決定係数を計算
r2_single = model_single.score(X, y)
print(f"単回帰モデルの決定係数 (R^2): {r2_single:.4f}")

score メソッドに、学習に使った説明変数 X と目的変数 y を渡すことで、決定係数が計算されます。

4-2. 重回帰モデルの評価

次に、家賃予測の重回帰モデル(model_multi)の決定係数を計算します。

# 重回帰モデルの決定係数を計算
r2_multi = model_multi.score(X_multi, y_rent)
print(f"重回帰モデルの決定係数 (R^2): {r2_multi:.4f}")

決定係数の値を見ることで、モデルがどの程度データに適合しているかの目安が得られます。ただし、決定係数が高いからといって、必ずしもそれが「良いモデル」であるとは限りません。データが少なすぎたり、複雑すぎるモデルを作ったりすると、「過学習」という問題が起きることがあります。過学習については、また別の機会に詳しく見ていきましょう。

モデルの評価は、作ったモデルが信頼できるかどうかを判断するための重要なステップです。


注意点とさらに学ぶために

線形回帰はシンプルで強力な手法ですが、使う上でいくつか知っておくと良い注意点があります。

  • データの形が大事: 線形回帰は、原因と結果の関係が「直線的」であることを前提としています。もし、データの関係が曲線的だったり、もっと複雑だったりする場合は、うまく予測できないことがあります。データをグラフにして、関係性を目で見て確認することが大切です。
  • 外れ値の影響: データの中に、他と比べて極端にかけ離れた値(外れ値)があると、モデルがそれに引っ張られてしまい、全体の傾向をうまく捉えられなくなることがあります。外れ値がある場合は、その扱いをどうするか検討が必要です。
  • 多重共線性(重回帰の場合): 重回帰分析で、原因となる数値(説明変数)同士が非常に似たような動きをしている場合(例えば、「身長」と「体重」のように、片方が増えればもう片方も増える傾向が強いもの)、モデルの安定性が損なわれたり、解釈が難しくなったりすることがあります。これを「多重共線性(たじゅうきょうせんせい)」と呼びます。

これらの注意点に加えて、線形回帰にはさらに発展的な使い方や、関連する他の手法もたくさんあります。

  • 多項式回帰: 直線ではなく、曲線でデータを予測したい場合に使う手法です。
  • 正則化回帰(リッジ回帰、ラッソ回帰など): モデルが複雑になりすぎるのを防ぎ、過学習を抑えるための工夫がされた線形回帰の手法です。

これらの手法については、また別の機会に詳しくご紹介できればと思います。


まとめ:手を動かして理解を深めよう

今回は、線形回帰の実践編として、Pythonを使った具体的な実装方法を見てきました。単回帰分析から重回帰分析、そしてモデルの評価まで、一通りの流れを体験していただけたでしょうか。

  • NumPy でデータを準備し、
  • scikit-learnLinearRegression を使ってモデルを作り、
  • fit で学習させ、
  • predict で予測を行い、
  • coef_intercept_ で学習結果を確認し、
  • score でモデルを評価する。

これらの基本的なステップは、他の多くの機械学習モデルを扱う際にも共通する部分が多いです。

実際にコードを書いて動かしてみることで、理論だけではわからなかった部分が見えてきたり、新たな疑問が生まれたりすることでしょう。それが、理解を深めるための第一歩です。

今回紹介したコードはあくまで基本的なものです。ぜひ、ご自身でデータやパラメータを変えてみたり、新しいデータセットで試してみたりして、線形回帰と仲良くなってみてください。

データの中から隠れたパターンを見つけ出し、未来を予測する。線形回帰は、その面白さを手軽に体験できる素晴らしい入り口です。この実践編が、皆さんのデータ活用の旅の一助となれば幸いです。


図解即戦力 データ分析の基本と進め方がこれ1冊でしっかりわかる教科書

本書は、データ分析の初学者であるビジネスパーソンを主な読者層として、「データ分析とは何か」「ビジネスにデータ分析をどう活用できるか」という基本的な疑問から始まり、実際のプロジェクト遂行、そして分析結果の評価まで、段階的に学べるよう構成されています。

▶ Amazonで見る

環境構築なし
実行できるファイルはこちら!

このボタンからGoogle Colabを開き、すぐにコードをお試しいただけます。

お仕事のご依頼・ご相談はこちら

フロントエンドからバックエンドまで、アプリケーション開発のご相談を承っております。
まずはお気軽にご連絡ください。

関連する記事

主成分分析(PCA)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】主成分分析(PCA)のPythonによる実装方法を、初心者向けにコード付きで丁寧に解説します。scikit-learnライブラリを使い、データの要約から可視化までをステップバイステップで学べます。機械学習やデータ分析の第一歩に最適です。

KAN (Kolmogorov-Arnold Networks)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】AIの新しい波、KAN(Kolmogorov-Arnold Networks)の実装方法を、具体的なPythonコード付きで一から丁寧に解説。本記事では、KANの理論的な背景から、実際の回帰問題への適用、モデルの解釈、そしてチューニングまでを網羅。機械学習の新しいアーキテクチャを実践的に学びたい方に最適です。

畳み込みニューラルネットワーク(CNN)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】畳み込みニューラルネットワーク(CNN)の実装方法を初心者にも分かりやすく解説。Pythonコード付きで、画像認識の仕組みを実践的に学べます。AI、ディープラーニング、画像分類に興味がある方必見です。

ガウス過程回帰を実装してみよう!わかりやすく解説

【スマホからでも実行可能】Pythonでガウス過程回帰を実装する方法を初心者向けにわかりやすく解説します。機械学習のモデル構築や不確実性の可視化に興味がある方必見です。

ベイズ最適化を実装してみよう!わかりやすく解説

【スマホからでも実行可能】ベイズ最適化の実装方法をPythonコード付きで徹底解説。機械学習のハイパーパラメータチューニングを効率化したい方必見。サンプルコードを動かしながら、実践的に学べます。