Rachunek_prawdopodobienstwa/Przewodnik_studenta_lab/01LRAP_przewodnik.ipynb

452 lines
19 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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 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 `probs`. 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(\"probs\")\n",
"library(probs)\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 języku 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 prawdopodobień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 '...' podajemy formułę logiczną opisującą interesujące nas zdarzenie (tutaj odwołujemy się do elementów zdarzenia `A` poprzez `X`, np. `X >= 2 & X <= 5` zwraca elementy zbioru `A` z przedziału `[2,5]`). 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ącą 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": [
"# Wykorzystamy 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
}