# Building stock in Helsinki

During Decision analysis and risk management 2015 course, this page was used to collect student contributions. To see them, look at an archived version. The page has since been updated for its main use. Data in the archived tables was moved: Table 2. Energy parametres of buildings, Table 4. Energy sinks, Table 5. Changes in energy efficiency, Table 6. Important energy parametres. Tables 3, 7, and 8 did not contain data and were removed.

## Question

What is the building stock in Helsinki and its projected future?

 ```## This code is Op_en7115/ on page [[Building stock in Helsinki]]. library(OpasnetUtils) library(ggplot2) objects.latest("Op_en7115", code_name = "stockBuildings") stockBuildings <- EvalOutput(stockBuildings) ggplot(stockBuildings@output, aes(x = Time, weight = stockBuildingsResult, fill = Heating)) + geom_bar(binwidth = 5) + theme_gray(base_size = 24) + labs( title = "Current building stock (floor area) by heating type \n and year of construction", x = "Construction year", y = expression("Floor area ( "*m^2*" )")) ggplot(stockBuildings@output, aes(x = Time, weight = stockBuildingsResult, fill = Building)) + geom_bar(binwidth = 5) + theme_gray(base_size = 24) + labs( title = "Current building stock (floor area) by building type \n and year of construction", x = "Construction year", y = expression("Floor area ( "*m^2*" )")) ```

## Rationale

This part contains the data needed for calculations about the building stock in Helsinki. It shows the different building and heating types in Helsinki, and how much and what kind of renovations are done for the existing building stock in a year, including how much and how old building stock is demolished. This data is used in further calculations in the model.

There is also some other important data that wasn't used in the model's calculations. These include more accurate renovation statistics for residential buildings, U-value changes for renovations and thermal transmittance of different parts of residential buildings. This data is found under Data not used.

### Carbon neutral Helsinki 2035

 ```# This is code Op_en/7115 on page [[Building stock in Helsinki]] library(OpasnetUtils) library(plotly) objects.latest("Op_en6007", code_name = "miscellaneous") # [[OpasnetUtils/Drafts]] truncateIndex objects.latest("Op_en6007", code_name = "hnh2035") # [[OpasnetUtils/Drafts]] pushIndicatorGraph objects.latest("Op_en7237", code_name = "intermediates") # [[Helsinki energy decision 2015]] buildings etc. buildings <- EvalOutput(buildings) tmp <- truncateIndex(buildings,"Building",6) colnames(tmp@output)[colnames(tmp@output)=="EnergySavingPolicy"] <- "Scenario" #> unique(tmp\$Scenario) #[1] BAU Energy saving moderate Energy saving total #[4] WWF energy saving levels(tmp\$Scenario) <- c("BAU","NA","tavoite","NA") tmp <- tmp[tmp\$Scenario!="NA",] p_buildings_b <- plot_ly( oapply(tmp[tmp\$Scenario=="BAU",], c("Building","Time"),sum)@output, x = ~Time, y = ~buildingsResult, color = ~Building, type = 'scatter', mode = 'lines') %>% layout( title="Rakennusala talotyypeittäin", xaxis=list(title="Vuosi"), yaxis=list(title="Rakennusala (m2)") ) p_buildings_h <- plot_ly( oapply(tmp[tmp\$Scenario=="BAU",], c("Heating","Time"),sum)@output, x = ~Time, y = ~buildingsResult, color = ~Heating, type = 'scatter', mode = 'lines') %>% layout( title="Rakennusala lämmitysmuodoittain", xaxis=list(title="Vuosi"), yaxis=list(title="Rakennusala (m2)") ) pushIndicatorGraph(p_buildings_b, "https://hnh.teamy.fi/v1/indicator/12/") pushIndicatorGraph(p_buildings_h, "https://hnh.teamy.fi/v1/indicator/13/") ```

### Building stock

