Bootstrap-t-student/bootstrap-t.ipynb

665 lines
29 KiB
Plaintext
Raw Normal View History

2022-05-11 15:02:15 +02:00
{
"cells": [
2022-05-13 22:06:56 +02:00
{
"cell_type": "markdown",
2022-05-17 17:27:59 +02:00
"metadata": {},
2022-05-13 22:06:56 +02:00
"source": [
2022-05-17 17:27:59 +02:00
"# Projekt - Test t studenta\n",
"\n",
"- Marcin Kostrzewski\n",
"- Krystian Wasilewski\n",
"- Mateusz Tylka\n",
"\n",
"## Test t studenta\n",
"\n",
"Metoda statystyczna służącą do porównania dwóch średnich między sobą gdy znamy liczbę badanych próbek, średnią arytmetyczną oraz wartość odchylenia standardowego lub wariancji.\n",
"Jest to jeden z mniej skomplikowanych i bardzo często wykorzystywanych testów statystycznych używanych do weryfikacji hipotez. Dzięki niemu możemy dowiedzieć się czy dwie różne średnie są różne niechcący (w wyniku przypadku) czy są różne istotnie statystycznie (np. z uwagi na naszą manipulację eksperymentalna).\n",
"Wyróżniamy 3 wersję testu t:\n",
"\n",
"1. test t Studenta dla jednej próby\n",
"2. test t Studenta dla prób niezależnych\n",
"3. test t Studenta dla prób zależnych\n",
"\n",
"Wszystkie rodzaje testów są testami parametrycznymi, a co za tym idzie nasze mierzone zmienne ilościowe powinny mieć rozkład normalny."
2022-05-16 23:34:31 +02:00
]
2022-05-13 22:06:56 +02:00
},
2022-05-18 01:08:58 +02:00
{
"cell_type": "markdown",
"source": [
"# Definicje funkcji"
],
"metadata": {
"collapsed": false
}
},
2022-05-13 22:06:56 +02:00
{
2022-05-17 17:27:59 +02:00
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 510,
2022-05-16 23:34:31 +02:00
"metadata": {
2022-05-17 17:27:59 +02:00
"pycharm": {
"name": "#%%\n"
}
2022-05-16 23:34:31 +02:00
},
2022-05-17 17:27:59 +02:00
"outputs": [],
2022-05-13 22:06:56 +02:00
"source": [
2022-05-17 17:27:59 +02:00
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
2022-05-17 21:38:59 +02:00
"from enum import Enum\n",
2022-05-17 21:49:11 +02:00
"from scipy.stats import ttest_ind, ttest_1samp, ttest_rel, shapiro"
2022-05-16 23:34:31 +02:00
]
2022-05-13 22:06:56 +02:00
},
2022-05-11 15:02:15 +02:00
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 511,
2022-05-17 17:27:59 +02:00
"metadata": {},
2022-05-17 13:58:25 +02:00
"outputs": [],
"source": [
2022-05-18 01:08:58 +02:00
"dataset = pd.read_csv('experiment_data.csv') # TODO: del?"
2022-05-17 17:27:59 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 512,
2022-05-17 17:27:59 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-05-17 19:40:13 +02:00
"class Alternatives(Enum):\n",
" LESS = 'less'\n",
" GREATER = 'greater'"
2022-05-17 17:27:59 +02:00
]
2022-05-17 13:58:25 +02:00
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 513,
2022-05-17 17:27:59 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-05-17 19:40:13 +02:00
"def calculate_t_difference(t_stat_sample, t_stat_list, alternative):\n",
" \"\"\"\n",
" Funkcja oblicza procent statystyk testowych powstałych z prób bootstrapowych, \n",
" które róznią się od statystyki testowej powstałej ze zbioru według hipotezy alternatywnej.\n",
" \"\"\"\n",
" all_stats = len(t_stat_list)\n",
" stats_different_count = 0\n",
" for t_stat_boot in t_stat_list:\n",
" if alternative is Alternatives.LESS and t_stat_boot < t_stat_sample:\n",
" stats_different_count += 1 \n",
" elif alternative is Alternatives.GREATER and t_stat_boot > t_stat_sample:\n",
" stats_different_count += 1\n",
" return stats_different_count / all_stats"
2022-05-17 17:27:59 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 514,
2022-05-11 15:02:15 +02:00
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
2022-05-17 19:40:13 +02:00
"def t_test_1_samp(sample_1, population_mean=None, alternative=Alternatives.LESS):\n",
2022-05-17 17:27:59 +02:00
" \"\"\"\n",
2022-05-17 19:40:13 +02:00
" Funkcja przeprowadza test T-studenta dla jednej zmiennej.\n",
2022-05-17 17:27:59 +02:00
" \"\"\"\n",
2022-05-17 19:40:13 +02:00
" t_stat_from_sample, _ = ttest_1samp(a=sample_1, popmean=population_mean, alternative=alternative.value)\n",
" t_stat_list = get_t_stats(sample_1, t_stat_fn=ttest_1samp, alternative=alternative, population_mean=population_mean)\n",
"\n",
" p = calculate_t_difference(t_stat_from_sample, t_stat_list, alternative)\n",
2022-05-17 17:27:59 +02:00
"\n",
2022-05-17 20:56:02 +02:00
" return p, t_stat_from_sample, t_stat_list"
2022-05-17 19:40:13 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 515,
2022-05-17 19:40:13 +02:00
"metadata": {},
"outputs": [],
"source": [
"def t_test_ind(sample_1, sample_2, alternative=Alternatives.LESS):\n",
" \"\"\"\n",
" Funkcja przeprowadza test T-studenta dla dwóch zmiennych niezależnych.\n",
" \"\"\"\n",
" t_stat_from_sample, _ = ttest_ind(sample_1, sample_2, alternative=alternative.value)\n",
" t_stat_list = get_t_stats(sample_1, sample_2, alternative=alternative, t_stat_fn=ttest_ind)\n",
2022-05-17 17:27:59 +02:00
"\n",
2022-05-17 19:40:13 +02:00
" p = calculate_t_difference(t_stat_from_sample, t_stat_list, alternative)\n",
2022-05-17 17:27:59 +02:00
"\n",
2022-05-17 20:56:02 +02:00
" return p, t_stat_from_sample, t_stat_list"
2022-05-17 17:27:59 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 516,
2022-05-17 17:27:59 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-05-17 19:40:13 +02:00
"def t_test_dep(sample_1, sample_2, alternative=Alternatives.LESS):\n",
" \"\"\"\n",
" Funkcja przeprowadza test T-studenta dla dwóch zmiennych zależnych.\n",
" \"\"\"\n",
" t_stat_list = get_t_stats(sample_1, sample_2, alternative=alternative, t_stat_fn=ttest_rel)\n",
" t_stat_from_sample, _ = ttest_rel(sample_1, sample_2, alternative=alternative.value)\n",
"\n",
" p = calculate_t_difference(t_stat_from_sample, t_stat_list, alternative)\n",
"\n",
2022-05-17 20:56:02 +02:00
" return p, t_stat_from_sample, t_stat_list"
2022-05-17 19:40:13 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 517,
2022-05-17 19:40:13 +02:00
"metadata": {},
"outputs": [],
"source": [
"def get_t_stats(sample_1, sample_2=None, t_stat_fn=ttest_1samp, alternative=Alternatives.LESS, population_mean=None):\n",
2022-05-17 17:27:59 +02:00
" \"\"\"Funkcja oblicza listę statystyk testowych dla każdej próbki bootstrapowej wybranej na podstawie danych sample_1 i sample_2\"\"\"\n",
" t_stat_list = []\n",
"\n",
" # One sample test\n",
2022-05-17 19:40:13 +02:00
" if t_stat_fn is ttest_1samp and sample_2 is None:\n",
2022-05-17 17:27:59 +02:00
" if not population_mean:\n",
" raise Exception(\"population_mean not provided\")\n",
" for bootstrap in generate_bootstraps(sample_1):\n",
2022-05-17 19:40:13 +02:00
" stat, _ = t_stat_fn(bootstrap, population_mean, alternative=alternative.value)\n",
2022-05-17 17:27:59 +02:00
" t_stat_list.append(stat)\n",
" return t_stat_list\n",
"\n",
" # Two sample test\n",
2022-05-17 21:38:59 +02:00
" for bootstrap_sample in generate_bootstraps(pd.concat((sample_1, sample_2), ignore_index=True)):\n",
" bootstrap_1 = bootstrap_sample.iloc[: len(bootstrap_sample) // 2]\n",
" bootstrap_2 = bootstrap_sample.iloc[len(bootstrap_sample) // 2 :]\n",
2022-05-17 19:40:13 +02:00
" stat, _ = t_stat_fn(bootstrap_1, bootstrap_2, alternative=alternative.value)\n",
2022-05-17 17:27:59 +02:00
" t_stat_list.append(stat)\n",
" return t_stat_list"
]
},
2022-05-17 21:08:54 +02:00
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 518,
2022-05-17 21:08:54 +02:00
"metadata": {},
"outputs": [],
"source": [
"def pretty_print_test(p, t_stat_from_sample, t_stat_list, thesis, alternative, max_print=5):\n",
" print('Wyniki bootstrapowej wersji testu T-studenta')\n",
" print()\n",
" print(f'Hipoteza: {thesis}')\n",
" if alternative is Alternatives.LESS:\n",
" print(f'Hipoteza alternatywna: średnia jest mniejsza')\n",
" else:\n",
" print(f'Hipoteza alternatywna: średnia jest większa')\n",
" print()\n",
" print(f'p: {p}')\n",
" print(f'Wartość statystyki testowej z próby: {t_stat_from_sample}')\n",
" print(f'Wartości statystyk z prób boostrapowych:')\n",
"\n",
" t_stat_list_len = len(t_stat_list)\n",
" for i in range(min(max_print, t_stat_list_len)):\n",
" print(f'{t_stat_list[i]}, ', end='')\n",
" if max_print < t_stat_list_len:\n",
" remaining = t_stat_list_len - max_print\n",
" print(f'... (i {remaining} pozostałych)')\n",
"\n",
" print()\n",
" print()"
]
},
2022-05-17 17:58:54 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test Shapiro Wilka\n",
"\n",
"Wszystkie rodzaje testów są testami parametrycznymi, a co za tym idzie nasze mierzone zmienne ilościowe powinny mieć rozkład normalny."
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 519,
2022-05-17 17:58:54 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-05-17 19:35:49 +02:00
"Female height: Dane mają rozkład normalny.\n",
"Male height: Dane mają rozkład normalny.\n",
"Weight before: Dane mają rozkład normalny.\n",
"Weight after: Dane mają rozkład normalny.\n"
2022-05-17 17:58:54 +02:00
]
}
],
"source": [
2022-05-17 19:53:54 +02:00
"ALPHA = 0.05\n",
"female_heights = dataset['Female height'].to_numpy()\n",
2022-05-17 21:49:11 +02:00
"shapiro_test = shapiro(female_heights)\n",
2022-05-17 17:58:54 +02:00
"\n",
2022-05-17 19:53:54 +02:00
"if shapiro_test.pvalue > ALPHA:\n",
2022-05-17 19:35:49 +02:00
" print(\"Female height: Dane mają rozkład normalny.\")\n",
2022-05-17 17:58:54 +02:00
"else:\n",
2022-05-17 19:35:49 +02:00
" print(\"Female height: Dane nie mają rozkładu normalnego.\")\n",
"\n",
2022-05-17 19:53:54 +02:00
"male_heights = dataset['Male height'].to_numpy()\n",
2022-05-17 21:49:11 +02:00
"shapiro_test = shapiro(male_heights)\n",
2022-05-17 19:35:49 +02:00
"\n",
2022-05-17 19:53:54 +02:00
"if shapiro_test.pvalue > ALPHA:\n",
2022-05-17 19:35:49 +02:00
" print(\"Male height: Dane mają rozkład normalny.\")\n",
"else:\n",
" print(\"Male height: Dane nie mają rozkładu normalnego.\")\n",
"\n",
2022-05-17 19:53:54 +02:00
"weights_before = dataset['Weight before'].to_numpy()\n",
2022-05-17 21:49:11 +02:00
"shapiro_test = shapiro(weights_before)\n",
2022-05-17 19:35:49 +02:00
"\n",
2022-05-17 19:53:54 +02:00
"if shapiro_test.pvalue > ALPHA:\n",
2022-05-17 19:35:49 +02:00
" print(\"Weight before: Dane mają rozkład normalny.\")\n",
"else:\n",
" print(\"Weight before: Dane nie mają rozkładu normalnego.\")\n",
"\n",
2022-05-17 19:53:54 +02:00
"weights_after = dataset['Weight after'].to_numpy()\n",
2022-05-17 21:49:11 +02:00
"shapiro_test = shapiro(weights_after)\n",
2022-05-17 19:35:49 +02:00
"\n",
2022-05-17 19:53:54 +02:00
"if shapiro_test.pvalue > ALPHA:\n",
2022-05-17 19:35:49 +02:00
" print(\"Weight after: Dane mają rozkład normalny.\")\n",
"else:\n",
" print(\"Weight after: Dane nie mają rozkładu normalnego.\")\n",
"\n",
"\n"
2022-05-17 17:58:54 +02:00
]
},
2022-05-17 17:27:59 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Testowanie hipotez metodą bootstrap\n",
"\n",
"**Bootstrap**  metoda szacowania (estymacji) wyników poprzez wielokrotne losowanie ze zwracaniem z próby. Polega ona na utworzeniu nowego rozkładu wyników, na podstawie posiadanych danych, poprzez wielokrotne losowanie wartości z posiadanej próby. Metoda ze zwracaniem polega na tym, że po wylosowaniu danej wartości, “wraca” ona z powrotem do zbioru.\n",
"\n",
"Metoda bootstrapowa znajduje zastosowanie w sytuacji, w której nie znamy rozkładu z populacji z której pochodzi próbka lub w przypadku rozkładów małych lub asymetrycznych. W takim wypadku, dzięki tej metodzie, wyniki testów parametrycznych i analiz opartych o modele liniowe są bardziej precyzyjne. Zazwyczaj losuje się wiele próbek, np. 2000 czy 5000."
2022-05-11 15:02:15 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 520,
2022-05-11 15:02:15 +02:00
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def generate_bootstraps(data, n_bootstraps=100):\n",
" data_size = data.shape[0]\n",
2022-05-13 22:06:56 +02:00
" for _ in range(n_bootstraps):\n",
" indices = np.random.choice(len(data), size=data_size)\n",
" yield data.iloc[indices, :]"
2022-05-11 15:02:15 +02:00
]
},
2022-05-17 17:27:59 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test t studenta dla jednej próby\n",
"\n",
"**Test t Studenta dla jednej próby** wykorzystujemy gdy chcemy porównać średnią “teoretyczną” ze średnią, którą faktycznie możemy zaobserwować w naszej bazie danych. Średnia teoretyczna to średnia pochodząca z innych badań lub po prostu bez większych uzasadnień pochodząca z naszej głowy.\n",
"\n",
"Wyobraźmy sobie, że mamy dane z takimi zmiennymi jak wzrost pewnej grupy ludzi. Dzięki testowi t Studenta dla jednej próby możemy dowiedzieć się np. czy wzrost naszego młodszego brata wynoszący 155cm odbiega znacząco od średniej wzrostu tej grupy. Hipoteza zerowa w takim badaniu wyglądałaby następująco H0: Badana próba została wylosowana z populacji, w której wzrost osób wynosi średnio 155cm. Z kolei hipoteza alternatywna będzie brzmiała H1: Badana próba nie została wylosowana z populacji gdzie średni wzrost wynosi 155cm\n"
]
},
2022-05-11 15:02:15 +02:00
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 521,
2022-05-16 23:34:31 +02:00
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
2022-05-14 15:31:47 +02:00
"outputs": [],
"source": [
2022-05-17 19:40:13 +02:00
"def bootstrap_one_sample(sample, population_mean, alternative=Alternatives.LESS):\n",
2022-05-17 21:08:54 +02:00
" p, t, ts = t_test_1_samp(\n",
2022-05-17 19:40:13 +02:00
" sample_1=sample,\n",
" population_mean=population_mean,\n",
" alternative=alternative,\n",
2022-05-17 21:08:54 +02:00
" )\n",
" \n",
" pretty_print_test(p, t, ts, f'średnia jest równa {population_mean}', alternative)\n",
" print()\n",
" return p, t, ts"
2022-05-16 23:34:31 +02:00
]
},
2022-05-14 17:09:29 +02:00
{
2022-05-17 17:27:59 +02:00
"cell_type": "markdown",
2022-05-16 23:34:31 +02:00
"metadata": {},
2022-05-17 17:27:59 +02:00
"source": [
"## Test t studenta dla prób niezależnych\n",
"\n",
"**Test t Studenta dla prób niezależnych** jest najczęściej stosowaną metodą statystyczną w celu porównania średnich z dwóch niezależnych od siebie grup. Wykorzystujemy go gdy chcemy porównać dwie grupy pod względem jakiejś zmiennej ilościowej. Na przykład gdy chcemy porównać średni wzrost kobiet i mężczyzn w danej grupie.\n",
"\n",
"Zazwyczaj dwie średnie z różnych od siebie grup będą się różnić. Test t Studenta powie nam jednak czy owe różnice są istotne statystycznie czy nie są przypadkowe. Hipoteza zerowa takiego testu będzie brzmiała H0: Średni wzrost w grupie mężczyzn jest taki sam jak średni w grupie kobiet. Hipoteza alternatywna z kolei H1: Kobiety będą różnić się od mężczyzn pod wzrostu.\n",
"Jeśli wynik testu t Studenta będzie istotny na poziomie p < 0,05 możemy odrzucić hipotezę zerową na rzecz hipotezy alternatywnej.\n"
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 522,
2022-05-17 17:27:59 +02:00
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
2022-05-16 23:34:31 +02:00
"outputs": [],
"source": [
2022-05-17 19:40:13 +02:00
"def bootstrap_independent(sample_1, sample_2, alternative=Alternatives.LESS):\n",
2022-05-17 21:08:54 +02:00
" p, t, ts = t_test_ind(\n",
2022-05-17 17:27:59 +02:00
" sample_1=sample_1,\n",
" sample_2=sample_2,\n",
2022-05-17 19:40:13 +02:00
" alternative=alternative,\n",
2022-05-17 21:08:54 +02:00
" )\n",
" \n",
" pretty_print_test(p, t, ts, 'średnie są takie same', alternative)\n",
" return p, t, ts"
2022-05-16 23:34:31 +02:00
]
},
{
2022-05-17 17:27:59 +02:00
"cell_type": "markdown",
2022-05-16 23:34:31 +02:00
"metadata": {},
"source": [
2022-05-17 17:27:59 +02:00
"## Test t studenta dla prób zależnych\n",
"\n",
"W odróżnieniu od testu t Studenta dla prób niezależnych, gdzie porównujemy dwie grupy, ten rodzaj testu stosujemy gdy poddajemy analizie tą samą pojedynczą grupę, ale dwukrotnie w czasie. Na przykład gdy chcemy porównać średnie wagi grupy osób przed dietą oraz po diecie, aby sprawdzić czy dieta spowodowała istotne zmiany statystyczne.\n",
"\n",
"Hipoteza zerowa takiego testu będzie brzmiała H0: Średnia waga osób po diecie jest taka sama jak przed dietą. Hipoteza alternatywna z kolei H1: Dieta znacząco wpłynęła na średnią wagę danej grupy."
2022-05-16 23:34:31 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 523,
2022-05-14 17:09:29 +02:00
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
2022-05-16 23:34:31 +02:00
},
"outputs": [],
"source": [
2022-05-17 19:40:13 +02:00
"def bootstrap_dependent(sample_1, sample_2, alternative=Alternatives.LESS):\n",
2022-05-17 21:08:54 +02:00
" p, t, ts = t_test_dep(\n",
2022-05-16 23:34:31 +02:00
" sample_1=sample_1,\n",
" sample_2=sample_2,\n",
2022-05-17 19:40:13 +02:00
" alternative=alternative,\n",
2022-05-17 21:08:54 +02:00
" )\n",
" \n",
" pretty_print_test(p, t, ts, 'średnie są takie same', alternative)\n",
" return p, t, ts"
2022-05-16 23:34:31 +02:00
]
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 524,
2022-05-11 15:02:15 +02:00
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
2022-05-16 23:34:31 +02:00
},
2022-05-16 18:52:49 +02:00
"outputs": [],
2022-05-13 22:06:56 +02:00
"source": [
2022-05-18 01:08:58 +02:00
"def draw_distribution(stats, comparision_value):\n",
2022-05-16 18:52:49 +02:00
" \"\"\"\n",
" Funkcja rysuje rozkład statystyki testowej\n",
2022-05-17 16:21:32 +02:00
" @param stats: lista statystyk testowych\n",
2022-05-18 01:08:58 +02:00
" @param comparision_value: pierwotna próbka\n",
2022-05-16 18:52:49 +02:00
" \"\"\"\n",
" plt.hist(stats)\n",
2022-05-18 01:08:58 +02:00
" plt.axvline(comparision_value, color='red')\n",
2022-05-16 18:52:49 +02:00
" plt.xlabel('Test statistic value')\n",
" plt.ylabel('Frequency')\n",
" plt.show()"
2022-05-16 23:34:31 +02:00
]
},
2022-05-17 17:27:59 +02:00
{
"cell_type": "markdown",
"source": [
2022-05-18 01:08:58 +02:00
"# Wczytanie danych"
],
"metadata": {
"collapsed": false
}
2022-05-17 17:27:59 +02:00
},
2022-05-16 23:34:31 +02:00
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 525,
"outputs": [],
"source": [
"dataset = pd.read_csv('experiment_data.csv')\n",
"heights_female = pd.DataFrame(dataset['Female height'].to_numpy()) # xd\n",
"heights_male = pd.DataFrame(dataset['Male height'].to_numpy())\n",
"weights_before = pd.DataFrame(dataset['Weight before'].to_numpy())\n",
"weights_after = pd.DataFrame(dataset['Weight after'].to_numpy())"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
2022-05-17 21:38:59 +02:00
}
2022-05-18 01:08:58 +02:00
}
},
{
"cell_type": "markdown",
"source": [
"# Jedna próba\n",
"\n",
"### Hipoteza\n",
"\n",
"### Sprawdzenie założeń\n",
"\n",
"## Test"
2022-05-17 21:38:59 +02:00
],
2022-05-18 01:08:58 +02:00
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
2022-05-17 21:38:59 +02:00
"source": [
2022-05-18 01:08:58 +02:00
"# Dwie próby niezależne\n",
2022-05-17 21:38:59 +02:00
"\n",
2022-05-18 01:08:58 +02:00
"### Hipoteza\n",
"\n",
"### Sprawdzenie założeń\n",
"\n",
"## Test"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"# Dwie próby zależne\n",
"\n",
"W odróżnieniu od testu dla prób niezależnych, gdzie porównujemy dwie grupy, ten rodzaj testu stosujemy gdy poddajemy analizie tą samą pojedynczą grupę, ale dwukrotnie w czasie.\n",
"\n",
"**Przykład**: Porównane zostały wagi przed dietą i po diecie.\n"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"### Hipoteza\n",
"H0 - Średnia waga nie uległa zmianie po zastosowaniu diety\n",
"H1 - Średnia waga po diecie jest znacząco mniejsza od wagi przed dietą\n"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"\n",
"### Sprawdzenie założeń\n",
"\n",
"Założenie o rozkładzie normalnym danych - sprawdzane testem Shapiro-Wilka"
],
"metadata": {
"collapsed": false
}
2022-05-17 21:38:59 +02:00
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 526,
2022-05-17 21:38:59 +02:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-05-18 01:08:58 +02:00
"p = 0.0627\n"
2022-05-17 21:38:59 +02:00
]
}
],
"source": [
2022-05-18 01:08:58 +02:00
"shapiro_test = shapiro(weights_before)\n",
"print(f\"p = {round(shapiro_test.pvalue,4)}\")"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"Wartość **p** w teście Shapiro-Wilka powyżej **0.05** -> Dane prawdopodobnie mają rozkład normalny"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"## Test"
],
"metadata": {
"collapsed": false
}
2022-05-17 21:38:59 +02:00
},
{
"cell_type": "code",
2022-05-18 01:08:58 +02:00
"execution_count": 527,
2022-05-17 21:38:59 +02:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-05-17 21:08:54 +02:00
"Wyniki bootstrapowej wersji testu T-studenta\n",
"\n",
"Hipoteza: średnie są takie same\n",
"Hipoteza alternatywna: średnia jest mniejsza\n",
"\n",
2022-05-18 01:08:58 +02:00
"p: 1.0\n",
"Wartość statystyki testowej z próby: [7.89079918]\n",
2022-05-17 21:08:54 +02:00
"Wartości statystyk z prób boostrapowych:\n",
2022-05-18 01:08:58 +02:00
"[-0.05395381], [0.15520269], [-0.2285374], [1.05735295], [2.77041326], ... (i 95 pozostałych)\n",
2022-05-17 21:38:59 +02:00
"\n",
"\n"
2022-05-16 18:52:49 +02:00
]
2022-05-18 01:08:58 +02:00
},
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
2022-05-11 15:02:15 +02:00
}
],
"source": [
2022-05-18 01:08:58 +02:00
"p, t, ts = bootstrap_dependent(weights_before, weights_after)\n",
"ts = [x[0] for x in ts]\n",
"draw_distribution(ts, t)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"## Wniosek\n",
"\n",
"???"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"source": [],
"execution_count": null,
"outputs": []
2022-05-11 15:02:15 +02:00
}
],
"metadata": {
"interpreter": {
"hash": "11938c6bc6919ae2720b4d5011047913343b08a43b18698fd82dedb0d4417594"
},
"kernelspec": {
2022-05-17 19:40:13 +02:00
"display_name": "Python 3.8.10 64-bit",
"metadata": {
"interpreter": {
"hash": "767d51c1340bd893661ea55ea3124f6de3c7a262a8b4abca0554b478b1e2ff90"
}
2022-05-17 20:56:02 +02:00
},
"name": "python3"
2022-05-11 15:02:15 +02:00
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2022-05-17 21:08:54 +02:00
"version": "3.9.1"
2022-05-17 21:49:11 +02:00
}
2022-05-11 15:02:15 +02:00
},
"nbformat": 4,
"nbformat_minor": 2
2022-05-18 01:08:58 +02:00
}