Time Series Analysis of Air Passenger Data
This notebook demonstrates a beginner-friendly time series analysis
using the built-in AirPassengers
dataset in R. We’ll
explore the data, visualize trends and seasonality, check for
stationarity, apply transformations, and fit an ARIMA model to forecast
future values.
1. Load libraries and dataset
Explanation
The dataset represents a time series with monthly observations. It’s
a commonly used dataset for learning time series because it has clear
trends and seasonal patterns.
Step 2: Plot the Time Series
A plot of the time series helps visualize the overall trend and
seasonal patterns.
# Basic plot of the time series
plot(AirPassengers, main = "Air Passenger Numbers Over Time", ylab = "Passengers (Thousands)", xlab = "Year")

Interpretation
From the plot, we can observe an upward trend in the number of
passengers over time, along with a repeating seasonal pattern each
year.
Step 3: Decompose the Time Series
Decomposing the time series allows us to separate it into trend,
seasonal, and random (remainder) components.
# Decompose the time series
decomposed_data <- decompose(AirPassengers)
plot(decomposed_data)

Explanation
The decomposition reveals three components:
- Trend: The general direction in which the series is moving.
- Seasonal: Regularly repeating patterns within each year.
- Random: Noise or irregularities in the data that do not follow a
trend or seasonality.
Step 4: Check for Stationarity
To build an ARIMA model, the time series should be stationary. We can
check stationarity using the Augmented Dickey-Fuller (ADF) test.
# Perform ADF test
adf_test <- adf.test(AirPassengers, alternative = "stationary")
Warning: p-value smaller than printed p-value
print(adf_test)
Augmented Dickey-Fuller Test
data: AirPassengers
Dickey-Fuller = -7.3186, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary
Interpretation
The p-value from the ADF test indicates whether the series is
stationary. If it’s greater than 0.05, the series is non-stationary, and
we may need to transform it.
In this case, since the Augmented Dickey-Fuller (ADF) test indicates
that the AirPassengers dataset is already stationary (p-value <
0.01), you do not need to apply further transformations like
differencing. The dataset can be directly used to fit the ARIMA model
without additional steps for stationarity
Step 6: Fit an ARIMA Model for Forecasting
An ARIMA (AutoRegressive Integrated Moving Average) model is commonly
used for time series forecasting.
# Fit an ARIMA model
fit <- auto.arima(AirPassengers)
summary(fit)
Series: AirPassengers
ARIMA(2,1,1)(0,1,0)[12]
Coefficients:
ar1 ar2 ma1
0.5960 0.2143 -0.9819
s.e. 0.0888 0.0880 0.0292
sigma^2 = 132.3: log likelihood = -504.92
AIC=1017.85 AICc=1018.17 BIC=1029.35
Training set error measures:
ME RMSE MAE MPE MAPE MASE ACF1
Training set 1.342306 10.84619 7.867539 0.4206996 2.800458 0.245628 -0.001248451
Interpretation
- Good Fit: The relatively low values for RMSE, MAE, and MAPE suggest
that the model is performing well.
- Next Steps: Since the residual autocorrelation (ACF1) is close to
zero, indicating no significant patterns left in the residuals, you can
move forward with forecasting.
Step 7: Forecast Future Values
Using the ARIMA model, we can forecast future passenger numbers.
# Forecast the next 24 months (2 years)
forecasted_data <- forecast(fit, h = 24)
plot(forecasted_data, main = "Air Passenger Forecast")

