In [1]:
from datetime import datetime
print(f'Päivitetty {datetime.now()}')
Päivitetty 2022-03-17 19:47:22.786829

Dataan tutustuminen

Datan avaamisen jälkeen kannattaa ensimmäiseksi tutustua dataan. Erityisesti kannattaa kiinnittää huomiota omituisiin tai muista poikkeaviin arvoihin.

In [2]:
# Tuon data-analytiikan peruskirjaston
import pandas as pd

# Luen datan dataframeen
df = pd.read_excel('https://taanila.fi/data1.xlsx')
In [3]:
# Datan rivien ja sarakkeiden lukumäärät
df.shape
Out[3]:
(82, 16)
In [4]:
df
# Huomaa että kaikkia datan rivejä ei näytetä
Out[4]:
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
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
77 78 1 22 1 3.0 0.0 1598 4 4.0 4 3 4 NaN 1.0 1.0 NaN
78 79 1 33 1 1.0 2.0 1638 1 3.0 2 1 2 1.0 NaN NaN NaN
79 80 1 27 1 2.0 7.0 2612 3 4.0 3 3 3 1.0 NaN 1.0 NaN
80 81 1 35 2 2.0 16.0 2808 3 4.0 3 3 3 NaN NaN NaN NaN
81 82 2 35 2 3.0 15.0 2183 3 4.0 4 3 4 1.0 NaN NaN NaN

82 rows × 16 columns

In [5]:
# Jos haluan näyttää kaikki rivit, niin asetan max_rows arvoksi None
# Tuhansien rivien datoilla tätä ei ehkä kannata tehdä
pd.options.display.max_rows = None