These tables are based on FACTA database classifications and their interpretation for assessments. This data is used for modelling. The data is large and can be seen from the Opasnet Base. Technical parts on this page are hidden for readability. Building types should match Energy use of buildings#Baseline energy consumption.

 ```library(OpasnetUtils) library(ggplot2) # [[Building stock in Helsinki]], building stock, locations by city area (in A Finnish coordinate system) #stockBuildings <- Ovariable("stockBuildings", ddata = "Op_en7115.stock_details") #colnames(stockBuildings@data)[colnames(stockBuildings@data) == "Built"] <- "Time" #colnames(stockBuildings@data)[colnames(stockBuildings@data) == "Postal code"] <- "City_area" # [[Building stock in Helsinki]] dat <- opbase.data("Op_en7115.stock_details")[ , c( # "Rakennus ID", "Sijainti", "Valmistumisaika", # "Julkisivumateriaali", "Käyttötarkoitus", # "Lämmitystapa", "Polttoaine", # "Rakennusaine", # "Varusteena koneellinen ilmanvaihto", # "Perusparannus", # "Kunta rakennuttajana", # "Energiatehokkuusluokka", # "Varusteena aurinkopaneeli", "Tilavuus", "Kokonaisala", "Result" # Kerrosala m2 )] colnames(dat) <- c("City_area", "Time", "Building types in Facta", "Heating types in Facta", "Tilavuus", "Kokonaisala", "Kerrosala") dat\$Time <- as.numeric(substring(dat\$Time, nchar(as.character(dat\$Time)) - 3)) #dat <- dat[dat\$Time != 2015 , ] # This is used to compare numbers to 2014 statistics. dat\$Time <- as.numeric(as.character((cut(dat\$Time, breaks = c(0, 1885 + 0:26*5), labels = as.character(1885 + 0:26*5))))) dat\$Tilavuus <- as.numeric(as.character(dat\$Tilavuus)) dat\$Kokonaisala <- as.numeric(as.character(dat\$Kokonaisala)) dat\$Kerrosala <- as.numeric(as.character(dat\$Kerrosala)) build <- tidy(opbase.data("Op_en7115.building_types")) colnames(build)[colnames(build) == "Result"] <- "Building" heat <- tidy(opbase.data("Op_en7115.heating_types")) colnames(heat)[colnames(heat) == "Result"] <- "Heating" ###################### # Korjaus ######################## temp <- as.character(heat\$Heating) temp[temp == "District heating"] <- "District" temp[temp == "Light oil"] <- "Oil" temp[temp == "Fuel oil"] <- "Oil" heat\$Heating <- temp ######################################## dat <- merge(merge(dat, build), heat)#[c("City_area", "Time", "Building", "Heating", "stockBuildingsResult")] dat\$Kerrosala[is.na(dat\$Kerrosala)] <- dat\$Kokonaisala[is.na(dat\$Kerrosala)] * 0.8 # If floor area is missing, estimate from total area. cat("Kerrosala ilman 2015 (m^2)\n") oprint(aggregate(dat["Kerrosala"], by = dat["Building"], FUN = sum, na.rm = TRUE)) cat("Kokonaisala ilman 2015 (m^2)\n") oprint(aggregate(dat["Kokonaisala"], by = dat["Building"], FUN = sum, na.rm = TRUE)) cat("Tilavuus ilman 2015 (m^3)\n") oprint(aggregate(dat["Tilavuus"], by = dat["Building"], FUN = sum, na.rm = TRUE)) temp <- aggregate(dat["Kerrosala"], by = dat[c("Time", "Building", "Heating")], FUN =sum, na.rm = TRUE) colnames(temp)[colnames(temp) == "Kerrosala"] <- "stockBuildingsResult" stockBuildings <- Ovariable("stockBuildings", data = temp) objects.store(stockBuildings) cat("Ovariable stockBuildings stored.\n") ```

### Construction and demolition

