Alla artiklar
Så funkar det

Så prissätter vi 10 000 begagnade bilar med maskininlärning

Bakom kulisserna: regression, deal-scoring och varför vissa bilar är omöjliga att prissätta.

·9 min läsning

Varje begagnad bil har ett marknadspris. Inte det pris som säljaren sätter — utan det pris som marknaden faktiskt betalar för en bil med just den kombinationen av ålder, miltal, drivlina och utrustning. Problemet är att det priset aldrig syns i annonsen. Det vi ser är säljarens förhoppning, inte marknadens dom.

Hela Notan beräknar det priset. Vi samlar in tusentals begagnatannonser från Blocket.se, matar dem genom en regressionsmodell med 18 variabler, och räknar ut vad varje bil ”borde” kosta — givet allt vi vet om den. Bilar som ligger långt under det beräknade priset flaggar vi som fynd. Bilar som ligger över? De kanske inte är överprissatta, men du bör veta att du betalar mer än genomsnittet.

Det här är berättelsen om hur det fungerar. Inga marknadsföringsfloskler. Bara data, matematik och de begränsningar vi lever med.

10 000 annonser in, struktur ut

Allt börjar med data. Vår scraper genomsöker Blocket.se efter annonser för de 15 bilmodeller vi bevakar — från Volvo XC60 till VW Golf R — och sparar ned varje annons i en rådatabas. Pris, årsmodell, miltal, drivlina, hästkrafter, säljartyp och hela annonstexten.

Just nu har vi drygt 10 000 aktiva annonser i systemet. Men rådata från Blocket är stökig. Årsmodeller kan vara felaktiga, miltal saknas ibland, och annonstexterna varierar från mekaniskt exakta specifikationer till ”fin bil, inga problem”. Så nästa steg är filtrering och anrikning.

Vi exkluderar annonser under 20 000 kr (oftast skrotbilar eller felregistreringar) och årsmodeller före 2005 (för få datapunkter för att modellen ska ge meningsfulla resultat). Det som blir kvar går vidare till anrikningssteget.

Datapipelinen i siffror

Modeller
15
Totalt antal annonser
~10 000+
Basvariabler
15
AI-anrikade variabler
3
Interaktionstermer
2
Uppdateringsfrekvens
Dagligen

AI:n som läser annonser

Det här är steget som gör störst skillnad, och det är det svåraste att förklara utan att det låter som magi. Problemet: två identiska RAV4 Hybrid 2021 med samma miltal kan skilja 40 000 kr i pris. Varför? För att den ena har panoramaglastak, head-up display och läderklädsel — och den andra har basutförande.

Blocket har inga strukturerade fält för utrustning. Allt ligger inbakat i fritext. Så vi använder en AI-modell (ett stort språkmodell, ja) för att läsa varje annonstext och extrahera utrustningsdetaljer: panoramatak, ventilerade säten, head-up display, adaptiv farthållare, och ett tjugotal andra features som påverkar andrahandsvärdet.

AI:n identifierar också vilken generation bilen tillhör. Det är avgörande. En Volvo XC60 från 2017 (generation 1) och en från 2018 (generation 2) är i princip helt olika bilar, trots att bara ett år skiljer dem åt. Generationsbyten skapar de skarpaste prisklyftorna i vår data, och ren ålder kan inte fånga dem. Med generationsdummyvariabler i modellen kan vi.

Vi extraherar också en premiumutrustnings-poäng — ett sammanvägt mått på hur väl utrustad bilen är jämfört med genomsnittet för sin modell. Den variabeln förklarar en överraskande stor del av prisvariationen, särskilt för premiumbilar som XC60 och GLC där utrustningsspridningen är enorm.

Modellen: multivariat regression med 18 variabler

Vi kör en separat regressionsmodell per bilmodell. Det kan låta överambitiöst, men det finns goda skäl: en RAV4 och en Golf R beter sig helt olika på begagnatmarknaden. Att tvinga in dem i samma modell skulle ge en urvattnad prediktion som inte är träffsäker för någondera.

Varje modell tränas på alla tillgängliga annonser — vanligtvis mellan 300 och 2 000 stycken, beroende på modell. De 15 basvariablerna inkluderar ålder, miltal, hästkrafter, drivlina (bensin, diesel, hybrid, PHEV, elbil), säljartyp (handlare vs privat), och fyrhjulsdrift. Utöver det lägger vi till de tre AI-anrikade variablerna: generation, premiumutrustning och specifik motorvariant.

Men det räcker inte med att bara slänga in variablerna rakt av. Vi har två viktiga val som gör stor skillnad.

Logaritmisk prissättning

