4.

Уровень кальция в крови здоровых молодых женщин равен в среднем 9.5 милиграммам на децилитр и имеет характерное стандартное отклонение 0.4 мг/дл. В сельской больнице Гватемалы для 160 здоровых беременных женщин при первом обращении для ведения беременности был измерен уровень кальция; среднее значение составило 9.57 мг/дл. Можно ли утверждать, что средний уровень кальция в этой популяции отличается от 9.5?

Посчитайте достигаемый уровень значимости. Поскольку известны только среднее и дисперсия, а не сама выборка, нельзя использовать стандартные функции критериев — нужно реализовать формулу достигаемого уровня значимости самостоятельно.

Округлите ответ до четырёх знаков после десятичной точки.

6.

Имеются данные о стоимости и размерах 53940 бриллиантов. Отделите 25% случайных наблюдений в тестовую выборку с помощью функции sklearn.cross_validation.train_test_split (зафиксируйте random state = 1). На обучающей выборке настройте две регрессионные модели:

  • линейную регрессию с помощью LinearRegression без параметров
  • случайный лес с помощью RandomForestRegressor с random_state=1. Какая из моделей лучше предсказывает цену бриллиантов? Сделайте предсказания на тестовой выборке, посчитайте модули отклонений предсказаний от истинных цен. Проверьте гипотезу об одинаковом среднем качестве предсказаний, вычислите достигаемый уровень значимости. Отвергается ли гипотеза об одинаковом качестве моделей против двусторонней альтернативы на уровен значимости α=0.05?

7.

В предыдущей задаче посчитайте 95% доверительный интервал для разности средних абсолютных ошибок предсказаний регрессии и случайного леса. Чему равна его ближайшая к нулю граница? Округлите до десятков (поскольку случайный лес может давать немного разные предсказания в зависимости от версий библиотек, мы просим вас так сильно округлить, чтобы полученное значение наверняка совпало с нашим).


In [53]:
import numpy as np
import scipy
from scipy.stats import norm
from sklearn.cross_validation import train_test_split 
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from statsmodels.stats.weightstats import *

In [3]:
z = (9.57-9.5)/(0.4/np.sqrt(160))
z


Out[3]:
2.2135943621178749

In [12]:
2*(1-norm.cdf(abs(z)))


Out[12]:
0.026856695507523787

In [18]:
data = pd.read_csv('diamonds.txt', sep='\t')

In [19]:
data.head()


Out[19]:
carat depth table price x y z
0 0.23 61.5 55.0 326 3.95 3.98 2.43
1 0.21 59.8 61.0 326 3.89 3.84 2.31
2 0.23 56.9 65.0 327 4.05 4.07 2.31
3 0.29 62.4 58.0 334 4.20 4.23 2.63
4 0.31 63.3 58.0 335 4.34 4.35 2.75

In [20]:
data.shape


Out[20]:
(53940, 7)

In [25]:
y = data['price']
X = data.drop('price', axis=1)

In [27]:
y.head()


Out[27]:
0    326
1    326
2    327
3    334
4    335
Name: price, dtype: int64

In [28]:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)

In [30]:
y_train.shape


Out[30]:
(40455,)

In [34]:
lr = LinearRegression()
lr.fit(X,y)


Out[34]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

In [35]:
rf = RandomForestRegressor(random_state=1)
rf.fit(X,y)


Out[35]:
RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
           max_features='auto', max_leaf_nodes=None, min_samples_leaf=1,
           min_samples_split=2, min_weight_fraction_leaf=0.0,
           n_estimators=10, n_jobs=1, oob_score=False, random_state=1,
           verbose=0, warm_start=False)

In [36]:
y_pred_lr = lr.predict(X_test)
y_pred_rf = rf.predict(X_test)

In [45]:
diff_lr = np.abs(y_pred_lr - y_test)
diff_rf = np.abs(y_pred_rf - y_test)

In [47]:
diff_lr_mean, diff_rf_mean


Out[47]:
(885.0540203725976, 324.9877198689746)

In [51]:
scipy.stats.ttest_rel(diff_lr, diff_rf)


Out[51]:
Ttest_relResult(statistic=70.660615080612686, pvalue=0.0)

In [56]:
stats.ttest_rel(abs(y_test - lr.predict(X_test)), 
                abs(y_test - rf.predict(X_test)))


Out[56]:
Ttest_relResult(statistic=70.660615080612686, pvalue=0.0)

In [57]:
print "95%% confidence interval: [%f, %f]" % DescrStatsW(abs(y_test - lr.predict(X_test)) - abs(y_test - rf.predict(X_test))).tconfint_mean()


95% confidence interval: [544.529947, 575.602654]

In [ ]: