In [1]:
from datetime import datetime
print(f'Päivitetty {datetime.now()}')
Päivitetty 2021-02-26 16:13:55.026129

Seaborn

Seaborn on matplotlibin päälle rakennettu grafiikka-kirjasto, joka tarjoaa helppoja tapoja kaavioiden luontiin. Kaavioita voi muotoilla kuten mitä tahansa matplotlib-kaavioita, joten muotoilu edellyttää matplotlib-osaamista. Katso esimerkiksi https://tilastoapu.wordpress.com/2019/07/02/kuviot-ja-kaaviot-pythonilla/

Tässä notebooksissa on esimerkkejä seuraavista kaaviolajeista:

  • countplot - lukumääräyhteeveto kategoriselle muuttujalle
  • histplot - luokiteltu jakauma määrälliselle muuttujalle
  • barplot - virhemarginaaleilla varustettu pylväskaavio keskiarvoista
  • boxplot - viiden luvun yhteeveto
  • scatterplot - hajontakaavio, joka havainnollistaa kahden määrällisen muuttujan riippuvuutta
  • jointplot - hajontakaavio täydennettynä mukana olevien muuttujien jakaumilla
  • pairplot - useiden muuttujaparien hajontakaaviot samalla kertaa
  • heatmap - tällä voin havainnollistaa esimerkiksi korrelaatiomatriisia

Tässä notebookissa on myös esimerkkejä usean kaavion kuvioista käyttäen catplot-, displot- ja relplot-toimintoja.

Seaborn-kaavioita on helppo laatia, jos ymmärtää keskeiset parametrit:

  • x
  • y
  • hue (minkä muuttujan mukaan värierottelu)
  • data
  • row (catplot, displot ja relplot yhteydessä)
  • col (catplot, displot ja relplot yhteydessä)
  • kind (kaaviolaji catplot, displot ja relplot yhteydessä)
In [2]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

sns.set_style("whitegrid")
In [3]:
# Esimerkkidata ravintolaseurueiden tipeistä
tips = sns.load_dataset('tips')
tips
Out[3]:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2

244 rows × 7 columns

countplot

Sopii kategoristen muuttujien lukumääräyhteenvetoihin.

https://seaborn.pydata.org/generated/seaborn.countplot.html

In [4]:
# Eri kokoisten seurueiden lukumäärät
sns.countplot(x = 'size', data = tips)
Out[4]:
<AxesSubplot:xlabel='size', ylabel='count'>
In [5]:
# Lounas- ja päivällisseurueiden lukumäärät eri viikonpäivinä
sns.countplot(x = 'day', hue = 'time', data = tips)
Out[5]:
<AxesSubplot:xlabel='day', ylabel='count'>
In [6]:
# Kategoristen muuttujien lukumääräyhteenvedot

kategoriset = ['sex', 'smoker', 'day', 'time']

# Neljän kaavion kokoelma
fig1, axes1 = plt.subplots(1, 4, figsize = (12,3))

for i, var in enumerate(kategoriset):
    sns.countplot(x = var, data = tips, ax = axes1[i])

# Kaavioiden välinen tyhjä tila
fig1.subplots_adjust(wspace = 0.4)

countplot sopii käytettäväksi catplot-toiminnon yhteydessä (kind = 'count'). Tällöin voin esittää usean kaavion kokonaisuuksia.

https://seaborn.pydata.org/generated/seaborn.catplot.html

In [7]:
# Lounas- ja päivällisseurueiden lukumäärät sukupuolen ja tupakoinnin mukaan
sns.catplot(x = 'time', col = 'sex', row = 'smoker', data = tips, kind = 'count')
Out[7]:
<seaborn.axisgrid.FacetGrid at 0x12ed5a886a0>

histplot

Sopii määrällisen muuttujan luokitellun jakauman esittämiseen.

https://seaborn.pydata.org/generated/seaborn.histplot.html

In [8]:
# Laskun loppusummien jakauma
sns.histplot(x = 'total_bill', data = tips)
Out[8]:
<AxesSubplot:xlabel='total_bill', ylabel='Count'>
In [9]:
# Itse määritellyt luokkarajat
sns.histplot(x = 'total_bill', data = tips, bins = [0, 10, 20, 30, 40, 50, 60])
Out[9]:
<AxesSubplot:xlabel='total_bill', ylabel='Count'>
In [10]:
# Määrällisten muuttujien histogrammit

maaralliset = ['total_bill', 'tip', 'size']