Vi logaritmerar priset innan vi kör regressionen. Det låter tekniskt, men konsekvensen är enkel: modellen tänker i procent, inte kronor. En bil som ”borde” kosta 500 000 kr och säljs för 425 000 kr har samma avvikelse (15 %) som en bil som borde kosta 150 000 kr och säljs för 127 500 kr.

Det är intuitivt rätt. 75 000 kr rabatt på en halvmiljonbil är ett bra pris. 75 000 kr rabatt på en bil som borde kosta 150 000 kr är närmast suspekt. Log-transformen fångar detta automatiskt: ”fynd” definieras relativt bilens prisklass, inte i absoluta kronor.

Interaktionstermer

En dieselbil tappar värde annorlunda än en elbil. Inte bara i nivå (dieslar kostar generellt mindre) utan i takt: elbilen tappar kanske 12 % per år, medan dieseln tappar 8 % men från ett lägre utgångspris. Om vi bara har en ålderskoefficient missar vi den skillnaden.

Lösningen är interaktionstermer: vi låter drivlina interagera med ålder och miltal. Konkret betyder det att modellen lär sig separata värdeminskningskurvor för varje drivlina, inte en genomsnittlig kurva. Det gör att prediktionerna följer verkligheten mycket bättre — och att deal-scoring blir rättvisare. En dieselbil jämförs med andra dieselbilar, inte med hela beståndet.

Exempel: RAV4 Hybrid 2021, 4 500 mil

Beräknat marknadspris
~345 000 kr
Konfidensintervall
±28 000 kr
R² (modellprecision)
96,4 %

Varför vissa bilar är förutsägbara — och andra inte

R² — förklaringsgraden — mäter hur stor andel av prisvariationen som vår modell fångar. Och skillnaderna mellan modellerna är dramatiska.

Toyota RAV4 toppar med R² = 96,4 %. Det innebär att om du berättar ålder, miltal, drivlina och utrustning för oss kan vi förutsäga priset med hög precision. RAV4-marknaden är rationell: köparna vet vad de vill ha, priserna är konsekventa, och det finns tillräckligt med annonser för att modellen ska hitta mönstren.

I andra änden sitter Tesla Model Y med R² = 68 %. Vår modell missar alltså en tredjedel av prisvariationen. Varför? Inte för att vår modell är dålig — utan för att Model Y är en ovanligt homogen bil. Nästan alla har samma utrustning, samma drivlina (elbil), liknande miltal. Det finns helt enkelt väldigt lite variation i egenskaperna som kan förklara prisskillnaderna. Och när egenskaperna inte varierar har regressionen inget att arbeta med.

De bilar där vi har starkast modeller — RAV4, XC60, X3, Golf — har gemensamt att de sålts länge, finns i flera generationer, har olika drivlinor och stor utrustningsspridning. Heterogenitet i data ger modellen något att bita i.

R² per modell (urval)

Toyota RAV4
96,4 %
Volvo XC60
~94 %
BMW X3
~92 %
VW Golf
~90 %
Kia Niro
~85 %
Tesla Model Y
68 %

Att hitta fynd: residualanalys i praktiken

Nu kommer vi till det som de flesta besökare faktiskt bryr sig om: vilka bilar är underprissatta?

Metoden är enkel i teorin. För varje annons beräknar modellen ett förväntat pris baserat på bilens egenskaper. Skillnaden mellan det faktiska priset och det förväntade kallas residualen. En negativ residual betyder att bilen säljs under vad modellen förväntar sig. Men hur stor måste avvikelsen vara för att det ska vara statistiskt meningsfullt och inte bara brus?

Vi använder residualens standardavvikelse (SE) som måttstock. Varje modell har sin egen SE — ett mått på hur mycket priser normalt sprider sig runt prediktionen. En bil som ligger mer än 0,75 standardavvikelser under det förväntade priset flaggas som ”Bra pris”. Mer än 1,5 standardavvikelser under? ”Fyndpris”.

Det ger stabila proportioner: ungefär 23 % av alla annonser klassas som ”Bra pris” och cirka 7 % som ”Fyndpris”. Siffrorna följer naturligt av normalfördelningen — vi har inte valt dem godtyckligt utan de faller ut ur statistiken.

Och tack vare log-transformen är trösklarna procentuella. En bil som kostar 50 000 kr och flaggas som fyndpris har sammarelativa rabatt som en bil som kostar 500 000 kr med samma flagga. Det gör systemet rättvist oavsett prisklass.

Deal-scoring

