Týden III V tomto týdnu budeme generovat náhodná čísla z vybraných rozdělení, dále je využijeme v simulačních úlohách. První funkcí, kterou budeme pro generování náhodných čísel používat je funkce sample(x, size, replace = FALŠE, prob = NULL). Tato funkce náhodně vylosuje z vektoru x výběr size prvků. Parametr replace říká, zda se mohou výsledky opakovat (=TRUE) či ne. Nakonec parametr prob umožňuje přiřadit jednotlivým prvkům vektoru x různé váhy. Ukažme si několik příkladů: set.seed(408849) sample(l:6, 1) # Náhodné celé číslo 1-6 ## [1] 3 sample(l:6, 6) # Náhodná permutace čísel 1-6 ## [1] 2 4 6 1 3 5 sample(l:6, 6, replace = TRUE) # 6 náhodných čísel 1-6 ## [1] 5 2 1 1 6 2 Příkaz set.seedO nastaví generátor náhodných čísel, tzn. že všichni, kteří pustí kód se stejným seedem generátoru budou mít stejné výsledky. To se hodí pro odlazování kódu nebo při výuce, případně pro opravování domácích úkolů. Způsobuje, že vaše výsledky jsou zreprodukovatelné. Úkol 1. Proveďte následující simulaci: hoďte 100x dvěma šestistěnnými kostkami a výsledky hodů sečtěte. Sestrojte sloupcový graf četností (které jsou odhady pravděpodobností padnutí jednotlivých součtů). Jak odhadujete pravděpodobnost, že padne součet 11? Pro spočítání četností výsledků se hodí funkce table O, pro graf četností histogram (). set.seed(408849) Distribuce 100 výsledku součtu dvou hodu kostkou 9 10 11 12 ## [1] "Odhad pravděpodobnosti, že padne součet 11 je 0.04" Úkol 2 (Narozeninový paradox.). V místnosti je n<365 lidí. Jaká je pravděpodobnost, že se aspoň 2 z nich narodili ve stejný den (na roce nezáleží, přestupné roky neuvažujte). Výsledek mějte ve formě funkce narozeniny (n, repeats), kde n říká počet lidí a repeats na základě kolika pokusů má být simulace provedena. 1 Návod: repeatsx vygenerujte každému z n lidí den, kdy se narodil a zjistěte, zda došlo k aspoň jedné shodě. Může se hodit například funkce unique (x). Poté podělte počet shod celkovým počtem simulací a máte odhad této pravděpodobnosti. set.seed(408849) narozeniny(5, 10**6) ## [1] 0.027084 narozeniny(25, 10**3) ## [1] 0.553 narozeniny(50, 10**3) ## [1] 0.978 Úkol 3 (Nejjednodušší pojistné). Pojišťovna má klienty (jejich počet označíme jako klienti), kteří na začátku roku platí pojistné. V případě, že dojde k pojistné udalosti (ta nastane s pravděpodobnostní p), vyplácí pojišťovna pojistku ( pojistka). Napište funkci pojistovna(klienti, pojistné, p, pojistka), která pro hodnoty vstupních proměnných odsimuluje, jaký je zisk pojišťovny při těchto parametrech. set.seed(408849) pojistovna(10000, 500, 0.0030, 500000) ## [1] -1.2e+07 pojistovna(10000, 200, 0.0002, 50000) ## [1] 1950000 pojistovna(10000, 500, 0.0005, 200000) ## [1] 4600000 Úkol 4 (Pokračování pojistného). Pojišťovna má 10000 klientů, na kterých potřebuje vydělat za rok alespoň 1 milion Kč (na provoz, platy atd.). Určete, jaká je nejmenší výše pojistného v celých stokorunách, při kterém v aspoň 99 případech ze 100 bude tento požadavek splněn. Zbylé parametry jsou pravděpodobnost pojistné událost p=0.05 % a vyplácená částka je 250000 Kč. set.seed(408849) ## [1] "Minimální výše pojistného je 400" Úkol 5 (Pólyova urna). Pólyova urna je model, kterým se vysvětluje, proč často dojde k naprostému ovládnutí trhu jedni mtypem výrobku (např. skladba klávesnice QWERTY) a jindy dojde k rozdělení mezi několika typů (např. operační systémy Windows/Linux/Mac). Více o tomto modelu zaznělo na přednášce. Předpokládejme tedy, že máme 2 konkurenční výrobky A a B. Postupně si jeden z těchto výrobků budou lidé kupovat, a to podle těchto pravidel: • Na začátku byl prodán jeden výrobek A a jeden výrobek B. 2 • Každý další člověk si koupí výrobek A s pravděpodobností přímo úměrnou počtu dosud prodaných výrobků A. • Zajímá nás, zda dojde ke stabilizaci poměru prodaných výrobků A a B. Druhé pravidlo říká, že čím více lidí v okolí má výrobek A, tím je větší pravděpodobnost, že si A koupí další člověk (tlak okolí). Pokud tedy bylo prozatím prodáno 7 výrobků A a 3 výrobky B, pak je pravděpodobnost, že si další člověk koupí výrobek A rovna = 0.7 a komplementárně, že to bude výrobek B 0.3. Napište funkci polyova_urna(n), která provede simulaci n prodaných výrobků, oznámí, jaký podíl A na trhu získal a vykreslí graf průběhu tohoto prodeje. set.seed(408849) polyova_urna(50) ## [1] "Podíl A na trhu je : 0.807692307692308" 3 Domácí úlohy Domácí úloha 1 (1 bod). Napište funkci, která bude hrát naivní pexeso - pexeso (n). Na stole je rozmístěno n párů kartiček. V každém kroku bude funkce volit náhodně dvě kartičky, pokud jsou stejné, odstraní je ze hry. Hra končí v okamžiku, dky je odstraněn poslední pár. set.seed(408849) pexeso(l) ## [1] 1 pexeso(32) ## [1] 1200 pexeso(lOO) ## [1] 8639 Poté spočítejte, kolik průměrně tahů bude tento naivní hráč potřebovat, aby dohrál standardní hru s 32 páry. Volte dostatečně velký poct opakování (103). set.seed(408849) pexeso_prumer(32, 10**3) ## [1] 1013.815 Domácí úloha 2 (2 body). Letecká společnost prodává letenky na trase Praha-Londýn. Do Airbusu A300 se vejde 360 pasažérů. Nicméně v p procentech případů se pasažér nedostaví. Letecká společnost tedy může, s jistým rizikem, prodat více, než 360 letenek. Vaším úkolem je odhadnout, kolik lístků může letecká společnost prodat, pokud se pasažér s pravděpodobností 2 % nedostaví. Letecká společnost je ochotná riskovat, že v 1 % případů dojde k situaci, kdy se dostaví na k letu více než 360 pasažérů. Řešení vytvořte pomocí funkce letadlo (p, r, 1, n), která pro vstupní parametry p (pravděpodobnost, že daný pasažér se nedostaví), r (riziko, jaké je ochotna společnost tolerovat), 1 (počet fyzických míst v letadle) a n (počet pokusů v simulační studii). Poté spočítejte letadlo(0.02, 0.01, 1000). set.seed(408849) letadlo(0.02, 0.01, 360, 1000) ## [1] "Společnost může prodat 363 letenek." letadlo(0.01, 0.05, 750, 1000) ## [1] "Společnost může prodat 754 letenek." letadlo(0.03, 0.10, 750, 1000) ## [1] "Společnost může prodat 768 letenek." 4