
Vi tittar på avvikelse från Boolis värdering för att försöka förstå vilken påverkan tillgång till balkong och solläge har på priset på en lägenhet. Vi begränsar oss till Stockholms kommun och dataunderlaget är försäljningar under ett helår mellan 2018-06-01 och 2019-06-01.
Definitioner
Vi vill undersöka hur stora värderingsfel vi har givet att lägenheten i fråga har någon av nedanstående typer av balkonger.
- Saknar balkong: lägenheten har ingen möjlighet till utomhusvistelse
- Traditionell balkong: en vanlig balkonglåda
- Terrass: en ovanligt stor balkong
- Kungsbalkong: en balkong på översta våningen som sträcker sig över flera rum
Utöver det kommer vi också titta på hur söderläge påverkar felet i värderingen.
Läs in förberedd data
import pandas as pd
df = pd.read_csv('data/sthlm_apt_balcony.csv', index_col=0)
df = df[['lat', 'lng', 'soldDate', 'soldPrice', 'estimatedPrice',
'listPrice', 'error', 'error_percent', 'abs_error',
'abs_error_percent', 'objectType', 'description',
'class', 'balkong', 'kungsbalkong', 'terrass']]
display(df.head())
display(df.shape)
Vi har ca 18 500 observationer av lägenhetsförsäljningar i Stockholms kommun under ett helår. För varje observation har vi information om koordinat, slutpris, värdering, felet i värderingen samt indikationer på om det finns balkong eller ej.
Vi har låtit en klassificerare avgöra om lägenheten har balkong baserat på innehållet i lägenhetsbeskrivningen. Utlåtandet från klassificeraren sparas i kolumnen class
där värdet 1
innebär att det troligtvis finns en balkong eller annan möjlighet till utevistelse, och 0
innebär att det inte gör det.
För varje observation har vi också gjort en nyckelordssökning i ett försök att bedöma vilken typ av balkong det handlar om. Vi har sökt efter ”balkong”, ”kungsbalkong” och ”terrass”. Om vi har hittat att ordet förekommer i beskrivningen så har vi satt en 1:a i den kolumnen. Det finns exempel på när vi har klassificerat en bostad som att den saknar balkong, men då vi ändå hittar ordet balkong i texten. Se t.ex. rad 2 (index 1) i tabellen ovan. Beskrivningen för den bostaden finns nedan.
print(df.iloc[1]['description'])
Stilren lägenhet i förening med låg avgift
Välkommen till en mycket ljus och trivsam lägenhet där alla kvadratmeter optimalt utnyttjas. Lägenheten har genomgående smakfulla material- och färgval och den öppna planlösningen mellan vardagsrum och kök ger härliga sällskapsytor. Den franska balkongen bjuder på många tillfällen att öppna upp varma sommardagar. Här erbjuds även sängplats mot vardagsrum, ett sovrum, rymligt badrum med tvättpelare samt hall med goda avhängningsytor. Bra läge i Sjöstaden med närhet till kommunikationer, fantastiska promenadstråk, vatten, service, mataffärer, restauranger och skola/förskolor. Stabil förening med låg avgift!
Välkommen på visning!
img
Visa mer info om bostaden
img
I annonsen skriver man om den ”franska balkongen” vilket är orsaken till att nyckelordssökningen ger träff men vår balkongklassificerare svarar negativt. Det finns fler exempel på när klassificeraren kan ge negativt svar och ett eller flera av nyckelorden ändå förekommer i texten. T.ex. kan mäklaren skriva om ”bygglov för balkong”, ”gemensam balkong”, ”vädringsbalkong”, ”piskaltan” eller liknande.
Balkongklassificeraren har tränats på manuellt uppmärkt data och i korsvalidering visats ha en träffsäkerhet på ca 95 % korrekt klassificerade texter.
Nyckelordssökning för sollägen
import re
df['south_facing'] = df['description'].str.findall(
r'söderläge', flags=re.IGNORECASE).apply(len) > 0
Vi försöker avgöra om en lägenhet har balkong i söderläge genom att söka efter om ordet ”söderläge” förekommer i beskrivningen. Detta är en ganska grov sökning som bygger på att mäklarna använder just det ordet och vi kommer troligtvis ha en stor del missar. Att utöka med fler ord i sökningen som t.ex. ”söder” skulle dock innebära problem med att vi matchar mot t.ex. ”Södermalm” och därmed får en större mängd false positives. Den här klassificeringen skulle man kunna göra mycket mer avancerad, men vi vill vi hålla det enkelt och nöjer oss så, med vetskap om att vi kommer ha många false negatives.
Filtrera outliers och titta på datan
# Filter outliers based on sale price
quantiles = df['soldPrice'].quantile([0.01, 0.99])
df = df[(df['soldPrice'] >= quantiles[0.01]) &
(df['soldPrice'] <= quantiles[0.99])]
quantiles = df['error_percent'].quantile([0.01, 0.99])
df = df[(df['error_percent'] >= quantiles[0.01]) &
(df['error_percent'] <= quantiles[0.99])]
df['error_percent'].hist(bins=20)
display("Median absolute error: {} %".format(
df['abs_error_percent'].median() * 100))
display(df['error_percent'].describe())
Vi kan se att efter outlierfiltrering har våra värderingar ett medianfel på ca 5,2 % och en standardavvikelse på ca 8 %. Felen är någorlunda normalfördelade och det kan då antas att ca 68 % av värderingarna ligger inom en standardavvikelse från köpeskillingen.
Undersök korrelation med värderingsfel
import numpy as np
df['balcony_class'] = None
df.loc[df['class'] == 0,
'balcony_class'] = 'Ingen balkong'
df.loc[(df['class'] == 1) &
(df['kungsbalkong'] == 0) &
(df['terrass'] == 0),
'balcony_class'] = 'Traditionell balkong'
df.loc[(df['class'] == 1) &
(df['kungsbalkong'] == 1),
'balcony_class'] = 'Kungsbalkong'
df.loc[(df['class'] == 1) &
(df['terrass'] == 1),
'balcony_class'] = 'Terrass'
classified = df[df['balcony_class'] != None]
display(classified.groupby('balcony_class').agg(
Antal=('error', len),
Medianfel_SEK=('error', np.median),
Medelfel_SEK=('error', np.mean),
Medianfel_procent=('error_percent', np.median),
Medelfel_procent=('error_percent', np.mean)
))
display(df.groupby('south_facing').agg(
Antal=('error', len),
Medianfel_SEK=('error', np.median),
Medelfel_SEK=('error', np.mean),
Medianfel_procent=('error_percent', np.median),
Medelfel_procent=('error_percent', np.mean)
))
Värderingarna som analysen bygger på är gjorda utan att ta hänsyn till information om balkong. Vi har delat upp analysen i 4 klasser relaterat till balkong, och sedan gjort en kontroll av söderläge vs. icke söderläge.
Resultat
Vi kan se att vi övervärderar lägenheter som saknar balkong med ca 45 000 SEK i median. Lägenheter som har en traditionell balkong är däremot undervärderade med ca 20 000 SEK i median. Skillnaden i värderingsfelet mellan lägenheter med och utan balkong är ca 60 000 SEK. Sett till medelfelet är skillnaden större, ca 90 000 SEK. Utrycker man istället felet i procentenheter är skillnaden ca 1,9 % både i median och medel.
Vi kan också se att lyxigare möjlighet till utevistelse än en traditionell balkong är ännu mer undervärderade i vår värderingsmotor. För lägenheter med terrass undervärderar vi med 125 000 SEK i medel och lägenheter med kungsbalkong 300 000 SEK. Uttryckt i procentenheter blir undervärderingen ca 1% för terrass och ca 5 % för kungsbalkong, både sett till median och medel.
Lägenheter utan söderläge är i princip helt korrekt värderade, med ett medelfel nära 0 SEK. Lägenheter med söderläge är undervärderade med ca 30 000 SEK i median och 40 000 SEK i medel. Sett till procentuell avvikelse mellan de två grupperna är skillnaden ca 1 % både i median och medel.
Vi tar en till titt på hur felstatistiken ser ut för lägenheter med balkong i söderläge.
display(df[(df['south_facing'] == True) & (
df['balcony_class'] == 'Traditionell balkong'
)].groupby('balcony_class').agg(
Antal=('error', len),
Medianfel_SEK=('error', np.median),
Medelfel_SEK=('error', np.mean),
Medianfel_procent=('error_percent', np.median),
Medelfel_procent=('error_percent', np.mean)
))
Vi kan se att skillnaden mot lägenheter utan balkong är ca 72 000 SEK i median och 96 000 SEK i medel. I procentenheter är skillnaden 2,1-2,2 % både i medel och median.
Kommentar
Det finns en del osäkerheter i den här analysen, klassificeraren som avgör om en lägenhet har möjlighet till utevistelse är bra men inte perfekt, och nyckelordssökning har uppenbara svagheter. Det som talar för att vi ändå kan lita på resultaten är att balkongklassificeraren är tillräckligt träffsäker och att volymerna i underlaget är stora. Nyckelordssökningen är bristfällig i det att den har en stor mängd false negatives, men rimligtvis borde andelen false positives vara liten givet de restriktiva sökningarna och därmed blir resultaten ovan ändå pålitliga.
Gruppen bostäder som har kungsbalkong är ganska liten, bara 112 stycken. Kungsbalkong kommer också per definition vara korrelerat med att lägenheten ligger på översta våningen och har utsikt i flera väderstreck, vilken gör att det finns fler faktorer än bara balkongen som kan göra att vår värdering slår fel. Det gör att resultaten för kungsbalkong kan ifrågasättas. Hade vi haft en kontrollgrupp att jämföra mot som bestod av lyxiga bostäder på översta våningen som saknar kungsbalkong hade resultaten blivit mer pålitliga, men det har vi tyvärr inte.
Det man kan ta med sig från den här analysen och säga med någorlunda säkerhet är att en värdering som görs utan hänsyn till balkong övervärderar de lägenheter som saknar balkong och undervärderar lägenheter som har balkong. Det kan tolkas som att det finns ett värde kopplat till balkongen. Median och medelfelen i värderingarna ligger ganska långt ifrån varandra, medan de procentuella felen ligger nära varandra. Det kan tolkas som att värdet på en balkong sätts relativt priset på bostaden, och inte kronor och ören.
Slutsats
En lägenhet med balkong kommer ofta säljas för 60 – 90 000 SEK mer än en lägenhet utan balkong. Om balkongen också är i söderläge ligger spannet mellan 70 och 100 000 SEK. Uttryckt i procentenheter är värdet av en balkong ca 1,9 % av slutpriset. Ligger balkongen också i söderläge är skillnaden istället ca 2,1 %.