371 lines
12 KiB
Plaintext
371 lines
12 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c88902ee",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Úkol: BI-PST\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "91241ee8",
|
|
"metadata": {},
|
|
"source": [
|
|
"Spolupracovali:\n",
|
|
" * Ondřej Hladůvka (reprezentant)\n",
|
|
" * Tomáš Kaňka"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "334be38a",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#import csv\n",
|
|
"#import math\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import pandas as pd\n",
|
|
"#np.set_printoptions(precision=3)\n",
|
|
"#from sympy import *\n",
|
|
"from scipy.stats import norm, uniform, expon\n",
|
|
"#from scipy.optimize import minimize"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "7c90184c-5f76-4277-b0ad-aeec2ac37d30",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"K = 28\n",
|
|
"L = 8\n",
|
|
"M = (((K + L) * 47) % 11) + 1\n",
|
|
"print(M)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "129f8693",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Úloha č. 1"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "503f77b6-1c9d-4406-8b30-ec3b792267e7",
|
|
"metadata": {},
|
|
"source": [
|
|
"(1b) Načtěte datový soubor a rozdělte sledovanou proměnnou na příslušné dvě pozorované skupiny.\n",
|
|
"Stručně popište data a zkoumaný problém. Pro každou skupinu zvlášť odhadněte střední hodnotu, rozptyl a medián příslušného rozdělení."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "b80d5cec-db0c-42e7-a3b9-296803242269",
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# načtení dat\n",
|
|
"df = pd.read_csv(\"/data.csv\")\n",
|
|
"df = df.drop(df.columns[0], axis=1)\n",
|
|
"survived = df[df['Status'] == 'survived']['Weight'].values\n",
|
|
"perished = df[df['Status'] == 'perished']['Weight'].values\n",
|
|
"# informace\n",
|
|
"print(\"Prvních 5 řádků:\")\n",
|
|
"print(df.head())\n",
|
|
"print(\"Info\")\n",
|
|
"print(\"Počet řádků:\", df.shape[0])\n",
|
|
"print(\"Datové typy:\")\n",
|
|
"display(df.info())\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "41e43831",
|
|
"metadata": {},
|
|
"source": [
|
|
"Tento datový soubor zkoumá, zda hmotnost dospělých samců vrabců hraje roli v jejich přežití během extrémních klimatických podmínek. Cílem je zjistit, zda vrabci, kteří přežili, měli významně jinou průměrnou hmotnost ve srovnání se vrabci, kteří zahynuli. \n",
|
|
"\n",
|
|
"Tabulak má dva sloupce weight a status, kde\n",
|
|
"**weight** udává hmotnost dospělých samců vrabců v gramech a\n",
|
|
"**status** udává, zda vrabec přežil nebo zahynul během zimní bouře. Může mít hodnoty \"survived\" (přežil) nebo \"perished\" (zahynul).\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "717d3775",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Zobrazení názvů sloupců\n",
|
|
"print(df.columns)\n",
|
|
"\n",
|
|
"groups = df.groupby('Status')\n",
|
|
"summary_stats = groups['Weight'].agg(['mean', 'var', 'median']).reset_index()\n",
|
|
"\n",
|
|
"# Zobrazení výsledků\n",
|
|
"print(summary_stats)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "b370bf22",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Úloha č. 2"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "29eef015-c103-4e7f-89e8-2b59526f4b1e",
|
|
"metadata": {},
|
|
"source": [
|
|
"(1b) Pro každou skupinu zvlášť odhadněte hustotu a distribuční funkci pomocí histogramu a empirické distribuční funkce."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "9c8f12d3",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Funkce pro výpočet hustoty a CDF\n",
|
|
"def calculate_density_cdf(group):\n",
|
|
" sorted_weights = group.sort_values('Weight')\n",
|
|
" \n",
|
|
" # Výpočet CDF\n",
|
|
" cdf = pd.Series(range(1, len(sorted_weights) + 1)) / len(sorted_weights)\n",
|
|
" \n",
|
|
" # Přidání CDF k seřazeným váhám\n",
|
|
" results = pd.DataFrame({'Weight': sorted_weights['Weight'].values, 'CDF': cdf.values})\n",
|
|
" \n",
|
|
" return results\n",
|
|
"\n",
|
|
"# Vytvoření hustoty a CDF pro každou skupinu\n",
|
|
"groups = df.groupby('Status')\n",
|
|
"density_cdf_results = {}\n",
|
|
"\n",
|
|
"for name, group in groups:\n",
|
|
" density_cdf_results[name] = calculate_density_cdf(group)\n",
|
|
"\n",
|
|
"# Zobrazení výsledků\n",
|
|
"for name, results in density_cdf_results.items():\n",
|
|
" plt.figure(figsize=(10, 6))\n",
|
|
" plt.hist(df[df['Status'] == name]['Weight'], bins=20, density=True, alpha=0.5, label=f'Hustota {name}')\n",
|
|
" \n",
|
|
" # CDF\n",
|
|
" plt.plot(results['Weight'], results['CDF'], label=f'CDF {name}', color='red')\n",
|
|
" \n",
|
|
" # Nastavení g\n",
|
|
" plt.title(f'Hustota a CDF pro skupinu: {name}')\n",
|
|
" plt.xlabel('Hmotnost')\n",
|
|
" plt.ylabel('Hustota / Kumulativní pravděpodobnost (CDF)')\n",
|
|
" plt.legend()\n",
|
|
" plt.grid()\n",
|
|
" plt.show()\n",
|
|
" print(f\"\\n--- Výsledky pro skupinu: {name} ---\")\n",
|
|
" print(results)\n",
|
|
"\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "f98f6ad6",
|
|
"metadata": {},
|
|
"source": [
|
|
"Vytvořili jsme funkci calculate_density_cdf, která seřadila data podle hmotnosti a spočítala kumulativní distribuční funkci. Tato funkce vrátila DataFrame se seřazenými hmotnostmi a odpovídajícími hodnotami CDF."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "9f9b7946",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Úloha č. 3"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "626d8bce-65af-4659-96e9-c1fbe4ccb3cc",
|
|
"metadata": {},
|
|
"source": [
|
|
"(3b) Pro každou skupinu zvlášť najděte nejbližší rozdělení: \n",
|
|
"Odhadněte parametry normálního, exponenciálního a rovnoměrného rozdělení.\n",
|
|
"Zaneste příslušné hustoty s odhadnutými parametry do grafů histogramu. Diskutujte, které z rozdělení odpovídá pozorovaným datům nejlépe."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "98f1d4c1-f86b-4a39-aae1-bafbb951c3ca",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def show_distribution(data):\n",
|
|
" fig = plt.figure(figsize = (10, 14))\n",
|
|
" gs = fig.add_gridspec(4,2, figure = fig)\n",
|
|
" sp1 = fig.add_subplot(gs[0, 0])\n",
|
|
" sp2 = fig.add_subplot(gs[0, 1])\n",
|
|
" sp3 = fig.add_subplot(gs[1, 0])\n",
|
|
" sp4 = fig.add_subplot(gs[1, 1])\n",
|
|
" sp5 = fig.add_subplot(gs[ 2:, 0:])\n",
|
|
" \n",
|
|
" sp1.set_title('Data Histogram')\n",
|
|
" sp1.hist(data, bins=10, density=True, alpha=0.5)\n",
|
|
" sp2.hist(data, bins=10, density=True, alpha=0.5)\n",
|
|
" sp3.hist(data, bins=10, density=True, alpha=0.5)\n",
|
|
" sp4.hist(data, bins=10, density=True, alpha=0.5)\n",
|
|
" sp5.hist(data, bins=10, density=True, alpha=0.5)\n",
|
|
" \n",
|
|
" mu, std = norm.fit(data) # Get mean and standard deviation\n",
|
|
" xmin, xmax = sp1.get_xlim() # Get x-axis limits from the histogram\n",
|
|
" x = np.linspace(xmin, xmax, 100)\n",
|
|
" p_norm = norm.pdf(x, mu, std) # Generate the PDF for the normal distribution\n",
|
|
" sp2.plot(x, p_norm, 'red')\n",
|
|
" sp2.fill_between(x, p_norm, alpha=0.2, color='red')\n",
|
|
" sp2.set_title(f'Normal fit ($\\mu={mu:.2f}, \\sigma={std:.2f}$)')\n",
|
|
"\n",
|
|
" loc, scale = expon.fit(data)\n",
|
|
" p_exp = expon.pdf(x, loc, scale)\n",
|
|
" split0 = next((i for i, x in enumerate(p_exp) if x != 0), len(p_exp))\n",
|
|
" sp3.plot(x[split0:], p_exp[split0:], 'green')\n",
|
|
" sp3.fill_between(x[split0:], p_exp[split0:], alpha=0.2, color='green')\n",
|
|
" sp3.set_title(f'Exponential Distribution Fit (scale={scale:.2f})')\n",
|
|
"\n",
|
|
" loc_uni, scale_uni = uniform.fit(data)\n",
|
|
" p_uni = uniform.pdf(x, loc_uni, scale_uni)\n",
|
|
" split1 = next((i for i, x in enumerate(p_uni) if x != 0), len(p_uni))\n",
|
|
" split2 = -next((i for i, x in enumerate(reversed(p_uni)) if x != 0), len(p_uni))\n",
|
|
" sp4.plot(x[split1:split2], p_uni[split1:split2], 'purple')\n",
|
|
" sp4.plot(x[:split1], p_uni[:split1], 'purple')\n",
|
|
" sp4.plot(x[split2:], p_uni[split2:], 'purple')\n",
|
|
" sp4.fill_between(x[split1:split2], p_uni[split1:split2], alpha=0.1, color='purple')\n",
|
|
" sp4.set_title(f'Uniform Distribution Fit (range=({loc_uni:.2f}, {loc_uni+scale_uni:.2f}))')\n",
|
|
" \n",
|
|
" sp5.plot(x, p_norm, 'red', label=f'Normal fit: $\\mu={mu:.2f}, \\sigma={std:.2f}$')\n",
|
|
" sp5.plot(x[split0:], p_exp[split0:], 'green', label=f'Exponential fit: scale={scale:.2f}')\n",
|
|
" sp5.plot(x[split1:split2], p_uni[split1:split2], 'purple')\n",
|
|
" sp5.plot(x[:split1], p_uni[:split1], 'purple')\n",
|
|
" sp5.plot(x[split2:], p_uni[split2:], 'purple', label=f'Uniform fit: range=({loc_uni:.2f}, {loc_uni+scale_uni:.2f})')\n",
|
|
" #sp5.plot(x, p_uni, 'blue', label=f'Uniform fit: range=({loc_uni:.2f}, {loc_uni+scale_uni:.2f})')\n",
|
|
" sp5.set_title('Combined Distributions')\n",
|
|
" sp5.legend()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "2121c37e-edac-446d-8ed5-1f1fab942637",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"show_distribution(survived)x, p_exp\n",
|
|
"show_distribution(perished)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "424b6dc3",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Úloha č. 4"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "6226456c-fdf3-4537-830c-05f8ee7022c5",
|
|
"metadata": {},
|
|
"source": [
|
|
"(1b) Pro každou skupinu zvlášť vygenerujte náhodný výběr o 100 hodnotách z rozdělení, \n",
|
|
"které jste zvolili jako nejbližší, s parametry odhadnutými v předchozím bodě.\n",
|
|
"Porovnejte histogram simulovaných hodnot s pozorovanými daty."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d43bff73",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Úloha č. 5"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1c5f7d31-ca21-42b4-9a23-1111bbf599b9",
|
|
"metadata": {},
|
|
"source": [
|
|
"(1b) Pro každou skupinu zvlášť spočítejte oboustranný 95% konfidenční interval pro střední hodnotu."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1c7cf77b",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Úloha č. 6"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "53a61e4f-fc67-4237-ab38-f5f9fb7767c5",
|
|
"metadata": {},
|
|
"source": [
|
|
"(1b) Pro každou skupinu zvlášť otestujte na hladině významnosti 5 % hypotézu,\n",
|
|
"zda je střední hodnota rovná hodnotě K (parametr úlohy), proti oboustranné alternativě.\n",
|
|
"Můžete použít buď výsledek z předešlého bodu, nebo výstup z příslušné vestavěné funkce vašeho softwaru."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "617cf82f",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Úloha č. 7"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "7007c195-97a3-4cd4-8427-dcc8417eedf8",
|
|
"metadata": {},
|
|
"source": [
|
|
"(2b) Na hladině významnosti 5 % otestujte, jestli mají pozorované skupiny stejnou střední hodnotu.\n",
|
|
"Typ testu a alternativy stanovte tak, aby vaše volba nejlépe korespondovala s povahou zkoumaného problému."
|
|
]
|
|
}
|
|
],
|
|
"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.15"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|