from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2023-05-02 / Aki Taanila
Useimmat koneoppimisen mallit eivät pysty käyttämään kategorisia muuttujia selittävinä muuttujina. Voin kuitenkin muuntaa kategoriset muuttujat dummy-muuttujiksi, joita malleissa voi käyttää selittävinä muuttujina.
import pandas as pd
# Avaan datan
df = pd.read_excel('https://taanila.fi/data1.xlsx')
df.head()
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 38 | 1 | 1.0 | 22.0 | 3587 | 3 | 3.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN |
1 | 2 | 1 | 29 | 2 | 2.0 | 10.0 | 2963 | 1 | 5.0 | 2 | 1 | 3 | NaN | NaN | NaN | NaN |
2 | 3 | 1 | 30 | 1 | 1.0 | 7.0 | 1989 | 3 | 4.0 | 1 | 1 | 3 | 1.0 | NaN | NaN | NaN |
3 | 4 | 1 | 36 | 2 | 1.0 | 14.0 | 2144 | 3 | 3.0 | 3 | 3 | 3 | 1.0 | NaN | NaN | NaN |
4 | 5 | 1 | 24 | 1 | 2.0 | 4.0 | 2183 | 2 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN |
# Teen koulutus-muuttujasta dummy-muuttujat pandas-kirjaston get_dummies -toiminnolla
# prefix-parametri määrittää dummy-muuttujien nimen alkuosan
df1 = pd.get_dummies(data=df, columns=['koulutus'], prefix='k')
df1
nro | sukup | ikä | perhe | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | k_1.0 | k_2.0 | k_3.0 | k_4.0 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 38 | 1 | 22.0 | 3587 | 3 | 3.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN | 1 | 0 | 0 | 0 |
1 | 2 | 1 | 29 | 2 | 10.0 | 2963 | 1 | 5.0 | 2 | 1 | 3 | NaN | NaN | NaN | NaN | 0 | 1 | 0 | 0 |
2 | 3 | 1 | 30 | 1 | 7.0 | 1989 | 3 | 4.0 | 1 | 1 | 3 | 1.0 | NaN | NaN | NaN | 1 | 0 | 0 | 0 |
3 | 4 | 1 | 36 | 2 | 14.0 | 2144 | 3 | 3.0 | 3 | 3 | 3 | 1.0 | NaN | NaN | NaN | 1 | 0 | 0 | 0 |
4 | 5 | 1 | 24 | 1 | 4.0 | 2183 | 2 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN | 0 | 1 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
77 | 78 | 1 | 22 | 1 | 0.0 | 1598 | 4 | 4.0 | 4 | 3 | 4 | NaN | 1.0 | 1.0 | NaN | 0 | 0 | 1 | 0 |
78 | 79 | 1 | 33 | 1 | 2.0 | 1638 | 1 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN | 1 | 0 | 0 | 0 |
79 | 80 | 1 | 27 | 1 | 7.0 | 2612 | 3 | 4.0 | 3 | 3 | 3 | 1.0 | NaN | 1.0 | NaN | 0 | 1 | 0 | 0 |
80 | 81 | 1 | 35 | 2 | 16.0 | 2808 | 3 | 4.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN | 0 | 1 | 0 | 0 |
81 | 82 | 2 | 35 | 2 | 15.0 | 2183 | 3 | 4.0 | 4 | 3 | 4 | 1.0 | NaN | NaN | NaN | 0 | 0 | 1 | 0 |
82 rows × 19 columns
Kutakin kolutuksen arvoa vastaavat muuttujat löytyvät datan oikeasta reunasta. Muuttujat ovat dikotomisia eli dummy-muuttujia, joiden arvoina ovat 0 ja 1. Muuttujan nimen loppuosa kertoo, mitä kategorisen muuttujan arvoa kyseinen dummy-muuttuja vastaa.
# Tässä tallennan "hölmösti" useamman arvosanan samaan soluun
df2 = pd.DataFrame({
'Nimi':['Mikko', 'Liisa', 'Veli', 'Tuukka', 'Eeva', 'Kaija'],
'Arvosana':['4,2,3','3,1,2', '3,5,5', '2,4,4', '5,2,5', '3,3,3']})
df2
Nimi | Arvosana | |
---|---|---|
0 | Mikko | 4,2,3 |
1 | Liisa | 3,1,2 |
2 | Veli | 3,5,5 |
3 | Tuukka | 2,4,4 |
4 | Eeva | 5,2,5 |
5 | Kaija | 3,3,3 |
# Edellisestä saan dummy-muuttujat seuraavasti
dummies = df2['Arvosana'].str.get_dummies(',')
# Yhdistän (concat) alkuperäisen datan ja Arvosana-muuttujasta tehdyt dummy-muuttujat
df3 = pd.concat([df2, dummies], axis=1)
df3
Nimi | Arvosana | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|---|
0 | Mikko | 4,2,3 | 0 | 1 | 1 | 1 | 0 |
1 | Liisa | 3,1,2 | 1 | 1 | 1 | 0 | 0 |
2 | Veli | 3,5,5 | 0 | 0 | 1 | 0 | 1 |
3 | Tuukka | 2,4,4 | 0 | 1 | 0 | 1 | 0 |
4 | Eeva | 5,2,5 | 0 | 1 | 0 | 0 | 1 |
5 | Kaija | 3,3,3 | 0 | 0 | 1 | 0 | 0 |
# Voin toki muuntaa "hölmösti" samaan soluun syötetyt arvosanat erillisiksi arvosanoiksi
df4 = pd.DataFrame(df2['Arvosana'].str.split(',', expand=True))
df4.columns=['matikka', 'fyssa', 'kemia']
df4
matikka | fyssa | kemia | |
---|---|---|---|
0 | 4 | 2 | 3 |
1 | 3 | 1 | 2 |
2 | 3 | 5 | 5 |
3 | 2 | 4 | 4 |
4 | 5 | 2 | 5 |
5 | 3 | 3 | 3 |
#Yhdistän arvosanat df3-dataframeen
df5 = pd.concat([df3, df4], axis=1)
df5
Nimi | Arvosana | 1 | 2 | 3 | 4 | 5 | matikka | fyssa | kemia | |
---|---|---|---|---|---|---|---|---|---|---|
0 | Mikko | 4,2,3 | 0 | 1 | 1 | 1 | 0 | 4 | 2 | 3 |
1 | Liisa | 3,1,2 | 1 | 1 | 1 | 0 | 0 | 3 | 1 | 2 |
2 | Veli | 3,5,5 | 0 | 0 | 1 | 0 | 1 | 3 | 5 | 5 |
3 | Tuukka | 2,4,4 | 0 | 1 | 0 | 1 | 0 | 2 | 4 | 4 |
4 | Eeva | 5,2,5 | 0 | 1 | 0 | 0 | 1 | 5 | 2 | 5 |
5 | Kaija | 3,3,3 | 0 | 0 | 1 | 0 | 0 | 3 | 3 | 3 |
Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/