Bra pris (tröskel)
>0,75 SE under
Andel ”Bra pris”
~23 %
Fyndpris (tröskel)
>1,5 SE under
Andel ”Fyndpris”
~7 %
Skalning
Procentuell (log)
Uppdatering
Vid ny data

Vad modellen inte kan fånga

Vi tror på transparens, så här är de saker som vår modell missar eller hanterar dåligt. De är viktiga att förstå om du använder Hela Notan för att fatta köpbeslut.

Skick och historik. Vi har ingen information om lackskavanker, rostskador, servicehistorik eller olyckor. En bil kan vara ett ”fyndpris” i vår modell men ha dold problematik som motiverar det låga priset. Vår scoring ersätter aldrig en besiktning.

Geografiska skillnader. Vi behandlar hela Sverige som en marknad. I verkligheten kostar bilar mer i Stockholm och Göteborg. En annons från Norrlands inland kan flaggas som fynd helt enkelt för att den lokala marknaden har lägre priser generellt — inte för att säljaren gjort en miss.

Tidpunkt. Bilpriserna rör sig. Vår modell speglar marknaden just nu, men en bil som ser rätt prissatt ut idag kan vara ett fynd (eller överpris) om en månad. Vi uppdaterar dagligen, men fångar inte intraday-rörelser eller säsongsvariationer fullt ut.

Säljarens motivation. En privat säljare som behöver pengar snabbt sätter ett annat pris än en handlare med lagerränta att hantera. Vi vet att det är handlare eller privat — och det ingår i modellen — men vi kan inte fånga den individuella säljarens brådska eller förhandlingsvilja.

Modeller med lite data. De modeller vi nyligen lagt till (som Land Rover Defender) har färre annonser, vilket ger bredare konfidensintervall och mindre pålitlig deal-scoring. Vi visar modellens R² och antal annonser öppet så att du kan bedöma tillförlitligheten själv.

Teknikstacken i korthet

För den nyfikne: pipelinen är uppdelad i tre separata kodrepon. Scraping samlar annonser från Blocket till en Postgres-databas. Enrichment kör AI-anrikning (generationsdetektering, utrustningsextraktion, motorklassificering). Statistics tränar regressionsmodeller och exporterar prediktioner och deal-scores till en web-cache som den här webbplatsen läser.

Frontenden är byggd med Next.js, React och TypeScript. Diagrammen renderas med Recharts. Allt hostas på Vercel med automatisk deploy vid varje push. Databasen är Neon Postgres — en serverless Postgres-tjänst som ger oss snabb åtkomst utan att behöva administrera egna servrar.

Regressionsmodellerna körs i Python med scikit-learn. Vi valde medvetet linjär regression framför mer komplexa metoder som gradient boosting eller neurala nätverk. Anledningen? Tolkbarhet. Vi vill kunna förklara exakt varför en bil prissätts som den gör. Med en linjär modell kan vi peka på koefficienterna: ”den här bilen kostar X % mer för att den är en hybrid, och Y % mindre för varje extra 1 000 mil”. Det är värde som ingen svart-låda-modell kan erbjuda.

Hur du använder Hela Notan

Hela poängen med allt det här arbetet är att ge dig, bilköparen, ett informationsövertag. Så här gör du:

  1. Välj din modell i modellväljaren på startsidan. Du kan jämföra flera modeller samtidigt.
  2. Studera kurvorna. Värdeminskningsdiagrammet visar hur priset faller med ålder. Filtrera på drivlina för att se skillnaden mellan hybrid och diesel. Punkterna som lyser grönt är bilar vi flaggat som fynd.
  3. Bläddra i datatabellen. Klicka på ”Fynd”-kolumnen för att sortera efter störst rabatt relativt marknadspriset. Filtrera med pillknapparna ovan: ”Alla fynd” visar samtliga bra-pris- och fyndpris-bilar.
  4. Kolla TCO-kalkylatorn. Under /tco kan du se vad det faktiskt kostar att äga bilen — inklusive värdeminskning, försäkring, skatt och drivmedel. Miltalet auto-ifylls baserat på medianmiltalet för just den modellen och årsmodellen du väljer.
  5. Var kritisk. Kolla R² och antal annonser för din modell. Ju högre precision och fler datapunkter, desto mer kan du lita på prediktionerna. Och glöm inte: vår scoring fångar inte skick, servicehistorik eller lokala marknadsskillnader.

Vi bygger inte Hela Notan för att ersätta din bedömning. Vi bygger det för att ge dig siffror att grunda den på.

Ingen modell är perfekt. Men en modell som förklarar 90–96 % av prisvariationen ger dig ett informationsövertag som de flesta bilköpare aldrig har haft. Hela Notan gör den informationen tillgänglig, gratis, för alla.