Avainsana-arkisto: Python

Luokiteltu jakauma

Päivitetty 2.10.2017

Tämän artikkelin koodin ohjeineen löydät GitHubista https://github.com/taanila/tilastoapu. Jos kopioit koodia itsellesi, niin kannattaa käyttää GitHubia. Tästä artikkelista kopioidut koodit eivät välttämättä toimi oikein (esimerkiksi sisennykset voivat kopioitua virheellisesti).

Määrällisen muuttujan arvot kannattaa yleensä luokitella ennen frekvenssien laskemista. Pythonilla tämä sujuu pandas-ohjelmakirjaston cut-funktiolla.

Aluksi otan käyttöön pandas-ohjelmakirjaston ja avaan aineiston.

import pandas as pd
df=pd.read_excel('http://www.elisanet.fi/taanila/data1.xlsx', sheetname='Data')

Ennen ikä-muuttujan luokittelua tarkastelen ikää tunnuslukujen valossa:

df['ikä'].describe()

pyluoki1

Huomaan muun muassa, että nuorin on 20-vuotias ja vanhin 61-vuotias. Tältä pohjalta voin miettiä sopivia luokkarajoja. Määritän luokkarajat ja luokkien nimet:

bins = [20, 30, 40, 50, 62]
group_names = ['20-29', '30-39', '40-49', '50-']

Tämän jälkeen määritteleen aineistoon uudet muuttujat (sarakkeet), joiden nimiksi annan luokkarajat ja ikäluokka. Jos right=False niin alarajat kuuluvat luokkaan, mutta ylärajat eivät kuulu. Tämän otin huomioon jo luokkarajojen määrittelyssä asettamalla ylimmän rajan 62-vuoden kohdalle.

df['luokkarajat'] = pd.cut(df['ikä'], bins, right=False)
df['ikäluokka'] = pd.cut(df['ikä'], bins, labels=group_names,right=False)

Voin taulukoida luokkarajat ja niiden frekvenssit crosstab-toiminnolla:

pd.crosstab(df['luokkarajat'],'lkm')

pyluoki3

Luokkarajoissa käytetään matematiikasta tuttua merkintätapaa: hakasulkeen vieressä oleva luku kuuluu luokkaan, mutta kaarisulkeen vieressä oleva luku ei kuulu luokkaan.

Seuraavassa taulukoin ikäluokka-muuttujan frekvenssiprosentit, korvaan vasemman ylänurkan col_0-nimen tyhjällä merkkijonolla ja muotoilen prosenttiluvut yhden desimaalin tarkkuuteen:

df1=pd.crosstab(df['ikäluokka'],'lkm',normalize='columns')
df1.columns.name=''
df1.style.format('{:.1%}')

pyluoki2

Aiemmissa artikkeleissani en ole tainnutkaan määritellä omia funktioita. Nyt korjaan sen puutteen ja määrittelen funktion, joka osaa laskea funktiolle annetuista lähtötiedoista (group) lukumäärän, minimin, maksimin ja keskiarvon. Funktion määrittely aloitetaan sanalla def:

def get_stats(group):
   return {'min': group.min(), 'max': group.max(), 'lkm': group.count(), 'keskiarvo': group.mean()}

Itse määrittelemääni funktiota käyttäen voin kätevästi laskea tunnuslukuja ikäluokittain. Groupby ryhmittelee määrittelemieni ikäluokkien mukaan. Monikäyttöisestä Groupby-toiminnosta tulen kirjoittamaan jossain tulevassa artikkelissani lisää.

df2=df['palkka'].groupby(df['ikäluokka']).apply(get_stats).unstack()

Unstack() hoitaa tunnuslukujen tulostuksen vierekkäin.

Tunnusluvut tulostuvat aakkosjärjestyksessä keskiarvo, lkm, max, min, jollen vartavasten määritä haluamaani järjestystä. Desimaalien määräksi säädän 0.

df2=df2[['lkm','min','max','keskiarvo']] 
df2.style.format('{:.0f}')

Lopputulos näyttää seuraavalta:

pyluoki4

Mainokset

Ristiintaulukointi

Päivitetty 26.9.2017