# Jos sarakkeita on paljon, niin tarvitsen ehkä vastaavaa asetusta sarakkeille
pd.options.display.max_columns = None
In [6]:
df
# Nyt kaikki rivit näytetään
Out[6]:
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
5 6 2 31 2 2.0 14.0 1910 4 4.0 5 2 4 1.0 1.0 NaN NaN
6 7 1 49 1 2.0 16.0 2066 3 5.0 4 2 2 NaN NaN 1.0 NaN
7 8 1 55 1 1.0 0.0 2066 3 5.0 3 1 3 1.0 NaN NaN NaN
8 9 1 40 2 1.0 23.0 2768 2 4.0 4 2 4 NaN 1.0 NaN NaN
9 10 1 33 1 1.0 16.0 2106 3 2.0 1 1 1 1.0 NaN NaN NaN
10 11 1 39 2 1.0 22.0 2651 3 5.0 3 1 3 NaN NaN NaN NaN
11 12 1 40 2 3.0 21.0 2846 3 5.0 3 1 2 NaN 1.0 NaN 1.0
12 13 1 35 2 3.0 15.0 2808 3 5.0 3 1 4 NaN 1.0 NaN NaN
13 14 1 58 2 3.0 21.0 3587 4 5.0 4 1 3 NaN NaN NaN NaN
14 15 1 53 2 3.0 12.0 3393 4 4.0 4 4 4 NaN 1.0 NaN NaN
15 16 2 42 2 3.0 23.0 2691 3 3.0 3 3 3 1.0 NaN NaN 1.0
16 17 1 26 1 4.0 2.0 5225 5 5.0 5 4 5 NaN NaN 1.0 NaN
17 18 2 38 2 3.0 17.0 2729 4 3.0 4 2 1 NaN NaN NaN NaN
18 19 1 42 1 3.0 20.0 2925 2 3.0 4 1 4 1.0 NaN NaN 1.0
19 20 2 40 2 2.0 13.0 2457 3 3.0 4 3 2 1.0 NaN NaN 1.0
20 21 2 40 2 3.0 20.0 2691 2 4.0 5 3 4 NaN NaN NaN NaN
21 22 1 47 2 3.0 17.0 4874 2 4.0 3 2 4 NaN 1.0 NaN NaN
22 23 1 44 2 1.0 27.0 3510 4 4.0 4 4 4 NaN 1.0 NaN NaN
23 24 1 36 1 3.0 7.0 4446 3 4.0 3 4 5 NaN NaN NaN NaN
24 25 1 43 2 3.0 1.0 2925 4 4.0 4 4 4 NaN 1.0 NaN NaN
25 26 1 26 1 2.0 3.0 1521 2 4.0 2 1 3 1.0 NaN 1.0 1.0
26 27 1 26 1 2.0 2.0 1989 2 4.0 2 2 3 1.0 NaN NaN 1.0
27 28 2 56 1 1.0 15.0 2223 3 4.0 3 2 4 1.0 NaN NaN 1.0
28 29 1 47 2 2.0 23.0 2808 2 4.0 3 1 4 1.0 NaN NaN NaN
29 30 1 21 1 NaN NaN 1949 4 4.0 3 3 2 1.0 NaN NaN NaN
30 31 1 21 1 3.0 1.0 2340 4 5.0 3 4 2 1.0 NaN 1.0 1.0
31 32 1 45 2 1.0 24.0 2925 4 4.0 4 3 4 NaN 1.0 NaN NaN
32 33 1 59 2 3.0 15.0 6278 4 4.0 5 4 4 NaN 1.0 NaN NaN
33 34 1 37 2 1.0 14.0 2183 1 5.0 1 1 2 1.0 NaN NaN 1.0
34 35 1 28 2 2.0 5.0 1989 3 4.0 3 3 3 1.0 NaN 1.0 1.0
35 36 1 31 2 3.0 0.0 1559 2 4.0 3 1 3 1.0 NaN NaN NaN
36 37 2 56 2 2.0 17.0 2729 5 5.0 5 5 5 NaN NaN NaN 1.0
37 38 1 50 2 1.0 1.0 2027 5 5.0 4 1 4 1.0 1.0 NaN NaN
38 39 1 30 1 2.0 10.0 2300 3 5.0 3 3 4 NaN NaN NaN NaN
39 40 1 32 1 1.0 3.0 2106 1 5.0 4 1 3 1.0 NaN NaN NaN
40 41 1 33 2 3.0 9.0 2846 3 3.0 4 2 3 1.0 NaN NaN NaN
41 42 1 29 1 2.0 6.0 2534 3 4.0 3 1 2 1.0 NaN NaN NaN
42 43 2 40 2 3.0 12.0 2144 4 4.0 4 4 4 NaN 1.0 NaN NaN
43 44 1 30 1 2.0 7.0 2223 2 3.0 4 1 3 1.0 NaN NaN 1.0
44 45 1 55 2 1.0 35.0 2651 4 5.0 4 2 4 1.0 NaN NaN 1.0
45 46 2 51 2 1.0 28.0 1989 3 3.0 2 2 3 1.0 NaN NaN 1.0
46 47 2 22 1 3.0 21.0 1872 3 3.0 4 1 3 NaN NaN 1.0 NaN
47 48 1 34 2 1.0 18.0 2183 4 5.0 4 1 3 NaN NaN NaN NaN
48 49 1 27 2 2.0 7.0 2729 4 4.0 3 3 5 NaN NaN 1.0 NaN
49 50 1 29 1 3.0 7.0 2340 3 4.0 3 2 3 1.0 NaN NaN NaN
50 51 2 39 2 2.0 10.0 2106 4 5.0 5 4 5 NaN 1.0 NaN NaN
51 52 1 41 2 1.0 18.0 2261 5 5.0 5 2 5 NaN 1.0 NaN NaN
52 53 1 44 2 1.0 3.0 1989 1 2.0 2 1 1 1.0 NaN NaN NaN
53 54 1 25 1 2.0 1.0 1559 2 4.0 3 1 2 1.0 NaN NaN NaN
54 55 2 45 2 1.0 17.0 2417 3 5.0 4 3 3 NaN NaN NaN 1.0
55 56 2 31 2 1.0 6.0 1949 4 4.0 4 3 3 1.0 NaN NaN 1.0
56 57 1 61 2 2.0 36.0 3119 2 NaN 2 1 5 1.0 NaN NaN 1.0
57 58 1 38 2 2.0 NaN 2574 2 3.0 1 1 2 1.0 NaN NaN 1.0
58 59 1 20 1 2.0 1.0 2261 3 4.0 3 2 3 NaN NaN NaN NaN
59 60 1 31 1 1.0 10.0 2144 4 4.0 3 1 3 1.0 NaN NaN NaN
60 61 1 44 1 1.0 19.0 2183 2 2.0 1 1 2 1.0 NaN NaN NaN
61 62 1 40 2 1.0 0.0 1872 2 3.0 1 2 3 1.0 NaN NaN NaN
62 63 2 51 2 2.0 10.0 1872 4 3.0 2 2 3 1.0 NaN NaN NaN
63 64 2 44 1 2.0 1.0 1715 4 4.0 3 2 3 1.0 NaN NaN 1.0
64 65 2 35 2 2.0 17.0 2691 4 4.0 5 2 4 1.0 NaN NaN 1.0
65 66 2 37 2 1.0 16.0 2027 5 5.0 5 4 5 1.0 1.0 NaN NaN
66 67 1 37 2 4.0 8.0 5069 3 4.0 3 2 2 1.0 1.0 NaN 1.0
67 68 1 33 2 3.0 7.0 2417 2 4.0 3 1 4 NaN NaN NaN NaN
68 69 1 28 2 2.0 1.0 3510 4 5.0 3 1 4 NaN NaN NaN NaN
69 70 1 52 2 2.0 22.0 3119 3 4.0 3 2 2 1.0 1.0 NaN 1.0
70 71 1 34 2 2.0 1.0 2495 3 5.0 5 3 4 NaN 1.0 NaN NaN
71 72 1 46 2 2.0 23.0 3470 3 5.0 5 3 4 NaN 1.0 NaN NaN
72 73 2 40 2 3.0 2.0 2027 5 3.0 4 3 4 1.0 NaN NaN NaN
73 74 1 45 2 1.0 20.0 2846 3 5.0 1 1 3 1.0 NaN NaN NaN
74 75 1 40 1 1.0 1.0 1949 1 5.0 1 1 1 1.0 NaN NaN NaN
75 76 1 37 1 2.0 15.0 1598 1 5.0 1 1 1 1.0 NaN NaN NaN
76 77 1 39 1 2.0 22.0 2183 4 5.0 3 1 2 NaN NaN NaN NaN
77 78 1 22 1 3.0 0.0 1598 4 4.0 4 3 4 NaN 1.0 1.0 NaN
78 79 1 33 1 1.0 2.0 1638 1 3.0 2 1 2 1.0 NaN NaN NaN
79 80 1 27 1 2.0 7.0 2612 3 4.0 3 3 3 1.0 NaN 1.0 NaN
80 81 1 35 2 2.0 16.0 2808 3 4.0 3 3 3 NaN NaN NaN NaN
81 82 2 35 2 3.0 15.0 2183 3 4.0 4 3 4 1.0 NaN NaN NaN
In [7]:
# Datan alkupää. Voin myös määrittää näytettävien rivien määrän, esimerkiksi df.head(10)
df.head()
Out[7]:
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
In [8]:
# Datan loppupää 
df.tail()
Out[8]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
77 78 1 22 1 3.0 0.0 1598 4 4.0 4 3 4 NaN 1.0 1.0 NaN
78 79 1 33 1 1.0 2.0 1638 1 3.0 2 1 2 1.0 NaN NaN NaN
79 80 1 27 1 2.0 7.0 2612 3 4.0 3 3 3 1.0 NaN 1.0 NaN
80 81 1 35 2 2.0 16.0 2808 3 4.0 3 3 3 NaN NaN NaN NaN
81 82 2 35 2 3.0 15.0 2183 3 4.0 4 3 4 1.0 NaN NaN NaN
In [9]:
# Sarakkeiden otsikot ja arvojen lukumäärät
df.count()
Out[9]:
nro         82
sukup       82
ikä         82
perhe       82
koulutus    81
palveluv    80
palkka      82
johto       82
työtov      81
työymp      82
palkkat     82
työteht     82
työterv     47
lomaosa     20
kuntosa      9
hieroja     22
dtype: int64
In [10]:
# Puuttuvien arvojen lukumäärät
df.isnull().sum()
Out[10]:
nro          0
sukup        0
ikä          0
perhe        0
koulutus     1
palveluv     2
palkka       0
johto        0
työtov       1
työymp       0
palkkat      0
työteht      0
työterv     35
lomaosa     62
kuntosa     73
hieroja     60
dtype: int64
In [11]:
# Sarakkeiden otsikot, arvojen lukumäärät ja sarakkeiden tietotyypit
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

