Хотя мастерство Excel может помочь в решении многих аналитических задач, работа с данными в значительной степени зависит от нюансов, воспроизводимости и масштабируемости программирования. . От статистических тестов, доступных только в специализированных библиотеках R и Python, до возможности пошагово показать, как формулируется модель и генерировать прогнозы, до возможности перейти от обработки одного набора данных к 1000 с помощью нескольких нажатия клавиш, свободное владение программированием необходимо для того, чтобы быть эффективным специалистом по данным.

Поэтому мы сосредоточимся на навыках программирования, которые являются ключевыми для эффективного управления и анализа данных. Эти навыки должны оказаться полезными независимо от того, где ваша роль находится в спектре аналитики и инженерии.

Хотя многие роли в области науки о данных полагаются исключительно на R, в этом посте будут продемонстрированы концепции кодирования с помощью Python. Универсальность Python делает его универсальным языком для огромного количества приложений для обработки данных, от манипуляций с фреймами данных до распознавания речи и компьютерного зрения. Даже если ваша роль связана с вычислением чисел в R весь день, подумайте об изучении небольшого количества Python для автоматизации таких шагов, как сохранение результатов в Dropbox вашей компании.

Предполагается, что вы знакомы с основами Python. Если нет, посмотрите отличный материал на Real Python и Codecademy. Мы рассмотрим следующие концепции:

  • Фреймы данных
  • Массивы
  • Визуализации
  • Описательная статистика
  • Работа с датой и временем
  • Машинное обучение

Для более глубокого погружения в статистику ознакомьтесь с моей статьей «Основы статистики для науки о данных».



Фреймы данных

Фреймы данных лежат в основе науки о данных и аналитики. По сути, они представляют собой просто таблицу строк и столбцов, каждая из которых обычно является записью, а каждый столбец - атрибутом этой записи. У вас может быть таблица сотрудников, например, где каждая строка - это человек, а столбцы - их имя, домашний адрес и должность.

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

Основы включают в себя возможность загружать, очищать и записывать файлы CSV. Очистка данных может включать удаление строк с пропущенными значениями или повторяющейся информацией, исправление ошибочных значений и переформатирование столбцов в разные типы данных.

Другие важные манипуляции с данными включают векторизованные и итерационные преобразования данных. Для простой поэлементной математики столбцов в нашем фрейме данных pandas позволяет нам обрабатывать столбцы, как если бы они были единичными значениями.

Для более тонких операций, таких как обработка пропущенных значений, которые в противном случае привели бы к сбою операций по столбцам, вы можете использовать .apply. Ниже мы используем лямбду для применения пользовательской функции safe_divide к полям col1 и col2 каждой строки. [1]

Для логики, которую нелегко передать в лямбду, мы можем перебирать строки фрейма данных с помощью .itertuples. (Не используйте .iterrows, если можете этого избежать!)

Наконец, нам нужна возможность комбинировать данные из нескольких фреймов данных, а также запускать агрегированные команды для данных. В приведенном ниже коде мы объединяем два фрейма данных, не теряя ни одной строки в df1, указав, что это слияние слева. Затем мы создаем новый фрейм данных df_agg, который суммирует каждый столбец для каждого пользователя. Поскольку user_id теперь является нашим индексом, мы можем легко отобразить расходы конкретного пользователя в данной категории с помощью .loc.

Массивы

pandas фреймы данных на самом деле построены на numpy массивах, поэтому полезно иметь некоторые знания о том, как эффективно использовать numpy. Например, многие операции с pandas.Series (тип данных, подобный массиву для строк и столбцов) идентичны операциям numpy.array.

numpy, или Числовой Python, представляет собой библиотеку с классами, созданными специально для эффективных математических операций. Пользователи R найдут numpy массивы знакомыми, поскольку они разделяют большую часть логики кодирования с векторами R.

Ниже я выделю некоторые отличия от встроенного в Python класса list. Типичное практическое правило, которому я следую, заключается в том, что лучше использовать встроенные классы Python, когда это возможно, учитывая, что они были оптимизированы для этого языка. Однако в науке о данных массивы numpy, как правило, являются лучшим выбором. [2]

Во-первых, у нас есть простая фильтрация вектора. Встроенный Python list требует либо понимания списка, либо функции filter плюс лямбда и распаковка ([*...]). numpy, тем временем, требует только сам массив.

Второе важное отличие - математические операции. Оператор + заставляет списки объединяться. Между тем, numpy массивы интерпретируют + как поэлементное сложение.

