Julkisista rahoista ja kunnallistaloudesta#

Elämme yhteiskunnassa, jonka pyörittämiseksi itse kukin maksaa veroja ja jonka osasina valtio ja kunnat sijoittavat varallisuuttaan erilaisiin kohteisiin. Mutta millaisista rahoista näissä tilanteissa oikeastaan puhutaan?

Alla on vinkkejä muutamille suomalaisille sivustoille jotka avaavat aihetta sekä esimerkkivilkaisu tarjolla olevaan aineistoon. Valtiovarainministeriön puollon avoimuudelle voi löytää täältä: https://vm.fi/avoin-tieto.


Avoindata.fi#

http://www.avoindata.fi/ on valtiollisen DVV:n eli Digi- ja väestötietoviraston ylläpitämä portaali, jonne niin kunnat kuin erilaiset organisaatiotkin julkaisevat omia aineistojaan kansalaisten käytettäväksi. Kohta käsittelemämme Janakkalan ostolaskutiedot on ladattu täältä.

Tutkihallintoa.fi#

https://www.tutkihallintoa.fi tarjoaa kattavan katsauksen Suomen valtion varainkäyttöön. Erityisesti sen tarjoamat visualisaatiot valtion vuosittaisesta tilinpäätöksestä ovat hyvä yleiskuva erilaisen poliittisen keskustelun seuraamiseen https://www.tutkihallintoa.fi/valtio/taloustiedot/valtion-tilinpaatos/.

Tutkihankintoja.fi#

https://tutkihankintoja.fi/ on valtiollisen julkishankintayksikön Hanselin ylläpitämä sivusto, joka hyödyntää muun muassa Avoindata.fi -portaalista saatavaa informaatiota tiivistääkseen erilaisten suurten yhteishankkeiden tilanteen niin päätöksenteon helpottamiseksi kuin kansalaisyhteiskunnan vastuullisuuden edistämiseksikin.


Tehdääs itsekin!

1. Työkalut#

# Aja tämä solu ensin.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

2. Aineisto - Janakkalan kunta#

# Käytetty aineisto on haettu täältä
# https://www.avoindata.fi/data/fi/dataset/janakkalan-kunnan-ostolaskudata-2022

# Tiedosto oli merkistöltään hassu ja eroteltu puolipisteellä, joten korjataan asia parilla parametrilla.
data = pd.read_csv("https://github.com/opendata-education/Tyopajat/raw/refs/heads/main/materiaali/data/Janakkala_ostolaskut_2022.csv", sep = ";", encoding = "iso8859_10", decimal = ",")
data
Tositenumero Kirjauspäivämäärä Kirjanpidon tili Tilin nimi Kustannuspaikka Kustannuspaikan nimi Toimittajanumero Toimittajan nimi Y-tunnus Summa kirjanpidon valuuttana
0 OL000030291 1.1.2022 434101 Toimisto- ja asiantuntijapalvelut 1201220006 Muut myyntivoitot T1011621 Janakkalan Asunnot Oy 0682797-3 471.10
1 OL000030306 1.1.2022 437001 Vakuutukset 1204510001 Kirjastotoimi T1001973 KESKINÄINEN VAKUUTUSYHTIÖ FENNIA 0196826-7 1112.56
2 OL000030314 1.1.2022 437001 Vakuutukset 1208770001 Hallinto T1001973 KESKINÄINEN VAKUUTUSYHTIÖ FENNIA 0196826-7 3452.88
3 OL000030508 1.1.2022 437001 Vakuutukset 1205600201 Kiinteistöjen ylläpito T1001973 KESKINÄINEN VAKUUTUSYHTIÖ FENNIA 0196826-7 994.32
4 OL000030517 2.1.2022 437001 Vakuutukset 1201220019 Yleishallinnon muu toiminta T1001973 KESKINÄINEN VAKUUTUSYHTIÖ FENNIA 0196826-7 4060.88
... ... ... ... ... ... ... ... ... ... ...
42585 OL000061352 31.12.2022 430001 Asiakaspalvelujen ostot 1203230004 Ikääntyneiden asiakasohjausyksikkö T1013180 Arwo kotihoiva Oy 3265395-4 1064.19
42586 OL000061356 31.12.2022 452001 Elintarvikkeet 1205900202 Palvelukeittiöt T1011440 Sinuhe-Leipomo Oy 3118830-9 26.02
42587 OL000061357 21.12.2022 452001 Elintarvikkeet 1205900202 Palvelukeittiöt T1002508 MEIRA NOVA OY 0697627-4 671.27
42588 OL000061373 31.12.2022 456021 Sähkö 1205600301 Katualueet T1013219 Omavoima Oy 2209312-1 182.41
42589 OL000061374 31.12.2022 456021 Sähkö 1205600301 Katualueet T1013219 Omavoima Oy 2209312-1 2.06