It is assumed that construction occurs at a constant rate so that there is an increase of 42% in 2050 compared to 2013. Energy efficiency comes from Energy use of buildings.

 ```# This code is Op_en7115/changeBuildings on page [[Building stock in Helsinki]] library(OpasnetUtils) changeBuildings <- Ovariable("changeBuildings", dependencies = data.frame( Name = c( "stockBuildings", "efficiencyShares" ), Ident = c( "Op_en7115/stockBuildings", # [[Building stock in Helsinki]] "Op_en5488/efficiencyShares" # [[Energy use of buildings]] ) ), formula = function(...) { out <- oapply(stockBuildings, cols = c("Time", "Constructed"), FUN = sum) out <- out * 0.013125 * 5 * efficiencyShares # linear increase 42% from 2013 to 2050 out@output <- out@output[as.numeric(as.character(out@output\$Time)) >= 2015 , ] return(out) } ) objects.store(changeBuildings) cat("Ovariable changeBuildings stored.\n") ```

Fraction of houses demolished per year.

Demolition rate(% /a)
ObsAgeRate
100
2501
310001

 ```# This code is Op_en7115/demolitionRate on page [[Building stock in Helsinki]] library(OpasnetUtils) demolitionRate <- Ovariable('demolitionRate', dependencies = data.frame(Name = "dummy"), formula = function(...) { temp <- tidy(opbase.data('Op_en7115', subset = 'Demolition rate')) temp\$Age <- round(as.numeric(as.character(temp\$Age))) out <- as.data.frame(approx( temp\$Age, temp\$Result, n = (max(temp\$Age) - min(temp\$Age) + 1), method = "constant" )) colnames(out) <- c("Age", "demolitionRateResult") out\$demolitionRateResult <- out\$demolitionRateResult / 100 * 10 # For ten-year intervals out <- Ovariable("demolitionRate", output = out, marginal = c(TRUE, FALSE)) return(out) } ) objects.store(demolitionRate) cat("Object demolitionRate stored.\n") ```

### Heating type conversion

The fraction of heating types in the building stock reflects the situation at the moment of construction and not currently. The heating type conversion corrects this by changing a fraction of heating methods to a different one at different timepoints. Cumulative fraction, other timepoints will be interpolated.

Yearly_heating_converted_factor(m2/m2)
ObsHeating_fromHeating_toTimeResult
1OilGeothermal20050
2OilGeothermal20150.5
3OilGeothermal20251

 ```library(OpasnetUtils) heatTypeConversion <- Ovariable("heatTypeConversion", dependencies = data.frame( Name = c( "buil", # stock at different timepoints "obstime" ) ), formula = function(...) { dat <- opbase.data("Op_en7115", subset = "Yearly_heating_converted_factor") colnames(dat)[colnames(dat) == "Time"] <- "Obsyear" dat\$Obs <- NULL out <- data.frame() temp <- unique(dat[c("Heating_from", "Heating_to")]) for (i in 1:nrow(temp)) { onetype <- merge(temp[i,], dat) tempout <- merge(obstime@output, onetype, all.x = TRUE)[c("Obsyear","Result")] tempout <- merge(tempout, temp[i,]) for (j in (1:nrow(tempout))[is.na(tempout\$Result)]) { a <- onetype\$Obsyear[which.min(abs(as.numeric(as.character(onetype\$Obsyear)) - as.numeric(as.character(obstime\$Obsyear[j]))))] tempout\$Result[j] <- onetype\$Result[a] } out <- rbind(out, tempout) } out <- Ovariable(output = out, marginal = colnames(out) != "Result") colnames(out@output)[colnames(out@output) == "Heating_from"] <- "Heating" out <- buil * out out1 <- out out1\$Result <- - out1\$Result out1\$Heating_to <- NULL out\$Heating <- out\$Heating_to out\$Heating_to <- NULL out@output <- rbind(out1@output, out@output) #sum(out\$Result) #nrow(out1@output)*2 - nrow(out@output) return(out) } ) objects.store(heatTypeConversion) cat("Ovariable heatTypeConversionstored.\n") ```

### Renovations

Estimates from Laura Perez and Stephan Trüeb, unibas.ch N:\YMAL\Projects\Urgenche\WP9 Basel\Energy_scenarios_Basel_update.docx

