{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Päivitetty 2023-05-02 / Aki Taanila\n" ] } ], "source": [ "from datetime import datetime\n", "print(f'Päivitetty {datetime.now().date()} / Aki Taanila')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Puuttuvien (missing) arvojen käsittely\n", "\n", "Puuttuvat arvot eivät ole ongelma kuvailevassa analytiikassa. Selittävässä analytiikassakaan puuttuvista arvoista ei tarvitse huolehtia muuta kuin merkitsevyystestauksen yhteydessä. Useimmille ennakoivan analytiikan malleille puuttuvat arvot ovat myrkkyä.\n", "\n", "Tärkeitä työkaluja puuttuvien arvojen käsittelyyn ovat **isnull()**, **notnull()**, **dropna()** ja **fillna()**. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nrosukupikäperhekoulutuspalveluvpalkkajohtotyötovtyöymppalkkattyötehttyötervlomaosakuntosahieroja
0113811.022.0358733.0333NaNNaNNaNNaN
1212922.010.0296315.0213NaNNaNNaNNaN
2313011.07.0198934.01131.0NaNNaNNaN
3413621.014.0214433.03331.0NaNNaNNaN
4512412.04.0218323.02121.0NaNNaNNaN
...................................................
777812213.00.0159844.0434NaN1.01.0NaN
787913311.02.0163813.02121.0NaNNaNNaN
798012712.07.0261234.03331.0NaN1.0NaN
808113522.016.0280834.0333NaNNaNNaNNaN
818223523.015.0218334.04341.0NaNNaNNaN
\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": [ "# Avaan datan\n", "df = pd.read_excel('https://taanila.fi/data1.xlsx')\n", "df" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nrosukupikäperhekoulutuspalveluvpalkkajohtotyötovtyöymppalkkattyötehttyötervlomaosakuntosahieroja
0FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrueTrue
1FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrueTrue
2FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrue
3FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrue
4FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrue
...................................................
77FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseTrue
78FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrue
79FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseTrue
80FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrueTrue
81FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueTrue
\n", "

82 rows × 16 columns

\n", "
" ], "text/plain": [ " nro sukup ikä perhe koulutus palveluv palkka johto työtov \\\n", "0 False False False False False False False False False \n", "1 False False False False False False False False False \n", "2 False False False False False False False False False \n", "3 False False False False False False False False False \n", "4 False False False False False False False False False \n", ".. ... ... ... ... ... ... ... ... ... \n", "77 False False False False False False False False False \n", "78 False False False False False False False False False \n", "79 False False False False False False False False False \n", "80 False False False False False False False False False \n", "81 False False False False False False False False False \n", "\n", " työymp palkkat työteht työterv lomaosa kuntosa hieroja \n", "0 False False False True True True True \n", "1 False False False True True True True \n", "2 False False False False True True True \n", "3 False False False False True True True \n", "4 False False False False True True True \n", ".. ... ... ... ... ... ... ... \n", "77 False False False True False False True \n", "78 False False False False True True True \n", "79 False False False False True False True \n", "80 False False False True True True True \n", "81 False False False False True True True \n", "\n", "[82 rows x 16 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# isnull() kertoo mitkä ovat puuttuvia arvoja (True) ja mitkä eivät (False)\n", "df.isnull()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "nro 0\n", "sukup 0\n", "ikä 0\n", "perhe 0\n", "koulutus 1\n", "palveluv 2\n", "palkka 0\n", "johto 0\n", "työtov 1\n", "työymp 0\n", "palkkat 0\n", "työteht 0\n", "työterv 35\n", "lomaosa 62\n", "kuntosa 73\n", "hieroja 60\n", "dtype: int64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Puuttuvien arvojen lukumäärät\n", "# Laskenta perustuu siihen että True=1 ja False=0\n", "df.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nrosukupikäperhekoulutuspalveluvpalkkajohtotyötovtyöymppalkkattyötehttyötervlomaosakuntosahieroja
0TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalseFalse
1TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalseFalse
2TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalse
3TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalse
4TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalse
...................................................
77TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseTrueTrueFalse
78TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalse
79TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseTrueFalse
80TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalseFalse
81TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalseFalseFalse
\n", "

82 rows × 16 columns

\n", "
" ], "text/plain": [ " nro sukup ikä perhe koulutus palveluv palkka johto työtov \\\n", "0 True True True True True True True True True \n", "1 True True True True True True True True True \n", "2 True True True True True True True True True \n", "3 True True True True True True True True True \n", "4 True True True True True True True True True \n", ".. ... ... ... ... ... ... ... ... ... \n", "77 True True True True True True True True True \n", "78 True True True True True True True True True \n", "79 True True True True True True True True True \n", "80 True True True True True True True True True \n", "81 True True True True True True True True True \n", "\n", " työymp palkkat työteht työterv lomaosa kuntosa hieroja \n", "0 True True True False False False False \n", "1 True True True False False False False \n", "2 True True True True False False False \n", "3 True True True True False False False \n", "4 True True True True False False False \n", ".. ... ... ... ... ... ... ... \n", "77 True True True False True True False \n", "78 True True True True False False False \n", "79 True True True True False True False \n", "80 True True True False False False False \n", "81 True True True True False False False \n", "\n", "[82 rows x 16 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# notnull() toimii päinvastoin kuin isnull()\n", "df.notnull()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "nro 82\n", "sukup 82\n", "ikä 82\n", "perhe 82\n", "koulutus 81\n", "palveluv 80\n", "palkka 82\n", "johto 82\n", "työtov 81\n", "työymp 82\n", "palkkat 82\n", "työteht 82\n", "työterv 47\n", "lomaosa 20\n", "kuntosa 9\n", "hieroja 22\n", "dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Arvojen lukumäärät\n", "df.notnull().sum()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "79" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Poistan (dropna) rivit, joilla oli puuttuva arvo muuttujalle koulutus, palveluv tai työtov\n", "df_dropna = df.dropna(subset = ['koulutus', 'palveluv', 'työtov'])\n", "\n", "# Montako riviä jäi jäljelle?\n", "df_dropna.shape[0]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
työtervlomaosakuntosahieroja
00.00.00.00.0
10.00.00.00.0
21.00.00.00.0
31.00.00.00.0
41.00.00.00.0
...............
770.01.01.00.0
781.00.00.00.0
791.00.01.00.0
800.00.00.00.0
811.00.00.00.0
\n", "

79 rows × 4 columns

\n", "
" ], "text/plain": [ " työterv lomaosa kuntosa hieroja\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 1.0 0.0 0.0 0.0\n", "3 1.0 0.0 0.0 0.0\n", "4 1.0 0.0 0.0 0.0\n", ".. ... ... ... ...\n", "77 0.0 1.0 1.0 0.0\n", "78 1.0 0.0 0.0 0.0\n", "79 1.0 0.0 1.0 0.0\n", "80 0.0 0.0 0.0 0.0\n", "81 1.0 0.0 0.0 0.0\n", "\n", "[79 rows x 4 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Korvaan (fillna) dikotomisten muuttujien puuttuvat arvot nollilla\n", "df_fillna = df_dropna[['työterv', 'lomaosa', 'kuntosa', 'hieroja']].fillna(value=0)\n", "df_fillna" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nrosukupikäperhekoulutuspalveluvpalkkajohtotyötovtyöymppalkkattyötehttyötervlomaosakuntosahieroja
565716122.036.031192NaN2151.0NaNNaN1.0
\n", "
" ], "text/plain": [ " nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp \\\n", "56 57 1 61 2 2.0 36.0 3119 2 NaN 2 \n", "\n", " palkkat työteht työterv lomaosa kuntosa hieroja \n", "56 1 5 1.0 NaN NaN 1.0 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Voin suodattaa puuttuvat arvot näkyviin\n", "# Suodatan ne rivit, joilla työtov-muuttuja sisältää puuttuvan arvon\n", "df[df['työtov'].isnull()]\n", "# työtov-muuttujalla on puuttuva arvo indeksinumeron 56 kohdalla" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.061728395061729" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Korvaan alkuperäisessä datassa työtov-muuttujan puuttuvan arvon keskiarvolla\n", "df['työtov'] = df['työtov'].fillna(df['työtov'].mean())\n", "\n", "# Tarkistan miten korvaaminen onnistui (aiemmin selvisi, että puuttuva arvo on indeksinumeron 56 kohdalla)\n", "df.loc[56, 'työtov']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lisätietoa\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.10.9" } }, "nbformat": 4, "nbformat_minor": 2 }