[БЕЗ ЗВУКА] В этом видео
мы научимся строить интервальные оценки на основе методологии Bootstrap.
Часто нам нужно построить интервальную оценку для некоторой не очень удобной
статистики, при распределении которой нам просто ничего не известно.
Это могут быть такие статистики, как квантили, например, медиана,
или некоторое сочетание известных статистик, например, отношение долей.
В принципе, это может быть любая функция, которую вы можете посчитать от выборки.
Как же быть в этом случае?
Ну вообще, для того чтобы оценить интервально некоторую статистику,
нам нужно знать её распределение.
Возникает вопрос: как же его получить?
Ну, вообще говоря, первое, что приходит в голову — это
породить много случайных выборок из генеральной совокупности.
Дальше на каждой из этих выборок оценить нужную нам статистику
и таким образом установить эмпирическую функцию распределения.
Казалось бы, неплохой способ, однако он скорее теоретический, чем практический,
потому что, если мы можем неограниченно генерировать выборки
из генеральной совокупности, то, получается,
и посчитать саму статистику на генеральной совокупности нам не так уж и сложно.
А если мы можем это сделать, нам уже не нужна никакая интервальная оценка,
мы сами знаем настоящее значение нужной статистики.
Получается, этот способ на практике практически не применим.
Другой способ, который мы можем предложить,
— это так называемый параметрический подход.
Здесь мы должны предположить, что наша статистика имеет некоторое распределение,
и далее по выборке оценить его параметры.
Ну на самом деле это тоже не самый лучший способ, потому что непонятно,
из каких соображений мы должны выбирать семейство распределений.
Мы ничего про данные не знаем, вернее,
мы ничего не знаем про распределение, поэтому ну неочевидно, как его выбрать.
Единственное, что нам доступно для анализа — это некоторая выборка,
и это приводит нас к идее Bootstrap.
Что если мы будем сэмплировать данные из известной нам выборки с возвращениями,
то есть из известной выборки получать выборки такой же длины путём сэмплирования
с возвращением?
В этом случае мы с вами будем сэмплировать уже не из теоретической функции
распределения, а из эмпирической функции распределения, и таким образом,
посчитав статистику на каждой из этих выборок,
мы с вами оценим эмпирическую функцию распределения.
Собственно, в этом и заключается идея Bootstrap.
Давайте попробуем применить её на практике.
Решать мы с вами будем следующую задачу.
Существует такая американская компания под названием Verizon,
которая является основной телефонной компанией на западе Соединённых Штатов.
Это означает то, что данная компания должна предоставлять услуги по
ремонту телекоммуникаций не только для своих клиентов,
но также для клиентов других местных локальных компаний.
В этом случае кажется, что у этой компании есть некоторая заинтересованность
предоставлять сервис для своих клиентов несколько лучше.
Ну, например, ремонтировать их оборудование быстрее.
Для того чтобы за этим следить и контролировать ситуацию,
используется статистика.
Строятся интервальные оценки на время ремонта оборудования
для клиентов этой компании и для остальных клиентов.
Давайте загрузим доступную нам выборку и проанализируем среднее время
ремонта оборудования для клиентов компании Verizon и среднее время ремонта
оборудования для клиентов других компаний.
Для этого давайте создадим DataFrame на основе наших данных.
Сразу же увидим его размер, мы видим,
что в DataFrame примерно 1700 записей и всего два столбца.
Вот давайте выведем начало нашего DataFrame и посмотрим, что же там.
Ну структура довольно простая.
Мы видим, что в первом столбце у нас указан Time.
Это время ремонта оборудования.
А во втором столбце указана группа клиентов.
ILEC означает, что это клиент самой компании, CLEC означает,
что это клиент другой компании.
Вот теперь давайте посмотрим,
как много информации у нас известно про клиентов разных типов.
Да, видим, что про клиентов компании Verizon у нас гораздо больше информации.
Практически все данные относятся к клиентам этой компании.
Но тем не менее нам с вами хочется каким-то образом сравнить,
насколько же отличается среднее время ремонта.
Ну сравнивать среднее время ремонта не очень сложно, мы с вами это уже умеем.
Мы умеем строить доверительные интервалы на средние,
поэтому давайте возьмём какую-нибудь другую статистику.
Давайте сравним, как же соотносится между собой медианное время ремонта.
Для начала давайте построим распределение времени ремонта
оборудования для клиентов разного типа.
Это делается очень просто с помощью метода hist из pylab.
Ну давайте посмотрим и попробуем проанализировать гистограмму.
Но если посмотреть на распределение, то есть предположение, что, кажется,
клиенты местных компаний получают услугу лучше.
Виден явный пик вблизи нуля в самой левой части диаграммы.
А вот про клиентов остальных компаний такое не скажешь — видно, что здесь
довольно много точек находится правее, ну то есть время ремонта чаще бывает дольше.
Конечно же, оценивать глазами такие вещи неправильно.
Давайте попробуем получить строгую формальную оценку.
Итак, будем это делать с помощью методологии Bootstrap.
Это довольно простой метод, поэтому его реализовать совсем несложно.
Нам понадобятся две вспомогательные функции.
Первую функцию назовём get bootstrap samples.
Эта функция будет принимать на вход данные.
И количество подвыборок, количество сэмплов, которые мы хотим получить.
Реализация предельно простая.
Для начала давайте получим наборы индексов из range 0 размер
наших данных с повторением.
Это можно сделать с помощью модуля np.
random функции rand Int.
Указываем ей в качестве аргументов начало и конец нашего диапазона, соответственно,
это ноль и размер входных данных.
И теперь говорим сколько выборок нам нужно.
Ну вот нам нужно выборок ровно n samples.
Этот аргумент мы передаём.
Ну и мы говорим, что эти выборки должны быть такого же размера,
как и размер наших исходных данных.
Вот получаем эти индексы, дальше получаем выборки,
применяя эти индексы к исходному набору данных, и возвращаем выборки.
Следующая функция, которая нам понадобится, stat intervals.
Она реализована очень просто.
Так как мы хотим оценивать наш интервал на некотором уровне значимости,
вот просто давайте создадим функцию,
которая на вход получает нужные статистики, уровень доверия,
который нас интересует, и возвращает нам левую и правую границы интервала.
Функция очень простая, передаём ей статистики, передаём ей α,
а дальше берём наши статистики и упорядочиваем их по возрастанию,
и говорим, что мы просто отрезаем слева и справа по кусочку
равному α / 2 (слева) и (1 − α) / 2 (справа).
Давайте начнём с того,
что получим независимые интервальные оценки медианы для клиентов двух типов.
Для этого давайте создадим два массива.
В первый массив запишем время ремонта для клиентов компании Verizon,
во второй массив запишем время ремонта для клиентов других компаний.
Это делается очень просто с помощью сравнения групп с нужными константами.
Соответственно, записываем только время.
Теперь дальше.
Нам нужно применить функцию get bootstrap samples,
то есть сгенерировать набор данных.
В данном случае я хочу генерировать тысячу выборок для каждого… для каждой группы
клиентов.
И давайте сразу же посчитаем нашу статистику.
Это очень просто, мы можем посчитать медиану с помощью метода np.
median, поэтому давайте сразу создадим массивы,
состоящие из оценки медианы на наших подвыборках.
Это делается с помощью метода map, то есть получаем сэмплы,
применяем медиану и записываем результат в массив.
Делаем это дважды для клиентов разных компаний.
Ну и давайте сразу посчитаем статистику.
Выведем результаты работы функции stat intervals на экран.
Рассчитываем статистику на уровне доверия
0,05 и видим, что ну, кажется, весь интервал для клиентов
компании Verizon расположен левее интервала для клиентов внешних компаний.
Кажется, интерес помогать своим клиентам всё-таки есть.
Итак, мы с вами получили независимые интервальные оценки медианы времени
ремонта оборудования для клиентов из разных групп,
и теперь давайте немножечко усложним.
Давайте оценим разность медиан времени ремонта оборудования для этих клиентов.
Но кажется, если нам нужно получить точечную оценку, то это очень просто.
Независимо оцениваем медианы времени ремонта для клиентов одной группы,
потом для клиентов второй группы и просто строим разность.
Давайте это сделаем.
Ну вот видим, что дельта медиан равняется 11.
Кажется, что это неплохо,
но что если нам хочется получить интервальную оценку для разности медиан?
Тут уже несколько сложнее.
Ну, во-первых, эти интервалы получились сильно разной длины, ну и, вообще,
у нас нет никаких теоретических оснований для того, чтобы просто взять и, скажем,
посчитать разность левых и правых границ этого интервала.
Кажется, что так не пройдёт, нужно действовать чуть более хитро.
Давайте поступим следующим образом.
Снова с помощью Bootstrap сгенерируем выборки для клиентов разных групп и
посчитаем на этих выборках медианы независимо.
Далее, по полученным данным рассчитаем следующую статистику.
Посчитаем разность полученных медиан.
Это делается довольно просто.
Сначала рассчитываем медианы независимо, далее,
с помощью функции zip объединяем их в один список.
Ну и с помощью функции map просто считаем попарные разности, это легко.
Итак, посчитали разности, а теперь снова пользуемся функцией stat intervals,
которую мы определили ранее,
и рассчитываем интервал для этой статистики на уровне доверия 0,05.
Итак, видим, что мы получили довольно неплохую оценку для этого интервала.
Мы видим, что разница во времени работы составляет от
2 до 16,06 разницы в медиане.
Итак, на этом мы заканчиваем знакомство с методологией Bootstrap.
Мы научились строить интервальные оценки с ее помощью.
А на следующем уроке мы перейдем к очень интересной теме — проверке статистических
гипотез.