Hetu-paketti suomalaisten henkilötunnusten käsittelyyn

Kategoriat: R package R

Yleistä

Hetu-paketti on tarkoitettu suomalaisten henkilötunnusten algoritmiseen käsittelyyn. Paketista on erityisesti hyötyä, mikäli halutaan poimia informaatiota suuresta määrästä henkilötunnuksia, kuten tunnuksen haltijoiden iät tai sukupuolet. Henkilötunnusten käsittelyyn tarkoitettujen työkalujen kehitystyö alkoi osana sorvi-pakettia, mutta ne eriytettiin omaksi paketikseen vuonna 2013. Syksyllä 2020 hetu-paketti saatettiin julkaisukelpoiseen kuntoon ja se on saatavissa CRANista.

Hetu-paketin esikuvana on toiminut sweidnumbr-paketti ja pakettien käyttämät funktiot on mahdollisuuksien mukaan nimetty samalla tavalla.1

Tämä blogikirjoitus sisältää aluksi yleistietoa suomalaisista henkilötunnuksia. Pelkästään paketin toiminnoista kiinnostuneet voivat siirtyä suoraan käytännön esimerkkejä sisältävään osaan tai tutustua hetu-paketin sisältämään vignette-ohjeeseen (komennolla ‘vignette(“hetu”)’).

Suomalainen henkilötunnus

Henkilötunnus on henkilöiden yksilöintiin tarkoitettu tunnus, joka koostuu syntymäajasta (PP/KK/VV), syntymävuosisataa kuvaavasta merkistä (-, + tai A), yksilönumerosta (NNN) sekä tarkistusmerkistä (C). Käytännössä henkilötunnuksen yksilönumeron avulla pystytään pystytään erottamaan toisistaan samana päivänä syntyneet henkilöt sekä tehdä päätelmiä henkilön sukupuolesta. Naisilla numero on parillinen ja miehillä pariton.2

Henkilötunnusta käytetään laajalti julkisella ja yksityisellä sektorilla. Henkilötunnus toimii usein sen yksilöivyyden vuoksi rekisteritietokannoissa ns. avaimena, jonka avulla rekistereiden sisältämät tietotaulut pystytään yhdistämään tiettyyn käyttäjään ja toisaalta eri rekistereistä löytyvää dataa voidaan yhdistellä toisiinsa.

Henkilötunnus ei sinänsä ole salassapidettävää tietoa, mutta sen, kuten muidenkin henkilötietojen, käsittelyyn liittyy rajoituksia: henkilötunnusta saa käsitellä rekisteröidyn yksiselitteisesti antamalla suostumuksella tai mikäli rekisteröidyn yksiselitteinen yksilöiminen on tärkeää.3 Rajoitukset eivät todennäköisesti ole täysin aiheettomia, sillä henkilötunnusten käyttö ei ole täysin ongelmatonta. Tähän palataan blogin loppupuolella.

Henkilötunnusten algoritminen käsittely hetu-paketilla

Henkilötunnusten sisältämän tiedon käsittely onnistuu melko hyvin ilman mitään apuvälineitä. Syntymäajan ja sukupuolen määrittämiseksi ei tarvitse suorittaa minkäänlaisia laskutoimituksia ja henkilötunnuksen muodon oikeellisuuden arviointi, etenkin päivämäärän, pituuden ja yksilönumeron osalta, onnistuu hyvin silmämääräisestikin. Tarkistusmerkin tarkistaminen ja laskeminen vaatii enemmän vaivaa ja todennäköisesti myös laskimen, kynää ja paperia. Tehtävä on kuitenkin suoritettavissa.

Hetu-paketin suurin hyöty liittyy luonnollisesti tilanteisiin, joissa käsiteltäviä henkilötunnuksia on suuri määrä. Paketin sisältämien funktioiden avulla jopa miljoonista henkilötunnuksista voidaan helposti ja nopeasti poimia seuraavat tiedot:

  • hetu_date / pin_date: syntymäaika
  • hetu_sex / pin_sex: sukupuoli, Male tai Female
  • hetu_age / pin_age: ikä vuosina, kuukausina tai päivinä (kysymishetkellä tai haluttuna ajankohtana)
  • hetu_ctrl / pin_ctrl: henkilötunnuksen validius, TRUE tai FALSE

