Chapter 11 Economic indicators

11.1 Overview

Australia has exceptional financial and economic institutions. Three of these institutions release periodic data useful for economic analysis:

As usual, there are catches. Most of this data is in inconsistent formats (the reasons for which continue to baffle me). What’s more, it’s currently not possible to ping databases or API’s for access to this data… it is mainly accessed through spreadsheets.

The scripts below run through some of the main ways to import, clean, and analyse Australian macroeconomic data in R.

Some of the key packages we’ll use are readabs and readrba.

To get started, let’s install and load packages.

#Loads the required required packages
pacman::p_load(ggmap, ggplot2, dplyr, tmaptools, RCurl, jsonlite, tidyverse, leaflet, writexl, readr, readxl, readabs, readrba,lubridate, zoo, scales)

11.2 Gross Domestic Product

To get GDP data from the ABS, we’ll use the read_abs function from the readrba package.

#For simplicity, we keep the download function seperate to the analysis
all_gdp <- read_abs("5206.0")
#Select the seasonally adjusted data and filter for data and value columns
gdp_level <- all_gdp %>% 
              filter(series == "Gross domestic product: Chain volume measures ;", 
                     !is.na(value)) %>%
              filter(series_type =="Seasonally Adjusted") %>%
              dplyr::select(date,value) %>%
              dplyr::rename(quarterly_output=value)

gdp_level <- gdp_level %>%
             mutate(quarterly_growth_rate = 
                    ((quarterly_output / lag(quarterly_output,1)-1))*100) %>%
             mutate(annual_gdp =
                    rollapply(quarterly_output, 
                              4, 
                              sum, 
                              na.rm=TRUE, 
                              fill = NA, 
                              align = "right")) %>%
             mutate(annual_gdp_trillions=annual_gdp/1000000)%>%
             mutate(annual_growth_rate = 
                   ((annual_gdp / lag(annual_gdp, 4) - 1))*100)%>%
             mutate(Quarter_of_year =
                    lubridate::quarter(date,
                                       with_year = FALSE, 
                                       fiscal_start = 1))

#Set a baseline value
gdp_level$baseline_value <- gdp_level$quarterly_output[
                            which(gdp_level$date =="2022-03-01")]


gdp_level <- gdp_level %>%
             mutate(baseline_comparison =
                   (quarterly_output/baseline_value)*100)

tail(gdp_level)
## # A tibble: 6 x 9
##   date       quarterly_output quarterly_growth_rate annual_gdp annual_gdp_trill~
##   <date>                <dbl>                 <dbl>      <dbl>             <dbl>
## 1 2020-12-01           501644                 3.28     1960142              1.96
## 2 2021-03-01           510590                 1.78     1967236              1.97
## 3 2021-06-01           514784                 0.821    2012745              2.01
## 4 2021-09-01           505413                -1.82     2032431              2.03
## 5 2021-12-01           523725                 3.62     2054512              2.05
## 6 2022-03-01           527676                 0.754    2071598              2.07
## # ... with 4 more variables: annual_growth_rate <dbl>, Quarter_of_year <int>,
## #   baseline_value <dbl>, baseline_comparison <dbl>

Now we can plot the GDP data for Australia.

plot_gdp <- ggplot(data=gdp_level)+
            geom_line((aes(x=date, y=annual_gdp_trillions)), col="blue") +
  
            labs(title = "Australian GDP ($AUD)",
                 subtitle = "Annualised figures",
                 caption = "Data: Australian Bureau of Statistics",
                 y = "", 
                 x = " ")+
  
            scale_y_continuous(breaks = c(0,0.5,1.0,1.5,2.0,2.5),
                               labels = label_number(suffix = " trillion"))+
  
            scale_x_date(date_breaks = "10 years", date_labels="%Y")+
  
            theme_minimal() +
            theme(legend.position="bottom")+
  
            theme(plot.title=element_text(face="bold", size=12))+
            theme(plot.subtitle=element_text(size=11))+
            theme(plot.caption=element_text(size=8))+

            theme(axis.text=element_text(size=8))+
            theme(panel.grid.minor = element_blank())+
            theme(panel.grid.major.x = element_blank()) +

            theme(axis.title.y = 
            element_text(margin = margin(t = 0, r = 0, b = 0, l = 0)))+
                         
            theme(axis.text.y = element_text(vjust = -0.5, 
                                             margin = margin(l = 20, r = -45)))+
  
            theme(axis.line.x = element_line(colour ="black", size=0.4))+
            theme(axis.ticks.x = element_line(colour ="black", size=0.4))


plot_gdp

11.3 Unemployment rate

Download the data

#Download the time sreies
all_unemployment <- read_abs("6202.0")

Clean and analyse the data