Чтобы выполнять поэлементную математику в списках Python, вам нужно использовать что-то вроде понимания списка с zip в двух списках. Для numpy это обычные математические операторы. Вам все еще можно обойтись ручным вычислением простых агрегатов, таких как среднее значение в списках, но мы почти подошли к тому моменту, когда использование списков не имеет смысла.

Наконец, если вы имеете дело с данными в более высоких измерениях, не беспокойтесь о списках списков - просто используйте numpy. Я все еще ломаю голову, пытаясь понять, как именно работает [*map(np.mean, zip(*l_2d))], тогда как arr_2d.mean(axis=1) ясно показывает, что мы берем среднее значение каждого столбца (ось 1).

Если вы в конечном итоге перейдете к компьютерному зрению, numpy многомерные массивы будут необходимы, поскольку они используются по умолчанию для хранения значений интенсивности пикселей в изображениях. Вы можете встретить двумерный массив с кортежами для значений RGB каждого пикселя, например, или пятимерный массив, в котором размеры 3, 4 и 5 - красный, зеленый и синий соответственно.

Визуализации

После фреймов данных и массивов следующим по важности навыком аналитики является визуализация данных. Визуализация данных - один из первых и последних шагов анализа: когда Python передает данные вам, и когда вы передаете данные заинтересованным сторонам.

Основными библиотеками визуализации данных Python являются matplotlib и seaborn. Вот как создать простой двухпанельный график в matplotlib.

А ниже - простой способ построить данные с несколькими группами. Ключевое слово label невероятно удобно, так как затем вы можете просто вызвать plt.legend и автоматически заполнить легенду информацией по каждой группе.

Если вы хотите пофантазировать, обратите внимание на инструменты интерактивного дашборда, такие как Bokeh или Plotly. Эти инструменты позволяют пользователю взаимодействовать с графиком, например, получать дополнительную информацию о точке, наведя на нее курсор, или регенерировать данные на графике, щелкая раскрывающиеся меню или перетаскивая ползунки. Вы даже можете встраивать простые графики в статический HTML, например график Bokeh ниже. [3]

Описательная статистика

Несмотря на то, что вы, возможно, пытаетесь добраться до машинного обучения, я думаю, что в первую очередь должно быть твердое понимание описательной статистики и статистических выводов. Основ должно хватить для большинства приложений для обработки данных.

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

Вот основные показатели, которые, на мой взгляд, необходимо знать:

  • Средние: среднее значение, медиана, режим
  • Спред: стандартное отклонение
  • Модальность: одномодальное, бимодальное, мультимодальное распределение.
  • Наклон: влево, вправо

Работа с датой и временем

По крайней мере, с аналитикой данных вы, скорее всего, не избежите работы с датами. Даты составляют основу анализа временных рядов, который повсеместно применяется в областях с непрерывными потоками данных, таких как Интернет вещей.

Встроенная datetime библиотека является стандартом Python с расширенными методами в dateutil библиотеке. К счастью, pandas имеет отличную функциональность для работы с датами, когда для индекса задано значение datetime, что означает, что вы можете оставаться в pandas для анализа как с датами, так и без них. Точно так же matplotlib позволяет вам передавать dt.datetime значения, как если бы они были обычными числами.

Также важно преобразование между форматами dt.datetime и str. Функции здесь следующие:

  • dt.datetime.strptime для str - ›dt.datetime
  • dt.datetime.strftime для dt.datetime - ›str.

(Примечание: я до сих пор не могу вспомнить, идет ли сначала строка или значение datetime! Я просто пробую это в ячейке записной книжки Jupyter сбоку и смотрю, какое из них работает.)

Наконец, модуль Python time удобен для определения продолжительности шагов анализа. time.time() вернет число с плавающей запятой, представляющее количество секунд с полуночи 1 января 1970 года. (также известное как время эпохи Unix.) Вы можете сохранить это значение перед блоком кода, а затем сравнить это время Эпохи после кода.

Машинное обучение

Наконец, у нас есть машинное обучение. Из всего, что делают специалисты по анализу данных, машинное обучение вызывает больше всего шума, но, вероятно, это самый незначительный аспект работы.

Думайте о том, чтобы быть специалистом по обработке данных, как о создании бурового станка.

Само упражнение привлекает внимание - модная статистика и аналитика - а главное - машинное обучение. Наконечник сверла получил признание за прорыв, и всегда появляются новые и улучшенные наконечники сверла, которые могут сломать более твердый материал.

Но большая часть вашего времени, вероятно, будет потрачена на сборку остального оборудования - рамы, рычагов, винтов и т. д. - и определение где применить дрель. (Если вы работаете в организации с особенно ограниченными техническими возможностями, вы также можете создать интерфейсную часть: элементы управления для пользователя!)