Henkilötunnuksen oikeellisuus määräytyy sen yksittäisten osien oikeellisuuden perusteella. Jos yksikin henkilötunnuksen osa on vääränlainen (esimerkiksi päivämäärä on muotoa 30/02/01 tai yksilönumero on 000 tai 001), henkilötunnuksessa on jonkinlainen virhe ja sen sisältämien tietojen luotettavuudesta ei voida olla varmoja. Käyttäjä voi halutessaan tulostaa hetu_diagnostic -funktiota käyttämällä diagnostisia tietoja henkilötunnusten yksittäisten osien, kuten päivämäärän, vuosisadan merkin, yksilönumeron, tarkistenumeron, tunnuksen pituuden ym. oikeellisuudesta.

Hetu-paketti mahdollistaa satunnaisesti muodostettujen, tietylle aikavälille osuvien henkilötunnusten generoimisen rhetu-funktiolla. Paketin toiminnallisuuksien testaaminen onnistuu helposti ilman oikeilta ihmisiltä kerättyä aineistoa. Rhetu-funktio mahdollistaa myös ns. keinotekoisten tai väliaikaisten hetujen generoimisen. Keinotekoisia henkilötunnuksia on toisinaan myönnetty organisaatiokohtaisesti henkilöille, joilla ei ole ollut pysyvää suomalaista henkilötunnusta tai joiden henkilöllisyyttä ei ole pystytty varmentamaan. Keinotekoiset henkilötunnukset eroavat varsinaisista henkilötunnuksista siten, että niiden yksilönumero on välillä 900-999. Keinotekoisten henkilötunnusten generoiminen saattaa olla hyödyllistä, mikäli halutaan varmistua että aineistossa ei vahingossakaan ole aitoja henkilötunnuksia.

Henkilötunnuksesta poimittua tietoa voidaan käyttää myös validoimaan ihmisten itse ilmoittamaa tietoa. Rhetu-funktio tuottaa pelkästään valideja henkilötunnuksia, mutta todellisessa aineistossa henkilötunnuksen kirjaamisessa tai tallentamisessa on saattanut tapahtua näppäily- tai lukuvirheitä. Hetu-pakettia voidaankin käyttää validoimaan ihmisistä tallennettujen tietojen laatua tai tehdä vertailua käyttäjien ilmoittamien syntymäaikojen ja henkilötunnuksen syntymäajan välillä.

Suomalaisen henkilötunnuksen tarkistusmerkki on erilaisten lyöntivirheiden kannalta vikaherkkä. Esimerkiksi päivien, kuukausien ja vuosien järjestyksen vaihtuminen tai päivämäärän väärin merkitsemisen tarkistusmerkin pysyessä samana saa sen, että henkilötunnus ei enää mene läpi tarkistuksessa. Esimerkiksi ruotsalaisen henkilötunnuksen tapauksessa päivien ja kuukausien järjestyksen vaihtuminen ei vaikuta tarkistusmerkin laskentaan.4

Hetu-paketin käyttö

Paketin asentaminen R-ympäristöön CRANista:

install.packages("hetu")

Paketin lataaminen kirjastoon ja 2 henkilötunnusta sisältävän esimerkkivektorin asettaminen:

library(hetu)
example_pins <- c("010101-0101", "111111-111C")

Perustietojen tarkastelu hetuja sisältävästä vektorista onnistuu yksinkertaisesti hetu-komennolla, joka tulostaa perusmuodossa data frame -tyyppisen taulukon. Taulukko on tässä esimerkissä muotoiltu hieman kauniimmaksi kable-funktiolla:

knitr::kable(hetu(example_pins))
hetu sex p.num checksum date day month year century valid.pin
010101-0101 Female 010 1 1901-01-01 1 1 1901 - TRUE
111111-111C Male 111 C 1911-11-11 11 11 1911 - TRUE

Taulukon sisältämien tietojen, erityisesti sukupuolen ja päivämäärän, tarkastelu onnistuu joko hetu-funktion extract-parametrin avulla tai siihen erikoistuneiden funktioiden avulla:

example_pins <- c("010101-0101", "111111-111C")
# Hetujen omistajien sukupuolen poiminta
hetu(example_pins, extract = "sex")
## [1] "Female" "Male"
hetu_sex(example_pins)
## [1] "Female" "Male"
# Hetujen sisältämän päivämäärän poimiminen
hetu(example_pins, extract = "date")
## [1] "1901-01-01" "1911-11-11"
hetu_date(example_pins)
## [1] "1901-01-01" "1911-11-11"
# Hetujen oikeellisuuden tarkistus
hetu(example_pins, extract = "valid.pin")
## [1] TRUE TRUE
hetu_ctrl(example_pins)
## [1] TRUE TRUE
# Esimerkki tiedosta, jolle ei löydy erikoistunutta funktiota
hetu(example_pins, extract = "p.num")
## [1] "010" "111"

