{ "cells": [ { "cell_type": "markdown", "id": "f6247d59", "metadata": {}, "source": [ "# Egzamin: przykład\n", "\n", "To jest przykładowy egzamin końcowy z kursu **Statystyka** dla kierunku **Sztuczna inteligencja i kognitywistyka**. Zadania dotyczą testowania hipotez i prostych modeli statystycznych w Pythonie.\n", "\n", "## Uwagi ogólne\n", "\n", "1. W zadaniach pojawia się formuła „przeprowadź odpowiedni test i opisz wyniki”. To znaczy, że nie wystarczy sam kod. W odpowiedzi powinny znaleźć się:\n", "- krótki opis wyniku wraz z kierunkiem różnicy albo relacji,\n", "- statystyki opisowe, np. proporcje, średnie, odchylenia standardowe, mediany, korelacje albo współczynniki regresji,\n", "- statystyki inferencyjne, np. wartość statystyki testowej, stopnie swobody, p-wartość,\n", "- wielkość efektu, jeżeli umiesz ją sensownie policzyć.\n", "2. W przypadku testów posiadających wersje kierunkowe możesz użyć wersji kierunkowej odpowiadającej treści zadania albo wersji dwustronnej. W opisie napisz, którą wersję testu stosujesz.\n", "3. Dane są przygotowane tak, żeby dało się je wczytać przez zwykłe `pd.read_csv(...)`.\n", "4. Jeżeli zadanie wymaga wizualizacji, użyj czytelnego wykresu z opisanymi osiami." ] }, { "cell_type": "code", "execution_count": null, "id": "e98e24d7", "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from scipy import stats\n", "import statsmodels.formula.api as smf\n", "from IPython.display import display\n", "\n", "DATA_DIR = Path(\"data\")\n", "\n", "sns.set_theme(style=\"whitegrid\")\n", "plt.rcParams[\"figure.figsize\"] = (8, 4.5)\n", "plt.rcParams[\"figure.dpi\"] = 120" ] }, { "cell_type": "markdown", "id": "213c96c2", "metadata": {}, "source": [ "## Zadanie 1 (test dwumianowy) (1 pkt)\n", "\n", "W finałach mistrzostw świata w *League of Legends* w 2023 roku rozegrano 79 meczów. W grze tej w meczu mierzą się dwie drużyny. Drużyny mają swoją bazę po dwóch stronach mapy. Okazuje się, że drużyny po stronie czerwonej wygrały w 32 meczach, podczas gdy zespoły po stronie niebieskiej wygrały w 47 meczach.\n", "\n", "Czy mamy podstawy sądzić, że zespoły po stronie niebieskiej mają wyższą niż 50% szansę na zwycięstwo? Przeprowadź odpowiedni test i opisz wyniki." ] }, { "cell_type": "code", "execution_count": null, "id": "01d07464", "metadata": {}, "outputs": [], "source": [ "wins_blue = 47\n", "n_matches = 79\n", "\n", "result = stats.binomtest(\n", " k=wins_blue,\n", " n=n_matches,\n", " p=0.5,\n", " alternative=\"two-sided\",\n", ")\n", "\n", "pd.DataFrame(\n", " {\n", " \"wygrane_niebieskich\": [wins_blue],\n", " \"liczba_meczów\": [n_matches],\n", " \"proporcja\": [wins_blue / n_matches],\n", " \"p\": [result.pvalue],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "6bbbb130", "metadata": {}, "source": [ "W dwustronnym teście dwumianowym nie uzyskano podstaw do odrzucenia hipotezy o równej szansie wygranej po obu stronach mapy. Drużyny po stronie niebieskiej wygrały 47 z 79 meczów, czyli 59.5%, ale wynik nie był statystycznie istotny, $p = .115$." ] }, { "cell_type": "markdown", "id": "375a90d1", "metadata": {}, "source": [ "## Zadanie 2 (test z) (1 pkt)\n", "\n", "Jarmakowski-Kostrzanowski i Jarmakowska-Kostrzanowska (2016) skonstruowali polską adaptację Kwestionariusza Kodów Moralnych stworzonego przez Grahama i Haidta. Według teorii, na której oparty jest ten kwestionariusz, wyróżnia się pięć fundamentów moralnych: Troskę, Sprawiedliwość, Lojalność, Autorytet i Świętość.\n", "\n", "Badacze ustalili, że dla kodu moralnego Autorytetu średni wynik w populacji polskiej wynosi 2.68 z odchyleniem standardowym 0.92 na skali 0–5. Pewien student kognitywistyki przeprowadził badanie na 67 osobach studiujących filozofię. W przebadanej próbie średnia wynosiła 2.21 z odchyleniem standardowym 1.12.\n", "\n", "Czy mamy podstawy sądzić, że studenci filozofii mniej cenią moralną wagę autorytetu niż ogólna populacja? Przeprowadź odpowiedni test i opisz wyniki." ] }, { "cell_type": "code", "execution_count": null, "id": "1e48c8de", "metadata": {}, "outputs": [], "source": [ "population_mean = 2.68\n", "population_sd = 0.92\n", "sample_mean = 2.21\n", "sample_sd = 1.12\n", "n = 67\n", "\n", "z_stat = (sample_mean - population_mean) / (population_sd / np.sqrt(n))\n", "p_left = stats.norm.cdf(z_stat)\n", "p_two_sided = 2 * min(stats.norm.cdf(z_stat), stats.norm.sf(z_stat))\n", "\n", "pd.DataFrame(\n", " {\n", " \"n\": [n],\n", " \"M_próby\": [sample_mean],\n", " \"SD_próby\": [sample_sd],\n", " \"M_populacji\": [population_mean],\n", " \"SD_populacji\": [population_sd],\n", " \"z\": [z_stat],\n", " \"p_lewostronne\": [p_left],\n", " \"p_dwustronne\": [p_two_sided],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "7cb9fb08", "metadata": {}, "source": [ "W lewostronnym teście z wynik studentów filozofii był istotnie niższy od średniej populacyjnej. W próbie uzyskano $M = 2.21$, $SD = 1.12$, przy wartości populacyjnej $M = 2.68$, $SD = 0.92$; $z = -4.18$, $p < .001$." ] }, { "cell_type": "markdown", "id": "1d88e219", "metadata": {}, "source": [ "## Zadanie 3 (test zgodności $\\chi^2$) (1 pkt)\n", "\n", "W grze *Starcraft* gracze mierzą się w pojedynkach 1 na 1. Każdy gracz może wybrać jedną z trzech dostępnych ras: Protosów, Terran lub Zergów. W sezonie 55 rozgrywek na poziomie ligi *Platinum* wybierano rasy z następującą częstością:\n", "\n", "- Terranie: 6885 razy,\n", "- Zergowie: 6668 razy,\n", "- Protosi: 6081 razy.\n", "\n", "Czy prawdopodobieństwo wyboru każdej z ras jest równe? Przeprowadź odpowiedni test i opisz wyniki." ] }, { "cell_type": "code", "execution_count": null, "id": "839e89ef", "metadata": {}, "outputs": [], "source": [ "observed = pd.Series(\n", " [6885, 6668, 6081],\n", " index=[\"Terranie\", \"Zergowie\", \"Protosi\"],\n", " name=\"obserwowane\",\n", ")\n", "expected = np.repeat(observed.sum() / 3, 3)\n", "\n", "chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)\n", "\n", "display(pd.DataFrame({\"obserwowane\": observed, \"oczekiwane\": expected}))\n", "\n", "pd.DataFrame(\n", " {\n", " \"chi2\": [chi2_stat],\n", " \"df\": [len(observed) - 1],\n", " \"p\": [p_value],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "905c9f27", "metadata": {}, "source": [ "Test zgodności $\\chi^2$ wykazał, że rasy nie były wybierane z równym prawdopodobieństwem, $\\chi^2(2) = 52.87$, $p < .001$." ] }, { "cell_type": "markdown", "id": "dfeb0565", "metadata": {}, "source": [ "## Zadanie 4 (test niezależności $\\chi^2$) (1 pkt)\n", "\n", "W 1929 roku Beckham przeprowadziła badanie dotyczące czarnych Amerykanów. Dane znajdują się w pliku `beckham_1929.csv`. Każdemu badanemu zadano trzy pytania:\n", "\n", "1. Czy uważasz, że czarni Amerykanie są szczęśliwi?\n", "2. Czy osobiście jesteś szczęśliwą osobą jako czarny Amerykanin?\n", "3. Czy czarni Amerykanie powinni być szczęśliwi?\n", "\n", "W pliku odpowiedzi podzielone są na kategorie według wykonywanego zawodu. Przeprowadź 3 testy $\\chi^2$ niezależności, po jednym dla każdego pytania, sprawdzające, czy odpowiedź zależy od profesji. Zinterpretuj wyniki." ] }, { "cell_type": "code", "execution_count": null, "id": "a135f32d", "metadata": {}, "outputs": [], "source": [ "beckham = pd.read_csv(DATA_DIR / \"beckham_1929.csv\")\n", "\n", "questions = {\n", " \"Happy\": \"Czy czarni Amerykanie są szczęśliwi?\",\n", " \"You_Happy\": \"Czy osobiście jesteś szczęśliwą osobą?\",\n", " \"Should_be_Happy\": \"Czy czarni Amerykanie powinni być szczęśliwi?\",\n", "}\n", "\n", "results = []\n", "percent_yes_tables = []\n", "\n", "for column, question in questions.items():\n", " table = beckham.pivot(index=\"Profession\", columns=\"Response\", values=column)[[\"Yes\", \"No\"]]\n", " chi2_stat, p_value, df, expected = stats.chi2_contingency(table)\n", "\n", " results.append(\n", " {\n", " \"pytanie\": question,\n", " \"chi2\": chi2_stat,\n", " \"df\": df,\n", " \"p\": p_value,\n", " }\n", " )\n", "\n", " percent_yes = table[\"Yes\"] / table.sum(axis=1) * 100\n", " percent_yes_tables.append(percent_yes.rename(question))\n", "\n", "pd.DataFrame(results)" ] }, { "cell_type": "markdown", "id": "9045f858", "metadata": {}, "source": [ "Dla każdego z trzech pytań odpowiedzi zależały od profesji: dla pytania ogólnego $\\chi^2(7) = 936.14$, $p < .001$; dla pytania o osobiste szczęście $\\chi^2(7) = 1390.74$, $p < .001$; dla pytania o to, czy czarni Amerykanie powinni być szczęśliwi, $\\chi^2(7) = 1784.23$, $p < .001$. Oznacza to, że rozkład odpowiedzi „tak/nie” nie był taki sam we wszystkich grupach zawodowych." ] }, { "cell_type": "code", "execution_count": null, "id": "70de98ce", "metadata": {}, "outputs": [], "source": [ "percent_yes_df = pd.concat(percent_yes_tables, axis=1)\n", "percent_yes_df" ] }, { "cell_type": "code", "execution_count": null, "id": "996f361f", "metadata": {}, "outputs": [], "source": [ "fig, axes = plt.subplots(ncols=3, figsize=(15, 5), sharey=True)\n", "\n", "for ax, column in zip(axes, percent_yes_df.columns, strict=True):\n", " plot_data = percent_yes_df[column].sort_values(ascending=False).reset_index()\n", " plot_data.columns = [\"Profession\", \"procent_tak\"]\n", " sns.barplot(data=plot_data, x=\"procent_tak\", y=\"Profession\", ax=ax, color=\"#4477AA\")\n", " ax.set_title(column)\n", " ax.set_xlabel(\"% odpowiedzi 'Yes'\")\n", " ax.set_ylabel(\"\")\n", " ax.set_xlim(0, 100)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "776f343d", "metadata": {}, "source": [ "## Zadanie 5 (test t Studenta dla jednej próby) (1 pkt)\n", "\n", "Pewna grupa radykalnych językoznawców zastanawiała się nad semantyką nierzeczywistych okresów warunkowych. Zgodnie z pewną teorią z zakresu filozofii następnik w takim zdaniu warunkowym oceniany jest w świecie możliwym wyznaczonym przez poprzednik.\n", "\n", "Na przykład:\n", "\n", "> „Gdyby kangury nie miały ogonów, to wywracałyby się”.\n", "\n", "Ocenę tego, czy kangury wywracałyby się, dokonujemy z perspektywy świata możliwego, w którym nie mają ogonów.\n", "\n", "Sytuacja komplikuje się, jeśli rozważymy zdania, w których występuje zaimek osobowy. Badacze chcieli sprawdzić, co się dzieje, jeśli poprzednik wyznacza sytuację, w której zmienił się rodzaj gramatyczny jednego z referentów. Uczestnicy oceniali zdanie:\n", "\n", "> (Z) Jeżeli Kasia podda się tranzycji, to pójdziemy się z nim jak najszybciej spotkać.\n", "\n", "Badani wskazywali, czy zdanie (Z) jest dla nich akceptowalne, na skali od -3 do +3. W zbiorze `p_and_p` znajdują się oceny 30 rodzimych użytkowników języka polskiego.\n", "\n", "Czy zdanie (Z) możemy uznać za akceptowalne? Przeprowadź odpowiedni test, opisz i zinterpretuj jego wyniki." ] }, { "cell_type": "code", "execution_count": null, "id": "9994f155", "metadata": {}, "outputs": [], "source": [ "p_and_p = np.array([\n", " 1, -1, 0, -1, 3, 0, -1, 1, 2, 1, -2, 0, 2, -1, -1,\n", " 1, 2, 1, 1, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 2,\n", "])\n", "\n", "result = stats.ttest_1samp(p_and_p, popmean=0)\n", "\n", "pd.DataFrame(\n", " {\n", " \"n\": [len(p_and_p)],\n", " \"M\": [p_and_p.mean()],\n", " \"SD\": [p_and_p.std(ddof=1)],\n", " \"t\": [result.statistic],\n", " \"df\": [result.df],\n", " \"p\": [result.pvalue],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "d759ac7f", "metadata": {}, "source": [ "Średnia ocena była istotnie wyższa od zera, $M = 0.70$, $SD = 1.18$, $t(29) = 3.25$, $p = .003$. W tych danych zdanie (Z) można więc uznać za akceptowalne w sensie statystycznym, bo średnia ocena jest dodatnia i istotnie różna od neutralnego punktu skali." ] }, { "cell_type": "markdown", "id": "dc576990", "metadata": {}, "source": [ "## Zadanie 6 (test t Studenta dla prób niezależnych) (1 pkt)\n", "\n", "W eksperymencie udział wzięły 24 osoby. Uczestnicy zostali podzieleni na dwie grupy. W pierwszej grupie (n = 12) badani zostali poproszeni, aby przez 5 minut bawili się z wielką, owłosioną tarantulą. Pozostali uczestnicy (n = 12) podczas 5-minutowej sesji oglądali zdjęcia tej samej tarantuli na ekranie komputera. Następnie wszystkim badanym zmierzono poziom lęku za pomocą kwestionariusza.\n", "\n", "Czy mamy prawo sądzić, że interakcja z prawdziwą tarantulą zwiększa lęk w porównaniu do obcowania z jej zdjęciem? Przeprowadź odpowiedni test, przygotuj wizualizację wyników i opisz je." ] }, { "cell_type": "code", "execution_count": null, "id": "de13cb75", "metadata": {}, "outputs": [], "source": [ "spider = pd.DataFrame(\n", " {\n", " \"Participant\": range(1, 25),\n", " \"Group\": [\"Picture\"] * 12 + [\"Real Spider\"] * 12,\n", " \"Anxiety\": [\n", " 30, 35, 45, 40, 50, 35, 55, 25, 30, 45, 40, 50,\n", " 40, 35, 50, 55, 65, 55, 50, 35, 30, 50, 60, 39,\n", " ],\n", " }\n", ")\n", "\n", "desc = spider.groupby(\"Group\")[\"Anxiety\"].agg([\"count\", \"mean\", \"std\"])\n", "display(desc)\n", "\n", "picture = spider.loc[spider[\"Group\"] == \"Picture\", \"Anxiety\"]\n", "real = spider.loc[spider[\"Group\"] == \"Real Spider\", \"Anxiety\"]\n", "\n", "result = stats.ttest_ind(real, picture, equal_var=False)\n", "\n", "pd.DataFrame(\n", " {\n", " \"t\": [result.statistic],\n", " \"df\": [result.df],\n", " \"p\": [result.pvalue],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "2cd3d73e", "metadata": {}, "source": [ "Osoby skonfrontowane z prawdziwym pająkiem miały wyższy średni poziom lęku ($M = 47.00$, $SD = 11.03$) niż osoby oglądające zdjęcie ($M = 40.00$, $SD = 9.29$), ale różnica nie była statystycznie istotna w teście Welcha, $t(21.39) = 1.68$, $p = .107$." ] }, { "cell_type": "code", "execution_count": null, "id": "e93c0d68", "metadata": {}, "outputs": [], "source": [ "sns.boxplot(data=spider, x=\"Group\", y=\"Anxiety\", color=\"white\")\n", "sns.stripplot(data=spider, x=\"Group\", y=\"Anxiety\", color=\"#4477AA\", alpha=0.75)\n", "plt.title(\"Poziom lęku po kontakcie ze zdjęciem lub prawdziwym pająkiem\")\n", "plt.xlabel(\"Grupa\")\n", "plt.ylabel(\"Anxiety\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "fdfa5f40", "metadata": {}, "source": [ "## Zadanie 7 (test Wilcoxona) (1 pkt)\n", "\n", "Pewna neurolożka postanowiła zbadać wpływ rekreacyjnych narkotyków na objawy depresyjne. W tym celu przetestowała 20 bywalców klubów. 10 z nich otrzymało tabletkę Ecstasy, którą mieli wziąć w niedzielę. Drugie 10 zostało poproszonych, aby tylko pili alkohol.\n", "\n", "Poziom depresji mierzony był za pomocą *Beck Depression Inventory* w środę (`wedsBDI`) oraz w niedzielę (`sundayBDI`). Otrzymane dane nie miały rozkładu normalnego.\n", "\n", "Czy w grupie przyjmującej Ecstasy poziom depresji był wyższy w środę niż w niedzielę? Przeprowadź odpowiedni test, przygotuj wizualizację wyników i opisz rezultaty analiz." ] }, { "cell_type": "code", "execution_count": null, "id": "dc51cd6f", "metadata": {}, "outputs": [], "source": [ "drugs = pd.read_csv(DATA_DIR / \"drug.csv\")\n", "ecstasy = drugs.loc[drugs[\"drug\"] == \"Ecstasy\"].copy()\n", "\n", "desc = ecstasy[[\"sundayBDI\", \"wedsBDI\"]].agg([\"mean\", \"median\", \"std\"]).T\n", "display(desc)\n", "\n", "result = stats.wilcoxon(\n", " ecstasy[\"sundayBDI\"],\n", " ecstasy[\"wedsBDI\"],\n", " alternative=\"two-sided\",\n", " method=\"asymptotic\",\n", " correction=True,\n", ")\n", "\n", "pd.DataFrame(\n", " {\n", " \"V\": [result.statistic],\n", " \"p\": [result.pvalue],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "67dbcb36", "metadata": {}, "source": [ "W grupie przyjmującej Ecstasy poziom depresji był wyższy w środę ($M = 32.00$, $Mdn = 33.50$, $SD = 4.78$) niż w niedzielę ($M = 19.60$, $Mdn = 17.50$, $SD = 6.60$). Test Wilcoxona wskazał istotną różnicę, $V = 0$, $p = .014$." ] }, { "cell_type": "code", "execution_count": null, "id": "2d8b74cf", "metadata": {}, "outputs": [], "source": [ "ecstasy_long = ecstasy.reset_index(names=\"participant\").melt(\n", " id_vars=\"participant\",\n", " value_vars=[\"sundayBDI\", \"wedsBDI\"],\n", " var_name=\"pomiar\",\n", " value_name=\"BDI\",\n", ")\n", "\n", "sns.boxplot(data=ecstasy_long, x=\"pomiar\", y=\"BDI\", color=\"white\")\n", "sns.stripplot(data=ecstasy_long, x=\"pomiar\", y=\"BDI\", color=\"#4477AA\", alpha=0.75)\n", "\n", "for _, row in ecstasy.iterrows():\n", " plt.plot([0, 1], [row[\"sundayBDI\"], row[\"wedsBDI\"]], color=\"0.65\", alpha=0.45)\n", "\n", "plt.title(\"Depresja w grupie Ecstasy: niedziela vs środa\")\n", "plt.xlabel(\"Pomiar\")\n", "plt.ylabel(\"BDI\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "e99f4b57", "metadata": {}, "source": [ "## Zadanie 8 (test U Manna-Whitneya) (1 pkt)\n", "\n", "Pewien dociekliwy student postanowił pokazać, że popularna w niektórych kręgach pop-psychologia nie poprawia dobrostanu. W tym celu podzielił grupę znajomych (n = 20) losowo na dwie równe grupy. Dane znajdują się w pliku `books_happiness.csv`.\n", "\n", "Badanych z pierwszej grupy poprosił o przeczytanie poradnika samodoskonalenia (`book = 1`). Badani w drugiej grupie zostali poproszeni o lekturę powieści (`book = 2`). Następnie uczestnicy wypełnili kwestionariusz mierzący aktualny poziom szczęścia w życiu.\n", "\n", "Czy czytanie poradników samodoskonalenia sprawia, że jesteśmy szczęśliwsi? Przeprowadź odpowiedni test, przygotuj wizualizację wyników i opisz rezultaty." ] }, { "cell_type": "code", "execution_count": null, "id": "5ccbed00", "metadata": {}, "outputs": [], "source": [ "books = pd.read_csv(DATA_DIR / \"books_happiness.csv\")\n", "books[\"book_label\"] = books[\"book\"].map({1: \"Poradnik\", 2: \"Powieść\"})\n", "\n", "desc = books.groupby(\"book_label\")[\"happy\"].agg([\"count\", \"mean\", \"median\", \"std\"])\n", "display(desc)\n", "\n", "self_help = books.loc[books[\"book\"] == 1, \"happy\"]\n", "novel = books.loc[books[\"book\"] == 2, \"happy\"]\n", "\n", "result = stats.mannwhitneyu(self_help, novel, alternative=\"two-sided\")\n", "\n", "pd.DataFrame(\n", " {\n", " \"U\": [result.statistic],\n", " \"p\": [result.pvalue],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "f872af80", "metadata": {}, "source": [ "Poziom szczęścia nie był wyższy w grupie czytającej poradnik ($M = 20.00$, $Mdn = 19.50$, $SD = 4.11$) niż w grupie czytającej powieść ($M = 24.20$, $Mdn = 25.50$, $SD = 4.71$). Wynik wskazuje raczej na niższy poziom szczęścia w grupie poradnika, $U = 23.5$, $p = .048$." ] }, { "cell_type": "code", "execution_count": null, "id": "d3e45b9a", "metadata": {}, "outputs": [], "source": [ "sns.boxplot(data=books, x=\"book_label\", y=\"happy\", color=\"white\")\n", "sns.stripplot(data=books, x=\"book_label\", y=\"happy\", color=\"#4477AA\", alpha=0.75)\n", "plt.title(\"Poziom szczęścia po lekturze\")\n", "plt.xlabel(\"Lektura\")\n", "plt.ylabel(\"happy\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "86ec6cd4", "metadata": {}, "source": [ "## Zadanie 9 (test dla współczynnika korelacji r) (1 pkt)\n", "\n", "W pliku `ratings.csv` znajdują się dane dotyczące 81 wybranych konkretnych rzeczowników w języku angielskim. W kolumnie `meanSizeRating` znajduje się informacja o estymowanej wielkości obiektu, do którego odnosi się dany rzeczownik. W kolumnie `meanWeightRating` znajduje się estymacja wagi obiektu.\n", "\n", "Czy średnie estymacje wagi są skorelowane ze średnimi estymacjami wielkości? Przeprowadź odpowiedni test, przygotuj wizualizację danych i opisz wyniki." ] }, { "cell_type": "code", "execution_count": null, "id": "0858c840", "metadata": {}, "outputs": [], "source": [ "ratings = pd.read_csv(DATA_DIR / \"ratings.csv\")\n", "\n", "result = stats.pearsonr(ratings[\"meanSizeRating\"], ratings[\"meanWeightRating\"])\n", "r = result.statistic\n", "n = len(ratings)\n", "df = n - 2\n", "t_stat = r * np.sqrt(df / (1 - r**2))\n", "\n", "pd.DataFrame(\n", " {\n", " \"n\": [n],\n", " \"r\": [r],\n", " \"t\": [t_stat],\n", " \"df\": [df],\n", " \"p\": [result.pvalue],\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "086f0a90", "metadata": {}, "source": [ "Estymowana wielkość i estymowana waga obiektów były bardzo silnie dodatnio skorelowane, $r = .999$, $t(79) = 241.45$, $p < .001$." ] }, { "cell_type": "code", "execution_count": null, "id": "54487155", "metadata": {}, "outputs": [], "source": [ "sns.regplot(\n", " data=ratings,\n", " x=\"meanSizeRating\",\n", " y=\"meanWeightRating\",\n", " scatter_kws={\"alpha\": 0.75},\n", " line_kws={\"color\": \"black\"},\n", ")\n", "plt.title(\"Związek estymowanej wielkości i wagi\")\n", "plt.xlabel(\"meanSizeRating\")\n", "plt.ylabel(\"meanWeightRating\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "ba845dfb", "metadata": {}, "source": [ "## Zadanie 10 (regresja liniowa) (2 pkt)\n", "\n", "W pliku `ratings.csv` znajdują się dane dotyczące 81 wybranych konkretnych rzeczowników w języku angielskim. W kolumnie `meanSizeRating` znajduje się informacja o estymowanej wielkości obiektu, do którego odnosi się dany rzeczownik. W kolumnie `meanFamiliarity` znajduje się średnia subiektywna estymacja częstości występowania danego rzeczownika.\n", "\n", "Czy można przewidzieć to, jak ludzie oceniają wielkość danego przedmiotu na podstawie tego, jak często ich zdaniem nazwa tego przedmiotu używana jest w języku? Odpowiedz na podstawie dopasowanego modelu statystycznego, przygotuj wizualizację danych i opisz wyniki analiz." ] }, { "cell_type": "code", "execution_count": null, "id": "331d2fd0", "metadata": {}, "outputs": [], "source": [ "ratings = pd.read_csv(DATA_DIR / \"ratings.csv\")\n", "\n", "fit = smf.ols(\"meanSizeRating ~ meanFamiliarity\", data=ratings).fit()\n", "fit.summary()" ] }, { "cell_type": "markdown", "id": "8f2c12b8", "metadata": {}, "source": [ "Model regresji wskazuje, że im częściej słowo występuje zdaniem badanych, tym mniejszy jest obiekt będący jego odniesieniem. Efekt był niewielki, ale statystycznie istotny: $b = -0.21$, $t(79) = -2.00$, $p = .049$." ] }, { "cell_type": "code", "execution_count": null, "id": "c81a5b95", "metadata": {}, "outputs": [], "source": [ "ratings_std = ratings.assign(\n", " meanSizeRating_z=(ratings[\"meanSizeRating\"] - ratings[\"meanSizeRating\"].mean())\n", " / ratings[\"meanSizeRating\"].std(ddof=1),\n", " meanFamiliarity_z=(ratings[\"meanFamiliarity\"] - ratings[\"meanFamiliarity\"].mean())\n", " / ratings[\"meanFamiliarity\"].std(ddof=1),\n", ")\n", "\n", "fit_std = smf.ols(\"meanSizeRating_z ~ meanFamiliarity_z\", data=ratings_std).fit()\n", "\n", "pd.DataFrame(\n", " {\n", " \"b\": [fit.params[\"meanFamiliarity\"]],\n", " \"SE\": [fit.bse[\"meanFamiliarity\"]],\n", " \"t\": [fit.tvalues[\"meanFamiliarity\"]],\n", " \"df\": [fit.df_resid],\n", " \"p\": [fit.pvalues[\"meanFamiliarity\"]],\n", " \"beta\": [fit_std.params[\"meanFamiliarity_z\"]],\n", " \"R^2\": [fit.rsquared],\n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "b85b05e8", "metadata": {}, "outputs": [], "source": [ "sns.regplot(\n", " data=ratings,\n", " x=\"meanFamiliarity\",\n", " y=\"meanSizeRating\",\n", " scatter_kws={\"alpha\": 0.75},\n", " line_kws={\"color\": \"black\"},\n", ")\n", "plt.title(\"Estymowana wielkość jako funkcja znajomości słowa\")\n", "plt.xlabel(\"meanFamiliarity\")\n", "plt.ylabel(\"meanSizeRating\")\n", "plt.tight_layout()\n", "plt.show()" ] } ], "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.14.2" } }, "nbformat": 4, "nbformat_minor": 5 }