# Kolmen kaavion kokoelma
fig2, axes2 = plt.subplots(1, 3, figsize = (12,3))

for i, var in enumerate(maaralliset):
    sns.histplot(x = var, data = tips, ax = axes2[i])

histplot sopii käytettäväksi displot-toiminnon yhteydessä. Tällöin voin esittää usean kaavion kokonaisuuksia.

https://seaborn.pydata.org/generated/seaborn.displot.html

In [11]:
# tipin jakaumat tupakoinnin ja ajan mukaan
sns.displot(x = 'tip', row = 'smoker', col = 'time', data = tips)
Out[11]:
<seaborn.axisgrid.FacetGrid at 0x12ed6246ee0>

barplot

Sopii keskiarvojen esittämiseen. Musta viiva havainnoillistaa virhemarginaalin (luottamusväli).

https://seaborn.pydata.org/generated/seaborn.barplot.html

In [12]:
# Eri päivien tippien keskiarvot
sns.barplot(x = 'day', y = 'tip', data = tips)
Out[12]:
<AxesSubplot:xlabel='day', ylabel='tip'>
In [13]:
# Eri päivien tippien keskiarvot sukupuolen mukaan
sns.barplot(x = 'day', y = 'tip', hue = 'sex', data = tips)
Out[13]:
<AxesSubplot:xlabel='day', ylabel='tip'>

barplot sopii käytettäväksi catplot-toiminnon yhteydessä (kind = 'bar'). Tällöin voin esittää usean kaavion kokonaisuuksia.

https://seaborn.pydata.org/generated/seaborn.catplot.html

In [14]:
# Eri päivien tippien keskiarvot tupakoinnin mukaan
sns.catplot(x = 'day', y = 'tip', col = 'smoker', data = tips, kind = 'bar')
Out[14]:
<seaborn.axisgrid.FacetGrid at 0x12ed67bdb80>

boxplot

Havainnollistaa viiden luvun yhteenvedon (pienin, alaneljännes, mediaani, yläneljännes, suurin). Lisäksi muista selvästi poikkeavat havainnot esitetään erillisinä pisteinä.

https://seaborn.pydata.org/generated/seaborn.boxplot.html

In [15]:
# Tipin suuruuden jakauma tunnuslukuina
sns.boxplot(x = 'tip', data = tips)
Out[15]:
<AxesSubplot:xlabel='tip'>
In [16]:
# Tipin suuruus lounas- ja päivällisseurueille
sns.boxplot(x = 'time', y = 'tip', data = tips)
Out[16]:
<AxesSubplot:xlabel='time', ylabel='tip'>
In [17]:
# boxplot() usealle muuttujalle (total_bill ja tip) sukupuolen mukaan

# Kahden kaavion kokoelma
fig3, axes3 = plt.subplots(1, 2, figsize = (10,3))

sns.boxplot(x = 'sex', y = 'total_bill', data = tips, ax = axes3[0])
sns.boxplot(x = 'sex', y = 'tip', data = tips, ax = axes3[1])

# Kaavioiden etäisyys toisistaan
fig2.subplots_adjust(wspace = 0.4)

boxplot sopii käytettäväksi catplot-toiminnon yhteydessä (kind = 'box'). Tällöin voin esittää usean kaavion kokonaisuuksia.

https://seaborn.pydata.org/generated/seaborn.catplot.html

In [18]:
# Laskun loppusumma seurueen koon ja ajan mukaan
sns.catplot(x = 'size', y = 'total_bill', col = 'time', data = tips, kind = 'box')
Out[18]:
<seaborn.axisgrid.FacetGrid at 0x12ed6ccb6a0>

scatterplot

Havainnollistaa kahden määrällisen muuttujan välisen riippuvuuden.

https://seaborn.pydata.org/generated/seaborn.scatterplot.html

In [19]:
sns.scatterplot(x = 'total_bill', y = 'tip', hue = 'time', data = tips)
Out[19]:
<AxesSubplot:xlabel='total_bill', ylabel='tip'>

scatterplot sopii käytettäväksi relplot-toiminnon yhteydessä (kind = 'scatter'). Tällöin voin esittää usean kaavion kokonaisuuksia.

https://seaborn.pydata.org/generated/seaborn.relplot.html

In [20]:
# Laskun loppusumma ajan mukaan. Värierottelu tupakoinnin mukaan.
sns.relplot(data = tips, x = 'total_bill', y = 'tip', col = 'time', hue = 'smoker', kind = 'scatter')
Out[20]:
<seaborn.axisgrid.FacetGrid at 0x12ed6afed00>

