diff --git a/Przewodnik_studenta_lab/01LRAP_przewodnik.ipynb b/Przewodnik_studenta_lab/01LRAP_przewodnik.ipynb new file mode 100644 index 0000000..82a9cbe --- /dev/null +++ b/Przewodnik_studenta_lab/01LRAP_przewodnik.ipynb @@ -0,0 +1,451 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d063c244-0aaa-4b61-874c-5b7968b15d80", + "metadata": {}, + "source": [ + "# Modelowanie przestrzeni probabilistycznych w języku R" + ] + }, + { + "cell_type": "markdown", + "id": "5641f18b-be0b-43b5-ae95-caf4e2899a22", + "metadata": {}, + "source": [ + "Język R zawiera różne pakiety, które są przydatne, gdy chcemy modelować doświadczenia losowe. Dzisiaj omówimy kilka z nich - skupimy się w szczególności na funkcjach, które pozwalają generować obiekty kombinatoryczne, tworzyć proste przestrzenie probabilistyczne i symulować doświadczenia losowe." + ] + }, + { + "cell_type": "markdown", + "id": "aa5a256e-e245-4f50-9233-cad6a8385803", + "metadata": {}, + "source": [ + "## Generowanie obiektów kombinatorycznych\n", + "\n", + "Funkcje `permutations` oraz `combinations` z pakietu `gtools` pozwalają w prosty sposób generować wariacje i kombinacje.\n", + "\n", + "*\tSposób działania:\n", + "\n", + " `permutations(n, r, v=1:n, set=TRUE, repeats.allowed=FALSE)`\n", + " \n", + "\t`combinations(n, r, v=1:n, set=TRUE, repeats.allowed=FALSE)`\n", + "\t\n", + " * `n` - liczba różnych elementów do wyboru;\n", + " * `r` - liczba elementów, które chcemy wybrać;\n", + " * `v` - wektor przechowujący elementy do wyboru. Jeśli długość tego wektora będzie mniejsza niż `n`, to zostanie zwrócony błąd. Jeśli natomiast długość wektora będzie większa niż `n`, to końcowe elementy wektora `v` zostaną zignorowane; \n", + " * Jeśli wektor `v` zawiera duplikaty i chcemy je usunąć, to powinniśmy ustawić opcję `set=TRUE`. Jeśli nie chcemy usuwać duplikatów, to powinnniśmy ustawić opcję `set=FALSE`;\n", + " * `repeats.allowed` - parametr, który ustala czy dokonujemy wyborów z powtórzeniami;\n", + "\n", + "* Funkcja `permutations` generuje wariacje, a funkcja `combinations` kombinacje. Od wartości parametru `repeats.allowed` zależy, czy dopuszczamy powtórzenia.\n", + " \n", + "**Uwaga:** Poniższe przykłady wymagają zainstalowania i załadowania pakietu `gtools`. Niestety, ani ten pakiet, ani pozostałe pakiety, które będą omawiane w tym przewodniku, nie są domyślnie dostępne w wersji online Jupytera, dlatego poniższe przykłady mogą wymagać przekopiowania instrukcji do RStudio. \n" + ] + }, + { + "cell_type": "markdown", + "id": "d32680e5-7ac3-41b3-a736-636ef6409ef9", + "metadata": {}, + "source": [ + "**Przykład 1**\n", + "\n", + "W urnie znajdują się cztery kule o ponumerowane liczbami ze zbioru $\\{1,2,3,4\\}$. Losujemy trzykrotnie jedną kulę. Wypisz wszystkie możliwe wyniki tego doświadczenia, jeśli losowanie odbywa się:\n", + "\n", + "* ze zwracaniem,\n", + "* bez zwracania." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a866c45b-928f-4593-bf91-3d3d7879774f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Installing package into ‘/usr/local/lib/R/site-library’\n", + "(as ‘lib’ is unspecified)\n", + "\n", + "Warning message in install.packages(\"gtools\"):\n", + "“'lib = \"/usr/local/lib/R/site-library\"' is not writable”\n" + ] + }, + { + "ename": "ERROR", + "evalue": "Error in install.packages(\"gtools\"): unable to install packages\n", + "output_type": "error", + "traceback": [ + "Error in install.packages(\"gtools\"): unable to install packages\nTraceback:\n", + "1. install.packages(\"gtools\")", + "2. stop(\"unable to install packages\")" + ] + } + ], + "source": [ + "install.packages(\"gtools\")\n", + "library(gtools)\n", + "x = 1:4\n", + "\n", + "# Generujemy wyniki losowania ze zwracaniem\n", + "wyniki1 = permutations(4, 3, x, repeats.allowed=TRUE)\n", + "print(wyniki1)\n", + "\n", + "# Generujemy wyniki losowania bez zwracania\n", + "wyniki2 = permutations(4, 3, x, repeats.allowed=FALSE)\n", + "print(wyniki2)" + ] + }, + { + "cell_type": "markdown", + "id": "9cdce386-8a41-4497-bd17-6b338f3b547c", + "metadata": {}, + "source": [ + "**Przykład 2**\n", + "\n", + "Losujemy jednocześnie dwie kule z urny, w której znajdują $3$ kule białe i $2$ czarne. Jakie jest prawdopodobieństwo, że wylosujemy dwie białe kule?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b78a0fb-f1cd-4d64-bf5b-5d0d0f2887e4", + "metadata": {}, + "outputs": [], + "source": [ + "# Zaczniemy od wygenerowania wszystkich możliwości\n", + "kule = c('b', 'b', 'b', 'c', 'c')\n", + "wszystkie = combinations(5, 2, kule, set=FALSE)\n", + "print(wszystkie)\n", + "\n", + "# Zwróćmy uwagę, że dzięki ustawieniu parametru set=FALSE, funkcja traktuje kule opisane tymi samymi literami jako rozróżnialne. Gdybyśmy ustawili set=TRUE, to w wektorze kule powinniśmy nadać każdej kuli inną nazwę\n", + "biale = combinations(3, 2, kule, set=FALSE)\n", + "print(biale)\n", + "\n", + "# Zwróćmy uwagę, że ponieważ n=3, funkcja uwzględnia tylko 3 pierwsze elementy wektora kule\n", + "# Aby policzyć prawdopodobieństwo wylosowania samych białych kul, wystarczy policzyć liczbę wierszy macierzy wszystkie i biale. Możemy do tego użyc polecenia nrow\n", + "p = nrow(biale)/nrow(wszystkie)\n", + "paste(\"Prawdopodobieństwo wylosowania dwóch białych kul:', p)" + ] + }, + { + "cell_type": "markdown", + "id": "df5f6b1e-cc51-416b-ae65-8e09a083831d", + "metadata": {}, + "source": [ + "## Generowanie przestrzeni probabilistycznych\n", + "\n", + "Najważniejsze funkcje, z których będziemy korzystać na tych zajęciach znajdują się w pakiecie `prob`. W celu wygenerowania przestrzeni probabilistycznej możemy użyć następującego polecenia:\n", + "\n", + "`probspace(x, probs)`,\n", + "\n", + "gdzie `x` oznacza możliwe wyniki eksperymentu losowego, a `probs` to wektor odpowiadających im prawdopodobieństw. Jeśli nie podamy wektora `probs`, to domyślnie każdemu zdarzeniu elementarnemu zostanie przypisane takie samo prawdopodobieństwo, czyli będziemy mieli do czynienia z przestrzenią klasyczną. " + ] + }, + { + "cell_type": "markdown", + "id": "86adc4b9-a0ec-43bc-bdcb-f349364a5292", + "metadata": {}, + "source": [ + "**Przykład 3**\n", + "\n", + "Rzucamy jeden raz standardową, sześcienną kostką do gry. Wygeneruj przestrzeń probabilistyczną odpowiadającą temu doświadczeniu losowemu." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7c834a09-aa05-4095-87e4-c6d953498882", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Installing package into ‘/usr/local/lib/R/site-library’\n", + "(as ‘lib’ is unspecified)\n", + "\n", + "Warning message in install.packages(\"prob\"):\n", + "“'lib = \"/usr/local/lib/R/site-library\"' is not writable”\n" + ] + }, + { + "ename": "ERROR", + "evalue": "Error in install.packages(\"prob\"): unable to install packages\n", + "output_type": "error", + "traceback": [ + "Error in install.packages(\"prob\"): unable to install packages\nTraceback:\n", + "1. install.packages(\"prob\")", + "2. stop(\"unable to install packages\")" + ] + } + ], + "source": [ + "install.packages(\"prob\")\n", + "library(prob)\n", + "# Możemy założyć, że wszystkie wyniki rzutu kostką są równoprawdopodobne, więc nie jest konieczne podawanie wektora prawdopodobieństw prob\n", + "kostki1 = probspace(1:6)\n", + "print(kostki1)" + ] + }, + { + "cell_type": "markdown", + "id": "3090320c-cd09-4129-bea8-b2d1da70f8a6", + "metadata": {}, + "source": [ + "**Przykład 4**\n", + "\n", + "Ania i Bartek grają w grę \"Losowe szlaki\". Prawdopodobieństwo wygranej Ani wynosi $0.3$, wygranej Bartka to $0.5$, a remisu $0.2$. Wygeneruj przestrzeń probabilistyczną odpowiadającą temu doświadczeniu losowemu. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0b0b900b-f0bc-43d3-be33-addbabf287f9", + "metadata": {}, + "outputs": [ + { + "ename": "ERROR", + "evalue": "Error in probspace(c(\"Ania\", \"Bartek\", \"remis\"), c(0.3, 0.5, 0.2)): could not find function \"probspace\"\n", + "output_type": "error", + "traceback": [ + "Error in probspace(c(\"Ania\", \"Bartek\", \"remis\"), c(0.3, 0.5, 0.2)): could not find function \"probspace\"\nTraceback:\n" + ] + } + ], + "source": [ + "# Ponieważ w tym przypadku prawdopodobieństwa zdarzeń elementarnych są różne, to musimy zdefiniować wektor prawdopodobieństw, któego wyrazy sumują się do 1.\n", + "gra = probspace(c('Ania', 'Bartek', 'remis'), c(0.3, 0.5, 0.2))\n", + "print(gra)" + ] + }, + { + "cell_type": "markdown", + "id": "70e3a6e4-96ff-4b46-99e9-0af321009051", + "metadata": {}, + "source": [ + "### Wbudowane przestrzenie probabilistyczne\n", + "\n", + "Podczas zajęć z rachunku prawdopodobieństwa będziemy regularnie omawiać przykłady i zadania związana z pewnymi klasycznymi doświadczeniami losowymi. Niektórym z nich poświęcone są wbudowane funkcje w programie R, które przedstawiono poniżej:\n", + "\n", + "* `tosscoin(times, makespace=FALSE)` - przestrzeń probabilistyczna odpowiadająca wielokrotnemu rzutowi symetryczną monetą. Parametr `times` oznacza liczbę rzutów. Jeśli `makespace=TRUE`, to każdemu możliwemu wynikowi rzutu monetą zostanie przypisane takie samo prawdopodobieństwo. W przeciwnym przypadku zostaną wygenerowane wszystkie możliwe wyniki rzutów, ale nie zostaną im przypisane prawdopodobieństwa. Parametr `makespace` będzie działał w analogiczny sposób we wszystkich niżej wymienionych funkcjach.\n", + "* `rolldie(times, nsides=6, makespace=FALSE)` - przestrzeń probabilistyczna odpowiadająca wielokrotnemu rzutowi symetryczną kostką. Parametr `times` oznacza liczbę rzutów, a `nsides` liczbę ścianek kostki.\n", + "* `cards(jokers=FALSE, makespace=FALSE)` - przestrzeń probabilistyczna odpowiadająca losowaniu jednej karty ze standardowej talii $52$ kart. Jeśli parametr `jokers` ma wartość `TRUE`, to dodatkowo w talii uwzględnione są dwa jokery.\n", + "* `roulette(european=FALSE, makespace=FALSE)` - przestrzeń probabilistyczna odpowiadająca grze w ruletkę. Parametr `european` przyjmuje wartość *TRUE*, jeśli mamy do czynienia z ruletką typu europejskiego ($37$ pól). W przeciwnym przypadku mamy do czynienia z ruletką typu amerykańskiego ($38$ pól).\n" + ] + }, + { + "cell_type": "markdown", + "id": "21de4865-9ad9-4327-a3ed-f165c1b303fc", + "metadata": {}, + "source": [ + "**Przykład 5**\n", + "\n", + "Wygeneruj przestrzeń probabilistyczną odpowiadającą doświadczeniu losowemu polegającemu na:\n", + "* losowaniu jednej karty z talii $52$ kart,\n", + "* trzech rzutach sześcienną kostką." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afbd23da-5b20-486e-856e-2123ee245dfe", + "metadata": {}, + "outputs": [], + "source": [ + "# Losowanie 1 karty\n", + "karta = cards(makespace=TRUE)\n", + "print(karta)\n", + "\n", + "# Trzy rzuty kostką\n", + "kostki3 = rolldie(3, nsides=6, makespace=TRUE)\n", + "print(kostki3)" + ] + }, + { + "cell_type": "markdown", + "id": "0493e671-5fb5-4de6-ae73-650f0158d5f7", + "metadata": {}, + "source": [ + "### Obliczanie praawdopodobieństwa\n", + "\n", + "Do obliczania prawdopodobieństwa zdarzenia we wcześniej zdefiniownej przestrzeni probabilistycznej możemy użyć polecenia `Prob`. Istnieją dwa sposoby stosowania tego polecenia:\n", + "* Jeśli `A` to podzbiór zbioru zdarzeń elementarnych pewnej przestrzeni probabilistycznej, to `Prob(A)` zwróci prawdopodobieństwo zdarzenia `A`. W tym przypadku do wyznaczenia zdarzenia `A` możemy użyć polecenia `subset(Y,...)`, gdzie `Y` oznacza odpowiednią przestrzeń probabilistyczną, a w miejscu '...' podjemy formułę logiczną opisujące interesujące nas zdarzenie. Możemy też wyznaczyć podzbiór *A* stosując wprost odpowiednie odwołanie do elementów zbioru zdarzeń elementarnych przestrzeni *Y*.\n", + "* Jeśli `Y` jest przestrzenią probabilistyczną, to stosujemy polecenie `Prob(Y, event)`, gdzie w miejscu `event` należy podać formułę logiczną opisujące interesujące nas zdarzenie. " + ] + }, + { + "cell_type": "markdown", + "id": "70938d4e-bf71-4ea4-bea6-bc78807169f4", + "metadata": {}, + "source": [ + "**Przykład 6**\n", + "\n", + "Losujemy jedną kartę z talii 52 kart. Oblicz prawdopodobieństwo, że wylosowana karta jest kierem." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f403e1c0-5807-43f7-987d-41de704a27ba", + "metadata": {}, + "outputs": [ + { + "ename": "ERROR", + "evalue": "Error in eval(expr, envir, enclos): object 'karta' not found\n", + "output_type": "error", + "traceback": [ + "Error in eval(expr, envir, enclos): object 'karta' not found\nTraceback:\n" + ] + } + ], + "source": [ + "# Wykorzystamy zdefiniowaną wcześniej przestrzeń karta\n", + "# Zwróćmy uwagę, że kiery znajdują się w wierszach od 27 do 39\n", + "kiery = karta[27:39, ]\n", + "print(kiery)\n", + "p = Prob(kiery)\n", + "print(p)\n", + "\n", + "# Alternatywnie, możemy wyznaczyć wszystkie kiery stosując polecenie subset i odpowiedni warunek logiczny\n", + "# Tutaj korzystamy z tego, że każda karta ma swoją figurę (label) oraz kolor (suit)\n", + "kiery2 = subset(karta, suit=='Heart')\n", + "print(kiery2)\n", + "p2 = Prob(kiery2)\n", + "print(p2)" + ] + }, + { + "cell_type": "markdown", + "id": "25fd0284-cd44-4468-b160-ec9ec4fd556f", + "metadata": {}, + "source": [ + "Gdy chcemy wyznaczyć bardziej skomplikowane zdarzenia, pomocne mogą być następujące polecenia związane z działaniami na zbiorach:\n", + "\n", + "* `union(A, B)` - suma zbiorów $A$ i $B$,\n", + "* `intersect(A, B)` - część wspólna zbiorów $A$ i $B$,\n", + "* `setdiff(A, B)` - różnica zbiorów $A$ i $B$ (tzn. elementy, które są w $A$, ale nie w $B$)." + ] + }, + { + "cell_type": "markdown", + "id": "aba30f8b-19db-4ebd-b9a4-5bd2d424a0a5", + "metadata": {}, + "source": [ + "**Przykład 7**\n", + "\n", + "Rzucamy trzykrotnie sześcienną kostką. Oblicz prawdopodobieństwo następujących zdarzeń:\n", + "* $A$ - wypadną co najmniej dwie szóstki,\n", + "* $B$ - wypadną mniej niż dwie szóstki." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ce6c290-c02c-454e-bf01-356ecb1dd95e", + "metadata": {}, + "outputs": [], + "source": [ + "# Wyykorzystamy zdefiniowaną wcześniej przestrzeń kostki3\n", + "# Zwróćmy uwagę, że zdarzenie A oznacza, że w pierwszym i drugim rzucie były szóstki LUB w pierwszym i trzecim rzucie były szóstki LUB w drugim i trzecim rzucie były szóstki\n", + "# Możemy wyznaczyć prawdopodobieństwo A bezpośrednio przez użycie polecenia prob i odpowiedniej formuły logicznej\n", + "pA = Prob(kostki3, (X1==6&X2==6)|(X1==6&X3==6)|(X2==6&X3==6))\n", + "print(pA)\n", + "# Alternatywnie, możemy wyznaczyć najpierw trzy pomocnicze zdarzenia i na końcu wyznaczyć ich sumę\n", + "A1 = subset(kostki3, X1==6&X2==6)\n", + "A2 = subset(kostki3, X1==6&X3==6)\n", + "A3 = subset(kostki3, X2==6&X3==6)\n", + "A = union(A1, union(A2, A3))\n", + "pA = Prob(A)\n", + "print(pA)\n", + "\n", + "# Zauważmy teraz, że zdarzenie B jest zdarzeniem przeciwnym do zdarzenia A\n", + "B = setdiff(kostki3, A)\n", + "pB = Prob(B)\n", + "print(pB)" + ] + }, + { + "cell_type": "markdown", + "id": "8ab57858-c7fe-4e58-b7aa-f015587cf030", + "metadata": {}, + "source": [ + "## Symulacja doświadczeń losowych\n", + "\n", + "Do symulowania wyników doświadczenia losowego służy funkcja `sim(X, ntrials)`, gdzie `X` jest przestrzenią probabilistyczną, a `ntrials` liczbą powtórzeń eksperymentu losowego.\n", + "\n", + "Z drugiej strony, jeśli wielokrotnie powtórzymy pewne doświadczenie losowe, to możemy na podstawie wyników spróbować wyznaczyć przestrzeń probabilistyczną. W języku R można to osiągnąć używając polecenia `empirical(X)`, gdzie `x` zawiera wyniki doświadczenia losowego. Polecenie to szacuje prawdopodobieństwa zdarzeń elementarnych jako ich relatywną częstość występowania." + ] + }, + { + "cell_type": "markdown", + "id": "59e3c637-edbf-4236-84fb-e6831c89642b", + "metadata": {}, + "source": [ + "**Przykład 8**\n", + "\n", + "Ania i Bartek grają w grę ,,Losowe szlaki''. Prawdopodobieństwo wygranej Ani wynosi $0.3$, wygranej Bartka to $0.5$, a remisu $0.2$. Wykonaj symulacją $100$ powtórzeń tego eksperymentu losowego. Następnie porównaj rozkład wylosowanych wartości z ich rzeczywistym rozkładem." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32c5fae7-e929-40e8-82ac-9bfee1d4edce", + "metadata": {}, + "outputs": [], + "source": [ + "# Użyjemy zdefiniowanej wcześniej przestrzeni gra\n", + "# Wykonujemy symulację\n", + "wyniki = sim(gra, 100)\n", + "print(wyniki)\n", + "\n", + "# Możemy teraz wyznaczyć rozkład wyników\n", + "gra_bis = empirical(wyniki)\n", + "print(gra_bis)\n", + "\n", + "# Możemy też porównać otrzymany rozkład z rozkładem pierwotnym na wykresie\n", + "w = rbind(gra$probs, gra_bis$probs)\n", + "barplot(w,names.arg=gra$x,beside=TRUE,col=c('lightblue','darkred'),xlab='Wyniki gry',ylab='Prawdopodobieństwo', main='Porównanie rozkładu rzeczywistego i wynikającego z symulacji')\n", + "legend(7,0.5,c('Rozkład rzeczywisty','Symulacja'),col=c('lightblue','darkred'),pch=15)" + ] + }, + { + "cell_type": "markdown", + "id": "6e7d8552-93e9-495c-bdee-334b95bce0a8", + "metadata": {}, + "source": [ + "## Bibliografia\n", + "\n", + "Dokumentację dotyczącą omawianych pakietów można znaleźć na stronach:\n", + "* [gtools](https://www.rdocumentation.org/packages/gtools/versions/3.9.5)\n", + "* [prob](https://www.rdocumentation.org/packages/prob/versions/1.0-1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d69aaec-05d9-4507-bfec-bb1ea926ec32", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "R", + "language": "R", + "name": "ir" + }, + "language_info": { + "codemirror_mode": "r", + "file_extension": ".r", + "mimetype": "text/x-r-source", + "name": "R", + "pygments_lexer": "r", + "version": "4.2.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}