Luokiteltu jakauma cut-funktiolla

In [1]:
#tuon tarvittavat kirjastot
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

#avaan Excel-datan dataframeen ja näytän viisi ensimmäistä riviä
df = pd.read_excel('http://taanila.fi/data1.xlsx')
df.head()
Out[1]:
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 [2]:
#tarkastelen aluksi ikäjakaumaa tunnuslukujen valossa
#huomaan, että nuorin on 20-vuotias ja vanhin 61-vuotias
df['ikä'].describe()
Out[2]:
count    82.000000
mean     37.951220
std       9.773866
min      20.000000
25%      31.000000
50%      37.500000
75%      44.000000
max      61.000000
Name: ikä, dtype: float64
In [3]:
#asetan luokkarajat ja luokkien nimet
bins = [20, 30, 40, 50, 62]
group_names = ['20-29', '30-39', '40-49', '50-']

#luon aineistoon uudet muuttujat 'luokkarajat' ja 'ikäluokka'
#jos right=False, niin alarajat kuuluvat luokkaan, mutta ylärajat eivät
#jotta saan 61-vuotiaankin mukaan, niin suurin bin pitää olla vähintään 62
df['luokkarajat'] = pd.cut(df['ikä'], bins, right = False)
df['ikäluokka'] = pd.cut(df['ikä'], bins, labels = group_names, right = False)

#tarkistan luokkarajat: hakasulun vieressä oleva luku kuuluu luokkaan
#kaarisulun vieressä oleva luku ei kuulu luokkaan
pd.crosstab(df['luokkarajat'], 'lkm')
Out[3]:
col_0 lkm
luokkarajat
[20, 30) 17
[30, 40) 30
[40, 50) 23
[50, 62) 12
In [4]:
#lasken lukumäärä- ja prosenttiyhteenvedon 'ikäluokka'-muuttujalle
df1 = pd.crosstab(df['ikäluokka'], 'lkm')

#tarpeettoman otsikon poisto
df1.columns.name = ''

#lasken prosentit
df1['%'] = df1/df1.sum()*100

#muotoilen prosentit yhden desimaalin tarkkuuteen
df1.style.format({'%': '{:.1f} %'})
Out[4]:
lkm %
ikäluokka
20-29 17 20.7 %
30-39 30 36.6 %
40-49 23 28.0 %
50- 12 14.6 %
In [5]:
#histogrammin voin tehdä suoraan alkuperäisestä datasta
ax1 = df['ikä'].plot.hist(bins = bins, edgecolor = 'black')
ax1.set_xlabel('Ikä')
ax1.set_ylabel('Lukumäärä')
Out[5]:
Text(0, 0.5, 'Lukumäärä')
In [6]:
#tunnuslukuja ikäluokittain pivot_table()-funktiolla
df2 = df.pivot_table(values='palkka', index='ikäluokka', aggfunc=[len, min, max, np.mean])

#sarakkeiden nimeäminen
df2.columns = ['lkm', 'pienin', 'suurin', 'keskiarvo']

#loppusilaus
df2.style.format('{:.0f}')
Out[6]:
lkm pienin suurin keskiarvo
ikäluokka
20-29 17 1521 5225 2422
30-39 30 1559 5069 2455
40-49 23 1715 4874 2624
50- 12 1872 6278 2921
In [7]:
#katson vielä, miltä 'luokkarajat' ja 'ikäluokka' näyttävät datassa
df[['luokkarajat','ikäluokka']]
Out[7]:
luokkarajat ikäluokka
0 [30, 40) 30-39
1 [20, 30) 20-29
2 [30, 40) 30-39
3 [30, 40) 30-39
4 [20, 30) 20-29
5 [30, 40) 30-39
6 [40, 50) 40-49
7 [50, 62) 50-
8 [40, 50) 40-49
9 [30, 40) 30-39
10 [30, 40) 30-39
11 [40, 50) 40-49
12 [30, 40) 30-39
13 [50, 62) 50-
14 [50, 62) 50-
15 [40, 50) 40-49
16 [20, 30) 20-29
17 [30, 40) 30-39
18 [40, 50) 40-49
19 [40, 50) 40-49
20 [40, 50) 40-49
21 [40, 50) 40-49
22 [40, 50) 40-49
23 [30, 40) 30-39
24 [40, 50) 40-49
25 [20, 30) 20-29
26 [20, 30) 20-29
27 [50, 62) 50-
28 [40, 50) 40-49
29 [20, 30) 20-29
... ... ...
52 [40, 50) 40-49
53 [20, 30) 20-29
54 [40, 50) 40-49
55 [30, 40) 30-39
56 [50, 62) 50-
57 [30, 40) 30-39
58 [20, 30) 20-29
59 [30, 40) 30-39
60 [40, 50) 40-49
61 [40, 50) 40-49
62 [50, 62) 50-
63 [40, 50) 40-49
64 [30, 40) 30-39
65 [30, 40) 30-39
66 [30, 40) 30-39
67 [30, 40) 30-39
68 [20, 30) 20-29
69 [50, 62) 50-
70 [30, 40) 30-39
71 [40, 50) 40-49
72 [40, 50) 40-49
73 [40, 50) 40-49
74 [40, 50) 40-49
75 [30, 40) 30-39
76 [30, 40) 30-39
77 [20, 30) 20-29
78 [30, 40) 30-39
79 [20, 30) 20-29
80 [30, 40) 30-39
81 [30, 40) 30-39

82 rows × 2 columns