from datetime import datetime
print(f'Päivitetty {datetime.now()}')
Päivitetty 2022-09-11 13:08:40.192717
Koneoppimisen malleissa käytettävän datan osalta on huomioitava:
Tämä muistio sisältää esimerkkejä yllä mainittujen seikkojen hoitamiseen.
import numpy as np
import pandas as pd
# Avaan esimerkeissä käytettävän datan
df = pd.read_excel('https://taanila.fi/data1.xlsx')
# Kaikki rivit ja sarakkeet näytetään
pd.options.display.max_rows = None
pd.options.display.max_columns = None
# Datan muuttujat listana
df.columns
Index(['nro', 'sukup', 'ikä', 'perhe', 'koulutus', 'palveluv', 'palkka', 'johto', 'työtov', 'työymp', 'palkkat', 'työteht', 'työterv', 'lomaosa', 'kuntosa', 'hieroja'], dtype='object')
# Tietoa muuttujista
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 82 entries, 0 to 81 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 nro 82 non-null int64 1 sukup 82 non-null int64 2 ikä 82 non-null int64 3 perhe 82 non-null int64 4 koulutus 81 non-null float64 5 palveluv 80 non-null float64 6 palkka 82 non-null int64 7 johto 82 non-null int64 8 työtov 81 non-null float64 9 työymp 82 non-null int64 10 palkkat 82 non-null int64 11 työteht 82 non-null int64 12 työterv 47 non-null float64 13 lomaosa 20 non-null float64 14 kuntosa 9 non-null float64 15 hieroja 22 non-null float64 dtypes: float64(7), int64(9) memory usage: 10.4 KB
Puuttuvat arvot voin hoitaa kahdella tavalla:
Puuttuvia arvoja sisältävät rivit voin poistaa dropna()-toiminnolla:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
Puuttuvia arvoja voin täydentää fillna()-toiminnolla:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
Katson ensin dataa värjäämällä puuttuvat arvot:
df.style.highlight_null()
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.000000 | 22.000000 | 3587 | 3 | 3.000000 | 3 | 3 | 3 | nan | nan | nan | nan |
1 | 2 | 1 | 29 | 2 | 2.000000 | 10.000000 | 2963 | 1 | 5.000000 | 2 | 1 | 3 | nan | nan | nan | nan |
2 | 3 | 1 | 30 | 1 | 1.000000 | 7.000000 | 1989 | 3 | 4.000000 | 1 | 1 | 3 | 1.000000 | nan | nan | nan |
3 | 4 | 1 | 36 | 2 | 1.000000 | 14.000000 | 2144 | 3 | 3.000000 | 3 | 3 | 3 | 1.000000 | nan | nan | nan |
4 | 5 | 1 | 24 | 1 | 2.000000 | 4.000000 | 2183 | 2 | 3.000000 | 2 | 1 | 2 | 1.000000 | nan | nan | nan |
5 | 6 | 2 | 31 | 2 | 2.000000 | 14.000000 | 1910 | 4 | 4.000000 | 5 | 2 | 4 | 1.000000 | 1.000000 | nan | nan |
6 | 7 | 1 | 49 | 1 | 2.000000 | 16.000000 | 2066 | 3 | 5.000000 | 4 | 2 | 2 | nan | nan | 1.000000 | nan |
7 | 8 | 1 | 55 | 1 | 1.000000 | 0.000000 | 2066 | 3 | 5.000000 | 3 | 1 | 3 | 1.000000 | nan | nan | nan |
8 | 9 | 1 | 40 | 2 | 1.000000 | 23.000000 | 2768 | 2 | 4.000000 | 4 | 2 | 4 | nan | 1.000000 | nan | nan |
9 | 10 | 1 | 33 | 1 | 1.000000 | 16.000000 | 2106 | 3 | 2.000000 | 1 | 1 | 1 | 1.000000 | nan | nan | nan |
10 | 11 | 1 | 39 | 2 | 1.000000 | 22.000000 | 2651 | 3 | 5.000000 | 3 | 1 | 3 | nan | nan | nan | nan |
11 | 12 | 1 | 40 | 2 | 3.000000 | 21.000000 | 2846 | 3 | 5.000000 | 3 | 1 | 2 | nan | 1.000000 | nan | 1.000000 |
12 | 13 | 1 | 35 | 2 | 3.000000 | 15.000000 | 2808 | 3 | 5.000000 | 3 | 1 | 4 | nan | 1.000000 | nan | nan |
13 | 14 | 1 | 58 | 2 | 3.000000 | 21.000000 | 3587 | 4 | 5.000000 | 4 | 1 | 3 | nan | nan | nan | nan |
14 | 15 | 1 | 53 | 2 | 3.000000 | 12.000000 | 3393 | 4 | 4.000000 | 4 | 4 | 4 | nan | 1.000000 | nan | nan |
15 | 16 | 2 | 42 | 2 | 3.000000 | 23.000000 | 2691 | 3 | 3.000000 | 3 | 3 | 3 | 1.000000 | nan | nan | 1.000000 |
16 | 17 | 1 | 26 | 1 | 4.000000 | 2.000000 | 5225 | 5 | 5.000000 | 5 | 4 | 5 | nan | nan | 1.000000 | nan |
17 | 18 | 2 | 38 | 2 | 3.000000 | 17.000000 | 2729 | 4 | 3.000000 | 4 | 2 | 1 | nan | nan | nan | nan |
18 | 19 | 1 | 42 | 1 | 3.000000 | 20.000000 | 2925 | 2 | 3.000000 | 4 | 1 | 4 | 1.000000 | nan | nan | 1.000000 |
19 | 20 | 2 | 40 | 2 | 2.000000 | 13.000000 | 2457 | 3 | 3.000000 | 4 | 3 | 2 | 1.000000 | nan | nan | 1.000000 |
20 | 21 | 2 | 40 | 2 | 3.000000 | 20.000000 | 2691 | 2 | 4.000000 | 5 | 3 | 4 | nan | nan | nan | nan |
21 | 22 | 1 | 47 | 2 | 3.000000 | 17.000000 | 4874 | 2 | 4.000000 | 3 | 2 | 4 | nan | 1.000000 | nan | nan |
22 | 23 | 1 | 44 | 2 | 1.000000 | 27.000000 | 3510 | 4 | 4.000000 | 4 | 4 | 4 | nan | 1.000000 | nan | nan |
23 | 24 | 1 | 36 | 1 | 3.000000 | 7.000000 | 4446 | 3 | 4.000000 | 3 | 4 | 5 | nan | nan | nan | nan |
24 | 25 | 1 | 43 | 2 | 3.000000 | 1.000000 | 2925 | 4 | 4.000000 | 4 | 4 | 4 | nan | 1.000000 | nan | nan |
25 | 26 | 1 | 26 | 1 | 2.000000 | 3.000000 | 1521 | 2 | 4.000000 | 2 | 1 | 3 | 1.000000 | nan | 1.000000 | 1.000000 |
26 | 27 | 1 | 26 | 1 | 2.000000 | 2.000000 | 1989 | 2 | 4.000000 | 2 | 2 | 3 | 1.000000 | nan | nan | 1.000000 |
27 | 28 | 2 | 56 | 1 | 1.000000 | 15.000000 | 2223 | 3 | 4.000000 | 3 | 2 | 4 | 1.000000 | nan | nan | 1.000000 |
28 | 29 | 1 | 47 | 2 | 2.000000 | 23.000000 | 2808 | 2 | 4.000000 | 3 | 1 | 4 | 1.000000 | nan | nan | nan |
29 | 30 | 1 | 21 | 1 | nan | nan | 1949 | 4 | 4.000000 | 3 | 3 | 2 | 1.000000 | nan | nan | nan |
30 | 31 | 1 | 21 | 1 | 3.000000 | 1.000000 | 2340 | 4 | 5.000000 | 3 | 4 | 2 | 1.000000 | nan | 1.000000 | 1.000000 |
31 | 32 | 1 | 45 | 2 | 1.000000 | 24.000000 | 2925 | 4 | 4.000000 | 4 | 3 | 4 | nan | 1.000000 | nan | nan |
32 | 33 | 1 | 59 | 2 | 3.000000 | 15.000000 | 6278 | 4 | 4.000000 | 5 | 4 | 4 | nan | 1.000000 | nan | nan |
33 | 34 | 1 | 37 | 2 | 1.000000 | 14.000000 | 2183 | 1 | 5.000000 | 1 | 1 | 2 | 1.000000 | nan | nan | 1.000000 |
34 | 35 | 1 | 28 | 2 | 2.000000 | 5.000000 | 1989 | 3 | 4.000000 | 3 | 3 | 3 | 1.000000 | nan | 1.000000 | 1.000000 |
35 | 36 | 1 | 31 | 2 | 3.000000 | 0.000000 | 1559 | 2 | 4.000000 | 3 | 1 | 3 | 1.000000 | nan | nan | nan |
36 | 37 | 2 | 56 | 2 | 2.000000 | 17.000000 | 2729 | 5 | 5.000000 | 5 | 5 | 5 | nan | nan | nan | 1.000000 |
37 | 38 | 1 | 50 | 2 | 1.000000 | 1.000000 | 2027 | 5 | 5.000000 | 4 | 1 | 4 | 1.000000 | 1.000000 | nan | nan |
38 | 39 | 1 | 30 | 1 | 2.000000 | 10.000000 | 2300 | 3 | 5.000000 | 3 | 3 | 4 | nan | nan | nan | nan |
39 | 40 | 1 | 32 | 1 | 1.000000 | 3.000000 | 2106 | 1 | 5.000000 | 4 | 1 | 3 | 1.000000 | nan | nan | nan |
40 | 41 | 1 | 33 | 2 | 3.000000 | 9.000000 | 2846 | 3 | 3.000000 | 4 | 2 | 3 | 1.000000 | nan | nan | nan |
41 | 42 | 1 | 29 | 1 | 2.000000 | 6.000000 | 2534 | 3 | 4.000000 | 3 | 1 | 2 | 1.000000 | nan | nan | nan |
42 | 43 | 2 | 40 | 2 | 3.000000 | 12.000000 | 2144 | 4 | 4.000000 | 4 | 4 | 4 | nan | 1.000000 | nan | nan |
43 | 44 | 1 | 30 | 1 | 2.000000 | 7.000000 | 2223 | 2 | 3.000000 | 4 | 1 | 3 | 1.000000 | nan | nan | 1.000000 |
44 | 45 | 1 | 55 | 2 | 1.000000 | 35.000000 | 2651 | 4 | 5.000000 | 4 | 2 | 4 | 1.000000 | nan | nan | 1.000000 |
45 | 46 | 2 | 51 | 2 | 1.000000 | 28.000000 | 1989 | 3 | 3.000000 | 2 | 2 | 3 | 1.000000 | nan | nan | 1.000000 |
46 | 47 | 2 | 22 | 1 | 3.000000 | 21.000000 | 1872 | 3 | 3.000000 | 4 | 1 | 3 | nan | nan | 1.000000 | nan |
47 | 48 | 1 | 34 | 2 | 1.000000 | 18.000000 | 2183 | 4 | 5.000000 | 4 | 1 | 3 | nan | nan | nan | nan |
48 | 49 | 1 | 27 | 2 | 2.000000 | 7.000000 | 2729 | 4 | 4.000000 | 3 | 3 | 5 | nan | nan | 1.000000 | nan |
49 | 50 | 1 | 29 | 1 | 3.000000 | 7.000000 | 2340 | 3 | 4.000000 | 3 | 2 | 3 | 1.000000 | nan | nan | nan |
50 | 51 | 2 | 39 | 2 | 2.000000 | 10.000000 | 2106 | 4 | 5.000000 | 5 | 4 | 5 | nan | 1.000000 | nan | nan |
51 | 52 | 1 | 41 | 2 | 1.000000 | 18.000000 | 2261 | 5 | 5.000000 | 5 | 2 | 5 | nan | 1.000000 | nan | nan |
52 | 53 | 1 | 44 | 2 | 1.000000 | 3.000000 | 1989 | 1 | 2.000000 | 2 | 1 | 1 | 1.000000 | nan | nan | nan |
53 | 54 | 1 | 25 | 1 | 2.000000 | 1.000000 | 1559 | 2 | 4.000000 | 3 | 1 | 2 | 1.000000 | nan | nan | nan |
54 | 55 | 2 | 45 | 2 | 1.000000 | 17.000000 | 2417 | 3 | 5.000000 | 4 | 3 | 3 | nan | nan | nan | 1.000000 |
55 | 56 | 2 | 31 | 2 | 1.000000 | 6.000000 | 1949 | 4 | 4.000000 | 4 | 3 | 3 | 1.000000 | nan | nan | 1.000000 |
56 | 57 | 1 | 61 | 2 | 2.000000 | 36.000000 | 3119 | 2 | nan | 2 | 1 | 5 | 1.000000 | nan | nan | 1.000000 |
57 | 58 | 1 | 38 | 2 | 2.000000 | nan | 2574 | 2 | 3.000000 | 1 | 1 | 2 | 1.000000 | nan | nan | 1.000000 |
58 | 59 | 1 | 20 | 1 | 2.000000 | 1.000000 | 2261 | 3 | 4.000000 | 3 | 2 | 3 | nan | nan | nan | nan |
59 | 60 | 1 | 31 | 1 | 1.000000 | 10.000000 | 2144 | 4 | 4.000000 | 3 | 1 | 3 | 1.000000 | nan | nan | nan |
60 | 61 | 1 | 44 | 1 | 1.000000 | 19.000000 | 2183 | 2 | 2.000000 | 1 | 1 | 2 | 1.000000 | nan | nan | nan |
61 | 62 | 1 | 40 | 2 | 1.000000 | 0.000000 | 1872 | 2 | 3.000000 | 1 | 2 | 3 | 1.000000 | nan | nan | nan |
62 | 63 | 2 | 51 | 2 | 2.000000 | 10.000000 | 1872 | 4 | 3.000000 | 2 | 2 | 3 | 1.000000 | nan | nan | nan |
63 | 64 | 2 | 44 | 1 | 2.000000 | 1.000000 | 1715 | 4 | 4.000000 | 3 | 2 | 3 | 1.000000 | nan | nan | 1.000000 |
64 | 65 | 2 | 35 | 2 | 2.000000 | 17.000000 | 2691 | 4 | 4.000000 | 5 | 2 | 4 | 1.000000 | nan | nan | 1.000000 |
65 | 66 | 2 | 37 | 2 | 1.000000 | 16.000000 | 2027 | 5 | 5.000000 | 5 | 4 | 5 | 1.000000 | 1.000000 | nan | nan |
66 | 67 | 1 | 37 | 2 | 4.000000 | 8.000000 | 5069 | 3 | 4.000000 | 3 | 2 | 2 | 1.000000 | 1.000000 | nan | 1.000000 |
67 | 68 | 1 | 33 | 2 | 3.000000 | 7.000000 | 2417 | 2 | 4.000000 | 3 | 1 | 4 | nan | nan | nan | nan |
68 | 69 | 1 | 28 | 2 | 2.000000 | 1.000000 | 3510 | 4 | 5.000000 | 3 | 1 | 4 | nan | nan | nan | nan |
69 | 70 | 1 | 52 | 2 | 2.000000 | 22.000000 | 3119 | 3 | 4.000000 | 3 | 2 | 2 | 1.000000 | 1.000000 | nan | 1.000000 |
70 | 71 | 1 | 34 | 2 | 2.000000 | 1.000000 | 2495 | 3 | 5.000000 | 5 | 3 | 4 | nan | 1.000000 | nan | nan |
71 | 72 | 1 | 46 | 2 | 2.000000 | 23.000000 | 3470 | 3 | 5.000000 | 5 | 3 | 4 | nan | 1.000000 | nan | nan |
72 | 73 | 2 | 40 | 2 | 3.000000 | 2.000000 | 2027 | 5 | 3.000000 | 4 | 3 | 4 | 1.000000 | nan | nan | nan |
73 | 74 | 1 | 45 | 2 | 1.000000 | 20.000000 | 2846 | 3 | 5.000000 | 1 | 1 | 3 | 1.000000 | nan | nan | nan |
74 | 75 | 1 | 40 | 1 | 1.000000 | 1.000000 | 1949 | 1 | 5.000000 | 1 | 1 | 1 | 1.000000 | nan | nan | nan |
75 | 76 | 1 | 37 | 1 | 2.000000 | 15.000000 | 1598 | 1 | 5.000000 | 1 | 1 | 1 | 1.000000 | nan | nan | nan |
76 | 77 | 1 | 39 | 1 | 2.000000 | 22.000000 | 2183 | 4 | 5.000000 | 3 | 1 | 2 | nan | nan | nan | nan |
77 | 78 | 1 | 22 | 1 | 3.000000 | 0.000000 | 1598 | 4 | 4.000000 | 4 | 3 | 4 | nan | 1.000000 | 1.000000 | nan |
78 | 79 | 1 | 33 | 1 | 1.000000 | 2.000000 | 1638 | 1 | 3.000000 | 2 | 1 | 2 | 1.000000 | nan | nan | nan |
79 | 80 | 1 | 27 | 1 | 2.000000 | 7.000000 | 2612 | 3 | 4.000000 | 3 | 3 | 3 | 1.000000 | nan | 1.000000 | nan |
80 | 81 | 1 | 35 | 2 | 2.000000 | 16.000000 | 2808 | 3 | 4.000000 | 3 | 3 | 3 | nan | nan | nan | nan |
81 | 82 | 2 | 35 | 2 | 3.000000 | 15.000000 | 2183 | 3 | 4.000000 | 4 | 3 | 4 | 1.000000 | nan | nan | nan |
Esimerkkidatassa neljän viimeisen sarakkeen osalta puuttuvia arvoja sisältävien rivien poistaminen ei tule kyseeseen, koska dataa ei tämän jälkeen jäisi jäljelle.
Seuraavassa poistan rivit, joilla on puuttuvia arvoja muuttujissa 'koulutus', 'työtov' ja 'palveluv' sekä täydennän neljän viimeisen muuttujan puuttuvat arvot nolliksi. Näin toimimalla menetän datasta 3 riviä.
df1 = df.dropna(subset=['koulutus', 'työtov', 'palveluv'])
df1 = df1.fillna({'työterv':0, 'lomaosa':0, 'kuntosa':0, 'hieroja':0})
# Katson kuinka monta riviä jäi jäljelle
df1.shape[0]
79
Seuraavassa täydennän kaikki puuttuvat arvot, jolloin dataan jää alkuperäinen määrä rivejä. Eri muuttujille käytän erilaisia korvaamismenetelmiä (mediaani, keskiarvo, 0).
df2 = df.fillna({'koulutus': df['koulutus'].median(),
'työtov': df['työtov'].mean(),
'palveluv': df['palveluv'].mean(),
'työterv':0, 'lomaosa':0, 'kuntosa':0, 'hieroja':0})
# Katson kuinka monta riviä jäi jäljelle
df2.shape[0]
82
Pandas-kirjaston get_dummies-toiminto muuntaa kategoriset muuttujat dummy-muuttujiksi.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html
Esimerkiksi sukup-muuttuja saa arvoja 1 (mies) ja 2 (nainen). get_dummies-toiminto tekee sukup-muuttujasta muuttujat sukup_1 ja sukup_2. Jos kyseessä on mies, niin sukup_1-muuttujan arvo on 1. Jos kyseessä on nainen, niin sukup_2-muuttujan arvo on 1.
Seuraavassa muunnan sukup-, perhe- ja koulutus-muuttujat dummy-muuttujiksi:
df_dummies = pd.get_dummies(data=df2, columns=['sukup', 'perhe', 'koulutus'])
# Katson datan muuttujat
df_dummies.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 82 entries, 0 to 81 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 nro 82 non-null int64 1 ikä 82 non-null int64 2 palveluv 82 non-null float64 3 palkka 82 non-null int64 4 johto 82 non-null int64 5 työtov 82 non-null float64 6 työymp 82 non-null int64 7 palkkat 82 non-null int64 8 työteht 82 non-null int64 9 työterv 82 non-null float64 10 lomaosa 82 non-null float64 11 kuntosa 82 non-null float64 12 hieroja 82 non-null float64 13 sukup_1 82 non-null uint8 14 sukup_2 82 non-null uint8 15 perhe_1 82 non-null uint8 16 perhe_2 82 non-null uint8 17 koulutus_1.0 82 non-null uint8 18 koulutus_2.0 82 non-null uint8 19 koulutus_3.0 82 non-null uint8 20 koulutus_4.0 82 non-null uint8 dtypes: float64(6), int64(7), uint8(8) memory usage: 9.1 KB
Jos muuttujat ovat suuruusluokaltaan erilaisia, niin muuttujien skaalauksella voidaan joissain tapauksissa päästä parempiin malleihin. Standardointi on paljon käytetty skaalausmenetelmä. Standardoinnissa muuttujan arvot muunnetaan normaalijakauman z-pisteiksi. Z-piste ilmoittaa kuinka monen keskihajonnan päässä muuttujan arvo on kaikkien arvojen keskiarvosta.
Standardoinnin voin toteuttaa sklearn.preprocessing-kirjastosta tuodulla StandardScaler-toiminnolla.
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# Tässä standardoin iän, palkan ja palveluvuodet
df2[['ikä', 'palkka', 'palveluv']] = pd.DataFrame(scaler.fit_transform(df2[['ikä', 'palkka', 'palveluv']]))
df2
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 0.005022 | 1 | 1.0 | 1.136570 | 1.212007 | 3 | 3.000000 | 3 | 3 | 3 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 2 | 1 | -0.921468 | 2 | 2.0 | -0.251607 | 0.472806 | 1 | 5.000000 | 2 | 1 | 3 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 3 | 1 | -0.818525 | 1 | 1.0 | -0.598651 | -0.681010 | 3 | 4.000000 | 1 | 1 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
3 | 4 | 1 | -0.200865 | 2 | 1.0 | 0.211119 | -0.497394 | 3 | 3.000000 | 3 | 3 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
4 | 5 | 1 | -1.436184 | 1 | 2.0 | -0.945695 | -0.451194 | 2 | 3.000000 | 2 | 1 | 2 | 1.0 | 0.0 | 0.0 | 0.0 |
5 | 6 | 2 | -0.715581 | 2 | 2.0 | 0.211119 | -0.774594 | 4 | 4.000000 | 5 | 2 | 4 | 1.0 | 1.0 | 0.0 | 0.0 |
6 | 7 | 1 | 1.137398 | 1 | 2.0 | 0.442481 | -0.589794 | 3 | 5.000000 | 4 | 2 | 2 | 0.0 | 0.0 | 1.0 | 0.0 |
7 | 8 | 1 | 1.755058 | 1 | 1.0 | -1.408421 | -0.589794 | 3 | 5.000000 | 3 | 1 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
8 | 9 | 1 | 0.210908 | 2 | 1.0 | 1.252251 | 0.241806 | 2 | 4.000000 | 4 | 2 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
9 | 10 | 1 | -0.509695 | 1 | 1.0 | 0.442481 | -0.542410 | 3 | 2.000000 | 1 | 1 | 1 | 1.0 | 0.0 | 0.0 | 0.0 |
10 | 11 | 1 | 0.107965 | 2 | 1.0 | 1.136570 | 0.103206 | 3 | 5.000000 | 3 | 1 | 3 | 0.0 | 0.0 | 0.0 | 0.0 |
11 | 12 | 1 | 0.210908 | 2 | 3.0 | 1.020888 | 0.334206 | 3 | 5.000000 | 3 | 1 | 2 | 0.0 | 1.0 | 0.0 | 1.0 |
12 | 13 | 1 | -0.303808 | 2 | 3.0 | 0.326800 | 0.289191 | 3 | 5.000000 | 3 | 1 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
13 | 14 | 1 | 2.063887 | 2 | 3.0 | 1.020888 | 1.212007 | 4 | 5.000000 | 4 | 1 | 3 | 0.0 | 0.0 | 0.0 | 0.0 |
14 | 15 | 1 | 1.549171 | 2 | 3.0 | -0.020244 | 0.982191 | 4 | 4.000000 | 4 | 4 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
15 | 16 | 2 | 0.416795 | 2 | 3.0 | 1.252251 | 0.150591 | 3 | 3.000000 | 3 | 3 | 3 | 1.0 | 0.0 | 0.0 | 1.0 |
16 | 17 | 1 | -1.230298 | 1 | 4.0 | -1.177058 | 3.152407 | 5 | 5.000000 | 5 | 4 | 5 | 0.0 | 0.0 | 1.0 | 0.0 |
17 | 18 | 2 | 0.005022 | 2 | 3.0 | 0.558163 | 0.195606 | 4 | 3.000000 | 4 | 2 | 1 | 0.0 | 0.0 | 0.0 | 0.0 |
18 | 19 | 1 | 0.416795 | 1 | 3.0 | 0.905207 | 0.427791 | 2 | 3.000000 | 4 | 1 | 4 | 1.0 | 0.0 | 0.0 | 1.0 |
19 | 20 | 2 | 0.210908 | 2 | 2.0 | 0.095437 | -0.126609 | 3 | 3.000000 | 4 | 3 | 2 | 1.0 | 0.0 | 0.0 | 1.0 |
20 | 21 | 2 | 0.210908 | 2 | 3.0 | 0.905207 | 0.150591 | 2 | 4.000000 | 5 | 3 | 4 | 0.0 | 0.0 | 0.0 | 0.0 |
21 | 22 | 1 | 0.931511 | 2 | 3.0 | 0.558163 | 2.736607 | 2 | 4.000000 | 3 | 2 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
22 | 23 | 1 | 0.622681 | 2 | 1.0 | 1.714977 | 1.120791 | 4 | 4.000000 | 4 | 4 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
23 | 24 | 1 | -0.200865 | 1 | 3.0 | -0.598651 | 2.229592 | 3 | 4.000000 | 3 | 4 | 5 | 0.0 | 0.0 | 0.0 | 0.0 |
24 | 25 | 1 | 0.519738 | 2 | 3.0 | -1.292740 | 0.427791 | 4 | 4.000000 | 4 | 4 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
25 | 26 | 1 | -1.230298 | 1 | 2.0 | -1.061377 | -1.235410 | 2 | 4.000000 | 2 | 1 | 3 | 1.0 | 0.0 | 1.0 | 1.0 |
26 | 27 | 1 | -1.230298 | 1 | 2.0 | -1.177058 | -0.681010 | 2 | 4.000000 | 2 | 2 | 3 | 1.0 | 0.0 | 0.0 | 1.0 |
27 | 28 | 2 | 1.858001 | 1 | 1.0 | 0.326800 | -0.403810 | 3 | 4.000000 | 3 | 2 | 4 | 1.0 | 0.0 | 0.0 | 1.0 |
28 | 29 | 1 | 0.931511 | 2 | 2.0 | 1.252251 | 0.289191 | 2 | 4.000000 | 3 | 1 | 4 | 1.0 | 0.0 | 0.0 | 0.0 |
29 | 30 | 1 | -1.745014 | 1 | 2.0 | 0.000000 | -0.728394 | 4 | 4.000000 | 3 | 3 | 2 | 1.0 | 0.0 | 0.0 | 0.0 |
30 | 31 | 1 | -1.745014 | 1 | 3.0 | -1.292740 | -0.265210 | 4 | 5.000000 | 3 | 4 | 2 | 1.0 | 0.0 | 1.0 | 1.0 |
31 | 32 | 1 | 0.725625 | 2 | 1.0 | 1.367932 | 0.427791 | 4 | 4.000000 | 4 | 3 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
32 | 33 | 1 | 2.166831 | 2 | 3.0 | 0.326800 | 4.399808 | 4 | 4.000000 | 5 | 4 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
33 | 34 | 1 | -0.097922 | 2 | 1.0 | 0.211119 | -0.451194 | 1 | 5.000000 | 1 | 1 | 2 | 1.0 | 0.0 | 0.0 | 1.0 |
34 | 35 | 1 | -1.024411 | 2 | 2.0 | -0.830014 | -0.681010 | 3 | 4.000000 | 3 | 3 | 3 | 1.0 | 0.0 | 1.0 | 1.0 |
35 | 36 | 1 | -0.715581 | 2 | 3.0 | -1.408421 | -1.190395 | 2 | 4.000000 | 3 | 1 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
36 | 37 | 2 | 1.858001 | 2 | 2.0 | 0.558163 | 0.195606 | 5 | 5.000000 | 5 | 5 | 5 | 0.0 | 0.0 | 0.0 | 1.0 |
37 | 38 | 1 | 1.240341 | 2 | 1.0 | -1.292740 | -0.635994 | 5 | 5.000000 | 4 | 1 | 4 | 1.0 | 1.0 | 0.0 | 0.0 |
38 | 39 | 1 | -0.818525 | 1 | 2.0 | -0.251607 | -0.312594 | 3 | 5.000000 | 3 | 3 | 4 | 0.0 | 0.0 | 0.0 | 0.0 |
39 | 40 | 1 | -0.612638 | 1 | 1.0 | -1.061377 | -0.542410 | 1 | 5.000000 | 4 | 1 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
40 | 41 | 1 | -0.509695 | 2 | 3.0 | -0.367288 | 0.334206 | 3 | 3.000000 | 4 | 2 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
41 | 42 | 1 | -0.921468 | 1 | 2.0 | -0.714333 | -0.035394 | 3 | 4.000000 | 3 | 1 | 2 | 1.0 | 0.0 | 0.0 | 0.0 |
42 | 43 | 2 | 0.210908 | 2 | 3.0 | -0.020244 | -0.497394 | 4 | 4.000000 | 4 | 4 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
43 | 44 | 1 | -0.818525 | 1 | 2.0 | -0.598651 | -0.403810 | 2 | 3.000000 | 4 | 1 | 3 | 1.0 | 0.0 | 0.0 | 1.0 |
44 | 45 | 1 | 1.755058 | 2 | 1.0 | 2.640428 | 0.103206 | 4 | 5.000000 | 4 | 2 | 4 | 1.0 | 0.0 | 0.0 | 1.0 |
45 | 46 | 2 | 1.343284 | 2 | 1.0 | 1.830658 | -0.681010 | 3 | 3.000000 | 2 | 2 | 3 | 1.0 | 0.0 | 0.0 | 1.0 |
46 | 47 | 2 | -1.642071 | 1 | 3.0 | 1.020888 | -0.819610 | 3 | 3.000000 | 4 | 1 | 3 | 0.0 | 0.0 | 1.0 | 0.0 |
47 | 48 | 1 | -0.406752 | 2 | 1.0 | 0.673844 | -0.451194 | 4 | 5.000000 | 4 | 1 | 3 | 0.0 | 0.0 | 0.0 | 0.0 |
48 | 49 | 1 | -1.127355 | 2 | 2.0 | -0.598651 | 0.195606 | 4 | 4.000000 | 3 | 3 | 5 | 0.0 | 0.0 | 1.0 | 0.0 |
49 | 50 | 1 | -0.921468 | 1 | 3.0 | -0.598651 | -0.265210 | 3 | 4.000000 | 3 | 2 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
50 | 51 | 2 | 0.107965 | 2 | 2.0 | -0.251607 | -0.542410 | 4 | 5.000000 | 5 | 4 | 5 | 0.0 | 1.0 | 0.0 | 0.0 |
51 | 52 | 1 | 0.313851 | 2 | 1.0 | 0.673844 | -0.358794 | 5 | 5.000000 | 5 | 2 | 5 | 0.0 | 1.0 | 0.0 | 0.0 |
52 | 53 | 1 | 0.622681 | 2 | 1.0 | -1.061377 | -0.681010 | 1 | 2.000000 | 2 | 1 | 1 | 1.0 | 0.0 | 0.0 | 0.0 |
53 | 54 | 1 | -1.333241 | 1 | 2.0 | -1.292740 | -1.190395 | 2 | 4.000000 | 3 | 1 | 2 | 1.0 | 0.0 | 0.0 | 0.0 |
54 | 55 | 2 | 0.725625 | 2 | 1.0 | 0.558163 | -0.173994 | 3 | 5.000000 | 4 | 3 | 3 | 0.0 | 0.0 | 0.0 | 1.0 |
55 | 56 | 2 | -0.715581 | 2 | 1.0 | -0.714333 | -0.728394 | 4 | 4.000000 | 4 | 3 | 3 | 1.0 | 0.0 | 0.0 | 1.0 |
56 | 57 | 1 | 2.372717 | 2 | 2.0 | 2.756109 | 0.657606 | 2 | 4.061728 | 2 | 1 | 5 | 1.0 | 0.0 | 0.0 | 1.0 |
57 | 58 | 1 | 0.005022 | 2 | 2.0 | 0.000000 | 0.011991 | 2 | 3.000000 | 1 | 1 | 2 | 1.0 | 0.0 | 0.0 | 1.0 |
58 | 59 | 1 | -1.847958 | 1 | 2.0 | -1.292740 | -0.358794 | 3 | 4.000000 | 3 | 2 | 3 | 0.0 | 0.0 | 0.0 | 0.0 |
59 | 60 | 1 | -0.715581 | 1 | 1.0 | -0.251607 | -0.497394 | 4 | 4.000000 | 3 | 1 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
60 | 61 | 1 | 0.622681 | 1 | 1.0 | 0.789525 | -0.451194 | 2 | 2.000000 | 1 | 1 | 2 | 1.0 | 0.0 | 0.0 | 0.0 |
61 | 62 | 1 | 0.210908 | 2 | 1.0 | -1.408421 | -0.819610 | 2 | 3.000000 | 1 | 2 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
62 | 63 | 2 | 1.343284 | 2 | 2.0 | -0.251607 | -0.819610 | 4 | 3.000000 | 2 | 2 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
63 | 64 | 2 | 0.622681 | 1 | 2.0 | -1.292740 | -1.005594 | 4 | 4.000000 | 3 | 2 | 3 | 1.0 | 0.0 | 0.0 | 1.0 |
64 | 65 | 2 | -0.303808 | 2 | 2.0 | 0.558163 | 0.150591 | 4 | 4.000000 | 5 | 2 | 4 | 1.0 | 0.0 | 0.0 | 1.0 |
65 | 66 | 2 | -0.097922 | 2 | 1.0 | 0.442481 | -0.635994 | 5 | 5.000000 | 5 | 4 | 5 | 1.0 | 1.0 | 0.0 | 0.0 |
66 | 67 | 1 | -0.097922 | 2 | 4.0 | -0.482970 | 2.967607 | 3 | 4.000000 | 3 | 2 | 2 | 1.0 | 1.0 | 0.0 | 1.0 |
67 | 68 | 1 | -0.509695 | 2 | 3.0 | -0.598651 | -0.173994 | 2 | 4.000000 | 3 | 1 | 4 | 0.0 | 0.0 | 0.0 | 0.0 |
68 | 69 | 1 | -1.024411 | 2 | 2.0 | -1.292740 | 1.120791 | 4 | 5.000000 | 3 | 1 | 4 | 0.0 | 0.0 | 0.0 | 0.0 |
69 | 70 | 1 | 1.446228 | 2 | 2.0 | 1.136570 | 0.657606 | 3 | 4.000000 | 3 | 2 | 2 | 1.0 | 1.0 | 0.0 | 1.0 |
70 | 71 | 1 | -0.406752 | 2 | 2.0 | -1.292740 | -0.081594 | 3 | 5.000000 | 5 | 3 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
71 | 72 | 1 | 0.828568 | 2 | 2.0 | 1.252251 | 1.073407 | 3 | 5.000000 | 5 | 3 | 4 | 0.0 | 1.0 | 0.0 | 0.0 |
72 | 73 | 2 | 0.210908 | 2 | 3.0 | -1.177058 | -0.635994 | 5 | 3.000000 | 4 | 3 | 4 | 1.0 | 0.0 | 0.0 | 0.0 |
73 | 74 | 1 | 0.725625 | 2 | 1.0 | 0.905207 | 0.334206 | 3 | 5.000000 | 1 | 1 | 3 | 1.0 | 0.0 | 0.0 | 0.0 |
74 | 75 | 1 | 0.210908 | 1 | 1.0 | -1.292740 | -0.728394 | 1 | 5.000000 | 1 | 1 | 1 | 1.0 | 0.0 | 0.0 | 0.0 |
75 | 76 | 1 | -0.097922 | 1 | 2.0 | 0.326800 | -1.144195 | 1 | 5.000000 | 1 | 1 | 1 | 1.0 | 0.0 | 0.0 | 0.0 |
76 | 77 | 1 | 0.107965 | 1 | 2.0 | 1.136570 | -0.451194 | 4 | 5.000000 | 3 | 1 | 2 | 0.0 | 0.0 | 0.0 | 0.0 |
77 | 78 | 1 | -1.642071 | 1 | 3.0 | -1.408421 | -1.144195 | 4 | 4.000000 | 4 | 3 | 4 | 0.0 | 1.0 | 1.0 | 0.0 |
78 | 79 | 1 | -0.509695 | 1 | 1.0 | -1.177058 | -1.096810 | 1 | 3.000000 | 2 | 1 | 2 | 1.0 | 0.0 | 0.0 | 0.0 |
79 | 80 | 1 | -1.127355 | 1 | 2.0 | -0.598651 | 0.057006 | 3 | 4.000000 | 3 | 3 | 3 | 1.0 | 0.0 | 1.0 | 0.0 |
80 | 81 | 1 | -0.303808 | 2 | 2.0 | 0.442481 | 0.289191 | 3 | 4.000000 | 3 | 3 | 3 | 0.0 | 0.0 | 0.0 | 0.0 |
81 | 82 | 2 | -0.303808 | 2 | 3.0 | 0.326800 | -0.451194 | 3 | 4.000000 | 4 | 3 | 4 | 1.0 | 0.0 | 0.0 | 0.0 |
Poikkeavina arvoina voidaan pitää arvoja, jotka olisivat normaalijakaumassa epätodennäköisiä. Tällaisia arvoja sisältävien rivien poistaminen voi joissain tapauksissa parantaa mallia. Poikkeavien arvojen poistamisen mielekkyys riippuu monista seikoista ja on harkittava kussakin tapauksessa erikseen.
Poistaminen voidaan tehdä z-pisteiden (standardoitujen arvojen) perusteella. Z-piste ilmoittaa kuinka monen keskihajonnan päässä arvo on kaikkien arvojen keskiarvosta. Usein rajana käytetään arvoa 3: jos muuttujan arvo on yli kolmen keskihajonnan päässä keskiarvosta, niin se poistetaan.
Lisätietoa poikkeavien arvojen poistamisesta:
https://stackoverflow.com/questions/23199796/detect-and-exclude-outliers-in-pandas-data-frame
Seuraavassa lasken normaalijakauman todennäköisyyden itseisarvoltaan yli kolmen (3) suuruisille z-pisteille:
from scipy import stats
print('Todennäköisyys sille, että arvo on yli kolmen keskihajonnan päässä keskiarvostaan',
2*stats.norm.cdf(-3))
Todennäköisyys sille, että arvo on yli kolmen keskihajonnan päässä keskiarvostaan 0.0026997960632601866
Edellä standardoin df2:n palkan. Katsotaan viisi suurinta ja pienintä z-pistettä:
df2['palkka'].nlargest(n=5)
32 4.399808 16 3.152407 66 2.967607 21 2.736607 23 2.229592 Name: palkka, dtype: float64
df2['palkka'].nsmallest(n=5)
25 -1.235410 35 -1.190395 53 -1.190395 75 -1.144195 77 -1.144195 Name: palkka, dtype: float64
Yllä olevan mukaisesti poistettavaksi joutuisivat kaksi suurinta palkkaa, joiden z-pisteet ovat suurempia kuin 3.
Poistaminen sujuu yhdellä koodirivillä. Seuraava koodi toimii vaikka z-pisteitä ei olisi dataan ennestään laskettukaan:
df3 = df2[(np.abs(stats.zscore(df2))<3).all(axis=1)]
# Katson kuinka monta riviä jäi jäljelle
df3.shape[0]
80
Tässä tapauksessa poikkeavien arvojen poistaminen johti ainoastaan kahden rivin poistamiseen.
Jos olet tottunut käyttämään lambdaa, niin edellisen voi tehdä myös seuraavasti (tässä lasken z-pisteet ilman stats.zscore()-toimintoa):
df4 = df2[df2.apply(lambda x: np.abs(x-x.mean())/x.std()<3).all(axis = 1)]
# Katson kuinka monta riviä jäi jäljelle
df4.shape[0]
80
Muuttujien normaalijakaumasta poikkeavia jakaumia on mahdollista korjata lähemmäksi normaalijakaumaa muuttujien muunnoksilla. Paljon käytetty muunnos vinon jakauman korjaamiseen on logaritmien ottaminen.
Seuraavassa muunnan palkka-muuttujan arvot logaritmeikseen. Histogrammilla voin nopeasti tarkistaa korjaantuiko jakauma lähemmäksi normaalijakaumaa.
df['palkka_log'] = np.log(df['palkka'])
# Katsotaan muuuttujien histogrammit
df[['palkka', 'palkka_log']].hist()
array([[<AxesSubplot:title={'center':'palkka'}>, <AxesSubplot:title={'center':'palkka_log'}>]], dtype=object)
Logaritmia ei voi ottaa nollasta. Tämän vuoksi esimerkkidatan palveluvuosiin en voi käyttää logaritmimuunnosta. Jos lisään palveluvuosiin yhden vuoden (jolloin muuttuja ilmoittaa kuinka monetta vuotta henkilö palvelee yrityksessä), niin logaritmimuunnos onnistuu:
df['palveluv_log'] = np.log(df['palveluv']+1)
df[['palveluv', 'palveluv_log']].hist()
array([[<AxesSubplot:title={'center':'palveluv'}>, <AxesSubplot:title={'center':'palveluv_log'}>]], dtype=object)
Muuttujien muunnoksia käytetään eri tarkoituksiin ja muunnokset ovat laaja ja monitahoinen aihe. Logaritmin ohella paljon käytettyjä muunnoksia ovat neliöjuuri, toiseen potenssiin korottaminen, käänteisluku jne.
Luokittelumalleja käytettäessä opetusdata kannattaa tasapainottaa jos jokin luokista on selvästi aliedustettuna. Tasapainottamisen voi tehdä monella tavalla. Katso https://towardsdatascience.com/5-techniques-to-work-with-imbalanced-data-in-machine-learning-80836d45d30c
Helppo tapa tasapainoltukseen on käyttää imbalanced-learn -kirjastoa: https://imbalanced-learn.org/stable/. Kirjaston voi asentaa Anacondaan komentoriviltä (Anaconda prompt) komennolla:
conda install -c conda-forge imbalanced-learn
# Jos df2:n kuntosalin käyttöä mittaava muuttuja olisi kohdemuuttujana
# niin käyttäjien määrä on aliedustettuna
df2['kuntosa'].value_counts()
0.0 73 1.0 9 Name: kuntosa, dtype: int64
# Tuodaan RandomOverSampler
from imblearn.over_sampling import RandomOverSampler
# Selittävät muuttujat
X = df2.drop('kuntosa', axis=1)
# Kohdemuuttuja
y = df2['kuntosa']
# Tasapainotus
ros = RandomOverSampler(random_state=2)
X, y = ros.fit_resample(X, y)
# Tarkistetaan kohdemuuttujan jakauma
pd.DataFrame(y).value_counts()
kuntosa 0.0 73 1.0 73 dtype: int64
Data-analytiikka Pythonilla: https://tilastoapu.wordpress.com/python/