Tämän artikkelin koodin ohjeineen löydät GitHubista https://github.com/taanila/tilastoapu. Jos kopioit koodia itsellesi, niin kannattaa käyttää GitHubia. Tästä artikkelista kopioidut koodit eivät välttämättä toimi oikein (esimerkiksi sisennykset voivat kopioitua virheellisesti).

Edellisessä artikkelissani Frekvenssitaulukot Exceliin kerroin miten lasket Pythonilla frekvenssitaulukoita. Tässä artikkelissa jatkan frekvenssien laskemista crosstab-toiminnolla, mutta laajennan tarkastelua ristiintaulukointiin.

Aluksi otan käyttöön pandas-ohjelmakirjaston ja avaan aineiston.

import pandas as pd
df=pd.read_excel('http://www.elisanet.fi/taanila/data1.xlsx', sheetname='Data')

Ristiintaulukointi lukumäärinä

Seuraavaksi lasken ristiintaulukoinnin sukupuolen ja koulutuksen välille. Lisäasetuksella margins=True saan taulukkoon rivi- ja sarakesummat.

df1=pd.crosstab(df.sukupuoli, df.koulutus, margins=True)

Koska aineistossani sukupuolen ja koulutuksen arvot ovat numeroina, niin annan niille selväkieliset nimet:

df1.index=['Mies','Nainen','Yhteensä']
df1.columns = ['Peruskoulu', '2. aste', 'Korkeakoulu','Ylempi korkeakoulu','Yhteensä']

Huomaa, että myös rivi- ja sarakesummat täytyy nimetä samalla kuin muuttujien arvotkin (Yhteensä).

Lopuksi tulostan ristiintaulukoinnin näkyviin komennolla df1.

pyristi1

Ristiintaulukointi prosentteina

Voin laskea ristiintaulukointiin prosentit lisäasetuksella normalize=’columns’ (prosentit sarakkeiden summista):

df2=pd.crosstab(df['tyytyväisyys johtoon'], df.sukupuoli, margins=True, normalize='columns')

Huomaa, että välilyöntejä sisältävät muuttujien nimet täytyy laittaa hakasulkeisiin hipsujen/lainausmerkkien väliin ( df[’tyytyväisyys johtoon’] ).

Tässäkin annan muuttujan arvoille selväkieliset nimet:

df2.columns=['Mies','Nainen','Yhteensä']
df2.index=['Erittäin tyytymätön','Tyytymätön','Ei tyytymätön eikä tyytyväinen','Tyytyväinen','Erittäin tyytyväinen']

Prosentit näkyvät desimaalimuodossa ellen varta vasten vaihda muotoilua:

df2.style.format('{:.1%}')

Lopputulos näyttää seuraavalta:

pyristi2

Huomaa, että summarviä ei näytetä sarakeprosentteja käytettäessä.

Useampia muuttujia ristiintaulukointiin

Voin korvata muuttujien arvot selväkielisillä nimillä etukäteen itse aineistoon:

df.sukupuoli.replace([1,2], ['Mies','Nainen'], inplace=True)
df.perhe.replace([1,2], ['Perheetön','Perheellinen'], inplace=True)

Ristiintaulukointiin voin ottaa mukaan useampiakin muuttujia:

df3=pd.crosstab(df['tyytyväisyys johtoon'],[df.sukupuoli,df.perhe], margins=True)

Voin nimetä rivi- ja sarakeotsikoita uudelleen:

df3 = df3.rename(columns={'All': 'Yhteensä'})
 df3=df3.rename(index={'All': 'Yhteensä'})

df3

pyristi3

Useita ristiintaulukointeja for-silmukalla

Ristiintaulukointeja ei tarvitse laskea yksi kerrallaan. For-silmukalla voin tuottaa kaikki  ristiintaulukoinnit kerralla. Harkitsen toki etukäteen mistä kaikesta ristiintaulukointi kannattaa laskea.

Seuraavassa muodostan osa-aineiston niistä muuttujista, joita haluan käyttää ristiintaulukointeihin:

columns=['sukupuoli','perhe','koulutus','tyytyväisyys johtoon', 'tyytyväisyys työtovereihin',
 'tyytyväisyys työympäristöön','tyytyväisyys palkkaan','tyytyväisyys työtehtäviin']
df_osa=pd.DataFrame(df,columns=columns)

Seuraavassa teen kaikki mahdolliset ristiintaulukoinnit sukupuolen kanssa. For-silmukalla voin käydä läpi kaikki df_osa-dataframen muuttujat. Sukupuolta ei voi ristiintaulukoida itsensä kanssa. Tämän takia tarkistan if-lauseella, onko var erisuuri kuin sukupuoli?

for var in df_osa:
   if var!='sukupuoli':
      df4=pd.crosstab(df_osa[var],df_osa.sukupuoli)
      print(df4)

Katsotaan vielä viimeisenä esimerkkinä, miten aineiston kaikki kahden muuttujan väliset ristiintaulukoinnit lasketaan ja kirjoitetaan Exceliin.

writer = pd.ExcelWriter('ristit.xlsx', engine='xlsxwriter')
rivi=0
for var1 in df_osa:
   for var2 in df_osa:
      if var1!=var2:
         df5=pd.crosstab(df_osa[var1],df_osa[var2])
         df5.to_excel(writer, sheet_name='Ristiintaulukoinnit', startrow=rivi)
         rivi=rivi+df5.shape[0]+2

Tallennan Excel-tiedoston:

writer.save()

Frekvenssitaulukot Exceliin

Päivitetty 24.9.2017

Tämän artikkelin koodin ohjeineen löydät GitHubista https://github.com/taanila/tilastoapu

Edellisessä artikkelissani Tunnuslukuja Exceliin kerroin miten lasket Pythonilla käden käänteessä aineiston tunnusluvut ja korrelaatiot ja tallennat tulokset Exceliin. Frekvenssitaulukoiden laskenta edellyttää enemmän Python-taitoja. Frekvenssitaulukot voin laskea Pythonissa monella eri tavalla. Yrityksen ja erehdyksen kautta olen itse päätynyt seuravassa kuvaamaani tapaan, mutta helpompia ja tehokkaampiakin tapoja voi olla olemassa.

Aluksi otan käyttöön pandas-ohjelmakirjaston, avaan aineiston ja alustan ExcelWriterin kirjoittamaan frekvenssit.xlsx -nimiseen tiedostoon. Tämä kaikki on sinulle toivottavasti tuttua jo edellisestä artikkelistani.

import pandas as pd
df=pd.read_excel('http://www.elisanet.fi/taanila/data1.xlsx', sheetname='Data')
writer = pd.ExcelWriter('frekvenssit.xlsx', engine='xlsxwriter')

Seuraavaksi alustan muuttujan rivi arvoksi 0. Tätä muuttujaa tarvitsen osoittaessani mille Excel-taulukon riville tietoja milloinkin kirjoitan. Aloitan arvosta 0, koska Python numeroi rivit alkaen arvosta 0.

rivi=0

Hyödynnän for-toistorakennetta käydäkseni läpi kaikki aineiston muuttujat (sarakkeet). Tällä tavalla toteutettuna voin käyttää ohjelmaa minkä tahansa aineiston kanssa. For-rakenteen aloitan komennolla:

for var in df:

For-rakenne käy läpi yksi kerrallaan kaikki dataframesta df löytyvät muuttujat (sarakkeet). Muuttujan nimen var sijasta olisin voinut käyttää mitä tahansa keksimääni nimeä. Kaksoispiste on pakollinen ja merkitsee for-rakenteen aloitusta. Kaksoispisteen jälkeen kaikki ohjelmarivit, jotka ovat sisennettyjä, sisältyvät for-rakenteeseen. Monissa muissa ohjelmointikielissä for-rakenne lopetetaan erillisellä komennolla, mutta Pythonissa for-rakenne loppuu kun sisennetyt ohjelmarivit loppuvat. Jos kopioit alla olevat rivit suoraan omaan ohjelmaasi, niin muista sisentää rivit. Minä sisällytin for-rakenteeseen seuraavat ohjelmarivit:

