Skip to main content
Back to module
Statistics Fundamentals · Relationships Between Variables

Simple linear regression

Reading44mLesson 2 of 3 in this module

What you'll learn

  • Fit and interpret a regression line
  • Calculate the least-squares slope and intercept
  • Interpret the slope with units and the intercept only when x = 0 makes sense
  • Check residuals and avoid extrapolating beyond the data

Fit a least-squares line, interpret its slope and intercept, and use it to predict responsibly.

Why this matters

Correlation tells you how strongly two variables move together. Regression goes a step further: it gives you a line you can use to predict one variable from the other, and a slope that says how much y changes per unit of x. Engineers use it for calibration curves, lab technicians for standard curves, analysts for "every extra $1,000 of ad spend brings about 30 more sign-ups". Simple linear regression, with one predictor and a straight line, is the foundation for every more advanced model you will meet.

The model

predicted y = intercept + slope * x
  • x is the explanatory (predictor) variable.
  • y is the response (outcome) variable.
  • slope (b): the change in predicted y for a one-unit increase in x.
  • intercept (a): the predicted y when x = 0.

Unlike correlation, regression is not symmetric. Predicting y from x gives a different line from predicting x from y, so decide which variable is the response.

Least squares

Many lines could pass through a cloud of points. The least-squares line is the one that makes the sum of squared residuals as small as possible. A residual is the vertical gap between a point and the line:

residual = actual y - predicted y

Squaring keeps positive and negative gaps from cancelling and penalises big misses most. The formulas:

dx = x - mean(x)       dy = y - mean(y)

slope     = sum(dx * dy) / sum(dx^2)
intercept = mean(y) - slope * mean(x)

The line always passes through the point (mean x, mean y).

Worked example: a calibration curve

A lab measures the absorbance of standard solutions of known concentration (mg/L):

conc (x):        0,    2,    4,    6,    8      mean 4
absorbance (y):  0.02, 0.21, 0.39, 0.62, 0.81   mean 0.41

dx:     -4,    -2,    0,    2,    4
dy:  -0.39, -0.20, -0.02, 0.21, 0.40
dx*dy: 1.56, 0.40,  0.00, 0.42, 1.60     sum = 3.98
dx^2:  16,   4,     0,    4,    16       sum = 40

slope     = 3.98 / 40 = 0.0995 absorbance units per mg/L
intercept = 0.41 - 0.0995 * 4 = 0.012

The fitted line is absorbance ≈ 0.012 + 0.0995 × conc. An unknown sample reads 0.50, so its concentration is about (0.50 − 0.012) / 0.0995 ≈ 4.9 mg/L. Real calibration work follows the lab's validated method and acceptance criteria; this shows only the arithmetic.

Interpreting the line

  • Slope: "Each additional mg/L raises predicted absorbance by about 0.0995." Always state units, and say "predicted" or "on average".
  • Intercept: only meaningful if x = 0 makes sense and is inside the data. Here 0 mg/L is a blank, so 0.012 is the blank's predicted reading. For "salary vs years of experience", x = 0 is a new hire and is reasonable; for "weight vs height", height 0 is nonsense.
  • r²: the share of variation in y explained by the line. Here r² is about 0.999, typical for a good calibration. For people or markets, 0.3 can be useful.

Check the residuals

Plot residuals against x. A good linear fit leaves a shapeless band around zero. A curve in the residuals means the relationship is not linear. A funnel (residuals spreading out as x grows) means the variability changes, and the simple model's uncertainty estimates will be off.

Extrapolation

The line is trustworthy only inside the range of x you measured. The calibration above used 0 to 8 mg/L. Predicting the absorbance at 40 mg/L assumes the line stays straight five times beyond the data, and instruments often saturate. Predicting outside the data range is called extrapolation and is a common source of embarrassing forecasts.

In Python

Python
import statistics

conc = [0, 2, 4, 6, 8]
absorb = [0.02, 0.21, 0.39, 0.62, 0.81]
fit = statistics.linear_regression(conc, absorb)
print(fit.slope, fit.intercept)   # 0.0995 0.012

statistics.linear_regression (Python 3.10 and later) returns the least-squares slope and intercept. Libraries such as statsmodels and scikit-learn add standard errors, multiple predictors and diagnostics; later courses use them.

Common mistakes

  • Interpreting an intercept where x = 0 is meaningless.
  • Extrapolating far beyond the data.
  • Reading the slope as a causal effect from observational data.
  • Fitting a line without looking at the scatter plot and residuals.

Quick recap

  • predicted y = intercept + slope × x, fitted by least squares.
  • slope = sum(dx·dy) / sum(dx²); intercept = mean(y) − slope × mean(x).
  • Interpret the slope with units; interpret the intercept only when x = 0 is meaningful.
  • Check residuals, and do not extrapolate.

Try it

In the Do tab, write the slope formula and use the line to read an unknown sample.

Key terms (5)

slope
The change in predicted y for a one-unit increase in x.
intercept
The predicted y when x is 0, meaningful only if x = 0 makes sense and is within the data.
least-squares
The line that makes the sum of squared residuals as small as possible.
residual
The vertical gap between a point and the line: actual y minus predicted y.
extrapolation
Using a fitted line to predict outside the range of x values that were measured.

Recap

  • Predicted y = intercept + slope times x, fitted by least squares.
  • slope = sum(dx*dy) / sum(dx^2) and intercept = mean(y) - slope times mean(x).
  • Interpret the slope with units, and the intercept only when x = 0 is meaningful.
  • Plot the residuals: a curve or funnel means the simple model does not fit well.
  • Do not extrapolate beyond the measured range.
Also in this lesson: