K_DM Book
用語集
対象者 高校生
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

線形回帰(高校生向け)

入門高校生

02.1.1 高校生向け

線形回帰(高校生向け)

最終更新 2026-10-31 読了時間 2 分
まとめ
線形回帰は、散らばった点のまん中に「いちばん当てはまる直線 \(y = ax + b\)」を引いて、まだ見ていない \(x\) に対する \(y\) を予測する方法です。「いちばん当てはまる」の基準は、各点と直線のズレ(残差)を 2 乗して全部足した値を最小にすることで、これを最小二乗法と呼びます。傾き \(a\) は「\(x\) が 1 増えると \(y\) がどれだけ変わるか」、切片 \(b\) は「\(x = 0\) のときの \(y\)」と読みます。このページでは気温とアイスの売上 5 日分を例に、平均だけを使って傾き 4.7、切片 −74 を手計算し、31 ℃ の日の売上を予測します。

こんな場面を想像してみよう #

文化祭で、気温とアイスの売上を 10 日分メモしたとします。横軸に気温、縦軸に売上をとって 10 個の点を打つと、右上がりにばらついた点の集まりになります。

ここで「明日の予想気温は 31 ℃。アイスは何個仕込めばいい?」と聞かれたら、どう答えますか。点の集まりのまん中を通る直線を 1 本引いて、その直線を 31 ℃ まで延長して読む。これが線形回帰の発想です。

散布図とそれに当てはめた回帰直線(オレンジの×が観測データ、青い線が回帰直線)

上の図では、×印がメモした点、青い直線が「いちばん当てはまる直線」です。

「いちばん当てはまる」をどう決める? #

直線は無数に引けます。そこで基準を決めます。まず、各点から直線までの縦方向のズレ(残差)を測ります。次に、そのズレを 2 乗します。プラスのズレとマイナスのズレが打ち消し合わないようにするためで、残差 4 の点は残差 1 の点の 16 倍重く数えられる効果もあります。最後に 2 乗したズレを全部足します。

この合計(残差の 2 乗和)がいちばん小さくなる直線を選びます。「ズレの 2 乗の合計を最小にする」をそのまま読んだ名前が「最小二乗法」です。

動かして見てみよう #

下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。

直線の式はこう決まる #

一次関数の形で書くと

$$ y = ax + b $$

です。ズレの 2 乗の合計を最小にする \(a\) と \(b\) は、平均を使って次のように求まります(導き方は標準版で扱います)。

$$ a = \frac{(x\text{のズレ}) \times (y\text{のズレ})\ \text{の合計}}{(x\text{のズレ})^2\ \text{の合計}}, \qquad b = \bar{y} - a\,\bar{x} $$

ここで「\(x\) のズレ」は \(x_i - \bar{x}\)(各データと平均との差)、\(\bar{x}, \bar{y}\) はそれぞれの平均です。

傾き \(a\) は、気温が 1 ℃ 上がると売上が何個増えるかを表します。切片 \(b\) は気温 0 ℃ のときの売上ですが、0 ℃ でアイスは売れないので現実には意味がありません。切片は「直線の位置を決める定数」と割り切って読むのがコツです。

直線は必ず点 \((\bar{x}, \bar{y})\)(平均の点)を通ります。手で傾きを調べたいときは、平均の点 \((\bar{x}, \bar{y})\) を中心に直線を回してみると感覚がつかめます。

電卓感覚で計算してみる #

次のコードは、気温と売上 5 日分のデータから傾き a と切片 b を平均だけで計算し、31 ℃ の売上を予測します。上の式の分子 num と分母 den がそのまま出てくるので、式とコードを 1 行ずつ対応させて読めます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
temps = [24, 27, 29, 31, 33]       # 気温(℃)
sales = [40, 55, 63, 70, 84]       # アイスの売上(個)

mean_t = sum(temps) / len(temps)   # 気温の平均
mean_s = sum(sales) / len(sales)   # 売上の平均

# 分子: (xのズレ)*(yのズレ) の合計 / 分母: (xのズレ)^2 の合計
num = sum((t - mean_t) * (s - mean_s) for t, s in zip(temps, sales))
den = sum((t - mean_t) ** 2 for t in temps)
a = num / den
b = mean_s - a * mean_t

print(f"slope a = {a:.2f}, intercept b = {b:.1f}")
print(f"forecast at 31 C = {a * 31 + b:.0f}")

結果はおよそ「傾き 4.7、切片 −74」。つまり気温が 1 ℃ 上がるごとに売上は約 5 個増えると読めます。

気をつけたいこと #

最初の課題は範囲の外です。24〜33 ℃ のデータで作った直線を 45 ℃ に当てはめても、正しいとは限りません。二つ目は外れ値で、1 日だけ団体客が来て売上が跳ねた日があると、2 乗するぶん直線が強く引っぱられます。そういう日を除くか、外れ値に強いロバスト回帰を使います。三つ目は直線でない関係です。点が 2 次関数のように曲がって並ぶなら、直線を無理に当てはめず多項式回帰を考えます。

やってみよう #

まず、身長と靴のサイズのように「右上がりになりそうなペア」を身の回りから 3 つ考えてみてください。次に、上のコードの temps と sales を自分のデータに書き換えて、出てきた傾きの意味を言葉で説明してみましょう。最後に「切片の値に意味がない例」を 1 つ考えてみてください。ヒントは、\(x = 0\) が現実にありえないケースです。

つぎに読む #

数式の導き方と scikit-learn での実装は 標準版の線形回帰 で扱っています。「どれくらい当てはまっているか」を決定係数 R² などの数値で測る方法は 回帰の評価指標 にまとめています。直線が合わないデータへの対処は 多項式回帰、外れ値への対処は ロバスト回帰 に進んでください。