42590 rows × 10 columns

Huomaamme heti, että vuonna 2022 Janakkalan kunnan julkaistuissa ostolaskuissa on yli 42 000 tapahtumaa, joiden euromäärät heiluvat joulukuisesta parin euron sähkölaskusta useisiin tuhansiin. Jos etsimme, löydämme varmasti isompiakin eriä. Joten etsitään siis!

3. Analyysiä#

# Tarkastellaan ensin paljonko vuoden summa on ollut.
kirjat = data["Summa kirjanpidon valuuttana"].sum()
print(f"Yhteensä summasarakkeessa on {kirjat} euroa.")
Yhteensä summasarakkeessa on 65763061.72 euroa.

No sehän on melkoinen potti. Jos katsomme Janakkalan kunnan verkkosivuille https://www.janakkala.fi/kunta-ja-paatoksenteko/hallinto-ja-talous/talous/, löydämme sieltä varsinaiset tilinpäätökset vertailtaviksi. Mutta ihan peukalotuntumallakin voimme verrata äskeisten miljoonien määrää vuoden 2023 infografiikkaan:

Tuntuuko summa realistiselta?

Vilkaistaanpa sarakkeen tarkempaan sisältöön.

# Etsitään kallein yksittäinen ostos.
kallein = data["Summa kirjanpidon valuuttana"].max()
print(f"Kallein ostos oli {kallein} euroa.")

# Millä rivillä se on?
paikka = data["Summa kirjanpidon valuuttana"].idxmax()
print(f"Sen rivi-indeksi on numero {paikka}.")

# Kuka se oli?
kohde = data.iloc[paikka]["Toimittajan nimi"]
print(f"Sen toimittaja oli siis {kohde}.")

# Milloin se tapahtui?
aika = data.iloc[paikka]["Kirjauspäivämäärä"]
print(f"Tapahtuma on kirjattu päivämäärälle {aika}.")

# Millaisesta osa-alueesta oli kyse?
ala = data.iloc[paikka]["Kustannuspaikan nimi"]
print(f"Osto on rekisteröity kategoriaan '{ala}'.")
Kallein ostos oli 1756583.33 euroa.
Sen rivi-indeksi on numero 7015.
Sen toimittaja oli siis Kanta-Hämeen sairaanhoitopiirin ky.
Tapahtuma on kirjattu päivämäärälle 1.3.2022.
Osto on rekisteröity kategoriaan 'Erikoissairaanhoito'.

Sellaista salapoliisintyötä. Voisimme myös halutessamme jaotella aineistoa jonkin teeman mukaan, laskea niistä osasummia tai keskimääräisiä arvoja. Itseasiassa, paljonkohan keskimääräinen ostos on ollut?

# Otetaas keskiarvoja.
KA = data["Summa kirjanpidon valuuttana"].mean()
print(f"Keskiarvo kaikkien ostosten välillä on ollut noin {KA} euroa.")
Keskiarvo kaikkien ostosten välillä on ollut noin 1544.096307114346 euroa.

Keskimääräinen ostos on siis toista tonnia osan huidellessa miljoonissa. Mutta kuinka kuvaava tavallinen keskiarvo on? Jos jaottelisimme aineiston sen mukaan, miten suuri osuus lopulta jäisi tuon rajan yläpuolelle?

# Katsotaas millainen jakauma ostoksissa on.

pienet = data.query("`Summa kirjanpidon valuuttana` <= @KA")
isot = data.query("`Summa kirjanpidon valuuttana` > @KA")

print(f"Koko aineistossa on {len(data)} ostosta. Niistä {len(pienet)} jää alle keskiarvon {KA} € ja {len(isot)} ylittää sen.")
print(f"Täten keskiarvon suhdeluku ei tosiaankaan ole noin puolet ja puolet, vaan isompia on {len(isot)/len(pienet)}.")
Koko aineistossa on 42590 ostosta. Niistä 37947 jää alle keskiarvon 1544.096307114346 € ja 4643 ylittää sen.
Täten keskiarvon suhdeluku ei tosiaankaan ole noin puolet ja puolet, vaan isompia on 0.1223548633620576.

3. Aineisto - Kokkolan kaupunki#

Mutta hei, vaikka avoindata.fi -portista ei Kokkolaa vielä löydykään, kaupunki itse tarjoaa omilla sivuillaan https://www.kokkola.fi/hallinto-ja-paatoksenteko/talous/ vastaavaa aineistoa tarkasteltavaksi. Käytäntö on alkanut vuodesta 2022.