Pelkästään numeroarvoja sisältävät sarakkeet ovat kokonaislukuja (int) tai liukulukuja (float). Liukuluvun voit ajatella olevan käytännössä sama kuin desimaaliluku.

unique-funktion avulla on helppo huomata virheellisiä tai epäilyttäviä arvoja.

Unique näyttää sarakkeen ainutkertaiset arvot listana. Esimerkiksi seuraavasta selviää, että 'työtov' (tyytyväisyys työtovereihin) sarakkeella on arvoja 2, 3, 4 ja 5 sekä yksi tai useampia puuttuvia arvoja (nan). Arvot tulostuvat siinä järjestyksessä kuin ne tulevat datassa vastaan.

In [12]:
df['työtov'].unique()
Out[12]:
array([ 3.,  5.,  4.,  2., nan])
In [13]:
# for-silmukalla käyn läpi kaikki sarakkeet paitsi 'nro'
# drop poistaa oletuksena rivejä (axis=0), mutta haluan poistaa sarakkeita (axis=1)
for sarake in df.drop('nro', axis=1):
    print(sarake, df[sarake].unique())
sukup [1 2]
ikä [38 29 30 36 24 31 49 55 40 33 39 35 58 53 42 26 47 44 43 56 21 45 59 37
 28 50 32 51 22 34 27 41 25 61 20 52 46]