Interpretation
The forecast plot shows the expected passenger numbers for the next
two years, along with prediction intervals. The model takes into account
the seasonal patterns and trend observed in the historical data.
Summary
In this project, we:
- Loaded and visualized the AirPassengers dataset.
- Decomposed the time series to examine trend, seasonality, and
noise.
- Checked for stationarity and applied differencing to make the series
stationary.
- Built an ARIMA model and forecasted future values.
- This analysis provides a basic understanding of time series concepts
and forecasting methods in R.
LS0tCnRpdGxlOiAiVGltZSBTZXJpZXMgQW5hbHlzaXMgb2YgQWlyIFBhc3NlbmdlciBEYXRhIgphdXRob3I6ICJKZWJpbiBMYXJvc2ggSmVydmlzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKCiMgVGltZSBTZXJpZXMgQW5hbHlzaXMgb2YgQWlyIFBhc3NlbmdlciBEYXRhCgpUaGlzIG5vdGVib29rIGRlbW9uc3RyYXRlcyBhIGJlZ2lubmVyLWZyaWVuZGx5IHRpbWUgc2VyaWVzIGFuYWx5c2lzIHVzaW5nIHRoZSBidWlsdC1pbiBgQWlyUGFzc2VuZ2Vyc2AgZGF0YXNldCBpbiBSLiBXZSdsbCBleHBsb3JlIHRoZSBkYXRhLCB2aXN1YWxpemUgdHJlbmRzIGFuZCBzZWFzb25hbGl0eSwgY2hlY2sgZm9yIHN0YXRpb25hcml0eSwgYXBwbHkgdHJhbnNmb3JtYXRpb25zLCBhbmQgZml0IGFuIEFSSU1BIG1vZGVsIHRvIGZvcmVjYXN0IGZ1dHVyZSB2YWx1ZXMuCgoKIyMgMS4gTG9hZCBsaWJyYXJpZXMgYW5kIGRhdGFzZXQgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcwoKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeSh0c2VyaWVzKQoKIyBMb2FkIHRoZSBBaXJQYXNzZW5nZXJzIGRhdGFzZXQKZGF0YSgiQWlyUGFzc2VuZ2VycyIpCgoKc3VtbWFyeShBaXJQYXNzZW5nZXJzKQoKcHJpbnQoQWlyUGFzc2VuZ2VycykKCgpgYGAKCgojIyMgRXhwbGFuYXRpb24KVGhlIGRhdGFzZXQgcmVwcmVzZW50cyBhIHRpbWUgc2VyaWVzIHdpdGggbW9udGhseSBvYnNlcnZhdGlvbnMuIEl04oCZcyBhIGNvbW1vbmx5IHVzZWQgZGF0YXNldCBmb3IgbGVhcm5pbmcgdGltZSBzZXJpZXMgYmVjYXVzZSBpdCBoYXMgY2xlYXIgdHJlbmRzIGFuZCBzZWFzb25hbCBwYXR0ZXJucy4KCiMjIFN0ZXAgMjogUGxvdCB0aGUgVGltZSBTZXJpZXMKCkEgcGxvdCBvZiB0aGUgdGltZSBzZXJpZXMgaGVscHMgdmlzdWFsaXplIHRoZSBvdmVyYWxsIHRyZW5kIGFuZCBzZWFzb25hbCBwYXR0ZXJucy4KCmBgYHtyfQojIEJhc2ljIHBsb3Qgb2YgdGhlIHRpbWUgc2VyaWVzCnBsb3QoQWlyUGFzc2VuZ2VycywgbWFpbiA9ICJBaXIgUGFzc2VuZ2VyIE51bWJlcnMgT3ZlciBUaW1lIiwgeWxhYiA9ICJQYXNzZW5nZXJzIChUaG91c2FuZHMpIiwgeGxhYiA9ICJZZWFyIikKCmBgYAoKIyMjIEludGVycHJldGF0aW9uCkZyb20gdGhlIHBsb3QsIHdlIGNhbiBvYnNlcnZlIGFuIHVwd2FyZCB0cmVuZCBpbiB0aGUgbnVtYmVyIG9mIHBhc3NlbmdlcnMgb3ZlciB0aW1lLCBhbG9uZyB3aXRoIGEgcmVwZWF0aW5nIHNlYXNvbmFsIHBhdHRlcm4gZWFjaCB5ZWFyLgoKCiMjIFN0ZXAgMzogRGVjb21wb3NlIHRoZSBUaW1lIFNlcmllcwoKRGVjb21wb3NpbmcgdGhlIHRpbWUgc2VyaWVzIGFsbG93cyB1cyB0byBzZXBhcmF0ZSBpdCBpbnRvIHRyZW5kLCBzZWFzb25hbCwgYW5kIHJhbmRvbSAocmVtYWluZGVyKSBjb21wb25lbnRzLgoKYGBge3J9CiMgRGVjb21wb3NlIHRoZSB0aW1lIHNlcmllcwpkZWNvbXBvc2VkX2RhdGEgPC0gZGVjb21wb3NlKEFpclBhc3NlbmdlcnMpCnBsb3QoZGVjb21wb3NlZF9kYXRhKQoKYGBgCgogCiMjIEV4cGxhbmF0aW9uClRoZSBkZWNvbXBvc2l0aW9uIHJldmVhbHMgdGhyZWUgY29tcG9uZW50czoKCiogVHJlbmQ6IFRoZSBnZW5lcmFsIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgc2VyaWVzIGlzIG1vdmluZy4KKiBTZWFzb25hbDogUmVndWxhcmx5IHJlcGVhdGluZyBwYXR0ZXJucyB3aXRoaW4gZWFjaCB5ZWFyLgoqIFJhbmRvbTogTm9pc2Ugb3IgaXJyZWd1bGFyaXRpZXMgaW4gdGhlIGRhdGEgdGhhdCBkbyBub3QgZm9sbG93IGEgdHJlbmQgb3Igc2Vhc29uYWxpdHkuCgojIyBTdGVwIDQ6IENoZWNrIGZvciBTdGF0aW9uYXJpdHkKClRvIGJ1aWxkIGFuIEFSSU1BIG1vZGVsLCB0aGUgdGltZSBzZXJpZXMgc2hvdWxkIGJlIHN0YXRpb25hcnkuIFdlIGNhbiBjaGVjayBzdGF0aW9uYXJpdHkgdXNpbmcgdGhlIEF1Z21lbnRlZCBEaWNrZXktRnVsbGVyIChBREYpIHRlc3QuCmBgYHtyfQojIFBlcmZvcm0gQURGIHRlc3QKYWRmX3Rlc3QgPC0gYWRmLnRlc3QoQWlyUGFzc2VuZ2VycywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpCnByaW50KGFkZl90ZXN0KQoKYGBgCiMjIyBJbnRlcnByZXRhdGlvbgpUaGUgcC12YWx1ZSBmcm9tIHRoZSBBREYgdGVzdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VyaWVzIGlzIHN0YXRpb25hcnkuIElmIGl04oCZcyBncmVhdGVyIHRoYW4gMC4wNSwgdGhlIHNlcmllcyBpcyBub24tc3RhdGlvbmFyeSwgYW5kIHdlIG1heSBuZWVkIHRvIHRyYW5zZm9ybSBpdC4KCiAgIEluIHRoaXMgY2FzZSwgc2luY2UgdGhlIEF1Z21lbnRlZCBEaWNrZXktRnVsbGVyIChBREYpIHRlc3QgaW5kaWNhdGVzIHRoYXQgdGhlIEFpclBhc3NlbmdlcnMgZGF0YXNldCBpcyBhbHJlYWR5IHN0YXRpb25hcnkgKHAtdmFsdWUgPCAwLjAxKSwgeW91IGRvIG5vdCBuZWVkIHRvIGFwcGx5IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb25zIGxpa2UgZGlmZmVyZW5jaW5nLiBUaGUgZGF0YXNldCBjYW4gYmUgZGlyZWN0bHkgdXNlZCB0byBmaXQgdGhlIEFSSU1BIG1vZGVsIHdpdGhvdXQgYWRkaXRpb25hbCBzdGVwcyBmb3Igc3RhdGlvbmFyaXR5CgojIyBTdGVwIDY6IEZpdCBhbiBBUklNQSBNb2RlbCBmb3IgRm9yZWNhc3RpbmcKCkFuIEFSSU1BIChBdXRvUmVncmVzc2l2ZSBJbnRlZ3JhdGVkIE1vdmluZyBBdmVyYWdlKSBtb2RlbCBpcyBjb21tb25seSB1c2VkIGZvciB0aW1lIHNlcmllcyBmb3JlY2FzdGluZy4KYGBge3J9CiMgRml0IGFuIEFSSU1BIG1vZGVsCmZpdCA8LSBhdXRvLmFyaW1hKEFpclBhc3NlbmdlcnMpCnN1bW1hcnkoZml0KQoKYGBgCgojIyBJbnRlcnByZXRhdGlvbgoqIEdvb2QgRml0OiBUaGUgcmVsYXRpdmVseSBsb3cgdmFsdWVzIGZvciBSTVNFLCBNQUUsIGFuZCBNQVBFIHN1Z2dlc3QgdGhhdCB0aGUgbW9kZWwgaXMgcGVyZm9ybWluZyB3ZWxsLgoqIE5leHQgU3RlcHM6IFNpbmNlIHRoZSByZXNpZHVhbCBhdXRvY29ycmVsYXRpb24gKEFDRjEpIGlzIGNsb3NlIHRvIHplcm8sIGluZGljYXRpbmcgbm8gc2lnbmlmaWNhbnQgcGF0dGVybnMgbGVmdCBpbiB0aGUgcmVzaWR1YWxzLCB5b3UgY2FuIG1vdmUgZm9yd2FyZCB3aXRoIGZvcmVjYXN0aW5nLgoKIyMgU3RlcCA3OiBGb3JlY2FzdCBGdXR1cmUgVmFsdWVzCgpVc2luZyB0aGUgQVJJTUEgbW9kZWwsIHdlIGNhbiBmb3JlY2FzdCBmdXR1cmUgcGFzc2VuZ2VyIG51bWJlcnMuCmBgYHtyfQojIEZvcmVjYXN0IHRoZSBuZXh0IDI0IG1vbnRocyAoMiB5ZWFycykKZm9yZWNhc3RlZF9kYXRhIDwtIGZvcmVjYXN0KGZpdCwgaCA9IDI0KQpwbG90KGZvcmVjYXN0ZWRfZGF0YSwgbWFpbiA9ICJBaXIgUGFzc2VuZ2VyIEZvcmVjYXN0IikKCmBgYAojIyBJbnRlcnByZXRhdGlvbgpUaGUgZm9yZWNhc3QgcGxvdCBzaG93cyB0aGUgZXhwZWN0ZWQgcGFzc2VuZ2VyIG51bWJlcnMgZm9yIHRoZSBuZXh0IHR3byB5ZWFycywgYWxvbmcgd2l0aCBwcmVkaWN0aW9uIGludGVydmFscy4gVGhlIG1vZGVsIHRha2VzIGludG8gYWNjb3VudCB0aGUgc2Vhc29uYWwgcGF0dGVybnMgYW5kIHRyZW5kIG9ic2VydmVkIGluIHRoZSBoaXN0b3JpY2FsIGRhdGEuCgojIyBTdW1tYXJ5CgpJbiB0aGlzIHByb2plY3QsIHdlOgoKKiBMb2FkZWQgYW5kIHZpc3VhbGl6ZWQgdGhlIEFpclBhc3NlbmdlcnMgZGF0YXNldC4KKiBEZWNvbXBvc2VkIHRoZSB0aW1lIHNlcmllcyB0byBleGFtaW5lIHRyZW5kLCBzZWFzb25hbGl0eSwgYW5kIG5vaXNlLgoqIENoZWNrZWQgZm9yIHN0YXRpb25hcml0eSBhbmQgYXBwbGllZCBkaWZmZXJlbmNpbmcgdG8gbWFrZSB0aGUgc2VyaWVzIHN0YXRpb25hcnkuCiogQnVpbHQgYW4gQVJJTUEgbW9kZWwgYW5kIGZvcmVjYXN0ZWQgZnV0dXJlIHZhbHVlcy4KKiBUaGlzIGFuYWx5c2lzIHByb3ZpZGVzIGEgYmFzaWMgdW5kZXJzdGFuZGluZyBvZiB0aW1lIHNlcmllcyBjb25jZXB0cyBhbmQgZm9yZWNhc3RpbmcgbWV0aG9kcyBpbiBSLgoKCgoKCg==