library(rvest)
library(xml2)
library(tidyverse)
library(data.table)
res <- list()
for (j in 1:9) {
for (i in 1:50) {
p <-
paste(
"https://www.hemnet.se/salda/bostader?item_types%5B%5D=bostadsratt&living_area_max=60&living_area_min=45&location_ids%5B%5D=925963&location_ids%5B%5D=898472&location_ids%5B%5D=473482&location_ids%5B%5D=473440&location_ids%5B%5D=925959&location_ids%5B%5D=473376&location_ids%5B%5D=941046&page=",
j,
"&rooms_max=2.5&rooms_min=2&selling_price_max=3500000&selling_price_min=2500000",
sep = ""
)
htmlfile <- read_html(p)
links <- rvest::html_nodes(htmlfile, ".item-link-container") %>%
rvest::html_attr("href")
htmlfile <- read_html(links[i])
try <-
rvest::html_nodes(
htmlfile,
".sold-property__metadata , .sold-property__price , .sold-property__attribute-value"
) %>%
rvest::html_text() %>%
gsub(pattern = "\n ", replacement = "") %>%
gsub(pattern = " ", replacement = "") %>%
as.list()
res[[(i + 50 * j)]] <- try
}
}
res <- lapply(res, `length<-`, max(lengths(res)))
df <-
rbindlist(res) %>% `colnames<-`(
c(
"Lägenhet",
"Slutpris",
"Kvm-pris",
"Pris",
"Förändring",
"Rum",
"Kvm",
"Avgift",
"Driftskostnad",
"Byggår",
"Brf",
"a"
)
)
df <- df %>%
mutate(
Slutpris = as.numeric(gsub("[^[:digit:].]", "", Slutpris)),
`Kvm-pris` = as.numeric(gsub("[^[:digit:].]", "", `Kvm-pris`)),
Pris = as.numeric(gsub("[^[:digit:].]", "", Pris)),
Rum = str_replace(Rum, ",", "."),
Rum = as.numeric(gsub("[^[:digit:].]", "", Rum)),
Kvm = str_replace(Kvm, ",", "."),
Kvm = as.numeric(gsub("[^[:digit:].]", "", Kvm)),
Avgift = as.numeric(gsub("[^[:digit:].]", "", Avgift))
) %>%
mutate(Byggår = ifelse(is.na(Byggår), Driftskostnad, Byggår)) %>%
mutate(Driftskostnad = ifelse(str_detect(Driftskostnad, pattern = "kr/Ã¥r"), Driftskostnad, NA)) %>%
mutate(Driftskostnad = as.numeric(gsub("[^[:digit:].]", "", Driftskostnad))) %>%
mutate(Förändring = str_match_all(Förändring, "(?<=\\().+?(?=\\))")) %>%
mutate(Förändring = str_replace(Förändring, "%", ""),
Förändring = as.numeric(Förändring)) %>%
select(-c(Brf, a)) %>%
mutate(Byggår = as.numeric(Byggår)) %>%
mutate(Lägenhet = sub('.*-\\n', '', Lägenhet)) %>%
mutate(Lägenhet = sub(', Stockholm.*', '', Lägenhet)) %>%
mutate(Ålder = 2019 - Byggår) %>%
filter(!str_detect(Lägenhet, "Stockholm")) %>%
mutate(Lägenhet = ifelse(
str_detect(Lägenhet, "Södermalm"),
"Södermalm",
ifelse(
str_detect(Lägenhet, "Globen"),
"Globen",
ifelse(
str_detect(Lägenhet, "Hammarbyhöjden"),
"Hammarbyhöjden",
ifelse(
str_detect(Lägenhet, "Johanneshov"),
"Johanneshov",
ifelse(
str_detect(Lägenhet, "Enskede"),
"Enskede",
ifelse(
str_detect(Lägenhet, "Gullmarsplan"),
"Gullmarsplan",
ifelse(str_detect(
Lägenhet, c("Hornstull", "Sofia", "Katarina", "Mosebacke")
), "Södermalm", Lägenhet)
)
)
)
)
)
)) %>%
mutate(Område = trimws(Lägenhet)) %>%
select(-Lägenhet)
df <- df %>% mutate(Område = trimws(Område))
områden <-
df %>% group_by(Område) %>% summarise(
mean = mean(Förändring, na.rm = T),
sd = sd(Förändring, na.rm = T),
n = n()
) %>% filter(n > 3) %>% select(Område) %>% unlist()
df %>% group_by(Område) %>% summarise(
Medel_förändring = mean(Förändring, na.rm = T),
sd_Förändring = sd(Förändring, na.rm = T),
antal_bostäder = n()
) %>% filter(antal_bostäder > 3)
## # A tibble: 13 x 4
## Område Medel_förändring sd_Förändring antal_bostäder
## <chr> <dbl> <dbl> <int>
## 1 Ã…rsta 12.1 7.09 125
## 2 Bagarmossen 21.1 5.77 20
## 3 Björkhagen 14.3 5.27 34
## 4 Blåsut 11.6 8.94 13
## 5 Enskede 14.4 8.85 34
## 6 Globen 20 8.77 15
## 7 Gullmarsplan 14.1 11.8 9
## 8 Hammarbyhöjden 14.6 6.28 99
## 9 Johanneshov 16.8 8.62 26
## 10 Kärrtorp 13.9 7.40 18
## 11 Skärmarbrink 12 3.46 4
## 12 Södermalm 8.25 7.48 11
## 13 Svedmyra 7.4 5.59 8
dfplot <- df %>%
filter(Område %in% områden)
ordered_spec = with(dfplot, reorder(Område, Förändring, median))
dfplot$Område <- as.factor(dfplot$Område)
dfplot %>%
ggplot(aes(
y = Förändring,
x = reorder(Område, desc(Förändring), FUN = median, na.rm = T),
fill = Område
)) +
geom_boxplot(alpha = 0.5) +
theme_minimal() +
ylab("Förändring från utropspris till slutpris (%)") +
xlab("") +
theme(axis.text.x = element_text(angle = 45)) +
theme(legend.position = "none") +
ggtitle("Alla försäljningar på Hemnet senaste 12 månaderna i följande områden",
subtitle = "Endast områden med fler än 3 bostäder är inkluderade")
