1 Introduction


The aim of this data visualisation is to analyse household expenditure and income in Singapore, for households residing in different types of housing. Through data visualisation, insights will be drawn on household expenditure patterns and how they differ across different housing types.

Household spending is the amount of final consumption expenditure made by resident households to meet their everyday needs, such as food, clothing, transport services and household durables. As household expenditure makes up about 60% of gross domestic product, it will be helpful for government agencies to better understand the sources of household consumption in the economy and ultimately the needs of its citizens. A better understanding of household income and expenditure for different housing types will also aid the government in policy planning and allocation of budgets. Furthermore, the visualisation will enable citizens to be more informed and possibly encourage active participation in the policy planning process.

The Singapore government conducts a Household Expenditure Survey (HES) once every five years. This data is made publicly available by Singapore’s Department of Statistics (https://www.singstat.gov.sg/) as part of Singapore’s open data initiative. As data is in tabular format which is difficult to understand, this visualisation will utilise data from the latest Household Expenditure Survey in 2017/18 to draw insights.


2 Data


Data from the Singapore’s HES 2017/18 will be used in this analysis. The table below outlines the data sets that will be used for the data visualisation. All data are in CSV format.


Data Description Source
Household Income Data on average monthly household income by dwelling type in 2017/18, extracted from HES 2017/18 Department of Statistics, Singapore
Household Expenditure Data on average monthly household expenditure by dwelling type Department of Statistics, Singapore. Average Monthly Household Expenditure by Type of Goods and Services and Type of Dwelling - Sheet 1 (https://www.singstat.gov.sg/find-data/multi-dimensional-data-cubes)
Household Expenditure Breakdown Data on average monthly household expenditure breakdown by dwelling type Department of Statistics, Singapore. Average Monthly Household Expenditure by Type of Goods and Services and Type of Dwelling - Sheet 6 (https://www.singstat.gov.sg/find-data/multi-dimensional-data-cubes)


3 Data and Design Challenges


There are several data and design challenges faced in analysing household expenditure and designing the data visualisation. This section outlines these challenges as well as the proposed suggestions to overcome the challenges.


3.1 Challenge 1: Missing information on household income


Challenge

The data set, “Average Monthly Household Expenditure by Type of Goods and Services and Type of Dwelling”, does not have information on average monthly household income. However, it is imperative to visualise and analyse expenditure in union with income, so as to better understand consumption and lifestyle patterns for households living in different types of housing.


Mitigation

To bridge the data gap, information on monthly household income for different housing types is extracted from HES 2017/18 and saved into a separate data file. The data files on expenditure and income will then be harmonised through a data join.


3.2 Challenge 2: Visualising household expenditure breakdown across different housing types


Challenge

For the household expenditure breakdown data, there are as many as 15 categories for the expenditure breakdown:

  1. Food And Non-Alcoholic Beverages
  2. Alcoholic Beverages And Tobacco
  3. Clothing And Footwear
  4. Housing And Utilities
  5. Furnishings, Household Equipment And Routine Household Maintenance
  6. Health
  7. Transport
  8. Communication
  9. Recreation And Culture
  10. Educational Services
  11. Food Serving Services
  12. Accommodation Services
  13. Miscellaneous Goods And Services
  14. Non-Assignable Expenditure
  15. Imputed Rental For Owner-Occupied Accommodation

There are also up to 6 different housing types in Singapore, namely: (1) HDB 1- & 2-Room Flats, (2) HDB 3-Room Flats, (3) HDB 4-Room Flats, (4) HDB 5-Room & Executive Flats, (5) Condominiums & Other Apartments, and (6) Landed Properties.

Visualising expenditure across 15 expenditure breakdown categories, across 6 housing types, poses a challenge as there are many dimensions. These information will have to be visualised aesthetically without sacrificing on interpretability. There is also a need to ensure that the expenditure breakdown categories are easily understandable by the layman, for an effective visualisation.


Mitigation

To mitigate the above challenge, while information can be condensed into less categories (such as combining all HDB flats into one category), it may over-generalise the data and risk losing important household expenditure patterns. Therefore, categories will not be condensed in this analysis.

In general, all expenditure breakdown categories are easily understandable, except for category 15, which is the “Imputed Rental For Owner-Occupied Accommodation”. According to the Household Expenditure Survey, this is “not the actual expenditure incurred by households. As Imputed Rental of Owner-Occupied Accommodation is not a cash outlay, it is usually excluded when analysing expenditure data”. Hence, this category will be excluded from the visualisation for household expenditure breakdown. In addition, “Non-Assignable Expenditure” will also be excluded, as it is not a value-adding category and initial data exploration reveals that its values are close to 0 for all housing types.

Several methods can be utilised to visualise the expenditure breakdown data across different housing types. Most commonly used methods to visualise part-to-whole ratio include the pie chart and stacked bar chart – a pie or stacked bar can be used to represent each housing type, which is broken down into expenditure breakdown categories. However, there are 13 categories for expenditure breakdown, and colour-coding so many categories may not be effective for interpretation. It will also be difficult for the reader to interpret and distinguish the colours and relative sizes for the pie or stacked bar. An example of this problem is shown below, where insights can hardly be drawn from the chart.



As such, a solution to this problem will be to visualise the expenditure of households across expenditure breakdown categories (on the y-axis), and colour-code data points on expenditure based on housing type (which only has 6 categories) instead. Points (colour encoded by housing type) will be used to represent the data values for expenditure, such that expenses of each housing type for each expenditure breakdown category can be analysed independently of the other housing types.


3.3 Challenge 3: Visualising proportion of housing types


Challenge

When analysing expenditure across different housing types, it will also be useful to understand the composition of households in Singapore based on different housing types. As such, the final visualisation should also include a chart showing the proportion of total households residing in different housing types. While a pie chart can be useful for visualising relative proportions, it may be difficult to compare between the relative sizes of each slice with 6 categories for housing type, especially when the proportions of the housing types are similar.


Mitigation

To effectively visualise proportion of total households residing in different housing types, a waffle chart can be used. In the waffle chart, each same-sized square represents 1% of total households, and is colour encoded by housing type. Visually at first glance, the reader will be able to see the relative proportions of the different housing types, and identify housing types making up the highest and lowest proportions of total households in Singapore. Upon deeper inspection, the reader will also be able to easily compare the relative proportions of the different housing types, since each square represents 1%.


4 Sketch of Proposed Design


Taking into consideration the challenges, the sketch below shows the proposed design for the data visualisation of household expenditure patterns by housing types.



5 Step-by-Step Data Visualisation


In this section, the data visualisation based on the sketched design will be prepared step-by-step.


5.1 Install packages


The following packages will be installed:

  • tidyverse: contains a collection of R packages for data importing and manipulation
  • waffle: ggplot2 extension to create waffle charts
packages <- c('tidyverse', 'waffle')

for (p in packages) {
  if (!require(p, character.only = T)) {
    install.packages(p)
  }
  library(p, character.only = T)
}
# install.packages("waffle", repos = "https://cinc.rud.is")


5.2 Import data


The data sets on household expenditure and income will be imported for the creation of the data visualisation.


5.2.1 Household income data


Import

income <- read_csv('data/hes201718.csv')
## Parsed with column specification:
## cols(
##   `Dwelling Type` = col_character(),
##   `Average Monthly Household Income` = col_number(),
##   `Number of Resident Households` = col_number()
## )


Glimpse

glimpse(income)
## Rows: 6
## Columns: 3
## $ `Dwelling Type`                    <chr> "HDB 1- & 2-Room Flats", "HDB 3-...
## $ `Average Monthly Household Income` <dbl> 2521, 5868, 8827, 12244, 21830, ...
## $ `Number of Resident Households`    <dbl> 76961, 240651, 430965, 320330, 2...


View content

income
## # A tibble: 6 x 3
##   `Dwelling Type`           `Average Monthly Household~ `Number of Resident Hou~
##   <chr>                                           <dbl>                    <dbl>
## 1 HDB 1- & 2-Room Flats                            2521                    76961
## 2 HDB 3-Room Flats                                 5868                   240651
## 3 HDB 4-Room Flats                                 8827                   430965
## 4 HDB 5-Room & Executive F~                       12244                   320330
## 5 Condominiums & Other Apa~                       21830                   207282
## 6 Landed Properties                               28937                    69038


5.2.2 Household expenditure data


Import

expenditure <- read_csv('data/average_household_expenditure.csv')
## Parsed with column specification:
## cols(
##   Year = col_character(),
##   D1 = col_character(),
##   HH_Count = col_number(),
##   HH_Exp_Sum = col_number(),
##   HH_Exp_Mean = col_number()
## )


Glimpse

glimpse(expenditure)
## Rows: 29
## Columns: 5
## $ Year        <chr> "2002/03", "2002/03", "2002/03", "2002/03", "2002/03", ...
## $ D1          <chr> "HDB Dwellings", "HDB 1- & 2-Room Flats", "HDB 3-Room F...
## $ HH_Count    <dbl> 852785, 56750, 224009, 314638, 252380, 72317, 63424, 91...
## $ HH_Exp_Sum  <dbl> 2430905759, 57065083, 444671397, 889798116, 1012331715,...
## $ HH_Exp_Mean <dbl> 2850.5, 1005.6, 1985.1, 2828.0, 4011.1, 5959.2, 7148.8,...


View content

expenditure
## # A tibble: 29 x 5
##    Year    D1                              HH_Count HH_Exp_Sum HH_Exp_Mean
##    <chr>   <chr>                              <dbl>      <dbl>       <dbl>
##  1 2002/03 HDB Dwellings                     852785 2430905759       2850.
##  2 2002/03 HDB 1- & 2-Room Flats              56750   57065083       1006.
##  3 2002/03 HDB 3-Room Flats                  224009  444671397       1985.
##  4 2002/03 HDB 4-Room Flats                  314638  889798116       2828 
##  5 2002/03 HDB 5-Room & Executive Flats      252380 1012331715       4011.
##  6 2002/03 Condominiums & Other Apartments    72317  430949151       5959.
##  7 2002/03 Landed Properties                  63424  453405269       7149.
##  8 2007/08 HDB Dwellings                     918082 2919380453       3180.
##  9 2007/08 HDB 1- & 2-Room Flats              47995   45925654        957.
## 10 2007/08 HDB 3-Room Flats                  222168  471249059       2121.
## # ... with 19 more rows


5.2.3 Household expenditure breakdown data


Import

expenditure_breakdown <- read_csv('data/expenditure_by_dwelling.csv')
## Parsed with column specification:
## cols(
##   Year = col_character(),
##   D1 = col_character(),
##   `D2A (2-d)` = col_character(),
##   HH_Count = col_number(),
##   HH_Exp_Sum = col_character(),
##   HH_Exp_Mean = col_character()
## )


Glimpse

glimpse(expenditure_breakdown)
## Rows: 420
## Columns: 6
## $ Year        <chr> "2002/03", "2002/03", "2002/03", "2002/03", "2002/03", ...
## $ D1          <chr> "HDB Dwellings", "HDB Dwellings", "HDB Dwellings", "HDB...
## $ `D2A (2-d)` <chr> "FOOD AND NON-ALCOHOLIC BEVERAGES", "ALCOHOLIC BEVERAGE...
## $ HH_Count    <dbl> 852785, 852785, 852785, 852785, 852785, 852785, 852785,...
## $ HH_Exp_Sum  <chr> "264,333,767", "46,122,112", "96,808,379", "163,615,139...
## $ HH_Exp_Mean <chr> "310.0", "54.1", "113.5", "191.9", "162.4", "151.1", "4...


View content

expenditure_breakdown
## # A tibble: 420 x 6
##    Year   D1       `D2A (2-d)`                   HH_Count HH_Exp_Sum HH_Exp_Mean
##    <chr>  <chr>    <chr>                            <dbl> <chr>      <chr>      
##  1 2002/~ HDB Dwe~ FOOD AND NON-ALCOHOLIC BEVER~   852785 264,333,7~ 310.0      
##  2 2002/~ HDB Dwe~ ALCOHOLIC BEVERAGES AND TOBA~   852785 46,122,112 54.1       
##  3 2002/~ HDB Dwe~ CLOTHING AND FOOTWEAR           852785 96,808,379 113.5      
##  4 2002/~ HDB Dwe~ HOUSING AND UTILITIES           852785 163,615,1~ 191.9      
##  5 2002/~ HDB Dwe~ FURNISHINGS, HOUSEHOLD EQUIP~   852785 138,522,5~ 162.4      
##  6 2002/~ HDB Dwe~ HEALTH                          852785 128,868,0~ 151.1      
##  7 2002/~ HDB Dwe~ TRANSPORT                       852785 426,072,4~ 499.6      
##  8 2002/~ HDB Dwe~ COMMUNICATION                   852785 136,208,8~ 159.7      
##  9 2002/~ HDB Dwe~ RECREATION AND CULTURE          852785 314,632,1~ 368.9      
## 10 2002/~ HDB Dwe~ EDUCATIONAL SERVICES            852785 127,549,4~ 149.6      
## # ... with 410 more rows


5.3 Data wrangling


Data will be pre-processed before the data visualisation can be created.


5.3.0.1 Extract data


Data required for the analysis will be extracted.

  • To create the visualisation, the latest HES data will be used, which is in 2017/18. Hence, 2017/18 data from HES will be extracted from the data sets, which contain HES data over different years.
  • Data for the dwelling type, “HDB Dwellings”, will be removed as the data for this dwelling type is a summary (total) of the other HDB dwelling types: “HDB 1- & 2-Room Flats”, “HDB 3-Room Flats”, “HDB 4-Room Flats” and “HDB 5-Room & Executive Flats”. The more granular breakdown of the HDB dwelling types (1- & 2-Room Flats, 3-Room Flats etc.) will be utilised in the analysis instead, for finer comparison and more detailed insights.
expenditure17 <- expenditure %>%
  # Extract 2017/18 data
  filter((Year == '2017/18')) %>%
  # Remove data where dwelling type is "HDB Dwellings" 
  filter(D1 != 'HDB Dwellings')

expenditure17
## # A tibble: 6 x 5
##   Year    D1                              HH_Count HH_Exp_Sum HH_Exp_Mean
##   <chr>   <chr>                              <dbl>      <dbl>       <dbl>
## 1 2017/18 HDB 1- & 2-Room Flats              76961  118918572       1545.
## 2 2017/18 HDB 3-Room Flats                  240651  651993499       2709.
## 3 2017/18 HDB 4-Room Flats                  430965 1694834858       3933.
## 4 2017/18 HDB 5-Room & Executive Flats      320330 1763197216       5504.
## 5 2017/18 Condominiums & Other Apartments   207282 1650485376       7962.
## 6 2017/18 Landed Properties                  69038  724897065      10500.


expenditure_breakdown17 <- expenditure_breakdown %>%
  # Extract 2017/18 data
  filter(Year == '2017/18') %>%
  # Remove data where dwelling type is "HDB Dwellings"
  filter(D1 != 'HDB Dwellings')

expenditure_breakdown17
## # A tibble: 90 x 6
##    Year   D1         `D2A (2-d)`                 HH_Count HH_Exp_Sum HH_Exp_Mean
##    <chr>  <chr>      <chr>                          <dbl> <chr>      <chr>      
##  1 2017/~ HDB 1- & ~ FOOD AND NON-ALCOHOLIC BEV~    76961 14,077,871 182.9      
##  2 2017/~ HDB 1- & ~ ALCOHOLIC BEVERAGES AND TO~    76961 4,381,368  56.9       
##  3 2017/~ HDB 1- & ~ CLOTHING AND FOOTWEAR          76961 1,668,879  21.7       
##  4 2017/~ HDB 1- & ~ HOUSING AND UTILITIES          76961 15,620,271 203.0      
##  5 2017/~ HDB 1- & ~ FURNISHINGS, HOUSEHOLD EQU~    76961 3,865,800  50.2       
##  6 2017/~ HDB 1- & ~ HEALTH                         76961 11,356,116 147.6      
##  7 2017/~ HDB 1- & ~ TRANSPORT                      76961 11,914,814 154.8      
##  8 2017/~ HDB 1- & ~ COMMUNICATION                  76961 8,303,559  107.9      
##  9 2017/~ HDB 1- & ~ RECREATION AND CULTURE         76961 6,139,949  79.8       
## 10 2017/~ HDB 1- & ~ EDUCATIONAL SERVICES           76961 3,241,033  42.1       
## # ... with 80 more rows


5.3.0.2 Convert data format


Data format conversion is required for the household expenditure breakdown data set. The column for “HH_Exp_Mean”, which is the average monthly household expenditure, was previously imported as character format as it contains commas as the separator for thousands in the data fields.

  • The “HH_Exp_Mean” column will be converted into numerical format for use in analysis.
  • Commas will have to be replaced by an empty string before conversion.
# Remove commas and convert "HH_Exp_Mean" column to numerical format (double)
expenditure_breakdown17$HH_Exp_Mean <- as.double(gsub(',', '', expenditure_breakdown17$HH_Exp_Mean))

expenditure_breakdown17
## # A tibble: 90 x 6
##    Year   D1         `D2A (2-d)`                 HH_Count HH_Exp_Sum HH_Exp_Mean
##    <chr>  <chr>      <chr>                          <dbl> <chr>            <dbl>
##  1 2017/~ HDB 1- & ~ FOOD AND NON-ALCOHOLIC BEV~    76961 14,077,871       183. 
##  2 2017/~ HDB 1- & ~ ALCOHOLIC BEVERAGES AND TO~    76961 4,381,368         56.9
##  3 2017/~ HDB 1- & ~ CLOTHING AND FOOTWEAR          76961 1,668,879         21.7
##  4 2017/~ HDB 1- & ~ HOUSING AND UTILITIES          76961 15,620,271       203  
##  5 2017/~ HDB 1- & ~ FURNISHINGS, HOUSEHOLD EQU~    76961 3,865,800         50.2
##  6 2017/~ HDB 1- & ~ HEALTH                         76961 11,356,116       148. 
##  7 2017/~ HDB 1- & ~ TRANSPORT                      76961 11,914,814       155. 
##  8 2017/~ HDB 1- & ~ COMMUNICATION                  76961 8,303,559        108. 
##  9 2017/~ HDB 1- & ~ RECREATION AND CULTURE         76961 6,139,949         79.8
## 10 2017/~ HDB 1- & ~ EDUCATIONAL SERVICES           76961 3,241,033         42.1
## # ... with 80 more rows


5.3.1 Harmonise data sources


Income and expenditure data will be joined, such that the figures can be utilised in union in the data visualisation.


Join data

exp_inc <- expenditure17 %>%
  # Join income and expenditure data
  inner_join(income, by = c('D1' = 'Dwelling Type')) %>%
  rename(HH_Inc_Mean = `Average Monthly Household Income`) %>%
  select(-`Number of Resident Households`) # remove this column -- duplicate of HH_Count field


View data

exp_inc
## # A tibble: 6 x 6
##   Year    D1                         HH_Count HH_Exp_Sum HH_Exp_Mean HH_Inc_Mean
##   <chr>   <chr>                         <dbl>      <dbl>       <dbl>       <dbl>
## 1 2017/18 HDB 1- & 2-Room Flats         76961  118918572       1545.        2521
## 2 2017/18 HDB 3-Room Flats             240651  651993499       2709.        5868
## 3 2017/18 HDB 4-Room Flats             430965 1694834858       3933.        8827
## 4 2017/18 HDB 5-Room & Executive Fl~   320330 1763197216       5504.       12244
## 5 2017/18 Condominiums & Other Apar~   207282 1650485376       7962.       21830
## 6 2017/18 Landed Properties             69038  724897065      10500.       28937


Re-order categories


Category (factor) levels will be re-ordered for housing type:

  • HDB 1- & 2-Room Flats
  • HDB 3-Room Flats
  • HDB 4-Room Flats
  • HDB 5-Room & Executive Flats
  • Condominiums & Other Apartments
  • Landed Properties
exp_inc <- exp_inc %>%
    mutate(D1 = fct_relevel(D1, "HDB 1- & 2-Room Flats", "HDB 3-Room Flats", "HDB 4-Room Flats", "HDB 5-Room & Executive Flats", "Condominiums & Other Apartments", "Landed Properties"))

expenditure_breakdown17 <- expenditure_breakdown17 %>%
    mutate(D1 = fct_relevel(D1, "HDB 1- & 2-Room Flats", "HDB 3-Room Flats", "HDB 4-Room Flats", "HDB 5-Room & Executive Flats", "Condominiums & Other Apartments", "Landed Properties"))


5.3.2 Data calculation


Several fields will be calculated for usage in the data visualisation.

  • Average monthly household unspent income: Monthly household expenditure will be visualised as a percentage of monthly household income. As such, the amount of unspent monthly household income will be calculated in order to create the data visualisation.

  • Percentage of households residing in each type of dwelling: The proportions of total households residing in different types of housing in Singapore will be visualised. Hence, the number of households living in each type of housing will be calculated as a percentage of the total number of households in Singapore.


Calculate field

# Calculate total number of households in Singapore
total_households <- colSums(exp_inc['HH_Count'])

exp_inc <- exp_inc %>%
  # Calculate the average household unspent income
  mutate(`HH_Unspent_Inc_Mean` = `HH_Inc_Mean` - HH_Exp_Mean) %>%
  # Calculate the percentage of households residing in each type of dwelling, rounded to nearest whole number
  mutate(HH_Perc = round(HH_Count/total_households * 100, 0))


View data

exp_inc
## # A tibble: 6 x 8
##   Year  D1    HH_Count HH_Exp_Sum HH_Exp_Mean HH_Inc_Mean HH_Unspent_Inc_~
##   <chr> <fct>    <dbl>      <dbl>       <dbl>       <dbl>            <dbl>
## 1 2017~ HDB ~    76961  118918572       1545.        2521             976.
## 2 2017~ HDB ~   240651  651993499       2709.        5868            3159.
## 3 2017~ HDB ~   430965 1694834858       3933.        8827            4894.
## 4 2017~ HDB ~   320330 1763197216       5504.       12244            6740.
## 5 2017~ Cond~   207282 1650485376       7962.       21830           13868.
## 6 2017~ Land~    69038  724897065      10500.       28937           18437.
## # ... with 1 more variable: HH_Perc <dbl>


5.4 Create Charts


This section creates the charts for the data visualisation.

  • ggplot2 will be used for designing the data visualisation.


5.4.1 Monthly household expenditure and income by household types


A bar chart will be created to visualise monthly household expenditure and unspent income, for households in each housing type.

  • geom_col() will be used to create the bar chart.
  • geom_crossbar() will be used to add crossbars to the bar chart, to denote the 50% mark of average monthly household income for each housing type.
# Pivot data for usage in ggplot2
exp_inc_pivot <- exp_inc %>%
  pivot_longer(cols = c('HH_Exp_Mean', 'HH_Unspent_Inc_Mean'), names_to = 'type', values_to = 'amount') %>%
  mutate(type = fct_relevel(type, "HH_Unspent_Inc_Mean", "HH_Exp_Mean"))


## Create visualisation
hh_exp_inc <- ggplot(exp_inc_pivot) +
  # Create bar chart, with colour categories by average expenditure and average unspent income
  geom_col(aes(x = amount, y = reorder(D1, -amount), fill = type)) + 
  # Add crossbar to bar chart, indicating 50% of total income for each housing type
  geom_crossbar(mapping = aes(x = amount, y = D1),
                stat = "summary",
                size = 0.2,
                color = 'white',
                fun = mean) +
  # Add value labels for bar chart
  geom_label(aes(x = HH_Inc_Mean, y = D1, label = HH_Inc_Mean),
             position = position_nudge(x = 1400),
             colour = 'gray23', size = 3) + 
  # Rename x-axis label, add chart title, add annotation for crossbar
  labs(x = 'Amount ($)',
       title = 'Monthly Household Expenditure and Income',
       tag = 'White crossbars indicate 50% of total income for the housing type') +
  # Change colour scheme and rename legend labels
  scale_fill_manual(values = c('HH_Exp_Mean' = '#ffa600',
                               'HH_Unspent_Inc_Mean' = '#003f5c'),
                    labels = c('HH_Exp_Mean' = 'Average Expenditure',
                               'HH_Unspent_Inc_Mean' = 'Average Unspent Income'),
                    guide = guide_legend(reverse = TRUE,
                                         nrow = 2)) +
  # Customise the look of the visualisation
  theme_minimal() +
  theme(axis.text = element_text(size = 9),
        axis.text.y = element_text(margin = margin(r = -15)),
        axis.title.y = element_blank(),
        axis.title.x = element_text(size = 9, margin = margin(t = 10)),
        legend.title = element_blank(),
        legend.text = element_text(size = 9),
        legend.position = 'bottom', 
        legend.margin = margin(l = -522, t = 21),
        plot.tag.position = c(0.28, 0.15),
        plot.tag = element_text(color = 'gray10', size = 9),
        panel.grid.major.y = element_blank(),
        plot.margin = margin(r = 20, t = 5),
        plot.title.position = 'plot')

hh_exp_inc


5.4.2 Proportion of total households for different housing types


A waffle chart visualising the proportion of total households for different housing types will be created.

  • geom_waffle() is a ggplot2 extension that will be utilised to create the waffle chart.
hh_prop <- ggplot(exp_inc, aes(fill = D1, values = HH_Perc)) +
  # Create waffle chart
  geom_waffle(n_rows = 5,
              size = 0.5,
              colour = "#ffffff",
              flip = FALSE) +
  coord_equal() +
  # Customise colour scheme
  scale_fill_manual(values = c('HDB 1- & 2-Room Flats' = '#ffa600',
                               'HDB 3-Room Flats' = '#ff6e54',
                               'HDB 4-Room Flats' = '#dd5182',
                               'HDB 5-Room & Executive Flats' = '#955196',
                               'Condominiums & Other Apartments' = '#444e86',
                               'Landed Properties' = '#003f5c'),
                    labels = c('HDB 1- & 2-Room Flats' = 'HDB 1- & 2-Room Flats (6%)',
                               'HDB 3-Room Flats' = 'HDB 3-Room Flats (18%)',
                               'HDB 4-Room Flats' = 'HDB 4-Room Flats (32%)',
                               'HDB 5-Room & Executive Flats' = 'HDB 5-Room & Executive Flats (24%)',
                               'Condominiums & Other Apartments' = 'Condominiums & Other Apartments (15%)',
                               'Landed Properties' = 'Landed Properties (5%)')) +
  # Add chart title
  ggtitle('Proportion of Total Households for Different Housing Types') +
  # Customise theme of chart
  theme_minimal() +
  theme_enhance_waffle() +
  theme(legend.title = element_blank(),
        legend.position = 'bottom')

hh_prop


5.4.3 Breakdown of monthly household expenditure


A chart visualising the breakdown of monthly household expenditure for different housing types will be created.

  • The category name for ‘Furnishings, Household Equipment and Routing Household Maintenance’, will be shortened into a more reader friendly format, named ‘Furnishings and Household Maintenance’.
  • Two expenditure breakdown categories: ‘Imputed Rental For Owner-Occupied Accommodation’ and ‘Non-Assignable Expenditure’, will be removed from the visualisation, as discussed in the section on challenges.
  • Expenditure breakdown categories will be converted from upper case to title case, for better readability for the data visualisation.
  • geom_point() will be used to plot the data points for expenditure.
# Shorten category name
expenditure_breakdown17$`D2A (2-d)`[expenditure_breakdown17$`D2A (2-d)` == 'FURNISHINGS, HOUSEHOLD EQUIPMENT AND ROUTINE HOUSEHOLD MAINTENANCE'] <- 'FURNISHINGS AND HOUSEHOLD MAINTENANCE'

# Remove this category from analysis
expenditure_breakdown17 <- expenditure_breakdown17 %>%
  filter((`D2A (2-d)` != 'IMPUTED RENTAL FOR OWNER-OCCUPIED ACCOMMODATION') & (`D2A (2-d)` != 'NON-ASSIGNABLE EXPENDITURE')) %>%
  # Convert expenditure breakdown categories to title case instead of upper case, so that the chart is more reader-friendly
  mutate(`D2A (2-d)` = str_to_title(`D2A (2-d)`))

hh_exp_breakdown <- ggplot(expenditure_breakdown17) +
  # Plot point chart
  geom_point(aes(x = HH_Exp_Mean, y = reorder(`D2A (2-d)`, HH_Exp_Mean), color = `D1`),
             size = 5)+
  # Rename x-axis label
  labs(x = "Average Monthly Household Expenses ($)") +
  # Customise colour scheme
  scale_color_manual(values = c('#ffa600', '#ff6e54', '#dd5182', '#955196', '#505885', '#003f5c')) +
  # Fix x-axis range
  scale_x_continuous(limits = c(0, 2000)) +
  # Add chart title and subtitle
  labs(title = 'Breakdown of Monthly Household Expenditure^',
          subtitle = 'Households spent an average of $4,906 a month on goods and services in 2017/18') +
  # Customise the look of the visualisation
  theme_minimal() +
  theme(axis.text = element_text(size = 9),
        axis.title = element_text(size = 9),
        axis.title.y = element_blank(),
        axis.title.x = element_text(margin = margin(t = 10)),
        legend.title = element_blank(),
        legend.text = element_text(size = 9),
        legend.position = 'bottom',
        legend.margin = margin(l = -200, t = 10),
        panel.grid.major.y = element_line(size = 6, color = 'gray95'),
        plot.title.position = 'plot',
        plot.margin = margin(t = 10))

hh_exp_breakdown


6 Final Visualisation


The final visualisation is created, by combining all the charts created in the previous section, following the planned layout of the sketch.



How Do Expenditure Patterns Differ for Different Housing Types in 2017/18?






7 Visualisation Description & Insights


The visualisation analyses expenditure patterns of households in Singapore by different housing types, through 3 key charts.


1. Monthly Household Expenditure and Income


This chart reveals how much of total income is spent on goods and services (expenditure), by households of different housing types.

Only for households living in HDB 1- and 2-Room flats, expenses make up more than 50% of total monthly income. Across the spectrum from 1-room HDB flats to landed properties, average monthly household income increases. Households also become increasingly able to spend more comfortably, utilising a lower portion of monthly household income on expenditure.


2. Breakdown of Monthly Household Expenditure


This chart enables a better understanding of the composition and sources of household expenditure for different housing types.

For each housing type, relative expenditure across various categories can be interpreted by looking at same-coloured points. For each category, it enables comparison of relative expenditure by different housing types (encoded in different colours).

In general, across the spectrum from 1-room HDB flats to landed properties, households spend more on each expenditure category. For each category, households in landed properties spend the most (except housing and utilities, which households in condominiums spend the most), while households in 1- and 2-Room flats spend the least.

Households living in HDB 1- to 4- Room flats spent the most on food serving services, while households in 5-room flats, condominiums and landed properties spent the most on transport.

For all housing types except condominiums and landed properties, average monthly household expenditure for each category does not exceed $1000. For 1- and 2-Room flats, this does not exceed $500.

Certain categories like transport and food serving services, which have a greater variety of options and price range, see greater variation in monthly household expenditure for different housing types. Whereas expenditure in categories like communication and clothing and footwear vary less across the different housing types, with similar range of expenses.


3. Proportion of Total Households for Different Housing Types


This chart provides information on the composition of different housing types in Singapore.

The highest proportion of households live in HDB 4-room, 5-room and executive flats, while the lowest proportion live in 1- and 2-room flats and landed properties.