from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2023-05-03 / Aki Taanila
Ajoneuvojen avoin data sisältää kaikkien liikennekäytössä olevien ajoneuvojen rekisteröinti-, hyväksyntä- ja teknisiä tietoja Traficomin ylläpitämästä liikenneasioiden rekisteristä. Datan laajuus on yli 5 miljoonaa riviä. Dataa päivitetään säännöllisesti. Data löytyy osoitteesta:
https://tieto.traficom.fi/fi/tietotraficom/avoin-data?toggle=Ajoneuvojen%20avoin%20data
Samasta osoitteesta löytyy myös aineistokuvaus, muuttujaluettelo Excel-muodossa ja käytetty merkistökoodaus (ISO8859-1).
Data on ladattavissa zip-pakettina. Seuraavassa oletetaan, että Ajoneuvorekisteri.zip on tallennettu samaan kansioon tämän muistion kanssa.
Poimin esimerkkinä datasta tiedot vuoden 2019 alusta eteenpäin rekisteröidyistä henkilöautoista. Mukaan otan vain osan muuttujista. Tallennan datan myöhempää käyttöä varten.
Lopuksi tutkin suosituimpia merkkejä ja värejä.
Koodin suoritus kestää jonkin aikaa, koska ison datan lataaminen netistä on hidasta.
# Jos et ole ladannut Ajoneuvorekisteri.zip -tiedostoa omalle koneellesi
# niin voit tehdä sen seuraavalla koodilla:
import requests
url = "https://opendata.traficom.fi/Content/Ajoneuvorekisteri.zip"
r = requests.get(url)
with open("Ajoneuvorekisteri.zip",'wb') as file:
file.write(r.content)
import pandas as pd
# Mukaan otettavat muuttujat
cols = ['ajoneuvoluokka', 'ensirekisterointipvm', 'vari', 'korityyppi', 'omamassa',
'ajonKokPituus', 'ajonLeveys', 'ajonKorkeus', 'kayttovoima', 'suurinNettoteho',
'sahkohybridi', 'sahkohybridinluokka', 'merkkiSelvakielinen','mallimerkinta',
'vaihteisto', 'kaupallinenNimi', 'kunta', 'matkamittarilukema']
# Datan avaus (pandas osaa purkaa zip-paketin)
df = pd.read_csv('Ajoneuvorekisteri.zip', sep=';', encoding='ISO8859-1', usecols=cols)
C:\Users\taaak\AppData\Local\Temp\ipykernel_744\390937211.py:8: DtypeWarning: Columns (18,27) have mixed types. Specify dtype option on import or set low_memory=False. df = pd.read_csv('Ajoneuvorekisteri.zip', sep=';', encoding='ISO8859-1', usecols=cols)
# Tietoa muuttujista
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5163486 entries, 0 to 5163485 Data columns (total 18 columns): # Column Dtype --- ------ ----- 0 ajoneuvoluokka object 1 ensirekisterointipvm object 2 vari object 3 korityyppi object 4 omamassa float64 5 ajonKokPituus float64 6 ajonLeveys float64 7 ajonKorkeus float64 8 kayttovoima object 9 suurinNettoteho float64 10 sahkohybridi object 11 sahkohybridinluokka float64 12 merkkiSelvakielinen object 13 mallimerkinta object 14 vaihteisto object 15 kaupallinenNimi object 16 kunta float64 17 matkamittarilukema float64 dtypes: float64(8), object(10) memory usage: 709.1+ MB
# Poimitaan datasta vain henkilöautot (ajoneuvoluokat M1 ja M1G)
df = df[df['ajoneuvoluokka'].isin(['M1', 'M1G'])]
# Varmistetaan, että päivämäärät tunnistuvat päivämääriksi
df['ensirekisterointipvm'] = pd.to_datetime(df['ensirekisterointipvm'], format='%Y-%m-%d')
# Rajoitutaan vuoden 2019 alusta lähtien rekisteröityihin
df = df[df['ensirekisterointipvm']>'2019-01-01'].sort_values('ensirekisterointipvm')
# Tallennus csv-muotoon
df.to_csv('autot.csv', index=False)
# Näytetään tulosteissa kaikki sarakkeet
pd.set_option.display_columns = None
df
ajoneuvoluokka | ensirekisterointipvm | vari | korityyppi | omamassa | ajonKokPituus | ajonLeveys | ajonKorkeus | kayttovoima | suurinNettoteho | sahkohybridi | sahkohybridinluokka | merkkiSelvakielinen | mallimerkinta | vaihteisto | kaupallinenNimi | kunta | matkamittarilukema | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4363237 | M1 | 2019-01-02 | 1 | AC | 1647.0 | 4874.0 | 1820.0 | 1536.0 | 38.0 | 110.0 | False | NaN | Volkswagen | PASSAT Farmari (AC) 4ov 1390cm3 A | 2 | PASSAT | 405.0 | 179375.0 |
4297425 | M1 | 2019-01-02 | 0 | AA | 2031.0 | 4963.0 | 1890.0 | 1437.0 | 1.0 | 233.0 | True | 1.0 | Volvo | S90 T8 Twin Engine Sedan (AA) 4ov 1969cm3 A | 2 | S90 T8 Twin Engine | 297.0 | 72330.0 |
4317685 | M1 | 2019-01-02 | 0 | AB | 1190.0 | 4158.0 | 1756.0 | 1498.0 | 1.0 | 73.5 | False | NaN | Ford | Fiesta Viistoperä (AB) 4ov 998cm3 | 1 | Fiesta | 753.0 | 51033.0 |
4023431 | M1 | 2019-01-02 | 6 | AC | 1669.0 | 4525.0 | 1805.0 | 1605.0 | 2.0 | 104.0 | False | NaN | Kia | CARENS Farmari (AC) 5ov 1685cm3 A | 2 | CARENS | 91.0 | 76026.0 |
4351770 | M1 | 2019-01-02 | 6 | AC | 1408.0 | 4788.0 | 1844.0 | 1545.0 | 1.0 | 110.6 | False | NaN | Ford | Focus Farmari (AC) 4ov 1496cm3 | 1 | Focus | 91.0 | 34696.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
5162089 | M1 | 2022-12-31 | 9 | AF | 2072.0 | 4750.0 | 1921.0 | 1624.0 | 4.0 | NaN | False | NaN | Tesla | Model Y Monikäyttöajoneuvo (AF) 5ov | 8 | Model Y | 49.0 | NaN |
5158637 | M1 | 2022-12-31 | 0 | AA | 1919.0 | 4694.0 | 1850.0 | 1443.0 | 04 | NaN | False | NaN | Tesla | Model 3 Sedan (AA) 4ov | 8 | Model 3 | 837.0 | NaN |
5160973 | M1 | 2022-12-31 | 8 | AF | 2539.0 | 5057.0 | 1999.0 | 1680.0 | 4.0 | NaN | False | NaN | Tesla | Model X Monikäyttöajoneuvo (AF) 5ov | 8 | Model X | 49.0 | NaN |
5155994 | M1 | 2022-12-31 | 2 | AC | 2118.0 | 4599.0 | 1852.0 | 1616.0 | 04 | NaN | False | NaN | Volkswagen, VW | ID.5 PRO 150 KW Farmari (AC) 5ov A | 2 | ID.5 PRO 150 KW | 92.0 | NaN |
5160968 | M1 | 2022-12-31 | 6 | AF | 2539.0 | 5057.0 | 1999.0 | 1680.0 | 4.0 | NaN | False | NaN | Tesla | Model X Monikäyttöajoneuvo (AF) 5ov | 8 | Model X | 49.0 | NaN |
530249 rows × 18 columns
# Värit selviävät aineistokuvauksesta
varit = ['Musta', 'Ruskea (beige)', 'Punainen', 'Oranssi','Keltainen', 'Vihreä', 'Sininen',
'Violetti', 'Harmaa', 'Valkoinen', 'Monivär.', 'Hopea', 'Turkoosi']
# Kuinka suosittuja ovat eri värit olleet?
df1 = pd.crosstab(df['vari'], 'f')
df1.columns.name = ''
# Sijoitan värien nimet indeksiin, jossa alunperin on värien koodit
df1.index = varit
# Värit suosituimmuusjärjestyksessä
df1.sort_values('f', ascending = False)
f | |
---|---|
Valkoinen | 140345 |
Harmaa | 108845 |
Musta | 103928 |
Sininen | 58818 |
Punainen | 48871 |
Hopea | 30091 |
Ruskea (beige) | 19918 |
Vihreä | 6241 |
Oranssi | 4875 |
Keltainen | 3846 |
Violetti | 952 |
Monivär. | 528 |
Turkoosi | 428 |
# 20 suosituinta merkkiä
df2 = pd.crosstab(df['merkkiSelvakielinen'], 'f').nlargest(20, 'f' )
df2.columns.name = ''
df2
f | |
---|---|
merkkiSelvakielinen | |
Toyota | 66568 |
Volvo | 56346 |
Mercedes-Benz | 52108 |
Volkswagen, VW | 49881 |
Skoda | 40506 |
BMW | 36423 |
Kia | 30981 |
Ford | 25755 |
Audi | 23338 |
Nissan | 16448 |
Opel | 14451 |
Hyundai | 14250 |
Mitsubishi | 12183 |
Peugeot | 10359 |
Tesla | 9687 |
Renault | 9075 |
Citroen | 7033 |
Seat | 6810 |
Mazda | 4822 |
Suzuki | 4517 |
Edellä huomataan, että Volkswagen esiintyy kahdella eri nimellä (Volkswagen ja Volkswagen, VW). Seuraavassa yhdistän molemmat saman nimen alle.
df['merkkiSelvakielinen'] = df['merkkiSelvakielinen'].replace({'Volkswagen, VW':'Volkswagen'})
df3 = pd.crosstab(df['merkkiSelvakielinen'], 'f').nlargest(20, 'f' )
df3.columns.name = ''
df3
f | |
---|---|
merkkiSelvakielinen | |
Toyota | 66568 |
Volvo | 56346 |
Volkswagen | 54300 |
Mercedes-Benz | 52108 |
Skoda | 40506 |
BMW | 36423 |
Kia | 30981 |
Ford | 25755 |
Audi | 23338 |
Nissan | 16448 |
Opel | 14451 |
Hyundai | 14250 |
Mitsubishi | 12183 |
Peugeot | 10359 |
Tesla | 9687 |
Renault | 9075 |
Citroen | 7033 |
Seat | 6810 |
Mazda | 4822 |
Suzuki | 4517 |
# Rajoitutaan vai suosituimpiin merkkeihin
df_suositut = df[df['merkkiSelvakielinen'].isin(df2.index)]
# Värit suosituilla merkeillä
df4 = pd.crosstab(df_suositut['merkkiSelvakielinen'], df_suositut['vari'])
# Sijoitan värien nimet sarakkeisiin
df4.columns = varit
# Värjätään kunkin merkin kohdalla suosituin väri
df4.style.highlight_max(color='lightgreen', axis=1)
Musta | Ruskea (beige) | Punainen | Oranssi | Keltainen | Vihreä | Sininen | Violetti | Harmaa | Valkoinen | Monivär. | Hopea | Turkoosi | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
merkkiSelvakielinen | |||||||||||||
Audi | 6691 | 469 | 1150 | 47 | 119 | 394 | 2222 | 11 | 4672 | 6218 | 3 | 1189 | 13 |
BMW | 12965 | 845 | 708 | 254 | 51 | 204 | 3978 | 10 | 6849 | 9157 | 5 | 1112 | 22 |
Citroen | 836 | 264 | 814 | 8 | 3 | 320 | 761 | 3 | 1431 | 2553 | 0 | 28 | 3 |
Ford | 3498 | 188 | 4477 | 90 | 96 | 88 | 4998 | 8 | 5694 | 6331 | 5 | 192 | 3 |
Hyundai | 1454 | 1001 | 1992 | 126 | 67 | 222 | 1619 | 1 | 2931 | 3906 | 0 | 730 | 170 |
Kia | 3959 | 793 | 4470 | 261 | 399 | 1018 | 4932 | 3 | 4662 | 6829 | 0 | 3632 | 2 |
Mazda | 512 | 23 | 1831 | 0 | 1 | 2 | 337 | 1 | 1148 | 807 | 0 | 148 | 0 |
Mercedes-Benz | 17821 | 909 | 2042 | 8 | 481 | 338 | 3188 | 47 | 13123 | 11260 | 10 | 2325 | 4 |
Mitsubishi | 2885 | 869 | 1646 | 21 | 13 | 11 | 598 | 6 | 2551 | 3283 | 1 | 220 | 2 |
Nissan | 2092 | 1168 | 2334 | 59 | 2 | 42 | 1610 | 516 | 2803 | 4078 | 446 | 1272 | 1 |
Opel | 1966 | 186 | 1956 | 160 | 8 | 231 | 1543 | 0 | 2981 | 4510 | 0 | 888 | 1 |
Peugeot | 1314 | 145 | 1105 | 1061 | 638 | 93 | 1101 | 4 | 2087 | 2772 | 0 | 21 | 0 |
Renault | 634 | 180 | 1615 | 827 | 9 | 67 | 1287 | 42 | 1714 | 2658 | 0 | 30 | 1 |
Seat | 900 | 63 | 970 | 250 | 5 | 311 | 540 | 45 | 1471 | 1876 | 0 | 375 | 0 |
Skoda | 6637 | 1685 | 2723 | 100 | 33 | 763 | 7859 | 3 | 10374 | 9979 | 0 | 276 | 3 |
Suzuki | 427 | 120 | 531 | 53 | 399 | 74 | 564 | 2 | 992 | 798 | 0 | 541 | 7 |
Tesla | 1840 | 7 | 674 | 0 | 2 | 6 | 935 | 3 | 1396 | 4745 | 1 | 22 | 0 |
Toyota | 7098 | 6392 | 7938 | 193 | 709 | 416 | 5613 | 103 | 9563 | 18168 | 2 | 10165 | 4 |
Volvo | 17117 | 2587 | 3015 | 33 | 14 | 394 | 5226 | 16 | 11993 | 14050 | 3 | 1505 | 4 |
# Rajoitutaan vai suosituimpiin merkkeihin
df_suositut = df[df['merkkiSelvakielinen'].isin(df2.index)]
# Värit suosituilla merkeillä
df4 = pd.crosstab(df_suositut['merkkiSelvakielinen'], df_suositut['vari'])
# Sijoitan värien nimet sarakkeisiin
df4.columns = varit
# Värjätään kunkin merkin kohdalla suosituin väri
df4.style.highlight_max(color='lightgreen', axis=1)
Musta | Ruskea (beige) | Punainen | Oranssi | Keltainen | Vihreä | Sininen | Violetti | Harmaa | Valkoinen | Monivär. | Hopea | Turkoosi | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
merkkiSelvakielinen | |||||||||||||
Audi | 6691 | 469 | 1150 | 47 | 119 | 394 | 2222 | 11 | 4672 | 6218 | 3 | 1189 | 13 |
BMW | 12965 | 845 | 708 | 254 | 51 | 204 | 3978 | 10 | 6849 | 9157 | 5 | 1112 | 22 |
Citroen | 836 | 264 | 814 | 8 | 3 | 320 | 761 | 3 | 1431 | 2553 | 0 | 28 | 3 |
Ford | 3498 | 188 | 4477 | 90 | 96 | 88 | 4998 | 8 | 5694 | 6331 | 5 | 192 | 3 |
Hyundai | 1454 | 1001 | 1992 | 126 | 67 | 222 | 1619 | 1 | 2931 | 3906 | 0 | 730 | 170 |
Kia | 3959 | 793 | 4470 | 261 | 399 | 1018 | 4932 | 3 | 4662 | 6829 | 0 | 3632 | 2 |
Mazda | 512 | 23 | 1831 | 0 | 1 | 2 | 337 | 1 | 1148 | 807 | 0 | 148 | 0 |
Mercedes-Benz | 17821 | 909 | 2042 | 8 | 481 | 338 | 3188 | 47 | 13123 | 11260 | 10 | 2325 | 4 |
Mitsubishi | 2885 | 869 | 1646 | 21 | 13 | 11 | 598 | 6 | 2551 | 3283 | 1 | 220 | 2 |
Nissan | 2092 | 1168 | 2334 | 59 | 2 | 42 | 1610 | 516 | 2803 | 4078 | 446 | 1272 | 1 |
Opel | 1966 | 186 | 1956 | 160 | 8 | 231 | 1543 | 0 | 2981 | 4510 | 0 | 888 | 1 |
Peugeot | 1314 | 145 | 1105 | 1061 | 638 | 93 | 1101 | 4 | 2087 | 2772 | 0 | 21 | 0 |
Renault | 634 | 180 | 1615 | 827 | 9 | 67 | 1287 | 42 | 1714 | 2658 | 0 | 30 | 1 |
Seat | 900 | 63 | 970 | 250 | 5 | 311 | 540 | 45 | 1471 | 1876 | 0 | 375 | 0 |
Skoda | 6637 | 1685 | 2723 | 100 | 33 | 763 | 7859 | 3 | 10374 | 9979 | 0 | 276 | 3 |
Suzuki | 427 | 120 | 531 | 53 | 399 | 74 | 564 | 2 | 992 | 798 | 0 | 541 | 7 |
Tesla | 1840 | 7 | 674 | 0 | 2 | 6 | 935 | 3 | 1396 | 4745 | 1 | 22 | 0 |
Toyota | 7098 | 6392 | 7938 | 193 | 709 | 416 | 5613 | 103 | 9563 | 18168 | 2 | 10165 | 4 |
Volvo | 17117 | 2587 | 3015 | 33 | 14 | 394 | 5226 | 16 | 11993 | 14050 | 3 | 1505 | 4 |
Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/