perhe [1 2]
koulutus [ 1.  2.  3.  4. nan]
palveluv [22. 10.  7. 14.  4. 16.  0. 23. 21. 15. 12.  2. 17. 20. 13. 27.  1.  3.
 nan 24.  5.  9.  6. 35. 28. 18. 36. 19.  8.]
palkka [3587 2963 1989 2144 2183 1910 2066 2768 2106 2651 2846 2808 3393 2691
 5225 2729 2925 2457 4874 3510 4446 1521 2223 1949 2340 6278 1559 2027
 2300 2534 1872 2261 2417 3119 2574 1715 5069 2495 3470 1598 1638 2612]
johto [3 1 2 4 5]
työtov [ 3.  5.  4.  2. nan]
työymp [3 2 1 5 4]
palkkat [3 1 2 4 5]
työteht [3 2 4 1 5]
työterv [nan  1.]
lomaosa [nan  1.]
kuntosa [nan  1.]
hieroja [nan  1.]
In [14]:
# kolme riviä, joissa palkalla suurin arvo
df.nlargest(3, 'palkka')
Out[14]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
32 33 1 59 2 3.0 15.0 6278 4 4.0 5 4 4 NaN 1.0 NaN NaN
16 17 1 26 1 4.0 2.0 5225 5 5.0 5 4 5 NaN NaN 1.0 NaN
66 67 1 37 2 4.0 8.0 5069 3 4.0 3 2 2 1.0 1.0 NaN 1.0
In [15]:
# kolme riviä, joissa palkalla pienin arvo 
df.nsmallest(3, 'palkka')
Out[15]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
25 26 1 26 1 2.0 3.0 1521 2 4.0 2 1 3 1.0 NaN 1.0 1.0
35 36 1 31 2 3.0 0.0 1559 2 4.0 3 1 3 1.0 NaN NaN NaN
53 54 1 25 1 2.0 1.0 1559 2 4.0 3 1 2 1.0 NaN NaN NaN

value_counts-funktio laskee ainutkertaisten arvojen frekvenssit eli esiintymiskertojen lukumäärät.

Seuraavassa lasken frekvenssit kaikille muuttujille paitsi juoksevalle järjestysnumerolle 'nro'.

In [16]:
for muuttuja in df.drop('nro', axis=1):
    print(df[muuttuja].value_counts())
