Nauč se Python > Kurzy > Datový kurz PyLadies > EDA — více proměnných a vztahy > EDA - Analýza více proměnných a vztahů

EDA - Analýza více proměnných a vztahů

V minulé lekci jsme se společně podívali na základy explorační datové analýzy a podrobněji jsme analyzovali proměnné každou zvlášť.

Následující lekce pokryje další část EDA - analýzu více proměnných současně a hledání vztahů mezi nimi.

Data k analýze jsou připravena v souboru salary.csv.

In [1]:
import pandas as pd
import seaborn as sns

%matplotlib inline

V dnešní lekci poprvé použijeme knihovnu seaborn. Seaborn je nadstavbou matplotlibu a přináší nám možnost vykreslit jeden velmi užitečný graf - tzv. heatmapu.

Načtení a kontrola dat

Nejprve si samozřejmě načteme data, která budeme dnes zpracovávat. Jedná se o informace o zaměstnancích, jejich věku, životním stylu, zkušenostech v oboru a platu. Našim cílem je zjistit, zda je mezi jednotlivými vlastnostmi zaměstnanců nějaký vztah.

Data, která dnes budeme analyzovat, jsou náhodně generovaná tak, aby alespoň některé ukázkové příklady hezky vycházely. Generování takových dat je samo o sobě náročný úkol.

In [2]:
data = pd.read_csv("static/salary.csv")

Načtení se zřejmě povedlo, ale jistotu získáme, až když si data prohlédneme.

Pro začátek uděláme klasickou sadu exploračních úkonů, abychom se s daty seznámili.

In [3]:
data
Out[3]:
id age healthy_eating active_lifestyle salary months_of_exp sex
0 0 36 5 5 2297 281.0 female
1 1 55 3 5 1134 15.0 female
2 2 61 8 1 4969 359.0 female
3 3 29 3 6 902 30.0 female
4 4 34 6 2 3574 225.0 female
... ... ... ... ... ... ... ...
995 995 33 7 7 2996 240.0 female
996 996 21 1 2 667 69.0 male
997 997 49 9 7 4158 298.0 female
998 998 56 6 7 2414 268.0 female
999 999 64 4 9 788 94.0 male

1000 rows × 7 columns

In [4]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 7 columns):
id                  1000 non-null int64
age                 1000 non-null int64
healthy_eating      1000 non-null int64
active_lifestyle    1000 non-null int64
salary              1000 non-null int64
months_of_exp       1000 non-null float64
sex                 1000 non-null object
dtypes: float64(1), int64(5), object(1)
memory usage: 54.8+ KB
In [5]:
data.isnull().sum()
Out[5]:
id                  0
age                 0
healthy_eating      0
active_lifestyle    0
salary              0
months_of_exp       0
sex                 0
dtype: int64
In [6]:
data.describe()
Out[6]:
id age healthy_eating active_lifestyle salary months_of_exp
count 1000.000000 1000.000000 1000.000000 1000.000000 1000.00000 1000.000000
mean 499.500000 41.155000 4.944000 5.683000 2227.46100 175.388000
std 288.819436 13.462995 2.013186 2.048587 1080.20976 96.778311
min 0.000000 18.000000 0.000000 0.000000 553.00000 3.000000
25% 249.750000 30.000000 4.000000 4.000000 1360.00000 101.000000
50% 499.500000 41.000000 5.000000 6.000000 2174.00000 173.000000
75% 749.250000 53.000000 6.000000 7.000000 2993.75000 248.000000
max 999.000000 64.000000 10.000000 10.000000 5550.00000 360.000000
In [7]:
data.hist(figsize=(20, 20));

Data se zdají být na první pohled v pořádku, neobsahují nulové hodnoty ani příliš mnoho odlehlých měření.

V datech máme následující informace:

  • identifikační číslo zaměstnance ve sloupci id
  • věk zaměstnance ve sloupci age (proměnná numerická, spojitá)
  • míra aktivního životního stylu a zdravého stravování ve sloupcích active_lifestyle a healthy_eating - oboje označeno číslem od 0 do 10 (ordinální proměnné)
  • počet měsíců v oboru ve sloupci months_of_exp (proměnná numerická, spojitá)
  • měsíční mzda ve sloupci salary (proměnná numerická, spojitá)

