{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 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." ] }, { "cell_type": "markdown", "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." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "# Definicje funkcji" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 582, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from enum import Enum\n", "from scipy.stats import ttest_ind, ttest_1samp, ttest_rel, shapiro" ] }, { "cell_type": "code", "execution_count": 583, "metadata": {}, "outputs": [], "source": [ "dataset = pd.read_csv('experiment_data.csv') # TODO: del?" ] }, { "cell_type": "code", "execution_count": 584, "metadata": {}, "outputs": [], "source": [ "class Alternatives(Enum):\n", " LESS = 'less'\n", " GREATER = 'greater'" ] }, { "cell_type": "code", "execution_count": 585, "metadata": {}, "outputs": [], "source": [ "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" ] }, { "cell_type": "code", "execution_count": 586, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def t_test_1_samp(sample_1, population_mean=None, alternative=Alternatives.LESS):\n", " \"\"\"\n", " Funkcja przeprowadza test T-studenta dla jednej zmiennej.\n", " \"\"\"\n", " 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", "\n", " return p, t_stat_from_sample, t_stat_list" ] }, { "cell_type": "code", "execution_count": 587, "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", "\n", " p = calculate_t_difference(t_stat_from_sample, t_stat_list, alternative)\n", "\n", " return p, t_stat_from_sample, t_stat_list" ] }, { "cell_type": "code", "execution_count": 588, "metadata": {}, "outputs": [], "source": [ "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", " return p, t_stat_from_sample, t_stat_list" ] }, { "cell_type": "code", "execution_count": 589, "metadata": {}, "outputs": [], "source": [ "def get_t_stats(sample_1, sample_2=None, t_stat_fn=ttest_1samp, alternative=Alternatives.LESS, population_mean=None):\n", " \"\"\"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", " if t_stat_fn is ttest_1samp and sample_2 is None:\n", " if not population_mean:\n", " raise Exception(\"population_mean not provided\")\n", " for bootstrap in generate_bootstraps(sample_1):\n", " stat, _ = t_stat_fn(bootstrap, population_mean, alternative=alternative.value)\n", " t_stat_list.append(stat)\n", " return t_stat_list\n", "\n", " # Two sample test\n", " 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", " stat, _ = t_stat_fn(bootstrap_1, bootstrap_2, alternative=alternative.value)\n", " t_stat_list.append(stat)\n", " return t_stat_list" ] }, { "cell_type": "code", "execution_count": 590, "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()" ] }, { "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", "execution_count": 591, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "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" ] } ], "source": [ "ALPHA = 0.05\n", "female_heights = dataset['Female height'].to_numpy()\n", "shapiro_test = shapiro(female_heights)\n", "\n", "if shapiro_test.pvalue > ALPHA:\n", " print(\"Female height: Dane mają rozkład normalny.\")\n", "else:\n", " print(\"Female height: Dane nie mają rozkładu normalnego.\")\n", "\n", "male_heights = dataset['Male height'].to_numpy()\n", "shapiro_test = shapiro(male_heights)\n", "\n", "if shapiro_test.pvalue > ALPHA:\n", " print(\"Male height: Dane mają rozkład normalny.\")\n", "else:\n", " print(\"Male height: Dane nie mają rozkładu normalnego.\")\n", "\n", "weights_before = dataset['Weight before'].to_numpy()\n", "shapiro_test = shapiro(weights_before)\n", "\n", "if shapiro_test.pvalue > ALPHA:\n", " print(\"Weight before: Dane mają rozkład normalny.\")\n", "else:\n", " print(\"Weight before: Dane nie mają rozkładu normalnego.\")\n", "\n", "weights_after = dataset['Weight after'].to_numpy()\n", "shapiro_test = shapiro(weights_after)\n", "\n", "if shapiro_test.pvalue > ALPHA:\n", " print(\"Weight after: Dane mają rozkład normalny.\")\n", "else:\n", " print(\"Weight after: Dane nie mają rozkładu normalnego.\")\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 592, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def generate_bootstraps(data, n_bootstraps=100):\n", " data_size = data.shape[0]\n", " for _ in range(n_bootstraps):\n", " indices = np.random.choice(len(data), size=data_size)\n", " yield data.iloc[indices, :]" ] }, { "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" ] }, { "cell_type": "code", "execution_count": 593, "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def bootstrap_one_sample(sample, population_mean, alternative=Alternatives.LESS):\n", " p, t, ts = t_test_1_samp(\n", " sample_1=sample,\n", " population_mean=population_mean,\n", " alternative=alternative,\n", " )\n", " \n", " pretty_print_test(p, t, ts, f'średnia jest równa {population_mean}', alternative)\n", " print()\n", " return p, t, ts" ] }, { "cell_type": "markdown", "metadata": {}, "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", "execution_count": 594, "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def bootstrap_independent(sample_1, sample_2, alternative=Alternatives.LESS):\n", " p, t, ts = t_test_ind(\n", " sample_1=sample_1,\n", " sample_2=sample_2,\n", " alternative=alternative,\n", " )\n", " \n", " pretty_print_test(p, t, ts, 'średnie są takie same', alternative)\n", " return p, t, ts" ] }, { "cell_type": "code", "execution_count": 595, "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def bootstrap_dependent(sample_1, sample_2, alternative=Alternatives.LESS):\n", " p, t, ts = t_test_dep(\n", " sample_1=sample_1,\n", " sample_2=sample_2,\n", " alternative=alternative,\n", " )\n", " \n", " pretty_print_test(p, t, ts, 'średnie są takie same', alternative)\n", " return p, t, ts" ] }, { "cell_type": "code", "execution_count": 596, "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def draw_distribution(stats, comparision_value):\n", " \"\"\"\n", " Funkcja rysuje rozkład statystyki testowej\n", " @param stats: lista statystyk testowych\n", " @param comparision_value: pierwotna próbka\n", " \"\"\"\n", " plt.hist(stats)\n", " plt.axvline(comparision_value, color='red')\n", " plt.xlabel('Test statistic value')\n", " plt.ylabel('Frequency')\n", " plt.show()" ] }, { "cell_type": "markdown", "source": [ "# Wczytanie danych" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 597, "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" } } }, { "cell_type": "markdown", "source": [ "# Jedna próba\n", "\n", "### Hipoteza\n", "\n", "### Sprawdzenie założeń\n" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "## Test\n" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 597, "outputs": [], "source": [], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "## Wniosek" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "# Dwie próby niezależne\n", "\n", "### Hipoteza\n", "\n", "### Sprawdzenie założeń\n", "\n" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "## Test" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 597, "outputs": [], "source": [], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "## Wniosek" ], "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 } }, { "cell_type": "code", "execution_count": 598, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p = 0.0627\n" ] } ], "source": [ "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 } }, { "cell_type": "code", "execution_count": 599, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wyniki bootstrapowej wersji testu T-studenta\n", "\n", "Hipoteza: średnie są takie same\n", "Hipoteza alternatywna: średnia jest mniejsza\n", "\n", "p: 1.0\n", "Wartość statystyki testowej z próby: [7.89079918]\n", "Wartości statystyk z prób boostrapowych:\n", "[-1.2615733], [-0.73536146], [0.56657145], [-0.63034854], [0.27066658], ... (i 95 pozostałych)\n", "\n", "\n" ] }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "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": [] } ], "metadata": { "interpreter": { "hash": "11938c6bc6919ae2720b4d5011047913343b08a43b18698fd82dedb0d4417594" }, "kernelspec": { "display_name": "Python 3.8.10 64-bit", "metadata": { "interpreter": { "hash": "767d51c1340bd893661ea55ea3124f6de3c7a262a8b4abca0554b478b1e2ff90" } }, "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.1" } }, "nbformat": 4, "nbformat_minor": 2 }