1 Overview

In mid July, Singapore’s Ministry of Trade & Industry announced that Singapore is entering technical recession after GDP plunges 41.2% in second quarter from preceding quarter due to COVID-19 pandemic. As understanding the property market is crucial to understand financial status of the economy, this assignment focuses on visualizing Singapore’s private property market transaction record in multiple aspects to give insights for readers.

1.1 Objectives

  • Understand transaction trend of private properties in Singapore during COVID-19 pandemic period
  • Understand differences in unit price per square meter by tenure
  • Understand differences in unit price per square meter by postal sector

1.2 Challenges

We can easily look up the property data from numerous websites such as propertyguru and 99.co. However, it is difficult to understand overall market trend or comparison across region due to the limitations of data visualization. This assignment is expected to overcome this challenge and visualize various changes happened during COVID-19 pandemic period in Singapore’s private property market.

1.3 Data

For this study, data from Real Estate Information System (REALIS) published by Urban Redevelopment Authority (URA) is used. Data covers 6168 transaction data completed from January 2020 to June 2020, only for private properties. Executive condominiums and HDB transactions are not included in this study.

1.4 Sketch of Proposed Design

image: Proposed Design

2 Getting Ready

2.1 Install Packages

packages = c('tidyverse', 'dplyr', 'lubridate', 'tidyr', 'ggpubr',
             'seriation', 'scales', 'pivottabler', 'knitr')

for (p in packages){
  if(!require(p, character.only = T)){
    install.packages(p)
  }
  library(p, character.only = T)
}

2.2 Data Cleaning and Wrangling

Import the csv file.

realis <- read_csv("realis_2020Jan-Jun.csv")

As we are going to focus on unit price per square meter, date of transaction, tenure of the property, postal district and planning region, use filter function and various data mutate functions to clean up the data.

realis_filter <- realis %>%
  select(project, sqm, transacted_price, unit_price_sqm, sale_date,
         tenure, postal_district, planning_region)

realis_filter$postal_district <- factor(realis_filter$postal_district)

realis_filter$sale_date <- as.Date(realis_filter$sale_date, format = "%d-%b-%y")

2.3 Check the final data frame

print(realis_filter)
## # A tibble: 6,168 x 8
##    project   sqm transacted_price unit_price_sqm sale_date  tenure
##    <chr>   <dbl>            <dbl>          <dbl> <date>     <chr> 
##  1 KOVAN ~    72          1100000          15278 2020-06-30 99 Ye~
##  2 JADESC~   153          2748100          17961 2020-06-30 99 Ye~
##  3 THE FO~    47           660000          14043 2020-06-30 Freeh~
##  4 THE PA~   113          1680000          14867 2020-06-30 Freeh~
##  5 RESIDE~   122          1960000          16066 2020-06-30 Freeh~
##  6 MODENA    135          1153000           8541 2020-06-30 99 Ye~
##  7 STIRLI~    61          1253000          20541 2020-06-30 99 Ye~
##  8 AFFINI~    79          1305000          16519 2020-06-30 99 Ye~
##  9 AFFINI~    44           772000          17545 2020-06-30 99 Ye~
## 10 AFFINI~   107          1609000          15037 2020-06-30 99 Ye~
## # ... with 6,158 more rows, and 2 more variables: postal_district <fct>,
## #   planning_region <chr>

3 Data Visualization with R

3.1 Understanding the Trend

3.1.1 Time Series transaction trend

time_data <- realis_filter %>%
  group_by(sale_date, planning_region) %>%
  summarize(no_transaction = n(), .groups = 'drop')

#remove one data that was a bulk sell (>300 on one day)
time_data <- filter(time_data, no_transaction < 60)
g1 <- time_data %>%
  ggplot(aes(x=sale_date, y=no_transaction, color = planning_region)) +
  geom_line(size = 1, alpha = 0.8) +
  scale_x_date(date_labels = "%b", date_breaks = "1 month") +
  theme_classic() +
  xlab("Month 2020") + ylab("transactions count") +
  ggtitle("Number of private property transactions: Jan - Jun 2020 by Planning Region")