Fraction of houses renovated per year(%)
ObsAgeResultDescription
100Estimates from Laura Perez and Stephan Trüeb
2200Assumption Result applies to buildings older than the value in the Age column.
3251
4301
5501
61001
710001

 ```library(OpasnetUtils) renovationRate <- Ovariable('renovationRate', dependencies = data.frame(Name = "dummy"), formula = function(...) { temp <- tidy(opbase.data('Op_en7115', subset = 'Fraction of houses renovated per year')) temp\$Age <- round(as.numeric(as.character(temp\$Age))) out <- as.data.frame(approx( temp\$Age, temp\$Result, n = (max(temp\$Age) - min(temp\$Age) + 1), method = "constant" )) colnames(out) <- c("Age", "renovationRateResult") out\$renovationRateResult <- out\$renovationRateResult / 100 out <- Ovariable("renovationRate", output = out, marginal = c(TRUE, FALSE)) return(out) } ) objects.store(renovationRate) cat("Object renovationRate stored.\n") ```

Popularity of renovation types(%)
ObsRenovationFractionDescription
1None0
2Windows65
3Technical systems30
4Sheath reform5
5General0

 ```library(OpasnetUtils) renovationShares <- Ovariable("renovationShares", dependencies = data.frame(Name = "dummy"), formula = function(...) { out <- Ovariable("raw", ddata = 'Op_en7115', subset = 'Popularity of renovation types') out <- findrest((out), cols = "Renovation", total = 100) / 100 renovationyear <- Ovariable("renovationyear", data = data.frame( Obsyear = factor(c(2015, 2025, 2035, 2045, 2055, 2065)), Result = 1 )) out <- out * renovationyear # renovation shares repeated for every potential renovation year. out@output\$Renovation <- factor(out@output\$Renovation, levels = c( "None", "General", "Windows", "Technical systems", "Sheath reform" ), ordered = TRUE) return(out) } ) objects.store( renovationShares # Fraction of renovation type when renovation is done. ) cat("Objects renovationShares stored.\n") ```

### Locations of city areas

Locations of city areas (hidden for readability).

### Data not used

This contains data that was not used in the model's calculations. This includes renovation rates, the rates of heat flowing out of buildings and total floor areas of multiple types of buildings in Helsinki. The floor area data is also found in the background data of this page, which was used in the model.

 Building Baseline 2020 2025 2050 Year of baseline Description Residential 27884795 32472388 34890241 44069914 2014 Building stock of Helsinki area, 2014 Public 4537025 4764475 4945952 5855546 2014 Building stock of Helsinki area, 2014 Industrial 3277271 3306063 3360467 3640854 2014 Building stock of Helsinki area, 2014 Other 10861972 11406505 11840973 13806423 2014 Building stock of Helsinki area, 2014
Notes
• Estimates were based on Siemens City Performance toolin seuraava kokous 2.2 and some derived calculations on BUILDING STOCK CALCULATION 2015.
• How to get the numbers for the baseline floor area for residential, public, industrial and other: Residential floor area was named as residential together, public by summing the floor area of health care, education and common buildings, industrial buildings were as such and other buildings comprise of business, traffic, office and storage buildings.
• Ref. Helsinki master plan for 2050: there are 860 000 citizens living in Helsinki (ref. www.yleiskaava.fi, visio2050); Residental buildings => fast growth
• Prediction of citizen number in Helsinki in 2020, 2030, 2040 and 2050 was used for calculations (ref. Helsingin 30% päästövähennysselvitys).
• Helsinki’s climate policy: 30% reduction in emissions: In 2010 the proportion of jobs in services and public sectors was 94%, and in industry 6%. In 2020 the proportion of jobs in services and public sectors is estimated to be 96%, and in industry 4%. Public and other buildings => between fast growth option and basic option, Industry=> Basic option
• Prediction of job number in Helsinki in 2020, 2030, 2040 and 2050 was used for calculations (ref. Helsingin 30% päästövähennysselvitys).
• Tables one and two The presentation of Tables 1 and 2

Technical notes:

