{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Päivitetty 2023-12-11 / Aki Taanila\n"
]
}
],
"source": [
"from datetime import datetime\n",
"print(f'Päivitetty {datetime.now().date()} / Aki Taanila')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ristiintaulukointi\n",
"\n",
"Kahden kategorisen muuttujan riippuvuutta tarkastelen ristiintaulukoinnin avulla"
]
},
{
"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('white')"
]
},
{
"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": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Mies | \n",
" Nainen | \n",
"
\n",
" \n",
" \n",
" \n",
" Peruskoulu | \n",
" 22 | \n",
" 5 | \n",
"
\n",
" \n",
" 2. aste | \n",
" 23 | \n",
" 7 | \n",
"
\n",
" \n",
" Korkeakoulu | \n",
" 15 | \n",
" 7 | \n",
"
\n",
" \n",
" Ylempi korkeakoulu | \n",
" 2 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Mies Nainen\n",
"Peruskoulu 22 5\n",
"2. aste 23 7\n",
"Korkeakoulu 15 7\n",
"Ylempi korkeakoulu 2 0"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Listat muuttujien tekstimuotoisista arvoista\n",
"koulutus = ['Peruskoulu', '2. aste', 'Korkeakoulu', 'Ylempi korkeakoulu']\n",
"sukup = ['Mies', 'Nainen']\n",
"\n",
"# Ristiintaulukointi lukumäärinä\n",
"df1 = pd.crosstab(df['koulutus'], df['sukup'])\n",
"\n",
"# Otsikot kuntoon edellä määriteltyjä listoja käyttäen\n",
"df1.index = koulutus\n",
"df1.columns = sukup\n",
"df1"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" Mies | \n",
" Nainen | \n",
"
\n",
" \n",
" \n",
" \n",
" Peruskoulu | \n",
" 35.5 % | \n",
" 26.3 % | \n",
"
\n",
" \n",
" 2. aste | \n",
" 37.1 % | \n",
" 36.8 % | \n",
"
\n",
" \n",
" Korkeakoulu | \n",
" 24.2 % | \n",
" 36.8 % | \n",
"
\n",
" \n",
" Ylempi korkeakoulu | \n",
" 3.2 % | \n",
" 0.0 % | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Ristiintaulukointi; prosentit sarakkeiden kokonaismääristä (normalize='columns')\n",
"df2 = pd.crosstab(df['koulutus'], df['sukup'], normalize='columns')*100\n",
"\n",
"# Otsikot kuntoon edellä määriteltyjä listoja käyttäen\n",
"df2.index = koulutus\n",
"df2.columns = sukup\n",
"\n",
"df2.style.format('{:.1f} %') # Ulkoasun viimeistely"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" Mies, n = 62 | \n",
" Nainen, n = 19 | \n",
"
\n",
" \n",
" \n",
" \n",
" Peruskoulu | \n",
" 35.5 % | \n",
" 26.3 % | \n",
"
\n",
" \n",
" 2. aste | \n",
" 37.1 % | \n",
" 36.8 % | \n",
"
\n",
" \n",
" Korkeakoulu | \n",
" 24.2 % | \n",
" 36.8 % | \n",
"
\n",
" \n",
" Ylempi korkeakoulu | \n",
" 3.2 % | \n",
" 0.0 % | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Tässä edellinen n-arvoilla täydennettynä\n",
"\n",
"df3 = pd.crosstab(df['koulutus'], df['sukup'], normalize='columns') * 100\n",
"df3.index = koulutus\n",
"df3.columns = sukup\n",
"\n",
"# Lukumäärätaulukosta (df1) n-arvot sarakeotsikoihin\n",
"for sarake in df3.columns:\n",
" df3 = df3.rename(columns={sarake:f'{sarake}, n = {df1[sarake].sum()}'})\n",
"\n",
"df3.style.format('{:.1f} %')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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ezIyMnTHHXdcc3yhCy7FixfXxYsXHYZd/lyiRIkbzl+mTBklJyerRIkS8vHxcUuNAADAtWw2mzIyMlSmTJnrTlfogkvVqlV17tw5nTp1SnfddZck6ffff1e5cuWum8AuM5lMKleunLvLBAAALlag33kP1OGU++67T9HR0XrrrbdksVh0+PBhffjhh3rqqae8XRoAAPAyH9uNroLxglOnTunNN99USkqKTCaT2rVrp0GDBslsNnu7NAAA4EWFMrgAAADkp9CdKgIAALgWggsAADAMggsAADAMggtwm7NarTp8+LC3ywAAlyC4uEDTpk0VERGhyMhIRUZGqlatWmrUqJHeeecd5eV59vHcsbGxmjJlisuXu3jx4iL3NGJX2717t7p166a6deuqYcOGeu2113TmzBm3t9u/f3999dVXbm/ndhEWFqaUlBSHYV9++aUiIiK0YMGCm1pmfHy84uPjXVGeg5SUFIWFhbl8udKl49rixYvdsmxnjRw5Ug0bNtTp06cdhufm5qpTp07q1auXbDab12pu1aqV/vWvf+U7zpU1sR9dQnBxkcTERG3ZskVbtmzR1q1bNXPmTH311Vd6//33vV0aCoGsrCx1795dkZGR+vHHH7V8+XKdO3dOCQkJbm/77Nmzbm/jdvbxxx9r9OjRmjx5sp599llvl1MkDR06VHfddZeGDh3qMHzKlCk6deqU3nnnHa8+KX3FihV68sknvdZ+UUNwcZOwsDDVqVNHO3fuVHZ2tiZNmqTHH39cdevWVY8ePXTw4EGHaUePHq169erpxRdfzLd348qelH379qlLly6qU6eOmjRpoiFDhthfTnWlnTt3qn79+pozZ46kSz9gb7zxhho1aqR69eqpV69e+t///V9J0pEjRxQWFqYjR47Y558yZYpiY2OvWm5+6dxdfwncLtLS0vTAAw+od+/e8vf3V0hIiDp37qxNmzYVaH6LxaJhw4apefPmqlWrlh555BFNnTrVPv6bb75Rq1atFB0drSeeeEIffvihJOn111/X5s2bNW3aNL344ouSpEOHDunFF19UvXr11KRJE02YMEHZ2dmuX2mDs9lsGj16tD755BPNnTtXTZo0sY87evSoXn31VTVo0EANGzbUwIEDdeLECUmX/n80btxYAwcOVO3atfXxxx87LPfo0aN6/PHH9dZbb8lms93w+PDLL7/of/7nf9SoUSNFREQoJiZGW7duzbfe119/Xa1atdLx48clSatXr1ZMTIyioqLUokULzZkzx94LnN//2fx6m6Sre3LzO164U7FixTRhwgRt2rRJn376qSRp48aNmjNnjiZOnKjg4OCr5inIcXfhwoVq0aKFatasqRdffFG//fabnn76aUVGRqpDhw726adMmaKXX35Zffr0Ua1atdS0aVMtXLjQvqyC9iqsW7dO0dHRWrlypST2o5vdjwgubpCTk6OUlBRt2LBBDRs21IQJE7R27VrNmTNH69atU82aNfX888/rzz//tM9z6NAhrV27Vu++++4Nl5+YmKgGDRpo48aN+vLLL7Vz50598cUXDtP89ttvev755zVw4EDFxcVJkvr27atDhw5pyZIlSk5OVqVKlRQXF5dv6IFrVapUSTNmzHB4iOI333yj6tWrF2j+f/7znzpy5IgWLVqkLVu2aNiwYZowYYIOHjyorKwsDR48WMOHD1dqaqrGjRun6dOna/v27RozZoxq166tXr16aerUqcrMzFRcXJyqVq2qH374QQsWLNDPP//sltOLRpaTk6OBAwfqiy++UFJSkiIiIhzGPf/88zKbzfr222/tP0IvvviicnNzJUnHjh1TpUqVtH79eodemsOHDys2NlZt27ZVQkKCfHx8rnt8yMrK0ksvvaQWLVrohx9+UEpKiipWrHjVcSIvL08JCQnatWuXPv30U5UtW1YbNmzQq6++qu7du2vjxo0aP368Zs+erblzvfe6xltRqVIlDR8+XOPGjdOuXbsUHx+v1157TTVq1Mh3+oIcd5ctW6aFCxfq3//+t1JTU/Xyyy9rzJgx+umnn+Tv7+/wx8GaNWsUFRWlTZs26c0339SoUaO0fv36AtefnJysAQMGaPz48XriiSfYj24BwcVFEhMTVbt2bdWuXVsNGjTQqFGj1K1bNz333HNKSkrSgAEDdM8996hYsWLq3bu3cnJytHbtWvv8rVu3VmBg4A3ffi1d+utj3bp1WrVqlUwmk5YuXapu3brZx+/YsUPdunXTCy+8oI4dO0q6tKNv3LhRb7zxhkJDQxUQEKBBgwYpNzdXycnJLv8+cG02m00TJkzQ999/r9dff71A8/Tp00cTJ05UUFCQjh07pmLFikmS/a+zgIAALVq0SOvXr1flypWVmpqa7wF97dq1ys7O1oABA1Ss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",
"text/plain": [
"