3.1.2 Total number of transactions by Postal District

g2 <- realis_filter %>%
  ggplot(aes(x=postal_district)) +
  geom_bar(color = "grey", fill = "lightblue") +
  xlab("Postal District") + ylab("Number of transactions") +
  theme_classic() +
  ggtitle("Total Number of transactions by Postal district (Jan - Jun 2020)")

3.2 Understand price difference across the region

3.2.1 Unit Price difference by Planning Region

g3 <- realis_filter %>%
  ggplot(aes(x = planning_region,
             y = unit_price_sqm)) +
  geom_violin(aes(fill = planning_region)) +
  geom_boxplot(width = 0.2) +
  scale_y_continuous(labels = dollar) +
  theme(legend.position = "none",
        plot.title = element_text(size=11)) +
  theme_classic() +
  xlab("Planning Region") + ylab("unit price per sqm (SGD)") +
  ggtitle("Unit Price per sqm by Planning Region")

3.2.2 Unit price difference by postal district & tenure

g4 <- realis_filter %>%
  ggplot(aes(x = tenure, y = unit_price_sqm)) +
  geom_boxplot(aes(fill = tenure)) +
  scale_y_continuous(labels = dollar) +
  facet_wrap(~postal_district, ncol = 7) +
  theme_classic() +
  xlab("Tenure") + ylab("Unit Price per sqm (SGD)") +
  theme(axis.text.x = element_text(angle = 90))

4 Final Visualization and Insights

Using saved plots based on the code in above section, there are 4 different plots printed out for the interpretation.

This plot shows the daily transaction trend from 1st January 2020 to 30th June 2020. From this plot, we can see a strong plunge starting from April to June. Considering the fact that Singapore Government started a Circuit Breaker, which is also known as lockdown, from early April, the the plunge during this period can be explained.From June onwards, we can see the recovery trend that catches up January’s total number of transactions.

Furthermore, we can understand which district has the most frequent transactions despite the plunged transactions throughout the COVID-19 pandemic period. This plot shows that District 18 and 19 shows the highest volume of transactions compared to other regions. To understand further, we can print out the sample data of transactions completed in these districts.

## # A tibble: 656 x 8
##    project   sqm transacted_price unit_price_sqm sale_date  tenure
##    <chr>   <dbl>            <dbl>          <dbl> <date>     <chr> 
##  1 MODENA    135          1153000           8541 2020-06-30 99 Ye~
##  2 TREASU~    82          1175000          14329 2020-06-30 99 Ye~
##  3 TREASU~    78          1167000          14962 2020-06-30 99 Ye~
##  4 TREASU~    63           944000          14984 2020-06-30 99 Ye~
##  5 TREASU~   123          1817000          14772 2020-06-30 99 Ye~
##  6 TREASU~    96          1386000          14438 2020-06-30 99 Ye~
##  7 TREASU~   159          2067000          13000 2020-06-30 99 Ye~
##  8 TREASU~    94          1389000          14777 2020-06-30 99 Ye~
##  9 TREASU~    96          1350000          14063 2020-06-30 99 Ye~
## 10 THE TA~    86          1220160          14188 2020-06-30 99 Ye~
## # ... with 646 more rows, and 2 more variables: postal_district <fct>,
## #   planning_region <chr>

From this data, we can see that there was a newly launched project and there was a bulk transaction for “Treasure at Tampines” units. Following picture shows Singapore’s district map as an image file for the reference.

image: Singapore District Map

From this plot, we can understand that the unit price per square meter is relatively higher in central region, followed by west region in Singapore in January to June 2020 period. Also, it would give a further insights if we can explore further on reason of having huge distribution for central region unit prices.

Last but not least, the final chart shows a consolidated unit price per sqm data by postal district and by tenure. In Singapore, tenure of the property is one of the key factors to decide value of the unit. As expected, freehold property shows higher unit price compared to property with limited tenure. Interestingly, district 18, 19, 20 shows higher unit price per sqm from 99 years tenured properties. As we discovered from above chart, the new projects would have affected the higher unit price compared to freehold but older property.