<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Дискретное распределение
Сгенерируем выборку объёма 100 из дискретного распределения с шестью равновероятными исходами.
Step1:  Представим теперь, что эта выборка была получена не искусственно, а путём подбрасывания симметричного шестигранного кубика 100 раз. Оценим вероятности выпадения каждой из сторон с помощью частот
Step2:  Это и есть оценка функции вероятности дискретного распределения.
Непрерывное распределение
Сгенерируем выборку объёма 100 из стандартного нормального распределения (с $\mu=0$ и $\sigma^2=1$)
Step3:  Эмпирическая функция распределения для полученной выборки
Step4:  Гистограмма выборки
Step5:  Попробуем задавать число карманов гистограммы вручную
Step6:  Эмпирическая оценка плотности, построенная по выборке с помощью ядерного сглаживания
<ASSISTANT_TASK:>
Python Code:
sample = np.random.choice([1,2,3,4,5,6], 100)
Explanation: Дискретное распределение
Сгенерируем выборку объёма 100 из дискретного распределения с шестью равновероятными исходами.
End of explanation
# посчитаем число выпадений каждой из сторон:
from collections import Counter
c = Counter(sample)
print("Число выпадений каждой из сторон:")    
print(c)
# теперь поделим на общее число подбрасываний и получим вероятности:
print("Вероятности выпадений каждой из сторон:")
print({k: v/100.0 for k, v in c.items()})
Explanation: Представим теперь, что эта выборка была получена не искусственно, а путём подбрасывания симметричного шестигранного кубика 100 раз. Оценим вероятности выпадения каждой из сторон с помощью частот:
End of explanation
norm_rv = sts.norm(0, 1)
sample = norm_rv.rvs(100)
Explanation: Это и есть оценка функции вероятности дискретного распределения.
Непрерывное распределение
Сгенерируем выборку объёма 100 из стандартного нормального распределения (с $\mu=0$ и $\sigma^2=1$):
End of explanation
x = np.linspace(-4,4,100)
cdf = norm_rv.cdf(x)
plt.plot(x, cdf, label='theoretical CDF')
# для построения ECDF используем библиотеку statsmodels
from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF(sample)
plt.step(ecdf.x, ecdf.y, label='ECDF')
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.legend(loc='upper left')
Explanation: Эмпирическая функция распределения для полученной выборки:
End of explanation
plt.hist(sample, normed=True)
plt.ylabel('number of samples')
plt.xlabel('$x$')
Explanation: Гистограмма выборки:
End of explanation
plt.hist(sample, bins=3, normed=True)
plt.ylabel('number of samples')
plt.xlabel('$x$')
plt.hist(sample, bins=40, normed=True)
plt.ylabel('number of samples')
plt.xlabel('$x$')
Explanation: Попробуем задавать число карманов гистограммы вручную:
End of explanation
# для построения используем библиотеку Pandas:
df = pd.DataFrame(sample, columns=['KDE'])
ax = df.plot(kind='density')
# на том же графике построим теоретическую плотность распределения:
x = np.linspace(-4,4,100)
pdf = norm_rv.pdf(x)
plt.plot(x, pdf, label='theoretical pdf', alpha=0.5)
plt.legend()
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
Explanation: Эмпирическая оценка плотности, построенная по выборке с помощью ядерного сглаживания:
End of explanation
<END_TASK>