You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/sk/1-Introduction/04-stats-and-probability/notebook.ipynb

581 lines
18 KiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Úvod do pravdepodobnosti a štatistiky\n",
"V tomto zošite si zahráme s niektorými konceptmi, o ktorých sme už predtým hovorili. Mnohé koncepty z pravdepodobnosti a štatistiky sú dobre zastúpené v hlavných knižniciach pre spracovanie dát v Pythone, ako sú `numpy` a `pandas`.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import random\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Náhodné premenné a rozdelenia\n",
"Začnime výberom vzorky 30 hodnôt z rovnomerného rozdelenia od 0 do 9. Vypočítame tiež priemer a rozptyl.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sample = [ random.randint(0,10) for _ in range(30) ]\n",
"print(f\"Sample: {sample}\")\n",
"print(f\"Mean = {np.mean(sample)}\")\n",
"print(f\"Variance = {np.var(sample)}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Na vizuálne odhadnutie, koľko rôznych hodnôt je v vzorke, môžeme nakresliť **histogram**:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.hist(sample)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Analyzovanie reálnych dát\n",
"\n",
"Pri analyzovaní dát zo skutočného sveta sú stredná hodnota a rozptyl veľmi dôležité. Načítať si dáta o hráčoch baseballu zo stránky [SOCR MLB Height/Weight Data](http://wiki.stat.ucla.edu/socr/index.php/SOCR_Data_MLB_HeightsWeights)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv(\"../../data/SOCR_MLB.tsv\",sep='\\t', header=None, names=['Name','Team','Role','Weight','Height','Age'])\n",
"df\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> Používame tu balík [**Pandas**](https://pandas.pydata.org/) na analýzu dát. O Pandas a práci s dátami v Pythone budeme hovoriť neskôr v tomto kurze.\n",
"\n",
"Vypočítajme priemerné hodnoty pre vek, výšku a váhu:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df[['Age','Height','Weight']].mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Teraz sa zamerajme na výšku a vypočítajme štandardnú odchýlku a rozptyl:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(list(df['Height'])[:20])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mean = df['Height'].mean()\n",
"var = df['Height'].var()\n",
"std = df['Height'].std()\n",
"print(f\"Mean = {mean}\\nVariance = {var}\\nStandard Deviation = {std}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Okrem priemeru má zmysel pozrieť sa aj na mediánovú hodnotu a kvartily. Dá sa to vizualizovať pomocou **box plotu**:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,2))\n",
"plt.boxplot(df['Height'].ffill(), vert=False, showmeans=True)\n",
"plt.grid(color='gray', linestyle='dotted')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Môžeme tiež vytvoriť krabicové grafy pre podmnožiny našich dát, napríklad zoskupené podľa úlohy hráča.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.boxplot(column='Height', by='Role', figsize=(10,8))\n",
"plt.xticks(rotation='vertical')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Poznámka**: Tento diagram naznačuje, že priemerne sú výšky prvých bazemanov väčšie než výšky druhých bazemanov. Neskôr sa naučíme, ako túto hypotézu formálnejšie otestovať a ako ukázať, že naše dáta sú štatisticky významné. \n",
"\n",
"Vek, výška a váha sú všetko spojité náhodné premenné. Ako si myslíte, aké je ich rozdelenie? Dobrým spôsobom, ako to zistiť, je nakresliť histogram hodnôt: \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df['Weight'].hist(bins=15, figsize=(10,6))\n",
"plt.suptitle('Weight distribution of MLB Players')\n",
"plt.xlabel('Weight')\n",
"plt.ylabel('Count')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Normálne rozdelenie\n",
"\n",
"Vytvorme umelý vzorku hmotností, ktorá nasleduje normálne rozdelenie so rovnakým priemerom a rozptylom ako naše skutočné údaje:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"generated = np.random.normal(mean, std, 1000)\n",
"generated[:20]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.hist(generated, bins=15)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.hist(np.random.normal(0,1,50000), bins=300)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Keďže väčšina hodnôt v reálnom živote je normálne rozdelená, nemali by sme používať generátor rovnomerných náhodných čísel na generovanie vzorových dát. Tu je, čo sa stane, ak sa pokúsime generovať váhy s rovnomerným rozdelením (generované pomocou `np.random.rand`):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"wrong_sample = np.random.rand(1000)*2*std+mean-std\n",
"plt.figure(figsize=(10,6))\n",
"plt.hist(wrong_sample)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Intervaly spoľahlivosti\n",
"\n",
"Teraz vypočítajme intervaly spoľahlivosti pre hmotnosti a výšky hráčov baseballu. Použijeme kód [z tejto diskusie na stackoverflow](https://stackoverflow.com/questions/15033511/compute-a-confidence-interval-from-sample-data):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import scipy.stats\n",
"\n",
"def mean_confidence_interval(data, confidence=0.95):\n",
" a = 1.0 * np.array(data)\n",
" n = len(a)\n",
" m, se = np.mean(a), scipy.stats.sem(a)\n",
" h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)\n",
" return m, h\n",
"\n",
"for p in [0.85, 0.9, 0.95]:\n",
" m, h = mean_confidence_interval(df['Weight'].fillna(method='pad'),p)\n",
" print(f\"p={p:.2f}, mean = {m:.2f} ± {h:.2f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Testovanie hypotéz\n",
"\n",
"Preskúmajme rôzne úlohy v našej databáze baseballových hráčov:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.groupby('Role').agg({ 'Weight' : 'mean', 'Height' : 'mean', 'Age' : 'count'}).rename(columns={ 'Age' : 'Count'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Otestujme hypotézu, že prví basebaloví hráči sú vyšší ako druhí basebaloví hráči. Najjednoduchší spôsob, ako to urobiť, je otestovať intervaly spoľahlivosti:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for p in [0.85,0.9,0.95]:\n",
" m1, h1 = mean_confidence_interval(df.loc[df['Role']=='First_Baseman',['Height']],p)\n",
" m2, h2 = mean_confidence_interval(df.loc[df['Role']=='Second_Baseman',['Height']],p)\n",
" print(f'Conf={p:.2f}, 1st basemen height: {m1-h1[0]:.2f}..{m1+h1[0]:.2f}, 2nd basemen height: {m2-h2[0]:.2f}..{m2+h2[0]:.2f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vidíme, že intervaly sa neprekrývajú.\n",
"\n",
"Štatisticky správnejším spôsobom, ako dokázať hypotézu, je použitie **Studentovho t-testu**:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from scipy.stats import ttest_ind\n",
"\n",
"tval, pval = ttest_ind(df.loc[df['Role']=='First_Baseman',['Height']], df.loc[df['Role']=='Second_Baseman',['Height']],equal_var=False)\n",
"print(f\"T-value = {tval[0]:.2f}\\nP-value: {pval[0]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dve hodnoty vrátené funkciou `ttest_ind` sú:\n",
"* p-hodnota sa dá považovať za pravdepodobnosť, že dve rozdelenia majú rovnaký priemer. V našom prípade je veľmi nízka, čo znamená, že existuje silný dôkaz podporujúci, že prví basemanovia sú vyšší.\n",
"* t-hodnota je medzihodnota normalizovaného rozdielu priemerov, ktorá sa používa v t-teste a porovnáva sa s prahovou hodnotou pre danú úroveň spoľahlivosti.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simulácia normálneho rozdelenia pomocou centrálnej limitnej vety\n",
"\n",
"Pseudo-náhodný generátor v Pythone je navrhnutý tak, aby nám poskytoval rovnomerné rozdelenie. Ak chceme vytvoriť generátor pre normálne rozdelenie, môžeme použiť centrálnu limitnú vetu. Aby sme získali hodnotu s normálnym rozdelením, jednoducho vypočítame priemer vzorky vygenerovanej rovnomerne.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def normal_random(sample_size=100):\n",
" sample = [random.uniform(0,1) for _ in range(sample_size) ]\n",
" return sum(sample)/sample_size\n",
"\n",
"sample = [normal_random() for _ in range(100)]\n",
"plt.figure(figsize=(10,6))\n",
"plt.hist(sample)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Korelácia a Evil Baseball Corp\n",
"\n",
"Korelácia nám umožňuje nájsť vzťahy medzi dátovými sekvenciami. V našom hračkárskom príklade si predstavme, že existuje zlá baseballová korporácia, ktorá platí svojim hráčom podľa ich výšky - čím vyšší hráč je, tým viac peňazí dostane. Predpokladajme základný plat 1000 dolárov a dodatočný bonus od 0 do 100 dolárov, závisiac od výšky. Vezmeme skutočných hráčov z MLB a vypočítame ich imaginárne platy:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"heights = df['Height'].fillna(method='pad')\n",
"salaries = 1000+(heights-heights.min())/(heights.max()-heights.mean())*100\n",
"print(list(zip(heights, salaries))[:10])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Teraz vypočítajme kovarianciu a koreláciu týchto sekvencií. `np.cov` nám poskytne takzvanú **kovariančnú maticu**, ktorá je rozšírením kovariancie na viacero premenných. Prvok $M_{ij}$ kovariančnej matice $M$ je korelácia medzi vstupnými premennými $X_i$ a $X_j$, a diagonálne hodnoty $M_{ii}$ sú rozptylom $X_{i}$. Podobne `np.corrcoef` nám poskytne **korelačnú maticu**.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(f\"Covariance matrix:\\n{np.cov(heights, salaries)}\")\n",
"print(f\"Covariance = {np.cov(heights, salaries)[0,1]}\")\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Korelácia rovná 1 znamená, že medzi dvoma premennými existuje silný **lineárny vzťah**. Lineárny vzťah môžeme vizuálne vidieť tak, že vykreslíme jednu hodnotu proti druhej:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(heights,salaries)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Uvidíme, čo sa stane, ak vzťah nie je lineárny. Predpokladajme, že naša korporácia sa rozhodla skryť zrejmú lineárnu závislosť medzi výškami a platmi a do vzorca zaviedla nejakú nelineárnosť, napríklad `sin`:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"salaries = 1000+np.sin((heights-heights.min())/(heights.max()-heights.mean()))*100\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"V tomto prípade je korelácia o niečo menšia, ale stále je dosť vysoká. Teraz, aby sme vzťah urobili ešte menej zjavný, môžeme chcieť pridať nejakú extra náhodnosť pridaním náhodnej premenej k platu. Pozrime sa, čo sa stane:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"salaries = 1000+np.sin((heights-heights.min())/(heights.max()-heights.mean()))*100+np.random.random(size=len(heights))*20-10\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(heights, salaries)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> Viete hádať, prečo bodky vytvárajú takéto vertikálne čiary?\n",
"\n",
"Pozorovali sme koreláciu medzi umelo vytvoreným konceptom, ako je plat, a pozorovanou premennou *výškou*. Pozrime sa tiež, či spolu korelujú dve pozorované premenné, ako je výška a hmotnosť:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.corrcoef(df['Height'].ffill(),df['Weight'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bohužiaľ sme nedostali žiadne výsledky - len niektoré zvláštne hodnoty `nan`. Je to spôsobené tým, že niektoré hodnoty v našej sérii sú nedefinované, reprezentované ako `nan`, čo spôsobuje, že výsledok operácie je tiež nedefinovaný. Pohľadom na maticu vidíme, že stĺpec `Weight` je problémový, pretože bola vypočítaná samokorelácia medzi hodnotami `Height`.\n",
"\n",
"> Tento príklad ukazuje dôležitosť **prípravy dát** a **čistenia**. Bez správnych dát nemôžeme nič vypočítať.\n",
"\n",
"Použime metódu `fillna` na doplnenie chýbajúcich hodnôt a vypočítajme koreláciu:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.corrcoef(df['Height'].fillna(method='pad'), df['Weight'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Skutočne existuje korelácia, ale nie taká silná ako v našom umelom príklade. Ak sa naozaj pozrieme na rozptylový graf jednej hodnoty voči druhej, vzťah by bol oveľa menej zjavný:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(df['Weight'],df['Height'])\n",
"plt.xlabel('Weight')\n",
"plt.ylabel('Height')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Záver\n",
"\n",
"V tomto zápisníku sme sa naučili vykonávať základné operácie s údajmi na výpočet štatistických funkcií. Teraz vieme, ako použiť spoľahlivý aparát matematiky a štatistiky na overenie niektorých hypotéz a ako vypočítať intervaly spoľahlivosti pre ľubovoľné premenné na základe vzorky údajov.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Zrieknutie sa zodpovednosti**: \nTento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, majte prosím na pamäti, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Originálny dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
},
"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.9.6"
},
"coopTranslator": {
"original_hash": "0f899e3c5019f948e7c787b22f3b2304",
"translation_date": "2026-01-16T19:32:11+00:00",
"source_file": "1-Introduction/04-stats-and-probability/notebook.ipynb",
"language_code": "sk"
}
},
"nbformat": 4,
"nbformat_minor": 4
}