python-kieli ensikosketuksena ko- neoppimiseen
TRANSCRIPT
Evgen Heiskanen
Python-kieli ensikosketuksena ko-neoppimiseen
Metropolia Ammattikorkeakoulu
Insinööri (AMK)
Tieto- ja viestintätekniikka
Insinöörityö
8.11.2021
Tiivistelmä
Tekijä: Evgen Heiskanen
Otsikko: Python-kieli ensikosketuksena koneoppimiseen
Sivumäärä: 35 sivua
Aika: 8.11.2021
Tutkinto: Insinööri (AMK)
Tutkinto-ohjelma: Tieto- ja viestintätekniikka
Ammatillinen pääaine: Ohjelmistotuotanto
Ohjaajat: Lehtori Vesa Ollikainen
Insinöörityön tavoitteena on arvioida Python-kielen koneoppimiskirjastojen käyttöä
ensikosketuksena koneoppimiseen. Soveltuvuutta arvioidaan datan käsittelyn help-
pouden, analyysityökalujen kattavuuden sekä datan ja tulosten visualisointimahdolli-
suuksien näkökulmasta.
Tapausesimerkkinä käytetään Tilastokeskuksen aikasarja-aineistoa kotitalouksien tu-
lonjakoa kuvaavan Gini-indeksin kehityksestä. Työn tuotoksina saadaan sovellus,
joka toteuttaa koneoppimisprosessin relaatiotietokantahausta tulosten visualisointiin
sekä arvio Python-kielen soveltuvuudesta koneoppimisen ensimmäiseksi työväli-
neeksi.
Avainsanat: python, koneoppimiskirjasto, lineaarinen regressio, pan-
das, matplotlib, Gini-kerroin, tilastot
Abstract
Author: Evgen Heiskanen
Title: Python as a Prelude to machine learning
Number of Pages: 35 pages
Date: 8 November 2021
Degree: Bachelor of Engineering
Degree Programme: Information and communication technologies
Professional Major: Software Engineering
Supervisor: Vesa Ollikainen, Senior Lecturer
The aim of the study was to evaluate the use of Python machine learning libraries in a
process of machine learning as a prelude. The suitability was assessed in terms of and
result visualization capabilities.
As a case study, Statistics Finland's time series data on the development of the Gini
index describing household income distribution were used. The outcome of the study
is an application that implements the machine learning process from relational data-
base search to visualization of results as well as an assessment of the suitability of
Python as the first tool for machine learning.
Keywords: Python, machine learning library, linear regression, pan-
das, matplotlib, Gini coefficient, statistics
Sisällys
1 Johdanto 1
2 Koneoppiminen 3
2.1 Koneoppimisen historia 4
2.2 Lineaarinen regressio 6
2.3 Logistinen regressio 8
2.4 Päätöspuut 8
2.5 K:n lähimmän naapurin menetelmä 9
2.6 Naiivi Bayes-luokittelija 9
3 Tietokanta ja sen luominen 10
3.1 Tilastokeskuksesta saatavat tiedot 10
3.2 Tietokannan luominen MySQL Command Line Client -ohjelmointiympäristössä 10
4 Datan käsittely Pythonissa 12
4.1 Työskentely-ympäristöt 12
4.2 Datan käsittelykirjastot 13
4.3 Koneoppimiskirjastot 13
4.4 Visualisointikirjastot 14
5 Pythonin ohjelmointi ja mallinnus 14
6 Visualisointi 27
7 Työkalujen arviointi 31
8 Yhteenveto 31
Lähteet 33
1
1 Johdanto
Viime aikoina Pythonista on tullut suosituin ohjelmointikieli. Tämä johtuu siitä,
että Pythonilla on helppo kirjoittaa ja se on erittäin joustava. Python on erityisen
suosittu matematiikassa ja erilaisissa tilastollisissa tutkimuksissa. Tämä johtuu
siitä, että Python sisältää suuren määrän matemaattisia ohjelmakoodikirjastoja.
Pythonin perustaja on Alankomaista kotoisin oleva ohjelmoija Guido van Ros-
sum. Python oli luotu vuonna 1991 ja sitä on siitä lähtien kehitetty nopeasti ja
tehokkaasti. (1.)
Tärkeää on se, että Pythonista on tullut monipuolinen kieli ohjelmistokehityk-
seen kuten pelien tuottamiseen, web-kehitykseen, erilaisten sovellusten kehittä-
miseen, graafisiin käyttöliittymiin jne. Pythonin ohjelmointikirjastoa Qiskit voi
käyttää jopa kvanttitietokoneessa. (2.) Python tarjoaa käyttäjälle monia mahdol-
lisuuksia toisiin ohjelmointikieliin verrattuna.
Yleensä Pythonin vahvuudet ovat seuraavat.
• Monenlaisia kirjastoja, erityisesti math-kirjastoja, kuten NumPy ja Pandas.
• Hyvät työkalut visualisointiin, kuten matplotlib.pyplot.
• Pythonille on olemassa erittäin tehokkaita ohjelmointiympäristöjä, kuten Spyder ja Jupyter Notebook.
• Pythonilla voidaan helposti käsitellä XML-koodia.
• Pythonilla koodi on lyhyempi kuin Javalla tai C:lla. Sen takia ohjel-mointikieli sopii aloittelijalle erinomaisesti. Kieltä on helppo koodata ja oppia. Ohjelmoija voi kirjoittaa Pythonilla nopeammin, kuin Javalla tai C:lla.
• Python-kielellä voidaan kuvata koko datan analyysiprosessi.
• Tuottavuus, koska ohjelmoijalta kuluu pienempi aika koodin luomi-seen ja kirjoittamiseen.
Yleisesti Python on integroitava, interaktiivinen, tehokas ja oliopohjainen ohjel-
mointikieli. (3.) Maailmassa toimii niin sanottu Python Software Foundation -
2
yhteisö. (4.) Tämä yhteisö on Python-version 2.1 ja sitä uudempien omistaja.
Yhteisön päätehtävä on avoimen lähdekoodin teknologian edistäminen. Lisäksi
yhteisö mainostaa kielen käytön mahdollisuuksia ja ominaisuuksia. Python-oh-
jelmien suoritus on yleensä melko nopeaa. Joskus Python toimii hitaammin kuin
esimerkiksi Java tai C. Mutta monessa tapauksissa Pythonin tuottavuus on to-
della tehokas. Tähän vaikuttavat ensisijaisesti Pythonin laajat matemaattiset kir-
jastot, kuten NumPy ja Pandas. Python toimii myös hyvin, kun pitää käyttää oh-
jelmointirajapintoja.
Todetaan, että sekä Windows- että Linux-käyttöjärjestelmissä Pythonin käyttö
on mahdollista. Kieltä käytetään myös tehokkaasti järjestelmänhallintaan.
Google, Yahoo ja Lucasfilm Ltd käyttävät Pythonia. (2.)
Mediajätti YouTube on kokonaisuudessaan luotu ja kirjoitettu Pythonilla. Kiin-
nostavaa on, että Pythonilla on luotu versiohallinnan sivusto Bitbucket. Kieli so-
pii erinomaisesti Web-ohjelmoinnin prosessien toteutukseen. Myös Nasa käyt-
tää Pythonia aktiivisesti. (5.)
Tässä työssä arvioidaan Python-kielen koneoppimiskirjastojen soveltuvuutta ko-
neoppimisongelmien ratkaisemiseen. Tätä tarkoitusta arvioidaan datan käsitte-
lyn helppouden, analyysityökalujen kattavuuden sekä datan ja tulosten visuali-
sointimahdollisuuksien näkökulmasta. Python toimii ensimmäisen koneoppimis-
projektin toteutusympäristönä todella hyvin, koska se sopii datan käsittelyyn
erinomaisesti. Esimerkkinä käytetään Tilastokeskuksen aikasarja-aineistoa koti-
talouksien tulonjakoa kuvaavan Gini-indeksin kehityksestä.
Työ edellyttää riittävän laajan tietokannan luomista, jota myöhemmin käsitellään
Python-ohjelmalla Anaconda-ohjelmointiympäristössä. Edellä esitetystä seuraa,
että työssä käytetään koneoppimismenetelmiä. Koneoppimismenetelmistä line-
aarisella regressiomenetelmällä on erityinen merkitys, koska sen avulla voidaan
havainnoida eri muuttujien välisiä riippuvuuksia. Tähän analyysiin osallistuvat
sellaiset Pythonin matemaattiset kirjastot kuten Numpy, Pandas ja Sklearn.
3
Luku 2 toimii teoriakatsauksena koneoppimismenetelmiin. Tämän jälkeen kuva-
taan ohjelmiston rakentaminen ja arviointi, joka koostuu kolmesta vaiheesta.
Ohjelmiston rakentamisen ensimmäinen vaihe edellyttää, kuten jo todettiin, tie-
tokannan luomista. Sitä varten käytetään SQL-kieltä MySQL-komentorivitulkin
kautta. Tämä esitellään luvussa 3.
Toisessa vaiheessa on tarkoituksena kirjoittaa itse Python-ohjelma Anaconda-
ohjelmointiympäristössä sekä käyttää erilaisia mallintamismenetelmiä. Luvussa
4 esitellään Pythonin koneoppimiskirjastoja ja luvussa 5 laaditaan lineaarinen
regressiomalli.
Sen jälkeen kolmannessa vaiheessa visualisoidaan tuloksia ja tehdään niistä
johtopäätöksiä (luku 6). Visualisoinnissa käytetään Pythonin kirjastoa MatPlot-
Lib.
Lopuksi luvussa 7 arvioidaan Pythonin ja sen kirjastojen soveltuvuutta ensim-
mäisen koneoppimisprojektin toteutusympäristöksi.
Opinnäytetyön tuloksia voidaan hyödyntää harkittaessa toteutusympäristöä ko-
neoppimisprojektille. Erityisesti työ toimii esimerkkinä taloustieteellisen aineiston
analysoinnista Python-kirjastoilla.
2 Koneoppiminen
Tämän luvun tarkoituksena on tarjota yleiskuva koneoppimismenetelmistä. Tätä
varten kerrotaan koneoppimisen historiasta ja menetelmistä.
4
2.1 Koneoppimisen historia
Usein koneoppimisella tarkoitetaan teknologioita, jotka antavat ohjelmoijalle
mahdollisuuden ratkaista erilaisia ongelmia virheet minimoivien ja itseoppimi-
seen kykenevien ohjelmien avulla. (6.)
Koneoppimisen tutkimus aloitettiin useita vuosia sitten. Tekoälyn pioneeri Arthur
Samuel julkaisi ensimmäisen artikkelin vuonna 1959. (7.) Kuuluisat tutkijat Pro-
vost ja Kohavi jo kauan sitten määrittelivät koneoppimisen teknologiaksi, joka
kykenee ennakoimaan ohjelman tulevaa käyttäytymistä. (8.)
Kansainvälisen tiedeyhteisön mukaan koneoppiminen on tekoälyn osa-alue.
Voidaan todeta, että tekoäly (artificial intelligence) pystyy simuloimaan ihmisten
älykkyyden ominaisuuksia. (1.) Tämän jälkeen kaikki älykkyyteen liittyvät pro-
sessit voitaisiin luoda uudelleen tietokoneilla. Tässä tapauksessa otetaan huo-
mioon binäärijärjestelmän pohjalta rakennetun konelogiikan erityispiirteet. Sillä
tavalla tietokone käsittää tietoja ja samanaikaisesti jäljittelee ihmisen älykkäitä
tekoja. Nämä teot sisältävät tehtävien ratkaisemista ja päätöksien löytämistä.
On olemassa kahdenlaista tekoälyä: heikkoa ja vahvaa. Heikon tekoälyn syno-
nyymi on kapea tekoäly.
Vahvan tekoälyn ominaisuudet ovat samanlaisia kuin ihmisten kognitiiviset ky-
vyt. Voidaan sanoa, että vahva tekoäly ei vaadi ohjelmoijan väliintuloa ohjelman
suoritusprosessissa, mutta heikko tekoäly merkitsee aina kehittäjän suoraa
osallistumista.
Tämä koskee tietysti ensisijaisesti robotiikkaa. Tällaiset tekniikat eivät vaadi
henkilön läsnäoloa joka minuutti. Ehkä jossakin ei kovin kaukana tulevaisuu-
dessa robotit pystyvät kehittämään itseään. Yhteiskunta on kuitenkin jo nyt
5
lähestymässä teknisen ainutlaatuisuuden tilaa. Tällaisessa tilanteessa teko-
älystä tulee inhimillisen kehityksen menestyksen pääedellytys.
Tekoälyn nykyaikaisista saavutuksista voidaan mainita sellaisia teknisiä läpi-
murtoja kuin konenäkö, automaattisten planeettojenvälisten ajoneuvojen hallinta
ja keinotekoisten elinten viljely.
Tietotekniikan kehitys alkoi lähinnä von Neumannin ajatuksesta. Vuonna 1946
von Neumann ja muut tutkijat hahmottivat tietokoneen toiminnan perusperiaat-
teet. Erityisen tunnettu on periaate ohjeiden ja tietojen tallentamisesta tietoko-
neen muistiin. (9.) Sen jälkeen koneoppimisessa tapahtui 1900-luvun lopulla
teknologinen läpimurto. 1900-luvun jälkipuoliskolla ohjelmoija sai uusia työka-
luja ja menetelmiä. Se mahdollistaa laskelmien suorittamisen uudella tasolla.
Koneoppimisalgoritmit voidaan luokitella seuraavasti:
a) Ohjattu oppiminen — Ennalta suunniteltu ohjelman tulos on odotettavissa. Se
vaatii aina ihmisten läsnäoloa. Mitä enemmän opetustietoja ja aikaa käytetään,
sitä parempi on odotettu tulos. (4.)
b) Ohjaamaton oppiminen — Ohjelman lopputulosta ei tiedetä etukäteen. Oh-
jelma kehitetään itse. Ohjelma voi luoda mallin ja etsiä ratkaisuja. Tämä mene-
telmä ei vaadi ihmistä. (10.)
c) Vahvistusoppiminen — Mallit ja ympäristö ovat vuorovaikutuksessa. Tässä
tapauksessa etsitään parasta tehokkuutta. Samaan aikaan tutkijan on parannet-
tava ohjelman tuloksia jokaisella uudella kierroksella. (11.)
Yleisesti koneoppiminen pohjautuu vahvasti tilastotieteen menetelmiin. Tilasto-
tieteen alan tutkimuksissa lineaarisella regressiolla on keskeinen rooli. Koneop-
pimisessa käytetään sellaisia tekniikoita kuin lineaarinen regressio, logistinen
6
regressio, päätöspuut, k:n lähimmän naapurin menetelmä ja naiivi Bayes-luokit-
telija.
Tämä työ edellyttää ensisijaisesti lineaarisen regression käyttöä. Se on yksi
suosituimmista koneoppimismenetelmistä. Lisäksi luodaan katsaus muihin ko-
neoppimisen menetelmiin kuten logistinen regressio. Nämä metodit muodosta-
vat tutkimuksen teoreettisen taustan.
2.2 Lineaarinen regressio
Lineaarisella regressioanalyysillä tarkoitetaan ”tilastollista analyysimenetelmää,
jossa kerätyn aineiston perusteella ohjelma estimoi tarkasteltavan vastemuuttu-
jan lineaarista riippuvuutta selittävistä muuttujista”. (12.)
Pohjimmiltaan lineaarinen regressio on matemaattisten odotusarvon poik-
keamien neliöiden minimointia. Tätä menetelmää käytetään monella tieteen-
alalla. Lineaarista regressiota käytetään jopa tekoälymalleissa, mukaan lukien
hermoverkot.
Regressioanalyysin avulla voidaan ymmärtää, miten selittävät muuttujat vaikut-
tavat selitettävään muuttujaan. Voi olla tapaus, jossa on vain yksi selittävä
muuttuja ja selitettävä muuttuja (vastemuuttuja). Siinä tapauksessa analyysiä
kutsutaan yksinkertaiseksi lineaariseksi regressioksi. Englanniksi se tarkoittaa
”simple linear regression”. Yleisesti ottaen yksinkertainen lineaarinen regres-
siokaava on:
𝑌 = a + bX
jossa Y on vastemuuttuja, X selittävä muuttuja, a vakiotermi ja 𝑏 regressioker-
roin.
Tässä insinöörityössä tarkastellaan, miten käytettävistä olevasta rahasta, tuo-
tannontekijätulosta ja bruttorahatulosta lasketut Gini-kertoimet liittyvät toisiinsa.
7
On tärkeää huomata, että tämän tutkimuksen tarkoituksena ei ole tulkita talous-
suhteita, mutta niiden ymmärtäminen on välttämätöntä lineaaristen regressioyh-
tälöiden rakentamiseen tarvittavien funktioiden oikean määrittelyn kannalta.
Tutkimuksessa käytetään siis kolmea muuttujaa, joita ovat käytettävissä olevat
rahatulot, bruttorahatulot ja tuotannontekijätulot. Jokaiselle näistä taloudellisista
indikaattoreista laskettiin Gini-kerroin, joka luonnehtii omaisuuden kerrostumis-
tasoa yhteiskunnassa. Kuten taloustieteestä tiedetään, tuotannontekijätulot tar-
koittavat palkka-, yrittäjä- ja omaisuustuloja. (13.)
Toiminnallisesti nämä indikaattorit määritellään seuraavien funktioiden F kautta
(13.):
1) käytettävissä olevat rahatulot = F (bruttorahatulot)
jossa käytettävissä olevat rahatulot on selitettävä (riippuva) muuttuja, ja brutto-
rahatulot on selittävä (riippumaton) muuttuja
2) bruttorahatulot = F (tuotannontekijätulot)
jossa bruttorahatulot edellisen kommentin mukaisesti
Monimuuttujaregression laskeminen on mahdotonta, kun käytetään funktioita
”käytettävissä olevat rahatulot = F (bruttorahatulot, tuotannontekijätulot)”, koska
tässä tapauksessa syntyy multikollineaarisuus. Syynä on se, että bruttorahatu-
lojen ja tuotannontekijä-tulojen parametrien välillä on yhteys. Tilanteessa, jossa
lineaarisen regressioyhtälön riippumattomien muuttujien välillä on suhde, muo-
dostuu aina multikollineaarisuutta. (14.) Tärkeää on se, että multikollineaarisuus
on regressiomallin kannalta ongelmallista: regressiokertoimet riippuvat toisis-
taan ja yksittäisen muuttujan merkityksen arviointi on vaikeaa.
Yllä olevat yhtälöt on esitetty vain siksi, että voimme selittää insinöörityössä ke-
hitetyn lineaarisen regression mekanismin. Tämän esimerkin avulla voidaan tar-
kastella Python-ohjelmointikirjaston toimintaa, mikä on tutkimuksen päätavoite.
8
Käytännössä koneoppimisessa käytetään tietojen analysointiin myös muita ma-
temaattisia menetelmiä. Niistä esitellään logistinen regressio, päätöspuut, k:n
lähimmän naapurin menetelmä sekä naiivi Bayes-luokittelija.
2.3 Logistinen regressio
Koneoppimisen seuraava menetelmä on logistinen regressio (logistic regres-
sion). Tässä matemaattisessa menetelmässä muodostetaan tilastollinen malli.
(15.)
Tässä tapauksessa riippuvalla muuttujalla on kaksi arvoa. Se on niin sanottu di-
kotominen muuttuja. Tälle parametrille on ominaista se, että sillä on kaksi luok-
kaa. Funktio on siis binäärinen. Selitettävä muuttuja saa arvon 0 tai 1, eikä
muita arvoja ole. Logistisella regressiolla on omat piirteensä, jotka erottavat
sen lineaarisesta regressiosta. Lisäksi voidaan todeta, että logistinen regressio-
malli on yleistetty lineaarinen malli. (9.) Virallisen määritelmän mukaan logisti-
sella regressiossa ”selittävät muuttujat voivat olla suhdeasteikollisia, järjestysas-
teikollisia tai luokiteltuja”. (16.)
2.4 Päätöspuut
Myös päätöspuita käytetään koneoppimisessa. Lyhyesti sanoen koneoppimis-
ohjelma muodostaa päätöspuun rakenteen sillä tavalla, että puun oksat tarkoit-
tavat erilaisia empiirisiä ominaisuuksia ja lehtisolmut tarkoittavat loppupäätök-
siä.
Päätöspuu on datan perusteella rakennettu malli. Päätöspuussa on olemassa
niin sanottu kohdemuuttuja, joka voi olla diskreetti. Silloin päätöspuu on luon-
teeltaan luokittelupuu. Kiinnostavaa on se, että päätöspuuta voidaan käyttää
sekä numeerisen arvon ennustamiseen lineaarisen regression tapaan että luo-
kittelumenetelmänä. Molemmat metodit kuuluvat koneoppimisen suosituimpiin
menetelmiin. (16.)
9
2.5 K:n lähimmän naapurin menetelmä
K:n lähimmän naapurin menetelmää käytetään melko usein koneoppimisen tut-
kimuksissa. Se on metodi, joka tekee luokittelun sen perusteella, mihin luok-
kaan lähimmät opetusjoukon havainnot kuuluvat. Tätä läheisyysperiaatetta so-
velletaan kaikkiin luokiteltaviin havaintoihin. (17.)
Jos ohjelmoija käyttää luokittelumenetelmää, havainto määritetään luokkaan,
joka on yleisin annetun elementin k -naapureiden ryhmässä, jonka luokat ovat
jo tiedossa. Mutta jos k:n lähimmän naapurin menetelmää käytetään regressio-
menetelmänä, arvoksi ennustetaan k:n lähimmän opetusjoukon havainnon kes-
kiarvo, joka on helposti laskettavissa. (18.)
Yksinkertaisuudestaan huolimatta menetelmä on suosittu, koska se toimii
useissa käytännön ongelmissa hyvin.
2.6 Naiivi Bayes-luokittelija
Koneoppimisessa naiivi Bayes-luokittelija on harvemmin käytetty menetelmä
kuin esimerkiksi lineaarinen regressio. Menetelmä perustuu Bayesin teoree-
maan. Teoreema edellyttää sitä, että jokaisen luokan kohdalla estimoidaan se-
littävien muuttujien jakaumat käyttäen normaalijakaumaoletusta. Tämän toimi-
tuksen jälkeen voidaan laskea todennäköisyydet eri luokkiin kuulumiselle. Naiivi
Bayes-luokittelija antaa mahdollisuuden tutkia erilaisia dataryhmiä.
Menetelmän vahvuutena on, että naiivi Bayes-luokittelija toimii hyvin monenlais-
ten aineistojen kohdalla, vaikka riippumattomuusoletus ei toteutuisikaan. (19.)
Selittävien muuttujien ei tarvitse olla toisistaan riippuvia.
10
3 Tietokanta ja sen luominen
Tässä luvussa kuvataan relaatiotietokannan rakentaminen koneoppimisprojek-
tia varten.
3.1 Tilastokeskuksesta saatavat tiedot
Tietokannan luominen alkaa relaatiotietokannan hallintajärjestelmän valinnalla.
Soveltuvia ovat MS SQL, Oracle Database, MySQL, IBM Db2, Amazon Relati-
onal Database Service (RDS), PostgreSQL, SAP HANA, Amazon Aurora. (20.)
MySQL valittiin toimivaksi tietokannaksi, koska MySQL:lle on ominaista nopea
työnopeus tietojen lukemisessa ja yleensä korkea toimivuus. Lisäksi MySQL in-
tegroituu tehokkaasti Pythoniin.
Koneoppimisprojektit vaativat yleensä melko suuren tietokannan. Tästä syystä
hankkeen alussa oli tarpeen luoda MySQL-tietokanta.
Hankkeessa luodaan ohjelma lineaarisen regression laskemiseksi ja visualisoi-
miseksi. Tämä edellyttää suuren määrän tilastotietojen käyttöä.
Kaikki tiedot on saatu Tilastokeskuksesta tietosarjasta. Tilastokeskuksesta ha-
ettu data on kokonaisuudessaan HTML-muodossa. (21.)
Data-taulukoissa jokaiselle näistä taloudellisista indikaattoreista (käytettävissä
olevat rahatulot, tuotannontekijätulot, bruttotulot) laskettiin Gini -kerroin. Näitä
indeksejä käytetään edelleen matemaattiseen käsittelyyn Python-ohjelmistokir-
jastojen avulla.
3.2 Tietokannan luominen MySQL Command Line Client -ohjelmointiym-päristössä
Kuten jo todettiin, tietokanta luotiin MySQL-komentotulkissa SQL-kieltä käyt-
täen. Kaikki Tilastokeskuksesta saadut tiedot on siirretty MySQL-tietokantaan.
11
MySQL-tietokannan nimi on STATISTIC_X. MySQL on perinteinen tiedonhallin-
taohjelma, joka ei ole menettänyt merkitystään tähän asti. Mainittua ohjelmistoa
käytetään insinöörityön kaikissa laskelmissa.
Kaikki tilastotiedot syötetään tähän tietokantaan niiden myöhempää käsittelyä
varten Python-ohjelmassa.
Kuvassa 1 on tietokanta STATISTIC_X, jossa on Gini-kertoimen arvot. Kussa-
kin sarakkeessa Gini-kerroinarvot lasketaan eri indikaattoreiden perusteella (ra-
hatulot, tuotannontulot, bruttotulot).
Gini -kerroin osoittaa sosiaalisen eriarvoisuuden asteen. Se vaihtelee nollasta
yhteen. Mitä lähempänä ollaan kerrointa 1, sitä suurempi on sosiaalinen eriar-
voisuus. Tämä tarkoittaa, että kaikki tulot yhteiskunnassa keskittyvät kapean ih-
misryhmän käsiin. (22.)
Gini -kerroin voidaan näyttää prosentteina. Tässä muodossa Gini -kerroin on
ymmärrettävämpi lukijalle.
Gini -kerroin voidaan laskea kaavalla (23.):
𝐺 = 1 − ∑(
𝑛
𝑘=2
𝑋𝑘 − 𝑋𝑘−1)(𝑌𝑘 + 𝑌𝑘−1)
jossa 𝐺 Gini-kerroin, 𝑋𝑘 väestön osuus tulojen kasvun mukaan, 𝑌𝑘 on tulojen
osuus, joka saa 𝑋𝑘, ja n on kotitalouksin lukumäärä.
12
Kuva 1. Tietokannan sisällys.
4 Datan käsittely Pythonissa
4.1 Työskentely-ympäristöt
Pythonissa tietojen käsittelyyn ja ohjelmointiin on olemassa ohjelmointiympäris-
töjä, joista Anaconda on kenties tehokkain. Anacondalla on käyttäjäystävällinen
sisäinen rakenne ja monipuolinen käyttöliittymä. Se helpottaa kirjastojen asen-
nusta. Monet kirjastosta voidaan helposti asentaa conda install -komennolla.
13
On suositeltavaa aloittaa työskentely Anacondan kanssa kytkemällä Anaconda
Navigator -järjestelmä päälle. Tässä järjestelmässä käyttäjä voi löytää käteviä
ohjelmointiympäristöjä, kuten Spyderin ja JuPyTer Notebookin.
Spyder on tehokas integroitu ohjelmointiympäristö, joka on erityisen hyödyllinen
matemaattisessa tutkimuksessa. JuPyTer Notebook on selainpohjainen sovel-
lus ja tarjoaa runsaasti mahdollisuuksia koodin näyttämiseen ihmisen luetta-
vassa muodossa. JuPyTer Notebook on koneoppimisessa suosittu siitä syystä,
että se sallii ohjelmakoodin, välitulosten ja lopputulosten esittämisen ja muok-
kaamisen samassa dokumentissa.
4.2 Datan käsittelykirjastot
Ohjelmoinnissa Pythonissa on käytettävässä erilaisia ohjelmakoodikirjastoja.
Tässä projektissa käytetään aktiivisesti sellaisia kirjastoja kuin Pandas
(https://pandas.pydata.org/ ) ja NumPy (https://numpy.org/ ). Voidaan todeta,
että NumPy palvelee erilaisia matemaattisia laskelmia ja Pandas tarjoaa erityi-
siä tietorakenteita ja toimintoja numeeristen taulukoiden ja aikasarjojen käsitte-
lyyn. Samaan aikaan Pandas on korkeamman tason kirjasto, ja sen kanssa
työskentely perustuu NumPy-kirjastoon. Esimerkiksi Pandas-kirjaston avulla
voidaan käyttää sellaisia tärkeitä metodeja kuin pd.read_sql() ja pd.Da-
taFrame(), joita tarvitaan DateFrame-olion luomiseen. Kuten tiedetään, Da-
taFrame on kaksiulotteinen taulukko, jonka tietorakenne on kätevä Pythonin
matemaattiseen jatkokäsittelyyn. (24.)
4.3 Koneoppimiskirjastot
Lisäksi käsittelykirjastoja Sklearn (Scikit-learn), Keras ja TensorFlow käytetään
koneoppimisprosessien toteuttamiseen. Niistä Sklearn sisältää erilaisia luokitus-
, regressio- ja klusterointialgoritmeja. Keras tarjoaa työkalut keinotekoisten her-
moverkkojen kanssa työskentelyyn. Keras on lisäosa TensorFlow-ohjelmistoke-
hyksen päälle. Käsittelykirjastoa TensorFlow käyttää erityisesti Google-yritys
Google Brian -projektissa keinotekoisten hermoverkkojen kouluttamiseen. (25.)
14
Jälkimmäinen seikka on erityisen mielenkiintoinen tekoälyjärjestelmien toteutta-
misessa.
Scikit-learn on kirjoitettu pääasiassa Pythonilla ja käyttää NumPy-kirjastoa laa-
jasti korkean suorituskyvyn lineaarisessa algebrassa ja matriisitoiminnoissa. Li-
säksi joitakin perusalgoritmeja on kirjoitettu Cython-kielellä suorituskyvyn paran-
tamiseksi. Cython on ohjelmointikieli, jonka avulla Pythonille on helppo kirjoittaa
C/C++-koodimoduuleja. Python-syntaksin lisäksi tuetaan suorita kutsuja C/C++-
funktioihin ja metodeihin. (25.)
4.4 Visualisointikirjastot
Visualisointi on tärkeää tutkimustulosten graafiselle esittämiselle. Sen ansiosta
koneoppimisprosessit ovat tulossa visuaalisemmiksi ja luettavammiksi. Visuali-
sointimahdollisuuksia tarjoavia kirjastoja ovat ensinnäkin Matplotlib
(https://matplotlib.org/ ) ja Seaborn (https://seaborn.pydata.org/ ). Matplotlib on
kirjasto tietojen visualisoimiseksi 2D-grafiikan keinoin Python-ohjelmointikielellä
(myös 3D-grafiikkaa tuetaan). Tuloksena olevia kuvia voidaan käyttää julkaisu-
jen kuvituksina. Seaborn on yhtä voimakas kuin matplotlib, mutta se tarjoaa
enemmän metodeja kaavioiden piirtämisen helpottamiseksi. (26.)
Matplotlib on Python-datavisualisointityökalujen päätyökalu, jota käytetään
tässä tutkimuksessa. Se on vielä nykyäänkin suosituin Python-pohjainen visu-
alisointikirjasto. Se on kehitetty läheisesti muistuttamaan 1980-luvulla käytettyä
MATLAB-ohjelmointikieltä. (26.) Olosuhteisiin nähden se on ensimmäinen datan
visualisointiin tarkoitettu kirjasto Pythonille.
5 Pythonin ohjelmointi ja mallinnus
Lineaarinen regressiomallinnus voidaan suorittaa tehokkaasti Pythonin avulla.
Se on koneoppimisen päämenetelmä tässä työssä. Kuten jo on kerrottu työn
alussa, tutkimuksen päätavoite on Pythonin käsittelykirjastojen
15
käyttökelpoisuuden tutkiminen ja arviointi. Arviointia tehdään ensimmäisen ko-
neoppimisprojektin näkökulmasta.
Tässä insinöörityössä käytetään Anaconda-ohjelmointiympäristöä. Kaikki ohjel-
mointi suoritetaan Anacondan tarjoamassa Spyder IDE (Python 3.8) -kehitti-
messä. Tämä ohjelmointiympäristö valittiin siksi, että Spyder IDE erottuu no-
peudellaan ja tehokkuudellaan matemaattisissa laskelmissa. Spyder on suunni-
teltu erityisesti matemaattiseen ohjelmointiin.
Kuten jo todettiin, tehokkain tapa on ottaa Spyder käyttöön Anaconda Navigato-
rin kautta. Työ suoritetaan tietokoneen järjestelmänvalvojan tilillä. Nämä toimen-
piteet auttavat välttämään joitain virheitä.
Vaihtoehtoisesti Python-ohjelma Spyder-ohjelmointiympäristössä voidaan aloit-
taa näin:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LinearRegression
Esimerkkikoodi 1. Python-ohjelman aloitus.
Esimerkkikoodin 1 import-lauseet tuovat työssä tarvittavat kirjastot käyttöön.
Pandas-ohjelmistokirjasto vastaa tietojen lukemisesta tietokannasta. Kaikki ar-
vot syötetään datakehykseen (Data Frame). Pd.read_sql-funktiolla on tärkeä
rooli, koska sitä käytetään tilastotietojen lukemiseen tietokannasta. Matplo-
lib.pyplot-ohjelmistokirjasto luo tarvittavan visualisoinnin. Sclearn.linear_model-
ohjelmistokirjasto tuo työkaluja lineaarisen regression laskemiseen.
Sen jälkeen rakennetaan Python-koodi seuraavan hahmotelman mukaisesti:
16
# Data preparation
X = df['. . .'].to_frame()
# Preparation of variables
y = df['. . .']
Esimerkkikoodi 2. Python-koodihahmotelma.
Tämä malli oli kirjoitettu suurin piirtein, ja se on lähtökohta datan käsittelylle Pyt-
hon-kielellä. Edellä X on matriisi eli Pandas-kirjaston termein datakehys, joka si-
sältää selittävien muuttujien arvot. Vektori y sisältää vastemuuttujien arvot.
Ensimmäinen asia oli se, että piti ottaa yhteyttä tietokantaan statistic_x.
Sitä varten lisätään seuraava import-lause:
import mysql.connector
Se ottaa ohjelmassa käyttöön Mysql Connector Python -tietokanta-ajurin. Yllä
mainittu Python-ajuri oli ladattu omaan koneeseen virallisesta internetosoit-
teesta https://dev.mysql.com/downloads/connector/python/.
Sen jälkeen Python ohjelman ja tietokannan välinen yhteys testattiin onnistu-
neesti. Käytettävä Python ohjelma on esimerkkikoodin 3 mukainen:
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 15 20:10:55 2020
@author: Evgeni
"""
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
password=" ",
database="statistic_x"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM gin"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Esimerkkikoodi 3. Ohjelman ja tietokannan välissä yhteys.
17
Seuraava vaihe on datakehyksen luominen tietokantahaun perusteella sekä li-
neaarisen regression määrittäminen.
Esimerkkikoodi 4 näyttää datakehyksen luonnin:
SQL_Query = pd.read_sql_query(sql, mydb)
df = pd.DataFrame(SQL_Query,columns=['vuosi', 'rahatulot', 'tuotan-
nontulot', 'bruttotulot'])
print("Data of DataFrame from MySQL database")
print(df)
Esimerkkikoodi 4. Datakehyksen (DataFrame) saaminen.
Sql_query-metodin avulla data luetaan tietokannoista. DataFrame on kaksiulot-
teinen merkitty rakenne, joka näyttää taulukolta. DataFrame-konstruktori luo
olion tietojen matemaattista jatkokäsittelyä varten.
Kuva 2. DataFrame:n tiedot tietokannasta.
Esimerkkikoodin 5 esittämä koodi laskee ja tulostaa tuotannontulojen ja brutto-
tulojen yhteyden (koodissa oleva ”Hei” on insinöörityön tekijän järjestelmävalvo-
jan tilin nimi).
# -*- coding: utf-8 -*-
18
"""
Created on Fri Oct 8 22:06:25 2021
@author: Hei
"""
import mysql.connector
import pandas as pd
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, r2_score
import pyodbc
# MySQL database
mydb = mysql.connector.connect(
host="localhost",
user="root",
password=" ",
database="statistic_x"
)
# Use mycursor method
mycursor = mydb.cursor()
sql = "SELECT * FROM gin"
mycursor.execute(sql)
myresult = mycursor.fetchall()
19
# Get DataFrame
SQL_Query = pd.read_sql_query(sql, mydb)
df = pd.DataFrame(SQL_Query,columns=['vuosi', 'rahatulot', 'tuotan-
nontulot', 'bruttotulot'])
print("Data of DataFrame from MySQL database")
print(df)
# Visualization of variables
plt.xlabel('tuotannontulot')
plt.ylabel('bruttotulot')
plt.scatter(df.tuotannontulot,df.bruttotulot, color = 'dark red',
marker= '*')
# Linear regression function
reg = linear_model.LinearRegression()
reg.fit(df[['tuotannontulot']],df.bruttotulot)
# Get linear regression results
plt.scatter(df.tuotannontulot,df.bruttotulot, color = 'dark red',
marker= '*')
plt.plot(df.tuotannontulot,reg.predict(df[['tuotannontulot']]),color =
'black')
predicted_bruttotulot = reg.predict(df[['tuotannontulot']])
gradient = reg.coef_ # gradient or slope
intercept = reg.intercept_ # it is intercept
r2 = r2_score(df.bruttotulot,predicted_bruttotulot)
mse = mean_squared_error(df.bruttotulot,predicted_bruttotulot)
plt.show()
print("Linear regression: ")
print("The r-square value is :", r2)
print("Mean square error is :",mse)
print("The gradient is : ",gradient)
print("The intercept is :",intercept)
Esimerkkikoodi 5. Bruttotulojen ja tuotannontulojen välisen lineaarisen regres-sioanalyysin toteuttava ohjelma.
Tässä ohjelmassa analysoidaan funktio F(tuotannontulot) = bruttotulot. Talous-
tieteen perusteella suhde on käytännössä juuri tällainen. (13.) Sen ymmärtämi-
nen on tärkeää muuttujien oikealle sijoittamiselle lineaarisessa regressioyhtä-
lössä.
Käsiteltävässä tapauksessa riippuva muuttuja on bruttotulot ja riippumaton
muuttuja on tuotannontulot. Esimerkkikoodi 3 osoittaa tämän yhtälön ja lineaari-
sen regression indikaattorit. Kuva 3 esittää bruttotulojen ja rahatulojen gini-ker-
toimien välisen lineaarisen riippuvuuden.
20
Kuva 3. Rahatulojen Gini-kertoimen lineaarisen regression kaavio.
Jos katsotaan mallia ”rahatulot – bruttotulot”, ohjelma on samakaltainen. Kun
ohjelma suoritetaan, nähdään, että määrityskerroin (r-square) saa arvon
0,9894. Se on huomattavasti enemmän kuin 0,5. Määrityskerroin r2 on riippuvai-
sen muuttujan varianssin osuus, joka selittyy tarkasteltavana olevalla riippu-
vuusmallilla eli selittävillä muuttujilla. (18.) Tämä osoittaa korkean suhteen riip-
puvan ja riippumattoman muuttujien välillä. Siten ehdotettu lineaarinen regres-
siomalli on pätevä ja toimiva.
Mallin tarkistamiseksi suoritettiin k-ristiinvalidointi. Englanniksi siitä käytetään ni-
mitystä ”k-fold cross validation”. Näyte on jaettu k näytemäärään. Malli tarkiste-
taan jokaiselle ryhmälle. Ryhmien lukumäärä k voi olla erilainen. Joskus se on
5, joskus 10, mutta voi myös olla niin, että 𝑘 = 𝑛, missä 𝑛 on kokoelmassa ole-
vien näytteiden lukumäärä. (24.) Tutkittavassa valitaan 𝑘 = 𝑛, jotta saadaan mi-
nimoitua näytteenoton vaikutus opetusjoukon valintaan.
Kun katsotaan muuttujaparia ”rahatulot – bruttotulot”, ristiinvalidoinnin sisältävä
koodi on esimerkkikoodin 6 mukainen:
21
SQL_Query = pd.read_sql_query(sql, mydb)
df = pd.DataFrame(SQL_Query,columns=['vuosi', 'rahatulot', 'tuotan-
nontulot', 'bruttotulot'])
print("Data of DataFrame from MySQL database")
print(df)
# Variables and DataFrame
X = df[['bruttotulot']]
y = df['rahatulot']
# Cross-validation
cv = KFold(n_splits=33, random_state=1, shuffle=True)
# Linear regression model
model = LinearRegression()
# Get k-fold
scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_er-
ror',
cv=cv, n_jobs=-1)
# We can get mean absolute error
mean(absolute(scores))
print("Cross-Validation: ",mean(absolute(scores)))
Esimerkkikoodi 6. ”Rahatulot – bruttotulot” ristiinvalidoinnin koodi.
Koodin suorittamisen tuottama tulos on esitetty kuvassa 4:
Kuva 4. Bruttotulojen ja rahatulojen välisen regressiomallin ristiinvalidointi.
22
Kun tutkitaan muuttujaparia ”tuotannontulot – bruttotulot”, koodi muuttuu vähän:
X = df[['tuotannontulot']]
y = df['bruttotulot']
# We can get cross-validation
cv = KFold(n_splits=33, random_state=1, shuffle=True)
# We can get linear regression model
model = LinearRegression()
# It is k-fold
scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_er-
ror',
cv=cv, n_jobs=-1)
# This is mean absolute error
mean(absolute(scores))
print("Cross-Validation: ",mean(absolute(scores)))
Esimerkkikoodi 7. ”Bruttotulot – tuotannontulot” ristiinvalidoinnin koodi.
Tässä koodissa on laskettu ennustusvirheiden keskiarvo (neg_mean_abso-
lute_error).
Sen takia ristivalidoinnin tulos on:
Kuva 5. Tuotannontulojen ja bruttotulojen välisen regressiomallin ristiinvalidointi.
23
K-ristiinvalidointi, joka sisältää funktion mean(absolute(scores)), osoitti, että
malli on toimiva, mutta ylioppimista ei ole mainittavasti tapahtunut, koska ristiin-
validoinnin tuloksena saatu funktion arvo on pieni molemmissa tapauksissa. Se
tarkoittaa, että kun ennustusvirheiden keskiarvo on pieni, malli kuvaa oikein
suurimman osan otoksesta toimintaa.
Palaten yleiseen lineaariseen regressiokoodiin ja kuvaan 3, voidaan katsoa,
että siellä vastemuuttuja on ”rahatulot” ja riippumaton muuttuja ”bruttotulot”.
Seuraava koodi vastaa lineaarista regressiomallia:
# Function of linear regression
reg = linear_model.LinearRegression()
reg.fit(df[['bruttotulot']],df.rahatulot)
# Linear regression results
plt.scatter(df.bruttotulot,df.rahatulot, color = 'dark red', marker=
'*')
plt.plot(df.bruttotulot,reg.predict(df[['bruttotulot']]),color =
'black')
predicted_rahatulot = reg.predict(df[['bruttotulot']])
# Gradient or slope
gradient = reg.coef_
# It is intercept
intercept = reg.intercept_
r2 = r2_score(df.rahatulot,predicted_rahatulot)
mse = mean_squared_error(df.rahatulot,predicted_rahatulot)
plt.show()
Esimerkkikoodi 8. ”Rahatulot – bruttotulot”-malli.
24
On huomattava, että muuttujaparien riippuvuudet “rahatulot-bruttotulot” ja “brut-
totulot-tuotannontulot” näyttävät samankaltaisia tuloksia lineaarisessa regressi-
oanalyysissä.
Kuva 6. Tuotannontulojen ja bruttotulojen välisen lineaarisen regression
tulokset.
Kuva 7. Bruttotulojen ja rahatulojen välisen lineaarisen regression tulokset.
Se tarkoittaa, että menetelmä toimii yhdenmukaisesti monessa tapauksessa.
Näiden tuloksien perusteella voidaan todeta, että lopullisen lineaarisen regres-
sion tuloksen yhtälöt näyttävät seuraavilta.
1) Muuttujat “rahatulot – bruttotulot”:
y = 1,14x + (−9,26) = 1,14𝑥 − 9,26
2) Muuttujat “bruttotulot – tuotannontulot”:
y = 0,58x + 1,88
25
Jatkettiin analyysiä tarkastelemalla muuttujaparia "bruttotulot – tuotannontulot”.
Jaetaan aineisto kahteen osaan ja opetetaan malli toisella osista. Yksi osa
toimii testijoukkona, ja toinen osa on opetusjoukko. (27.) Esimerkkikoodi 9 näyt-
tää tähän tarvittavan ohjelmakoodin:
# Linear regression model
model = LinearRegression()
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=1/3, random_state=0)
model.fit(X_train, y_train)
# Visualization of the training program
visual_train = plt
visual_train.scatter(X_train, y_train, color='red')
visual_train.plot(X_train, model.predict(X_train), color='blue')
visual_train.title('Bruttotulot-tuotannontulot (Training set)')
visual_train.xlabel('tuotannontulot')
visual_train.ylabel('bruttotulot')
visual_train.show()
# Visualization of the test program
visual_test = plt
visual_test.scatter(X_test, y_test, color='red')
visual_test.plot(X_train, model.predict(X_train), color='blue')
visual_test.title('Bruttotulot-tuotannontulot (Test set)')
visual_test.xlabel('tuotannontulot')
visual_test.ylabel('bruttotulot')
visual_test.show()
Esimerkkikoodi 9. ”Bruttotulot – tuotannontulot”-mallin opettaminen.
26
Kuva 8. Tuotannontulojen ja bruttotulojen välinen lineaarinen riippuvuus
testijoukosta laskettuna.
27
Kuva 9. Tuotannontulojen ja bruttotulojen välinen lineaarinen riippuvuus ope-
tusjoukosta laskettuna.
Molemmat harjoituskaaviot ovat hyvin samanlaisia. Tämä viittaa siihen, että
merkittävää ylioppimista ei olisi tapahtunut.
6 Visualisointi
Tutkimustulosten visualisointi koostuu lineaarisen regressiokaavioiden luomi-
sesta Spyder IDE:ssä Matplotlib-käsittelykirjaston avulla. Matplotlib-ohjelmisto-
kirjastolla on ratkaiseva rooli tietojen visualisoinnissa. Esimerkkikoodi 10 osoit-
taa sen käytön:
28
# Linear regression results
plt.scatter(df.bruttotulot,df.rahatulot, color = 'dark red', marker=
'*')
plt.plot(df.bruttotulot,reg.predict(df[['bruttotulot']]),color =
'black')
predicted_rahatulot = reg.predict(df[['bruttotulot']])
# Gradient or slope
gradient = reg.coef_
# It is intercept
intercept = reg.intercept_
r2 = r2_score(df.rahatulot,predicted_rahatulot)
mse = mean_squared_error(df.rahatulot,predicted_rahatulot)
plt.show()
Esimerkkikoodi 10. ”Rahatulot – bruttotulot”-mallin kaavion koodi.
Lisäksi oli tehty residuaalikuvia, jotka näyttävät ennustusvirheiden jakauman.
Kuva 10. Rahatulojen lineaarisen regression kaavio ja residuaalikuvia.
29
Residuualikuvion koodi on esimerkkikoodin 11 mukainen:
model = ols('rahatulot ~ bruttotulot', data=df).fit()
# Get model summary
print(model.summary())
# Define figure size
fig = plt.figure(figsize=(12,8))
# Produce residual plots
fig = sm.graphics.plot_regress_exog(model, 'bruttotulot', fig=fig)
Esimerkkikoodi 11. Residuualikuvion koodi.
Tämä koodi edellytti ohjelmointikirjaston “statsmodel” käyttöönottoa seuraavan
mukaisesti:
import statsmodels.api as sm
from statsmodels.formula.api import ols
Esimerkkikoodi 12. Statsmodel.api ohjelmointikirjaston-käyttö.
30
Kuva 11. Rahatulojen regressionmallin tulokset.
Jäännökset eli residuaalit vastaavat havaittujen ja ennustettujen arvojen eroa.
Niin kutsutut jäännöskaaviot osoittavat, kuinka luotettava regressiomalli on.
Tässä tapauksessa voimme päätellä, että lineaarinen malli on luotettava. Jään-
nökset jakautuvat lineaarisen regressiolinjan mukaisesti. Tämä vahvistaa sen,
että kuten edellä todettiin, lineaarinen regressioyhtälö osoittaa saavuttaa kor-
kean 𝑟2-arvon eli regressiomallin selitysosuuden. Tulokset osoittavat, että malli,
joka koskee bruttotulojen ja rahatulojen välistä riippuvuutta, kattaa yli 98 pro-
senttia varianssista. Katsottaessa muuttujaparia ”bruttotulot – tuotannontulot”
malli kattaa yli 70 prosenttia varianssista.
31
7 Työkalujen arviointi
Insinöörityön ensimmäinen päätavoite oli Python-sovelluksen luominen gini-ker-
toimien välisen lineaarisen riippuvuuden arvioimiseksi. Ratkaiseva rooli tässä
tapauksessa oli lineaarisen regressiomallin rakentaminen. Toinen päätavoite oli
Python-työkalujen käyttämisen arviointi. Tämä koskee pääasiallisesti Python-
ohjelmointiympäristöä ja -käsittelykirjastoja.
Mikään työn vaihe ei aiheuttanut erityisiä vaikeuksia. Kaiken kaikkiaan Spyder
IDE-, MySQL- ja Python-ohjelmistokehysten yhdistelmä on tuottanut hyviä ja
odotettuja tuloksia.
Tutkimukseen tarvittavien tietojen etsiminen oli melko vaikeaa. Tässä suh-
teessa Tilastokeskuksesta saadut tiedot auttoivat suuresti. MySQL:n valinta
osoittautui hyödylliseksi myös tämän ohjelmistoympäristön yksinkertaisuuden ja
nopeuden vuoksi. Insinöörityö näytti, että pandas-käsittelykirjasto on ihanteelli-
nen tällaisiin tutkimuksiin. Voidaan myös todeta Spyderin soveltuvan hyvin tä-
mänkaltaisiin tilanteisiin. Visualisointi suoritettiin onnistuneesti käyttämällä
matplotlib-käsittelykirjastoa. Spyderissä suoritettu lineaarinen regressiomalli
toimi hyvin ja antoi hyväksyttävän tuloksen.
Voidaan yleistää, että työssä käytettyjen työkalujen yhdistelmä osoittautui on-
nistuneeksi. Mallin testaamiseksi tehtiin residuaalikuvia ja ristinvalidointia. Täl-
laisen ensikosketuksen koneoppimisprojektin tulokset voidaan ekstrapoloida ko-
neoppimisprosessien tutkimuksen laajempaan käytäntöön kaikessa monimuo-
toisuudessaan. Insinöörityö on osoittanut, että Python on ihanteellinen koneop-
pimisen alalla työskentelyyn, myös ensikosketuksena.
8 Yhteenveto
Yhteenvetona edellä mainitusta voidaan todeta, että työssä asetetut tavoitteet
saavutettiin onnistuneesti. Ohjelma (sovellus), jonka avulla voidaan arvioida gini
32
-kertoimien välistä suhdetta, on luotu. Tämän ohjelman kehittämisen aikana
käytettyjä Python -työkaluja on kokeiltu ja arvioitu.
Tämän tutkimuksen perusteella voidaan luoda lähestymistapoja koneoppimisen
prosessien ymmärtämiseen sekä ratkaista ohjelmointitehtäviä lineaarisen reg-
ressiomenetelmän avulla ja suorittaa erilaisia sosioekonomisia laskelmia.
33
Lähteet
1 D. Pyle and C. San Jose. An executive’s guide to machine learning. / McKinsey Quarterly. June 2015.
2 M. Lutz. Learning Python. Published by O'Reilly Media. Canada, Sebasto-
pol, 2013.
3 F. Pedregosa, G. Varoquaux, A. Gramfort. Scikit-learn: Machine Learning
in Python. /Journal of Machine Learning Research 12 (2011).
4 M. Morhi, A. Rostamizadeh, A. Talwalker. Foundations of Machine Lear-
ning (second edition). The MIT Press. Cambridge, Massachusetts, Lon-don, 2018.
5 NASA, Google, FB, Netflix – What Do They Have In Common? Verkkoai-neisto. https://thelead.io/data-science/companies-that-uses-python Luettu 15.9.2021.
6 Burks A. W., Goldstine H. H., Neumann J. Preliminary Discussion of the
Logical Design of an Electronic Computing Instrument. — Institute for Ad-vanced Study, Princeton, N. J., July 1946.
7 S.B. Kotsiantis. Decision trees: a recent overview. Artificial Intelligence Re-view volume 39, 2013, pages 261–283.
8 F. Provost, B. Kohavi. Guest Editors’ Introduction: On Applied Research in Machine Learning. Machine Learning, 30, 127–132. Boston, Netherlands, 1998.
9 E. Alpaydin. Introduction to machin learning. Cambridge, Massachusetts.
The MIT Press, 2020.
10 P. Harrington. Machine Learning in Action. Manning Publications Co.3 Le-
wis Street Greenwich, CT, United States, 2012.
11 Koneoppiminen. Verkkoaineisto. https://fi.wikipedia.org/wiki/Koneoppimi-
nen Luettu 20.9.2021.
12 Tilastolliset menetelmät: Lineaarinen regressioanalyysi. Verkkoaineisto.
http://math.aalto.fi/opetus/sovtodb/oppikirja/Regranal.pdf Luettu 15.9.2021.
34
13 Käytettävissä olevat rahatulot. Verkkoaineisto.
https://www.stat.fi/meta/kas/kaytettavissa_o.html Luettu 30.9.2021.
14 Kock, N.; Lynn, G. S. (2012). "Lateral collinearity and misleading results in
variance-based SEM: An illustration and recommendations" (PDF). Jour-nal of the Association for Information Systems. 13 (7): 546–580.
15 Logistinen regressio. Verkkoaineisto. https://fi.wikipedia.org/wiki/Logisti-nen_regressio Luettu 1.10.2021.
16 A. L. Samuel. Some Studies in Machine Learning Using the Game of Checkers. IBM Journal of Research and Development ( Volume: 3, Issue: 3, July 1959). p. 210-229.
17 J. S. Raikwal, Kanak Saxena. Performance Evaluation of SVM and K-
Nearest Neighbor Algorithm over Medical Data set. / International Journal of Computer Applications (0975 – 8887). Volume 50 – No.14, July 2012.
18 S. Madeh Piryonesi, Tamer E. El-Diraby. Role of Data Analytics in Inf-rastructure Asset Management: Overcoming Data Size and Quality Prob-lems (англ.) // Journal of Transportation Engineering, Part B: Pavements. — 2020-06. — Vol. 146, iss. 2.
19 Bing Zhang, Zhiyang Liu, Yanguo Jia, Jiadong Ren and Xiaolin Zhao. Net-work Intrusion Detection Method Based on PCA and Bayes Algorithm. Re-search Article | Open Access. Volume 2018 |Article ID 1914980.
20 Best Relational Databases. Verkkoaineisto. https://www.g2.com/catego-
ries/relational-databases Luettu 3.10.2021.
21 Gini-kertoimet (%) Suomessa 1966–2018. Verkkoaineisto.
https://www.stat.fi/til/tjt/2018/01/tjt_2018_01_2020-03-10_tau_001_fi.html Luettu 16.9.2021.
22 "Gini Coefficient". United Nations Development Program. 2012. Archived from the original on 12 July 2014.
23 Hillebrand, Evan (June 2009). "Poverty, Growth, and Inequality over the Next 50 Years" (PDF). FAO, United Nations – Economic and Social Deve-lopment Department. Archived from the original (PDF) on 20 October 2017.
24 Varma, Sudhir; Simon, Richard (2006). "Bias in error estimation when using cross-validation for model selection". BMC Bioinformatics. 7: 91. doi:10.1186/1471-2105-7-91.
35
25 Philip Herron. Cython: Python to native code // Linux Format. — 2014. —
№ 12 / LXF191. — P. 84-87.
26 Matplotlib. Version 3.4.3. Verkkoaineisto. https://matplot-
lib.org/stable/thirdpartypackages/index.html Luettu 26.10.2021.
27 Microservices Series(Part 2) The predict salaries service. Verkkoaineisto.
https://medium.com/@cealer/microservices-series-part-2-the-predict-sala-ries-service-89c92bc763b0 Luettu 15.10.2021.
Liite 1
1 (1)
Liite 2
1 (1)