Pro lepší představu o datech a také pro ukázku dalších technik a metod si do tabulky přidáme nový sloupec, který bude obsahovat měsíční mzdu v českých korunách.

In [8]:
data["salary_czk"] = data.salary * 23
In [9]:
data.describe()
Out[9]:
id age healthy_eating active_lifestyle salary months_of_exp salary_czk
count 1000.000000 1000.000000 1000.000000 1000.000000 1000.00000 1000.000000 1000.00000
mean 499.500000 41.155000 4.944000 5.683000 2227.46100 175.388000 51231.60300
std 288.819436 13.462995 2.013186 2.048587 1080.20976 96.778311 24844.82448
min 0.000000 18.000000 0.000000 0.000000 553.00000 3.000000 12719.00000
25% 249.750000 30.000000 4.000000 4.000000 1360.00000 101.000000 31280.00000
50% 499.500000 41.000000 5.000000 6.000000 2174.00000 173.000000 50002.00000
75% 749.250000 53.000000 6.000000 7.000000 2993.75000 248.000000 68856.25000
max 999.000000 64.000000 10.000000 10.000000 5550.00000 360.000000 127650.00000

Korelace a korelační koeficienty

Korelace znamená vzájemný vztah mezi dvěma veličinami nebo procesy. Ve statistice se tím nejčastěji myslí lineární vztah mezi dvěma proměnnými. Míra korelace se vyjadřuje korelačním koeficientem, který nabývá hodnot od -1 po 1.

  • 1 znamená, že je mezi dvěma proměnnými přímá závislost a tedy když jedna proměnná roste, roste i druhá proměnná.
  • 0 značí nulový vztah (absenci korelace).
  • -1 znamená, že je mezi dvěma proměnnými nepřímá závislost a tedy když jedna proměnná roste, druhá proměnná klesá.

Korelační koeficient 1 nebo -1 nejčastěji znamená, že je jedna proměnná přímo vypočítaná z druhé a pro další analýzu většinou nemá žádný přínos. V praxi se korelační koeficienty těmto krajním hodnotám jen přibližují a naznačují tím, že stojí za to vztah mezi nimi prozkoumat hlouběji.

Korelace neimplikuje kauzalitu

Pozor na chybné závěry vyplývající z interpretace korelačních koeficientů. Korelace je nutnou, ale nikoli postačující podmínkou kauzality. Korelace znamená, že se dvě proměnné mění stejným způsobem, ale to nemusí znamenat, že nárůst jedné z nich zapříčiňuje nárůst druhé.

Příklad z Wikipedie:

  • Korelace: Od 50. let 20. století prudce vzrostla jak úroveň atmosférického CO2, tak také výskyt obezity.
  • Falešný závěr: Takže atmosférický CO2 způsobuje obezitu. (Nebo naopak obezita způsobuje nárůst CO2 v atmosféře.)
  • Skutečná kauzalita: obojí je důsledkem toho, že bohatší populace víc jedí a zároveň spotřebovávají více energie.

Na webu spurious correlations je pak k nalezení celá řada podezřelých korelací, u nichž si kauzalitu lze představit jen těžko. Věděli jste například, že s klesajícím počtem svateb v Kentucky klesá i počet lidí, kteří se utopili po pádu z rybářské lodě? Náhoda? :)

Druhy korelací

Korelace lze identifikovat několika různými způsoby. Základní rozdělení je závislé na typu proměnných, které zkoumáme. Možné kombinace jsou:

  • dvě numerické proměnné,
  • dvě kategoriální proměnné nebo
  • numerická a kategoriální proměnná.

První možnost je ta asi nejběžnější a proto je pro ni v pandasu vše připraveno a můžeme se rovnou podívat na všechny možné kombinace proměnných. K tomu nám poslouží scatter_matrix z modulu pandas.plotting.

Dvě numerické proměnné

In [10]:
from pandas.plotting import scatter_matrix
In [11]:
scatter_matrix(data, figsize=(20,20));