Если вы заботитесь только о тренировке, а не обо всей машине, вы, скорее всего, разочаруетесь во многих работах в области науки о данных. Но если вам доставляет удовольствие весь процесс создания машины и создание чего-то, что действительно помогает людям изменить эту почву, тогда вам понравится ваша работа.

В любом случае вам потребуются некоторые знания машинного обучения. Хотя вам нужно понимать, что делает любой алгоритм, который вы используете, и подходит ли он для ответа на вопрос, который вы задаете, вы можете быть удивлены, насколько мало вы получаете от бизнеса, изучая, чем точно отличаются похожие алгоритмы (например, случайные леса против опорных векторных машин против XGBoost), если ваша роль не связана с исследованиями, образованием или консультированием по машинному обучению. [4]

Скорее, вы продвинетесь намного дальше, если хорошо поймете необходимые шаги до и после использования алгоритма машинного обучения. Поэтому в этом разделе я расскажу о компонентах «до и после» эффективного использования машинного обучения. Я бы сказал, что основные концепции, которые необходимо знать, следующие:

  1. Функциональная инженерия
  2. Данные обучения и данные тестирования
  3. Оценка соответствия модели

Функциональная инженерия

Одних наших необработанных данных часто бывает недостаточно для построения сильной модели. Предположим, например, что мы пытаемся предсказать количество товаров, продаваемых каждый день в интернет-магазине.

Мы уже знаем, что в выходные дни продажи выше, чем в будние дни, поэтому мы хотим, чтобы наша модель включала различие между будними и выходными днями, чтобы быть более точными. В наших данных нет явного различия между рабочими днями и выходными, хотя у нас есть только дата совершения продажи.

Линейная модель определенно не знает, что делать с необработанными датами. Возможно, что сложная модель глубокого обучения сможет уловить цикличность продаж, связанных с датами, но, вероятно, потребуется много данных, чтобы понять это.

Гораздо более простой вариант - разработать is_weekend функцию, задав вопрос о том, происходила ли каждая продажа в субботу или воскресенье по сравнению с остальной частью недели. Функция is_weekend теперь служит недвусмысленным флагом, предупреждающим нашу модель о том, что в будние и выходные дни что-то может отличаться.

Точно так же, возможно, необработанное количество товаров в тележках покупателя не является информативным предиктором, а на самом деле им является квадратный корень или логарифм этих товаров. (На самом деле я понятия не имею. Напишите мне, если произойдут какие-то преобразования, которые используют все специалисты по обработке данных в электронной коммерции!)

В конечном счете, разработка функций - это способ включить в вашу модель опыт предметной области, предоставляя ей более полезные инструменты для понимания ваших данных. Ожидайте, что потратите много времени, пытаясь определить и спроектировать наиболее информативные функции для ваших моделей. После точных данных соответствующие функции являются наиболее важным компонентом точной модели машинного обучения - гораздо больше, чем точный используемый алгоритм или время, потраченное на настройку гиперпараметров.

Данные обучения и данные тестирования

Когда вы строите прогнозную модель, очень важно знать, насколько она точна. Здесь на помощь приходят данные обучения по сравнению с данными тестирования. Основная идея состоит в том, чтобы разделить ваши данные на "обучающие" данные, которые используются для создания модели, и " тестирование », которые позже используются для оценки точности модели.

Как только ваша модель узнает о взаимосвязи между вводом и выводом, вы используете данные тестирования, чтобы увидеть, как прогнозы модели сравниваются с истинными результатами. [5] Это окончательное испытание! Когда мы точно знаем, каким должен быть ответ, остается мало места для толкования.

Scikit-learn (sklearn) - это популярная библиотека Python для машинного обучения. Он легко интегрируется с pandas и numpy и имеет все необходимое для подготовки, запуска, оценки и точной настройки моделей.

Оценка соответствия модели

Последняя теория машинного обучения, которую нам нужно понять, - это оценка того, насколько хорошо ваша модель описывает ваши данные ... а также насколько хорошо она описывает данные тоже.

Модель - это упрощенное представление реального мира. Если модель слишком проста, она не будет представлять ни данные обучения, ни реальный мир (недостаточная подгонка). С другой стороны, если он слишком сложный, он будет описывать данные, на которых он обучен, но не будет обобщен на реальный мир (переоборудование).

Думайте о модели как о лежащих в основе «правилах» преобразования входов в выходы. Допустим, у нас есть модель, которая преобразует часы, которые студент 1) учится и 2) спит, в результаты экзамена. Мы можем сделать модель более точной, если начнем включать такие функции, как 3) завтракал ли ученик и 4) нравится ли ему учитель.