Sheet 4_Input Buildings (Area Demand). Priority 1. Auxiliaries PPT. Absolute increase/decrease rate will be based on the inhabitants projected in time.
This is another list building types that was considered but rejected as too complex: Residential buildings, Government & public administration buildings, Commercial offices buildings, Data centers buildings, Education and K12 and universitiy buildings, Hospitals and healthcare buildings, Hotels and hospitality and leisure buildings, Exhibitions and fairs and halls buildings, Retail and stores and shops buildings, Warehouses & shopping mall buildings, Industrial buildings, Non residential buildings unspecified.
• There was a problem with missing data. There is more than 400000 m^2 floor area that is missing; this is estimated from total area that is available for these buildings. For other buildings, there is more than 400000 m^2 total area missing from buildings where floor area is given. See statistical analysis [1]. This was corrected by inputation so that is floor area was missing, 0.8*total_area was used instead [2].
Renovations per year made in residental buildings owned by Helsinki city, by construction year of the buildings.[1]
Construction year Balcony glasses Windows Julkisivujen peruskorjaus Vesikattojen peruskojaus Lämmönvaihtimen uusiminen Patteriverkoston säätö Kylpyhuonekalusteiden vaihto Patteriventtiilien vaihto New balcony doors LTO-laitteen asennus Water consumption measurements
-20 0,0 % 1,1 % 1,1 % 1,1 % 1,1 % 1,1 % 1,1 % 1,1 % 1,1 % 1,1 % 1,1 %
21-25 0,0 % 10,3 % 1,2 % 11,1 % 10,3 % 10,3 % 1,2 % 10,3 % 1,2 % 10,3 % 10,3 %
26-30 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 9,5 % 0,0 %
31-35 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 % 0,0 %
36-40 0,0 % 0,0 % 0,0 % 0,0 % 4,2 % 4,2 % 0,0 % 0,0 % 0,0 % 4,2 % 0,0 %
41-45 0,0 % 16,7 % 0,0 % 16,7 % 16,7 % 16,7 % 0,0 % 16,7 % 0,0 % 16,7 % 16,7 %
46-50 0,0 % 5,2 % 0,0 % 7,4 % 7,4 % 7,4 % 0,0 % 7,4 % 0,0 % 5,2 % 5,2 %
51-55 0,0 % 11,3 % 0,0 % 8,8 % 8,8 % 8,8 % 0,0 % 8,8 % 0,0 % 8,8 % 16,2 %
56-60 0,0 % 5,4 % 0,0 % 4,9 % 6,2 % 7,1 % 0,0 % 6,2 % 4,5 % 4,5 % 5,4 %
61-65 0,0 % 1,5 % 1,3 % 0,8 % 2,9 % 2,4 % 1,0 % 2,4 % 0,9 % 0,9 % 2,9 %
66-70 0,6 % 2,9 % 1,2 % 2,8 % 1,4 % 2,3 % 1,1 % 1,1 % 0,1 % 1,1 % 1,1 %
71-75 3,2 % 3,1 % 3,4 % 2,9 % 3,1 % 2,6 % 0,2 % 1,1 % 0,2 % 0,2 % 0,2 %
76-80 0,1 % 2,7 % 0,1 % 0,7 % 2,0 % 1,7 % 1,1 % 1,2 % 0,2 % 0,4 % 0,2 %
81-85 1,0 % 2,8 % 0,7 % 2,3 % 3,3 % 4,8 % 3,5 % 0,0 % 0,0 % 0,0 % 0,8 %
86-90 0,0 % 1,3 % 0,0 % 2,1 % 6,1 % 1,6 % 0,7 % 1,8 % 0,3 % 0,3 % 1,0 %
91-95 0,6 % 0,3 % 0,0 % 3,9 % 8,6 % 1,9 % 5,1 % 0,8 % 0,2 % 0,0 % 1,3 %
96-00 0,1 % 0,0 % 0,0 % 0,6 % 1,2 % 1,0 % 1,5 % 1,0 % 0,0 % 0,0 % 4,2 %
01-05 2,9 % 0,0 % 0,0 % 0,0 % 1,2 % 1,0 % 0,0 % 1,0 % 0,0 % 0,0 % 0,7 %
06-10 1,7 % 0,0 % 0,0 % 0,0 % 0,5 % 0,5 % 0,0 % 0,5 % 0,0 % 0,0 % 0,0 %