df1=pd.crosstab(df[var],'lkm')
df1=df1.assign(prosenttia=df1/df1.sum())
df1.loc['Yhteensä']=df1.sum()
df1.to_excel(writer, sheet_name='Frekvenssit', startrow=rivi)
rivi=rivi+df1.shape[0]+2

Käytän crosstab-toimintoa lukumäärien laskemiseen. Crosstab on tässä kätevä, koska sen tuloksena syntyy dataframe, jonka voin helposti kirjoittaa Excel-taulukkoon. Nimeän syntyvät dataframen nimellä df1.

Assign-toiminnolla lisään df1-dataframeen uuden sarakkeen, johon lasken prosentit. Huomaa, miten kätevästi voin suorittaa laskennan dataframessa.

df1.loc[’Yhteensä’]=df1.sum() lisää df1-dataframen viimeiseksi riviksi summa-rivin.

Seuraavaksi kirjoitan df1-dataframen Frekvenssit-taulukkovälilehdelle alkaen rivi-muuttujan osoittamalta riviltä.

Seuraavaksi kasvatan rivi-muuttujan arvoa, jotta seuraava frekvenssitaulukko kirjoitetaan edellisen alapuolelle siten että väliin jää yksi tyhjä rivi. Dataframen df1 rivimäärän saan selville df1.shape[0] -komennolla. Komento df1.shape[1] kertoisi vastaavasti dataframen df1 sarakkeiden määrän.

Lopuksi vaihdan prosentteja sisältävälle sarakkeelle prosenttimuotoilun. Seuraavia ohjelmarivejä en enää sisennä, koska en halua toistaa niitä jokaisella for-rakenteen toistokerralla:

format = writer.book.add_format({'num_format': '0.0%'})
writer.sheets['Frekvenssit'].set_column('C:C',None, format)

Aluksi lisään writer.book oliolle prosenttimuotoilun, jossa on yksi desimaali. Tämän jälkeen asetan kyseisen muotoilun Frekvenssit-taulukkovälilehden C-sarakkeelle.

Kaiken päätteeksi tietenkin vielä tallennan edellä muodostetun Excelin:

writer.save()

Tämän jälkeen voin avata frekvenssit.xlsx-tiedoston Exceliin ja tutustua aikaansaannokseeeni.

Huomaa, että edellä kuvaamani ohjelma toimii sellaisenaan mille tahansa tilastoaineistolle kunhan vaihdan aineiston avaamiskomennossa tiedostonimen ja polun, josta tiedosto löytyy.

Seuraavassa artikkelissani Ristiintaulukointi lasken crosstab-toiminnolla ristiintaulukointeja.

Tunnuslukuja Exceliin

Päivitetty 18.9.2017

Tämän artikkelin koodin ohjeineen löydät GitHubista https://github.com/taanila/tilastoapu

Vaikka käyttäisit Exceliä, niin jotkin asiat sujuvat nopeammin Pythonin kautta. Seuraavassa kerron, miten lasket Pythonilla tunnuslukuja ja korrelaatioita Excel-aineistosta ja kirjoitat tulokset Excel-tiedostoon. Tämä sujuu hämmästyttävän helposti.

Otan käyttöön Pandas-ohjelmakirjaston ja avaan Excel-tiedoston:

import pandas as pd
df=pd.read_excel('http://www.elisanet.fi/taanila/data1.xlsx', sheetname='Data')

Alustan ExcelWriterin kirjoittamaan uuteen Excel-tiedostoon:

writer = pd.ExcelWriter('tunnusluvut.xlsx', engine='xlsxwriter')

Lasken tunnuslukuja describe()-funktiolla ja kirjoitan tunnusluvut Excel-tiedostoon Tunnusluvut-taulukkovälilehdelle:

df.describe().to_excel(writer, sheet_name='Tunnusluvut')

Lasken korrelaatioita corr()-funktiolla ja kirjoitan korrelaatiot Excel-tiedostoon Korrelaatiot-taulukkovälilehdelle:

df.corr().to_excel(writer, sheet_name='Korrelaatiot')

Lopuksi tallennan Excel-tiedoston:

writer.save()