Но чем больше у нас функций, тем больше данных нам нужно для точного расчета вклада каждой функции во входные и выходные данные, особенно если функции не являются полностью независимыми. Фактически, исследователи подсчитали, что когда у нас есть коррелированные функции, наша модель не должна иметь больше, чем квадратный корень из n features в нашей модели (где n - количество наблюдений). Если у вас нет данных о десятках или сотнях студентов, это резко сокращает количество функций, которые должна иметь ваша модель.

Когда мы добавляем в нашу модель коррелированные функции, такие как часы сна вчера и часы сна два дня назад, мы выжимаем некоторую дополнительную точность в описании наших данных, но мы также неуклонно создайте изображение, подобное верхнему правому углу, где наша модель плохо переносится в реальный мир. Чтобы бороться с этим, нам необходимо использовать такие методы, как выбор признаков, k-кратная перекрестная проверка, регуляризация и информационные критерии. Эти методы позволяют нам создать наиболее экономичное представление реального мира, основанное только на наиболее информативных функциях.

Заключительные мысли

В этом посте рассматривается то, что я называю «аналитической» стороной науки о данных - код, который вы пишете, когда манипулируете и анализируете данные. Это навыки, которые обеспечивают точность, скорость и воспроизводимость при извлечении информации из данных.

От реорганизации данных в pandas до их визуализации в matplotlib и обучения модели в sklearn, теперь у нас есть некоторые основные навыки для обработки любых данных, которые встречаются на нашем пути. А оставляя след кода, любой анализ, который мы пишем, может быть более внимательно изучен и повторен другими - или даже нами самими в будущем.

Следующий пост будет посвящен разработке программного обеспечения в области науки о данных, которая включает в себя код, который вы пишете вне фактической работы с данными. Считайте инженерные навыки всем, кроме дрели, в нашем примере с буровым станком. Вместе с навыками из этого поста вы будете хорошо оснащены, чтобы присоединиться к командам специалистов по данным и начать вносить значимый вклад. Увидимся в следующем посте!

С уважением,
Мэтт

Сноски

1. Фреймы данных

Функция divide numpy очень похожа на нашу safe_divide функцию, и я обычно рекомендую работать с уже написанным и оптимизированным кодом. Но, может быть, в этом случае, допустим, мы хотим np.nan вместо Inf при делении на ноль.

Кроме того, вы могли заметить, что мы передаем предопределенную функцию safe_divide в лямбду, которая должна быть «анонимной» функцией. Почему бы просто не использовать safe_divide в .apply? Нам нужен дополнительный слой лямбда, потому что .apply ожидает pd.Series, в частности строк (axis=1) или столбцов (axis=0) вашего фрейма данных. Наша анонимная функция - это оболочка, которая принимает pd.Series, а затем применяет safe_divide к полям col1 и col2 этой серии.

2. Массивы

Одно явное исключение из правила использования массивов numpy вместо списков - если вы хотите, чтобы в вашем массиве хранились значения разных типов. numpy.array и pandas.Series имеют принудительный тип, что означает, что все элементы должны быть одного типа, и они будут принудительно присвоены одному типу при создании массива.

Ниже версия numpy our_list1 преобразует 1 и 2 в числа с плавающей запятой, чтобы соответствовать 3.0. (Целые числа преобразуются в числа с плавающей запятой, чтобы сохранить информацию после десятичной дроби в числах с плавающей запятой.) Для our_list2 не существует четкой целочисленной или плавающей версии 'a', поэтому вместо этого 1 и 2.0 преобразуются в строки. Если вы хотите, чтобы в вашем массиве по какой-то причине хранились данные разных типов, лучше придерживаться класса Python list.

3. Визуализации

Вот код для создания этого графика боке, если вам интересно.

4. Машинное обучение.

Как человек, который любит разбираться в принципах работы, я лично рекомендую разобраться в различиях между такими алгоритмами, как случайные леса и XGBoost! Я нахожу это увлекательным, и эти знания облегчают мне демистификацию машинного обучения для любопытных потребителей результатов моделирования. Но в целом моя способность приносить пользу для бизнеса не сильно улучшилась от вникания в эти особенности; реальная выгода - личное удовлетворение от понимания нюансов.

5. Данные обучения и данные тестирования

Обратите внимание, что это для задач контролируемого обучения, где есть правильный вывод для каждого ввода. Оценка точности модели сложнее для задач обучения без учителя и, вероятно, требует специальных знаний в конкретной области. Возможно, мы видим, например, что существует четыре группы потребительских расходов, но нужен человек с деловой хваткой, чтобы увидеть, что только три группы актуальны для рынка компании.