unemployment_rate <- all_unemployment %>% 
              filter(series == "Unemployment rate ;  Persons ;",!is.na(value)) %>%
              filter(table_title=="Table 1. Labour force status by Sex, Australia - Trend, Seasonally adjusted and Original") %>%
              filter(series_type =="Seasonally Adjusted") %>%
              mutate(mean_unemployment_rate=mean(value)) %>%
              mutate(percentile_25=quantile(value,0.25))%>%
              mutate(percentile_75=quantile(value,0.75)) %>%
              dplyr::select(date,value,mean_unemployment_rate,percentile_25,percentile_75)
              

tail(unemployment_rate)
## # A tibble: 6 x 5
##   date       value mean_unemployment_rate percentile_25 percentile_75
##   <date>     <dbl>                  <dbl>         <dbl>         <dbl>
## 1 2021-11-01  4.60                   6.74          5.47          8.01
## 2 2021-12-01  4.16                   6.74          5.47          8.01
## 3 2022-01-01  4.18                   6.74          5.47          8.01
## 4 2022-02-01  4.02                   6.74          5.47          8.01
## 5 2022-03-01  3.93                   6.74          5.47          8.01
## 6 2022-04-01  3.85                   6.74          5.47          8.01

Plot the data

plot_unemployment_rate <- ggplot(data=unemployment_rate)+
                          geom_line(aes(x = date, y = value), col = "blue") +

            labs(title = "Unemployment rate",
                 subtitle = "Subtitle goes here",
                 caption = "Data: Australian Bureau of Statistics",
                 y = "Unemployment rate (%)", 
                 x = " ")+
  
            scale_y_continuous(labels = scales::comma)+
            scale_x_date(date_breaks = "10 years", date_labels="%Y")+
  
            theme_minimal() +
            theme(legend.position="bottom")+
  
            theme(plot.title=element_text(face="bold", size=12))+
            theme(plot.subtitle=element_text(size=11))+
            theme(plot.caption=element_text(size=8))+

            theme(axis.text=element_text(size=8))+
            theme(panel.grid.minor = element_blank())+
            theme(panel.grid.major.x = element_blank()) +

            theme(axis.title.y = 
            element_text(margin = margin(t = 0, r = 0, b = 0, l = 0)))+
                         
            theme(axis.text.y = element_text(vjust = -0.5, 
                                             margin = margin(l = 20, r = -15)))+
  
            theme(axis.line.x = element_line(colour ="black", size=0.4))+
            theme(axis.ticks.x = element_line(colour ="black", size=0.4))

plot_unemployment_rate

11.4 Inflation (CPI)

Download the data

all_CPI <- read_abs("6401.0")

Clean and analyse the data

Australia_CPI <- all_CPI %>% 
                 filter(series == "Percentage Change from Corresponding Quarter of Previous Year ;  All groups CPI ;  Australia ;",!is.na(value)) %>%
                 mutate(mean_CPI=mean(value)) %>%
                 mutate(percentile_25=quantile(value,0.25))%>%
                 mutate(percentile_75=quantile(value,0.75)) %>%
                 dplyr::select(date, value,mean_CPI,percentile_25,percentile_75)
              
tail(Australia_CPI)
## # A tibble: 6 x 5
##   date       value mean_CPI percentile_25 percentile_75
##   <date>     <dbl>    <dbl>         <dbl>         <dbl>
## 1 2020-12-01   0.9     4.94           1.9           7.3
## 2 2021-03-01   1.1     4.94           1.9           7.3
## 3 2021-06-01   3.8     4.94           1.9           7.3
## 4 2021-09-01   3       4.94           1.9           7.3
## 5 2021-12-01   3.5     4.94           1.9           7.3
## 6 2022-03-01   5.1     4.94           1.9           7.3
#Can add in the below line to filter
#filter(date>"2010-01-01") %>%

Plot the data

plot_CPI <- ggplot(data=Australia_CPI %>% 
                   filter(date>(as.Date("2000-01-01"))))+
                          
                   geom_rect(aes(xmin=as.Date("2000-01-01"), 
                                 xmax=as.Date("2023-03-01"), 
                                 ymin=2, 
                                 ymax=3),
                                 alpha=0.01,
                                 fill="grey")+
                   geom_line(aes(x = date, y = value), col = "blue") +
  
                   scale_x_continuous(expand=c(0,0))+
  
            labs(title = "Inflation (as measured by the CPI)",
                           subtitle = "Subtitle goes here",
                           caption = "Data: Australian Bureau of Statistics",
                           y = "(%)", 
                           x = " ")+
  
            scale_y_continuous(labels = scales::comma)+
            scale_x_date(date_breaks = "5 years", date_labels="%Y")+
  
            theme_minimal() +
            theme(legend.position="bottom")+
  
            theme(plot.title=element_text(face="bold", size=12))+
            theme(plot.subtitle=element_text(size=11))+
            theme(plot.caption=element_text(size=8))+

            theme(axis.text=element_text(size=8))+
            theme(panel.grid.minor = element_blank())+
            theme(panel.grid.major.x = element_blank()) +

            theme(axis.title.y = 
            element_text(margin = margin(t = 0, r = 0, b = 0, l = 0)))+
                         
            theme(axis.text.y = element_text(vjust = -0.5, 
                                             margin = margin(l = 20, r = -15)))+
  
            theme(axis.line.x = element_line(colour ="black", size=0.4))+
            theme(axis.ticks.x = element_line(colour ="black", size=0.4))