Muista tiedoista poiketen ikää ei saa suoraan poimittua hetu-funktion extract-parametria käyttämällä. Ikä halutussa aikamääreessä ja haluttuna ajankohtana saadaan hetu_age-funktion avulla. Perusasetus on ikä vuosina kysymisajankohtana, mutta myös ikä kuukausina tai päivinä on mahdollinen.

Tässä esimerkissä käytetään myös rhetu-funktiota, jonka avulla voidaan generoida haluttu määrä keinotekoisia henkilötunnuksia esimerkiksi paketin ominaisuuksien testaamiseksi.

example_pins2 <- rhetu(5, start = "1950-01-01", end = "1995-05-07")
# Ikä vuosina
hetu_age(example_pins2)
## The age in years has been calculated at 2021-01-29.
## [1] 43 52 61 49 31
# Ikä kuukasina
hetu_age(example_pins2, timespan = "months")
## The age in months has been calculated at 2021-01-29.
## [1] 526 630 740 598 381
# Minkä ikäisiä hetujen omistajat olivat 2011 puolivälissä?
hetu_age(example_pins2, date = "2011-01-01")
## The age in years has been calculated at 2011-01-01.
## [1] 33 42 51 39 21
# Visualisointi: laatikkojanakuvaaja sukupuolen mukaan ryhmiteltynä
example_pins3 <- rhetu(20, start = "1950-01-01", end = "1995-05-07", p.male = 0.5)
boxplot(hetu_age(example_pins3)~hetu_sex(example_pins3), xlab = "", ylab = "Ikä vuosina", col=c("gold", "darkgreen"))
## The age in years has been calculated at 2021-01-29.

Joissakin tapauksissa voi olla hyödyllistä tarkastella epävalidien hetujen diagnostiikkatietoa. Tiedot saadaan hetu_diagnostic -funktion avulla, jota demonstroimme monella tavalla virheellisen henkilötunnuksen avulla:

hetu_diagnostic("321399-000G")
##           hetu is.temp valid.p.num valid.checksum correct.checksum valid.date
## 21 321399-000G   FALSE       FALSE          FALSE            FALSE      FALSE
##    valid.day valid.month valid.year valid.length valid.century
## 21     FALSE       FALSE       TRUE         TRUE          TRUE
# Tulosta ainoastaan halutut sarakkeet
hetu_diagnostic("321399-000G", extract = c("valid.p.num", "valid.length"))
##           hetu valid.p.num valid.length
## 21 321399-000G       FALSE         TRUE

Yritys- ja yhteisötunnusten (Y-tunnus) käsittely

Hetu-paketissa on myös sweidnumbr-pakettia vastaavalla tavalla mahdollisuus generoida ja validoida suomalaisia yritys- ja yhteisötunnuksia. Suomalainen Y-tunnus koostuu seitsemästä numerosta, väliviivasta ja tarkistusmerkistä ja on muotoa 1234567-8.5 Y-tunnus on englanniksi Business Identity Code, mistä johtuen tässä paketissa y-tunnusten käsittelyyn tarkoitettujen funktioiden etuliitteenä käytetään lyhennettä bid:

  • bid_ctrl(bid): tarkastaa y-tunnuksen oikeellisuuden, TRUE tai FALSE
  • rbid(n): generoi n kappaletta y-tunnuksia
example_bids <- rbid(2)
example_bids
## [1] "4481699-2" "2368999-8"
bid_ctrl(example_bids)
## [1] TRUE TRUE

Toisin kuin henkilötunnusten tapauksessa, y-tunnuksista ei voida poimia mitään muuta lisäinformaatiota, esimerkiksi yrityksen perustamisajankohtaan tai toimialaan liittyen.

Henkilötunnusten tulevaisuus ja tietoturvallisuus