jointplot

Havainnollistaa kahden määrällisen muuttujan välisen riippuvuuden ja esittää samalla kummankin muuttujan jakaumat.

http://seaborn.pydata.org/generated/seaborn.jointplot.html

In [21]:
# Laskun loppusumman ja tipin välinen riippuvuus
sns.jointplot(x = 'total_bill', y = 'tip', data = tips, kind = 'reg')
Out[21]:
<seaborn.axisgrid.JointGrid at 0x12ed6c8fdf0>
In [22]:
# Värierottelu ajan mukaan
sns.jointplot(x = 'total_bill', y = 'tip', hue = 'time', data = tips)
Out[22]:
<seaborn.axisgrid.JointGrid at 0x12ed6a7f310>
In [23]:
# Avaan vielä toisen datan, jossa on pisteitä eri osaamisista ja opintomenestyksestä
opintomenestys = pd.read_excel('https://taanila.fi/opintomenestys.xlsx')
opintomenestys.head()
Out[23]:
koehenkilö verbaalinen looginen kielet matematiikka opintomenestys sukupuoli
0 2 26 32 8.2 7 16 Nainen
1 3 29 33 9.6 5 17 Nainen
2 6 28 36 9.2 7 19 Nainen
3 7 23 34 7.2 7 14 Nainen
4 10 29 34 9.7 8 19 Nainen
In [24]:
# Pudotan tarpeettoman muuttujan pois
opintomenestys = opintomenestys.drop('koehenkilö', axis = 1)
opintomenestys
Out[24]:
verbaalinen looginen kielet matematiikka opintomenestys sukupuoli
0 26 32 8.2 7 16 Nainen
1 29 33 9.6 5 17 Nainen
2 28 36 9.2 7 19 Nainen
3 23 34 7.2 7 14 Nainen
4 29 34 9.7 8 19 Nainen
5 28 35 9.6 7 18 Nainen
6 25 34 8.2 7 18 Nainen
7 28 36 9.2 9 17 Nainen
8 27 35 8.9 6 16 Nainen
9 26 34 7.9 7 15 Nainen
10 22 31 7.2 6 14 Nainen
11 27 34 8.6 7 16 Nainen
12 30 36 8.5 7 18 Nainen
13 27 34 8.9 6 17 Nainen
14 24 34 7.1 7 14 Nainen
15 22 37 6.3 8 13 Mies
16 24 36 7.3 8 15 Mies
17 24 35 6.7 9 16 Mies
18 24 33 7.2 6 13 Mies
19 26 37 7.9 9 17 Mies
20 26 36 8.6 7 17 Mies
21 27 37 8.7 8 16 Mies
22 20 33 6.2 6 14 Mies
23 26 40 8.1 10 18 Mies
24 21 33 6.9 6 13 Mies
25 25 36 7.5 8 15 Mies
26 26 35 7.6 7 14 Mies
27 28 37 8.4 8 17 Mies
28 25 36 7.9 7 16 Mies
29 21 36 5.9 7 13 Mies

pairplot

Esittää hajontakaaviot kaikille numeerisille muuttujille.

https://seaborn.pydata.org/generated/seaborn.pairplot.html

In [25]:
sns.pairplot(data = opintomenestys, kind = 'reg')
Out[25]:
<seaborn.axisgrid.PairGrid at 0x12ed85a7e20>
In [26]:
# Tässä tarkastelen ainoastaan opintomenestyksen riippuvuutta muista muuttujista
sns.pairplot(x_vars = ['opintomenestys', 'verbaalinen', 'looginen', 'kielet', 'matematiikka'], 
                       y_vars = ['opintomenestys'], data = opintomenestys, kind = 'reg')
Out[26]:
<seaborn.axisgrid.PairGrid at 0x12ed91e1b80>
In [27]:
# Tässä teen värierottelun sukupuolen mukaan
sns.pairplot(data = opintomenestys, hue = 'sukupuoli')
Out[27]:
<seaborn.axisgrid.PairGrid at 0x12eda5be760>

heatmap

Sopii esimerkiksi korrelaatiomatriisin havainnollistamiseen.

https://seaborn.pydata.org/generated/seaborn.heatmap.html

In [28]:
sns.heatmap(data = opintomenestys.corr(), annot = True)
Out[28]:
<AxesSubplot:>