#!/usr/bin/env python
# coding: utf-8
# # Вероятность и Мат. Статистика часть 1.
# Шестаков А.В. Майнор по анализу данных - 09/02/2016
# In[ ]:
import numpy as np
import scipy.stats as stat
import matplotlib.pyplot as plt
plt.style.use('ggplot')
get_ipython().run_line_magic('matplotlib', 'inline')
# ## Birthday Paradox
# Для начала, скажите у кого когда день рождения?)
#
# А теперь вопрос какова вероятность, что в классе из $n$ человек **хотя бы у двух** человек день рождения приходится на один и тот же день. Расчитаем вероятность:
#
# Пусть $P(n)$ - искомая вероятность. Найдем дополнение к ней $\bar{P}(n) = 1-P(n)$, что означает, что в нашем классе у всех человек дни рождения различны. Возьмём любого человека и запомним его день рождения. У вероятность, что у следующего человека день рождения в тот же день равна $(1 - \frac{1}{365})$. У третьего - $(1 - \frac{2}{365})$, и так далее. Теперь нам нужно совместить все эти события.
#
# Так как они независимы, то мы можем просто перемножить найденные вероятности:
#
# $$ \bar{P}(n) = \prod_{i=1}^{n-1}(1 - \frac{i}{365}) = \frac{365 \cdot 364 \cdot (365 - n + 1)} {365^n} = \frac{365!}{365^n(365 -n)!} $$
# Попробуйте посчитать это число в лоб.
# In[ ]:
## Your code here
# Мы же воспользуемся другим подходом!
Мы будем генерировать случайные группы людей, в каждой будем проверять, есть ли среди них хотя бы она пара с одинаковым днем рождения, а затем усредним наши результаты за все эксперименты. Такой метод оценки с помощью многокраного повторения какого-либо эксперимента называется **Методом Монте-Карло**.
# In[ ]:
n = 20 # количество человек в классе
exper_num = 100000 # количество экспериментов
# Your code here
def birthday_montecarlo(n, exper_num):
# Используйте разработанную функцию, чтобы построить график $P(n)$
# In[ ]:
# Your code here
# ## Центральная предельная теорема
# Центральная предельная теорема гласит (неформально):
# Закон распределения среднего значение выборки размера $N$ из генеральной совокупности приближается к нормальному распределению с увеличением $N$.
# Например, хотим мы расчитать средний рост человека, но ведь для этого нужны наблюдения по всем людям. Чего у нас нет, но можно попробовать оценить.
#
# * Создайте случайную выборку из $100$ наблюдений
# * Нарисуйте её гистограмму, оцените среднее и дисперсию
# * Задайте параметр `N<100`, и `num_exper` раз случайно отсемплируйте выборку.
# * Для каждого сэмпла расчитайте среднее, затем постройте распределение средних значений
# * Попробуйте наложить на полученную гистограмму нормальное распределение
# In[ ]:
np.random.seed(100) # Для репродукции
# Your code here
# ## Формула Байеса
# $$P(A_i|B) = \frac{P(B|A_i)\cdot P(A_i)}{\sum_{i=1}^n P(B|A_i) \cdot P(A_i)} $$
# Рассмотрите следующую таблицу:
# In[ ]:
import pandas as pd
df = pd.DataFrame({'Weather': ['Sunny', 'Overcast', 'Rainy', 'Sunny', 'Sunny', 'Overcast', 'Rainy', 'Rainy', 'Sunny', 'Rainy', 'Sunny', 'Overcast', 'Overcast', 'Rainy'],
'Play': [0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0]})
df
# Найдите вероятность игры в солнечную погоду