Tämän jälkeen voin avata Jupyterin oletuskansiosta tunnusluvut.xlsx-tiedoston Exceliin ja hämmästellä mitä sain aikaan näin vähällä vaivalla.

Pythonilla voin myös muotoilla Exceliin kirjoitettavat tiedot ja jopa luoda Excel-kaavioita. Lisätietoa ExcelWriterista: http://xlsxwriter.readthedocs.io/working_with_pandas.html

Seuraavassa artikkelissani Frekvenssitaulukot Exceliin kerron, miten voit laskea aineiston muuttujista frekvenssitaulukot ja kirjoittaa ne Exceliin.

Aineiston avaaminen

Päivitetty 24.9.2017

Tämän artikkelin koodin ohjeineen löydät GitHubista https://github.com/taanila/tilastoapu

Aineisto, joka on jo analysointiin sopivassa muodossa, on helppo avata. Lue lisää analysointiin sopivasta muodosta artikkelista Tilastoaineiston tallentaminen.

Pandas-ohjelmakirjasto sisältää read_excel ja read_csv funktiot Excel- ja csv-aineistojen avaamiseen. Ohjelmakoodissa otan Pandas-ohjelmakirjaston käyttöön komennolla

import pandas as pd

Pelkkä import pandas riittäisi, mutta yleistyneen käytännön mukaisesti määritän lyhennettä pd käytettäväksi pandas-nimen sijasta.

Aineiston luen Dataframe-olioon. Dataframe-olio on tarkoitettu taulukkomuotoisen tiedon tallentamiseen ja käsittelyyn.

Seuraavassa luen Excel-tiedoston sisältämän aineiston. Tiedoston nimi on data1.xlsx ja aineisto löytyy Data-taulukkovälilehdeltä. Aineiston tallennan dataframe-olioksi, jonka nimeksi annan df1.

df1=pd.read_excel('http://www.elisanet.fi/taanila/data1.xlsx', sheetname='Data')

Voin tarkastella dataframeen luettua aineistoa komennolla

df1

Seuraavassa avaan paikalliselta levyltä csv-muotoisen aineiston. Esimerkin tapauksessa aineistossa käytetään pilkkuerottelun sijasta puolipistettä. Tämä on usein tilanne suomalaisilla asetuksilla tallennetuissa csv-tiedostoissa. Lopuksi tulostan aineiston 3 ensimmäistä riviä head()-funktiolla.

df2=pd.read_csv('C:/Users/taaak/data1.csv',delimiter=';')
df2.head(3)

Jos haluat testata, niin löydät csv-aineiston osoitteesta http://www.elisanet.fi/taanila/data1.csv

Aineston avaamisen yhteydessä voin tehdä monia lisäasetuksia. Edellä käytin vain lisäasetuksia sheetname ja delimiter. Lue lisää

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

Seuraavassa artikkelissani Tunnuslukuja Exceliin kerron miten voit laskea aineistosta tilastollisia tunnuslukuja ja korrelaatioita sekä kirjoittaa tulokset Exceliin.

Asenna Anaconda

Päivittty 17.9.2017

Anaconda on valmis paketti Pythonin käyttöön datojen analysoinnissa. Anaconda sisältää kaiken tarvittavan:

  • Python-tulkin.
  • datojen analysointiin tarvittavat ohjelmakirjastot
  • grafiikan luontiin tarvittavat ohjelmakirjastot
  • Jupyter-notebookin ohjelmien testaamiseen ja dokumentointiin.

Anacondan voit asentaa koneellesi vaikka sinulla ei olisikaan koneen pääkäyttäjän oikeuksia.
Asennuspaketin löydät Windowsille, Macille ja Linuxille osoitteesta

https://www.anaconda.com/download/

Asenna uusin versio (tätä kirjoittaessani Python 3.6). Asennuksen voit tehdä oletusvalinnoilla.

Käynnistä Anaconda Navigator -niminen ohjelma. Anaconda Navigatorin kautta voit käynnistää Jupyter-notebookin.

Seuraavassa artikkelissani kirjoitan Jupyter-notebookin käytöstä ohjelmien kirjoittamiseen, testaamiseen ja tallentamiseen.