Henkilötunnusten uudistamisesta on käyty viime vuosina runsaasti julkista keskustelua. Nykymuotoisen henkilötunnuksen ongelmana on pidetty esimerkiksi henkilötunnusten rajallista määrää sekä sitä, että henkilötunnuksesta ilmenee henkilötietoja kuten sukupuoli ja ikä. Toisaalta uudistusta vastaan puhuu julkisen ja yksityisen sektorin toimijoiden tietojärjestelmien päivitysten korkeat kustannukset. Kirjoitushetkellä tuoreimman ehdotuksen mukaan henkilötunnukset olisivat säilymässä tulevaisuudessakin muodoltaan nykyisiä vastaavina sillä erotuksella, että jatkossa vapaana olevat parilliset ja parittomat yksilönumerot jaettaisiin tasaisesti molemmille sukupuolille.6 7

Tietosuojaperiaatteen mukaan henkilötietoja tulisi kerätä ja käsitellä ainoastaan siinä laajuudessa, mikä on tarkoituksenmukaista tai välttämätöntä palvelun käyttötarkoituksen kannalta.8 Tätä taustaa vasten voidaan pitää ongelmallisena, että henkilötunnusten laajamittainen käyttö aiheuttaa vähintäänkin epäsuorasti tilanteen, jossa palvelun tarjoajalla on usein tarpeettomasti hallussaan tietoa käyttäjien iästä ja sukupuolesta.

Käytännössä suuremmat ongelmat koituvat ihmisille kuitenkin tavasta, jolla henkilötunnuksia käytetään suomalaisessa yhteiskunnassa. Vaikka henkilötunnus ei teoriassa ole salassapidettävää tietoa, rikollisella tai muutoin vilpillisellä tavalla toimiva henkilö voi aiheuttaa monenlaista haittaa, mikäli hän saa haltuunsa toisen ihmisen henkilötunnuksen. Henkilötunnusta on saatettu kysyä puhelimitse asioivalta henkilöltä henkilöllisyyden varmistukseksi, ennen kuin hänelle on kerrottu sensitiivisiä potilastietoja. Joskus henkilötunnus saatetaan asettaa verkkopalvelussa uuden käyttäjän ensimmäiseksi salasanaksi, joka jokaisen pitäisi muistaa vaihtaa ensimmäisen kirjautumiskerran jälkeen. On itsestään selvää, että tällaiset käytännöt eivät ole yksilöiden tietosuojan kannalta hyödyllisiä.

Henkilötunnusten epätarkoituksenmukainen käyttö julkisella ja yksityisellä sektorilla on varmasti osaltaan vaikuttanut kansalaisten keskuudessa syntyneisiin käsityksiin henkilötunnusten luonteesta ja tarkoituksesta. Olisi toivottavaa, että viimeistään syksyn 2020 tietovuodot toimisivat sysäyksenä tietoturvallisempien käytäntöjen käyttöönottoon kaikkialla yhteiskunnassa.

Lähdeviitteet


  1. Lisätietoja sweidnumbr-paketista esim. tästä blogikirjoituksesta: Magnusson, Måns & Bülow, Erik. 2015. R made personal (at least for swedes)!. URL: https://ropengov.org/2015/08/r-made-personal-at-least-for-swedes/↩︎

  2. Digi- ja väestötietovirasto. Henkilötunnus. URL: https://dvv.fi/henkilotunnus↩︎

  3. Ks. esim. Finlex. HE 59/2013. URL: https://www.finlex.fi/fi/esitykset/he/2013/20130059↩︎

  4. Teppo Vuoren nettisivuilta löytyy kattavasti erilaisten tarkistusmerkkien laskentamenetelmien kuvaukset: https://tarkistusmerkit.teppovuori.fi/tarkmerk.htm↩︎

  5. Yritys- ja yhteisötietojärjestelmä. Y-tunnus. URL: https://www.ytj.fi/index/y-tunnus.html↩︎

  6. Tuomas Salsteen nettisivuilta löytyy hyvä selvitys henkilötunnuksen historiasta, ongelmakohdista että uudistustyöryhmän kehitysehdotuksista. URL: https://www.tuomas.salste.net/doc/hetu/tunnus.html.↩︎

  7. Yle Uutiset. 2020. Uusi henkilötunnus kaikille Suomen kansalaisille ja Suomessa asuville, ehdottaa työryhmä – jatkossa tunnuksesta ei selviäisi ikä, syntymäaika tai sukupuoli. Julkaistu 8.4.2020, viitattu 23.10.2020. URL: https://yle.fi/uutiset/3-11299218↩︎

  8. Tietosuojavaltuutetun toimisto. Käyttötarkoitussidonnaisuus. Viitattu 26.10.2020. https://tietosuoja.fi/kayttotarkoitussidonnaisuus↩︎