plot_CPI

Plot a histogram of the data

plot_CPI_hist <- ggplot(Australia_CPI, aes(x=value)) + 
                        geom_histogram(aes(y=..density..), 
                                       colour="black", fill="lightblue")+
  
                        geom_density(alpha=.5, fill="grey",colour="darkblue")+
  
                        scale_x_continuous(expand=c(0,0))+
  
            labs(title = "Consumer Price Index: Histogram",
                           subtitle = "Subtitle goes here",
                           caption = "Data: Australian Bureau of Statistics",
                           y = "(%)", 
                           x = " ")+
  
            theme_minimal() +
            theme(legend.position="bottom")+
  
            theme(plot.title=element_text(face="bold", size=12))+
            theme(plot.subtitle=element_text(size=11))+
            theme(plot.caption=element_text(size=8))+

            theme(axis.text=element_text(size=8))+
            theme(panel.grid.minor = element_blank())+
            theme(panel.grid.major.x = element_blank()) +

            theme(axis.title.y = 
            element_text(margin = margin(t = 0, r = 0, b = 20, l = 0)))+
                         
            theme(axis.text.y = element_text(vjust = -0.5, 
                                             margin = margin(l = 20, r = -2)))+
  
            theme(axis.line.x = element_line(colour ="black", size=0.4))+
            theme(axis.ticks.x = element_line(colour ="black", size=0.4))


plot_CPI_hist

11.5 Wage Price Index

Download the data

all_wpi <- read_abs("6345.0")

Clean and analyse the data

Australia_WPI <- all_wpi %>% 
                 filter(series == "Percentage Change From Corresponding Quarter of Previous Year ;  Australia ;  Total hourly rates of pay excluding bonuses ;  Private and Public ;  All industries ;",
                                  !is.na(value)) %>%
                 filter(series_type=="Seasonally Adjusted") %>%
                 mutate(mean_WPI=mean(value)) %>%
                 dplyr::select(date, value,mean_WPI)

tail(Australia_WPI)
## # A tibble: 6 x 3
##   date       value mean_WPI
##   <date>     <dbl>    <dbl>
## 1 2020-12-01   1.4     3.06
## 2 2021-03-01   1.5     3.06
## 3 2021-06-01   1.7     3.06
## 4 2021-09-01   2.2     3.06
## 5 2021-12-01   2.3     3.06
## 6 2022-03-01   2.4     3.06

Plot the data

plot_WPI <- ggplot(data=Australia_WPI)+
                   geom_line(aes(x = date, y = value), col = "blue") +

            labs(title = "Wage Price Index",
                           subtitle = "Subtitle goes here",
                           caption = "Data: Australian Bureau of Statistics",
                           y = "(%)", 
                           x = " ")+
  
            scale_y_continuous(labels = scales::comma)+
            scale_x_date(date_breaks = "5 years", date_labels="%Y")+
  
            theme_minimal() +
            theme(legend.position="bottom")+
  
            theme(plot.title=element_text(face="bold", size=12))+
            theme(plot.subtitle=element_text(size=11))+
            theme(plot.caption=element_text(size=8))+

            theme(axis.text=element_text(size=8))+
            theme(panel.grid.minor = element_blank())+
            theme(panel.grid.major.x = element_blank()) +

            theme(axis.title.y = 
            element_text(margin = margin(t = 0, r = 0, b = 0, l = 0)))+
                         
            theme(axis.text.y = element_text(vjust = -0.5, 
                                             margin = margin(l = 20, r = -15)))+
  
            theme(axis.line.x = element_line(colour ="black", size=0.4))+
            theme(axis.ticks.x = element_line(colour ="black", size=0.4))
                          

plot_WPI

11.6 RBA cash rate

Download the data

