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==