{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Päivitetty 2025-05-15 / Aki Taanila\n"
]
}
],
"source": [
"from datetime import datetime\n",
"print(f'Päivitetty {datetime.now().date()} / Aki Taanila')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tunnuslukujen vertailua ryhmien välillä\n",
"\n",
"Määrälliselle muuttujalle laskettuja tilastollisia tunnuslukuja voin vertailla kategorisen muuttujan määräämissä ryhmissä."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set_style('whitegrid')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" nro | \n",
" sukup | \n",
" ikä | \n",
" perhe | \n",
" koulutus | \n",
" palveluv | \n",
" palkka | \n",
" johto | \n",
" työtov | \n",
" työymp | \n",
" palkkat | \n",
" työteht | \n",
" työterv | \n",
" lomaosa | \n",
" kuntosa | \n",
" hieroja | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 1 | \n",
" 1 | \n",
" 38 | \n",
" 1 | \n",
" 1.0 | \n",
" 22.0 | \n",
" 3587 | \n",
" 3 | \n",
" 3.0 | \n",
" 3 | \n",
" 3 | \n",
" 3 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" | 1 | \n",
" 2 | \n",
" 1 | \n",
" 29 | \n",
" 2 | \n",
" 2.0 | \n",
" 10.0 | \n",
" 2963 | \n",
" 1 | \n",
" 5.0 | \n",
" 2 | \n",
" 1 | \n",
" 3 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" | 2 | \n",
" 3 | \n",
" 1 | \n",
" 30 | \n",
" 1 | \n",
" 1.0 | \n",
" 7.0 | \n",
" 1989 | \n",
" 3 | \n",
" 4.0 | \n",
" 1 | \n",
" 1 | \n",
" 3 | \n",
" 1.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" | 3 | \n",
" 4 | \n",
" 1 | \n",
" 36 | \n",
" 2 | \n",
" 1.0 | \n",
" 14.0 | \n",
" 2144 | \n",
" 3 | \n",
" 3.0 | \n",
" 3 | \n",
" 3 | \n",
" 3 | \n",
" 1.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" | 4 | \n",
" 5 | \n",
" 1 | \n",
" 24 | \n",
" 1 | \n",
" 2.0 | \n",
" 4.0 | \n",
" 2183 | \n",
" 2 | \n",
" 3.0 | \n",
" 2 | \n",
" 1 | \n",
" 2 | \n",
" 1.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 77 | \n",
" 78 | \n",
" 1 | \n",
" 22 | \n",
" 1 | \n",
" 3.0 | \n",
" 0.0 | \n",
" 1598 | \n",
" 4 | \n",
" 4.0 | \n",
" 4 | \n",
" 3 | \n",
" 4 | \n",
" NaN | \n",
" 1.0 | \n",
" 1.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | 78 | \n",
" 79 | \n",
" 1 | \n",
" 33 | \n",
" 1 | \n",
" 1.0 | \n",
" 2.0 | \n",
" 1638 | \n",
" 1 | \n",
" 3.0 | \n",
" 2 | \n",
" 1 | \n",
" 2 | \n",
" 1.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" | 79 | \n",
" 80 | \n",
" 1 | \n",
" 27 | \n",
" 1 | \n",
" 2.0 | \n",
" 7.0 | \n",
" 2612 | \n",
" 3 | \n",
" 4.0 | \n",
" 3 | \n",
" 3 | \n",
" 3 | \n",
" 1.0 | \n",
" NaN | \n",
" 1.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | 80 | \n",
" 81 | \n",
" 1 | \n",
" 35 | \n",
" 2 | \n",
" 2.0 | \n",
" 16.0 | \n",
" 2808 | \n",
" 3 | \n",
" 4.0 | \n",
" 3 | \n",
" 3 | \n",
" 3 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" | 81 | \n",
" 82 | \n",
" 2 | \n",
" 35 | \n",
" 2 | \n",
" 3.0 | \n",
" 15.0 | \n",
" 2183 | \n",
" 3 | \n",
" 4.0 | \n",
" 4 | \n",
" 3 | \n",
" 4 | \n",
" 1.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
82 rows × 16 columns
\n",
"
"
],
"text/plain": [
" nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp \\\n",
"0 1 1 38 1 1.0 22.0 3587 3 3.0 3 \n",
"1 2 1 29 2 2.0 10.0 2963 1 5.0 2 \n",
"2 3 1 30 1 1.0 7.0 1989 3 4.0 1 \n",
"3 4 1 36 2 1.0 14.0 2144 3 3.0 3 \n",
"4 5 1 24 1 2.0 4.0 2183 2 3.0 2 \n",
".. ... ... ... ... ... ... ... ... ... ... \n",
"77 78 1 22 1 3.0 0.0 1598 4 4.0 4 \n",
"78 79 1 33 1 1.0 2.0 1638 1 3.0 2 \n",
"79 80 1 27 1 2.0 7.0 2612 3 4.0 3 \n",
"80 81 1 35 2 2.0 16.0 2808 3 4.0 3 \n",
"81 82 2 35 2 3.0 15.0 2183 3 4.0 4 \n",
"\n",
" palkkat työteht työterv lomaosa kuntosa hieroja \n",
"0 3 3 NaN NaN NaN NaN \n",
"1 1 3 NaN NaN NaN NaN \n",
"2 1 3 1.0 NaN NaN NaN \n",
"3 3 3 1.0 NaN NaN NaN \n",
"4 1 2 1.0 NaN NaN NaN \n",
".. ... ... ... ... ... ... \n",
"77 3 4 NaN 1.0 1.0 NaN \n",
"78 1 2 1.0 NaN NaN NaN \n",
"79 3 3 1.0 NaN 1.0 NaN \n",
"80 3 3 NaN NaN NaN NaN \n",
"81 3 4 1.0 NaN NaN NaN \n",
"\n",
"[82 rows x 16 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_excel('https://taanila.fi/data1.xlsx')\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Sukupuolen ja koulutuksen tekstimuotoiset arvot\n",
"sukup = ['Mies', 'Nainen']\n",
"koulutus = ['Peruskoulu', '2. aste', 'Korkeakoulu', 'Ylempi korkeakoulu']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## groupby + describe\n",
"\n",
"Voit jakaa datan ryhmiin **groupby**-funktiolla ja laskea tilastolliset tunnusluvut **describe**-funktiolla"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | | \n",
" Lukumäärä | \n",
" Keskiarvo | \n",
" Keskihajonta | \n",
" Pienin | \n",
" Alaneljännes | \n",
" Mediaani | \n",
" Yläneljännes | \n",
" Suurin | \n",
"
\n",
" \n",
" \n",
" \n",
" | Mies | \n",
" 63 | \n",
" 2664 | \n",
" 930 | \n",
" 1521 | \n",
" 2086 | \n",
" 2417 | \n",
" 2925 | \n",
" 6278 | \n",
"
\n",
" \n",
" | Nainen | \n",
" 19 | \n",
" 2233 | \n",
" 341 | \n",
" 1715 | \n",
" 1969 | \n",
" 2144 | \n",
" 2574 | \n",
" 2729 | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Palkan tunnuslukujen vertailu sukupuolen mukaan\n",
"df1 = df.groupby('sukup')['palkka'].describe()\n",
"\n",
"# Taulukon otsikot\n",
"df1.index = sukup\n",
"\n",
"# Tunnusluvuille suomenkieliset nimet\n",
"tunnusluvut = ['Lukumäärä', 'Keskiarvo', 'Keskihajonta', 'Pienin', 'Alaneljännes', \n",
" 'Mediaani', 'Yläneljännes', 'Suurin']\n",
"df1.columns = tunnusluvut\n",
"\n",
"# Ulkoasun viimeistely\n",
"df1.style.format('{:.0f}')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | | \n",
" count | \n",
" mean | \n",
" std | \n",
" min | \n",
" 25% | \n",
" 50% | \n",
" 75% | \n",
" max | \n",
"
\n",
" \n",
" \n",
" \n",
" | Peruskoulu | \n",
" 27 | \n",
" 2310 | \n",
" 473 | \n",
" 1638 | \n",
" 2008 | \n",
" 2144 | \n",
" 2534 | \n",
" 3587 | \n",
"
\n",
" \n",
" | 2. aste | \n",
" 30 | \n",
" 2403 | \n",
" 534 | \n",
" 1521 | \n",
" 2008 | \n",
" 2378 | \n",
" 2729 | \n",
" 3510 | \n",
"
\n",
" \n",
" | Korkeakoulu | \n",
" 22 | \n",
" 2887 | \n",
" 1108 | \n",
" 1559 | \n",
" 2222 | \n",
" 2710 | \n",
" 2925 | \n",
" 6278 | \n",
"
\n",
" \n",
" | Ylempi korkeakoulu | \n",
" 2 | \n",
" 5147 | \n",
" 110 | \n",
" 5069 | \n",
" 5108 | \n",
" 5147 | \n",
" 5186 | \n",
" 5225 | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Palkan tunnuslukujen vertailu koulutuksen mukaan\n",
"df2 = df.groupby('koulutus')['palkka'].describe()\n",
"\n",
"# Taulukon otsikot\n",
"df2.index = koulutus\n",
"\n",
"# Ulkoasun viimeistely\n",
"df2.style.format('{:.0f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ruutu- ja janakaavio eli boxplot\n",
"\n",
"Ruutu- ja janakaavio on havainnollinen tapa vertailuun. Kaavio näyttää viiden luvun yhteenvedon (pienin, alaneljännes, mediaani, yläneljännes, suurin) ja erityisen poikkeavat arvot.\n",
"\n",
"Seuraavissa esimerkeissä n-arvot on kikkailtu kaavioon vertailtavien ryhmien nimien yhteyteen. Jos koet tämän hankalaksi, niin n-arvot voi toki raportoitaessa esittää muullakin tavoin (esimerkiksi kaaviota selittävässä tekstissä tai describe-funktiolla lasketussa tunnuslukutaulukossa)."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Kuukausipalkka')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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AACGQfABAACGQfABAACGQfABAACGQfABAACGQfABAACGQfABAACGQfABAACGQfABAACGQfABAACGQfABAACGQfABAACG4ZDgc+nSJX3xxReOeCoAAACn8bD3gA8//FDPPPOM8vLyZLVa/++JPDyUnZ3t0OIAAAAcye7g89xzz+muu+5S69atdezYMd13331asGCBhg4d6oz6AAAAHMbu4HP69GmNHz9e3333nfbu3au77rpLQUFB+vvf/664uDhn1Ag4nMViUVZWlgoKCmQ2mxUSEiKTyeTqsgAATmZ38DGbzXJ3d9d1112nr776SpIUHBys3NxchxcHOENmZqbS0tJq/M22a9dOo0ePVlRUlAsrAwA4m92Dm7t06aKXXnpJknT11Vdr165d2rdvn1q0aOHw4gBHy8zMVEpKioKCgrRgwQJt3rxZCxYsUFBQkFJSUpSZmenqEgEATmR38Bk/fry2bdum/Px8PfHEExo9erTi4+P16KOPOqM+wGEsFovS0tIUERGhmTNnqnv37mrZsqW6d++umTNnKiIiQunp6bJYLK4uFQDgJHbf6rrpppu0adMmSdL111+vnTt3qqSkRIGBgQ4vDnCkrKws5ebmasqUKXJ3r5n53d3dFRsbqzFjxigrK0thYWEuqhIA4Ex29/gsW7asxuNrr71WRUVFGjRokMOKApyhoKBAknTjjTfW2V69vXo/AEDzY3fwSU9P15o1ayT9a+LCF154QY888oj69u3r8OIARzKbzZKkkydP1tlevb16PwBA82P3ra5//OMf+tOf/qSffvpJGzdu1Pnz57Vo0SL16dPHGfUBDhMSEqJ27dopIyNDM2fOrHG7q6qqShkZGQoMDFRISIgLqwQAOJPdPT7dunXTokWLtHDhQvn7+2vjxo2EHjQJJpNJo0eP1p49e5ScnKwjR46otLRUR44cUXJysvbs2aPExETm8wGAZszN+vN1J67glVdeqfH4888/1969exUfHy8Pj391HD3++OOOr7ABWSwWHTp0SKGhoVz8mrG65vEJDAxUYmIi8/gAQBNkz/W73re69u3bV2tbjx499Omnn0qS3Nzc7CwTcI2oqChFRkYyczMAGFC9g8+bb755xfb8/PzfXAzQUEwmE19ZBwADsnuMz5w5c2pt27JliwYOHOiQggAAAJzF7m91bdu2Tb6+vnr88cd14cIF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AAAAwyD4AAAAwyD4AAAAwyD4AAAAwyD4AAAAwyD4AAAAwyD4oMF06dJFXbp00ddff12r7Y033lCXLl308ssvS5KmTp2qqVOnNnSJDrd//34NGzZMYWFh6tevnxYuXGhrKyoq0rhx4xQeHq7bbrtNI0aM0JdffunCaoEr69KlixISEmqth7RmzRr179+/Xs+xfv16DRgwwBnlNVpvvPGG4uLiamy7cOGCkpOTFRERofDwcE2aNEnnz593UYXGQvBBgwoICNDatWtrbV+zZo18fX1tj6dPn67p06c3ZGkO99VXXykhIUF//OMf9dlnn2nhwoVavHix3nvvPUlScnKyiouL9cEHH2jfvn0KCQnR6NGjXVw1cGW7du3SokWLfvXx999/vzZt2uTAihqv0tJSzZkzR3PmzKnVNmnSJB07dkxr1qzRjh07VFFRoTFjxrigSuMh+KBBDRw4UOvWrauxkFxWVpYqKirUrVs327ann35aTz/9tO3xpk2bNHDgQPXs2VMxMTH63//9X1vbgQMHFBMTo9tvv13R0dFKTU3VpUuXfrGW7777Tl26dNHKlSvVv39/9ezZUyNHjlRubm6d+0+dOlVhYWF1/tTlrbfe0p133qkHHnhAbm5u6tq1q1asWKGePXtKkl544QW99NJLat26tUpLS3X+/HkFBAT8Yt2AK8XFxemll17SZ599dtl9duzYoYceekgRERG69dZb9cgjj+ibb76RVLN3aN++ferfv7/S09N1xx13qHfv3ho7dqyKi4ttz3Wl935cXJyef/55xcbGKiwsTPfcc482b95cr/Ooz2v/3GOPPVbne/9KvVeDBg1Sfn6+Hn744Rrby8rKtH37dk2YMEGBgYFq1aqVJk2apP379+urr76qV/349Qg+aFC///3vVVlZqY8//ti2bdWqVRo6dOhlj9m1a5dSUlI0depU7d+/X2PHjtXYsWN14sQJSdKECRMUFxenTz75RG+88Ybee+89bd++vd41ffjhh3r33Xf1/vvv68cff1RaWlqd+02fPl0HDx6s86cuWVlZuuGGG/Tkk08qPDxc99xzj/bv369rrrlGkuTp6akWLVroxRdfVHh4uDZu3KjJkyfXu27AFaKjo/Xggw/qySefVGFhYa323Nxc/fWvf1VCQoL27NmjDz/8UFarVQsWLKjz+b7//nvl5eXpgw8+0MqVK3Xw4EG99dZbkn75vS9J//znP5WUlKR9+/bprrvu0tSpU3Xx4sV6ncuVXvvfLVq0qM73/pV6r9588009//zzuvrqq2tsr6qqktVqlY+Pj21b9cKadQ0FgGMRfNCgPDw8NHDgQNvtrvLycr3//vsaPHjwZY9Zvny5Hn74YfXq1Usmk0n/+Z//qf79+2vFihWSpBYtWmjLli3auXOn/P39tWvXLt199931rmnUqFFq3bq12rRpo/79+9v+ZfpbFRUVadmyZbr//vu1e/duTZ8+XXPnzrXd6qqWmJiorKwsPf744xo1apROnz7tkNcHnGXixIkym816+umna433MZvN2rRpk/r376/i4mLl5uYqICBAeXl5l32+MWPGyNvbWx07dlR4eLhOnjwp6Zff+5J09913q1u3bvLy8tIDDzygCxcu6Ny5c/U+l8u9tiO0a9euzu2tWrVSZGSkXnzxReXn56u4uFj/8z//I5PJpPLycoe9Purm4eoCYDwxMTF68MEHVVxcrG3btum2226z9YLU5fvvv9f+/fv19ttv27ZZLBb16dNHkrR06VK9/PLLeuaZZ5Sfn6877rhD06ZNu+yHzr9r06aN7f89PDxqfZBXmzZtmjZu3Fhn2yeffFJrm5eXl+688079/ve/lyT16tVLgwYN0pYtW/SHP/zBtp+3t7ckaeTIkVq5cqW2b9+u+Pj4etUOuIKXl5fmzZunBx54QIsXL65xi9bT01MbN27UihUr5Obmps6dO6u4uFgeHpe/3Pz8/e/p6Wl7D/7Se//fj61+jZ/fSv8ll3vtf/fnP/9Zn376aa3tgYGB2rBhQ71fr9qzzz6rWbNmadCgQbrqqqs0cuRI7dy5U61bt7b7uWAfgg8aXNeuXRUUFKQtW7Zow4YNGjFixBX3b9eunQYPHqyEhATbtjNnzsjb21sXL15UTk6Opk2bJg8PD508eVLJycmaNWuW5s+f79C6p02bpmnTptV7/5tuukkVFRU1tlksFtsH60MPPaT4+PgaIaiiokJ+fn4OqRdwpg4dOmjGjBmaMGGCYmJibNu3bNmi5cuX6+2331bHjh0lSTNmzNDx48ftfo0rvfcb2s+/kekI+fn5mjJliu39/tVXX6moqEi33HKLQ18HtXGrCy4RExOjJUuW6OTJk+rXr98V9x0+fLiWLVumrKwsSVJ2drZiYmK0ceNGubm56cknn9TixYt16dIlXXPNNfLw8GgUg4Qfeughbd++XevWrZPVatWBAwe0YcMGDRo0SJIUEhKil19+Wd9//70qKio0f/58VVRU1PtrwYCr3XvvvRoyZIjeeecd27YLFy7I3d1d3t7eslqtyszM1LvvvqvKykq7n/9K7/2m7tlnn9WcOXNUUVGhvLw8PfPMMxowYECt8UBwPHp84BL33Xef5s6dqxEjRlyxC1yS/vCHP6i0tFSTJ0/WmTNn5O/vr/j4eMXFxcnNzU3p6emaO3euFi5cKJPJpKioKI0bN06S9Oqrr2rDhg0u+fpsRESE0tLSNH/+fD3zzDMym82aOHGi7rzzTknSuHHjZDKZ9OCDD6qyslKhoaFaunQpPT5oUiZPnqzDhw/b5qB54IEH9Omnn2rAgAEymUwKCgrSiBEjlJGRUasH9Jdc6b1fH1OnTtWZM2d+09fvnWXmzJmaOnWq+vbtK09PT91zzz2aMGGCq8syBDfr5W5oAs2A1WrVo48+qjfeeMPVpQBoYKWlpXrqqaeUnp7u6lLQiHCrC83aBx98cMWvygNovt59991fHEMI46HHBwAAGAY9PgAAwDAIPgAAwDAIPgAAwDAIPgAAwDAIPgAAwDAIPgAAwDAIPgAAwDAIPgAAwDAIPgAAwDD+H0vv2WkFrGbuAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Palkan vertailu sukupuolen mukaan ruutu- ja janakaaviona\n",
"sns.boxplot(data=df, x='sukup', y='palkka')\n",
"\n",
"# Naisten ja miesten palkka-arvojen lukumäärät\n",
"n_mies = int(df1.iloc[0, 0])\n",
"n_nainen = int(df1.iloc[1, 0])\n",
"\n",
"# Kategoria-akselin luokkien uudelleen nimeäminen (n-arvot mukaan)\n",
"plt.xticks(ticks=[0, 1], labels=[f'Mies, n = {n_mies}', f'Nainen, n = {n_nainen}'])\n",
"plt.xlabel('')\n",
"plt.ylabel('Kuukausipalkka')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Kuukausipalkka')"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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15NPPimLxeKymnv37q2PP/74gm2OrIn30XkEn1pi0qRJ2rFjh3bs2KGdO3fq3Xff1UcffaS33nrL1aXBxcrKyvTEE08oKipK//d//6dPPvlEBQUFmjBhgtNf+9SpU05/jfrunXfeUWpqqmbOnKmHH37Y1eUY0vjx49WoUSONHz/eZvmsWbP066+/avr06S4drf/TTz/Vvffe67LXNxqCTy3Vtm1bderUSXv27NHZs2f15ptv6o477lDnzp01dOhQHTp0yGbd1NRUdenSRU899dQFe1d+35Nz4MABxcfHq1OnTrr99ts1duxYFRcXV6lhz5496tq1qxYsWCDp/JfgxIkTdeutt6pLly568skn9dNPP0mSfv75Z7Vt21Y///yz9fGzZs3SoEGDqjzvhf46cNZfIvXBsWPHdMMNNygxMVFeXl4KDAzUAw88oO3bt1fr8cXFxUpOTtadd96pyMhI3XbbbXr77bet7f/+97/Vu3dvdejQQXfddZfS09MlSUlJSfrmm280Z84cPfXUU5Kkw4cP66mnnlKXLl10++2364033tDZs2cdv9H1gMViUWpqqt5//30tXLhQt99+u7Xt6NGjeu655xQdHa2YmBiNGjVKx48fl3T+89G9e3eNGjVKHTt21DvvvGPzvEePHtUdd9yhKVOmyGKxXPL48N133+nvf/+7br31VoWHhysuLk47d+68YL1JSUnq3bu38vLyJEmff/654uLi1L59e/Xq1UsLFiyw9kJf6DN7od4uqWpP8oWOF87k7e2tN954Q9u3b9cHH3wgSdq2bZsWLFigGTNmKCAgoMpjqnPc/fDDD9WrVy/dcssteuqpp/TDDz/owQcfVFRUlPr3729df9asWRo+fLhGjBihyMhI9ejRQx9++KH1uarbq7Fx40Z16NBBa9eulcT76HLfRwSfWqi8vFxbt27Vli1bFBMTozfeeENfffWVFixYoI0bN+qWW27RY489pjNnzlgfc/jwYX311Vd6+eWXL/n8kyZNUnR0tLZt26bly5drz549Wrp0qc06P/zwgx577DGNGjVKgwcPliQ988wzOnz4sFauXKkNGzYoNDRUgwcPvmBoguOEhoZq3rx5cnd3ty7797//rXbt2lXr8a+++qp+/vlnLVu2TDt27FBycrLeeOMNHTp0SGVlZRozZoz+8Y9/6Ntvv9Vrr72muXPnKjs7W2lpaerYsaOefPJJvf322zp9+rQGDx6s1q1bKysrS4sXL9bXX3/tlFOjdV15eblGjRqlpUuXasmSJQoPD7dpe+yxx+Tu7q5169ZZv8SeeuopnTt3TpKUm5ur0NBQbd682aaX6MiRIxo0aJD69u2rCRMmyM3N7U+PD2VlZUpISFCvXr2UlZWlrVu3qkWLFlWOExUVFZowYYJ+/PFHffDBBwoODtaWLVv03HPP6YknntC2bdv0+uuv67333tPChQtr4DfoeKGhofrHP/6h1157TT/++KPGjRunF154QRERERdcvzrH3dWrV+vDDz/Uf/7zH3377bcaPny40tLStGnTJnl5edn8gbF+/Xq1b99e27dv10svvaTJkydr8+bN1a5/w4YNGjlypF5//XXdddddvI+uAMGnlpg0aZI6duyojh07Kjo6WpMnT9aQIUP0yCOPaMmSJRo5cqSaN28ub29vJSYmqry8XF999ZX18ffcc498fX119dVXX/K1vL29tXHjRn322WcymUxatWqVhgwZYm3fvXu3hgwZoscff1wDBw6UdP6Dsm3bNk2cOFGNGzeWj4+PRo8erXPnzmnDhg0O/33gwiwWi9544w19+eWXSkpKqtZjRowYoRkzZsjPz0+5ubny9vaWJOtfhj4+Plq2bJk2b96sVq1a6dtvv73gl8FXX32ls2fPauTIkfL29lZISIieffZZZWZmOm4D64mJEydaf9d//Ev+m2++0ZEjRzRp0iRdddVVuvrqqzVp0iTt3btXP/zwg3W9AQMGyNPTU35+fpLO/4U+aNAgxcbG6plnnpF0/v3wZ8cHT09Pffjhh3r44Yd19uxZHT16VAEBAda/xCuNHTtWGzdu1MKFCxUUFCTp/HV5d9xxh+6++255eHioXbt2GjZsmJYsWeLMX51T3XfffbrzzjutvTLx8fEXXO9Sv9dKjzzyiAICAtSkSRO1bt1ad955p1q1aqUGDRqoa9euOnr0qHXdtm3basiQIfL09NStt96qXr16adWqVdWqe8OGDUpMTNSkSZPUvXt3SbyProSHy14ZNlJSUhQXF1dl+cmTJ3X69Gk9++yzNjPOlpeX23yomjRpUu3XmjFjhmbNmqU33nhDI0eOVPv27fXiiy+qdevWkqSvv/5aUVFR+uSTT/Too4/Ky8tLv/76qySpefPm1udxd3dXSEiIjh49qltuucXubYZ9iouLNX78eO3evVuLFi2q9sWEJ0+eVFpamvbs2aPrrrtON998s6Tzf535+Pjon//8p9LT0zVq1CgVFxerV69eSk5Olr+/v83zHD16VPn5+erUqZN1mcViUXl5uU6ePKlrrrnGcRtbx91yyy16+eWX9fXXXyshIUE33nij7rzzTknn90dgYKD1i0iS/Pz8FBAQoKNHj6pRo0aSqn6mv/nmG8XExGj9+vV6/vnn5e/vr/z8/D89Pri7u2vr1q0aOnSoTp8+rbCwMHl4eOiPc1Pn5uaqpKREWVlZuvvuu6113njjjTbrXXfddTbHnbro6aef1qpVq/Tss89edJ1L/V4r/f4Umbu7u81nxmQy2fye//KXv9i8RkhIiH788cdq1bx582a1a9dOK1eutNk/vI8uD8GnlgsMDJS3t7fmz5+vyMhI6/L//e9/Cg4Otv78+wvzTCZTlesuKi9Sraio0J49ezRixAhNmDBBv/zyi6ZOnapx48Zp+fLlkqTBgwfrySefVJ8+fTRr1iyNGjVK1157raTzp9QqA5LZbNaxY8fUuHFj62mY8vLyKq/5R5Xrnj17Vl5eXtZ1AwMD7f8FGcThw4c1dOhQNWvWTMuWLbP+NVUdzz77rHr06KF3331XHh4eOnXqlP71r39JOh+mjh8/rtdee02S9OOPP2rkyJF6++23NXbsWJvnadq0qVq0aKHPPvvMuqy4uFgnT560qx4jeOihh+Tl5aW//vWvGjZsmMaOHauWLVuqbdu2uvbaa3Xq1CkVFxdbv7SKiop06tQpNW7c2Ppl8seLbe+++269/PLLeuihhzRp0iS9/vrrlzw+fP/995o8ebKWLFliDbzz58/XwYMHbZ773Xff1b/+9S9rz3OTJk107bXX6vDhwzbrHTlyRI0bN5Z0/jjz+9M+f3aXoclkqtaxoSZUfrH//gv+jy7nuHspf+wd+fnnnxUSElKtx44aNUp//etf1bt3by1ZskQPPvgg7yNd/vuIU121nMlk0oABA/Taa68pNzdXFRUVWrlype655x6bC89+r1WrVvr111+1ZcsWWSwWrVq1Sv/973+tz5eamqoZM2bozJkzCgoKkre3t03o8PT0VMOGDZWWlqb58+fru+++U5MmTdS9e3elpqbqxIkTKisr06uvviqz2azbb79d11xzjfz9/fXpp5/KYrFo9+7dNl+Qv9eiRQt5eHjo008/lXS+h2nLli0O/s3VH4WFhXr00UfVvn17vfvuu3aHjKKiIvn4+Mjd3V35+flKTU2VdD6klpSUaOjQoVq9erUsFouaNGkik8lkfT94eXmpqKhIknT77berpKRE8+bN09mzZ/Xbb79p7Nixev755116R0xt9+yzzyoyMlKJiYkqKChQeHi4wsLClJKSoqKiIhUVFenFF19UixYt1L59+4s+j6enp9zd3TV16lR9/vnnWrNmzSWPD0VFRTKZTPLx8ZEk7dy5UwsXLqzyh5GXl5fi4+PVpk0b6ynU/v3764svvtDatWtlNpu1Z88ezZ07V/3795d0/jjzzTffKC8vT2VlZZo9e/ZF3wetWrXSxo0b9dtvv6moqEhz5851xK/WaS7nuHspO3fu1KpVq2Q2m7VhwwatX7/e+ru8FE9PTwUHB2v8+PGaPn26Dh8+zPvoCt5HBJ86YOzYsbrlllv08MMPq2PHjlqwYIFmzpypm2666YLrh4eHKyEhQePGjVPnzp21ZcsW9erVy9o+Y8YM/fe//9Wtt96qbt26qaioSJMnT67yPNHR0Ro4cKDGjh2r06dP6+WXX1bz5s113333qVu3btq3b5/ef/99BQQEyMvLS5MnT9batWvVvn17TZs2Tffff/8F62vSpIkmTJig9PR0tW/fXosWLbrgaT6ct2LFCh07dkxr165Vhw4drOM9RUVFWdeJioq66DggU6dO1Zo1a9S+fXvFxcUpODhYN910k/bv36/g4GDNnDlTc+fOVfv27XXPPfeoa9eu1gva+/Xrp+XLl+vhhx+Wn5+fFixYoK1btyo2NlZ/+9vfZDKZlJGRURO/hjrLZDLptdde07lz5/Tcc8/Jzc1Nc+bM0blz59SrVy/dfvvtKi8v13vvvScPj0t3wrdq1UojRozQpEmTlJeX96fHh5iYGD388MPWuzgnTZqkQYMGKT8/33r6upKbm5umTJmib775RkuWLNEtt9yiN998U3PnzlXHjh319NNP66GHHrLe4ffAAw8oKipK9957r3r27KmQkBA1a9bsgjU/+eSTuuaaa3THHXeob9++dWJML3uPu5dy4403av369erataumTZumV155xeYzXB39+/dXp06dNHbsWJlMJt5Hl/k+crP88SQdAABwmFmzZmnbtm3WW+nhWvT4AAAAwyD4AAAAw+BUFwAAMAx6fAAAgGEQfHBJFotFs2fPVo8ePdS+fXv16dPHeqv6sWPHbO4yioqKUkREhNq2basdO3a4uHJcjjNnzmjy5MmKiYlRVFSU7r//fpuh9c1ms6ZPn65u3bopKipKCQkJ1lGgUff82edbOj9Wyrhx4xQTE6NOnTrp0UcfrfbAe6j9LrX/6yULcAnvvfeepUePHpacnBxLRUWFZf369Zbw8HDL999/X2Xd8vJyy9///nfLhAkTXFApHGHq1KmW/v37W44fP24xm82WRYsWWSIjIy3FxcUWi8VimTVrlqVPnz6WY8eOWYqKiizPPfecZejQoS6uGpfrUp/vhIQEy7Bhwyz5+fmWM2fOWGbMmGHp1q2bpaSkxMWVwxHsOb7XF4zcXA9s3bpV48eP18CBA7V48WKdOXNGXbp00dSpU22GM6/0xBNP6Ntvv62yvFmzZtZBBX/vt99+U2Jiolq1aiXp/EzCrVq10nfffVdlTqeMjAydPHmy1g9QVpc5e3+PGTNGZ8+ela+vr06fPq2CggJdddVV8vT0lCQtXbpUo0ePto46m5SUpFtvvVVHjhyxmdIEjuHKz3d4eLjc3Nz07LPPWge1fPzxx5Wenq6ffvrpsse0QfXVpuN7veHq5IUrt2XLFkubNm0sKSkpltLSUstPP/1kiYmJscyZM8cpr5eTk2Np166dZdu2bTbLDx06ZLn55pstO3bscMrr4rya2t9LliyxtG3b1tKuXTvL2rVrLRaLxfLbb79Z2rRpY9m7d6/Nup07d7b85z//cejr47za8vmutHTpUktkZKTl9OnTTnl92Kpt+78+oMenHklMTJSPj49atmypLl26VJlHxREOHjyooUOH6t5777WZrFKS3n77bXXv3t1mrhc4j7P3d79+/RQXF6d169Zp9OjRaty4sXXOtgYNGtis6+Pjo5KSEoe+Pmy5+vMtSevXr1dqaqpefPFF+fr6Ovz1cXG1Yf/XFwSfeqRy0jfp/HwslouMVPDkk09esCs0JCREq1evvujzf/HFFxo3bpzi4uKqTGBZUlKiTz/9lFNcNcjZ+9vb21uS1Lt3b3300Udau3atRowYIUkqLS21WbesrEwNGza0extQfa78fFssFmVkZGju3LmaMmWKdeZt1BxX7v/6huBjQHPmzLH7MbNnz9a8efP00ksvqU+fPlXaN2zYoKCgoHr9V0JdZe/+fu655xQZGWmdr0uSzp49q4CAAPn7+ys4OFg5OTlq06aNJOnEiRMqKCiw/gzXcvTnu7S0VM8//7wOHDigzMxMruup5ZxxfK9vCD64pPfee0/vvffenx70vvvuO3Xo0IFZuuuBqKgovfPOO4qOjlarVq20cuVK7dq1yzqRbVxcnDIyMhQeHq7AwEBNmTJFnTt3VosWLVxcOS7HpT7fzz//vHJzc7V8+XIFBATUfIFwquoc3+sbgg/+lOX/H+OhtLRU8fHxNm1PPvmkdYbdI0eOKCwszBUlwsH+/ve/68yZM0pISFBRUZFuuOEGLViwwBpsEhMTde7cOcXHx6ukpERdunTRjBkzXFs0LsulPt+33XabvvzyS3l5een222+3aa+cbRt1V3WP7/UNU1YAAADDYORmAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGAQfAABgGP8fXFYzK8ap8PAAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Palkan vertailu koulutuksen mukaan ruutu- ja janakaaviona\n",
"\n",
"sns.boxplot(data=df, x='koulutus', y='palkka')\n",
"\n",
"# Pientä kikkailua n-arvojen saamiseksi kaavioon\n",
"n_koulutus = []\n",
"for i in range(4):\n",
" # \\n on rivinvaihdon merkki \n",
" n_koulutus.append(f'{koulutus[i]}\\n n = {int(df2.iloc[i, 0])}')\n",
"plt.xticks(ticks=[0, 1, 2, 3], labels=n_koulutus)\n",
"\n",
"plt.xlabel('')\n",
"plt.ylabel('Kuukausipalkka')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pivot_table()\n",
"\n",
"Pivot-taulukkoon lasketaan oletuksena keskiarvoja."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | | \n",
" Mies | \n",
" Nainen | \n",
" Kaikki | \n",
"
\n",
" \n",
" \n",
" \n",
" | Peruskoulu | \n",
" 2354 | \n",
" 2121 | \n",
" 2310 | \n",
"
\n",
" \n",
" | 2. aste | \n",
" 2461 | \n",
" 2211 | \n",
" 2403 | \n",
"
\n",
" \n",
" | Korkeakoulu | \n",
" 3145 | \n",
" 2334 | \n",
" 2887 | \n",
"
\n",
" \n",
" | Ylempi korkeakoulu | \n",
" 5147 | \n",
" - | \n",
" 5147 | \n",
"
\n",
" \n",
" | Kaikki | \n",
" 2675 | \n",
" 2233 | \n",
" 2571 | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Palkkakeskiarvojen vertailua sukupuolen ja koulutuksen mukaan \n",
"df3 = df.pivot_table(values='palkka', index='koulutus', columns='sukup', margins=True)\n",
"\n",
"# Tekstimuotoisten arvojen listoihin täytyy lisätä otsikko viimeistä riviä/saraketta varten (Kaikki)\n",
"df3.index = koulutus + ['Kaikki']\n",
"df3.columns = sukup + ['Kaikki']\n",
"\n",
"# Ulkoasun viimeistely\n",
"# Puuttuvan arvon merkiksi -\n",
"df3.style.format('{:.0f}', na_rep='-')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ovatko keskiarvojen erot tilastollisesti merkitseviä?\n",
"\n",
"Otoksessa havaitut ryhmien väliset erot voivat olla liian pieniä, jotta niitä voisi yleistää laajempaan perusjoukkoon, josta otos on otettu. Kyseessä voi olla otantavirheen (sattuman) aiheuttama ero.\n",
"\n",
"Eroa sanotaan merkitseväksi, jos sen perusteella voidaan tehdä yleistys laajempaan perusjoukkoon, josta otos on otettu. Eron merkitsevyyttä voidaan testata laskemalla niin kutsuttu **p-arvo**. Mitä pienempi p-arvo, sitä merkitsevämpi ero. Yleensä alle 0,05 (5 %) suuruisia p-arvoja pidetään osoituksena merkitsevästä erosta.\n",
"\n",
"Kahden ryhmän keskiarvojen vertailuun liittyvän p-arvon voit laskea kahden riippumattoman otoksen t-testillä (**ttest_ind**).\n",
"\n",
"Vertailtavien ryhmien varianssien yhtäsuuruutta ei yleensä kannata olettaa (**equal_var=False**).\n",
"\n",
"Puuttuvia arvoja sisältävät rivit eivät saa olla testin laskennassa mukana; **nan_policy**-parametri huolehtii tästä."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"TtestResult(statistic=np.float64(3.0597612743474714), pvalue=np.float64(0.003048272029697872), df=np.float64(76.95722019273195))"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Vertailtavien ryhmien muodostaminen\n",
"s1 = df['palkka'][df['sukup']==1] # miesten palkat\n",
"s2 = df['palkka'][df['sukup']==2] # naisten palkat\n",
"\n",
"# Kahden riippumattoman (ind) otoksen t-testi\n",
"from scipy.stats import ttest_ind\n",
"ttest_ind(s1, s2, equal_var=False, nan_policy='omit')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Miesten (keskiarvo 2664 euroa) ja naisten (keskiarvo 2233 euroa) palkkakeskiarvojen välillä on tilastollisesti merkitsevä ero (kahden riippumattoman otoksen 2-suuntaisen t-testin p = 0,003).\n",
"\n",
"Seuraavassa pelkistetympi tapa tulostaa näkyviin t-testin p-arvo:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"p-arvo 0.003\n"
]
}
],
"source": [
"p = ttest_ind(s1, s2, equal_var=False, nan_policy='omit')[1]\n",
"print(f'p-arvo {p:.3f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Useamman ryhmän keskiarvojen vertailuun liittyvän p-arvon voit laskea F-testillä (**f_oneway**). \n",
"\n",
"Jos tarkasteltavalla muuttujalla on puuttuvia arvoja, niin alkuperäisen datan sijasta pitää käyttää dataa, josta puuttuvia arvoja sisältävät rivit on poistettu."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"F_onewayResult(statistic=np.float64(11.675086950951924), pvalue=np.float64(2.186573534680074e-06))"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Data, josta on poistettu mahdolliset palkan puuttuvia arvoja sisältävät rivit\n",
"df_dropna = df.dropna(subset=['palkka'])\n",
"\n",
"# Vertailtavien ryhmien muodostaminen\n",
"k1 = df_dropna['palkka'][df_dropna['koulutus']==1] # peruskoulu suorittaneiden palkat\n",
"k2 = df_dropna['palkka'][df_dropna['koulutus']==2] # 2. aste suorittaneiden palkat\n",
"k3 = df_dropna['palkka'][df_dropna['koulutus']==3] # korkeakoulun suorittaneiden palkat\n",
"k4 = df_dropna['palkka'][df_dropna['koulutus']==4] # ylemmän korkeakoulun suorittaneiden palkat\n",
"\n",
"# F-testi\n",
"from scipy.stats import f_oneway\n",
"f_oneway(k1, k2, k3, k4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Seuraavassa pelkistetympi p-arvon tulostus. Erittäin pienet p-arvot esitetään tieteellisessä esitysmuodossa kymmenen potensseina (esimerkiksi yllä 2.19*10e-06). Seuraavassa p-arvot esitetään 3-desimaalin tarkkuudella, jolloin alle 0.001 suuruiset p-arvot näkyvät arvoina 0.000"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"p-arvo 0.000\n"
]
}
],
"source": [
"p = f_oneway(k1, k2, k3, k4)[1]\n",
"print(f'p-arvo {p:.3f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Eri koulutuksen suorittaneiden välillä on tilastollisesti merkitseviä eroja palkkakeskiarvoissa (F-testin p < 0,001)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Lisätietoa\n",
"\n",
"* Onko ryhmien välinen ero tilastolliseti merkitsevä\n",
"https://tilastoapu.wordpress.com/2012/04/14/onko-ryhmien-valinen-ero-tilastollisesti-merkitseva/\n",
"\n",
"* Lisätietoa p-arvoista\n",
"https://tilastoapu.wordpress.com/2012/02/14/p-arvo/\n",
"\n",
"* p-arvoja Pythonilla eri testaustilanteisiin\n",
"https://nbviewer.jupyter.org/github/taanila/selittava/blob/main/p.ipynb\n",
"\n",
"Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}