cash_rate_all<- readrba::read_rba(table_no = "F13")
head(cash_rate_all)
## # A tibble: 6 x 11
##   date       series          value frequency series_type units source pub_date  
##   <date>     <chr>           <dbl> <chr>     <chr>       <chr> <chr>  <date>    
## 1 1990-01-31 Australia Targ~  17   Monthly   Original    Per ~ RBA    2022-06-02
## 2 1990-02-28 Australia Targ~  16.5 Monthly   Original    Per ~ RBA    2022-06-02
## 3 1990-03-31 Australia Targ~  16.5 Monthly   Original    Per ~ RBA    2022-06-02
## 4 1990-04-30 Australia Targ~  15   Monthly   Original    Per ~ RBA    2022-06-02
## 5 1990-05-31 Australia Targ~  15   Monthly   Original    Per ~ RBA    2022-06-02
## 6 1990-06-30 Australia Targ~  15   Monthly   Original    Per ~ RBA    2022-06-02
## # ... with 3 more variables: series_id <chr>, description <chr>,
## #   table_title <chr>

Clean and analyse the data

cash_rate_Australia <- cash_rate_all %>%
                       filter(series=="Australia Target Cash Rate") %>%
                       dplyr::select(date, value)

tail(cash_rate_Australia)
## # A tibble: 6 x 2
##   date       value
##   <date>     <dbl>
## 1 2021-12-31  0.1 
## 2 2022-01-31  0.1 
## 3 2022-02-28  0.1 
## 4 2022-03-31  0.1 
## 5 2022-04-30  0.1 
## 6 2022-05-31  0.35

Plot the data

plot_cash_rate <- ggplot(data=cash_rate_Australia)+
                          geom_line(aes(x = date, y = value), col = "blue") +
  
            labs(title = "RBA cash rate",
                           subtitle = "Subtitle goes here",
                           caption = "Data: Read RBA",
                           y = " ", 
                           x = " ")+
  
            scale_y_continuous(labels = scales::comma)+
            scale_x_date(date_breaks = "3 years", date_labels="%Y")+
  
            theme_minimal() +
            theme(legend.position="bottom")+
  
            theme(plot.title=element_text(face="bold", size=12))+
            theme(plot.subtitle=element_text(size=11))+
            theme(plot.caption=element_text(size=8))+

            theme(axis.text=element_text(size=8))+
            theme(panel.grid.minor = element_blank())+
            theme(panel.grid.major.x = element_blank()) +

            theme(axis.title.y = 
            element_text(margin = margin(t = 0, r = 0, b = 0, l = 0)))+
                         
            theme(axis.text.y = element_text(vjust = -0.5, 
                                             margin = margin(l = 20, r = -15)))+
  
            theme(axis.line.x = element_line(colour ="black", size=0.4))+
            theme(axis.ticks.x = element_line(colour ="black", size=0.4))
                          
plot_cash_rate

11.7 AUD exchange rate

God knows why - but but there are super quirky names for the official exchange rate tables

Download the data

exchange_rate_all<- readrba::read_rba(table_no = (c("ex_daily_8386",
                                                    "ex_daily_8790",
                                                    "ex_daily_9194",
                                                    "ex_daily_9598",
                                                    "ex_daily_9902",
                                                    "ex_daily_0306",
                                                    "ex_daily_0709",
                                                    "ex_daily_1013",
                                                    "ex_daily_1417",
                                                    "ex_daily_18cur")),
                                      cur_hist = "historical")

Clean and analyse the data

exchange_rate_AUD <-   exchange_rate_all %>%
                       filter(series=="A$1=USD") %>%
                       dplyr::select(date, value)


tail(exchange_rate_AUD)
## # A tibble: 6 x 2
##   date       value
##   <date>     <dbl>
## 1 2022-06-06 0.720
## 2 2022-06-07 0.718
## 3 2022-06-08 0.720
## 4 2022-06-09 0.718
## 5 2022-06-10 0.712
## 6 2022-06-14 0.697

Plot the data

plot_exchange_rate_AUD <- ggplot(data=exchange_rate_AUD)+
                          geom_line(aes(x = date, y = value), col = "blue") +

            labs(title = "AUD exchange rate",
                           subtitle = "Subtitle goes here",
                           caption = "Data: Reserve Bank of Australia",
                           y = " ", 
                           x = " ")+
  
            scale_y_continuous(labels = scales::comma)+
            scale_x_date(date_breaks = "3 years", date_labels="%Y")+
  
            theme_minimal() +
            theme(legend.position="bottom")+
  
            theme(plot.title=element_text(face="bold", size=12))+
            theme(plot.subtitle=element_text(size=11))+
            theme(plot.caption=element_text(size=8))+

            theme(axis.text=element_text(size=8))+
            theme(panel.grid.minor = element_blank())+
            theme(panel.grid.major.x = element_blank()) +

            theme(axis.title.y = 
            element_text(margin = margin(t = 0, r = 0, b = 0, l = 0)))+
                         
            theme(axis.text.y = element_text(vjust = -0.5, 
                                             margin = margin(l = 20, r = -15)))+
  
            theme(axis.line.x = element_line(colour ="black", size=0.4))+
            theme(axis.ticks.x = element_line(colour ="black", size=0.4))


plot_exchange_rate_AUD