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.
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) |
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.
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.
Challenge
For the household expenditure breakdown data, there are as many as 15 categories for the expenditure breakdown:
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.
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%.
Taking into consideration the challenges, the sketch below shows the proposed design for the data visualisation of household expenditure patterns by housing types.
In this section, the data visualisation based on the sketched design will be prepared step-by-step.
The following packages will be installed:
tidyverse: contains a collection of R packages for data importing and manipulationwaffle: ggplot2 extension to create waffle chartspackages <- 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")
The data sets on household expenditure and income will be imported for the creation of the data visualisation.
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(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...
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
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(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,...
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
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(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...
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
Data will be pre-processed before the data visualisation can be created.
Data required for the analysis will be extracted.
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
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.
# 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
Income and expenditure data will be joined, such that the figures can be utilised in union in the data visualisation.
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
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
Category (factor) levels will be re-ordered for housing type:
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"))
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 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))
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>
This section creates the charts for the data visualisation.
ggplot2 will be used for designing the data visualisation.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
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
A chart visualising the breakdown of monthly household expenditure for different housing types will be created.
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
The final visualisation is created, by combining all the charts created in the previous section, following the planned layout of the sketch.
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.