1    63
2    19
Name: sukup, dtype: int64
40    8
33    4
35    4
31    4
37    4
44    4
26    3
45    3
39    3
38    3
30    3
29    3
28    2
27    2
34    2
21    2
56    2
42    2
47    2
22    2
55    2
36    2
51    2
25    1
61    1
41    1
20    1
52    1
43    1
32    1
50    1
59    1
53    1
58    1
49    1
24    1
46    1
Name: ikä, dtype: int64
2    51
1    31
Name: perhe, dtype: int64
2.0    30
1.0    27
3.0    22
4.0     2
Name: koulutus, dtype: int64
1.0     9
7.0     7
15.0    5
17.0    5
10.0    5
22.0    4
16.0    4
0.0     4
23.0    4
2.0     4
14.0    3
21.0    3
3.0     3
20.0    3
18.0    2
12.0    2
6.0     2
36.0    1
19.0    1
28.0    1
35.0    1
13.0    1
9.0     1
5.0     1
24.0    1
27.0    1
4.0     1
8.0     1
Name: palveluv, dtype: int64
2183    6
1989    5
1872    3
2144    3
2027    3
2925    3
2106    3
2729    3
2846    3
2808    3
1949    3
2691    3
3587    2
2223    2
2340    2
3510    2
2417    2
1559    2
3119    2
2261    2
2651    2
1598    2
2066    2
2574    1
1715    1
5069    1
3470    1
1638    1
2495    1
1521    1
2534    1
2300    1
6278    1
2963    1
4446    1
4874    1
2457    1
5225    1
3393    1
2768    1
1910    1
2612    1
Name: palkka, dtype: int64
3    30
4    23
2    16
1     7
5     6
Name: johto, dtype: int64
4.0    35
5.0    27
3.0    16
2.0     3
Name: työtov, dtype: int64
3    30
4    23
5    11
2     9
1     9
Name: työymp, dtype: int64
1    33
3    19
2    19
4    10
5     1
Name: palkkat, dtype: int64
3    29
4    25
2    15
5     8
1     5
Name: työteht, dtype: int64
1.0    47
Name: työterv, dtype: int64
1.0    20
Name: lomaosa, dtype: int64
1.0    9
Name: kuntosa, dtype: int64
1.0    22
Name: hieroja, dtype: int64
In [17]:
# Tilastolliset tunnusluvut kannattaa myös vilkaista
df.describe()
Out[17]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
count 82.000000 82.000000 82.000000 82.000000 81.000000 80.000000 82.000000 82.000000 81.000000 82.000000 82.000000 82.000000 47.0 20.0 9.0 22.0
mean 41.500000 1.231707 37.951220 1.621951 1.987654 12.175000 2563.878049 3.060976 4.061728 3.219512 2.109756 3.195122 1.0 1.0 1.0 1.0
std 23.815261 0.424519 9.773866 0.487884 0.844006 8.807038 849.350302 1.058155 0.826826 1.154961 1.111179 1.047502 0.0 0.0 0.0 0.0
min 1.000000 1.000000 20.000000 1.000000 1.000000 0.000000 1521.000000 1.000000 2.000000 1.000000 1.000000 1.000000 1.0 1.0 1.0 1.0
25% 21.250000 1.000000 31.000000 1.000000 1.000000 3.750000 2027.000000 2.000000 4.000000 3.000000 1.000000 3.000000 1.0 1.0 1.0 1.0
50% 41.500000 1.000000 37.500000 2.000000 2.000000 12.500000 2320.000000 3.000000 4.000000 3.000000 2.000000 3.000000 1.0 1.0 1.0 1.0
75% 61.750000 1.000000 44.000000 2.000000 3.000000 18.250000 2808.000000 4.000000 5.000000 4.000000 3.000000 4.000000 1.0 1.0 1.0 1.0
max 82.000000 2.000000 61.000000 2.000000 4.000000 36.000000 6278.000000 5.000000 5.000000 5.000000 5.000000 5.000000 1.0 1.0 1.0 1.0

Luettelo muistiossa käytetyistä funktioista ja toiminnoista

  • pd.read_excel() datan lukeminen Excel-tiedostosta
  • df.shape datan rivien ja sarakkeiden lukumäärät
  • pd.options.display.max_rows = None dataframejen kaikkien rivien näyttäminen
  • pd.options.display.max_columns = None dataframejen kaikkien sarakkeiden näyttäminen
  • df.head() datan alkupää
  • df.tail() datan loppupää
  • df.count() sarakkeiden otsikot ja arvojen lukumäärät kussakin sarakkeessa
  • df.isnull().sum() puuttuvien arvojen lukumäärät kussakin sarakkeessa
  • df.info() sarakkeiden otsikot, arvojen lukumäärät ja sarakkeiden tietotyypit
  • df['sarake'].unique() nimetyn sarakkeen ainutkertaisten arvojen luettelo
  • df.drop() rivien tai sarakkeiden poistamiseen
  • print() näytölle tulostaminen
  • df.nlargest() n suurinta nimetyn sarakkeen suhteen
  • df.nsmallest() n pienintä nimetyn sarakkeen suhteen
  • df['sarake'].value_counts() arvojen esiintymiskertojen (frekvenssien) laskemiseen
  • df.describe() tilastolliset tunnusluvut
  • Lisäksi opittiin toistamaan samankaltaisia toimia for-silmukalla.

Lisätietoa

Data-analytiikka Pythonilla: https://tilastoapu.wordpress.com/python/