{ "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": [ "# Definicje funkcji" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 546, "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": 547, "metadata": {}, "outputs": [], "source": [ "dataset = pd.read_csv('experiment_data.csv') # TODO: del?" ] }, { "cell_type": "code", "execution_count": 548, "metadata": {}, "outputs": [], "source": [ "class Alternatives(Enum):\n", " LESS = 'less'\n", " GREATER = 'greater'" ] }, { "cell_type": "code", "execution_count": 549, "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": 550, "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": 551, "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": 552, "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": 553, "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": 554, "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": 555, "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": "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." ] }, { "cell_type": "code", "execution_count": 556, "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": 557, "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": 558, "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": 559, "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": 560, "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": 561, "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": 561, "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": 561, "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": 562, "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": 563, "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", "[-2.17000034], [-0.74957325], [-1.53238091], [-2.4791557], [1.17261618], ... (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 }