# Jotkut Pythonin versiot eivät oletusarvoisesti tue pandaksen kautta Excel-tiedostojen lukemista. Alla oleva käsky auttaa virhetilanteessa.
%pip install openpyxl
Collecting openpyxl
  Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)
Collecting et-xmlfile (from openpyxl)
  Downloading et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)
Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)
Downloading et_xmlfile-2.0.0-py3-none-any.whl (18 kB)
Installing collected packages: et-xmlfile, openpyxl
Successfully installed et-xmlfile-2.0.0 openpyxl-3.1.5
Note: you may need to restart the kernel to use updated packages.
# Haetaan aineisto suoraan kaupungin sivuilta.
kokkola = pd.read_excel("https://www.kokkola.fi/app/uploads/2024/06/9c81b62f-ostolaskudata-2023-kokkola.xlsx")
kokkola
Kuntanumero Kunta Y-tunnus Tili Tili(T) Tapahtumanumero Reskontranro Reskontranro(T) Y-tunnus.1 Maatunnus Jakso Summa
0 272.0 Kokkola 0179377-8 1808.0 PALAUTUSKELPOISET 200487391.0 220832.0 Rauta Juhinna Oy 3254973-5 FI 202301.0 8.86
1 272.0 Kokkola 0179377-8 4590.0 RAKENNUSMATERIAALI 200487391.0 220832.0 Rauta Juhinna Oy 3254973-5 FI 202301.0 36.91
2 272.0 Kokkola 0179377-8 1808.0 PALAUTUSKELPOISET 200488215.0 200705.0 Kokkolan Teollisuuskylä Oy 0179213-4 FI 202301.0 21.60
3 272.0 Kokkola 0179377-8 4860.0 MUUT VUOKRAT 200488215.0 200705.0 Kokkolan Teollisuuskylä Oy 0179213-4 FI 202301.0 90.00
4 272.0 Kokkola 0179377-8 1808.0 PALAUTUSKELPOISET 200488216.0 200705.0 Kokkolan Teollisuuskylä Oy 0179213-4 FI 202301.0 245.96
... ... ... ... ... ... ... ... ... ... ... ... ...
141104 272.0 Kokkola 0179377-8 1808.0 PALAUTUSKELPOISET 200549668.0 201607.0 Rakennusliike Antti Salonen Oy 1891434-5 FI 202312.0 1444.96
141105 272.0 Kokkola 0179377-8 4320.0 URAKAT/INVESTOINNIT 200549668.0 201607.0 Rakennusliike Antti Salonen Oy 1891434-5 FI 202312.0 6020.66
141106 272.0 Kokkola 0179377-8 1808.0 PALAUTUSKELPOISET 200549883.0 200028.0 Hartman Rauta Oy 0628046-1 FI 202312.0 -344.40
141107 272.0 Kokkola 0179377-8 4590.0 RAKENNUSMATERIAALI 200549883.0 200028.0 Hartman Rauta Oy 0628046-1 FI 202312.0 -1435.00
141108 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.00

141109 rows × 12 columns

# Vilkaistaas samalla tavalla Kokkolankin aineistoon.

# Etsitään kallein yksittäinen ostos.
kallein = kokkola["Summa"].max()
print(f"Kallein ostos oli {kallein} euroa.")

# Millä rivillä se on?
paikka = kokkola["Summa"].idxmax()
print(f"Sen rivi-indeksi on numero {paikka}.")

# Kuka se oli?
kohde = kokkola.iloc[paikka]["Reskontranro(T)"]
print(f"Sen toimittaja oli siis {kohde}.")

# Milloin se tapahtui?
aika = kokkola.iloc[paikka]["Jakso"]
print(f"Tapahtuma on kirjattu kuukaudelle {aika}.")

# Millaisesta osa-alueesta oli kyse?
ala = kokkola.iloc[paikka]["Tili(T)"]
print(f"Osto on rekisteröity kategoriaan '{ala}'.")
Kallein ostos oli 8910000.0 euroa.
Sen rivi-indeksi on numero 28017.
Sen toimittaja oli siis Kuntarahoitus Oyj.
Tapahtuma on kirjattu kuukaudelle 202304.0.
Osto on rekisteröity kategoriaan 'KUNTARAHOITUS OY:LTÄ'.

Siinähän on jo heti muutama milli kiinni.

Selvitäpä seuraavaksi itse paljonko ostoja tehtiin kokonaisuudessaa?

Paljonko ostoja tehtiin eri kuukausina?

Mikä kuukausi oli aktiivisin?

Miten suuri osuus ostoista liittyy vuokriin tai muihin aineettomiin ostoihin verrattuna esineiden liikutteluun?

# Koodaile tänne!