Академический Документы
Профессиональный Документы
Культура Документы
Разговоры о Big Data идут уже давно, есть и книги на эту тему.
Но в общем и целом все они были о том, что Big Data — «круто»,
этим занимаются ведущие компании мира, а вот и кейсы от этих
компаний.
Теперь же у нас есть книга, которая показывает, как работать с Big
Data практически, причем без сложных программ, на обычном Excel.
Изучив ряд несложных приемов, руководители малого и среднего
бизнеса смогут находить в массивах своих данных неочевидные
зависимости, которые позволят получить серьезное конкурентное
преимущество.
Знания — это сила, а знания, полученные из больших данных, —
большая сила.
Сергей Турко,
главный редактор издательства
«Альпина Паблишер»
Data Smart
Перевод с английского
Москва
2016
УДК 330.47
ББК 65.051.03
Ф79
Переводчик А. Соколова
Редактор Л. Мамедова
Форман Дж.
Ф79 Много цифр: Анализ больших данных при помощи Excel / Джон Форман ; Пер.
с англ. А. Соколовой. — М. : Альпина Паблишер, 2016. — 461 с.
ISBN 978-5-9614-5032-3
Казалось бы, термин «большие данные» понятен и доступен только специалистам.
Но автор этой книги доказывает, что анализ данных можно организовать и в про-
стом, понятном, очень эффективном и знакомом многим Excel. Причем не важно,
сколько велик ваш массив данных. Техники, предложенные в этой книге, будут по-
лезны и владельцу небольшого интернет-магазина, и аналитику крупной торговой
компании. Вы перестанете бояться больших данных, научитесь видеть в них нуж-
ную вам информацию и сможете проанализировать предпочтения ваших клиентов
и предложить им новые продукты, оптимизировать денежные потоки и складские
запасы, другими словами, повысите эффективность работы вашей организации.
Книга будет интересна маркетологам, бизнес-аналитикам и руководителям раз-
ных уровней, которым важно владеть статистикой для прогнозирования и плани-
рования будущей деятельности компаний.
УДК 330.47
ББК 65.051.03
Введение ........................................................................................................................................ 11
4 Оптимизационное моделирование:
этот «свежевыжатый апельсиновый сок» не смешает себя сам ................ 129
Зачем ученым, работающим с данными, нужна оптимизация? .......................... 130
Начнем с простого компромисса ............................................................................. 131
Представим проблему в виде политопа ................................................................... 132
Содержание 7
Кто я?
Давайте прервемся ненадолго, и я расскажу вам о себе. Научный подход к из-
учению данных, который я проповедую, возник не вчера — к нему меня вел
долгий путь. Много лет назад я был консультантом по менеджменту. Я рабо-
тал над аналитическими проблемами таких организаций, как ФБР, министер-
ство обороны США, компания Coca-Cola, группы отелей Intercontinental и Royal
Carribbean. Из всего этого опыта я вынес одно: наука о данных должна стать
прерогативой не только ученых.
Я работал с менеджерами, которые покупали симуляции, когда им были нужны
модели оптимизации. Я работал с аналитиками, которые понимали только гра-
фики Ганта *, так что абсолютно все приходилось представлять в виде этих гра-
фиков. Как консультанту, мне было нетрудно расположить к себе покупателя,
имея в арсенале любые старые бумаги и миленькую презентацию в PowerPoint,
потому что они не могли отличить искусственный интеллект от бизнес-анализа,
а бизнес-анализ — от ВS.
Цель этой книги — расширение аудитории, способной понять и применить
техники научного анализа данных. Я не пытаюсь обратить вас, уважаемые чита-
тели, в специалистов по научной обработке данных против вашей воли. Я про-
сто хочу, чтобы вы научились применять науку о данных настолько, насколько
сможете, в той области, в которой вы уже хорошо разбираетесь.
Это заставляет задать вопрос: кто же вы?
Кто вы?
Не пугайтесь, я не использовал научный анализ данных, чтобы шпионить за вами.
Я понятия не имею, кто вы, но заранее благодарен вам за то, что раскошели-
лись на эту книгу.
Вот несколько архетипов (или личностей — для вас, маркетологи!), которые
пришли мне на ум, когда я писал эту книгу. Возможно, вы:
•
заместитель начальника по маркетингу и хотите использовать свои бизнес-
переменные стратегическим образом, для оценки продукта и сегмента
рынка, но не понимаете подходов, рекомендуемых разработчиками при-
ложений и переоцененными консультантами;
•
аналитик, предсказывающий спрос, который знает, что история заказов
фирмы содержит больше информации о клиентах, чем даже план на сле-
дующий квартал;
•
руководитель розничного интернет-магазина, желающий угадать по дан-
ным о предыдущих заказах, когда клиент скорее всего «созреет» для оче-
редной покупки;
•
бизнес-аналитик, который в состоянии просчитать растущие денежные
потоки и затраты на снабжение, но не знает, как перебросить мостик эко-
номии на издержках;
•
онлайн-маркетолог, который хочет чего-то большего для своей компании
от бесплатных текстовых сервисов, таких как электронные письма или со-
циальные сети. Пока же судьба разосланных сообщений незавидна — их
открывают и тут же выбрасывают в корзину.
Никаких сожалений —
только электронные таблицы
Эта книга не о программировании. Я даже готов гарантировать полное отсут-
ствие (ну, по крайней мере, до главы 10) в ней кода. Почему?
Да потому что я не хочу тратить первые сто страниц на возню с Git, объяв-
лением переменных среды и выступление Emacs против Vi.
Если вы пользуетесь исключительно Windows и Microsoft Office, работаете
в государственной структуре и вам запрещено скачивать и устанавливать при-
ложения из каких попало открытых источников и даже если MATLAB или ваш
графический калькулятор наводили на вас леденящий ужас во времена сту-
денчества, вам нечего бояться.
Нужно ли вам знать, как пишется код, чтобы перевести большую часть этих
техник в автоматизированную, производственную форму? Непременно! Вы
или кто-то из ваших коллег должен знать технологии хранения данных и уметь
управляться с кодом.
Нужно ли вам знать, как пишется код, чтобы понимать, различать и моде-
лировать эти техники? Совершенно ни к чему!
Именно поэтому я объясняю каждую методику с помощью электронных
таблиц.
Ну, ладно, если по-хорошему, то я должен признаться, что все вышесказан-
ное мною не совсем правда. Последняя глава этой книги — о переходе на язык
программирования R, ориентированный на анализ данных. Она предназначена
для тех из вас, кто захочет использовать эту книгу как трамплин к пониманию
новых глубин аналитики.
Условные обозначения
Чтобы помочь вам извлечь из текста максимальную пользу, я ввел в эту книгу
несколько условных обозначений.
ВСТАВКИ
Вставки типа той, в которой вы только что прочитали про Google Drive, раскрывают
«побочные» темы, упомянутые в тексте.
ВНИМАНИЕ!
ЗАМЕТКИ
Здесь вы найдете советы, подсказки, приемы и все в этом духе, что пришлось к слову
в текущем обсуждении.
Частенько я буду вставлять в текст небольшие кусочки кода Excel вроде этого:
=CONCATENATE(“THIS IS A FORMULA”, “IN EXCEL!”)/
=СЦЕПИТЬ(“ЭТО ФОРМУЛА”, “В EXCEL!”)
http://www.john-foreman.com.
Итак, начнем
В первой главе я намерен заполнить некоторые пробелы в ваших познаниях
об Excel, после чего вы сможете погрузиться непосредственно в практику.
К концу книги вы не только будете иметь представление о нижеперечислен-
ных техниках, но и приобретете опыт их применения:
Введение 19
•
оптимизация с использованием линейного и интегрального программи-
рования;
•
работа с временными рядами данных, определение трендов и изменений
сезонного характера, а также прогнозирование методом экспоненциаль-
ного сглаживания;
•
моделирование методом Монте-Карло в оптимизации и прогнозировании
сценариев для количественного выражения и адресации рисков;
•
искусственный интеллект с использованием общей линейной модели, функ-
ции логистических звеньев, ансамблевых методов и наивного байесов-
ского классификатора;
•
измерение расстояния между клиентами с помощью близости косинусов
угла, создание К-ближайших граф, расчет модулярности и кластеризация
клиентов;
•
определение выбросов в одном измерении по методу Тьюки или в несколь-
ких измерениях с помощью локальных факторов выброса;
•
применение пакетов R для использования результатов работы других про-
граммистов при выполнении этих задач.
Рабочая тетрадь Excel, используемая в этой главе «Concessions.xlsx», доступна для за-
грузки на сайте книги www.wiley.com/go/datasmart
Представьте себе, что вам жутко не везет по жизни. Даже став взрослым, вы
до сих пор живете с родителями и работаете в киоске на баскетбольных мат-
чах в своей старой школе. (Клянусь, это только наполовину автобиографично!).
У вас есть электронная таблица о вчерашних продажах, и выглядит она при-
мерно как рис. 1-1.
На рис. 1-1 показана каждая продажа: что именно продано, к какому типу еды
или напитков относится проданный товар, цена и процент прибыли с продажи.
1. Все, что вы жаждали знать об электронных таблицах, но боялись спросить 23
Форматирование ячеек
Excel предлагает статические и динамические опции для форматирования со-
держимого ячеек. Взгляните на столбец Е с фактической прибылью, который вы
только что создали. Выделите его, кликнув на серый заголовок колонки. Затем
кликните на выбранном столбце правой клавишей и выберите «Формат ячеек».
26 Много цифр
Специальная вставка
Конечно, гораздо удобнее работать, если формулы не путаются у вас под рукой,
как в колонке Е на рис. 1-4. А если это еще и формулы вроде RAND( )/СЛЧИС( ),
генерирующей случайные числа, которые меняют свое значение при каждом
автопересчете таблицы, то ваше раздражение вполне справедливо. Решение
проблемы — в копировании этих ячеек и вставке их обратно в таблицу в виде
постоянных величин.
Чтобы перевести формулы в цифры, просто выделите и скопируйте столбец Е,
заполненный формулами, и вставьте его обратно с помощью опции «Специаль-
ная вставка» (находится во вкладке «Главная» под опцией «Вставить» в Windows
28 Много цифр
Вставка диаграмм
Методичка, посвященная торговле с лотка, включает в себя графу «Калории»
с малюсенькой табличкой. В ней указано, сколько калорий содержится в каж-
дом напитке или закуске, которые продаются в киоске. Вы тоже легко можете
сделать такую диаграмму в Excel. Во вкладке «Вставка» («Диаграммы» в MacOS)
есть раздел, в котором находятся различные варианты отображения, такие как
столбчатая гистограмма, линейный график и круговая диаграмма.
ЗАМЕТКА
=MATCH("Hamburger", A2:A15,0) /
=ПОИСКПОЗ("Hamburger", A2:A15,0)
=INDEX(A1:B15,3,2) /
=ИНДЕКС(A1:B15,3,2)
=OFFSET(A1,3,0) /
=СМЕЩ(A1,3,0)
так же). Если у вас есть список значений и вы хотите выбрать, скажем, третье
наименьшее из них, данная функция делает это за вас. Назовите ячейку А21
Small/Наименьший, а в В21 напишите следующую формулу, содержащую гра-
ницы поиска и параметр 3:
=SMALL(B2:B15,3)/
=НАИМЕНЬШИЙ(B2:B15,3)
Использование VLOOKUP/ВПР
для объединения данных
Перейдем обратно к листу продаж на баскетбольных матчах. При этом мы в лю-
бое время можем обратиться предыдущему листу с калориями, просто указав
его название и поставив перед номером ячейки «!». Например, Calories!В2
является отсылкой к количеству калорий в пиве, несмотря на то, что вы в дан-
ный момент работаете с другим листом.
Предположим, вы захотите увидеть количество калорий на листе продаж
для каждого наименования товара. Вам нужно будет каким-то образом найти
содержание калорий в каждом товаре и поместить его в колонку, следующую
за прибылью. Что ж, оказывается, и для этого есть отдельная функция под на-
званием VLOOKUP/ВПР.
Назовем колонку F в нашем листе «Calories / Калории». Ячейка F2 будет со-
держать количество калорий из таблицы в товаре из первой строки — пиве. Ис-
пользуя эту формулу, можно указать в названии товара из ячейки А2 ссылку
на таблицу Calories!$A$1:$B$15 и номер столбца, из которого следует вы-
бирать значения. В нашем случае он второй по счету:
=VLOOKUP(A2,Calories!$A$1:$B$15,2,FALSE) /
=ВПР(A2,Calories!$A$1:$B$15,2,ЛОЖЬ)
Фильтрация и сортировка
Отразив в листе продаж калорийность ваших товаров, задайтесь целью видеть,
например, только товары из категории «Замороженные продукты» — иными сло-
вами, отфильтровать ваш лист. Для этого сначала выберите данные в рамках
А1:F200. Наведите курсор на А1 и нажмите Shift+Ctrl+ , а затем . Есть способ
еще проще — кликнуть наверху столбца и, удерживая клавишу мышки нажатой,
переместить курсор к столбцу F, чтобы выделить все 6 столбцов.
Затем, чтобы применить автофильтрацию к этим шести колонкам, нажмите
кнопку «Фильтр» из вкладки «Данные». Она похожа на серую воронку, как
на рис. 1-12.
Если автофильтрация включена, можно кликнуть на выпадающем меню,
которое появляется в ячейке В1, и выбрать для показа только определенные
категории (в данном случае отобразятся товары из категории «Замороженные
продукты»), как на рис. 1-13.
После фильтрации выделение столбцов данных позволяет нижней панели
показывать краткую информацию об этих ячейках. Например, отфильтровав
только замороженные продукты, можно выделить значения в столбце Е и ис-
пользовать нижнюю панель, чтобы быстро узнать сумму прибыли только по этой
категории товара, как на рис. 1-14.
34 Много цифр
Рис. 1-19. Лист прибыли по каждой позиции, созданный вставкой значений из сводной таблицы
40 Много цифр
=SUMPRODUCT(B2:B15,'Fee Shedule'!B2:O2) /
=СУММПРОИЗВ(В2:В15,'Комиссия'!В2:О2)
•
В Windows «Поиск решения» можно подключить, пройдя во вкладку «Файл»
(в Excel 2007 это верхняя левая кнопка Windows) Параметры Надстройки.
Нажав «Доступные надстройки» в выпадающем меню, отметьте «Поиск ре-
шения».
42 Много цифр
•
В MacOS «Поиск решения» добавляется из меню «Инструменты», в кото-
ром следует выбрать «Надстройки», а затем Solver.xlam.
Чтобы заставить «Поиск решения» искать решение, нужно задать ему пре-
делы ячеек, в которых следует вести поиск. В нашем случае мы хотим узнать,
1. Все, что вы жаждали знать об электронных таблицах, но боялись спросить 43
ЗАМЕТКА
Окно поиска решений в Excel 2011, показанное на рис. 1-23, выглядит примерно так же,
как и в Excel 2010 и 2013. В Excel 2007 интерфейс немного другой, но единственное су-
щественное отличие заключается в отсутствии окна выбора алгоритма. Зато можно
выбрать «Линейную модель» в параметрах поиска решений. Обо всех этих элементах
мы поговорим позже.
Точно так же можно добавить условие целочисленности для С2:С15, как по-
казано на рис. 1-25.
Нажмите ОК.
В Excel 2010, 2011 и 2013 убедитесь, что метод решения установлен на «По-
иск решения линейных задач симплекс-методом». Это наиболее подходящий
для нашей задачи метод, так как она линейна. Под линейностью я подразуме-
ваю, что для решения проблемы нужны только линейные комбинации значе-
ний из С2:С15 (суммы, произведения значений и констант количества кило-
калорий и т. д.).
Если бы в нашей модели встречались нелинейные комбинации (вроде квад-
ратного корня из решения, логарифма или экспоненты), то мы могли бы ис-
пользовать какой-нибудь другой алгоритм, предлагаемый Excel. Подробно этот
вариант рассматривается в главе 4.
В Excel 2007 обозначить задачу как линейную можно, нажав на «Линейную
модель» внизу окна «Параметры поиска решений». В итоге должно получиться
то, что изображено на рис. 1-26.
46 Много цифр
Подытожим
Вы научились быстро ориентироваться в Excel и выбирать области поиска, эф-
фективно использовать абсолютные ссылки, пользоваться специальной вставкой,
VLOOKUP/ВПР и другими функциями поиска ячейки, сортировкой и фильтрацией
48 Много цифр
имеющемся у вас массиве данных. Это знание поможет вам принимать опти-
мальные решения, причем на более детальном уровне, нежели раньше.
В этом разрезе кластеризация называется разведочной добычей данных, по-
тому что эти техники помогают «вытянуть» информацию о связях в огромных
наборах данных, которые не охватишь визуально. А обнаружение связей в соци-
альных группах полезно в любой отрасли — для рекомендаций фильмов на ос-
нове привычек целевой аудитории, для определения криминальных центров
города или обоснования финансовых вложений.
Одно из моих любимых применений кластеризации — это кластеризация
изображений: сваливание в кучу файлов изображений, которые «выглядят
одинаково» для компьютера. К примеру, в сервисах размещения изображе-
ний типа Flickr пользователи производят кучу контента и простая навигация
становится невозможной из-за большого количества фотографий. Но, ис-
пользуя кластерные техники, вы можете объединять похожие изображения,
позволяя пользователю ориентироваться между этими группами еще до под-
робной сортировки.
•
Styx: Come Sail Away
•
Everything But the Girl: Missing
•
Ace of Base: All that She Wants
•
Soft Cell: Tainted Love
•
Montell Jordan: This is How We Do It
•
Eiffel 65: Blue
52 Много цифр
ЗАМЕТКА
Документ Excel, который мы будем разбирать в этой главе, находится на сайте книги —
www.wiley.com/go/datasmart. В нем содержатся все исходные данные на случай,
если вам захочется поработать с ними. Или же вы можете просто следить за текстом,
подглядывая в остальные листы документа.
•
метаданные по каждому заказу сохранены в электронной таблице, включая
сорт, минимальное количество вина в заказе, скидку на розничную продажу,
информацию о том, пройден ли ценовой максимум, и о стране происхож-
дения. Эти данные размещены во вкладке под названием OfferInformation,
как показано на рис. 2-7;
58 Много цифр
•
зная, кто из клиентов что заказывает, вы можете вытряхнуть эту ин-
формацию из MailChimp и скормить электронной таблице с метадан-
ными предложений во вкладке «Transactions». Это переменные данные,
представленные, как показано на рис. 2-8, очень просто: покупатель
и его заказ.
Вы знаете, что в прошлом году было 32 предложения сделок и у вас есть спи-
сок из 324 заказов в отдельной вкладке, разбитый по покупателям. Но чтобы
измерить расстояние от каждого покупателя до кластерного центра, вы должны
поместить их в это 32-сделочное пространство. Иначе говоря, вам нужно по-
нять, что за сделки они не совершили, и создать матрицу сделок по покупате-
лям, в которой каждый клиент получает свой собственный столбец с 32 ячей-
ками сделок, заполненные единицами, если сделки были совершены, и нулями,
если нет.
Другими словами, вам нужно взять эту ориентированную по строкам таб-
лицу сделок и превратить ее в матрицу, в которой клиенты располагаются
по вертикали, а предложения — по горизонтали. Лучшим способом ее создать
являются сводные таблицы.
ЗАМЕТКА
СТАНДАРТИЗАЦИЯ ДАННЫХ
В этой главе каждое измерение ваших данных представлено одинаково, в виде бинар-
ной информации о заказах. Но во многих ситуациях, связанных с кластеризацией, мы
не можем так сделать. Вообразите сценарий, в котором люди кластеризованы по ро-
сту, весу и зарплате. Все эти три вида данных имеют разную размерность. Рост может
варьироваться от 1,5 до 2 метров, в то время как вес — от 50 до 150 кг.
В этом контексте измерение расстояния между покупателями (как между танцо-
рами в актовом зале) становится запутанным делом. Поэтому принято стандартизи-
ровать каждый столбец с данными, вычитая среднее и затем деля поочередно на меру
разброса под названием среднеквадратичное отклонение, которое мы вычислим в
главе 4. Таким образом, все столбцы приводятся к единой величине, количественно
варьируясь около 0.
Так как наши данные из главы 2 не требуют стандартизации, вы можете понаблю-
дать ее в действии в главе об определении выбросов — главе 9.
2. Кластерный анализ, часть I 61
небольшое. Начните этот пример с 4 — в идеальном мире вы, возможно, раз-
делили бы ваш список клиентов на 4 понятные группы по 25 человек в каждой
(что в реальности маловероятно).
Итак, если придется разделить покупателей на 4 группы, как наилучшим об-
разом их подобрать?
Вместо того чтобы портить симпатичный лист Matrix, скопируйте дан-
ные в новый лист и назовите его 4МС. Теперь вы можете вставить 4 столбца
после ценового максимума в столбцы от Н до К, которые будут кластер-
ными центрами. (Чтобы вставить столбец, кликните правой клавишей мышки
на столбце Н и выберите «Вставить». Столбец появится слева.) Назовите эти
кластеры от Cluster 1 до Cluster 4. Вы также можете применить на них услов-
ное форматирование, и когда бы вы ни установили их, вы сможете увидеть,
насколько они отличаются.
Лист 4МС появится, как показано на рис. 2-11.
В данном случае все кластерные центры — нули. Но технически они могут
быть какими угодно и, что вам особенно понравится — как на школьных тан-
цах, распределены таким образом, что минимизируют расстояние между каж-
дым покупателем и его кластерным центром.
Очевидно, что тогда эти центры будут иметь значения от 0 до 1 для каждой
сделки, так как все клиентские векторы бинарны.
Но что означает «измерить расстояние между кластерным центром и по-
купателем»?
10
8 (8,2)
4 (4,4)
1 2 3 4 5 6 7 8 9 10
10
8 (8,2)
7
42 + 22 = 4,47
6
4
4 (4,4)
2
3
1 2 3 4 5 6 7 8 9 10
Расстояния и принадлежность
к кластеру для всех!
Теперь вы знаете, как вычислить расстояние между вектором заказа и кла-
стерным центром.
Пришло время добавить Адамсу расчет расстояний до остальных кластер-
ных центров, перетянув ячейку L34 вниз на L37, а затем изменив вручную ссылку
на кластерный центр со столбца Н на столбец I, J и К в ячейках ниже. В резуль-
тате должны получиться следующие 4 формулы в L34:L37:
66 Много цифр
{=SQRT(SUM((L$2:L$33-$H$2:$H$33)^2))}
{=SQRT(SUM((L$2:L$33-$I$2:$I$33)^2))}
{=SQRT(SUM((L$2:L$33-$J$2:$J$33)^2))}
{=SQRT(SUM((L$2:L$33-$K$2:$K$33)^2))}
{=КОРЕНЬ(СУММА((L$2:L$33-$H$2:$H$33)^2))}
{=КОРЕНЬ(СУММА((L$2:L$33-$I$2:$I$33)^2))}
{=КОРЕНЬ(СУММА((L$2:L$33-$J$2:$J$33)^2))}
{=КОРЕНЬ(СУММА((L$2:L$33-$K$2:$K$33)^2))}
=MIN(L34:L37)
=МИН(L34:L37)
В данном случае расстояние одинаково для всех четырех кластеров, так что
формула выбирает первый (L34) и возвращает 1 (рис. 2-16).
Вы можете также перетащить эти две формулы на DG38: DG39. Для пущей
организованности добавьте названия строк 38 и 39 в ячейки 38 и 39 столбца G
«Minimum Cluster Distance» и «Assigned Cluster».
Если вы внимательно читали главу 1, то должны знать, что делать, когда слы-
шите слово «минимизировать»: начинается этап оптимизации, а оптимизация
производится с помощью «Поиска решения».
Чтобы использовать «Поиск решения», вам понадобится ячейка для резуль-
татов, поэтому в А36 просуммируем все расстояния между покупателями и их
кластерными центрами:
=SUM(L38:DG38)
=СУММА(L38:DG38)
ЗАМЕТКА
У вас есть все, что нужно для постановки задачи перед «Поиском решения»:
•
цель: минимизировать общие расстояния от покупателей к их кластер-
ным центрам (А36);
•
переменные: вектор каждой сделки относительно кластерного центра
(Н2:К33);
•
условия: кластерные центры должны иметь значения в пределах от 0 до 1.
Н2:К33 <=1, как и все векторы сделок. Убедитесь, что переменные отмечены
как положительные и выбран эволюционный алгоритм (рис. 2-17).
Но постановка задачи — еще не все. Придется немного попотеть, выбирая
нужные опции эволюционного алгоритма, нажав кнопку «Параметры» в окне
«Поиска решения» и перейдя в окно настройки. Советую установить максималь-
ное время секунд на 30 побольше, в зависимости от того, сколько вы готовы
ждать, пока «Поиск решений» справится со своей задачей. На рис. 2-18 я по-
ставил свое на 600 секунд (10 минут). Таким образом, я могу запустить «Поиск
решения» и пойти обедать. А если вам захочется прервать его пораньше, про-
сто нажмите Escape и выйдите из него с наилучшим решением, которое тот
успел найти.
Для тех, кому интересно: внутреннее устройство эволюционного алгоритма
«Поиска решения» описано в главе 4 и на http://www.solver.com.
Нажмите «Выполнить» и наблюдайте, как Excel делает свое дело, пока эво-
люционный алгоритм не сойдется.
70 Много цифр
Рис. 2-20. Создание листа таблицы для подсчета популярности сделок с помощью кластеров
72 Много цифр
На листе 4МС у вас были привязки по кластерам от 1 до 4 в строке 39. Все,
что вам нужно сделать, чтобы сосчитать сделки по кластерам, — это взглянуть
на названия столбцов от Н до К на листе 4МС — TopDealsByCluster, посмотреть,
кто из листа 4МС был привязан к этому кластеру в строке 39, а затем сложить
количество их сделок в каждой строке. Таким образом мы получим общее ко-
личество покупателей в данном кластере, совершивших сделки.
Начнем с ячейки Н2, в которой записано количество покупателей кластера 1,
принявших предложение № 1, а именно январский мальбек. Нужно сложить зна-
чения ячеек диапазона L2: DG2 на листе 4МС, но только покупателей из 1 клас-
тера, что является классическим примером использования формулы SUMIF /
СУММЕСЛИ. Выглядит она так:
=SUMIF('4MC'!$L$39:$DG$39,'4MC — TopDealsByCluster'!
H$1,'4MC'!$L2:$DG2)
=СУММЕСЛИ('4MC'!$L$39:$DG$39,'4MC — TopDealsByCluster'!
H$1,'4MC'!$L2:$DG2)
вино, и Франция — производитель товара для 3 из 4 из них. Тем не менее эти
предположения неоднозначны (рис. 2-24).
Что касается кластера 4, то этим ребятам по какой-то причине явно понрави-
лось августовское предложение на шампанское. Также 5 из 6 крупнейших сде-
лок — на французское вино, а 9 из 10 первых по величине — на большой объем
товара (рис. 2-25). Может, это тяготеющий к французским винам крупноопто-
вый кластер? Пересечение кластеров 3 и 4 тоже беспокоит.
И это подводит нас к вопросу: настолько ли хорошо подходит 4 для значе-
ния k в кластеризации по k-средним? Возможно, нет. Но как узнать?
Рис. 2-25. Сортировка кластера 4 — эти парни просто любят шампанское в августе?
Если я немного ближе к членам своего кластера, чем соседнего, то эти ре-
бята — хорошая компания для меня, не так ли? Но что, если ребята из соседнего
кластера практически так же близки ко мне, как и мои кластерные собратья?
Выходит тогда, что моя привязка к кластерам немного сомнительна?
Вот как формально записать это значение:
ЗАМЕТКА
Между прочим, есть много способов поместить эту нумерацию 0–99 в Excel. К примеру,
можно просто начать печатать 0, 1, 2, 3, а затем выделить их и потянуть за нижний угол
выделенной области до конца списка клиентов. Excel поймет это и продолжит число-
вой ряд. В результате должна получиться пустая матрица, как на рис. 2-27.
Но OFFSET(Matrix!$H$2:$H$33,0,1) / СМЕЩ(Matrix!$H$2:$H$33,0,1) —
это столбец сделок Аллена.
OFFSET(Matrix!$H$2:$H$33,0,2) / СМЕЩ(Matrix!$H$2:$H$33,0,2) —
столбец Андерсона, и т. д.
И здесь нам как раз и пригодится нумерация строк и столбцов 0–99. Вот,
например:
{=SQRT(SUM((OFFSET(Matrix!$H$2:$H$33,0,Distances!C$1)-OFFSET
(Matrix!$H$2:$H$33,0,Distances!$A3))^2))}
2. Кластерный анализ, часть I 79
{=КОРЕНЬ(СУММА((СМЕЩ(Matrix!$H$2:$H$33,0,Distances!C$1)-СМЕЩ
(Matrix!$H$2:$H$33,0,Distances!$A3))^2))}
=SMALL(C2:F2,2)
=НАИМЕНЬШИЙ(C2:F2,2)
=(J2-I2)/MAX(J2,I2)
=(J2-I2)/МАКС(J2,I2)
Создаем копию листа 4МС и называем ее 5МС. Все, что нужно — это доба-
вить пятый кластер на лист и ввести его в свои расчеты.
Кликните для начала правой клавишей мыши на столбце L и вставим но-
вый столбец, который назовем Cluster 5. Вам также нужно вставить расстоя-
ние в строку кластера 5, кликнув на строке 38 правой клавишей и выбрав
«Вставить». Скопируйте расстояние в строку кластера 4 в 38 строке и поме-
няйте столбец с K на L, чтобы создать строку с расстоянием до кластера 5.
Что касается строк Minimum Cluster Distance и Assigned Cluster, то ссылки
на строку 37 нужно исправить на 38, чтобы включить в расчет новое кла-
стерное расстояние.
В результате должна получиться таблица как на рис. 2-32.
Рис. 2-34. Замена привязок к 4 кластерным центрам привязками к 5 кластерным центрам
ЗАМЕТКА
Сортируя кластер 1, мы снова ясно видим наш кластер пино нуар. (рис. 2-35).
Что касается кластера 3, то он снова взрывает мой мозг. Единственное, что
можно в нем выделить — это, по какой-то причине, южноафриканское эспу-
манте (рис. 2-37).
Вместо этого предлагаю поразмыслить над тем, что мы делаем не так и от-
куда появляются эти непонятные кластеры, полные шума.
K-медианная кластеризация
и асимметрическое измерение расстояний
Как правило, стандартной кластеризации по k-средним евклидовыми расстоя-
ниями бывает вполне достаточно, но тут мы столкнулись с небольшими проб-
лемами, которые часто встречаются при кластеризации данных, имеющих
большой разброс (розничная ли это торговля, классификация ли текстов или
биоинформатика).
•
счетчик в формуле считает только совпадения сделок, то есть он асимме-
тричен и поэтому отлично подходит к данному случаю;
•
квадратные корни из количества сделок по каждому вектору в знамена-
теле обращают наше внимание на тот факт, что вектор, в котором совер-
шены все сделки — назовем его неразборчивым — гораздо дальше отстоит
от другого вектора, чем тот, в котором совершены те же сделки и не со-
вершены несколько других. Вам нужно совпадение векторов, «вкусы» ко-
торых совпадают, а не один вектор, содержащий «вкусы» другого.
92 Много цифр
•
для бинарных данных эта близость находится в промежутке между 0 и 1,
причем у двух векторов не получается 1, пока все их заказы не совпадут.
Это означает, что 1 — близость по косинусу может использоваться как мера
расстояния, называемая расстоянием по косинусу, которое также варьи-
руется от 0 до 1.
(1,1)
45° (1,0)
1 совпадающий заказ
cos(45°) = = 0,707
2 заказа 1 заказ
ЗАМЕТКА
Подытожим
В этой главе было описано много разных отличных приемов. Вспомним все,
что вы увидели и узнали:
•
евклидово расстояние;
•
кластеризацию методом k-средних с использованием «Поиска решения»
для оптимизации центров;
•
как понимать кластеры, раз уж они у вас есть;
•
как рассчитать силуэт, данный по k-средним;
•
k-медианную кластеризацию;
•
манхэттенское расстояние / расстояние городского квартала;
•
близость и расстояние по косинусу.
Рис. 3-2. Три твита — и только один из них имеет отношение к нашему проекту
Обычно я делаю это раз в неделю. А вот вероятность того, я буду слушать
сегодня какую-нибудь попсовенькую электронную музычку:
р(Джон ест тако белл, Джон слушает электронную музычку) = 0,2 × 0,8 = 0,16
р(Джон ест тако белл, Джон слушает электронную музычку) = р(Джон ест
тако белл) × р(Джон слушает электронную музычку | Джон ест тако белл)
р(Джон ест тако белл, Джон слушает электронную музычку) = р(Джон ест
тако белл) × (Джон слушает электронную музычку) = 0,16
попсовый, вероятность того, что я слушаю попсовое техно при том, что я слу-
шаю Depeche Mode, равна 1.
А это значит следующее: если я хочу вычислить совместную вероятность
этих событий, я не просто их перемножаю. Следуя цепному правилу,
Правило Байеса
Так как я определил Depeche Mode как попсовое техно, вероятность того, что
я слушаю попсовое техно при том, что я слушаю Depeche Mode, равна 1. Но нет ли
других способов? У нас еще нет вероятности для этого утверждения:
техно сегодня, шансы, что это будет Depeche Mode подскакивают до 37,5%!
Отлично.
Это вероятность того, что твит либо о приложении, либо о чем-то другом,
при том, что мы видим слова «слово1», «слово2», «слово3» и т. д.
Стандартное применение наивной байесовской модели классификатора —
это создание нового документа на основе того, к какому классу вероятнее
всего относятся твиты, если рассматриваются слова, из которых они состоят.
Другими словами, если
Точно так же
Такая конфигурация — просто вероятность того, что эти слова вообще встре-
тятся в документе. Так как эта величина не меняется от класса к классу, вы
можете сократить на нее неравенство МАР, еще и при том, что вас интересует
только наибольшее значение из
Но как подсчитать вероятность наличия набора слов, зная, что эта запись —
про приложение или, наоборот, о чем-то другом?
И тут все действительно начинает становиться идиотским!
Предположим, вероятности наличия этих слов в документах не зависят одна
от другой. Тогда получаем
Ну это же идиотизм, не так ли? Это наивность, потому что если бы я вам
сказал, что у меня есть письмо-спам со словом «дисфункция» и предложил бы
отгадать предшествующее ему слово, вы бы почти наверняка сказали «эрек-
тильная». Это зависимость, которая откровенно игнорируется.
Самое смешное, что, несмотря на широкое практическое применение, этот
идиотизм никого не волнует. Это из-за того, что правилу МАР все равно, что
110 Много цифр
р(«блестеть» | приложение)
3. Наивный байесовский классификатор и неописуемая легкость бытия идиотом 111
•
редкие слова;
•
исчезновение порядка (антипереполнение).
р(«Тубал-Каин» | приложение) = 0
Но тогда вы получите:
0,2 × 0,8
Да начнется Excel-вечеринка!
ЗАМЕТКА
В электронной таблице для этой главы — Mandrill.xslx, есть два листа с ис-
ходными данными. Первый, AboutMandrillApp, содержит 150 твитов, по одному
на строку, относящихся к приложению Mandrill. Второй, AboutOther, содержит
150 твитов об остальных мандрилах.
Перед началом хочу сказать — добро пожаловать в мир обработки есте-
ственного языка (Native Language Processing, NLP)! NLP пережевывает текст,
написанный человеком, и выплевывает знания. «Человеческое» содержимое
(например, записи в Twitter) готово для потребления компьютером. Перед этим
необходимо провести несколько мелких операций.
Это переведет первую запись в строчной вид. В С2 вырежем все фразы.
Не стоит кромсать ссылки, так что вырежем все части, после которых есть про-
бел с помощью команды SUBSTITUTE/ПОДСТАВИТЬ:
=SUBSTITUTE(В2,". "," ")
=ПОДСТАВИТЬ(В2,". "," ")
Эта формула заменяет знаки ". " единичным пробелом " ".
Вы также можете указать ячейку D2 в С2 и заменить все двоеточия с про-
белами после них единичными пробелами:
114 Много цифр
=SUBSTITUTE(D2,"?"," ")
=SUBSTITUTE(E2,"!"," ")
=SUBSTITUTE(F2,";"," ")
=SUBSTITUTE(G2,","," ")
=ПОДСТАВИТЬ(D2,"?"," ")
=ПОДСТАВИТЬ(E2,"?"," ")
=ПОДСТАВИТЬ(F2,"?"," ")
=ПОДСТАВИТЬ(G2,"?"," ")
Разное о пробелах
Теперь создайте два новых листа и назовите их AppTokens и OtherTokens.
Вам необходимо сосчитать, сколько раз каждое слово используется в запи-
сях данной категории. Это значит, что вам нужно собрать все слова из твитов
в одном столбце. Резонно предположить, что каждый твит содержит не более
3. Наивный байесовский классификатор и неописуемая легкость бытия идиотом 115
30 слов (но вы смело можете увеличить их количество до 40 или даже 50), так
что если вы собираетесь присваивать каждому жетону отдельную строку, вам
понадобится 150 × 30 = 4500 строк.
Для начала назовите ячейку А1 на обоих листах «Tweet».
Выделите А2:А4501 и с помощью специальной вставки вставьте значения
твитов из столбца Н двух начальных листов. Таким образом вы получите спи-
сок всех обрабатываемых твитов, как показано на рис. 3-4. Обратите внима-
ние: так как вы вставляете 150 твитов в 4500 строк, Excel повторяет все за вас.
Восхитительно!
Это означает, что если вы выделите первое слово из первого твита в строке 2,
этот самый твит повторится для выделения второго слова в строке 152, тре-
тьего — в 302 и т. д.
Так или иначе, помните, что эта формула выдаст ошибку, как только закон-
чатся символы в записи — если в ней, к примеру, меньше 30 слов, которые вы
планировали. Чтобы справиться с этим, вам нужно вставить формулу в утверж-
дение IFERROR/ЕСЛИОШИБКА и просто прибавить 1 к длине твита, чтобы найти
положение после последнего слова:
=IFERROR(FIND(" ",A152,B2+1),LEN(A152)+1)
=ЕСЛИОШИБКА(НАЙТИ(" ",A152,B2+1),LEN(A152)+1)
Теперь еще раз вернемся к коротким твитам в конце строки, в которых у нас
рано заканчивались слова. Если есть ошибка, превратите этот жетон в комби-
нацию «.», которую потом легко будет проигнорировать:
=IFERROR(MID(A2,B2+1,B152-B2–1),".")
=ЕСЛИОШИБКА(ПСТР(A2,B2+1,B152-B2–1),".")
Можете также распространить это на весь лист двойным кликом. Это зна-
чение позволяет вам находить и удалять любой жетон в три или менее симво-
лов, которые практически всегда бессмысленны.
ЗАМЕТКА
Обычно в таком типе обработки натурального языка кроме удаления всех коротких слов
существует еще список стоп-слов для отдельного языка (в данном случае, английского),
которые также удаляются. Стоп-слова — это слова с очень низким лексическим содер-
жанием, которое подобно содержанию питательных веществ для модели «набор слов».
К примеру, «потому что» и «вместо» могут быть стоп-словами из-за того, что они
обычные и не особенно помогают отличить один документ от другого. Самые распро-
страненные стоп-слова в английском почти всегда короткие: «a», «and», «the» и т. д., по-
этому в данной главе будет рассмотрен наиболее простой, но и наиболее драконовский
способ удаления коротких слов из твитов.
Если вы все делали вместе со мной, у вас должен получиться лист AppTokens,
показанный на рис. 3-8 (лист Other Tokens идентичен ему, за исключением тви-
тов, вставленных в столбец А).
Теперь у вас есть только длинные жетоны из каждого твита, и все они под-
считаны.
Настало время «пристегнуть» вероятность к каждому жетону. Перед запу-
ском расчета примените оговоренную ранее функцию дополнительного сгла-
живания, добавив 1 к каждому жетону.
Назовите столбец С Add One To Everything и установите С5 = В5 + 1 (С4 + В4
в Windows, где Еxcel строит сводные таблицы на строку выше, просто чтобы
рассердить читателей). Вы можете распространить формулу двойным щелчком.
Так как вы добавили 1 ко всему, вам понадобится новый подсчет жетонов.
Внизу таблицы (строка 828 на листе AppTokensProbability) введите в ячейку
120 Много цифр
сумму всех ячеек, находящихся над ней. Еще раз отмечу, что если вы работаете
с Windows, то все сведется на одну строку выше (С4:С826 для суммирования):
=SUM(С5:С827)
=СУММА(С5:С827)
=VLOOKUP(D2,AppTokensProbability!$A$5:$E$827,5,FALSE)
=ВПР(D2,AppTokensProbability!$A$5:$E$827,5,FALSE)
от функции. Как обсуждалось ранее, эти редкие слова должны иметь вероят-
ность, равную 1, деленную на общее число жетонов в ячейке В828 на листе
AppTokensProbability.
Имея дело с редкими словами, нужно вложить VLOOKUP/ВПР в проверку
ISNA/ЕНД и работать с логарифмированными вероятностями редких слов, если
есть такая необходимость:
IF(ISNA(VLOOKUP(D2,AppTokensProbability!$A$5:$E$827,5,
FALSE)),LN(1/AppTokensProbability!$C$828),
VLOOKUP(D2,AppTokensProbability!$A$5:$E$827,5,FALSE))
ЕСЛИ(ЕНД(ВПР(D2,AppTokensProbability!$A$5:$E$827,5,ЛОЖЬ)),
LN(1/AppTokensProbability!$C$828),ВПР(D2,
AppTokensProbability!$A$5:$E$827,5,ЛОЖЬ))
=SUM(D25:AI25)
=СУММА(D25:AI25)
Подытожим
Эта глава — сверхкороткая, по сравнению с остальными в этой книге. Почему?
Потому что наивный Байес очень простой! И за это все его любят. Кажется, что
он делает что-то сложное волшебным образом, хотя на самом деле он просто
полагается на хорошую память компьютера, помнящего, насколько часто каж-
дый жетон появляется в каждом классе.
Есть такая пословица: «Опыт — отец мудрости, а память — ее мать». К «наив-
ному Байесу» она подходит на 100%. Полнота «псевдомудрости» программы со-
стоит из загруженных и хранящихся данных и кусочка математической изо-
ленты.
«Наивный Байес» даже немного приспособлен к простому применению в коде.
Например, вот как он выглядит в С#:
http://msdn.microsoft.com/en-us/magazine/jj891056.aspx
вот на Ruby:
http://blog.saush.com/2009/02/11/naive-bayesian-classifiers-and-
ruby/
Одно из замечательных свойств этой модели — то, что она отлично рабо-
тает, даже если кругом куча элементов (feature) — вводных данных модели ИИ,
с помощью которых вы строите свои предположения (в случае с нашими дан-
ными, каждое слово представляет собой элемент). Но, несмотря на это, не за-
бывайте, что у простой модели набора слов (bag of words) тоже есть свои не-
достатки. Если честно, наивная часть модели может стать причиной появления
проблем. Приведу пример.
Предположим, я создал «наивный байесовский» классификатор, который
пытается классифицировать твиты по отношению к написанному на положи-
тельные и отрицательные. И когда кто-то пишет что-то вроде:
Так как модель набора слов не учитывает структуру текста и принимает все
жетоны за беспорядочную кучу, возникает проблема. Многие наивные байесов-
ские модели на самом деле рассматривают в качестве жетонов фразы, а не от-
дельные слова. Это помогает немного контекстуализировать слова (и делает
предположения классификатора еще более нелепыми, но кому какая разница!).
Для выполнения такой работы нужно больше тренировочных данных, потому
что количество возможных фраз из N слов гораздо больше, чем количество
возможных слов.
Для записей, подобных этому отзыву на фильм, может понадобиться мо-
дель, которая учитывает положение слов. За какой фразой последнее слово?
Получение подобной информации немедленно устраняет все мысли о простой
концепции «набора слов».
Конечно, это все придирки. «Наивный Байес» — это простой и многофунк-
циональный инструмент ИИ. Его легко прототипировать и испытывать. Попро-
буйте помоделировать с помощью этого классификатора разные идеи, и если
они будут достаточно хорошо работать — вы молодец. Если результаты много-
обещающи, но убоги — можно обратить свой взор на что-нибудь «помясистее»,
вроде комплексной модели (ensemble model), рассмотренной в главе 7.
Оптимизационное
4 моделирование:
этот «свежевыжатый
апельсиновый сок»
не смешает себя сам
Н едавно Business Week опубликовала статью, посвященную новым разра-
боткам Coca-Cola. С помощью большой аналитической модели компания
пытается определить, как смешать свежий апельсиновый сок разных сортов
и создать идеальный «продукт-не-из-концентрата».
Я обсуждал статью с коллегами, и один из них посетовал, что компании,
мол, не пришлось бы напрягаться, имей она в своем распоряжении модель ис-
кусственного интеллекта.
На мой взгляд, он был неправ. Да, Coca-Cola пользуется не моделью искусствен-
ного интеллекта, а оптимизационной моделью. Давайте разберемся, в чем же
разница.
Модель искусственного интеллекта предсказывает результаты, основываясь
на вводных данных. Но задача Coca-Cola в данном случае другая. Ей не нужно
знать, что получится, если смешать сок А и сок В. Ей принципиально понять,
какие соки из А, В, С, D и т. д. следует закупать и в каких пропорциях смеши-
вать. На основе анализа данных и исходных условий (в том числе имеющегося
инвентаря, спроса, характеристик и т. д.) Coca-Cola должна решить, как именно
смешать разные по своим свойствам соки (к примеру, один сок слишком слад-
кий, а другой, наоборот, недостаточно), чтобы добиться «правильного» вкуса
по минимальной стоимости и с максимальной прибылью.
В этих действиях нет ничего, что можно было бы предсказать. Модель созда-
ется для изменения будущего. Оптимизационное моделирование — это аналити-
ческое арминианство в сравнении с кальвинизмом искусственного интеллекта*.
Компании любого профиля используют оптимизационные модели каждый
день, чтобы найти ответы на вопросы типа:
•
как составить расписание для сотрудников колл-центра, чтобы оно соот-
ветствовало их отпускным запросам, сбалансировало переработки и ис-
ключало убийственные круглосуточные дежурства, складывающиеся из не-
скольких смен подряд для каждого сотрудника?
•
Какие возможности бурения нефтяных скважин использовать для полу-
чения максимального дохода, держа при этом под контролем все риски?
•
Когда следует делать новые заказы в Китае и как их доставлять, чтобы ми-
нимизировать стоимость и соответствовать ожидаемому спросу?
Зачем ученым,
работающим с данными, нужна оптимизация?
Если вы посмотрите фильмы о Джеймсе Бонде или «Миссия невыполнима»,
то заметите, что довольно много чего происходит еще до вступительных ти-
тров. И главное, что заставляет зрителей прирасти к экрану, — это взрыв.
4. Оптимизационное моделирование 131
Ваша работа днем: дойка коров и продажа сладкого сливочного масла мест-
ному населению.
Ваша работа ночью: сборка и продажа автоматов французскому Сопротив-
лению.
Ваша жизнь сложна и полна опасности. Вы начисто отрезаны от штаба и вам
остается лишь работать на ферме, стараясь не попасться на «крючок» наци-
стам. Денег в вашем бюджете хватает только, чтобы свести концы с концами,
собирая автоматы и сбивая масло. Вы должны продержаться до конца войны.
Нельзя потерять ферму, ведь это — прикрытие!
После долгих раздумий о своем нелегком положении, вы смогли охаракте-
ризовать его тремя составляющими.
•
Цель. Вы получаете $195 (ой, простите, франков, хотя, честно говоря, мой
Excel настроен на доллары, и я не собираюсь менять настройки ради этого
примера) за каждый автомат, который продаете своему доверенному лицу —
Пьеру. Вы получаете $150 за каждую бочку проданного на рынке масла. Вам
нужно получать как можно больший доход, чтобы окупать ферму.
•
Задача. Вам необходимо выяснить, сколько автоматов и сколько масла вам
нужно продать за месяц, чтобы получить максимальную прибыль.
•
Условия и ограничения. Производство одной бочки масла обходится вам
в $100, а сборка одного автомата — в $150. Ваш месячный бюджет на про-
изводство новой продукции — $1800. Вам приходится хранить эту продук-
цию в своем 21-кубометровом подвале. Автомат занимает половину кубо-
метра, бочка масла занимает полтора кубометра. Ни автоматы, ни масло
невозможно хранить в другом месте: первые заметят нацисты, а второе
испортится.
50
40
Автоматы
30
20
Ог
ра
ни
че
10 ни
яб
юд
же
та
10 20 30 40 50
Масло
50
40
Огр
Автоматы
30
ани
чени
я по
20
двал
Ог
ра
ни
а
10 че
ни
яб
юд
же
та
10 20 30 40 50
Масло
Так как функция вашей прибыли — это $150 × масло + $195 × автомат, каж-
дая линия ее уровня может быть определена как прямая $150 × масло + $195 ×
× автомат = С, где С — фиксированная величина прибыли.
Рассмотрим случай, где С = $1950. Для линии уровня $150 × масло + $195 ×
× автомат = $1950 обе точки — (0,10) и (13,0) — принадлежат ей, как и любая
комбинация из масла и автоматов, при которой $150 × масло + $195 × автомат
равняется $1950. Эта линия уровня изображена на рис. 4-3.
Используя идею линии уровня, можно начать думать над проблемой макси-
мизации прибыли, сдвигая линию уровня по направлению нарастания прибыли
(это направление будет перпендикулярно самой линии) до последнего возмож-
ного значения, находящегося в области допустимых значений.
На рис. 4-3 линия уровня нарисована пунктиром, а стрелка, отходящая от нее,
представляет собой целевую функцию.
50
40
Автоматы
30
20
10 Ли
ни
яу
ро
вн
я
10 20 30 40 50
Масло
50
40
Автоматы
30
20
10
10 20 30 40 50
Масло
50
40
Автоматы
30
20
10
10 20 30 40 50
Масло
Работа в Excel
Перед тем, как перейти от этой небольшой задачи к вещам более серьезным,
я хочу построить и решить ее в Excel. Первое, что вам нужно сделать на чистом
листе — это создать пространство для целевых переменных и переменных ре-
шения. Назовите ячейку В2 местом, куда будет записываться общая прибыль,
а ячейки В4:С4 — областью, куда будут занесены решения по продукции.
Под целевой секцией и секцией решения добавьте информацию о размерах
и стоимости автоматов и масла, ограничения площади для хранения и бюджета,
а также вклад каждого вида товара в прибыль.
Готовая для заполнения таблица должна выглядеть как на рис. 4-6.
К этим данным следует добавить немного расчетов, а именно расчет ограни-
чений и расчет прибыли. В столбце Е, следом за ячейками с ограничениями Limit,
умножьте количество произведенных автоматов и масла на их относительный
объем и стоимость, а затем сложите все полученное в столбце Used. Например,
в ячейку Е 7 можно записать используемую площадь подвала с помощью формулы:
138 Много цифр
=SUMPRODUCT(B4:C4,B7:C7)
=СУММПРОИЗВ(B4:C4,B7:C7)
Замечу, что эта формула является линейной, потому что только одна об-
ласть, В4:С4, — область решения. Другая область просто содержит коэффици-
енты хранения. Вы можете произвести аналогичные вычисления, чтобы узнать
общую сумму, потраченную на масло и автоматы.
Для вычисления целевой функции вам нужно взять SUMPRODUCT/СУММПРО-
ИЗВ от заказанного количества в строке 4 с прибылью в строке 9. Ввод допу-
стимых значений, таких как 1 автомат и 1 бочка масла, дает нам лист с реше-
нием, как на рис. 4-7.
Что касается ограничений, то их вам нужно добавить два. Начните с ограни-
ченного объема подвала. Нажмите кнопку «Добавить» рядом с полем ограниче-
ний. При заполнении небольшого поля следует указать, что значение в ячейке Е7
должно быть меньше или равно (<=) значению в ячейке D7 (рис. 4-10), а объем
используемой площади — меньше ограничения.
ЗАМЕТКА
Обратите внимание, что «Поиск решения» добавит абсолютные ссылки ко всем пере-
менным в ваших формулах. И это ничего не меняет. Если честно, я не знаю, зачем он это
делает, потому что вы не можете перетаскивать формулы в контексте модели «Поиска
решения». Для более подробного описания абсолютных ссылок обратитесь к главе 1.
ЗАМЕТКА
Перед тем, как нажать «ОК», посмотрите, какие еще типы ограничений предлагает вам
«Поиск решения». Кроме стандартных ≤, ≥ и = есть довольно занятные, например int,
bin и dif. Эти странные условия можно поместить в ячейки, чтобы значения стали
целыми, бинарными (0 или 1) или «все разные». Запомните условие «int». Немного
погодя мы к нему вернемся.
Теперь выберем способ решения — это должен быть «поиск решения линей-
ных задач симплекс-методом». Все готово (рис. 4-11)!
$500
Бонус Пьера
$0
5 10 15 20
Автоматы
•
генерирует пул исходных решений (что-то вроде генетического пула) раз-
ной степени вероятности;
•
каждое решение имеет некий уровень пригодности к выживанию;
•
решения размножаются перекрестным переносом, то есть их компоненты
выбираются из двух или трех существующих решений и затем комбини-
руются;
•
существующие решения мутируют в новые;
•
имеет место локальный поиск, в процессе которого генерируются новые
решения вблизи лучшего на данный момент решения в популяции;
•
происходит отбор: случайно выбранные неуспешные кандидаты в реше-
ния выбрасываются из генетического пула.
Логические проверки:
•
IF/ЕСЛИ
•
COUNTIF/СЧЁТЕСЛИ
•
SUMIF/СУММЕСЛИ
Статистические функции:
•
MIN/МИН
•
MAX/МАКС
•
MEDIAN/МЕДИАНА
•
LARGE/НАИБОЛЬШИЙ
•
NORMDIST/НОРМРАСП, BINOMDIST/БИНОМРАСП, и т. д.
Функции поиска:
•
VLOOKUP/ВПР
•
HLOOKUP/ГПР
•
OFFSET/СМЕЩ
•
MATCH/ПОИСКПОЗ
•
INDEX/ИНДЕКС
Я вижу, вы уже готовы воспарить от восторга, так что позвольте мне не-
много «приземлить» вас. С эволюционным алгоритмом все же возникают не-
которые проблемы.
•
Нет никакой гарантии, что он найдет оптимальное решение. Все, что в его
силах — это контроль лучшего решения в популяции, пока не закончится
время, либо популяция не изменится в достаточной степени для продол-
жения, либо вы принудительно не остановите «Поиск решения» нажатием
кнопки Escape. Вы можете модифицировать эти критерии остановки эво-
люционного алгоритма в разделе параметров «Поиска решения».
•
Эволюционный поиск решения работает довольно медленно. А если об-
ласти допустимых значений сложные, он часто ругается, не найдя даже
места, с которого начать.
•
Если вы хотите заставить эволюционный алгоритм хорошо работать в Excel,
вам придется определить жесткие границы для каждой переменной реше-
ния. Даже если ваше решение более или менее неограниченное, вам все же
придется ограничить его каким-то большим числом.
ДРУГИЕ ИНСТРУМЕНТЫ
Большие модели не очень-то хорошо идут в Excel. Версия «Поиска решения», встроенная
в него, позволяет иметь только 100–200 переменных решений и ограничений, в зависимо-
сти от версии. Это ограничивает размер задач, с которыми вы сталкиваетесь в этой книге.
Если вы хотите и дальше пользоваться Excel, купите расширенную версию «По-
иска решения» у Frontline Systems. Еще лучше, особенно если у вас Windows, ис-
пользовать OpenSolver, как мы будем делать в конце этой главы. OpenSolver, описан-
ный в главе 1, обращается к открытому ресурсу под названием COIN Branch and Cut
(http://www.coin-or.org), который идеален для проблем оптимизации среднего
размера. Я вполне эффективно использовал OpenSolver для сотен и тысяч переменных.
Есть и программы для линейного программирования пожирнее, например Gurobi
и CPLEX. Разработчикам и остальным любителям «облачных сервисов» я особо реко-
мендую Gurobi, ибо CPLEX, принадлежащий IBM, — лучшее корпоративное решение.
Интерфейс у таких мощных промышленных программ встречается разный. К при-
меру, CPLEX идет в пакете со средой OPL, где можно писать модели на специальном
языке, имеющем прекрасную привязку к электронным таблицам. В языках программи-
рования есть множество подобных привязок для связи алгоритмов с моделями внутри
промышленных систем.
Мой любимый инструмент для встраивания в мощные системы поиска решений,
такие как СPLEX и Gurobi, называется AIMMS (www.aimms.com). Программа позво-
ляет построить свою оптимизационную модель, а затем «шлепнуть» на нее пользова-
тельский интерфейс без необходимости писать его код. Также эта программа может
общаться с электронными таблицами и базами данных.
До конца этой книги вы вполне дотянете и с Excel и его «Поиском решения». Но вам
следует знать о существовании сверхсовременных сред моделирования для решения
больших задач на случай, если ваши нужды перерастут Excel.
ЗАМЕТКА
Так вот, сегодня я намерен разрушить еще один миф: ваш свежевыжатый сок
премиум-класса, не восстановленный из концентрата, не был выжат вручную.
На самом деле, мякоть в нем, скорее всего, из одних апельсинов, сок — из дру-
гих, более того, он взят из разных бочек и смешан согласно математическим
моделям, созданным для того, чтобы удостовериться, что каждый выпитый
вами стакан имеет в итоге один и тот же вкус.
Одинаковый вкус апельсинового сока круглый год — далеко не пустяк,
с которым справится каждый. Во-первых, апельсины не зреют во Флориде
круглогодично. Во-вторых, разные сорта созревают в разное время. Сорвешь
слишком рано — вкус слишком «зеленый». Закажешь апельсины из другой
страны, где сейчас сезон — сок может быть другого цвета. Или слаще. По-
требители требуют постоянства. Может быть, для какого-нибудь Sunny D это
просто, но как достичь идеала вам с вашей кучей бочек холодного свеже-
выжатого сока?
Начнем с характеристик
Допустим, вы — аналитик, работающий в ДжусЛэнде. Ваш босс, мистер
Джус Р. Лэндингсли III (ваша компания страдает непотизмом), попросил вас
распланировать закупки сока у поставщиков на январь, февраль и март на-
ступающего года. Вместе с этим поручением мистер Лэндингсли протягивает
вам список характеристик от поставщиков, содержащий страну происхожде-
ния и сорт, доступное для заказа количество на следующие три месяца и цену,
а также стоимость пересылки за 1000 галлонов.
В списке приведены характеристики цвета сока по шкале от 1 до 10 и три
вкусовых компонента:
•
отношение Брикс/кислотность: Брикс — это мера сладости сока, так что
Брикс/кислотность — это отношение сладости к терпкости (кислотности),
что, в конце концов, и есть настоящий вкус апельсинового сока;
•
кислотность (%): Кислотность в процентах от сока приведена отдельно,
потому что это определенное количество: неважно, насколько сладок сок,
если он при этом слишком кислый;
•
вяжущий вкус (шкала 1–10): мера «неспелости» сока. Это тот горький, не-
зрелый, садовый привкус, который может закрасться в сок. Этот параметр
оценивается группой специалистов на каждом производстве по выпуску
сока по шкале 1–10.
Выбор сока для заказа на следующие три месяца зависит от ответов на сле-
дующие вопросы:
•
если вы минимизируете стоимость, сможете ли вы купить все, что захотите?
•
Сколько сока вам нужно?
•
Каковы ограничения по цвету и вкусу для каждой партии?
Возвращаемся к консистенции
С помощью вкусовых тестов и опроса покупателей ДжусЛэнд определил, как
должен выглядеть сок и каким он должен быть на вкус. Небольшой выход за пре-
делы этих характеристик — и покупатели почти наверняка сочтут ваш сок не-
настоящим, дешевым или, хуже того, восстановленным из концентрата. Фу!
Мистер Лэндингсли III предъявляет вам следующие требования.
•
Он хочет иметь план заказа по самым низким ценам на январь, февраль
и март, соответствующий ожидаемому спросу в 600 000 галлонов сока в ян-
варе и феврале и 700 000 галлонов в марте.
•
Он имеет договор со штатом Флорида, предоставляющим налоговые льготы
при условии, что компания покупает не менее 40% сока каждый месяц
у фермеров, выращивающих сорт «флорида валенсия». Нарушать договор
нельзя ни при каких условиях.
•
Отношение Брикс/кислотность (BAR) должно оставаться в пределах между
11,5 и 12,5 в смеси каждого месяца.
152 Много цифр
•
Уровень кислотности должен оставаться между 0,75% и 1%.
•
Уровень вяжущего вкуса должен быть 4 или ниже.
•
Цвет должен находиться в рамках 4,5–5,5. Не слишком темный, не слиш-
ком водянистый.
ВНИМАНИЕ
Не делите на спрос последовательно, так как вообще спрос является функцией пере-
менных решения. Решения, поделенные на решения, ужасно нелинейны!
Снижаем стандарты
В полном восторге вы несете ваш план оптимального смешивания своему на-
чальнику, мистеру Лэндингсли III. Вы объясняете, как пришли к такому варианту.
Он разглядывает бумагу с подозрением. И даже, несмотря на ваши заверения
в оптимальности плана, требует урезать стоимость еще на 5%. И объясняет свою
очевидно бессмысленную позицию спортивными аналогиями «играй всеми на-
падающими» и «выдай мне 110%».
Со спортивными аналогиями нет смысла спорить. Если именно $1 170 000 —
подходящая цифра, то пусть так и будет. Вы объясняете, что достичь этого
с имеющимися условиями качества невозможно, а он ворчит и говорит вам,
что ваша задача — «немного прогнуть реальность».
Хммм…
Вы возвращаетесь к своей таблице взволнованным.
Как можно получить смесь лучше за $1 170 000?
После разговора по душам с мистером Лэндингсли вы понимаете: стои-
мость — больше не цель. Это теперь условие! А что же цель?
Ваша новая цель, порожденная ворчанием начальника, формулируется как
понижение качества ради снижения стоимости. А способ ее достигнуть — это
вставка переменной решения в модель с тем, чтобы снизить ограничения качества.
Что ж, вперед — копируем лист Optimization Model в чистую таблицу под на-
званием Relaxed Quality. Эта задача не потребует больших изменений.
Посидите минутку и подумайте, как и что можно изменить, чтобы модель
соответствовала новым послаблениям в цели и цене. Не вставайте, пока не за-
болит голова!
Первое, что вы должны сделать, — это внести $1 170 000 как ценовое ограни-
чение в ячейку В2, прямо за старой целевой ячейкой. Также скопируйте старые
минимальные и максимальные значения вкуса и цвета в столбцы H и I соот-
ветственно. А в строки 27–30 столбца G добавьте новую переменную решения
под названием %Relaxed.
Теперь подумайте, как вы можете использовать снижение значения отношения
Брикс/кислотность в ячейке G27, чтобы понизить ограничение в 11,5. Текущее
значение этого параметра варьируется от 11,5 до 12,5, то есть разница равна 1. По-
этому расширение этого «коридора» на 10% даст нам минимальное значение в 11,4.
Следуя этому подходу, замените минимум в В27 на эту формулу:
=H27-G27*(I27-H27)
минимума (127 минус Н27). Можете скопировать эту формулу вниз до строки 30.
Точно так же примените новый максимум с послаблением в столбце F.
Что касается целевой функции, возьмите среднее из решений с послабле-
нием из G27:G30. Поместив этот расчет в ячейку D2, получаем новый лист, ко-
торый выглядит как рис. 4-25.
•
Назначить целевую ячейку D2 переменной решения, чтобы алгоритм мог
совершать над ней все необходимые действия. Не забывайте: если вы за-
дали модели цель — минимизировать, симплексный алгоритм будет пы-
таться уменьшить значение в этой ячейке насколько это возможно.
•
С помощью окна «Добавить условие» поставить следующее условие: та-
кое, что G27:G30 должны быть меньше или равны D2. D2 нужно поставить
в правую часть неравенства, чтобы разрешить Excel использовать разное
число ячеек (4 ячейки из столбца G слева и одна справа, ограничивающая
неравенство сверху). Единственный раз в этой главе вы можете исполь-
зовать разное количество ячеек в неравенстве ограничения, потому что
4. Оптимизационное моделирование 163
Теперь вы можете добавить условие, что 672 × C34 ≥ C6. Когда С6 равно нулю,
С34 может принять значение 0). А когда С6 больше нуля, то С34 принудительно
превращается в 1, чтобы поднять верхнюю границу от 0 до 672.
Чтобы применить это условие в электронной таблице, создайте новый
промежуток F34:Н44, где вы будете перемножать индикаторы слева на их
166 Много цифр
•
обе переменные — нули, равно как и индикатор и общее количество, со-
ответственно, их произведение также равно 0;
170 Много цифр
•
вы заказали сок, но решили не понижать кислотность — произведение
снова 0;
•
вы решили понизить кислотность — произведение равно общему количе-
ству сока.
•
индикатор понижения кислотности × объем, доступный для заказа;
•
заказанное количество.
Можете скопировать эту формулу для каждого сорта и месяца, получив в ре-
зультате таблицу, изображенную на рис. 4-36.
Рядом с разделом Total Reduce вычтите это значение из общего объема за-
каза в С16:Е16, чтобы получить оставшееся количество сока, не подвергшегося
деацидификации. К примеру, в ячейку G38 поместите
=C6—C38
174 Много цифр
Моделируем риски
Последнее бизнес-правило было тяжеловатым, зато проиллюстрировало, как
с помощью модели можно линеаризовать большинство задач бизнеса путем
добавления условий и переменных. Неважно, впрочем, насколько просты или
сложны были предыдущие задачи — у них есть одна общая черта: они свято
чтут вводные данные.
Эта точность не всегда соответствует реальности, в которой вынуждено
действовать большинство бизнесменов. Не все партии отвечают заявленным
176 Много цифр
70
Количество вхождений
60
50
40
30
20
10
0
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33
Сумма четырех цифр
Рис. 4-40. Комбинирование независимых случайных переменных для иллюстрации того, как они
собираются в колоколообразную кривую
80%
70%
60%
50%
40%
30%
20%
10%
0%
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33
Сумма цифр
ЗАМЕТКА
Точно так же, как в предыдущем разделе, пользователям Excel 2010 и Excel 2013 пона-
добится помощь OpenSolver. Ставьте задачу, формируйте решение, как обычно, и ис-
пользуйте кнопку выполнения OpenSolver в меню, когда дело дойдет до решения. Бо-
лее подробно OpenSolver описан в главе 1.
То же самое можно сделать и для февраля и марта в строках 80 и 81, а затем
распространить весь расчет до самого столбца CW, чтобы получить значение
этого отношения для каждого сценария.
В итоге вы получаете расчеты для каждого сценария, показанные на рис. 4-45.
для загрузки, оно может отличаться. Для моей сотни сценариев наилучшим по-
казателем, который мне удалось получить, является изменение качества на 133%
с сохранением стоимости менее $1,25 миллиона.
Ради смеха можно поднять верхнюю границу стоимости до $1,5 миллиона
и решить все снова. Получится изменение на 144%, причем цена будет сильно
недотягивать до верхней границы, оставаясь близкой к $1,3 миллиона. Видимо,
увеличение стоимости выше этого значения не дает большого резерва для
улучшения качества (решение на рис. 4-47).
Ну, вот и все! Теперь у вас есть баланс стоимости и качества, удовлетворя-
ющий условиям даже в случайных, близких к реальности ситуациях.
Подытожим
Если вы терпеливо составляли мне компанию на протяжении последних двух
моделей — браво! Эти «взламыватели мозгов» — не игрушки. На самом деле это
была, возможно, самая трудная глава книги. Дальше будет проще, честное слово!
4. Оптимизационное моделирование 185
У вас, должно быть, голова идет кругом от желания немедленно приме-
нить все эти математические премудрости в вашем бизнесе. Или, наоборот,
вы только что допили стаканчик крепкого и решили никогда больше не свя-
зываться с линейным программированием. Надеюсь все-таки на первый вари-
ант, ибо линейное программирование — чрезвычайно увлекательный инстру-
мент для развития необычайной креативности и сообразительности. Модели
с десятками миллионов переменных решений вы найдете во многих моделях
бизнеса.
•
Росс и Рейчел, разумеется;
•
Моника и Чендлер, которые, в конце концов, поженились;
•
Джоуи и Рейчел, у которых был недолгий роман, но в итоге они нашли, что
это «слишком странно»;
•
Чендлер и Рейчел, которые встречались в серии про инцидент со столи-
ком для бассейна. В этой серии Рейчел представляет, что было бы, если
бы она встречалась с Чендлером;
190 Много цифр
•
Чендлер и Фиби, которые играют в отношения и, в конце концов, вынуж-
дены поцеловаться, потому что Чендлер отказывается признать, что он
встречается с Моникой.
Росс Рейчел
Джоуи Моника
Чендлер Фиби
Довольно просто, не так ли? Вершины и ребра. Вот и все, что нужно для се-
тевого графа. Заметьте, насколько сетевые графы не похожи на графики, кото-
рые вам встречались: точечные диаграммы, линейные графики и столбчатые
диаграммы. Они — совсем другие «звери».
На рис. 5-1 изображен неориентированный сетевой граф, потому что отношения
обоюдны по определению. А вот данные, например, из Twitter будут уже ориенти-
рованным графом: я могу подписаться на вас, но вы не обязаны подписываться
на меня. Ребра ориентированного графа обычно изображаются стрелочками.
Один из минусов использования Excel для работы с сетевыми графами со-
стоит в том, что, в отличие от разнообразных графиков и диаграмм, граф нельзя
визуализировать встроенными в Excel средствами.
Так вот, в этой главе я намереваюсь отступиться от собственных правил и
использовать стороннее программное обеспечение для расчетов и визуали-
зации графов, а именно Gephi. Его подробное описание вы найдете в следу-
ющем разделе. Вы вправе игнорировать в этой главе все, что связано с Gephi,
если хотите. Весь поиск и добыча сетевых данных могут быть выполнены
без визуализации сети в Gephi, я прибегаю к нему просто потому, что оно
мне нравится.
Но если вы хотите работать с таким типом графов, то кроме визуализации вам
понадобится числовое представление данных. Одно из подобных интуитивных
5. Кластерный анализ, часть II 191
NODEXL
Если вы пользуетесь Excel 2007 или 2010, то Social Media Research Foundation выпу-
стила для вас шаблон NodeXL, благодаря которому вы можете строить сетевые графы
в Excel. Я не буду его описывать в этой книге, потому что век развития программного
обеспечения только начинается и этот шаблон не совместим с LibreOffice и Excel 2011
для MacOS. Если вам интересно, можете поискать NodeXL для вашей системы здесь:
http://www.smrfoundation.org/nodexl/.
Мне кажется, что импорт матрицы смежности в Gephi имеет один лишний шаг.
Почему? Потому что Gephi не поддерживает матрицы смежности, разделенные
запятыми. Каждое значение должно быть отделено от другого точкой с запятой.
Несмотря на предостережение Курта Воннегута в «Человеке без родины»:
«Не пользуйтесь точкой с запятой. Это гермафродит-трансвестит, не представ-
ляющий из себя абсолютно ничего. Все, на что способен этот знак — показать,
что вы учились в колледже», Gephi проигнорировал этот дельный совет. Сле-
дуйте за мной — и я проведу вас целыми и невредимыми через процесс импорта.
Я создал таблицу FriendsGraph.xlsx, доступную на сайте книги www.wiley.
com/go/datasmart. Впрочем, при желании можете сами немного повозиться
с небольшим набором данных и матрицей смежности с рис. 5-2.
Первое, что необходимо сделать, чтобы импортировать этот граф в Gephi —
это сохранить его как CSV, файловый формат, являющийся обычным текстом,
разделенным запятыми. Для этого нажмите «Сохранить как» в Excel и выберите
CSV из списка форматов. Имя файла будет FriendsGraph.csv. При сохранении
Excel может ругаться на вас и выдавать различные предупреждения, но я раз-
решаю вам их игнорировать.
После экспорта файла все запятые замените на точки с запятой. Для этого
откройте файл в текстовом редакторе (например, в Блокноте, если вы исполь-
зуете Windows, или Текстовый редактор, если у вас MacOS) и с помощью «Найти
и заменить» поменяйте запятые на точки с запятой. Сохраните файл. На рис. 5-3
этот процесс показан в текстовом редакторе.
Визуализация графа
Удостоверьтесь, что в верхнем левом углу программы выбрана вкладка Overview.
Таким образом, ваш Gephi должен выглядеть примерно как мой на рис. 5-6. Вер-
шины и ребра беспорядочно разбросаны по экрану. Увеличение на ужасном
минимуме, так что вы еле различаете контуры. Изначально вы рассчитывали
на нечто более удобоваримое, не так ли?
Причешем немного наш граф. Можно приблизить изображение колесиком
мышки и двигать его, удерживая правую клавишу.
Нажимая на кнопку Т внизу окна просмотра, вы можете добавить названия
вершинам графа, чтобы знать, какая вершина к какому персонажу относится.
После увеличения, подгонки и добавления имен граф выглядит как на рис. 5-7.
5. Кластерный анализ, часть II 195
Нужно, однако, чтобы он выглядел еще лучше. К счастью, у Gephi есть пачка
алгоритмов для автоматизации этого процесса. Многие из них используют та-
кие средства, как гравитация между соединенными вершинами и отталкивание
между несоединенными для более удачного расположения элементов. Раздел
отображения в Gephi — это нижнее левое окно панели обзора. Не стесняйтесь
спонтанно выбирать пункты из этого меню, чтобы попробовать разные режимы.
ЗАМЕТКА
Имейте в виду, что некоторые алгоритмы внешнего вида могут сжать или растянуть
ваш граф так, что придется увеличивать или уменьшать изображение, чтобы увидеть
его целиком. Это относится и к названиям вершин — их размеры будут меняться со-
вершенно хаотично, но, к счастью, можно использовать Label Adjust — функцию под-
гонки названий под выпадающим меню внешнего вида графа.
Степень вершины
Одно из понятий, весьма важное для понимания данной главы, — это степень
вершины, то есть количество ребер, связанных с данной вершиной. У Чендлера
степень равна 3, в то время как у Фиби — всего 1. Эти степени можно исполь-
зовать в Gephi для изменения размера вершин.
Приятная картинка
Хотя эти картинки неплохо выглядят, вы вряд ли решитесь повесить их на стену.
Чтобы подготовить граф к печати, зайдите на панель просмотра (Preview) вверху
экрана.
Под вкладкой настроек просмотра (Preview Setting) выберите пресет Black
Background из выпадающего меню пресетов (теперь вы больше похожи на ха-
кера) и нажмите на кнопку обновления страницы (Refresh) в нижнем левом
углу окна.
Gephi нарисует ваш граф потрясающе красивым и плавным (рис. 5-11).
Обратите внимание, как вместе с самими вершинами изменились размеры
подписей. Они просто великолепны! Ребра этого графа показались мне не-
много тонковатыми, так что я изменил их толщину в левой панели настроек
с 1 до 3.
Если вы хотите превратить это изображение в графический файл (к примеру,
файл.png), нажмите кнопку Export в левом нижнем углу раздела настроек об-
зора. После этого вы можете разместить свой граф на сайте, вставить в пре-
зентацию PowerPoint и даже в книгу про науку о данных!
Таблица Excel, использованная в этой главе, доступна для скачивания на сайте книги,
www.wiley.com/go/datasmart. Она содержит исходные данные, на случай если
вы хотите работать с ней. Если нет — просто следите за мной, используя уже запол-
ненные листы.
•
в конце главы 2 вы обнаружили, что в случае с данными о заказах асимме-
тричное подобие и измерения расстояний между покупателями работают
гораздо лучше евклидова расстояния. Вам важны заказы, а не их отсутствие;
•
проведя ребро между двумя покупателями, вы руководствуетесь сходством
этих покупателей, а не различиями между ними, поэтому данный расчет
нужно «перевернуть». Эта близость заказов видна благодаря близости ко-
синусов, поэтому вам нужно создать матрицу близости, то есть смежно-
сти, в противовес матрице расстояний из главы 2.
=SUMPRODUCT(OFFSET(Matrix!$H$2:$H$33,0,Similarity!C$1),
OFFSET(Matrix!$H$2:$H$33,0, Similarity!$A3))/(SQRT(SUM
(OFFSET(Matrix!$H$2:$H$33,0, Similarity!C$1)))*SQRT(SUM
(OFFSET(Matrix!$H$2:$H$33,0, Similarity!$A3))))
=СУММПРОИЗВ(СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!C$1),
СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!$A3))/(КОРЕНЬ(СУММ
(СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!C$1)))*КОРЕНЬ(СУММ
(СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!$A3))))
IF(C$1=$A3,0,SUMPRODUCT(OFFSET(Matrix!$H$2:$H$33,0,Similarity!
C$1),OFFSET(Matrix!$H$2:$H$33,0,Similarity!$A3))/(SQRT
(SUM(OFFSET(Matrix!$H$2:$H$33,0,Similarity!C$1)))*SQRT(SUM
(OFFSET(Matrix!$H$2:$H$33,0,Similarity!$A3)))))
ЕСЛИ(C$1=$A3,0,СУММПРОИЗВ(СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!
C$1),СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!$A3))/(КОРЕНЬ(СУММ
(СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!C$1)))*КОРЕНЬ(СУММ
(СМЕЩ(Matrix!$H$2:$H$33,0,Similarity!$A3)))))
5. Кластерный анализ, часть II 207
Итак, теперь, когда у вас есть формула, которую можно перетаскивать куда
угодно, возьмите ячейку С3 за нижний правый угол и растяните вправо до СХ3
и вниз до СХ102.
В итоге в вашем распоряжении — матрица близости косинусов, которая по-
казывает, какие покупатели похожи. Применяя условное форматирование, по-
лучаем результат, показанный на рис. 5-16.
Эта функция выдает нам 2950 ребер, созданных из исходных 324 сделок.
Что, если оставить только 20% с наибольшими значениями? Каким для этого
должно быть r? Попробуем прикинуть: при 2950 ребрах 80-м перцентилем
по близости будет примерно то, что соответствует 590-му ребру. Так что под
расчетом количества ребер в С105 можно использовать функцию LARGE/НАИ-
БОЛЬШИЙ, чтобы узнать значение 590-го по порядку уменьшения значений ре-
бра (рис. 5-18):
=LARGE(C3:CX102,590)
=НАИБОЛЬШИЙ(C3:CX102,590)
Функция выдает значение 0,5. Таким образом, можно оставить 20% ребер
с наибольшими значениями, просто отбросив все, значения близости косину-
сов которых меньше 0,5.
Теперь, когда с графа r-окрестности убрано все лишнее, сборка матрицы
смежности будет очень простой. Создайте новый лист в вашей таблице и на-
зовите его r-NeighborhoodAdj, а затем вставьте имена покупателей в столбец А
и строку 1, чтобы получилась таблица.
В любой ячейке этой таблицы нужно поставить 1, если значение близости из
предыдущей таблицы Similarity больше 0,5. Таким образом, к примеру, в ячейке В2
можно использовать такую формулу:
=IF(Similarity!C3>=Similarity!$C$105,1,0)
=ЕСЛИ(Similarity!C3>=Similarity!$C$105,1,0)
Отлично! Итак, теперь у вас есть граф, который можно охватить взглядом.
И на деле простое отображение графа и разглядывание его — зрительное раз-
деление на группы — само по себе не так уж плохо. Вы взяли многомерные дан-
ные и дистиллировали их в нечто плоское, вроде пола актового зала из главы 2.
Но если бы у вас были тысячи покупателей, а не сотни, глаза бы уже не так по-
могали. Конечно, даже сейчас на графе есть такие покупатели, которых трудно
сгруппировать. В одной ли они группе или в нескольких?
И в этот самый момент в игру вступает модульная максимизация. Алгоритм
использует отношения между людьми на графе, чтобы делать предположения
об их принадлежности к той или иной группе, даже если граф не умещается
в ваше поле зрения.
Но что со штрафными?
Вот где алгоритм модулярной максимизации становится по-настоящему
креативным. Вспомним наш граф «Друзей», изображенный на рис. 5-1.
Модулярная максимизация основывает свои штрафные на следующем ут-
верждении, в котором фигурируют две вершины:
Если бы взяли этот граф и стерли бы на нем середины всех ребер, а затем
соединили бы их заново случайным образом несколько раз, сколько бы в этом
случае ребер получилось между двумя вершинами?
Росс Рейчел
Джоуи Моника
Чендлер Фиби
Росс Рейчел
Джоуи Моника
Чендлер Фиби
1 3
10 10
Росс Рейчел
1 1
10 10
Джоуи Моника
3 1
10 10
Чендлер Фиби
1 3
Вероятность получения Росс-Рейчел:
10 10
# пеньков Росса # пеньков Рейчел 1 3
2 =2
Росс Рейчел 2 * # ребер 2 * # ребер 10 10
1 1
10 10
В этом случае тоже получается 14, и это то, чего мы ожидали, так как граф
неориентированный.
5. Кластерный анализ, часть II 217
что оказывается равным 0,245. Сводя все вместе, получаем 1 – 0,245 = 0,755.
5. Кластерный анализ, часть II 219
Переходим к кластеризации!
Теперь у вас есть все необходимые значения. Все, что вам нужно сделать — это
запустить оптимизационную модель, чтобы найти оптимальное распределение
по группам.
Буду заранее честен с вами. Нахождение оптимальных групп с помощью
модулярности графа требует несколько более сложной подготовки оптимиза-
ции, чем вы встречали в главе 2. Подобные задачи часто решаются сложной
эвристикой, вроде популярного лувенского метода (подробнее здесь: http://
perso.uclouvain.be/vincent.blondel/research/louvain.html), но в этой
книге я обещал не заставлять вас писать код, так что придется обходиться
«Поиском решения».
Мы будем атаковать задачу с помощью метода под названием разделяющая
кластеризация, или иерархическое разбиение. Для начала необходимо найти наи-
лучший способ разделения графа на две группы. Затем мы разделим эти группы
на четыре, и т. д., до тех пор, пока «Поиск решения» не заключит, что наилучший
способ максимизации модулярности — это перестать делить группы.
ЗАМЕТКА
Деление 1
Итак, мы начинаем наш процесс разделяющей кластеризации с разделения
графа на две группы, чтобы максимизировать модулярность.
Создайте новый лист под названием Split1 и вставьте покупателей в стол-
бец А. Принадлежность каждого покупателя к группе будет обозначена
в столбце В, который нужно назвать Community. Так как вы делите граф попо-
лам, пусть этот параметр будет бинарной переменной решения в «Поиске ре-
шения», где значение 0/1 будет означать принадлежность к группе 0 или 1. Ни
одна из групп не лучше другой. Нет ничего плохого в том, чтобы быть в 0 группе.
то его часть общей модулярности будет суммой всех значений ячеек его строки
во вкладке Scores, покупатели в которых также отнесены к группе 1.
Рассмотрим, как добавить эту модулярность в формулу. Если Адамс в группе 1,
то вам нужно сложить все значения ячеек из строки 2 вкладки Scores, которые
относятся к другим покупателям, также попавшим в группу 1. Так как мы при-
сваиваем только 0/1, можно использовать SUMPRODUCT/СУММПРОИЗВ для умно-
жения вектора группы на вектор модулярности и сложения результата.
Хотя значения модулярностей расположены слева направо, в оптимиза-
ционной модели они идут сверху вниз, так что здесь придется использовать
TRANSPOSE/ТРАНСП (что, в свою очередь, означает использование формулы
массива):
{=SUMPRODUCT(B$2:B$101,TRANSPOSE(Scores!B2:CW2))}
{=СУММПРОИЗВ(B$2:B$101,ТРАНСП(Scores!B2:CW2))}
Все, что вы делаете — это заставляете модулярность Адамса быть меньше или
равной правильному расчету и удаляете другую формулу из рассуждения, за-
вышая ее значение. Это взломанная парнями из подворотни функция IF/ЕСЛИ.
Таким образом, столбец С вы можете сделать столбцом модулярности, ко-
торая будет переменной решения, а в столбцы D и Е вашей электронной та-
блицы вставить эти две формулы в качестве верхних границ модулярности
(рис. 5-27).
Обратите внимание, что в значениях принадлежности к группам в формуле
используются абсолютные ссылки, так что без проблем растягивайте формулу
вниз — ничего не изменится.
222 Много цифр
Деление 2: электролатино!
Разделим эти группы так, как делят ячейку. Начнем с копирования листа Split1
в новый лист и переименования его в Split2.
Первое, что здесь нужно сделать — это вставить новый столбец после столбца
со значениями принадлежности к группам (В). Назовите этот новый столбец С
Last Run и скопируйте туда значения из В. Таким образом получается лист,
изображенный на рис. 5-31.
В этой модели подход тот же самый: каждому покупателю присваива-
ется 1 или 0. Но стоит помнить, что если два покупателя получают в этот
раз 1, это вовсе не значит, что они находятся в одной группе. Если в пре-
дыдущем делении они могли находиться в разных группах, то этот принцип
сохраняется.
Другими словами, единственное значение модулярности, которое может по-
лучить Адамс, будучи, скажем, в группе 1–0, зависит от покупателей, отнесенных
в группу 0 в первом делении и в группу 1 во втором. Таким образом, нам необ-
ходимо поменять верхние границы расчета модулярности. Расчет в столбце Е
(здесь показан в Е2) теперь требует сверки с результатами предыдущего деле-
ния в столбце С:
{=SUMPRODUCT(B$2:B$101,IF(C$2:C$101=C2,1,0),
TRANSPOSE(Scores!B2:CW2))}
{=СУММПРОИЗВ(B$2:B$101,ЕСЛИ(C$2:C$101=C2,1,0),
ТРАНСП(Scores!B2:CW2))}
перед запуском, так что в этом нет ничего нелинейного. Добавьте оператор
IF/ЕСЛИ в часть формулы с «большим М», чтобы сделать окончательный рас-
чет в столбце Е:
SUMPRODUCT(B$2:B$101,IF(C$2:C$101=C2,1,0),TRANSPOSE
(Scores!B2:CW2))+(1-B2)*SUMPRODUCT(IF(C$2:C$101=C2,1,0),
TRANSPOSE(ABS(Scores!B2:CW2)))
СУММПРОИЗВ(B$2:B$101,ЕСЛИ(C$2:C$101=C2,1,0),ТРАНСП
(Scores!B2:CW2))+(1-B2)ЧСУММПРОИЗВ(IF(C$2:C$101=C2,1,0),
ТРАНСП(ABS(Scores!B2:CW2)))
И… деление 3: возмездие
Хорошо, но стоит ли нам останавливаться на этом или стоит продолжить? Един-
ственный способ узнать ответ — поделить еще раз. Если результат не будет
лучше, чем 0,564 — значит, это конец.
Начнем с создания листа Split3, переименования Last Run в Last Run 2
и вставки нового Last Run в столбец С. Затем скопируем значения из В в С.
Добавим еще пару операторов IF//ЕСЛИ в верхние границы, чтобы прове-
рять принадлежность к группе в предыдущем делении. Например, F2 превра-
щается в следующее:
=SUMPRODUCT(B$2:B$101,IF(D$2:D$101=D2,1,0),IF(C$2:C$101=C2,1
,0),TRANSPOSE(Scores!B2:CW2))+(1-B2)*SUMPRODUCT
(IF(C$2:C$101=C2,1,0),IF(D$2:D$101=D2,1,0),
TRANSPOSE(ABS(Scores!B2:CW2)))
=СУММПРОИЗВ(B$2:B$101,
ЕСЛИ(D$2:D$101=D2,1,0),ЕСЛИ(C$2:C$101=C2,1,0),
ТРАНСП(Scores!B2:CW2))+(1-B2)*СУММПРОИЗВ
(ЕСЛИ(C$2:C$101=C2,1,0),ЕСЛИ(D$2:D$101=D2,1,0),
ТРАНСП(ABS(Scores!B2:CW2)))
228 Много цифр
=BIN2DEC(CONCATENATE(B2,C2))
=ДВ.В.ДЕС(СЦЕПИТЬ(B2,C2))
{=СУММПРОИЗВ(ЕСЛИ(Communities!$D$2:$D$101=
TopDealsByCluster!H$1,1,0),ТРАНСП(Matrix!$H2:$DC2))}
Обратите внимание, как похоже это решение на уже найденное нами в главе 2.
Но тогда мы пользовались кардинально другой методологией, сохраняя вектор
5. Кластерный анализ, часть II 233
Подытожим
В главе 2 мы рассматривали кластеризацию по k-средним. Используя те же
самые данные, в этой главе вы сражались с сетевыми графами и окунались в
кластеризацию через максимизацию модулярности. Вы уже должны довольно
неплохо себя чувствовать в добыче данных, и даже обрести некоторую уверен-
ность. Конкретизируем освоенные вами навыки:
•
визуальное представление сетевого графа, а также отображение его в виде
матриц смежности и инцидентности;
•
загрузка сетевого графа в Gephi для пущей уверенности в графической
несостоятельности Excel;
•
удаление ребер из сетевых графов с помощью графа r-окрестности. Также
вы познакомились с концепцией KNN-графа, к которой я вам рекомендую
вернуться и поразмыслить над ней подольше;
•
определение степени вершины и модулярности графа, а также способы
расчета «очков» модулярности для группировки двух вершин;
•
максимизация модулярности графа с использованием линейной оптими-
зационной модели и разделительной кластеризации;
•
максимизация модулярности графа в Gephi и экспорт результатов.
5. Кластерный анализ, часть II 239
А теперь вам наверняка любопытно, чего ради я окунул вас в процесс мак-
симизации модулярности графа, если Gephi способна сделать это за вас?
Вспомните, цель этой книги — не слепое нажатие клавиш, без осознания
того, что же вы делаете. Теперь вы научились конструировать и подготавли-
вать данные для определения кластеров. И знаете, как работает определение
групп на графе. Вы это сделали. Так что в следующий раз, столкнувшись с этим
«зверем», вы будете знать, что происходит по ту сторону экрана. Этот уровень
понимания процесса неоценим.
Хотя Gephi и является одним из лучших мест для подобного анализа, вам мо-
жет потребоваться место для написания программного кода по данным графа,
такое как библиотека igraph, которая имеет привязки к R и Python и велико-
лепно подходит для работы с сетевыми графами.
Также стоят упоминания базы данных графов Neo4J и Titan. Эти базы спе-
циально разработаны для хранения данных графов и последующих этапов до-
работки, независимо от сложности графа — интересует ли вас что-то простое,
вроде «отображения любимых фильмов друзей Джона» или что-нибудь по-
сложнее, вроде «нахождения кратчайшего путина Facebook от Джона до Ке-
вина Бейкона».
Ну вот и все. Идите вперед, составляйте графы, находите группы!
Бабушка контролируемого
6 искусственного
интеллекта — регрессия
Не обольщайтесь!
Люди, не знающие принципа работы модели ИИ, часто испытывают смесь вос-
торга и ужаса, когда слышат, что те умеют предсказывать будущее. Но, пере-
фразируя известный фильм 1992 года «Тихушники», взволнованных можно успо-
коить: «Не обольщайтесь — он не настолько умен».
Почему? Потому что модель ИИ не умнее суммы своих частей. Проще го-
воря, вы скармливаете контролируемому алгоритму ИИ данные за некий период
времени, к примеру, по заказам в Target, и говорите ему: «Эй, вот это заказали
точно беременные, а вон то — не очень». Алгоритм «пережевывает» данные и «вы-
плевывает» модель. Потом вы можете загрузить в эту модель данные о заказах
покупателей и спросить: «А вот эта покупательница беременна?», и модель от-
ветит: «Нет, это 26-летний оболтус, живущий у матери в подвале».
Это, конечно, очень помогает, но все же модель — не волшебница. Она про-
сто технично превращает данные о произошедших событиях в формулу или
набор правил, которые затем использует для предсказания событий в будущем.
Как мы видели на примере «наивного Байеса» в главе 3, эффективной модель
делает ее способность вспоминать эти данные и ассоциированные с ними пра-
вила принятия решения, а также вероятности и коэффициенты.
Наш неискусственный интеллект занимается этим всю нашу жизнь. К при-
меру, имея личные данные о моей жизни, мой мозг знает: если я съем огром-
ный бутерброд с потемневшими ростками люцерны, то через несколько часов
мне с высокой вероятностью станет плохо. Я взял данные из прошлого (о том,
что отравился) и обучил с их помощью свой мозг, так что теперь у меня есть
правило, формула, модель — называйте как хотите: темные ростки = гастроэн-
терологический кошмар.
В этой главе мы будем применять две разные регрессионные модели, про-
сто чтобы посмотреть, насколько прямолинейным может быть ИИ. Регрес-
сия — бабушка контролируемого предсказательного моделирования. Первые
исследования с ее помощью были проведены еще в XIX веке. Она — старушка,
но в этом ее сила: у нее была масса времени, чтобы развить во всех областях
своего применения математическую точность, которой недостает некоторым
новым технологиям ИИ. В противоположность макгайверовскому ощущению
6. Бабушка контролируемого искусственного интеллекта — регрессия 243
•
пол владельца учетной записи — мужской/женский/не указано; фамилию
можно сравнить с данными переписи населения;
•
адрес владельца учетной записи — частный дом, квартира или абонент-
ский ящик;
•
недавно заказывал тест на беременность;
•
недавно заказывал противозачаточные;
•
недавно заказывал средства женской гигиены;
•
недавно заказывал препараты с фолиевой кислотой;
•
недавно заказывал витамины для беременных;
•
недавно заказывал DVD йоги для беременных;
•
недавно заказывал подушку для тела;
•
недавно заказывал имбирный эль;
6. Бабушка контролируемого искусственного интеллекта — регрессия 245
•
недавно заказывал браслеты от укачивания;
•
регулярно заказывал сигареты до недавнего времени, затем перестал;
•
недавно заказывал сигареты;
•
недавно заказывал продукты для бросающих курить (жвачку, пластырь
и т. д.);
•
регулярно заказывал вино до недавнего времени, затем перестал;
•
недавно заказывал вино;
•
недавно заказывал одежду для беременных или кормящих.
Такая балансировка обучающих данных внесет в них некоторый сдвиг — модель «ре-
шит», что беременность встречается гораздо чаще, чем на самом деле. Но это не проб-
лема, потому что в данном случае нас не интересует настоящая вероятность забереме-
неть. Как явствует ниже, главное — найти точку пересечения «очков» по беременности,
выданных моделью, между положительными и ложноположительными результатами.
Рис. 6-2. Вкладка Training Data w Dummy Vars с новыми столбцами для фиктивных переменных
=IF(‘TrainingData’!A2=”M”,1,0)
=ЕСЛИ(‘TrainingData’!A2=”M”,1,0)
Вероятность того,
что я буду чихать у вас в гостях
100%
Вероятность чихания
80%
60%
40%
20%
0%
0 1 2 3 4 5
Количество кошек
Вероятность того,
что я буду чихать у вас в гостях
100%
y = 0,1529x + 0,0362
Вероятность чихания
80%
60%
40%
20%
0%
0 1 2 3 4 5
Количество кошек
Другими словами, если х равен нулю, то линейная модель думает, что у меня
есть 3–4%-ный шанс чихнуть и за каждую кошку щедро дает 15% сверху.
Начальная точка графика на оси вероятности расположена на уровне 3–4%,
что называется начальным отрезком, или свободным членом функции, а 15%
за кошку — коэффициент переменной кошек. Предположения такого рода не тре-
буют ничего, кроме будущих данных, которые затем комбинируются с коэф-
фициентом и начальным отрезком модели.
На самом деле, при желании вы можете скопировать из графика формулу
«= 0,1529x + 0,0362» и вставить ее в ячейку, чтобы делать прогнозы, подставляя
вместо x подходящие числа. К примеру, в будущем я зайду в дом с тремя с по-
ловиной кошками внутри (бедняга Тимми потерял свои задние лапы в лодоч-
ной аварии), затем вычислю «линейную комбинацию» коэффициентов и своих
данных, добавлю начальный отрезок и получу свой прогноз:
0,1529 * 3,5 cats + 0,0362 = 0,57
252 Много цифр
57%-ный шанс чихнуть! Это является моделью ИИ в том смысле, что мы взяли
независимую переменную (кошек), зависимую переменную (чихание) и попро-
сили компьютер описать их взаимоотношения формулой, которая больше всего
похожа на данные о событиях в прошлом.
Теперь вам, наверное, интересно, как компьютер догадался, какая у этих
данных линия тренда. Она неплохо выглядит, но откуда он знает, как? Выра-
жаясь более человеческим языком, компьютер искал такую линию тренда, ко-
торая бы лучше всего подходила к данным, то есть чтобы сумма квадратов от-
клонений от данных была минимальной.
Чтобы понять, зачем нам сумма квадратов отклонений и что она означает,
подставим в уравнение линии тренда одну кошку:
0,1529 * 1 cat + 0,0362 = 0,1891
Обучающие данные дают нам здесь вероятность 20%, а не 18,91. Таким образом,
отклонение линии тренда в этой точке от данных равна 1,09%. Величина отклоне-
ния возводится в квадрат, чтобы ее значение было положительным, независимо
от того, по какую сторону от линии тренда оказалась наша точка. 1,09% в ква-
драте дают 0,012%. А если мы теперь сложим все квадраты отклонений от всех
известных нам точек обучающих данных, у нас получится сумма квадратов от-
клонений (которую часто называют просто суммой квадратов). И это именно
то, что Excel минимизирует, когда подгоняет линию тренда под график чихания.
Хотя в ваших данных из РитейлМарта слишком много измерений, чтобы де-
лать из них точечную диаграмму, в следующих разделах мы будем подгонять
к нашим данным точно такую же линию.
ПОДСКАЗКА
Кроме того, вы можете выделить столбец W, кликнуть на нем правой клавишей мышки,
выбрать «Форматирование ячеек» и отформатировать значения в них как числа с двумя
знаками после запятой, что впоследствии убережет вас от сердечного приступа при
виде их огромного количества.
Вы можете растянуть эту ячейку вниз на весь столбец, чтобы у каждого по-
купателя был свой расчет отклонений.
А теперь добавьте ячейку над прогнозами в Х1 (обозначенную в W1 как
Sum Squared Error — сумма квадратов отклонений), в которой будет подсчи-
тываться сумма значений столбца квадратов отклонений с помощью следу-
ющей формулы:
=SUM(X8:X1007)
=СУММА(X8:X1007)
СПРАВКА
ЗАМЕТКА
Следующий раздел — самый замысловатый во всей книге. Он, без сомнения, содержит
самые сложные вычисления — расчет стандартного отклонения коэффициентов мо-
дели. Я постарался объяснить все как можно доходчивее, но некоторые вычисления
требуют объяснений на уровне, соответствующем сложности текста. А я не хочу здесь
отвлекаться на курс лекций по линейной алгебре.
Постарайтесь вникнуть в эти понятия насколько возможно. Применяйте их на прак-
тике. А если хотите узнать больше — возьмите учебник по математической статистике
начального уровня (к примеру, «Статистика простым языком» — Statistics in Plain English
by Timothy C. Urdan [Routledge, 2010]).
Если вы все же застрянете — знайте, что к этой главе в остальной книге ничего
не привязано. Пропустите ее, а потом вернитесь, если понадобится.
260 Много цифр
Критерий Фишера:
статистическая значимость подгонки
Частенько при анализе подгонки регрессии люди останавливаются на R-квадрате:
«О, неплохо выглядит! Ну все, хватит!»
Не делайте так.
R-квадрат показывает нам лишь то, насколько хорошо подогнана модель.
Но он не дает никакой информации о статистической значимости подгонки.
Это просто, особенно в случаях с рассеянными данными (всего несколько
точек) — получить модель, которая подогнана достаточно хорошо, но эта под-
гонка статистически не значима, то есть выраженное ею отношение между от-
личительными признаками и независимыми переменными может иметь очень
отдаленное отношение к реальности.
262 Много цифр
Может быть, то, что ваша модель подходит — просто случайность? Внезап-
ная удача? Чтобы модель была статистически значимой, нужно отсеять все
случайные совпадения. Представим же на мгновение, что вся наша модель —
полнейшая случайность. Что вся подгонка — результат удачного выбора из 1000
случайно отобранных анкет РитейлМарта. Такое предположение в стиле адво-
ката дьявола называется нулевой гипотезой.
Обычно нулевая гипотеза отвергается, если есть вероятность подогнать мо-
дель хотя бы на 5%. Эта вероятность часто называется величиной p.
Для ее вычисления мы проводим проверку на критерий Фишера. Мы берем
три параметра модели и создаем с их помощью распределение вероятности
(для тех, кто забыл, что такое распределение вероятности — посмотрите об-
суждение нормального распределения в главе 4). Вот эти три параметра:
•
количество коэффициентов модели — в нашем случае 20 (19 отличитель-
ных черт плюс свободный член);
•
степени свободы — это количество вариантов данных за вычетом коли-
чества коэффициентов модели;
•
F-статистика — отношение «понятной» части суммы квадратов к «непо-
нятной» (Х3/Х1 в таблице), умноженное на отношение количества степе-
ней свободы к количеству зависимых переменных.
6. Бабушка контролируемого искусственного интеллекта — регрессия 263
Теперь у вас есть все, что нужно для подсчета статистики каждого коэффи-
циента (такого же, как и расчет F-статистики в предыдущем разделе). Мы бу-
дем производить проверку по двустороннему критерию, то есть рассчитывать
вероятности получения коэффициента, по меньшей мере, такой же величины,
положительной или отрицательной, если на самом деле между отличием и за-
висимой переменной нет никакой связи.
T-статистика для этой проверки может быть рассчитана в строке 4 как аб-
солютное значение коэффициента, нормализированного по его стандартному
отклонению. Для признака Male это будет выглядеть так:
=ABS(B2/B3)
Делаем прогнозы
на основании новых данных и измеряем результат
Последний раздел был целиком посвящен статистике — своего рода лабора-
торная работа. Это, конечно, не самое веселое, что вы делали в своей жизни,
но умение проверять значимость и качество подгонки — важные навыки. А те-
перь пришло время устроить полевые испытания нашей модели и повеселиться!
6. Бабушка контролируемого искусственного интеллекта — регрессия 271
Точно так же, как во вкладке Linear Model, пропустите этот набор через мо-
дель, подставляя новые данные в линейную комбинацию данных покупателей
и коэффициентов, и затем прибавляя свободный член.
272 Много цифр
•
действительно положительные — отнесение беременного покупателя
к беременным;
•
действительно отрицательные — отнесение «не-беременного» покупа-
теля к не беременным;
•
ложноположительные (также называемые ошибками I рода) — отнесе-
ние «не очень беременного» покупателя к беременным. По моему опыту,
конкретно это ложноположительное предположение очень обижает при
личном контакте;
•
ложноположительные (также называемые ошибками II рода) — неспо-
собность определить беременного покупателя как такового. Это не так
обидно, как подсказывает мой опыт.
Избирательность
(доля действительно отрицательных результатов)
Еще одна мера качества модели, которая растет вместе с пороговым значе-
нием, — это избирательность. Избирательность, также называемая долей дей-
ствительно отрицательных результатов, выражается количеством покупателей,
276 Много цифр
=COUNTIFS(‘TestSet’!$V$2:$V$1001,”<”&B2,‘TestSet’!$U$2:
$U$1001,”=0”)/COUNTIF(‘TestSet’!$U$2:$U$1001,”=0”)
=СЧЁТЕСЛИМН(‘TestSet’!$V$2:$V$1001,”<”&B2,‘TestSet’!$U$2:
$U$1001,”=0”)/СЧЁТЕСЛИ(‘TestSet’!$U$2:$U$1001,”=0”)
Копируя эту формулу на весь список, вы можете увидеть, что по мере воз-
растания граничного значения, уменьшается количество ложноположительных
результатов. Другими словами, вы совершаете меньше ошибок I рода (называя
беременными покупателей, которые таковыми не являются).
278 Много цифр
Кривая ошибок
100%
90%
80%
положительные значения
70%
Действительно
60%
50%
40%
30%
20%
10%
0%
0%
%
0%
10
20
30
40
50
60
70
80
90
10
Ложноположительные значения
1
0,9
На выходе число от 0 до 1
0,8
0,7
0,6
0,5
0,4
0,3
0,2
0,1
0
–5 –4 –3 –2 –1 0 1 2 3 4 5
Любое значение
Если скопировать эту формулу на весь столбец, можно увидеть, что все но-
вые значения находятся между 0 и 1 (рис. 6-28).
Так или иначе, большая часть прогнозов оказывается близка к среднему,
между 0,4 и 0,7. А все из-за того, что мы не оптимизировали коэффициенты
на листе Linear Model для нашей новой модели. Так что оптимизацию при-
дется повторить.
Поэтому мы снова заполняем столбец с квадратом отклонения и далее
столбцы до Y, но теперь в расчет отклонения включаем прогнозы линейной
функции из столбца Х:
=(V5-X5)^2
284 Много цифр
ЗАМЕТКА
Ваши значения в столбцах W и X могут немного отличаться от моих, так как это —
коэффициенты модели, которые мы искали с помощью эволюционного алгоритма
на предыдущем листе.
=СУММПРОИЗВ(‘LogisticRegression’!B$2:T$2,’TestSet’!A2:S2)+
‘LogisticRegression’!U$2
ЗАМЕТКА
Выберите граничные значения от 0 до 1 с шагом в 0,05 (на самом деле сто-
ило бы 1 поменять на 0,999 или около того, чтобы избавить формулу точности
от деления на 0). Все строки ниже 22 можно очистить, а параметры качества
работы нужно изменить только в том, чтобы они обращались к столбцу Х ли-
ста Test Set, вместо столбца V. Таким образом у нас получается лист, изобра-
женный на рис. 6-33.
Вы можете построить кривую ошибок в точности так же, как и раньше. Од-
нако, чтобы сравнить логистическую регрессию с линейной, нужно добавить
ее ряд данных для параметров каждой модели (клик правой клавишей мыши
на графике и выбор опции «Выбрать данные»). На рис. 6-34 хорошо видно, что
кривые ошибок обеих моделей буквально сливаются.
При том что качество моделей практически идентично, вы можете скло-
ниться к использованию логистической регрессии разве что по причине прак-
тичности — ведь на выходе получаются текущие вероятности принадлежности
к классам от 0 до 1. Это приятнее, при прочих равных.
Но!
Испытание различных моделей ИИ — не самая важная часть проекта моделирова-
ния ИИ. Это последний этап, вишенка на торте. И именно в этот момент сайты вроде
Kaggle.com (сайт состязаний по моделированию ИИ) делают все не так.
Вы получаете гораздо большую отдачу, когда тратите время на выбор хороших
данных и отличительных признаков для вашей модели. К примеру, в задаче, приве-
денной в этой главе, вам бы лучше было обойтись тестированием возможных отли-
чий вроде «покупатель перестал покупать мясо на ужин из-за боязни пастереллёза»
и проверкой обучающих данных, чем тестированием нейронной сети на старом на-
боре для обучения.
Почему? Да потому, что пословица «Что посеешь, то и пожнешь» ни к чему не под-
ходит так хорошо, как к ИИ. Модель ИИ — не волшебный помощник, она не может «про-
глотить» ужасную выборку и чудесным образом указать, как использовать эти данные.
Поэтому сделайте одолжение своей модели ИИ — проявите изобретательность и най-
дите самые лучшие отличительные черты, какие только возможно.
Кривая ошибок
Действительно положительные значения
100%
90%
80%
Логистическая регрессия
70%
Линейная регрессия
60%
50%
40%
30%
20%
10%
0%
0%
%
%
%
0%
10
20
30
40
50
60
70
80
90
Ложноположительные значения 10
Дополнительная информация
Если вам очень понравился контролируемый ИИ и вы нашли в этой главе от-
веты на свои вопросы, то я, с вашего позволения, предложу вашему вниманию
несколько книг:
•
Data Mining with R, Luis Torgo (Chapman & Hall/CRC, 2010) прекрасно под-
ходит для следующего шага. В этой книге дается описание машинного об-
учения на языке программирования R. R — любимый язык всех и каждого,
кто работает со статистикой, и его несложно освоить в достаточном для
моделирования ИИ объеме. R будет идеальной площадкой для обучения
и запуска вашей производственной модели.
•
The Elements of Statistical Learning, Trevor Hastie, Robert Tibshirani, Jerome
Friedman (Springer, 2009). Выражает академический взгляд на различные
модели ИИ. Местами тяжеловатая для восприятия, эта книга может дей-
ствительно поднять ваши интеллектуальные изыскания на новый уровень.
На сайте Hastie’s Stanford есть бесплатная онлайн-версия.
Подытожим
Поздравляю! Вы только что построили модель классификации в электронной
таблице. Даже две. Может, даже две с половиной. А если вы еще и приняли мой
вызов с медианной регрессией, то вы просто гигант!
Давайте вспомним, чем же мы занимались в этой главе:
•
выбор отличительных черт и сборка обучающих данных, включая созда-
ние фиктивных переменных из категорийных данных;
•
обучение модели линейной регрессии путем минимизации суммы ква-
драта отклонений;
•
вычисление R-квадрата, показывающего с помощью теста, что модель ста-
тистически значима;
•
определение качества работы модели на опорной выборке при различных
ограничениях с помощью вычисления точности, специфичности, доли лож-
ноположительных результатов и памяти;
•
отображение кривой ошибок;
•
добавление логистической функции связи к общей линейной модели и ре-
оптимизация;
•
максимизация вероятности в логистической регрессии;
•
сравнение моделей с помощью кривой ошибок.
Несмотря на то, что данные в этой главе — чистейшая выдумка, подобная ло-
гистическая модель — отнюдь не повод для шуток. Вы можете воспользоваться
аналогичными инструментами для поддержки производственных решений или
автоматизированной системы маркетинга вашего бизнеса.
Если вам хочется продолжать работу с ИИ, то в следующей главе я покажу
вам другой подход, который называется комбинированной моделью.
Комплексные модели:
7 огромная куча ужасной
пиццы
Эта глава пролетит быстро, потому что мы возьмем базу данных Ритейл-
Марта из главы 6. Используя те же самые данные, вы лучше поймете различия
в применении двух моделей, которые я собираюсь вам предложить, и регрес-
сионных моделей из предыдущей главы. Техники моделирования, которые мы
будем использовать в этой главе, придуманы не так давно. Они более интуи-
тивны и, вероятно, являются одними из самых мощных технологий ИИ, суще-
ствующих на данный момент.
Также мы построим кривые ошибок в точности, как в главе 6, так что я не буду
тратить много времени на объяснение расчетов параметров качества работы
модели. Загляните в главу 6, если вдруг захотите освежить в памяти понятия
«точность» и «чувствительность».
Итак, начнем. В таблице, которую вы, возможно, загрузили, есть лист TD,
содержащий обучающие данные из главы 6 с уже настроенными фиктивными
переменными (подробнее также в главе 6). Отличительные признаки пронуме-
рованы от 0 до 18 в строке 2. Нумерация пригодится нам чуть позже для запи-
сей результатов (рис. 7-1).
Также рабочая таблица содержит лист Test Set из главы 6.
сделали такой заказ до рождения ребенка. С другой стороны, только двое «не-
беременных» покупателей заказали фолиевую кислоту.
Так что между заказом препаратов фолиевой кислоты и беременностью,
бесспорно, существует связь. Можно использовать эту простую зависимость
для сборки такого слабообучаемого классификатора:
Информация
о покупателе
Покупали ли
вы фолиевую
кислоту
НЕТ ДА
Не беременны Беременны
Покупали ли Вы
фолиевую
НЕТ кислоту? ДА
Средняя загрязненность:
Не беременны Беременны
0,89 * 0,49 + 0,11 * 0,04 = 44%
Обучим же ее!
Из обучающих данных вам нужно взять случайный набор строк и столбцов.
Простейший способ это сделать — перемешать столбцы как колоду карт, а за-
тем выбрать необходимое из верхнего левого угла таблицы.
Для начала скопируйте А2:U1002 из вкладки TD в верхнюю часть новой таб-
лицы под названием TD_BAG (названия признаков вам не понадобятся — нужны
только их порядковые номера из строки 2). Самый простой способ перемешать
TD_BAG — это добавить еще один столбец и одну строку, заполненные случай-
ными числами (с помощью оператора RAND/СЛЧИС). Сортировка по случайным
значениям слева направо и сверху вниз, а затем выбор нужного количества
из верхнего левого угла таблицы дает вам случайный набор строк и признаков.
7. Комплексные модели: огромная куча ужасной пиццы 301
•
признак может иметь значение 0, а Preganant — 1;
•
признак может иметь значение 0, а Preganant — 0;
•
признак может иметь значение 1, а Preganant — 1;
•
признак может иметь значение 1, а Preganant — 0.
=IF(I2/(I2+I3)>I4/(I4+I5),0,1)
=ЕСЛИ(I2/(I2+I3)>I4/(I4+I5),0,1)
=1–(I2/(I2+I3))^2-(I3/(I2+I3))^2
=1-(I4/(I4+I5))^2-(I5/(I4+I5))^2
306 Много цифр
Записываем победителя
Итак, витамины в моем варианте победили. У вас результат наверняка оказался
другим, и теперь следует его где-то записать.
Назовите ячейки N1 и N2 Winner и Pregnant Is. Вы сохраняете выигравшие де-
ревья в столбце О. Начните с сохранения номера выигравшего столбца в ячейке
О1. Это будет значение из промежутка I1:L1 с минимальной загрязненностью
(в моем случае это 8). Вы также можете скомбинировать формулы MATCH/ПОИСК-
ПОЗ и INDEX/ИНДЕКС, чтобы они нашли его за вас (более подробно о них рас-
сказано в главе 1):
7. Комплексные модели: огромная куча ужасной пиццы 307
=INDEX(I1:L1,0,MATCH(MIN(I10:L10),I10:L10,0))
=ИНДЕКС(I1:L1,0,ПОИСКПОЗ(МИН(I10:L10),I10:L10,0))
MATCH(MIN(I10:L10),I10:L10,0))/ПОИСКПОЗ(МИН(I10:L10),I10:L10,0))
находит столбец с минимальной загрязненностью в строке 10 и передает ин-
формацию функции INDEX/ИНДЕКС. Эта функция определяет положение назва-
ния соответствующего признака.
Аналогично в О2 можно определить, 0 или 1 ассоциируется с беременно-
стью — найти значение в строке 6 в столбце с минимальной загрязненностью:
=INDEX(I6:L6,0,MATCH(MIN(I10:L10),I10:L10,0))
=ИНДЕКС(I6:L6,0,ПОИСКПОЗ(МИН(I10:L10),I10:L10,0))
Как видите, с этим вторым дело пошло гораздо быстрее, чем с первым. Так
что продолжайте…
7. Комплексные модели: огромная куча ужасной пиццы 309
Скажем, вы хотите ансамбль из 200 моделей. Все, что вам нужно сделать, —
это повторить эти шаги еще 198 раз. Ничего невозможного, просто надоедает.
Почему бы вам просто не записать это действие в макрос и затем проигры-
вать его? Оказывается, перемешивание очень подходит для макроса.
Для тех, кто никогда не записывал макрос: это не что иное, как запись серии
повторяющихся нажатий на клавиши, чтобы потом можно было ее проиграть
вместо того, чтобы самому зарабатывать туннельный синдром.
Так что ищем на панели меню Вид Макрос (в MacOs Инструменты Мак-
рос) и выбираем «Начать запись».
Нажатие кнопки «Запись» откроет окно, в котором вы сможете дать своему
макросу название, например GetBaggedStump. Удобства ради проассоциируем
вызов макроса с комбинацией клавиш. У меня MacOS, так что все мои комби-
нации начинаются с Option + Cmd, к которым я хочу добавить Z, потому что
сегодня у меня такое настроение (рис. 7-15).
Нажмите ОК, чтобы начать запись. Вот шаги, которые нужны для создания
одноуровневого дерева решений:
Качество работы
Вы можете оценить эти прогнозы, используя те же параметры оценки ра-
боты и расчеты, что и в главе 6. Сначала создайте новый лист под названием
PerformanceBag. В первом столбце найдите максимальный и минимальный про-
гнозы. Для моих 200 деревьев эти значения получились равными 0,02 и 0,75.
Поместите в столбец В серию граничных значений от минимума до максимума
(в своем случае я сделал шаг равным 0,02). Точность, специфичность, доля поло-
жительных результатов и чувствительность вычисляются так же, как и в главе 6.
Таким образом получается лист, изображенный на рис. 7-20.
Обратите внимание на граничное значение прогноза 0,5 — при половине
деревьев, проголосовавших за беременность, вы можете идентифицировать
33 беременных покупателя с одним лишь процентом ложноположительных
результатов (напоминаю, что в вашем варианте это может быть совсем другое
граничное значение — ведь мы используем случайные числа). Весьма неплохо
для нескольких простых деревьев!
7. Комплексные модели: огромная куча ужасной пиццы 313
Кривая ошибок
100%
Действительно положительные значения
90%
80%
70%
60%
50%
40%
30%
20%
10%
0%
0%
%
%
%
%
%
%
%
%
%
0%
10
20
30
40
50
60
70
80
90
10
Ложноположительные значения
Бустинг:
если сразу не получилось,
бустингуйте и пробуйте снова
Давайте вспомним, зачем мы занимались бэггингом.
Если вы обучаете пачку деревьев поиска решений на полном наборе дан-
ных несколько раз, снова и снова, то они будут идентичны. Выбирая образцы
из базы данных случайным образом, вы вносите немного разнообразия в ваши
деревья и, в конце концов, находите такие нюансы в обучающих данных, кото-
рые одно дерево ни за что бы не обнаружило.
Бэггинг делает со случайным выбором то же самое, что бустинг делает с ве-
сами. Бустинг не выбирает случайные порции из набора данных — он исполь-
зует весь набор данных в каждой итерации обучения. Он фокусируется на об-
учении дерева решений, которое исправляет некоторые грехи, совершенные
предыдущими деревьями. Алгоритм таков:
•
Сначала все строки обучающих данных считаются одинаковыми. Все они
имеют одинаковый вес. В вашем случае есть 100 строк, и все они начинают
с весом 0,001. То есть в сумме все веса составляют единицу.
•
Оцените каждый признак на фоне остальных, чтобы выбрать лучшее дерево
решений. Кроме того, если мы применяем бустинг, а не бэггинг, то победит
дерево с минимальным взвешенным отклонением (погрешностью). Каждое
ложное предположение для возможного дерева считается штрафом, рав-
ным весу строки. Сумма этих штрафов и есть взвешенная погрешность.
Выберите дерево с минимальной взвешенной погрешностью.
•
Веса регулируются. Если выбранное дерево решений правильно предска-
зывает строку, то ее вес уменьшается. Если выбранное дерево решений
ошибается со строкой, то вес строки растет.
•
Новые деревья обучаются с помощью этих новых весов. Таким образом,
по ходу выполнения, алгоритм больше концентрируется на строках с об-
учающими данными, которые предыдущие деревья обработали плохо. Де-
ревья обучаются, пока взвешенное отклонение не достигнет порога.
Выбираем победителя
Поместите в ячейку W1 название Winning Error, а в Х1 найдите минимальное
значение взвешенной погрешности:
=MIN(C7:U7)
=МИН(C7:U7)
INDEX(C1:U1,0,MATCH(X1,C7:U7,0))
ИНДЕКС(C1:U1,0,ПОИСКПОЗ(X1,C7:U7,0))
Так как общая взвешенная погрешность дерева растет, выражение под зна-
ком натурального логарифма уменьшается и приближается к 1. А так как на-
туральный логарифм 1 равен 0, значение параметра альфа все уменьшается
и уменьшается. Посмотрим на это в таблице.
Назовите ячейку W4 Alpha, а в Х4 поместите взвешенную погрешность из Х1,
подставленную в расчет параметра альфа:
=0,5*LN((1-X1)/X1)
Для этого первого дерева значение альфа в итоге получается равным 0,207
(рис. 7-27).
альфа, если считает, что покупатель беременный, и –альфа, если нет. Так что
это первое дерево во время голосования в тестовых данных будет давать 0,207
каждому покупателю, не купившему противозачаточные и –0,207 каждому ку-
пившему. Итоговый прогноз ансамбля моделей — это сумма всех этих положи-
тельных и отрицательных значений параметра альфа.
Как вы увидите позже, чтобы определить общий прогноз беременности,
выданный моделью, нужно установить границу на сумму баллов конкретного
дерева. Поскольку в качестве своего вклада в прогноз каждое дерево выдает
либо положительное, либо отрицательное значение альфа, в качестве класси-
фикационного порога принято использовать 0, однако вы можете менять его,
дабы достичь большей точности.
Повторное взвешивание
Теперь, когда вы закончили с одним деревом, пришло время заново взвесить
обучающие данные. Для этого нужно узнать, какие строки данных это дерево
обрабатывает правильно, а какие — нет.
Поэтому в столбце V озаглавьте ячейку V9 Wrong. В V10 можно использовать
формулу OFFSET/СМЕЩ вместе с номером столбца выигравшего дерева (ячейка
Х2), чтобы найти взвешенную погрешность обучающей строки. Если погреш-
ность не нулевая, то значит, дерево неправильно обработало строку и в стол-
бец Wrong записывается единица:
=IF(OFFSET($C10,0,$X$2)>0,1,0)
=ЕСЛИ(СМЕЩ($C10,0,$X$2)>0,1,0)
=$B10*EXP($V10*$X$4)
=SUM(W6:HN6)
=СУММА(W6:HN6)
Скопируйте эту сумму на весь столбец. У вас получится лист вроде изобра-
женного на рис. 7-33. Баллы в столбце V больше нуля означают, что больше
альфа-взвешенных прогнозов ушло в положительном направлении, чем в от-
рицательном (рис. 7-33).
Кривая ошибок
100%
Действительно положительные значения
90%
Бустинговая
80%
Бэггинговая
70%
60%
50%
40%
30%
20%
10%
0%
0%
%
0%
10
20
30
40
50
60
70
80
90
10
Ложноположительные значения
что риск переподгонки данных немного выше. Так как каждое переписывание
обучающих данных основано на неверно классифицированных в предыдущей
итерации точках, в итоге можно оказаться в ситуации, когда обученные вами
классификаторы становятся чрезвычайно чувствительными к выбросам.
К тому же итеративное повторное взвешивание данных означает, что бу-
стинг, в отличие от бэггинга, не может быть запараллелен на несколько ком-
пьютеров или ядер процессора.
Таким образом, в гонке между хорошо подогнанными бустинговой и бэггин-
говой моделями последней победа оказалась не по зубам.
Подытожим
Только что на ваших глазах пачка простых моделей была скомбинирована бэг-
гингом или бустингом в ансамбль моделей. Эти методы, не известные аж до се-
редины девяностых, сегодня являются двумя самыми популярными техниками
моделирования, используемыми в бизнесе.
Вы можете подвергнуть бустингу или бэггингу любую модель, которую хо-
тите использовать как слабообучаемую. Эти модели совсем не обязательно со-
стоят из одноуровневых или любых других деревьев принятия решений. К при-
меру, последнее время широко обсуждается бустинг моделей наивного Байеса,
вроде того, с которым мы работали в главе 3.
328 Много цифр
Знакомство с временной
последовательностью данных
ЗАМЕТКА
На графике есть несколько пиков и спадов, что может быть признаком неко-
торой сезонности. В частности, пики спроса приходятся на месяцы с номерами
8. Прогнозирование: дышите ровно, выиграть невозможно 333
12, 24 и 36, которые оказываются декабрями. Но может быть это лишь случай-
ность или особенность тренда? Давайте выясним.
Медленный старт
с простым экспоненциальным сглаживанием
Методы экспоненциального сглаживания основываются на прогнозировании
будущего по данным из прошлого, где более новые наблюдения весят больше,
чем старые. Такое взвешивание возможно благодаря константам сглаживания.
Первый метод экспоненциального сглаживания, который мы опробуем, называ-
ется простым экспоненциальным сглаживанием (ПЭС, simple exponential smoothing,
SES). Он использует лишь одну константу сглаживания.
При простом экспоненциальном сглаживании предполагается, что ваш вре-
менной ряд данных состоит из двух компонентов: уровня (или среднего) и не-
коей погрешности вокруг этого значения. Нет никакого тренда или сезонных
колебаний — есть просто уровень, вокруг которого «висит» спрос, тут и там
окруженный небольшими погрешностями. Отдавая предпочтение более но-
вым наблюдениям, ПЭС может явиться причиной сдвигов этого уровня. Говоря
языком формул,
И еще один:
Настраиваем прогноз
простого экспоненциального сглаживания
Первое, что нужно сделать, — это создать новый лист в документе под назва-
нием SES. Вставьте временной ряд данных в столбцы А и В, начиная со строки 4,
чтобы оставить немного места наверху для значений альфа. Вы можете вве-
сти количество месяцев, которое у вас есть (36) в ячейку А2, а исходное зна-
чение альфа — в С2. Я начну с 0,5, потому что это число между 0 и 1 и оно мне
нравится.
Поместите расчет уровня в столбец С. Нужно вставить новую строку 5 во вре-
менной ряд данных вверху таблицы для исходного приближения уровня в мо-
мент времени 0. В С5 используйте следующий расчет:
=AVERAGE(B6:B17)
=СРЗНАЧ(B6:B17)
Эти средние значения данных за первый год дают исходный уровень. Таб-
лица с ними выглядит так, как показано на рис. 8-3.
336 Много цифр
Обратите внимание, что у меня перед альфой стоит значок $, поэтому при
распространении формулы на всю таблицу абсолютные ссылки на строку
8. Прогнозирование: дышите ровно, выиграть невозможно 337
Рястяните
Вы будете смеяться, но сделано уже практически все. Просто растяните С6:Е6
вниз на все 36 месяцев и — вуаля! — у вас есть уровень.
Добавим месяцы 37–48 в столбец А. Прогноз на следующие 12 месяцев — это
просто уровень36. Так что в В42 можно добавить только
=C$41
Для альфы, равной 0,5, оно получается равным 20,94 (рис. 8-7). Вспомнив пра-
вило 68–95–99,7 из обсуждения нормального распределения в главе 4, вы пой-
мете, что 68% погрешностей одношагового прогноза должны оказаться меньше
20,94 и больше –20,94.
Теперь ваша задача — сжать это распределение насколько возможно, найдя
подходящее значение альфы. Попробуйте несколько разных значений, исполь-
зуя «Поиск решения» в который раз в этой книге.
Настройка «Поиска решения» для этой операции чрезвычайно проста.
Откройте опцию, установите целевую функцию — стандартное отклонение
в ячейке F2, и переменную решения — альфа в С2, добавьте ограничение,
что С2 должна быть меньше 1, и поставьте галочку в поле, указывающем,
что решение должно быть неотрицательным. Рекурсивные расчеты уровня,
входящие в каждый расчет погрешности прогноза, очень нелинейны, по-
этому для оптимизации альфы нам придется воспользоваться эволюцион-
ным алгоритмом.
340 Много цифр
А теперь графика!
Лучший способ проверить наш прогноз — это нарисовать его диаграмму рядом
с графиком данных о спросе в прошлом и посмотреть, как спрогнозированный
спрос отличается от реального. Мне нравится вид простой диаграммы Excel. Для
начала выберите А6:В41, где расположены наши исторические данные, и про-
стую линейную диаграмму из вариантов, предложенных Excel.
Добавив график, кликните на нем правой кнопкой мыши, выберите «Выбрать
данные» и вставьте туда новую серию свежепредсказанных значений А42:В53.
Если хотите, добавьте также названия осей, после чего у вас получится что-то
похожее на рис. 8-9.
=INDEX(LINEST(B2:B37,A2:A37,TRUE,TRUE),1,1)
=ИНДЕКС(ЛИНЕЙН(B2:B37,A2:A37,ИСТИНА,ИСТИНА),1,1)
8. Прогнозирование: дышите ровно, выиграть невозможно 343
Получается уклон, равный 2,54, что означает тренд линии регрессии к по-
вышению спроса на 2,54 дополнительных меча в месяц. То есть уклон действи-
тельно есть. Но значим ли он статистически?
Чтобы проверить уклон критерием Стьюдента, нужно узнать стандартное
отклонение уклона и количество степеней свободы регрессии. LINEST/ЛИНЕЙН
помещает значения стандартного отклонения в строку 2, столбец 1 массива ре-
зультатов. К примеру, в В40 вы можете это написать как:
=INDEX(LINEST(B2:B37,A2:A37,TRUE,TRUE),2,1)
=ИНДЕКС(ЛИНЕЙН(B2:B37,A2:A37,ИСТИНА,ИСТИНА),2,1)
Рис. 8-10. Уклон и стандартное отклонение линии регрессии, подогнанное под исторический спрос
У вас должно получиться 34 степени свободы (как отмечено в главе 6, они рас-
считываются как 36 точек данных минус 2 коэффициента линейной регрессии).
344 Много цифр
Теперь известны все три значения для проверки критерием Стьюдента ста-
тистической значимости вашего подогнанного тренда. Так же, как и в 6 главе,
вы можете вычислить статистику этого критерия как абсолютную величину
уклона, разделенную на стандартное отклонение уклона. Рассчитайте величину
р для этой статистики из распределения Стьюдента с 34 степенями свободы,
воспользовавшись функцией TDIST/СТЬЮДРАСП в В42:
=TDIST(ABS(B39/B40),B41,2)
=СТЬЮДРАСП(ABS(B39/B40),B41,2)
Функция выдает значение р, близкое к 0, намекая на то, что если бы тренд был
не существующим в реальности (уклон 0), то ни при каких условиях мы бы не по-
лучили настолько отличающийся от регрессии уклон. Это показано на рис. 8-11.
уровень текущий период= уровень предыдущий период + тренд предыдущий период + альфа ×
× (спрос текущий период – (уровень предыдущий период + трендпредыдущий период))
346 Много цифр
Для этой новой техники сглаживания нам понадобится новое уравнение об-
новления тренда. Для первого шага оно будет таким:
Теперь вы можете обновить значение уровня в ячейке С6 — оно будет равно
предыдущему значению, к которому прибавлен предыдущий тренд и альфа,
умноженная на погрешность:
=C5+D5+C$2*F6
Тренд в D6 обновляется точно так же, только нужно еще прибавить гамму,
умноженную на альфу, умноженную на погрешность:
=D5+D$2*C$2*F6
Прогнозируем будущее
Чтобы прогнозировать дальше, чем на 36 месяцев, добавьте итоговый уровень
(который для альфы и гаммы, равных 0,5, будет равняться 281) к количеству
месяцев после 36-го, на которые вы хотите рассчитать прогноз, умноженному
на итоговое приближение тренда. Вы можете подсчитать количество месяцев
от 36 до нужного вам, вычтя один месяц в столбце А из другого.
8. Прогнозирование: дышите ровно, выиграть невозможно 349
Так что начнем с создания нового листа под названием Holt’s Autocorrelation.
Вставьте туда месяцы с 1 по 36 вместе с их одношаговыми погрешностями
из холтовского прогноза — в столбцы А и В.
Под погрешностями в В38 рассчитайте среднюю погрешность. Получив-
шийся лист показан на рис. 8-20.
Затем можно растянуть эту формулу вниз, чтобы получить все отклонения.
В ячейке С38 рассчитаем сумму квадратов отклонений:
=SUMPRODUCT($C2:$C37,C2:C37)
=СУММПРОИЗВ($C2:$C37,C2:C37)
Мультипликативное
экспоненциальное сглаживание Холта–Винтерса
Мультипликативное экспоненциальное сглаживание Холта–Винтерса является
логическим продолжением сглаживания Холта с корректировкой тренда. Оно
учитывает уровень, тренд и необходимость подгонки спроса вверх или вниз
на регулярной основе «в угоду» сезонным флуктуациям. Сезонные колебания
не обязательно имеют годовой цикл, как в нашем примере. В случае MailChimp
мы имеем периодические колебания спроса каждый четверг (похоже, четверг
считается отличным днем для отправки маркетинговых писем). С помощью
Холта–Винтерса мы можем учесть этот недельный цикл.
В большинстве случаев вы не можете просто взять и прибавить или отнять
от спроса какую-либо фиксированную сезонную величину ради подгонки про-
гноза. Если ваш бизнес растет от продаж в 200 мечей до 2000 каждый месяц,
добавление 20 штук в модель в качестве подгонки под рождественский всплеск
спроса — не очень хорошая идея. Нет, сезонные изменения обычно должны быть
результатом умножения. Вместо прибавления 20 мечей, возможно, стоило бы
умножить прогноз на 120%. Вот почему метод называется мультипликативным
(от multiplicate — умножать). Вот как этот прогноз представляет себе спрос:
Это значит, что если сейчас месяц 36 и вы прогнозируете на 3 следующих
месяца, до 39, то прогноз будет выглядеть так:
Да-да, все верно, там написано сезонность27. Это самое последнее прибли-
жение сезонной корректировки для марта. Нельзя использовать сезонность36,
потому что это — декабрь.
Покопаемся в обновлениях уравнений, начиная с этого уровня. Теоретиче-
ски вам нужен только исходный уровень0 и тренд0, но на самом деле потребу-
ется двенадцать исходных сезонных факторов, от сезонности–11 до сезонности0.
К примеру, обновленное уравнение для уровня1 основано на исходном се-
зонном приближении для января:
•
Сгладить исторические данные методом скользящего среднего 2 × 12.
•
Сравнить сглаженную версию временного ряда данных с оригиналом, чтобы
получить приблизительную оценку сезонности.
•
С помощью исходных приближений сезонности десезонировать истори-
ческие данные.
8. Прогнозирование: дышите ровно, выиграть невозможно 363
•
Найти приближения уровня и тренда с помощью линии тренда десезони-
рованных данных.
Эта техника сглаживания дала вам две (для каждого фактора сезонно-
сти) точечные оценки. Давайте узнаем среднее значение этих двух факторов
в столбце Е, что будет исходным сезонным фактором для Холта–Винтерса.
8. Прогнозирование: дышите ровно, выиграть невозможно 365
Например, в Е2, где находятся данные за январь, нужно взять среднее от двух
значений спроса за январь из столбца D, ячеек D8 и D26. Так как сглаженные
данные в столбце D начинаются от середины года, то растянуть формулу сред-
него нельзя. В Е8, где находятся данные за июль, нужно брать среднее от D8
и D20, к примеру.
Когда все эти 12 корректировок будут у вас в столбце Е, можно вычесть еди-
ницу из каждого из них в столбце F и отформатировать ячейки в проценты (вы-
делить их и правым щелчком мыши вызвать меню, в котором выбрать «Формат
ячеек»), чтобы увидеть, как эти факторы двигают спрос вверх или вниз каждый
месяц. Вы можете даже вставить столбчатую диаграмму этих значений в та-
блицу, как показано на рис. 8-30.
Теперь, когда у вас есть эти исходные сезонные корректировки, можно ис-
пользовать их для десезонализации временной последовательности данных.
366 Много цифр
Когда вся серия будет десезонализирована, можно провести через нее линию
тренда, а затем использовать уклон и свободный член в качестве начального
отрезка и тренда.
Для начала вставьте соответствующие значения сезонных корректировок
за каждый месяц от G2 до G37. Фактически вы вставляете Е2:Е13 три раза подряд
в столбец G (убедитесь, что вы вставляете только значения). В столбце Н разде-
лите исходную серию данных из столбца В на сезонные факторы из столбца G,
чтобы удалить приблизительный сезонный фактор из данных. Эта таблица по-
казана на рис. 8-31.
Теперь, как и на предыдущих листах, вам нужно вставить диаграмму
столбца Н и провести на ней линию тренда. Отобразив уравнение этой линии
на графике, вы получите исходное приближение тренда, равное 2,29 дополни-
тельных проданных мечей в месяц, и исходное приближение уровня, равное
144,42 (рис. 8-32).
Приступим к прогнозу
Теперь, когда у вас есть исходные значения всех параметров, настало время
создать новый лист под названием HoltWintersSeasonal, в строку 4 которого
для начала нужно вставить серию данных, точно так же, как и в двух рассмо-
тренных выше методах прогнозирования.
В столбцах C, D и E рядом с этой серией расположатся уровень, тренд и се-
зонные значения соответственно. Но на этот раз, в отличие от двух предыду-
щих, где нам нужно было вставить только одну пустую строку 5, мы вставляем
пустые строки с 5 по 16 и нумеруем их по месяцам относительно текущего —
от –11 до 0 в столбце А. Затем исходные значения из предыдущего листа можно
вставить в соответствующие ячейки, как показано на рис. 8-33.
В столбце F вы делаете одношаговый прогноз. Для периода 1 он равен пре-
дыдущему уровню в С16, сложенному с предыдущим трендом в D16. Но они оба
скорректированы соответствующими приближениями сезонности 12-ю стро-
ками выше в Е5. Таким образом, в F17 записано следующее:
=(C16+D16)*E5
=(C$52+(A53-A$52)*D$52)*E41
И наконец… оптимизация!
Вы думали, что уже все сделали? Увы! Пора установить параметры сглажива-
ния. Как и в предыдущих двух техниках, поместите сумму квадратов отклоне-
ний в ячейку G2, а стандартное отклонение — в Н2.
Операция отличается только тем, что параметров сглаживания три, поэтому
стандартное отклонение рассчитывается как
=SQRT(G2/(36–3))
=КОРЕНЬ(G2/(36–3))
Бах! Так как выше критической точки 0,33 нет автокорреляций, вы понимаете,
что модель неплохо поработала над пониманием структуры значений спроса.
Растяните эту формулу до В64, чтобы получить величины спроса на все 12 ме-
сяцев (рис. 8-43).
Выполнив этот сценарий и обновив страницу, вы получаете новые значе-
ния спроса. Можно генерировать различные сценарии будущего спроса, про-
сто копируя и вставляя один сценарий куда угодно, а затем наблюдая за меня-
ющимися значениями.
Начните с называния ячейки А69 Simulated Demand, а ячеек А70:L70 — по ме-
сяцам, с 37 по 48. Это можно сделать простым копированием А53:А64 и специ-
альной вставкой транспонированных значений в А70:L70.
Точно так же вставьте специальной вставкой транспонированные значения
первого сценария спроса в А71:L71. Чтобы вставить второй сценарий, кликните
правой клавишей мышки на строке 71 и выберите «Вставить» — так появится
пустая строка 71. Теперь воспользуйтесь специальной вставкой и заполните ее
другими симулированными значениями спроса (они должны были обновиться,
когда вы вставляли предыдущую последовательность).
376 Много цифр
•
Вставка пустой строки 71.
•
Копирование В53:В64.
•
Специальная вставка транспонированных значений в строку 71.
•
Нажатие кнопки остановки записи.
Это даст вам 97,5-й персентиль спроса на данный месяц. В моей таблице он
получается около 264. А в А67 можно получить 2,5-й персентиль:
=PERCENTILE(A71:A1070,0.025)
=ПЕРСЕНТИЛЬ(A71:A1070,0.025)
Самое замечательное в этой диаграмме то, что она передает и прогноз, и ин-
тервалы на одной простой картинке. Эх, можно было наложить и 80%-ный ин-
тервал, было бы больше оттенков серого! На графике есть два интересных
момента:
•
Погрешность со временем становится шире. В этом есть смысл. Неуверен-
ность накапливается с каждым месяцем.
•
Точно так же погрешность растет и в частях, приходящихся на периоды
сезонного повышения спроса. С последующим его падением погрешность
сжимается.
8. Прогнозирование: дышите ровно, выиграть невозможно 381
Подытожим
Эта глава оказалась чрезвычайно богатой на новые техники и приемы:
•
простое экспоненциальное сглаживание;
•
выполнение проверки критерия Стьюдента на линейной регрессии, чтобы
удостовериться в линейном тренде последовательности данных;
•
холтовское экспоненциальное сглаживание с корректировкой тренда;
•
расчет автокорреляций и построение коррелограммы с критическими зна-
чениями;
•
выполнение мультипликативного экспоненциального сглаживания Холта–
Винтерса с помощью скользящего среднего 2 × 12;
•
прогнозирование сглаживанием Холта–Винтерса;
•
создание прогностических интервалов вокруг прогноза с помощью симу-
ляции Монте-Карло;
•
отображение прогностических интервалов на диаграмме с областями.
Если вам удалось дойти до конца главы вместе со мной — браво! Кроме шу-
ток, слишком много прогнозирования для одной главы.
Тем, кто хочет дополнительно позаниматься прогнозированием, рекомендую
несколько прекрасных учебников. Я очень люблю Forecasting, Time Series, and
Regression, Bowerman et al. (Cengage Learning, 2004). Отличный бесплатный он-
лайновый учебник есть у Хайндмана http://otexts.com/fpp/, а его блог с чудес-
ным названием Hyndsight очень интересно почитать. Если появляются вопросы,
их можно задавать в этом сообществе: http://stats.stackexchange.com/.
Что касается производственного прогнозирования, то эта область содержит
бесконечное множество объектов прогнозирования. Для тех, что попроще, до-
статочно и Excel. Если же у вас тысячи объектов или единиц складского учета,
то в этом случае лучше, конечно, использовать немного кода.
Прекрасные пакеты для прогнозирования есть в SAS и R. В R они написаны
самим Хайндманом (см. главу 10), который подвел статистический фундамент
под определение прогностических интервалов в методах экспоненциального
сглаживания.
Ну, вот и все! Надеюсь, теперь вы чувствуете в себе необходимую дозу уве-
ренности, чтобы идти дальше и «организовывать свое невежество»!
Определение выбросов:
9 выделяющиеся не значит
важные
Когда-то давно, в 1940-х годах, один британец по имени мистер Хадлум ушел
на войну. Энное количество дней спустя (349, если быть точным) его жена, мис-
сис Хадлум, родила. В среднем беременность длится 266 дней. Таким образом
получается, что миссис Хадлум носила ребенка лишних 12 недель. Исключи-
тельно долгая беременность, не правда ли?
Именно так и утверждала миссис Хадлум.
Но мистер Хадлум тоже был не лыком шит и настаивал, что в деле заме-
шан другой мужчина, с которым миссис Хадлум встречалась в его отсутствие:
349-дневная беременность — аномалия, которую трудно оправдать статисти-
ческим распределением продолжительности.
При наличии подобных данных наверняка можно быстренько определить,
стоит ли считать выбросом интересный случай миссис Хадлум?
Исследования показали, что продолжительность беременности — величина
с более-менее нормальным распределением со средним значением в 266 дней
после оплодотворения и стандартным отклонением около 9. Так что можно вы-
числить значение функции нормального интегрального распределения, упоми-
навшегося в главе 4, и получить вероятность, меньшую требуемых 349. В Excel
это легко сделать с помощью функции NORMDIST/НОРМРАСП:
=NORMDIST(349,266,9,TRUE)
=НОРМРАСП(349,266,9,ИСТИНА)
Эта функция требует выбора интересующего вас случая, его среднего, стан-
дартного распределения и отметки TRUE/ИСТИНА, которая заставит функцию
выдать интегральное значение.
Формула все время выдает 1,000, сколько бы знаков после запятой Excel я
ни рассчитал. Это значит, что почти все дети, рожденные от настоящего мо-
мента до бесконечности, будут рождены на 349-й день или раньше. Вычитаем
это значение из 1:
=1-NORMDIST(349,266,9,TRUE)
=1-НОРМРАСП(349,266,9,ИСТИНА)
Границы Тьюки
Концепция того, что выбросы — это маловероятные точки на колоколообраз-
ной кривой, методом проб и ошибок привела к границам Тьюки. Их легко про-
верить и легко программировать. Они используются в статистических пакетах
по всему миру для идентификации и удаления сомнительных точек данных из
любого ряда, соответствующего нормальной колоколообразной кривой.
Метод Тьюки заключается в следующем:
•
Рассчитать 25-й и 75-й персентиль любого ряда данных, в котором вы хо-
тите найти выбросы. Эти значения также называются первым и третьим
квартилями. Excel вычисляет их значения с помощью функции PERCENTILE/
ПЕРСЕНТИЛЬ.
•
Вычесть первый квартиль из третьего — получится мера распределе-
ния данных, называемая межквартильным размахом (МР). МР прекрасен
своей относительной устойчивостью к экстремальным значениям меры
распределения (то есть робустный), в отличие от обычного расчета стан-
дартного распределения, которым вы пользовались в предыдущих гла-
вах этой книги.
•
Вычесть 1,5 × МР из первого квартиля и получить нижнюю внутреннюю
границу. Прибавить 1,5 × МР к третьему квартилю и получить верхнюю вну-
треннюю границу.
•
Точно так же вычесть 3 × МР из первого квартиля, чтобы получить нижнюю
внешнюю границу. Прибавить 3 × МР к третьему квартилю, чтобы получить
верхнюю внешнюю границу.
•
Любое значение, меньшее нижней границы или выше верхней, экстре-
мально. В данных с нормальным распределением вы увидите одну точку
на 100 снаружи внутренней границы, и только одну на 500 000 точек за
пределами внешней границы.
=PERCENTILE(A2:A1001,0.5)
=ПЕРСЕНТИЛЬ(A2:A1001,0.5)
Это будет 50-й персентиль. Под медианой вычислите первый и третий квар-
тили:
=PERCENTILE(A2:A1001,0.25)
=PERCENTILE(A2:A1001,0.75)
=ПЕРСЕНТИЛЬ(A2:A1001,0.25)
=PERCENTILE(A2:A1001,0.75)
=D3-D2
=D2–1.5*D4
=D3+1.5*D4
=D2–3*D4
=D3+3*D4
А я — выброс!
размер выплат более 20% сверху, больше похожий на выброс, то Мейдофф стал
предлагать скромные надежные выплаты, смешивающиеся с шумом каждый
год — он не перепрыгивал никаких границ Тьюки. Но постепенно эти выплаты
из-за своей надежности превратились в многомерный выброс.
Так как же находить выбросы в случае многомодельности, многомерности
данных (это все можно назвать простыми словами «данные из реального мира»)?
Один чудесный способ решения этого вопроса — отнестись к данным как
к графу (см. поиск кластеров данных в главе 5). Задумайтесь над этим. Что опре-
деляет Гимли как выброс относительно остальных точек данных — это рассто-
яние от него до них относительно расстояния между ними самими.
Все эти расстояния, от одной точки до другой, определяют ребра графа. С его
помощью можно «выманить» изолированные точки. Для этого нужно начать с
создания графа k ближайших соседей и плясать от него.
и сколько раз он оставлял запрос на замену смен или был добрым самаритя-
нином и шел навстречу просьбам коллег.
Все эти данные на каждого из 400 сотрудников службы поддержки содер-
жатся у вас в таблице. Вопрос в том, кто из них является выбросом и какие вы-
воды о его работе можно сделать? Есть ли плохиши, проскользнувшие между
теми, кто не подходит по требованиям жетона, и минимальным клиентским
рейтингом? Возможно, выбросы подскажут, как сформулировать новые, более
эффективные инструкции.
Открыв электронную таблицу для этого раздела главы (SupportCenter.xlsx
можно скачать на сайте книги www.wiley.com/go/datasmart), вы найдете все
эти данные слежки за служащими во вкладке SupportPersonnel (рис. 9-5).
•
вычесть среднее значение столбца из каждого наблюдения;
•
разделить каждое наблюдение на стандартное отклонение столбца.
392 Много цифр
Создаем граф
Граф есть не что иное как ребра и вершины. В нашем случае каждый работник
является вершиной, и для начала можно просто провести ребра между ними
всеми. Длина ребра — это евклидово расстояние между двумя работниками
в их нормализованных данных.
Как вы помните из главы 2, евклидово расстояние (оно же расстояние пти-
чьего полета) между двух точек — это квадратный корень из суммы квадратов
разниц каждого столбца для каждого из них.
В новой вкладке Distances создайте матрицу расстояний между сотрудни-
ками точно так же, как в главе 2 — с помощью формулы OFFSET/СМЕЩ.
Пронумеруйте сотрудников от 0 до 399 начиная с А3 вниз и от С1 вправо.
(Подсказка: начните печатать 0, 1 и 2 в первых трех ячейках, а затем выделите
их и растяните в нужном направлении. Excel заполнит их за вас — он вполне
способен с этим справиться.) Рядом с этими числами вставьте персональные
номера сотрудников (специальной вставкой с транспонированием столбцов).
Так получается пустая матрица, изображенная на рис. 9-8.
9. Определение выбросов: выделяющиеся не значит важные 395
Заметьте, что этот расчет основан на формуле массива из-за отличия строк
друг от друга. Поэтому нажмите Ctrl+Shift+Enter (Command+Return в MacOS),
и все заработает.
Евклидово расстояние работника 144624 до самого себя действительно
равно 0. Раскопируйте эту формулу до OL2, а потом выделите этот промежу-
ток и кликните дважды в нижнем углу, размножив таким образом вычисление
до самой OL402. Так получится таблица, показанная на рис. 9-9.
Вот и все! У вас есть граф сотрудников. Можете экспортировать его в Gephi
как в главе 5, и взглянуть на то, что получится, но так как у него 16 000 ребер
и только 400 вершин, это наверняка жуткая картина.
Подобно тому, как в главе 5 вы конструировали граф r-окрестности из ма-
трицы расстояний, в данной главе мы сфокусируемся лишь на k ближайших
соседей каждого сотрудника, чтобы найти выбросы.
Первый шаг — ранжирование, то есть расположение работников согласно
расстояниям относительно друг друга. Это приводит нас к первому и основ-
ному методу выделения выбросов на графе.
Эта –1 в конце и дает нам расстояние до самого себя, равное 0, а не 1. Об-
ратите внимание, что столбцы с С по OL вкладки Distances имеют абсолютные
ссылки, что позволяет вам копировать формулу вправо.
Копируя ее таким образом в первую правую ячейку, С2, вы ранжируете ра-
ботника 142619 относительно его расстояния до работника 144624:
=RANK(Distances!D3,Distances!$C3:$OL3,1)-1
=РАНГ(Distances!D3,Distances!$C3:$OL3,1)-1
В результате получаем ранг 194 из 400, то есть этих двоих ребят нельзя на-
звать хорошими друзьями (рис. 9-10).
На этот раз есть один небольшой нюанс. По одной этой таблице видно, что
плохой работник, 143604, оказывается существенно дальше, чем 137155, и оба
эти значения сильно превосходят следующее по величине значение, равное 3,53.
Все же у этого метода есть недостаток, показанный на рис. 9-16. Исполь-
зование одного k-расстояния дает чувство глобальной принадлежности
9. Определение выбросов: выделяющиеся не значит важные 403
Рис. 9-17. Треугольник не настолько далек от своих соседей, как далеки они друг от друга
Начнем с достижимости
Перед тем, как свести вместе все факторы локальных выбросов для каждого
сотрудника, нужно рассчитать еще одну последовательность чисел — расстоя-
ние достижимости.
Расстояние достижимости сотрудником А сотрудника В — это обычное рас-
стояние между ними, пока А не оказывается по соседству с В, то есть удален-
ным на k-расстояние, которое и превращается в таком случае в расстояние до-
стижимости.
Другими словами, если А попадает в окрестность точки В, вы округляете
расстояние от А до В до размера окрестности, а если же нет — то просто остав-
ляете без изменений.
Использование расстояния достижимости вместо обычного расстояния при
расчете ФЛВ помогает немного стабилизировать вычисления.
9. Определение выбросов: выделяющиеся не значит важные 405
остальные соседи с такой точки зрения. Если я живу в 30 километрах от го-
рода, мои ближайшие соседи могут считать меня деревенщиной, но сами они
в то же время считаются среди односельчан членами одного сообщества. Это
значит, что локально я в большей степени выброс, чем мои соседи. Нужно за-
печатлеть этот феномен.
Эти значения держатся на средней достижимости каждого сотрудника его
k ближайшими соседями.
=SUM(IF(Rank!B2:OK2<=’K-Distance’!B$1,1,0)*IF(Rank!B2:
OK2>0,1,0)*‘Reach-dist’!B4:OK4)/’K-Distance’!B$1}
=СУММ(ЕСЛИ(Rank!B2:OK2<=’K-Distance’!B$1,1,0)*ЕСЛИ(Rank!B2:
OK2>0,1,0)*‘Reach-dist’!B4:OK4)/’K-Distance’!B$1}
Сначала мы выполним расчет ФЛВ для сотрудника 144624 в ячейке С2. Как
и в предыдущих расчетах, оператор IF//ЕСЛИ дает нам вектор из единиц для
пяти ближайших соседей 144624:
IF(Rank!B2:OK2<=’K-Distance’!B$1,1,0)*IF(Rank!B2:OK2>0,1,0)
ЕСЛИ(Rank!B2:OK2<=’K-Distance’!B$1,1,0)*ЕСЛИ(Rank!B2:OK2>0,1,0)
IF(Rank!B2:OK2<=’K-Distance’!B$1,1,0)*IF
(Rank!B2:OK2>0,1,0)*B2/TRANSPOSE(B$2:B$401)
ЕСЛИ(Rank!B2:OK2<=’K-Distance’!B$1,1,0)*ЕСЛИ
(Rank!B2:OK2>0,1,0)*B2/ТРАНСП(B$2:B$401)
Подытожим
Между главой о модулярности графа и данной главой про определение выбро-
сов вы столкнулись с мощью анализа данных на графе, то есть с соотнесением
расстояний и ребер между наблюдениями.
В отличие от глав про кластеризацию, где группы изучались на предмет на-
личия общего признака, здесь данные исследовались на предмет точек, нахо-
дящихся вне групп. Вы были свидетелями простой силы степени полузахода,
демонстрирующей, кто влиятелен, а кто изолирован.
Больше информации об определении выбросов можно найти в обзоре SIAM
2010, скомпилированном Кригелем, Крогером и Зимеком, по адресу конферен-
ции SIAM http://www.siam.org/meetings/sdm10/tutorial3.pdf. Там показаны
все техники из этой главы, а также несколько других.
Обратите внимание, что эти модели, в отличие от других, не требуют ника-
кого изнурительного процесса. Для получения ФЛВ существует конечное ко-
личество шагов, так что их довольно просто программировать для промыш-
ленных нужд вместе с базами данных.
Если вы ищете подходящий язык программирования для этих целей — R
отлично подойдет. Функция bplot строит ящичковые диаграммы данных со
встроенными границами Тьюки. Способность отображать последние графиче-
ски в Excel так ужасна, что я даже не буду пробовать описать ее в этой книге.
Пакет DmwR для R (который сопровождает чудесную книгу Торго Data Mining
with R [Chapman and Hall, 2010]) содержит ФЛВ в функции под названием lofactor.
Для построения и анализа степени вершин на графе также есть отличный па-
кет для R — igraph.
Переходим от таблиц
10 к программированию
книга — не из разряда «выбери себе приключение». Дочитывайте то, что не до-
читали, и возвращайтесь!
Чтобы система вывела вам текст или содержимое файла, вызывайте функ-
цию print. Еще можно задавать ей арифметические выражения, а она будет вы-
числять результат. А вот моя стандартная схема работы:
10. Переходим от таблиц к программированию 413
•
Загрузить данные в R.
•
Поделать с ними разные научные штуки.
•
Вытащить результаты из R, чтобы другие люди или процессы могли ими
пользоваться.
Пошевелим пальцами
Самый простой способ поместить данные в R — точно такой же, как и в Excel.
Введение данных вручную и запись нажатий клавиш. Можете начать с сохра-
нения одного значения в переменной:
> almostpi <- 355/113
> almostpi
[1] 3.141593
> sqrt(almostpi)
[1] 1.772454
ЗАМЕТКА
> someprimes[which(someprimes<7)]
[1] 12 3 5
Двумерные матрицы
Векторы, с которыми мы забавлялись до этого, были одномерными. Есть кое-что
чуть больше похожее на электронную таблицу — это матрица, двумерный мас-
сив чисел. Можно построить ее функцией matrix:
>amatrix<-matrix(data=c(someprimes,primestimes2),nrow=2,ncol=6)
>amatrix
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 3 7 2 6 14
[2,] 2 5 11 4 10 22
> t(amatrix)
[,1] [,2]
[1,] 1 2
[2,] 3 5
[3,] 7 11
[4,] 2 4
[5,] 6 10
[6,] 14 22
$age
[1] "ancient"
$height
[1] 72
$spawn
[1] 3
$spawn_ages
[1] 0.5 2.0 5.0
> str(bonddata)
'data.frame': 6 obs. of 5 variables:
$bondnames : Factor w/ 6 levels "brosnan","connery:
2 5 6 4 1 3
$firstyear : num 1962 1969 1973 1987 1995 ...
$eyecolor : Factor w/ 3 levels "blue","brown":
2 2 1 3 1 1
$womenkissed : num 17 3 20 4 12 4
$countofbondjamesbonds : num 3 2 10 2 5 1
> summary(bonddata)
bondnames firstyear eyecolor womenkissed countofbondjamesbonds
brosnan:1 Min. :1962 blue :3 Min. : 3.00 Min. : 1.000
connery:1 1st Qu.:1970 brown:2 1st Qu.: 4.00 1st Qu.: 2.000
craig :1 Median :1980 green:1 Median : 8.00 Median : 2.500
dalton :1 Mean :1982 Mean :10.00 Mean : 3.833
lazenby:1 3rd Qu.:1993 3rd Qu.:15.75 3rd Qu.: 4.500
moore :1 Max. :2006 Max. :20.00 Max. :10.000
ЗАМЕТКА
Файл CSV, использованный в этой части, WineKMC.csv, можно загрузить на сайте книги,
www.wiley.com/go/datasmart.
6 0 0 0 0 0 0 0 0 0 0
7 0 0 0 1 1 0 0 0 0 1
8 0 0 0 0 0 0 0 1 1 0
9 0 1 0 0 0 0 0 0 0 0
10 0 0 0 0 1 1 0 0 0 0
Бах! NA превратились в 0.
library(skmeans)
> ncol(winedata)
[1] 107
> winedata.transposed <- t(winedata[,8:107])
> winedata.transposed[1:10,1:10]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8][,9] [,10]
Adams 0 0 0 0 0 0 0 0 0 0
Allen 0 0 0 0 0 0 0 0 1 0
Anders 0 0 0 0 0 0 0 0 0 0
Bailey 0 0 0 0 0 0 1 0 0 0
Baker 0 0 0 0 0 0 1 0 0 1
Barnes 0 0 0 0 0 0 0 0 0 1
Bell 0 1 0 0 0 0 0 0 0 0
Bennett 0 0 0 0 0 0 0 1 0 0
Brooks 0 0 1 0 0 0 0 1 0 0
Brown 0 0 0 0 0 0 1 0 0 0
Более того, если понадобится, вы можете выписать все эти кластерные от-
несения функцией write.csv(). Воспользуйтесь ?, чтобы узнать, как она ра-
ботает. Спойлер: очень похоже на read.csv().
Во время работы с Excel вы «расшифровывали» кластер, понимая поведение
параметров описания сделок, определяющих их. Вы считали общее количе-
ство сделок, совершенных в каждом кластере, и сортировали их. Как сделать
что-то подобное в R?
Для выполнения расчетов подойдет aggregate(), где в поле «by» нужно
выбрать конкретные элементы кластера — то есть «собрать (aggregate — англ.)
заказы по элементам». Также выберете тип группировки по своему желанию:
сумму по сравнению со средним, минимумом, максимумом, медианой и т. д.:
aggregate(winedata.transposed,
by=list(winedata.clusters$cluster),sum)
VI0 1 4 1 0 1
VI1 0 7 1 4 1
V12 1 3 0 0 1
V13 0 0 2 0 4
V14 0 3 0 6 0
VI5 0 3 0 3 0
V16 1 1 0 3 0
V17 7 0 0 0 0
V18 0 1 4 0 9
VI9 0 4 1 0 0
V20 0 2 0 4 0
V21 0 1 1 1 1
V22 0 17 2 2 0
V23 1 1 0 3 0
V24 12 0 0 0 0
V25 0 3 0 3 0
V26 12 0 0 3 0
V27 1 4 1 3 0
V28 0 5 0 0 1
V29 0 1 4 0 12
V30 0 4 4 1 13
V31 0 16 1 0 0
V32 0 2 0 2 0
> winedata.desc.plus.counts[order(-winedata.desc.plus.counts[,8]),]
Offer Mth Varietal MinQty Disc Origin PastPeak 1 2 3 4 5
V24 24 Sept Pinot Noir 6 34 Italy FALSE 12 0 0 0 0
V26 26 Oct Pinot Noir 144 83 Australia FALSE 12 0 0 3 0
V2 2 Jan Pinot Noir 72 17 France FALSE 7 3 0 0 0
V17 17 Jul Pinot Noir 12 47 Germany FALSE 7 0 0 0 0
VI 1 Jan Malbec 72 56 France FALSE 2 5 0 3 0
VI0 10 Apr Prosecco 72 52 CA FALSE 1 4 1 0 1
V12 12 May Prosecco 72 83 Australia FALSE 1 3 0 0 1
V16 16 Jun Merlot 72 88 CA FALSE 1 1 0 3 0
V23 23 Sept Chardonnay 144 39 S. Africa FALSE 1 1 0 3 0
V27 27 Oct Champagne 72 88 NZ FALSE 1 4 1 3 0
V3 3 Feb Espumante 144 32 Oregon TRUE 0 2 3 0 1
V4 4 Feb Champagne 72 48 France TRUE 0 5 1 6 0
10. Переходим от таблиц к программированию 429
> setwd("/Users/johnforeman/datasmartfiles")
> winedata <- read.csv("WineKMC.csv")
> winedata[is.na(winedata)] <- 0
> install.packages("skmeans",dependencies = TRUE)
> library(skmeans)
> winedata.transposed <- t(winedata[,8:107])
> winedata.clusters <- skmeans(winedata.transposed, 5, method="genetic")
> winedata.clustercounts <-
t(aggregate(winedata.transposed,by=list(winedata.clusters$cluster),sum)
[,2:33])
> winedata.desc.plus.counts <-cbind(winedata[,1:7],winedata.clustercounts)
> winedata.desc.plus.counts[order(-winedata.desc.plus.counts[,8]),]
430 Много цифр
ЗАМЕТКА
Call:
glm(formula = PREGNANT ~., family = binomial("logit"),
data = PregnancyData)
Deviance Residuals:
Min IQ Median 3Q Max
-3.2012 -0.5566 -0.0246 0.5127 2.8658
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.343597 0.180755 -1.901 0.057315 .
Implied.GenderM -0.453880 0.197566 -2.297 0.021599 *
Implied.GenderU 0.141939 0.307588 0.461 0.644469
Home.Apt..PO.BoxH -0.172927 0.194591 -0.889 0.374180
Home.Apt..PO.BoxP -0.002813 0.336432 -0.008 0.993329
Pregnancy.Те st 2.370554 0.521781 4.543 5.54e-06 ***
Birth-Control -2.300272 0.365270 -6.297 3.03e-10 ***
Feminine.Hygiene -2.028558 0.342398 -5.925 3.13e-09 ***
Folic.Acid 4.077666 0.761888 5.352 8.70e-08 ***
Prenatal.Vitamins 2.479469 0.369063 6.718 1.84e-ll ***
Prenatal.Yoga 2.922974 1.146990 2.548 0.010822 *
Body.Pillow 1.261037 0.860617 1.465 0.142847
10. Переходим от таблиц к программированию 433
Синтаксис в целом такой же, как и при вызове функции glm() (выполните
?randomForest, чтобы узнать больше о подсчете деревьев и глубине). Обратите
внимание на значение importance=TRUE в вызове. Это позволит вам графически
отобразить важность переменных с помощью другой функции, varImpPlot(),
которая поможет понять, какие переменные важны, а какие не стоят внимания.
Пакет randomForest позволяет оценить вклад каждой переменной в сниже-
ние средней загрязненности. Чем он больше, тем важнее переменная. Можете
воспользоваться этим, чтобы выбрать и убрать переменные, которые могут вам
понадобиться для другой модели. Чтобы взглянуть на эти данные, используйте
функцию varImpPlot() с type=2, ранжируя их согласно расчету загрязнен-
ности, приведенному в главе 7 (не стесняйтесь использовать команду ?, чтобы
прочитать о разнице между type=1 и type=2):
varlmpPlot(Pregnancy.rf, type=2)
Вызвав predict дважды, вы увидите, что оба раза она работала с разными
моделями, тестовыми данными и параметрами type, необходимыми данной
модели. В случае линейной модели type="response" устанавливает значения
прогноза между 0 и 1, как исходные значения PREGNANT. При работе со случай-
ным лесом type="prob" обеспечивает нам уверенность в том, что в итоге мы
получим классовые вероятности — два столбца данных: в одном вероятность
покупателя оказаться беременным, в другом — «не-беременным».
10. Переходим от таблиц к программированию 435
Maternity.Clothes "0"
PREGNANT "I"
> t(PregnancyData.Test.lm.Preds[1])
1
[1,] 0.6735358
> PregnancyData.Test.rf.Preds[1,2]
[1] 0.504
ЗАМЕТКА
Прогнозирование в R
ЗАМЕТКА
Файл CSV, использованный в этом разделе, можно скачать с сайта книги, www.wiley.
com/go/datasmart.
26 218
27 185
28 199
29 210
30 193
31 211
32 208
33 216
34 218
35 264
36 304
Отлично!
Также можно построить график:
> plot(sword.ts)
> install.packages("forecast",dependencies=TRUE)
> library(forecast)
> sword.forecast <- forecast(sword.ts)
Определение выбросов
ЗАМЕТКА
> summary(PregnancyDuration)
GestationDays
Min. :240.0
1st Qu. :260.0
Median :267.0
Mean :266.6
3rd Qu. :272.0
Max. :349.0
ShiftSwapsReq ShiftSwapsOffered
Вот и все!
Подытожим
Мы с вами только что провели быструю и яростную гонку по просторам R, ис-
ход которой зависит от трех составляющих. Это:
•
загрузки и работа с данными в R;
•
поиск и установка необходимых пакетов;
•
вызов функций для вашего набора данных из этого пакета.
•
Beginning R: The Statistical Programming Language by Mark Gardener (John
Wiley & Sons, 2012).
•
R in a Nutshell, 2nd Edition by Joseph Adler (O’Reilly, 2012).
•
Data Mining with R: Learning with Case Studies by Luis Torgo (Chapman and
Hall, 2010).
•
Machine Learning for Hackers by Drew Conway and John Myles White (O’Reilly,
2012).
Вперед, вгрызайтесь в R!
Заключение
Все, кто меня хорошо знает, в курсе, что я — не самая светлая голова. Мои
математические способности довольно средние, но я видел, как парни гораздо
умнее меня терпят оглушительное фиаско как профессиональные аналитики.
Проблема в том, что, несмотря на свой ум, они не знают мелочей, способных
стать причиной провала технических новаций в бизнес-среде. Уделив внима-
ние подобным вещам, которые могут привести к успеху или, наоборот, к краху
вашего аналитического проекта, а порой и карьеры.
Подход к проблеме
Мой любимый фильм всех времен — это «Тихушники» 1992 года. Главные герои —
банда тестировщиков уязвимости под началом Роберта Редфорда — крадут
«черный ящик», который можно вскрыть с помощью шифрования RSA. Далее
следует бурное веселье. (Если вы его не смотрели, то я вам завидую, потому
что у вас есть возможность посмотреть его в первый раз!)
В одной из сцен Роберт Редфорд обнаруживает электронную клавиатуру
на закрытой двери офиса в аналитическом центре, в который ему нужно про-
рваться.
Связь с командой, ждущей в фургоне снаружи, он держит через наушники
и микрофон.
«Кому-нибудь доводилось взламывать электронную клавиатуру?» — спра-
шивает он.
«Это нереально!» — восклицает Сидней Пуатье. Но Дэна Эйкройда, сидящего
с ним в фургоне, осеняет идея. Ее незамедлительно транслируют Редфорду в
микрофон.
Редфорд кивает головой, говорит: «Хорошо, попробую!» и… просто выби-
вает дверь.
Понимаете, проблема состояла вовсе не во взломе электронной клавиатуры.
Она состояла в попадании в комнату. Дэн Эйкройд понимал это.
Понять, какую именно проблему предстоит решить, и есть фундаментальная
задача аналитики. Вы должны изучить ситуацию, процессы, данные и обстоя-
тельства. Вы должны охарактеризовать все, что касается задачи, насколько это
возможно, чтобы точно определить, каким будет идеальное решение.
В науке о данных мы часто сталкиваемся с «плохо поставленными задачами»:
•
У кого-то в бизнесе возникает проблема.
•
Он использует прошлый опыт и (недостаточные?) аналитические знания
для описания задачи.
•
Со своей концепцией проблемы он идет к аналитику, выдавая ее за хорошо
поставленную задачу.
Заключение 453
•
Аналитик принимает его версию и решает проблему как есть.
Такой подход может сработать. Но он не идеален, потому что задача, кото-
рую просят решить, часто не несет решения проблемы. А вот если эта задача
действительно про ту проблему, то профессиональный аналитик просто не мо-
жет остаться в стороне.
Нельзя решать проблемы в том виде, в котором они встречаются в бизнес-
среде. Если вы носите гордое звание аналитика, никогда не позволяйте себе
руководствоваться чужим видением. Найдите общий язык с заказчиками, над
чьими проблемами вы работаете, дабы убедиться, что вы решаете нужную за-
дачу. Изучите бизнес-процессы, сгенерированные и сохраненные данные. По-
интересуйтесь, как подобные задачи решаются сегодня и какие параметры при
этом используются (или игнорируются), приводя в итоге к успеху.
Решайте правильную, хотя порой и искаженную задачу. Никакая математи-
ческая модель не может крикнуть: «Эй, ты отлично сформулировал эту опти-
мизационную модель, но, мне кажется, тебе не стоит городить огород, а лучше
вернуться на шаг назад и внести небольшие изменения в свой бизнес». Поэтому
учитесь общаться!
Сложность
Много лет назад я работал над оптимизационной моделью цепи снабжения од-
ной компании, входящей в Fortune 500. Честно сказать, это была бестолковая
модель. Понабрав бизнес-правил всех мастей от заказчика, мы смоделировали
по ним полный процесс снабжения как смешанно-целочисленную программу.
Мы даже спрогнозировали нормально распределенный будущий спрос, причем
новаторски, за что нас и опубликовали.
Но, повторяю, модель была ужасной. Обреченной с самого начала. Под словом
«обреченная» я не имею в виду, что она была неверна, но лучше бы мы ее не ис-
пользовали. Честно признаюсь, после ухода нескольких научных сотрудников
в компании не осталось никого, кто мог бы обновлять значения кумулятивной
Заключение 455
Инструменты
Сегодня в мире аналитики (или, если вам больше нравится, «науки о данных»,
«больших данных», «бизнес-аналитике», «облачного чего-то там» и т. д.) людей
все больше интересуют инструменты и архитектура.
Инструменты, безусловно, важны. Они позволяют развернуть во всей красе
ваши аналитические проекты и проекты по управлению данными. Но когда
люди говорят о «лучшем инструменте в их работе», это часто является при-
знаком фокусировки на инструменте, а не на работе.
Компании, производящие программное обеспечение, заинтересованы в про-
даже вам продукта, решающего проблемы, которых у вас, возможно, и нет.
А у многих есть еще и боссы, которые, начитавшись Harvard Business Review, ве-
лят нам с умным видом: «Надо сделать эту штуку с большими данными. Сходи,
купи что-нибудь и запускай свой Hadoop».
Все это привело к опасным тенденциям в современном бизнесе, когда ме-
неджмент заботится только об инструментах, причем настолько рьяно, что
аналитикам ничего не остается, как молча подчиняться. Производители же,
в свою очередь, только и мечтают продать нам инструменты, чтобы нам было
чем заняться, но я бы не стал утверждать, что в этом случае речь идет о на-
стоящем анализе.
Вот простое правило: перед размышлением об инструментах как можно бо-
лее детально выбирайте аналитические возможности, за которые вы хотели бы
взяться.
456 Много цифр
Параметры работы
Если бы мне давали монетку каждый раз, когда кто-нибудь поднимает брови,
слыша, что в MailChimp мы используем R в антиспамовых моделях, я бы уже
купил фабрику Mountain Dew. Все считают этот язык неподходящим из-за на-
строек производительности. Если бы я занимался торговлей на бирже с огром-
ным потоком данных, то, думаю, утверждение это было бы верно. Я бы лучше
написал все в С. Но я не торгую на бирже — и этим все сказано.
Что касается MailChimp, то большую часть времени мы проводим не в R. Оно
уходит на перемещение данных в модели ИИ. Не на саму работу модели ИИ
и уж точно не на ее обучение.
Я встречал ребят, уверенных в скорости, с которой их ПО обучает модель
ИИ. Может ли модель обучаться параллельно, на языке нижнего уровня, в жи-
вой среде?
Они постоянно спрашивают себя, что из их набора необходимо в данный мо-
мент, вместо того чтобы перестать тратить уйму времени на полировку лиш-
ней части своего аналитического проекта.
В MailChimp мы обучаем наши модели офлайн раз в квартал, тестируем их,
а уже затем запускаем обратно в производство. В R на обучение модели у меня
уходит несколько часов. И даже несмотря на то, что у нас, как у любой ком-
пании, объем данных измеряется в терабайтах, размер однажды созданного
обучающего набора — всего 10 гигабайт, так что я могу обучать модели даже
на ноутбуке. С ума сойти!
При этом я не фокусируюсь на скорости обучения в R. Я сосредотачиваюсь
на более важных вещах, например точности модели.
Я отнюдь не утверждаю, что вы вообще не должны уделять внимание па-
раметрам работы. Но заниматься ими надо спокойно, без фанатизма и только
когда этого требует ситуация.
Э та книга появилась после того, как мой блог Analytics Made Skeezy стал
популярным среди огромного количества народа. Так что я хочу побла-
годарить всех моих читателей и тех, кто следил за моими аналитическими за-
метками в Twitter. Огромное спасибо Аарону Уолтеру, Крису Миллсу и Джону
Дакетту за то, что убедили Wiley взяться за книгу на основе моих глупых твитов.
Отдельное спасибо команде MailChimp: без их помощи и поддержки я ни-
когда бы не решился писать такую сложную техническую книгу параллельно
с работой и воспитанием троих мальчишек. А без Нила Бэйнтона и Мишель
Риггин-Рэнсом я бы просто умер. Я в огромном долгу перед Роном Льюисом,
Джосом Розенбаумом и Джейсоном Тревисом за их работу над обложкой и ре-
кламным ролике о книге.
Благодарю Кэрол Лонг из издательства Wiley за то, что она поверила в меня,
и всю команду редакторов за их работу и опыт. Огромное спасибо Грегу Джен-
нингсу за создание таблиц!
И, родители, спасибо, что кода-то прочли мой научно-фантастический рас-
сказ и не сказали, что мне не стоит больше писать.
Форман Джон
МНОГО ЦИФР
Анализ больших данных
при помощи Excel
ǹ țȊȈȎȍȕȐȍȔ,
ǹȍȘȋȍȑ ǺțȘȒȖ,
ȒȈȕȌȐȌȈȚ ȥȒȖȕȖȔȐȟȍșȒȐȝ ȕȈțȒ,
ȋȓȈȊȕȣȑ ȘȍȌȈȒȚȖȘ ȐȏȌȈȚȍȓȤșȚȊȈ «ǨȓȤȗȐȕȈ ǷȈȉȓȐȠȍȘ»