#: . In the document there are similar tables for total renovations from 2010 onwards to years 2016, 2020 and 2050. --Heta (talk) 09:28, 16 June 2015 (UTC) (type: truth; paradigms: science: relevant defense)

Toimenpiteiden vaikutukset yksittäisessä kohteessa ja toimenpiteisiin liittyviä huomautuksia.[1]
Action The feature in question Difference to before Unit Notes
Glass for balconies U-value for windows -0,3 W/m2,K Säästö 1-4% rakennustasolla
Changing the windows U-value for windows -1 W/m2,K Vanhoista osa kaksilasisia ja osa kolmilasisia. Uudes 1,0 W/m2,K tai alle
Julkisivun peruskorjaus U-value of walls -0,2 W/m2,K U-arvo puolitetaan eli n. 100 mm lisäeristys
Vesikattojen peruskorjaus Yläpohjan U-arvo -0,15 W/m2,K Oletetaan 50% lisäeristys U-arvo puoleen eli n. 100 mm lisäerstys
Balcony door change U-value of doors -0,5 W/m2,K Tiivistyminen tuo lisäsäästöä
 Construction decade Thermal transmittance factors for building components (W/m2K) Ventilation and leakage air rates (1/h) Floor Roof Walls Windows Outdoors Supply air through the heat recovery unit Supply air bypassing the heat recovery unit Leakage air Before 1980 Single family house 0.52 0.32 0.54 2.14 1.18 0.30 0.05 0.20 Row house 0.52 0.36 0.56 2.15 1.00 0.3 0.05 0.20 Apartment building 0.59 0.37 0.61 2.18 1.40 0.37 0.00 0.10 1980's Single family house 0.30 0.21 0.28 1.70 1.00 0.30 0.05 0.15 Row house 0.32 0.22 0.30 1.70 1.00 0.30 0.05 0.15 Apartment building 0.34 0.23 0.29 1.80 1.40 0.35 0.00 0.10 1990's Single family house 0.25 0.20 0.25 1.70 1.00 0.30 0.05 0.15 Row house 0.32 0.22 0.28 1.70 1.00 0.30 0.05 0.15 Apartment building 0.332 0.22 0.28 1.75 1.40 0.38 0.00 0.10 2000's Single family house 0.24 0.17 0.24 1.40 1.00 0.30 0.05 0.13 Row house 0.28 0.18 0.26 1.50 1.00 0.45 0.05 0.15 Apartment building 0.28 0.18 0.26 1.50 1.40 0.55 0.00 0.10 2010's Single family house 0.16 0.09 0.17 1.00 1.00 0.30 0.05 0.10 Row house 0.16 0.09 0.17 1.00 1.00 0.50 0.05 0.15 Apartment building 0.16 0.09 0.17 1.00 1.00 0.60 0.00 0.10

Helsinki energy decision 2015
In English
Assessment Main page | Helsinki energy decision options 2015
Helsinki data Building stock in Helsinki | Helsinki energy production | Helsinki energy consumption | Energy use of buildings | Emission factors for burning processes | Prices of fuels in heat production | External cost
Models Building model | Energy balance | Health impact assessment | Economic impacts
Related assessments Climate change policies in Helsinki | Climate change policies and health in Kuopio | Climate change policies in Basel
In Finnish
Yhteenveto Helsingin energiapäätös 2015 | Helsingin energiapäätöksen vaihtoehdot 2015 | Helsingin energiapäätökseen liittyviä arvoja | Helsingin energiapäätös 2015.pptx

## References

1. HAESS Final report, Tampere University of Technology, 2010
2. MK Mattinen, J Heljo, J Vihola, A Kurvinen, S Lehtoranta, A Nissinen: Modeling and visualisation of residential sector energy consumption and greenhouse gas emissions