Русский
Русский
English
Статистика
Реклама

Data science

Анонс как Data Science продает вам рекламу

14.09.2020 12:17:21 | Автор: admin


Сегодня, в 20:00 в прямом эфире выступит Никита Александров Data Scientist в Unity.

Никита закончил ФКН ВШЭ, во время последнего курса получил стипендию Эразмуса и съездил на семестр по обмену в Финляндию. Несмотря на то, что Никита получил оффер на работу в Токио, он решил поступить в магистратуру университета Аалто. Магистратуру он не закончил и ушел работать Data Scientistом в Unity Ads, где сейчас улучшает алгоритмы конверсии. Никита расскажет о том, как устроен IT-рынок Финляндии, что там есть интересного и какие задачи решают дата-саентисты в Unity. Кроме того, Никита готов поделиться инсайдами, как правильно рекламировать свою игру при помощи Unity, чтобы ее чаще устанавливали.

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




Эфир разделится на три блока


Что ловить айтишникам в Финляндии?

  • Как студенту уехать по обмену на семестр в Европу: как Никита получал стипендию Эразмуса.
  • Магистратура в Финляндии: зачем ехать, что есть интересного? Почему из финской магистратуры невозможно вылететь?
  • Как прожить в Финляндии на 500 евро и почему я решил этого не делать.
  • Рынок IT-труда в Финляндии.

Про Data Science

  • Что дата-саентисты делают в Unity: что они делают именно в Unity, что значит эта позиция в Unity.
  • Что конкретно я делаю в Unity как дата-саентист.
  • Как улучшить конверсию рекламы, не меняя продукт: техники доступные дата-саентисту.
  • Как изменение настроек приватности в iOS 14 может повлиять на мир таргетированной рекламы в гейм-индустрии.
  • Федеративное обучение: что это и может ли это решить проблему с iOS 14.

Как рекламировать свои игры в Unity

  • Зачем разработчики покупают трафик прямо в Unity когда есть Facebook и Google.
  • Как устроен показ рекламы в Unity.
  • Разные виды трагетированных реклам и их эффективность: баннеры, видео, играбельные рекламы, за вознаграждение и остальные.
  • Как дата-сайнс помогает зарабатывать на хлеб гейм-девелоперам.
  • Техники, которые позволяют эффективно и постоянно продвигать свою игру в рекламе: что делать, чтобы игру устанавливали.

Вы можете задать Никите вопрос здесь в комментариях, в инстаграме и прямо во время эфира.



Куда жать, чтобы не пропустить эфир?


Жмите на колокольчик на ютубе или подписывайтесь на наш инстаграм, тогда вам придет уведомление о начале эфира.

Еще раз напоминаем дату и время: понедельник, 7 сентября, 20:00



До встречи в эфире!




Подробнее..

Заметки Дата Сайентиста с чем начать и нужно ли оно?

17.09.2020 14:13:09 | Автор: admin

TL;DR это пост для вопросов/ответов про Data Science и о том, как войти в профессию и развиваться в ней. В статьей я разберу основные принципы и FAQ и готов отвечать на ваши конкретные вопросы пишите в комментариях (или в личке), я постараюсь на все ответить в течение нескольких дней.
С появлением цикла заметок дата сатаниста пришло немало сообщений и комментариев с вопросами о том, как начать и куда копать и сегодня мы разберем основные скиллы и вопросы возникшие после публикаций.

Все указанное тут не претендует ни какую истину в последней инстанции и является субъективным мнением автора. Мы разберем основные вещи, которые кажутся самыми важными в процессе.

Зачем именно это нужно


Для того, чтобы цель была достижима лучше, чтобы она хоть как-то конкретно выглядела вы хотите стать DS или Research Scientist в Facebook/Apple/Amazon/Netflix/Google смотрите требования, языки и необходимые навыки прям конкретно под какую позицию. Какой процесс найма? Как проходить обычный день в такой роли? Как выглядит усредненный профиль человека, который там работает?

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

Будет или это еще актуально


К тому моменту, как вы дорастете до позиции.

Представьте, что до вашей позиции вам нужно получить PhD, поработать 2-3 года в индустрии и вообще остричься, медитируя в монастыре не будет ли с Data Science такой же ситуации как когда-то с экономистами и юристами? Не изменится ли все до неузнаваемости в той области, которой вы хотите заниматься.

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

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

К примеру автор и не планировал идти в дата сатанисты, а во время PhD пилил сторонние проекты, которые сильно перекликались по скиллам с DS и по окончанию аспирантуры естественным образом перешел в среду, увидев хорошую позицию.

Если по ходу пьесы окажется, что нужно будет переходить куда-то еще ибо там сейчас самая движуха и все самое интересное действо происходит, ну значит туда и будем переходить естественным образом.

Разбивка навыков


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

Программирование/Скриптинг


С какими языками обязательно надо познакомиться? Python? Java? Shell scripting? Lua? Sql? C++?

Что именно нужно уметь и зачем в плане программирования тут спектр позиций очень разнится.

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

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

Например, для питона люди уже даже составляют карту изучения языка.

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

Понимание бизнес процессов


Без него никуда: вам нужно понимать зачем вы нужны в данном процессе, что вы делаете и зачем. Часто именно это может сэкономить вам кучу времени, максимизировать свою пользу и не тратить время и ресурсы на фигню.

Обычно, я задаюсь следующими вопросами:

  • Что именно я делаю в компании?
  • Зачем?
  • Кто и как это будет использовать?
  • Какие у меня есть опции?
  • В каких границах находятся параметры?

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

Математика


Тут вы думаю и сами все понимаете без знания базовой математики вы не более чем бебезьян с гранатой (простите с Random Forest) поэтому нужно понимать хотя бы базовые вещи. Если бы я составлял прям самый минимальный список, то туда бы вошли:

  • Линейная алгебра огромное количество ресурсов легко гуглится, ищите, что вам больше всего подходит;
  • Математический анализ (хотя бы в объеме первых двух семестров);
  • Теория вероятностей она повсюду в машинном обучении;
  • Комбинаторика она фактически комплементарна к теорверу;
  • Теория графов хотя бы БАЗОВО;
  • Алгоритмы хотя бы объеме первых двух семестров (см. рекомендации Кормена в его книжке);
  • Матлогика хотя бы базово.

Практический анализ и визуализация данных


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

Exploratory data analysis должен стать просто чем-то естественным, как и все прочие трансформации данных и умение накидать простой пайплайн из unix тузлов (см. предыдущие статьи) или написать читаемый и понятный ноутбук.

Отдельно упомяну визуализацию: лучше один раз увидеть, чем сто раз услышать.

Показать менеджеру график в сто раз проще и понятнее, чем набор цифр, поэтому matplotlib, seaborn и ggplot2 ваши друзья.

Софт скиллы


Не менее важно уметь донести свои идеи, а также результаты и опасения (итд) до окружающих убедитесь, что вы умеете четко изложить задачу как в технических, так и бизнес терминах.

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

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

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

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

Обучение


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

  • Онлайн курсы: coursera, udacity, Edx, etc;
  • Новые школы: онлайн и офлайн SkillFactory, ШАД, MADE;
  • Классические школы: магистерские программы университетов и курсы повышения квалификации;
  • Проекты можно просто выбрать интересные вам задачи и пилить, выкладывая на github;
  • Стажировки тут сложно что-то подсказать, надо искать, что имеется и находить подходящий варианты.

А надо ли оно?


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

  • Должно быть интересно;
  • Приносить внутреннее удовольствие (= хотя бы не причинять страданий);
  • Быть вашим.

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

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

Быть вашим это то самое ощущение, что вы примерно этим и хотели заниматься. У меня есть небольшая история. Я с самого детства увлекался рок-музыкой (и металлом ЛОСОСЬ!) и как очень многие захотел научиться играть и вот это вот все. Выяснилось, что у меня нет слуха и голоса меня это совершенно не смущало (а надо сказать многих исполнителей это и прямо на сцене не смущает), и вот еще школьником у меня появилась гитара и стало понятно, что мне не очень нравится часами сидеть и играть на ней. Шло тяжко, мне все время казалось, что выходит какая-то фигня я совершенно не получал от этого удовольствия и только чувствовал себя паршиво, глупо и совершенно неспособным. Я буквально из под палки себя заставлял садиться за занятия и в целом это было не в коня корм.

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

И в какой-то момент я понял, что игра на гитаре это не мое и реально-то мне нравится слушать, а не играть. А глаза-то горели, когда я писал игры и код (слушая в этот момент всякие разновидности металла) и вот это-то мне тогда и нравилось, и этим мне стоило заниматься.

А еще есть вопросы?


Конечно же мы не смогли пройтись по всем темам и вопросам, так что пишите комменты и в личку я всегда рад вопросам.



Подробнее..

Перевод Выработка уникальных идей для Data Science-проектов за 5 шагов

22.09.2020 16:11:47 | Автор: admin
Вероятно, самое сложное в любом Data Science-проекте это придумать оригинальную, но реализуемую идею. Специалист, который ищет такую идею, легко может попасться в ловушку наборов данных. Он тратит многие часы, просматривая существующие наборы данных и пытаясь выйти на новые интересные идеи. Но у такого подхода есть одна проблема. Дело в том, что тот, кто смотрит лишь на существующие наборы данных (c Kaggle, Google Datasets, FiveThirtyEight), ограничивает свою креативность, видя лишь небольшой набор задач, на которые ориентированы изучаемые им наборы данных.

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



Как вырабатывать новые идеи? Для того чтобы найти ответ на этот вопрос, я совместила собственный опыт и результаты исследований креативности. Это привело к тому, что мне удалось сформировать 5 вопросов, ответы на которые помогают находить новые идеи. Тут же я приведу и примеры идей, найденных благодаря предложенной мной методике. В процессе поиска ответов на представленные здесь вопросы вы пройдёте по пути создания новых идей и сможете задействовать свои креативные возможности на полную мощность. В результате у вас будут новые уникальные идеи, которые вы сможете реализовать в ваших Data Science-проектах.

1. Почему я хочу начать работу над новым проектом?


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

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

2. К каким сферам относятся мои интересы и мой опыт?


Подумать над этим вопросом стоит по трём основным причинам.

  • Во-первых, вспомните о диаграммах Венна, используемых в науке о данных для описания навыков, необходимых в этой области. Знания в конкретной области это важный актив, которым должен обладать каждый дата-сайентист. Решать некие задачи, обрабатывая данные, можно только в том случае, если понятна предметная область, к которой относятся эти данные. В противном случае будут применяться алгоритмы, будут создаваться визуализации и прогнозы, которые покажутся неадекватными любому практикующему специалисту соответствующего профиля. А если то, что вы делаете, не имеет смысла, то зачем вообще этим заниматься?
  • Во-вторых, важно, чтобы вам была интересна идея проекта, чтобы вам был бы интересен тот набор данных, с которым вы работаете. Вам вряд ли захочется заставлять себя тратить свободное время на проект, который вам безразличен. Если вам интересна некая сфера знаний, то вам необязательно быть в ней экспертом. Но вы должны быть готовы к тому, чтобы вложить время в дополнительные исследования и в разбор проблем, стоящих за данными.
  • В-третьих, учитывайте то, что исследователи выявили тот факт, что введение ограничений в креативный процесс приводит к улучшению получаемых результатов. Это означает, что сосредоточение на конкретной предметной области или на комбинации из нескольких областей позволит добиться лучших результатов, чем попытки поиска идеи без каких-либо ограничений.

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

3. Как найти вдохновение?


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

  • Новости, авторские статьи, публикации в блогах. Чтение о неких событиях или явлениях, которые наблюдали авторы публикаций, это отличный способ выработки идей. Например, портал WIRED опубликовал эту статью, посвящённую тому, что функция автодополнения ввода при поиске в Google демонстрирует политическую предвзятость. Вдохновившись этой идеей, можно исследовать систематические ошибки в языковых моделях. Или можно задаться вопросом о возможности предсказания географического положения человека на основе поисковых запросов, вводимых им в Google.
  • Научная литература. Научные публикации часто включают в себя рассказы о нерешённых вопросах, имеющих отношение к исследуемой теме. Например, в этой публикации рассказывается о языковой модели GPT-2 и упоминается о том, что эта модель, без её тонкой настройки, показывает себя на определённых задачах, вроде ответов на вопросы, не лучше, чем попытка решить эти задачи методом случайного угадывания. Почему бы не написать что-нибудь о нюансах тонкой настройки этой модели?
  • Материалы из сферы науки о данных. Чтение материалов, представляющих темы, связанные с Data Science, и содержащие обзоры соответствующих проектов, способно привести к новым идеям. Например, когда я прочитала об NLP-исследовании сериала Офис, я тут же пожалела о том, что мне эта идея не пришла раньше, чем автору материала. Но почему бы не исследовать какой-нибудь другой сериал? А может, изучить несколько фильмов и попытаться определить языковые паттерны? А для написания текстов к любимому сериалу можно попробовать воспользоваться моделью GPT-2.

Если говорить о других источниках вдохновения, то вдохновение, не закрывая себя перед новыми идеями, можно найти и в обычной жизни. Каждый раз, когда вас заинтересует какой-нибудь вопрос, подумайте о том, сможете ли вы ответить на этот вопрос, прибегнув к методам работы с данными. Например, недавно я наткнулась на трейлер сериала Пацаны и обнаружила массу позитивных отзывов о нём на IMDb. Есть ли подтверждение того, что в сериалах, со временем, растёт количество сцен с применением насилия?, спросила я себя. Существует ли постоянно растущая аудитория, которой нравятся жестокие сериалы?, продолжила я. Если что-то вас заинтересовало ловите момент и изучайте соответствующие данные.

Как генерировать идеи проектов, опираясь на вышеописанные источники вдохновения? Нейробиологи выделили три различных психологических процесса, связанных с генерированием идей:

  • Можно комбинировать существующие идеи, создавая новые (комбинаторная креативность). Например, в рамках различных проектов анализировались предложения по аренде жилья, размещённые на Airbnb. Существуют проекты, направленные на анализ рынка недвижимости. Если скомбинировать эти идеи можно поискать ответ на вопрос о том, повышаются ли цены на жильё в некоем городе благодаря Airbnb.
  • Можно исследовать существующую идею и поискать в её рамках задачу, которую можно попытаться решить (исследовательская креативность). Например, можно обратить внимание на сравнение дата-сайентистов, получивших соответствующее образование, со специалистами, обучавшимися самостоятельно. Исследовав эти рассуждения, можно попытаться узнать о том, какая категория дата-сайентистов более успешна.
  • Можно взять существующую идею и изменить в ней что-то такое, что полностью меняет её смысл (трансформационная креативность). Это самая редкая форма креативности. Она действует за пределами существующего концептуального пространства. Этот подход к креативности сложно понять и даже сложно описать. В качестве примера можно привести такую идею: вместо того, чтобы спрогнозировать возникновение некоего события, попытайтесь спрогнозировать его невозникновение.

4. Где найти подходящие данные?


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

  • Существующие хранилища данных: Kaggle, Google Datasets, FiveThirtyEight, BuzzFeed, AWS, UCI Machine Learning Repository, data.world, Data.gov и многие другие, которые можно найти с помощью Google.
  • Источники данных, используемые другими дата-сайентистами. Поищите сведения по интересующей вас теме в Google и в Google Scholar. Выясните, пытался ли уже кто-нибудь найти ответ на вопрос, похожий на ваш. Какие данные использовались в похожих исследованиях? Например, ресурс Our World in Data представляет академические и неакадемические источники данных, о которых вы можете не знать.
  • Данные, которые нужно собирать самостоятельно. Для сбора таких данных можно прибегнуть к веб-скрапингу, к анализу текстов, к различным API, к отслеживанию событий, к работе с лог-файлами.

Если вам не удаётся отыскать данные, которые могут вам помочь в реализации идеи вашего проекта, переформулируйте идею. Попытайтесь извлечь из исходной идеи такую идею, которую можно реализовать, пользуясь имеющимися у вас данными. А между тем задайте себе вопрос о том, почему вам не удаётся найти нужные вам данные. Что не так в той области, которой вы интересуетесь? Что можно с этим сделать? Уже одни только ответы на эти вопросы могут привести к появлению нового Data Science-проекта.

5. Реализуема ли найденная идея?


Итак, у вас есть фантастическая идея! Но можно ли её реализовать? Снова пройдитесь по этапам процесса генерирования идей. Подумайте о том, чего вы хотите достичь (вопрос 1), интересна ли вам выбранная область, если ли у вас опыт работы в ней (вопрос 2), есть ли у вас данные, необходимые для реализации идеи (вопрос 4). Теперь вам нужно определить следующее: имеются ли у вас навыки, необходимые для реализации идеи и для достижения цели.

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

После того, как вы пройдёте 5 вышеописанных шагов выработки идеи, у вас должен быть вопрос, на который вы можете и хотите ответить, потратив на это столько времени, сколько готовы потратить на достижение своей цели.

Итоги


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

Я, пользуясь описанной здесь методикой, постоянно нахожу оригинальные идеи для своих Data Science-проектов. Надеюсь, эта методика пригодится и вам.

Как вы ищите новые идеи для своих Data Science-проектов?



Подробнее..

Перевод Как вернуть сразу несколько значений из функции в Python 3

28.08.2020 14:05:29 | Автор: admin
Сегодня мы делимся с вами переводом статьи, которую нашли на сайте medium.com. Автор, Vivek Coder, рассказывает о способах возврата значений из функции в Python и объясняет, как можно отличить друг от друга разные структуры данных.


Фото с сайта Unsplash. Автор: Vipul Jha

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

def hours_to_write(happy_hours):   week1 = happy_hours + 2   week2 = happy_hours + 4   week3 = happy_hours + 6   return [week1, week2, week3] print(hours_to_write(4))# [6, 8, 10]

Структуры данных в Python используются для хранения коллекций данных, которые могут быть возвращены посредством оператора return. В этой статье мы рассмотрим способы возврата нескольких значений с помощью подобных структур (словарей, списков и кортежей), а также с помощью классов и классов данных (Python 3.7+).

Способ 1: возврат значений с помощью словарей


Словари содержат комбинации элементов, которые представляют собой пары ключ значение (key:value), заключенные в фигурные скобки ({}).

Словари, на мой взгляд, это оптимальный вариант для работы, если вы знаете ключ для доступа к значениям. Далее представлен словарь, где ключом является имя человека, а соответствующим значением возраст.

people={  'Robin': 24,  'Odin': 26,  'David': 25}

А теперь перейдем к функции, которая возвращает словарь с парами ключ значение.

# A Python program to return multiple values using dictionary# This function returns a dictionary def people_age():     d = dict();     d['Jack'] = 30    d['Kim'] = 28    d['Bob'] = 27    return dd = people_age() print(d)# {'Bob': 27, 'Jack': 30, 'Kim': 28}

Способ 2: возврат значений с помощью списков


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

Списки одна из наиболее универсальных структур данных в Python, потому что им не обязательно сохранять однородность (в них можно включать строки, числа и элементы). Иногда списки даже используют вместе со стеками или очередями.

# A Python program to return multiple values using list def test():     str1 = "Happy"    str2 = "Coding"    return [str1, str2]; list = test() print(list)# ['Happy', 'Coding']

Вот пример, где возвращается список с натуральными числами.

def natural_numbers(numbers = []):      for i in range(1, 16):       numbers.append(i)   return numbers print(natural_numbers())# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

Способ 3: возврат значений с помощью кортежей


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

Кортежи напоминают списки, однако их нельзя изменить после того, как они были объявлены. А еще, как правило, кортежи быстрее в работе, чем списки. Кортеж можно создать, отделив элементы запятыми: x, y, z или (x, y, z).

На этом примере кортеж используется для хранения данных о сотруднике (имя, опыт работы в годах и название компании).

Bob = ("Bob", 7, "Google")

А вот пример написания функции для возврата кортежа.

# A Python program to return multiple values using tuple# This function returns a tuple def fun():     str1 = "Happy"    str2 = "Coding"    return str1, str2; # we could also write (str1, str2)str1, str2= fun() print(str1) print(str2)# Happy  Coding

Обратите внимание: мы опустили круглые скобки в операторе return, поскольку для возврата кортежа достаточно просто отделить каждый элемент запятой (как показано выше).

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

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

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

def student(name, class):   return (name, class)print(student("Brayan", 10))# ('Brayan', 10)

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

Способ 4: возврат значений с помощью объектов


Тут все так же, как в C/C++ или в Java. Можно просто сформировать класс (в C он называется структурой) для сохранения нескольких признаков и возврата объекта класса.

# A Python program to return multiple values using class class Intro:  def __init__(self):   self.str1 = "hello"  self.str2 = "world"# This function returns an object of Introdef message():  return Intro()  x = message() print(x.str1) print(x.str2)# hello  world

Способ 5: возврат значений с помощью классов данных (Python 3.7+)


Классы данных в Python 3.7+ как раз помогают вернуть класс с автоматически добавленными уникальными методами, модулем typing и другими полезными инструментами.

from dataclasses import dataclass@dataclassclass Item_list:    name: str    perunit_cost: float    quantity_available: int = 0    def total_cost(self) -> float:        return self.perunit_cost * self.quantity_available    book = Item_list("better programming.", 50, 2)x = book.total_cost()print(x)print(book)# 100  Item_list(name='better programming.', perunit_cost=50,   quantity_available=2)

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

Вывод


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

Учите матчасть и постоянно развивайте свои навыки программирования. Спасибо за внимание!
Подробнее..

Перевод Напишем и поймем Decision Tree на Python с нуля! Часть 1. Краткий обзор

02.09.2020 18:14:51 | Автор: admin
Привет, Хабр! Представляю вашему вниманию перевод статьи "Python01. ".

1.1 Что такое Decision Tree?


1.1.1 Пример Decision Tree


Например, у нас есть следующий набор данных (дата сет): погода, температура, влажность, ветер, игра в гольф. В зависимости от погоды и остального, мы ходили () или не ходили () играть в гольф. Предположим, что у нас есть 14 сложившихся вариантов.

Из этих данных мы можем составить структуру данных, показывающую, в каких случаях мы шли на гольф. Такая структура из-за своей ветвистой формы называется Decision Tree.

Например, если посмотреть на Decision Tree, изображенный на картинке выше, мы поймем, что сначала проверяли погоду. Если было ясно, мы проверяли влажность: если она высокая, то не шли играть в гольф, если низкая шли. А если погода была облачная, то шли играть в гольф вне зависимости от других условий.

1.1.2 Об этой статье


Существуют алгоритмы, которые создают такие Decision Tree автоматически, на основе имеющихся данных. В этой статье мы будем использовать алгоритм ID3 на Python.

Эта статья первая из серии. Следующие статьи:

(Прим. переводчика: если вас заинтересует продолжение, пожалуйста, сообщите нам в в комментариях.)

Основы программирования на Python
Необходимые основы библиотеки для анализа данных Pandas
Основы структуры данных (в случае с Decision Tree)
Основы информационной энтропии
Учим алгоритм для генерации Decision Tree

1.1.3 Немного о Decision Tree


Генерация Decision Tree связана с машинным обучением с учителем и классификацией. Классификация в машинном обучении способ, позволяющий создать модель, ведущую к правильному ответу, на основе обучении на дата сете с правильными ответами и ведущими к ним данными. Глубокое обучение (Deep Learning), которое в последние годы очень популярно, особенно в сфере распознавания изображений, тоже является частью машинного обучения на основе классификационного метода. Разница Deep Learning и Decision Tree в том, приводится ли конечный результат к форме, при которой человек понимает принципы генерации конечной структуры данных. Особенность Deep Learning мы получаем конечный результат, но не понимаем принцип его генерации. В отличие от Deep Learning, принцип построения Decision Tree прост для понимания человеком, что также является его важной особенностью.

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

1.2 Об алгоритме ID3


ID3 алгоритм генерации Decision Tree, разработанный в 1986 году Россом Куинланом. У него есть две важные особенности:

1. Категориальные данные. Это данные по типу нашего примера выше (пойду на гольф или не пойду), данные с определенным категорийным ярлыком. ID3 не может использовать численные данные.
2. Информационная энтропия индикатор, который указывает на последовательность данных с наименьшей дисперсией свойств класса значений.

1.2.1 Об использовании численных данных


Алгоритм С4.5, который является более продвинутой версией ID3, может использовать численные данные, но так как базовая идея такая же, в этой серии статей, мы, для начала, будет использовать ID3.

1.3 Среда разработки


Программа, которую я описал ниже, я проверил и запустил в следующих условиях:

Jupyter Notebooks (с использованием Azure Notebooks)
Python 3.6
Библиотеки: math, pandas, functools (не использовал scikit-learn, tensorflow и т.д.)

1.4 Пример программы


1.4.1 Собственно, программа


Для начала, скопируем программу в Jupyter Notebook и запустим.
import mathimport pandas as pdfrom functools import reduce# Дата сетd = {    "Погода":["ясно","ясно","облачно","дождь","дождь","дождь","облачно","ясно","ясно","дождь","ясно","облачно","облачно","дождь"],    "Температура":["Жарко","Жарко","Жарко","Тепло","Холодно","Холодно","Холодно","Тепло","Холодно","Тепло","Тепло","Тепло","Жарко","Тепло"],     "Влажность":["Высокая","Высокая","Высокая","Высокая","Норм","Норм","Норм","Высокая","Норм","Норм","Норм","Высокая","Норм","Высокая"],    "Ветер":["Нет","Есть","Нет","Нет","Нет","Есть","Есть","Нет","Нет","Нет","Есть","Есть","Нет","Есть"],    # Последний массив - это наша целевая переменная, показывающая результат,     # основывающийся на предыдущих данных.    "Гольф":["","","","","","","","","","","","","",""],}df0 = pd.DataFrame(d)# Лямбда-выражение для распределения значений, аргумент - pandas.Series, # возвращаемое значение - массив с количеством каждого из значений# Из вводных данных s с помощью value_counts() находим частоту каждого из значений, # и пока в нашем словаре есть элементы, будет работать цикл, запускаемый items().# Чтобы выходные данные не менялись с каждым запуском цикла, мы используем sorted, # который меняет порядок от большего к меньшему# В итоге, генерируется массив, содержащий строку из следующих компонентов: ключ (k) и значение (v).cstr = lambda s:[k+":"+str(v) for k,v in sorted(s.value_counts().items())]# Структура данных Decision Treetree = {    # name: Название этого нода (узла)    "name":"decision tree "+df0.columns[-1]+" "+str(cstr(df0.iloc[:,-1])),    # df: Данные, связанные с этим нодом (узлом)    "df":df0,    # edges: Список ребер (ветвей), выходящих из этого узла,     # или пустой массив, если ниже нет листового узла.    "edges":[],}# Генерацию дерева, у узлов которого могут быть ветви, сохраняем в openopen = [tree]# Лямба-выражение для вычесления энтропии. # Аргумент - pandas.Seriesвозвращаемое значение - число энтропииentropy = lambda s:-reduce(lambda x,y:x+y,map(lambda x:(x/len(s))*math.log2(x/len(s)),s.value_counts()))# Зацикливаем, пока open не станет пустымwhile(len(open)!=0):    # Вытаскиваем из массива open первый элемент,    # и вытаскиваем данные, хранящиеся в этом узле    n = open.pop(0)    df_n = n["df"]    # В случае, если энтропия этого узла равна 0, мы больше не можем вырастить из него новые ветви    # поэтому прекращаем ветвление от этого узла    if 0==entropy(df_n.iloc[:,-1]):        continue    # Создаем переменную, в которую будем сохранять список значений атрибута с возможностью разветвления    attrs = {}    # Исследуем все атрибуты, кроме последнего столбца класса атрибутов    for attr in df_n.columns[:-1]:        # Создаем переменную, которая хранит значение энтропии при ветвлении с этим атрибутом,        # данные после разветвления и значение атрибута, который разветвляется.        attrs[attr] = {"entropy":0,"dfs":[],"values":[]}        # Исследуем все возможные значения этого атрибута.         # Кроме того, sorted предназначен для предотвращения изменения порядка массива,         # из которого были удалены повторяющиеся значения атрибутов, при каждом его выполнении.        for value in sorted(set(df_n[attr])):            # Фильтруем данные по значению атрибута            df_m = df_n.query(attr+"=='"+value+"'")            # Высчитываем энтропию, данные и значения сохрнаяем            attrs[attr]["entropy"] += entropy(df_m.iloc[:,-1])*df_m.shape[0]/df_n.shape[0]            attrs[attr]["dfs"] += [df_m]            attrs[attr]["values"] += [value]            pass        pass    # Если не осталось ни одного атрибута, значение которого можно разделить,     # прерываем исследование этого узла.    if len(attrs)==0:        continue    # Получаем атрибут с наименьшим значением энтропии    attr = min(attrs,key=lambda x:attrs[x]["entropy"])    # Добавляем каждое значение разветвленного атрибута    # и данные, полученные после разветвления, в наше дерево и в open.    for d,v in zip(attrs[attr]["dfs"],attrs[attr]["values"]):        m = {"name":attr+"="+v,"edges":[],"df":d.drop(columns=attr)}        n["edges"].append(m)        open.append(m)    pass# Выводим дата сетprint(df0,"\n-------------")# Метод преобразования дерева в символы, аргуметы - tree:структура данных древа,# indent:присоединяймый к дочернему узлу indent,# Возвращаемое значение - символьное представление древа.# Этот метод вызывается рекурсивно для преобразования всех данных в дереве в символы.def tstr(tree,indent=""):    # Создаем символьное представление этого узла.    # Если этот узел является листовым узлом (количество элементов в массиве ребер равно 0),     # частотное распределение последнего столбца данных df, связанных с деревом, преобразуется в символы.    s = indent+tree["name"]+str(cstr(tree["df"].iloc[:,-1]) if len(tree["edges"])==0 else "")+"\n"    # Зацикливаем все ветви этого узла.    for e in tree["edges"]:        # Добавляем символьное представление дочернего узла к символьному представлению родительского узла.        # Добавляем еще больше символов к indent этого узла.        s += tstr(e,indent+"  ")        pass    return s# Выводим древо в его символьном представлении.print(tstr(tree))


1.4.2 Результат


Если запустить вышеописанную программу, наш Decision Tree будет представлен в виде символьной таблицы, как показано ниже.
decision tree Гольф [':5', ':9']  Погода=Ясно    Влажность=Обычная[':2']    Влажность=Высокая[':3']  Погода=Облачно[':4']  Погода=Дождь    Ветер=Есть[':2']    Ветер=Нет[':3']


1.4.3 Меняем атрибуты (массивы данных), которые хотим исследовать


Последний массив в дата сете d это атрибут класса (массив данных, который хотим классифицировать).
d = {    "Погода":["ясно","ясно","облачно","дождь","дождь","дождь","облачно","ясно","ясно","дождь","ясно","облачно","облачно","дождь"],    "Температура":["Жарко","Жарко","Жарко","Тепло","Холодно","Холодно","Холодно","Тепло","Холодно","Тепло","Тепло","Тепло","Жарко","Тепло"],     "Влажность":["Высокая","Высокая","Высокая","Высокая","Норм","Норм","Норм","Высокая","Норм","Норм","Норм","Высокая","Норм","Высокая"],    "Гольф":["","","","","","","","","","","","","",""],}    # Последний массив - это наша целевая переменная, показывающая результат, основывающийся на предыдущих данных.    "Ветер":["Нет","Есть","Нет","Нет","Нет","Есть","Есть","Нет","Нет","Нет","Есть","Есть","Нет","Есть"],}

Например, если поменять местами массивы Гольф и Ветер, как указано на примере выше, получится следующий результат:
decision tree Ветер ['Есть:6', 'Нет:8']  Гольф=    Погода=ясно      Температура=Жарко        Влажность=Высокая['Есть:1', 'Нет:1']      Температура=Тепло['Нет:1']    Погода=Дождь['Есть:2']  Гольф=    Погода=ясно      Температура=Тепло['Есть:1']      Температура=Холодно['Нет:1']    Погода=облачно      Температура=Жарко['Нет:2']      Температура=Тепло['Есть:1']      Температура=Холодно['Есть:1']    Погода=Дождь['Нет:3']

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

Спасибо за прочтение!
Мы будем очень рады, если вы расскажете нам, понравилась ли вам данная статья, понятен ли перевод, была ли она вам полезна?
Подробнее..

Перевод Напишем и поймем Decision Tree на Python с нуля! Часть 2. Основы Python, необходимые для генерации Decision Tree

11.09.2020 18:10:30 | Автор: admin
Привет, Хабр! Представляю вашему вниманию перевод статьи "Python02. Python".

Данная статья вторая в серии. Первую вы можете найти здесь.

2.1 Комментарии обозначаются # или ''' (три одинарные кавычки)


# Комментарийa = 1 # Комментарий ''' Это тоже комментарийb = cc = d'''

2.2 Использование динамической типизации (тип определяется автоматически)


# динамическая типизация переменных# = копирование значения справа налевоi = 1 #  целое число (int)f = 2.1 # число с плавающей запятой (float)s = "a" # строковый тип (string)b = True # логический тип (boolean)l = [0,1,2] # массив,список (array) t = (0,1,2) # кортеж (tuple)d = {"a":0, "b":1} # словарь, ассоциативный массивprint(i,f,s,b,l,t,d)# 1 2.1 a True [0, 1, 2] (0, 1, 2) {'a': 0, 'b': 1}# Когда хотим определить тип, используем typeprint(type(i)) # Вывод <class 'int'># Переменная не сохраняет, а содержит фактическое значение# Это, своего рода, переменная-ссылка, указывающая на местоположение значения# Можно получить идентификатор актуального значения через idprint(id(l)) # 00000000000000 (меняется от исполнения к исполнениюц)l2 = l # Приведу в пример копию массива, где ссылаюсь на 2 его элемента, а фактический массив - 1. print(id(l2)) # 00000000000000 (то же значение, что у вышеуказанного id(l))# Поскольку существует только один фактический массив, кажется, что он был добавлен в массив l, даже если вы добавили элемент со ссылкой на l2.l2.append(1)

2.3 Арифметические операторы (Вычисление и присвоение значений. Результат вычисления, как правило, помещается в переменную)


a = 1 # переменная а соответствует значению 1b = a # b так же соответствует 1 a = 2 # теперь а соответствует 2, но b не изменяетсяa += 1 # значение а увеличивается на 1 (на данном этапе а равно 3)a -= 1 # значение а уменьшается на 1 (на данном этапе а равно 2)a *= 2 # значение а увеличивается в два раза (на данном этапе а равно 4)a /= 3 # значение а составляет  предыдущего значения (на данном этапе а равно 1.3333333333333333)a = 1+2-3*4/5 # Вычисление в следующем порядке: умножение, деление, сложение, вычитание  a равно 0,6. (Однако, если учитывать погрешность, а равно 0.6000000000000001)

2.4 Создание группы программ через отступ


a = 0# Указываем условие выполнения группы программ, обозначенной отступом.# Далее прописываются условия, циклы, функционализация и т.д.if a == 1:    # Строка, которая смещена вправо на такую же величину в левой части строки от этой строки, составляет одну группу программ.    print(1)    print(2)    pass # Указание на конец группы с отступом    # при выполнении условия if выполняется группа программ до строки вышеprint(3) # вывод независимо от значения а, не подпадающий под условие if# вывод 3

2.4.1 Сгруппированным программам даётся контроль над выполнением операций


# Условие, позволяющее программе понять, запускаться или нетif условие :    # program group# Выполнение повторяется только для элементов массива# Элементы массива присваиваются переменной v в прямом порядкеfor v in массив    # program group# Выполнение продолжается только при соблюдении условийwhile условие:    # program group# Тайминг выполнение группы программ определяется позже# (в первую очередь нужно создать группу программ и дать им имена)def имя группы():    # program group    # После выполнения группы программ, возвращаем результат с помощью return    # Или можно вернуться к началу    return# Ниже описан пример с ошибкой# print(2) с измененным отступом будет относиться к другой группе программ# однако, program group 2 не имеет под собой никакого объясненияif a == 1:    # выполнение группы program group 1 регулируется условием if a==1:    print(1)        # в program group 2 нет регулирующей части, поэтому компилятор выдает ошибку.        print(2)

2.4.2 Формулировка условий


a = 1b = 2c = 2# переменные a и b одинаковы, но a и c разныеif a==b and a!=c:    print("отличается только с")# а больше или равно b (включает а=b) или а>c (не включает а=с)elif a>=b or a>c:    print("а больше или равно b или больше с")# не подходит под условия if и elifelse:    print("кроме этого")# выводит "кроме этого"

2.4.2.1 Другой пример написания условий


a = 1b = 2# если а=b, то v=0, если нет, то v=1v = 0 if a==b else 1print(v)# вывод 1 

2.4.3 Формирование циклов (for)


for v in [0,1,2,3]: # Следующая обработка повторяется для элементов [0,1,2,3]в массиве.    # Проходимся по массиву. Элементы массива выводятся через переменную v в прямом поряке   print(v)   pass # Обозначаем конец отступа# вывод 0 1 2 3# Используя enumerate, можно получить индекс и значение массива в итеративном процессе.for i,v in enumerate([5,3,7,8]):    # i - индекс, v - значение элемента    print("(",i,v,")")# вывод ( 0 5 ) ( 1 3 ) ( 2 7 ) ( 3 8 )# С помощью zip два массива могут быть объединены в один и обработаны итеративно.for v0,v1 in zip([1,2,3,4],[5,6,7,8]):    # v0 содержит элементы массива первого аргумента zip, а v1 содержит элементы второго аргумента.    print("(",v0,v1,")")# вывод ( 1 5 ) ( 2 6 ) ( 3 7 ) ( 4 8 )

2.4.4 Цикл while


a = 3# Пока a больше либо равно 0while a>=0:    print(a)    # Уменьшаем значение a на 1    a -= 1# вывод 3 2 1 0

2.4.5 Функции и методы


# Определение функции: Название - function_name, аргументы: param1 и param2, param2 - аргумент по умолчанию# В случае, если аргумент не установлен, при вызове функции его значение будет равно 1 (значению по умолчанию)def function_name(param1,param2=1):    print("p1:",param1,"p2",param2)    # Эта функция возращает сумму аргументов param1 и param2    return param1 + param2# вызов функции (на данном этапе впервые запускается function_name)# значение param1 = 5,  param2 не устанавливается (используется аргумент по умолчанию)v = function_name(5)# вывод (вывод с помощью оператора print в функции function_name) p1: 5 p2 1print("возвращаемое значение",v)()# вывод "возвращаемое значение 6"

2.4.5.1 Лямба-выражение, пример написания функции


# название функции = lambda (входные аргументы) : (возвращаемое значение) - по такому принципу описывается функция.f = lambda x: x*x# Вызов функции происходит так же, как и в примере с defv = f(2)print(v) # отобразится 4

2.5 Преобразование строки в число


si = "1"   #Строкаsf = "2.3" #Строкаi = 4      #Целое число# Преобразовываем целое число i в строку, происходит конкатенация строкprint(str(i)+si)# 41# Обратная ситуация - преобразовываем строку si в целое число(int), происходит арифметическое сложениеprint(i+int(si))# 5# Преобразовываем строку в число с плавающей запятой (float), опять же происходит сложение (число при выводе автоматически заменяется на float)print(i+float(sf))# 6.3

2.6 Массив, список


# Создание массиваa = [1,1,2,3,2]              # a=[1,1,2,3,2]b = [n for n in range(8)]  # b=[0, 1, 2, 3, 4, 5, 6, 7]# Ссылка# Отрицательные значения становятся индексами, которые выссчитываются с -1 в качестве последнего элементаv = a[0]  # v=1v = a[-1] # v=2# Добавлениеa += [4]     # a=[1, 1, 2, 3, 2, 4]a.append(5)  # a=[1, 1, 2, 3, 2, 4, 5]# Извлечение (перед выполнением a=[1, 1, 2, 3, 2, 4, 5])v = a.pop(0) # v=1, a=[1, 2, 3, 2, 4, 5]# Вырезание (перед выполнением a=[1, 2, 3, 2, 4, 5])# a[первый индекс: предпоследний индекс]# если индексы не прописывать, а оставить просто a[:], первоначальный индекс автоматически станет  равен 0, последний - количество элементов)c = a[1:3] # c=[2, 3]# Максимумминимум (перед выполнением а= [1, 2, 3, 2, 4, 5])mx,mi = max(a),min(a) # mx=5, mi=1# Среднее значение(mean)Медианное значение(median)Наиболее частое значение(mode)Стандартное отклонение(stdev)Дисперсия(variance)# (перед выполнением a=[1, 2, 3, 2, 4, 5])from statistics import mean,median,mode,stdev,variancev = mean(a) # v=2.8333333333333335v = median(a) # v=2.5v = mode(a) # v=2v = stdev(a) # v=1.4719601443879744v = variance(a) #v=2.1666666666666665# Удаление повторений(перед выполнением a=[1, 2, 3, 2, 4, 5])c = set(a) # c={1, 2, 3, 4, 5}# SortedСоздается новый упорядоченный массив(перед выполнением a=[1, 2, 3, 2, 4, 5])c = sorted(a) # c=[1, 2, 2, 3, 4, 5] (массив a остается без изменений)# Sortупорядочивает элементы массива(перед выполнением a=[1, 2, 3, 2, 4, 5])a.sort()      # a=[1, 2, 2, 3, 4, 5]# Одинаково преобразует все элементы массиваmapping (перед выполнением a=[1, 2, 2, 3, 4, 5])# используем лямбда-выражение x: x+2.Значение элемента x меняется на x+2.# list преобразует вывод функции map в массивc = list(map(lambda x:x+2,a)) #c=[3, 4, 4, 5, 6, 7]# Фильтр(перед выполнением a=[1, 2, 2, 3, 4, 5])# используем лямбда-выражение x: x%2==0# Ищется элемент xкоторый делится на два без остатка. Подходящие элементы образуют новый массивc = list(filter(lambda x:x%2==0,a)) #c=[2, 2, 4]# Из всех элементов массива создается одно значение по заданным условиям# x - изначальное значениеесли запускаем цикл, х - значение первого элемента массива# xi - объект текущей операцииfrom functools import reduce# задаем x+xi, получаем сумму всех элементов массиваперед выполнением a=[1, 2, 2, 3, 4, 5]c = reduce(lambda x,xi:x+xi,a) #c=17# задаем max(xi,x), получаем наибольшее значение среди элементов массиваперед выполнением a=[1, 2, 2, 3, 4, 5]c = reduce(lambda x,xi:max(x,xi),a) #c=5

2.7 Словарь (dictionary)ассоциативный массив


# Создание. Ключи - Родной язык, Математика, Английский язык, а значения - массивыd = {    "Родной язык" : [81, 60, 97, 96],    "Математика" : [80, 78, 75, 96],    "Английский язык" : [76, 85, 65, 88],}print(d)# вывод {'Родной язык': [81, 60, 97, 96], 'Математика': [80, 78, 75, 96], 'Английский язык': [76, 85, 65, 88]}# Инициализация с использованием ford1 = {name:[0,1] for name in ["Родной язык","Математика","Английский язык"]}# вывод {'Родной язык': [0, 1], 'Математика': [0, 1], 'Английский язык': [0, 1]}# Получение значений через указание ключаa = d["Математика"] # a=[80, 78, 75, 96]# Замена значений через укзание ключаПерезаписьd["Английский язык"] = [77, 61, 91, 87] # d["Английский язык"]=[77, 61, 91, 87]# Цикл данныхfor k,v in d.items():    print(k,v)# вывод Родной язык [81, 60, 97, 96] Математика [80, 78, 75, 96] Английский язык [77, 61, 91, 87]# Максимальное значениеМинимальное значениев случае с ключом Родной языкjmx,jmi = max(d["Родной язык"]),min(d["Родной язык"])#print(jmx,jmi)# Находим название предмета с наивысшим средним значениемfrom statistics import mean# В массивах типа словарь при использовании max можно в качестве ключевого аргумента указать функцию, определяющую, среди чего искать максимальное значение# В этом случае лямбда-выражение используется для вычисления среднего значения из аргумента k(значение ключа в словаре)kmx = max(d,key=lambda k:mean(d[k])) # kmx="Родной язык"

2.8 Файловая операция with open


# with, файловая операция# with автоматизирует завершение процессов, требующих запуска и завершения.# Например, файл, открытый с помощью open, необходимо закрыть с помощью вызова функции close # Если использовать with и открыть файл с помощью open, при выходе из диапазона with функция close вызовется автоматически.# mode - r: чтениеw: записьa: дополнительная запись# Возвращаемое значение, которое мы получаем с помощью open, назовем fwith open("09_memo.txt",mode="a") as f:    # Записываем в файл    f.write("\n")# Чтение файлаwith open("09_memo.txt","r") as r:    print(r.read())

2.9 Случайное число random


# Использование случайных чиселimport random# Инициализация генерации случайных чисел# Случайные числа позволяют генерировать одну и ту же последовательность случайных чисел несколько раз для экспериментальной воспроизводимости.# Если аргумент seed указать численно, всегда будет выводиться одно и то же число.random.seed(0)# Генерация случайных чисел больше или равных 0 и меньше 1.print(random.random()) # Вывод 0.8444218515250481# Создает случайные целые числа больше первого аргумента и меньше второго аргумента.print(random.randint(1,3)) # Вывод одного числа из 1,2,3# Произвольно выбирает число из массиваprint(random.choice([0,1,2])) # Вывод одного числа из 0,1,2# Извлечение нескольких данных из массива# Вторым аргументом указывается количества выводимых данныхprint(random.sample([0,1,2],2)) # Выводимый массив [1, 2]# Перемешиваем данные в массиве# Новый массив не создается - данные перемешиваются непосредственно в массиве аa = [0,1,2]random.shuffle(a)print(a) # вывод [0, 2, 1]print(random.sample(a,len(a))) # Для создания нового массива можно использовать sample


Спасибо за прочтение!

Мы будем очень рады, если вы расскажете нам, понравилась ли вам данная статья, понятен ли перевод, была ли она вам полезна?
Подробнее..

Перевод Julia готова для прода

22.09.2020 10:23:41 | Автор: admin


Сейчас мне хочется поделиться своими выводами сделанными после нескольких бесед, в которых я участвовал на JuliaCon 2020.


Я потратил уже 20 лет на развертывание в корпоративных средах проектов связанных с наукой о данных (тогда она так еще не называлась, но мы уже обучали нейронные сети делать прогнозы), и у меня есть много коллег, которые глубоко занимаются разработкой корпоративного программного обеспечения. Процитирую Томаша Ольчака, который воистину является армией из одного человека во время реализации сложных корпоративных проектов:


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

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


Джулия готова идти в производство!


Позвольте мне теперь привести список ключевых (на мой взгляд) презентаций, сделанных во время JuliaCon 2020, которые заставили меня сделать этот вывод.


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


Создание микросервисов и приложений


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


Еще будет интересно:


  • Доклад по характеристикам приложений, где Кристоффер Карлссон покажет как создать исполняемые файлы, которые могут быть запущены на машинах, на которых не установлена Julia.
  • Презентация Julia for scripting, в ходе которой [Фредрик Экре]() обсуждает лучшие практики использования Julia в контекстах, где вам нужно много раз выполнять короткие фрагменты кода.
  • Доклад Genie.jl, в котором Адриан Сальчану показывает зрелый, стабильный, производительный и многофункциональный фреймворк веб-разработки на Julia.

Управление зависимостями


Пара докладов Pkg.update() и What's new in Pkg показывает, что в настоящее время Julia имеет лучшие в своем классе функциональные возможности для управления зависимостями корпоративного уровня для ваших проектов. Список предоставляемых функций настолько велик, что здесь трудно перечислить их все.


Позвольте мне только упомянуть один конкретный инструмент в этой экосистеме BinaryBuilder.jl, который позволит взять программное обеспечение, написанное на компилируемых языках, таких как C, C++, Fortran, Go или Rust, и построить предварительно скомпилированные артефакты, которые могут быть легко использованы из пакетов Julia (что означает, что не нужна никакая компиляция на стороне клиента, когда вы устанавливаете пакеты, имеющие такие зависимости).


Интеграция с внешними библиотеками


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



Здесь стоит добавить, что Джулия уже много лет отлично интегрируется с Python, см. JuliaPy.


Хорошим всеобъемляющим примером выполнения некоторой реальной работы в Julia, требующей интеграции, является создание многоканальной беспроводной настройки динамиков, где показано, как легко сшивать всякие штуки вместе (и, в частности, с помощью ZMQ.jl, Opus.jl, PortAudio.jl, и DSP.jl).


Еще один интересный доклад, демонстрирующий возможности интеграции, это JSServe: Websites & Dashboards в Julia, который показывает высокопроизводительный фреймворк для легкого объединения интерактивных графиков, markdown, виджетов и простого HTML/Javascript в Jupyter / Atom / Nextjournal и на веб-сайтах.


Инструментарий разработчика


В паре замечательных докладов Juno 1.0 и Using VS Code рассказывается, что текущая поддержка IDE для Джулии в VS Code первоклассна. У вас есть все для полного счастья: анализ кода (статический и динамический), отладчик, рабочие области, интеграция с ноутбуками Jupyter и удаленные возможности.


Управление рабочими процессами в машинном обучении


Я не хочу охватывать множество различных алгоритмов ML, доступных в Julia изначально, так как их просто слишком много (и если чего-то не хватает, вы можете легко интегрировать его см. раздел возможности интеграции выше).


Однако в дополнение к конкретным моделям вам нужны фреймворки, позволяющие управлять рабочими процессами ML. В этой области есть две интересные презентации: MLJ: A machine learning toolbox for Julia, и AutoMLPipeline: A ToolBox for Building ML Pipelines. По моему опыту, такие инструменты имеют решающее значение, когда вы хотите перейти с вашими ML-моделями из песочницы дата-саянтиста в реальное производственное использование.


Выводы


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


  • модели корпоративного уровня для создания микросервисов, приложений и
    надежные инструменты управления зависимостями,
  • очень гибкие и мощные возможности для интеграции Julia с существующими кодовыми базами, которые не были написаны на Julia,
  • отличный инструмент разработчика в VSCode,
  • зрелые пакеты, которые помогут вам создать производственный код для развертывания ML-решений,

покажут, что уже сейчас Джулия может (и должна) рассматриваться как серьезный вариант для вашего следующего проекта в корпоративной среде.


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


Готова Ли Джулия для прода? Вопросы и ответы с Богумилом Каминским


Статья профессора Каминского вызвала немного ажиотажа на Hacker News. Некоторые комментаторы высказывали сомнения в том, что Джулия может считаться готовой к производству из-за, в частности, документации, пакетов, инструментов и поддержки.


InfoQ решило поговорить с профессором Камински, чтобы лучше понять его позицию.


InfoQ: Не могли бы вы описать ваш быкграунд и вашу связь с Julia?


Bogumi Kamiski: Я профессор Варшавской школы экономики SGH, Польша, работаю в области операционных исследований и имитационного моделирования.
Я нахожусь в топ-5% участников языка Julia по количеству коммитов, внес значительный вклад в экосистему данных Julia и, в частности, один из основных мейнтейнеров DataFrames.jl.
Я занимаю второе место по ответу на тег [julia] в StackOverflow. Прежде чем перейти на полный рабочий день в академию, я более 10 лет руководил командой из нескольких сотен разработчиков и аналитиков, развертывающих проекты BI/DWH/data science для крупнейших польских корпораций и учреждений.


InfoQ: Основная аргументация в вашей статье, по-видимому, заключается в том, что экосистема Julia теперь достигла уровня зрелости, который делает ее готовой к производству. Не могли бы вы подробнее остановиться на этом моменте? Что препятствовало внедрению Джулии в производство и каковы наиболее значительные достижения, которые устранили эти блокирующие моменты?


Kamiski: Здесь очень важно определить, что я понимаю под готовностью Джулии к проду.


Я бы определил это так: наличие у языка основных пакетов достигает такого уровня стабильности, что вещи не меняются кардинальным образом "каждые шесть месяцев". Это означает, что когда вы начинаете проект, вы можете смело ожидать, что в долгосрочной перспективе (несколько лет) все должно просто работать.


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


Это не означает, что новые пакеты не находятся в состоянии "потока", но это то, что засвидетельствовано любой экосистемой пакетов, поскольку новые вещи развиваются быстро.


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


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


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


Почему это так важно? Ну, вы можете легко "отправить" проект Julia и ожидать, что любой человек в любой среде должен быть в состоянии относительно легко запустить его. Конечно, будут угловатые моменты; но мой опыт ежедневного использования Linux и Windows 10 заключается в том, что все должно просто работать на обеих платформах.


Если вы делаете проект в Julia, вы можете ожидать, что либо есть пакет, который делает то, что вы хотите, либо вы можете легко использовать код, написанный на C или Python, и заставить его работать. В своем посте я хотел подчеркнуть, что мы находимся именно в этом состоянии. В качестве примера, основанного на чем-то, над чем я работал на этой неделе, у Джулии есть отличный пакет LightGraphs.jl для работы с графиками, но мои сотрудники используют Python и предпочитают использовать igraph. Вот пример кода с использованием графика (взято из учебника для графика в Python):


import igraph as igg = ig.Graph()g.add_vertices(3)g.add_edges([(0,1), (1,2)])g.add_edges([(2, 0)])g.add_vertices(3)g.add_edges([(2, 3), (3, 4), (4, 5), (5, 3)])g.pagerank()

Теперь вы спросите, как бы выглядел эквивалент в Julia. А вот так:


using PyCallig = pyimport("igraph")g = ig.Graph()g.add_vertices(3)g.add_edges([(0,1), (1,2)])g.add_edges([(2, 0)])g.add_vertices(3)g.add_edges([(2, 3), (3, 4), (4, 5), (5, 3)])g.pagerank()

Как видите, он идентичен. Конечно, не во всех случаях это так просто, так как, например, словари в Julia и Python имеют разные синтаксисы, но это общее правило о том, как все работает. У вас даже есть вкладка-завершение и прямой доступ к строкам документов.


Что это означает на практике? Если вы делаете проект, вы не застреваете с мыслью: "могу ли я использовать Джулию, так как через три месяца, возможно, мне понадобится что-то в проекте, чего еще нет в Джулии"? Но скорее вы знаете: "я могу относительно безопасно использовать Julia, так как в настоящее время многие пакеты общего назначения уже существуют, и даже если чего-то не хватает, я могу просто использовать это с другого языка, и это будет относительно безболезненно, независимо от того, является ли это C/Python/R/...".


Также частью производственной готовности является то, что с PackageCompiler.jl вы можете создавать "приложения, которые представляют собой набор файлов, включая исполняемый файл, который может быть отправлен и запущен на других машинах без установки Julia на этой машине." Я не рассматриваю это как существенную часть готовности для продакшена (многие скриптовые языки, считающиеся готовыми к производству, не предоставляют этой опции), но во многих сценариях это хорошая функция.


Теперь позвольте мне уточнить, что я не вижу в определении термина "готовый к производству". Я не рассматриваю Джулию как язык, который лучше всего подходит для любого вида проекта. Каждый язык программирования имеет свою нишу, и ниша Julia это высокопроизводительные вычисления / наука о данных (или как вы это там называете). Если вам нужны компактные бинарные файлы наверняка Julia не является лучшим вариантом. Если вы хотите разрабатывать приложения для Android тут тоже посоветую смотреть в другом направлении.


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


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


Kamiski: Процитирую то, что я написал в начале своего поста:


"Я потратил 20 лет на развертывание проектов, связанных с наукой о данных, в корпоративных средах (тогда это не называлось наукой о данных, но мы уже обучали нейронные сети делать прогнозы), и у меня есть много коллег, которые глубоко занимаются разработкой корпоративного программного обеспечения."


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


Если вы посмотрите на опрос разработчиков Julia, слайд 28, то станет ясно, что люди используют Julia для вычислений и это те области, где, по моему мнению, Джулия готова к производству.


Теперь, что касается таких вещей, как документация, пакеты, инструменты и поддержка конечно, это должно и может быть улучшено. И я согласен, что более зрелые экосистемы, такие как R/Python/Java, в среднем имеют здесь лучший охват. Например, как соразработчик DataFrames.jl, я могу сказать вам, что большинство последних PR связаны с документацией. Но я бы не стал недооценивать сообщество Джулии здесь. В общем, если у вас есть какой-либо вопрос и вы разместите его на SO, Julia Discourse или Julia Slack, вы можете получить ответ обычно в течение нескольких минут, самое большее часов. Вот типичная история такого рода: люди обычно очень отзывчивы, и ошибки исправляются довольно быстро.


Если бы меня попросили назвать главный сомнительный момент касательно Джулии, то это было бы наличие достаточного количества людей, квалифицированных в этом языке в общем сообществе разработчиков. Я могу понять владельцев продуктов / менеджеров проектов и их чувство риска того, что они не смогут найти достаточно людей для работы над своими проектами, как только они возьмут на себя смелость начать работать на Julia. Однако здесь я убежден, что ситуация быстро улучшается. В прошедшем JuliaCon 2020 приняли участие более 20 000 участников. Кроме того, есть много ресурсов, уже доступных бесплатно в интернете.


InfoQ: Помимо вопроса о том, готова ли Джулия к проду или нет, или для каких областей она предназначена, каковы, на ваш взгляд, основные сильные стороны языка? Рассматриваете ли вы его как замену Python, R или любому другому языку, по крайней мере в области научных вычислений и науки о данных?


Kamiski: Я думаю, что здесь снова лучше всего процитировать последний опрос разработчиков Julia, слайды с 8 по 11. Я бы сосредоточился на трех главных вещах из слайда 8:


  • Скорость здесь ситуация относительно проста. Возьмите любой зрелый пакет, такой как TensorFlow или PyTorch, который требует производительности; они написаны в основном на C++. А Python это всего лишь тонкая оболочка вокруг ядра C++. Теперь возьмем Flux.jl или Knet.jl. Они по существу реализованы в чистом виде. Итак, суть такова: если вам нужно, чтобы ваш код работал быстро, в то же время используя преимущества языка высокого уровня, то Julia это естественный выбор. Кроме того, как объяснялось выше, если есть внешняя библиотека, которая очень быстра, и вы хотите использовать ее, обычно это относительно легко сделать.


  • Простота использования есть множество проявлений этого аспекта, но мой опыт показывает, что когда кто-то получает представление о принципах Джулии, он очень хорошо сравнивается с точки зрения синтаксиса и дизайна, например, с R/Python при выполнении вычислений. Язык был разработан вокруг поддержки этих видов задач в лучшем виде. И это не только синтаксис это также выбор того, когда вещи будут происходить явно, а когда нет (например, с трансляцией). Исходя из моего опыта, это делает код Джулии простым в обслуживании, а хорошо написанный код в значительной степени самодокументируется.


  • Код является открытым и может быть изменен этот аспект имеет два измерения. Прежде всего, большинство пакетов Julia лицензированы MIT, что часто очень приветствуется в корпоративных средах. Во-вторых поскольку большинство пакетов написано на Julia, то если вам не нравится, как что-то работает вы просто модифицируете это сами (что гораздо проще, чем в R/Python, где, скорее всего, то, что вам нужно изменить, написано, например, на C, C++, Fortran).



Люди часто спрашивают меня, вижу ли я Джулию в качестве замены R / Python. И я думаю об этом так::


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


  • Если у вас есть новая задача, не требующая критической производительности просто используйте язык, который вы знаете лучше всего (и если для вас часто актуален пункт 1 как для меня вы можете смело выбрать для этого Julia).


  • Если у вас много устаревшего кода R/Python и вы им довольны просто придерживайтесь его и помните, что если у вас есть некоторые критически важные для производительности части, они могут быть относительно легко переписаны на Julia и интегрированы обратно с вашей исходной кодовой базой (я сделал много таких проектов).



InfoQ: Как вы видите эволюцию Джулии?


Kamiski: Во-первых, я бы сказал, что согласен с тем, что подразумевается в вашем вопросе: это будет "эволюция", а не "революция". Конструкция Джулии оказалась надежной, и я не думаю, что она изменится радикально; скорее, во многих областях будут наблюдаться постепенные улучшения.


Если бы я назвал здесь некоторые основные изменения, то это были бы:


  • Улучшение поддержки многопоточности. Я думаю, что это действительно актуально для основных случаев использования Julia. Так-то поддержка есть, но все же здесь многое можно улучшить. Точно так же следует ожидать улучшения в обработке GPU/TPU.


  • Улучшение задержки компилятора. Опять же, с каждым релизом он становится намного лучше, но это как раз то, на улучшение чего все уповают.


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


  • Рост сообщества я считаю, что число людей, заинтересованных в Джулии, значительно увеличивается, о чем свидетельствует, например, количество участников JuliaCon2020. Это означает, что: а) в будущем будет легче нанимать качественных разработчиков Julia, если они понадобятся, и б) это создаст положительную обратную связь для качества экосистемы Julia, поскольку все больше людей сообщают о проблемах и участвуют в них. Опять же, как сопровождающий DataFrames.jl я наблюдаю этот сдвиг: люди, которые никогда не были в "ядре" разработки пакета, открывают вопросы / делают PR и обсуждают функциональные возможности в социальных сетях.



Если вы заинтересовались языком Julia, все доклады с JuliaCon 2020 доступны на YouTube.

Подробнее..

Data Fest 2020 полностью в Online уже завтра

18.09.2020 14:13:41 | Автор: admin
Data Fest пройдет в этом году в онлайн формате 19 и 20 сентября 2020. Фестиваль организован сообществом Open Data Science и как обычно соберет исследователей, инженеров и разработчиков в области анализа данных, искусственного интеллекта и машинного обучения.

Регистрация. Ну а дальше к деталям.



События этого года влияют не только на людей и экономику, но и на организацию мероприятий. Поэтому Data Fest в этот раз превращается в 2х дневный глобальный бесплатный фест, проходящий в формате онлайн-конференции. Присоединиться однозначно стоит, у вас будет уникальная возможность пообщаться с командами Мегафона, McKinsey, Huawei, Yandex, с топовыми организаторами из ODS.ai и другими специалистами в области технологий со всего мира, не вставая с дивана.

В 2019 году мы собирались на площадках в таких городах как: Минск, Одесса, Новосибирск и даже, на минуточку, в Дубае. За прошлый год мы разослали тысячи инвайтов на наши мероприятия, но вот Data Fest 2020 впервые соберет нас в онлайн.

Программа и треки


Data Fest 2020 глобальное онлайн мероприятие, состоящее из 5 тематических блоков. Для участников будут доступны десятки выступлений, некоторые из которых будут проходить параллельно. Дополнительно более трети всего контента феста будет доступно на английском языке. Так что встретимся в эти выходные, чтобы обсудить горячие темы:

  • Бизнеса важные темы со стороны бизнеса.
  • Индустрии применение DS/ML в индустрии.
  • Инженерии технические секции о прикладных методах и о том, как это работает.
  • Науки научные секции по актуальным и горячим темам.
  • Сообщества жизнь сообщества и специалистов.

P.s. Все доклады по темам сформированы в треки, которые в свою очередь состоят из видео-докладов, практических заданий и статей. Важно, что все треки навсегда попадут в историю ODS.ai, сформировав базу знаний для следующих поколений дата-саентистов.

А вот посмотреть, как проходили Data Festы в прошлом и вдохновиться на будущий, можно здесь.



Основные активности


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

  • Livestream конференция на youtube: спикеры секций, беседы с Алексеем Натекиным, основателем ODS.ai, включения из разных городов, разбавленные умиротворяющими лесными пейзажами (с ламами и оленями (и это не шутка));
  • Networking в Spatial Chat: максимально приближенный к офлайн конференции формат. В комнате можно вести несколько бесед параллельно, присоединяясь к той, которая наиболее интересна (или куда возьмут).

Вроде все по-старому. А теперь разберемся с доступом.
Смотреть прямую трансляцию феста может любой желающий, достаточно просто подключиться 19 и 20 сентября к эфиру по ссылке, которая будет доступна на сайте. А вот чтобы попасть в networking комнаты, нужна регистрация (да-да, она обязательна). Комнаты будут сгруппированы по существующим трекам, их порядка 35.



Ну а если вы еще сомневаетесь, нужно ли участвовать в Data Fest 2020, то вот вам пара весомых причин:


  • Оценить новый формат: пожалуй, такого масштабного онлайн ивента в области Data Science еще не было.
  • Послушать спикеров: среди них заявлены Алексей Натёкин основатель сообщества ODS.ai, организатор Data Fest, Валерий Бабушкин руководитель управления развития данных в компании X5 Retail Group, Михаил Рожков основатель онлайн-курсов по управлению экспериментами и проектированию машинного обучения, Асхат Уразбаев управляющий партнер в ScrumTrek, Павел Плесков digital nomad, data scientist в стартапе Praxis Pioneering, Eghbal Rahimikia доктор философии Alliance Manchester Business School, University of Manchester, Ser-Huang Poon профессор University of Manchester, Alliance Manchester Business School и это далеко не все.
  • Узнать новое по темам ML, Big Data, Quantum Computing, Computer Vision, Индустрия Антифрода/Антиспама, математическую оптимизацию задач ML, ML Repa, и многого другого. Полный список треков на сайте.
  • Пообщаться с DS командами Мегафона, McKinsey, Huawei, Yandex
  • Нетворкать, прокачивать soft skills и послушать, как строится карьера в Data Science.



Но что остается неизменно Data Fest, это по-прежнему глобальный мировой ивент. И это не просто слова. Присоединяйтесь!

Подробнее..

SmartData 2020 конференция про data engineering

22.09.2020 14:11:12 | Автор: admin


Если ваша должность data engineer, то вы могли сталкиваться с обидным информационным перекосом. Тему data science освещают активно, по ней много полезных материалов. А вы работаете в смежной области, где тоже возникает много важных вопросов, но об этих вопросах говорят заметно меньше.


Мы решили, что стоит закрыть этот пробел, поэтому 9-12 декабря проведём конференцию SmartData. Она рассчитана на дата-инженеров и не только: разработчики и data scientists, которые сталкиваются с задачами дата-инженерии или хотят перейти в эту сферу, тоже извлекут пользу.


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


Предыстория


Старожилы Хабра могут помнить, как в 2017-м мы представили конференцию по большим и умным данным SmartData, а в 2018-м отменили вторую SmartData. И про перспективы возрождения тогда написали: сейчас не станем ничего обещать, но думаем, как можно сделать лучше. Спустя два года сообщаем: подумали!


Когда мы впервые запускали конференцию, пытались объять всё сразу и сделать мероприятие для всех, кто работает с данными. Но оказалось, что такой универсальный формат плохо работает, разным специалистам нужно слишком разное. И после отмены второй конференции, где мы собирались уделить много внимания data science, получили фидбек вроде такого:



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


Темы


Что всё это значит на практике, о каких вещах можно будет услышать на SmartData 2020? Программа пока что в процессе формирования, но очерчен круг тем, которые мы считаем интересными для конференции. И по этому списку можно понять, чего в принципе стоит ждать:


Streaming
Flink
Spark
Kafka


СУБД и хранилища для больших данных
Использование классических реляционных, колоночных, noSQL, SMP/MPP-хранилищ для построения DWH:
Hive, Impala, Presto, Vertica, ClickHouse, Cassandra
Teradata, Redshift, GreenPlum, exadata
MSSQL, PostgreSQL
MongoDB, DynamoDB
S3, ADLS, GCS, HDFS


Архитектура DWH
Моделирование данных
Примеры построения корпоративных хранилищ данных
Оперативная аналитика
Ad-hoc reporting
Hadoop


Data governance
Data security
Data quality
Metadata и catalog management
Master data management
Миграция данных


Технологии построения ETL
Spark
Hadoop MapReduce
Sqoop
Performance analysis and optimization
и так далее


Оркестрация и MLOps
Airflow, NiFi, Luigi, Azkaban, Oozie etc
MLflow
и так далее


Другое
Коробочные облачные решения
Дата-инженерия для тех, кто не data engineer
CI/CD для пайплайнов данных
Тестирование



Виталий Худобахшов из программного комитета SmartData


Формат


Как и другие наши конференции этого сезона, SmartData пройдёт в онлайне так что подходить на стойку регистрации за бейджиком в этот раз не придётся. А как всё будет выглядеть?


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


  • Чтобы зрителям было как можно удобнее, для проведения конференций мы используем не чужое софтовое решение, а разработали своё собственное. О нём уже писали на Хабре подробно.


  • Расписание отличается от того, к которому все привыкли по офлайн-конференциям. В офлайне на пару дней выпадаешь из обычной жизни целиком. В онлайне иначе: конференция растянется на четыре дня, но будет идти по 3-4 часа в день. Это позволяет не выпадать полностью из обычной жизни, совмещая конференцию и обычную жизнь.


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



Call to action


Что в итоге? Есть три главных вещи:


  1. Если конференция вас заинтересовала стоит перейти на её сайт. Там всегда размещается наиболее актуальная информация (например, будет постепенно появляться список докладов), и там же можно приобрести билет.


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


  3. А если для вас важны и другие области IT, обратите внимание: у нас есть билеты full pass, дающие доступ и к SmartData, и к 7 другим нашим конференциям нового сезона. Подробнее об этом можно узнать на отдельном сайте.



Увидимся на SmartData!


Подробнее..

Как я дешево покупаю Apple, используя анализ данных

26.08.2020 14:06:49 | Автор: admin

Идея


Для меня техника Apple долгое время была недоступным продуктом. Однако, несколько лет назад, я открыл для себя пару идей которые позволяют мне покупать технику Apple за очень дешево, например новый MacBook для меня стоил всего лишь 20.000 рублей, AirPods вообще 800 рублей, последний iPhone самый дорогой из списка: 30.000 рублей. Технику я всегда покупаю исключительно новую, но использую несколько правил как для ее покупки, так и для продажи. Продажи очень важная часть процесса, технику необходимо вовремя продавать; раньше я мог пользоваться техникой 4 года и позже просто оставлять свой старый iPhone это не есть рационально с экономической точки зрения. Идея моего метода проста: минимизировать разницу между ценой покупки и ценой продажи.
В статье я покажу, как я пришел к оптимальной дате для покупки и продажи, используя статистику цен на технику предыдущих лет и парсинга сайтов с Б/У техникой. Отмечу, что этот процесс можно проделать для любой техники, я рассмотрю Apple.

Покупка


Покупка самая несложная часть. У меня очень простой алгоритм: я захожу на Яндекс Маркет и выбираю наименьшую цену, спустя максимум месяц после выхода нового устройства. Все. Конечно, это техника с Горбушки, которую привезли из Европы или Америки, но единственное, что я теряю по сравнению с РСТ техникой это второй год гарантии, лично для меня -20% гораздо выгоднее, чем год дополнительной гарантии. (Пока писал статью бесплатно заменили один наушник AirPods Pro из-за того, что он трещал). В этом году я купил себе MacBook Pro за 80 тысяч и AirPods Pro за 16 тысяч, (продав предыдущий MacBook за 40 и купив за 60, а AirPods я вообще продал за 8(по отдельности правда)) ), покупая за 8800). Эти цены даже соотносятся с ценами в американском магазине Apple без налогов. Стоит отметить, что необходимо обязательно проверять технику перед покупкой: смотрите на серийный номер, совпадение его на телефоне и на коробке и различные другие элементы предосторожности при покупки техники на подобных рынках.

Продажа


Отмечу, что покупка техники это Импорт и происходит сохранение средств в долларах. Идея в том, что покупая MacBook за 80000 рублей, вы на самом деле покупаете его за $1200 и можете продать его на зарубежных площадках за доллары, то есть различные колебания курса рубля для моей модели будут несущественны. Тем не менее, я продавал всю технику на авито, так как валютный курс последние 4-5 лет был стабильный: 1$ = 65рублей.
В продаже самое главное выбрать удачное время: это и есть задача данный статьи, рассчитать наиболее прибыльное время покупки и продажи устройства.

Выбор устройства


Окей, я рассмотрю мою модель на примере iPad, который я планирую приобрести. Кстати, про iPhone это один из самых невыгодных гаджетов он стоит как MacBook, при этом не обладает необходимым для рабочей машины функционалом, а его стоимость, например мой XS, упала за год на 50%, резюмируя iPhone покупать крайне невыгодно.

Парсинг авито


Я не нашел у Авито API, поэтому мне пришлось использовать Python и Selenium. Не самое стабильное решение, но вроде работает. Для начала попытаюсь подгрузить данные по запросу iPad 11 PRO 64GB и посмотреть, что там с ценами и проанализировать их. Мой код на Selenium выглядит следующим образом:
Код на Selenium
import csvfrom selenium import webdriverfrom webdriver_manager.chrome import ChromeDriverManagerfrom selenium.webdriver.chrome.options import Optionssearch = 'iPad Pro 11 64GB'page = 1with open('venv/{}data.csv'.format(search), 'w') as new_file:    # csv    fieldnames = ['Search key', 'Page', 'Price, RUB', 'Subway nearby']    csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter=',')    csv_writer.writeheader()    # prepare for parsing    chrome_options = Options()    chrome_options.add_argument("--headless")  # we will not open selenium browser just not to slow your pc =D    website = 'https://www.avito.ru/moskva?q=' + str(search) + '&p=' + str(page)    driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)    driver.implicitly_wait(10)    driver.get(website)    # shit to find    name = "h3[class='snippet-title']"    url = "a[class='snippet-link']"    price = "span[data-marker='item-price']"    address = "div[class='item-address']"    # itemlines    try:        driver.find_element_by_css_selector("div[class='item__line']")  # check if selector exists        itemlines = driver.find_elements_by_css_selector("div[class='item__line']")        # code to execute        for el in itemlines:            try:                el.find_element_by_css_selector(address)                new_file.write(str(el.find_element_by_css_selector(name).text).replace(',', '') + ',' +                               el.find_element_by_css_selector(url).get_attribute('href') + ',' +                               el.find_element_by_css_selector(price).text + ',' +                               str(el.find_element_by_css_selector(address).text).replace(',', '.'))                new_file.write('\n')            except:                new_file.write(str(el.find_element_by_css_selector(name).text).replace(',', '') + ',' +                               el.find_element_by_css_selector(url).get_attribute('href') + ',' +                               el.find_element_by_css_selector(price).text + ',' +                               'None')                new_file.write('\n')        print('Data saved to CSV | {}.csv'.format(search))    except:        print('There are no items due to your request')    # global quit and log    print('Browser closed')    driver.quit()


Посмотрю, что в итоге получилось в табличке:
Табличка

Достаточно много выбросов очевидно, что iPad Pro с игрой Fortnite без возникшего инфоповода никогда бы не стоил 120000, ровно как и iPad с заблокированной материнкой за 4500. Если кратко, надо подчистить дату и убрать все ненужное, чтобы это уже можно было анализировать.

Анализ данных


Теперь предстоит достаточно тривиальный анализ открываю jupyter notebook и импортирую pandas начинаю работать с данными. Окей, первое что я хочу сделать убрать значок рубля, который остался в табличке при парсинге.
data['Price, RUB'] = data['Price, RUB'].str.replace("", "")

Теперь хотелось бы, чтобы столбик Price, RUB был в формате int32.
data['Price, RUB'] = data['Price, RUB'].str.replace(' ', '')data['Price, RUB'] = data['Price, RUB'].astype('int32')


Оставляю только те позиции, которые дороже 30000 и дешевле 68000. (цена нового iPad Pro).
data = data[data["Price, RUB"] > 30000]data = data[data["Price, RUB"] < 68000]


Теперь можно просто посчитать среднее.
data["Price, RUB"].mean()

Cредняя цена на б/у iPad Pro 11 64 GB = 48382рублей
В целом достаточно логичное значение, единственное, что меня смутило большое стандартное отклонение. Теперь посмотрю на iPad Pro 2017 года. (до этого я искал только iPad 2018 год выпуска, указав диагональ 11).

Мой search это:
search = 'iPad PRO 10.5 2017 64Gb WIFI'

Cредняя цена на iPad Pro 2017 года 10.5 WIFI 64 GB = 25888рублей
Посчитать цены использования очень просто.
2 года использования iPad PRO 2018 = (62000 48382) / 2 = 13675рублей (6837.5 в год)
3 года использования iPad PRO 2017 = 36112 рублей (12037 в год)

В начале статьи я написал цену своих устройств, имея ввиду конечно разницу их покупки и продажи, как видно можно купить iPad Pro и пользоваться им два года всего лишь за 13675 рублей. Именно так и стоит покупать технику и держать в голове разницу между ценой покупки и ожидаемой продажи.

Разница на цены различных iPad в год почти в два раза, при том наибольшее снижение стоимости происходит сразу после покупки и в n-ый год, где n цифра, зависящая от выхода нового поколения, времени работы аккумулятора, развития новых технологии, поддержки новой OC и так далее. Какой вывод можно сделать, анализируя данные про iPad? iPad выгодно продавать спустя 2 года и покупать новый, так можно минимизировать траты на его использование.

Почему продавать необходимо спустя 2 года


В каждом из устройств Apple встроен Литий-ионный аккумулятор, срок службы которого и составляет 2-3 года, в зависимости от использования. После истечения времени, устройство начинает работать некорректно: тормозить, быстро разряжаться и т.д. Кcтати, в Америке Apple продает iPhone по контракту ровно на 24 месяца, скорее всего из-за аккумулятора.

Почему Apple стоит продавать до презентации


Здесь все еще логичнее: новая презентация = новые устройства и поэтому старые снижаются в цене. Чтобы было более понятно график от bankmycell.


Выводы


1. При покупке необходимо учитывать разницу между ценой покупки и ожидаемой ценой продажи.
2. Стоит посмотреть исторические цены продажи устройства.
3. Анализ данных на примере iPad показывает, что его выгоднее продать спустя 2 года.
4. Из-за литий-ионных аккумуляторов продавать устройство лучше всего спустя 2, максимум 3 года.
5. Apple рационально продавать до презентации так будет наиболее прибыльно.
6. В моей модели не были учтены такие важные факторы как: наличие нового дизайна, поддержка ОС и новых технологий(5G например), и другие факторы.

Источники


[1]. Lithium-Ion Battery Maintenance Guidelines. URL: www.newark.com/pdfs/techarticles/tektronix/LIBMG.pdf. Accessed 26.08.2020
[2]. CELL PHONE DEPRECIATION & PRICE DROPS. URL: www.bankmycell.com/blog/phone-depreciation. Accessed 26.08.2020
Подробнее..

Black Olives Matter раса, криминал и огонь на поражение в США. Часть 1

04.09.2020 04:18:51 | Автор: admin
Дисклеймер

Зная, насколько эта публикация может оказаться воспринятой как "политическая" и насколько разнятся мнения людей по определенным злободневным вопросам, сразу внесу следующие оговорки:

  • Автор публикации не является расистом, не считает, что представителей одних рас должны обладать какими-либо привилегиями или предпочтениями по сравнению с представителями других рас. Для меня все люди - братья!

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

  • Цель публикации - статистический анализ данных из открытых источников и выявление взаимосвязей и закономерностей; широкие выводы предоставляется сделать читателям.

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

  • Я не считаю себя профессиональным Data Scientist и использую самые базовые инструменты анализа данных (при этом, наверное, не всегда наиболее оптимальным способом). Буду благодарен каждому за подсказки, как можно сделать то или иное более эффективно или углубить исследование!

Во времена Советского Союза нашим с вами, уважаемые читатели, папам и мамам, дедушкам и бабушкам неустанно и отовсюду напоминали о том, как "империалисты" притесняли и угнетали представителей иных рас, как уже после отмены крепостного права в Российской Империи американские капиталисты продолжали использовать рабский труд африканцев и их потомков, как и в нынешнем (на то время) двадцатом веке издевательства не прекращаются даже после формального упразднения рабства, выражаясь в самых возмутительных формах апартеида, унижений, расизма и ненависти... Классические романы вроде "Хижины дяди Тома" Гарриет Бичер-Стоу и "Убить пересмешника" Харпер Ли еще сильнее упрочняли негодование борцов за свободу по всему миру. Да, расизм со стороны белых процветал в США до 1960-х - 1970-х. Но и, конечно, эти притеснения были отличным подспорьем для социалистической пропаганды, не щадящей красок в живописании "зверств акул капитализма". С середины 1950-х в США началось сильное движение за борьбу с расовым неравенством, которое было в итоге поддержано властями и кардинально изменило ситуацию с социальными свободами к 1980-м. Обо всем этом можно прочитать хотя бы в Википедии. А что теперь?..

Иллюстрация к роману Г. Бичер-Стоу "Хижина дяди Тома". "Классическое" изображение рабского труда африканцев.Иллюстрация к роману Г. Бичер-Стоу "Хижина дяди Тома". "Классическое" изображение рабского труда африканцев.

Почти все то же, что наши родичи читали со страниц "Правды" в 1960-х, сейчас мы слышим со всех американских СМИ. Расовая несправедливость! Насилие со стороны полиции и иных слуг закона! Как мы все видели, после гибели Джорджа Флойда в США начались массовые протесты, перешедшие местами в беспорядки и погромы под лозунгом Black Lives Matter. Итог общественного мнения в США на сегодняшний день: полиция убивает чернокожих по причине массового расизма со стороны белых.

Цели исследования

Как и многим из вас (я уверен), мне часто хочется самостоятельно разобраться в каком-то вопросе, особенно если:

  • вопрос широко обсуждается и составляет предмет споров

  • освещение почти во всех СМИ носит явно окрашенный характер (т.е. налицо пропаганда той или иной позиции)

  • есть достаточное количество исходных данных, доступных для изучения

Интересно заметить, что эти три пункта связаны между собой: 1) злободневные вопросы почти всегда однобоко освещаются прессой, так как истинно свободной прессы почти нет (да и была ли когда-то?) 2) злободневные темы порождают сообщества активистов, которые начинают собирать и анализировать данные в поддержку своей точки зрения (или во имя справедливости); также данные начинают открывать / предоставлять публике официальные источники (чтобы их нельзя было обвинить в сокрытии оных). Об имеющихся данных поговорим чуть позже, а пока - цели исследования.

Я хотел для себя ответить на несколько вопросов:

  1. Какова статистика применения поражающего огня полицейскими против черных и белых в абсолютном выражении (т.е. количество случаев) и в удельном выражении (на количество представителей обеих рас)? Можно ли сказать, что полицейские убивают черных чаще, чем белых?

  2. Какова статистика совершения преступлений представителями обеих рас (в абсолютном и удельном выражениях)? Представители какой расы статистически чаще совершают преступления?

  3. Имеется ли взаимосвязь между статистикой совершения преступлений и статистикой гибели от рук полиции (в целом по США, а также отдельно для белых и черных)? Можно ли сказать, что полиция стреляет насмерть пропорционально количеству совершаемых преступлений?

  4. Каким образом найденные закономерности (по пунктам 1-3) распределены между отдельными штатами США?

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

Оговорки и допущения

Вы ведь прочитали дисклеймер в начале статьи? :) Кроме того, что там написано, вот еще несколько допущений и оговорок, принятых для исследования в основном в целях упрощения:

  • Исследование касается только США и не распространяется на другие страны.

  • Представителей чернокожей расы в США для краткости я могу называть "черными", а представителей белокожей расы - "белыми"; эти краткие наименования не отражают какого-то неуважения, а приняты именно для лаконичности.

  • Представители белокожей расы ("белые") включают латиноамериканцев (проживающих на территории США), но исключают представителей азиатских рас, американских индейцев, гавайцев, эскимосов и представителей смешанных рас, в соответствии с данными по населению в Википедии, взятыми из официальной переписи населения в США.

  • Для настоящего исследования взяты только белая и черная расы; представители иных рас, а также те, чья раса не указана в источниках, не включены в исследование. Это ограничение сделано для упрощения, основываясь на том, что эти две категории составляют совместно более 80% всего населения США. При этом я не исключаю, что на будущих этапах будут добавлены и остальные расовые категории для полной картины.

Источники данных

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

  • совершенным преступлениям с указанием расовой принадлежности, видов преступления и штатов

  • гибели от рук полиции с указанием расовой принадлежности погибших и места события (штата)

  • численности населения по годам с указанием расовой принадлежности (для вычисления удельных показателей)

Для данных по преступлениям использовалась открытая база данных ФБР Crime Data Explorer, обладающая расширенным API и содержащая детальные данные по преступлениям, арестам, жертвам преступлений в США с 1991 по 2018 год.

Для данных по гибели от рук полиции использовалась открытая база данных на сайте Fatal Encounters, поддерживаемая сообществом. На настоящий момент база (доступная для скачивания) содержит более 28 тысяч записей начиная с 2000 года с подробной информацией о каждом погибшем, кратким описанием события, ссылками на СМИ, местом события и т.д. В Интернете есть и другие базы данных с тем же назначением, например, на сайте MappingPoliceViolence (около 8400 записей с 2013 г.) или БД Washington Post (ок. 5600 записей с 2015 г.). Но БД Fatal Encounters (FENC) на текущий момент самая подробная и имеет самый длинный период наблюдений (20 лет), поэтому я использовал ее. Кстати сказать, официальные источники (ФБР) также обещают открыть базу данных применения силы службами порядка, но это наступит только когда наберется представительная выборка данных. Прочитать об этой будущей официальной базе можно по ссылке.

Наконец, данные по общей численности представителей различных рас взяты из Википедии, которая в свою очередь, берет эти данные из официальных источников - Бюро переписи населения США. К сожалению, данные доступны только за промежуток с 2010 по 2018 год. В связи с этим в рамках данного исследования пришлось: 1) ограничить конечную точку наблюдений 2018 годом; 2) для промежутка с 2000 по 2009 год использовать данные по численности населения, смоделированные при помощи простой линейной регрессии (что вполне оправдано учитывая линейную природу прироста населения). Таким образом, мы будем исследовать все данные за период с 2000 г. (начальная точка в БД FENC) по 2018 г. (конечная точка в данных по численности населения). Все результаты будут основаны на наблюдениях за эти 18 лет.

Подготовка данных

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

С данными по гибели от рук полиции все понятно: просто скачиваем всю БД с сайта и сохраняем как CSV (можно оставить и в XLSX, но я предпочитаю CSV для унификации и экономии). Здесь прямая ссылка на исходный датасет в Google Spreadsheets, здесь уже готовый CSV.

Поля данных (использованные в анализе выделены жирным шрифтом):
  1. Unique ID - ID в БД

  2. Subject's name - имя жертвы

  3. Subject's age - возраст жертвы

  4. Subject's gender - пол жертвы

  5. Subject's race - раса жертвы (официально указанная)

  6. Subject's race with imputations - раса жертвы (официально указанная или заполненная экспертом)

  7. Imputation probability - вероятность экспертной оценки расы

  8. URL of image of deceased - фото жертвы

  9. Date of injury resulting in death (month/day/year) - дата события

  10. Location of injury (address) - адрес события

  11. Location of death (city) - город события

  12. Location of death (state) - штат события

  13. Location of death (zip code) - почтовый индекс адреса события

  14. Location of death (county) - округ события

  15. Full Address - полный адрес события

  16. Latitude - координата широты

  17. Longitude - координата долготы

  18. Agency responsible for death - правоохранительная служба, причинившая смерть

  19. Cause of death - причина смерти

  20. A brief description of the circumstances surrounding the death - краткое описание обстоятельств

  21. Dispositions/Exclusions INTERNAL USE, NOT FOR ANALYSIS - исключения (НЕ ДЛЯ АНАЛИЗА)

  22. Intentional Use of Force (Developing) - применение силы (намеренное)

  23. Link to news article or photo of official document - ссылка на СМИ

  24. Symptoms of mental illness? INTERNAL USE, NOT FOR ANALYSIS - симптомы помешательства жертвы (НЕ ДЛЯ АНАЛИЗА)

  25. Video - видео

  26. Date&Description - дата и описание

  27. Unique ID formula - формула ID

  28. Unique identifier (redundant) - НЕ ИСПОЛЬЗУЕТСЯ

  29. Date (Year) - год события

Данные по численности населения я сохранил с Википедии и при помощи Excel дополнил модельными данными за 2000 - 2009 гг., применив простую регрессию. Здесь можете взять Excel и итоговый CSV.

Поля данных (использованные в анализе выделены жирным шрифтом):
  1. Year - год

  2. Whitepop - численность белых

  3. Blackpop - численность черных

  4. Asianpop - численность азиатов

  5. Native Hawaiianpop - численность гавайцев

  6. American Indianpop - численность индейцев и эскимосов

  7. Unknownpop - численность других рас / без указания расы

Самое интересное - это скачать и подготовить данные по преступлениям с БД ФБР. Для этого я написал программу на Python, которая подключается к публичному API при помощи API-ключа (который я специально получил на том же сайте). API использует REST для запросов к различным имеющимся базам данных и возвращает данные в виде JSON. Программа скачивает и объединяет данные в единый DataFrame, который затем сохраняется в CSV. В тот же файл добавляются и данные по численности населения с вычислением удельных показателей по преступлениям.

Поля данных (использованные в анализе выделены жирным шрифтом):
  1. Year - год

  2. Offense - вид преступления, одно из:

    • All Offenses - все преступления

    • Assault Offenses - нападения

    • Drugs Narcotic Offenses - преступления, связанные с оборотом наркотиков

    • Larceny Theft Offenses - воровство

    • Murder And Nonnegligent Manslaughter - убийство

    • Sex Offenses - преступления на сексуальной почве

    • Weapon Law Violation - нарушение хранения / оборота оружия

  3. Class - классификатор (здесь это раса, но может быть также возраст, пол и т.д.)

  4. Offender/Victim - данные по преступникам или жертвам (в этом анализе речь пока только о преступниках)

  5. Asian - количество преступлений, совершенных азиатами

  6. Native Hawaiian - количество преступлений, совершенных гавайцами

  7. Black - количество преступлений, совершенных черными

  8. American Indian - количество преступлений, совершенных индейцами и эскимосами

  9. Unknown - количество преступлений, совершенных представителями других рас

  10. White - количество преступлений, совершенных белыми

  11. Whitepop - численность белых на соответствующий год

  12. Blackpop - численность черных на соответствующий год

  13. Asianpop - численность азиатов на соответствующий год

  14. Native Hawaiianpop - численность гавайцев на соответствующий год

  15. American Indianpop - численность индейцев и эскимосов на соответствующий год

  16. Unknownpop - численность представителей других рас на соответствующий год

  17. Asian pro capita - удельное количество преступлений, совершенных азиатами (на 1 человека)

  18. Native Hawaiian pro capita - удельное количество преступлений, совершенных гавайцами (на 1 человека)

  19. Black pro capita - удельное количество преступлений, совершенных черными (на 1 человека)

  20. American Indian pro capita - удельное количество преступлений, совершенных индейцами и эскимосами (на 1 человека)

  21. Unknown pro capita - удельное количество преступлений, совершенных представителями других рас (на 1 человека)

  22. White pro capita - удельное количество преступлений, совершенных белыми (на 1 человека)

Инструменты

Весь анализ я провожу с помощью Python 3.8, используя интерактивный Jupyter Notebook. Дополнительные библиотеки:

  • pandas 1.0.3 (для анализа данных)

  • folium 0.11 (для визуализации карт)

Все это "добро" (включая сам Python) доступно мне из дистрибутива WinPython, который я давно использую на Windows из-за его очевидных преимуществ. Вы, конечно, можете использовать любой другой на ваш вкус (например Anaconda) или вообще обойтись просто Python, установив нужные пакеты.

Вообще же, этот же анализ можно с легкостью выполнить с помощью любого другого статистического / математического ПО: R, MatLab, SAS и даже Excel. Как говорится, выбирайте свое оружие :)

В следующей части приступим непосредственно к анализу.

Подробнее..

Black Olives Matter раса, криминал и огонь на поражение в США. Часть 2

04.09.2020 08:20:07 | Автор: admin

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

Поехали!

Импортируем библиотеки и определяем путь к директории со всеми файлами:

import pandas as pd, numpy as np# путь к папке с исходными файламиROOT_FOLDER = r'c:\_PROG_\Projects\us_crimes'

Гибель от рук закона

Начнем с анализа данных по жертвам полиции. Давайте подгрузим файл из CSV в DataFrame:

# Файл с БД Fatal Encounters (FENC)FENC_FILE = ROOT_FOLDER + '\\fatal_enc_db.csv'# грузим в DataFramedf_fenc = pd.read_csv(FENC_FILE, sep=';', header=0, usecols=["Date (Year)", "Subject's race with imputations", "Cause of death", "Intentional Use of Force (Developing)", "Location of death (state)"])

Заметьте сразу, что мы не грузим все поля из БД, а только необходимые нам для анализа: год, расовая принадлежность (с учетом экспертной оценки), причина смерти (здесь пока не используется, но может понадобиться в дальнейшем), признак намеренного применения силы и штат, в котором имело место событие.

Здесь надо пояснить, что такое "экспертная оценка" расовой принадлежности. Дело в том, что официальные источники, откуда FENC собирает данные, не всегда указывают расу жертвы, отсюда получаются пропуски в данных. Для компенсации этих пропусков сообщество привлекает экспертов, оценивающих расу жертвы по другим данным (с определенной погрешностью). Более подробно на эту тему можете почитать на самом сайте Fatal Encounters или загрузив исходный Excel файл (во втором листе).

Переименуем столбцы для удобства и очистим строки с пропущенными данными:

df_fenc.columns = ['Race', 'State', 'Cause', 'UOF', 'Year']df_fenc.dropna(inplace=True)

Теперь нам надо унифицировать наименования расовой принадлежности для того, чтобы в дальнейшем сопоставлять эти данные с данными по преступлениям и численности населения. Классификация рас в этих источниках немного разная. БД FENC, в частности, выделяет латиноамериканцев (Hispanic/Latino), азиатов и уроженцев тихоокеанских территорий (Asian/Pacific Islander) и среднеазиатов (Middle Eastern). Нас же интересуют только белые и черные. Поэтому сделаем укрупнение:

df_fenc = df_fenc.replace({'Race': {'European-American/White': 'White', 'African-American/Black': 'Black',                           'Hispanic/Latino': 'White', 'Native American/Alaskan': 'American Indian',                          'Asian/Pacific Islander': 'Asian', 'Middle Eastern': 'Asian',                          'NA': 'Unknown', 'Race unspecified': 'Unknown'}}, value=None)

Оставляем только данные по белым (теперь с учетом латино) и черным:

df_fenc = df_fenc.loc[df_fenc['Race'].isin(['White', 'Black'])]

Зачем нам поле "UOF" (намеренное использование силы)? Для исследования мы хотим оставить только случаи, когда полиция (или иные правоохранительные органы) намеренно применяли силу против человека. Мы опускаем случаи, когда человек совершил самоубийство (например, в результате осады полицией) или погиб в результате ДТП, преследуемый полицейскими. Это допущение сделано по двум причинам: 1) обстоятельства гибели по косвенным причинам часто не позволяют провести прямую причинно-следственную связь между действиями правоохранительных органов и смертью (пример: полицейский держит на мушке человека, который затем умирает от сердечного приступа; другой пример: при задержании преступник пускает себе пулю в лоб); 2) при рассмотрении действий властей расценивается именно применение силы; так, например, будущая официальная БД по применению силы (которую я упомянул в предыдущей статье) будет содержать именно данные, отражающая намеренное применение смертельной силы против граждан. Итак, оставляем только эти данные:

df_fenc = df_fenc.loc[df_fenc['UOF'].isin(['Deadly force', 'Intentional use of force'])]

Для удобства добавим полные названия штатов. Для этого я приготовил отдельный CSV, который мы и подгрузим в наш датасет:

df_state_names = pd.read_csv(ROOT_FOLDER + '\\us_states.csv', sep=';', header=0)df_fenc = df_fenc.merge(df_state_names, how='inner', left_on='State', right_on='state_abbr')

Отобразим начальные строки командой df_fenc.head(), чтобы получить представление о датасете:

Race

State

Cause

UOF

Year

state_name

state_abbr

0

Black

GA

Gunshot

Deadly force

2000

Georgia

GA

1

Black

GA

Gunshot

Deadly force

2000

Georgia

GA

2

Black

GA

Gunshot

Deadly force

2000

Georgia

GA

3

Black

GA

Gunshot

Deadly force

2000

Georgia

GA

4

Black

GA

Gunshot

Deadly force

2000

Georgia

GA

Нам не нужно разбирать отдельные случаи гибели, давайте агрегируем данные по годам и расовой принадлежности:

# группируем по году и расеds_fenc_agg = df_fenc.groupby(['Year', 'Race']).count()['Cause']df_fenc_agg = ds_fenc_agg.unstack(level=1)# конвертируем численные данные в UINT16 для экономииdf_fenc_agg = df_fenc_agg.astype('uint16')

В итоге получили таблицу с 2 столбцами: White (количество белых жертв) и Black (количество черных жертв), индексированную по годам (с 2000 по 2020). Давайте взглянем на эти данные в виде графика:

# белые и черные жертвы полицейских по годам (кол-во гибелей)plt = df_fenc_agg.plot(xticks=df_fenc_agg.index)plt.set_xticklabels(df_fenc_agg.index, rotation='vertical')plt

Промежуточный вывод:

В количественном (абсолютном) выражении белых жертв больше, чем черных.

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

Подгрузим данные по численности населения (по расам):

# файл CSV с данными по населению (1991 - 2018)POP_FILE = ROOT_FOLDER + '\\us_pop_1991-2018.csv'df_pop = pd.read_csv(POP_FILE, index_col=0, dtype='int64')

Добавим эти данные в наш датасет:

# выбираем только данные по числ-ти белых и черных за 2000 - 2018 гг.df_pop = df_pop.loc[2000:2018, ['White_pop', 'Black_pop']]# объединяем датафреймы, выкидываем строки с пропускамиdf_fenc_agg = df_fenc_agg.join(df_pop)df_fenc_agg.dropna(inplace=True)# конвертируем данные по численности в целочисленный типdf_fenc_agg = df_fenc_agg.astype({'White_pop': 'uint32', 'Black_pop': 'uint32'})

ОК. Осталось создать 2 столбца с удельными значениями, разделив количество жертв на численность и умножив на миллион (количество жертв на 1 млн. человек):

df_fenc_agg['White_promln'] = df_fenc_agg['White'] * 1e6 / df_fenc_agg['White_pop']df_fenc_agg['Black_promln'] = df_fenc_agg['Black'] * 1e6 / df_fenc_agg['Black_pop']

Смотрим, что получилось:

Black

White

White_pop

Black_pop

White_promln

Black_promln

Year

2000

148

291

218756353

35410436

1.330247

4.179559

2001

158

353

219843871

35758783

1.605685

4.418495

2002

161

363

220931389

36107130

1.643044

4.458953

2003

179

388

222018906

36455476

1.747599

4.910099

2004

157

435

223106424

36803823

1.949742

4.265861

2005

181

452

224193942

37152170

2.016112

4.871855

2006

212

460

225281460

37500517

2.041890

5.653255

2007

219

449

226368978

37848864

1.983487

5.786171

2008

213

442

227456495

38197211

1.943229

5.576323

2009

249

478

228544013

38545558

2.091501

6.459888

2010

219

506

229397472

38874625

2.205778

5.633495

2011

290

577

230838975

39189528

2.499578

7.399936

2012

302

632

231992377

39623138

2.724227

7.621809

2013

310

693

232969901

39919371

2.974633

7.765653

2014

264

704

233963128

40379066

3.009021

6.538041

2015

272

729

234940100

40695277

3.102919

6.683822

2016

269

723

234644039

40893369

3.081263

6.578084

2017

265

743

235507457

41393491

3.154889

6.401973

2018

265

775

236173020

41617764

3.281493

6.367473

Последние 2 столбца - наши удельные показатели на миллион человек по каждой из двух рас. Пора посмотреть на графике:

plt = df_fenc_agg.loc[:, ['White_promln', 'Black_promln']].plot(xticks=df_fenc_agg.index)plt.set_xticklabels(df_fenc_agg.index, rotation='vertical')plt

Также выведем основную статистику по этим данным:

df_fenc_agg.loc[:, ['White_promln', 'Black_promln']].describe()

White_promln

Black_promln

count (количество)

19.000000

19.000000

mean (среднее арифм.)

2.336123

5.872145

std (станд. отклонение)

0.615133

1.133677

min (мин. значение)

1.330247

4.179559

25%

1.946485

4.890977

50%

2.091501

5.786171

75%

2.991827

6.558062

max (макс. значение)

3.281493

7.765653

Промежуточные выводы:

1. В среднем от рук полиции погибает 5.9 на 1 млн. черных и 2.3 на 1 млн. белых (черных в 2.6 раз больше).

2. Разброс (отклонение) в данных по черным жертвам в 1.8 раз выше, чем в данных по белым жертвам. (На графике видно, что кривая по белым жертвам гораздо более плавная, без резких скачков.)

3. Максимальное количество жертв среди черных - в 2013 г. (7.7 на миллион); максимальное количество жертв среди белых - в 2018 г. (3.3 на миллион).

4. Жертвы среди белых монотонно растут (в среднем на 0.1 - 0.2 в год), в то время как жертвы среди черных вернулись на уровень 2009 г. после пика в 2011 - 2013 гг.

Итак, на первый поставленный вопрос мы ответили:

- Можно ли сказать, что полицейские убивают черных чаще, чем белых?

- Да, это верный вывод. От рук закона черных гибнет в среднем в 2.6 раз больше, чем белых.

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

Данные по преступлениям

Загружаем наш CSV по преступлениям:

CRIMES_FILE = ROOT_FOLDER + '\\culprits_victims.csv'df_crimes = pd.read_csv(CRIMES_FILE, sep=';', header=0, index_col=0, usecols=['Year', 'Offense', 'Offender/Victim', 'White', 'White pro capita', 'Black', 'Black pro capita'])

Здесь опять-таки используем только необходимые столбцы: год, вид преступления, классификатор и данные по количеству преступлений, совершенных черными и белыми (абсолютные - "White", "Black" и удельные на человека - "White pro capita", "Black pro capita").

Взглянем на данные (`df_crimes.head()`):

Offense

Offender/Victim

Black

White

Black pro capita

White pro capita

Year

1991

All Offenses

Offender

490

598

1.518188e-05

2.861673e-06

1991

All Offenses

Offender

4

4

1.239337e-07

1.914160e-08

1991

All Offenses

Offender

508

122

1.573958e-05

5.838195e-07

1991

All Offenses

Offender

155

176

4.802432e-06

8.422314e-07

1991

All Offenses

Offender

13

19

4.027846e-07

9.092270e-08

Нам пока не нужны данные по жертвам преступлений. Убираем лишние данные и столбцы:

# оставляем только преступников (убираем жертв)df_crimes1 = df_crimes.loc[df_crimes['Offender/Victim'] == 'Offender']# берем исследуемый период (2000-2018) и удаляем лишние столбцыdf_crimes1 = df_crimes1.loc[2000:2018, ['Offense', 'White', 'White pro capita', 'Black', 'Black pro capita']]

Получили такой датасет (1295 строк * 5 столбцов):

Offense

White

White pro capita

Black

Black pro capita

Year

2000

All Offenses

679

0.000003

651

0.000018

2000

All Offenses

11458

0.000052

30199

0.000853

2000

All Offenses

4439

0.000020

3188

0.000090

2000

All Offenses

10481

0.000048

5153

0.000146

2000

All Offenses

746

0.000003

63

0.000002

...

...

...

...

...

...

2018

Larceny Theft Offenses

1961

0.000008

1669

0.000040

2018

Larceny Theft Offenses

48616

0.000206

30048

0.000722

2018

Drugs Narcotic Offenses

555974

0.002354

223398

0.005368

2018

Drugs Narcotic Offenses

305052

0.001292

63785

0.001533

2018

Weapon Law Violation

70034

0.000297

58353

0.001402

Теперь нам надо превратить удельные показатели на 1 человека в удельные на 1 миллион (так как именно эти данные используются во всем исследовании). Для этого просто умножаем на миллион соответствующие столбцы:

df_crimes1['White_promln'] = df_crimes1['White pro capita'] * 1e6df_crimes1['Black_promln'] = df_crimes1['Black pro capita'] * 1e6

Чтобы увидеть целую картину, как соотносится количество преступлений между белыми и черными по видам преступлений (в абсолютном выражении), просуммируем годовые наблюдения:

df_crimes_agg = df_crimes1.groupby(['Offense']).sum().loc[:, ['White', 'Black']]

White

Black

Offense

All Offenses

44594795

22323144

Assault Offenses

12475830

7462272

Drugs Narcotic Offenses

9624596

3453140

Larceny Theft Offenses

9563917

4202235

Murder And Nonnegligent Manslaughter

28913

39617

Sex Offenses

833088

319366

Weapon Law Violation

829485

678861

Или в виде графика:

df_crimes_agg.plot.barh()

Итак, видим, что:

  • В количественном отношении нападения, наркотики, воровство и "все преступления" сильно превалируют над преступлениями, связанными с убийством, оружием и сексом

  • В абсолютных значениях белые совершают больше преступлений, чем черные (ровно в 2 раза для категории "все преступления")

Опять понимаем, что без информации о численности никакие выводы о "криминальности" рас не сделаешь. Соответственно, посмотрим на удельные показатели:

df_crimes_agg1 = df_crimes1.groupby(['Offense']).sum().loc[:, ['White_promln', 'Black_promln']]

White_promln

Black_promln

Offense

All Offenses

194522.307758

574905.952459

Assault Offenses

54513.398833

192454.602875

Drugs Narcotic Offenses

41845.758869

88575.523095

Larceny Theft Offenses

41697.303725

108189.184125

Murder And Nonnegligent Manslaughter

125.943007

1016.403706

Sex Offenses

3633.777035

8225.144985

Weapon Law Violation

3612.671402

17389.163849

И на графике:

df_crimes_agg1.plot.barh()

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

Давайте теперь оставим только категорию "все преступления" (All Offenses) как наиболее представительную, только удельные показатели по преступлениям (на миллион человек) и сгруппируем данные по годам (так как в исходных данных на каждый год может быть несколько записей - по количеству служб, предоставивших данные).

# оставляем только 'All Offenses' = все преступленияdf_crimes1 = df_crimes1.loc[df_crimes1['Offense'] == 'All Offenses']# чтобы использовать другую выборку, можем, например, оставить нападения и убийства:#df_crimes1 = df_crimes1.loc[df_crimes1['Offense'].str.contains('Assault|Murder')]# убираем абсолютные значения и агрегируем по годамdf_crimes1 = df_crimes1.groupby(level=0).sum().loc[:, ['White_promln', 'Black_promln']]

Полученный датасет:

White_promln

Black_promln

Year

2000

6115.058976

17697.409882

2001

6829.701429

20431.707645

2002

7282.333249

20972.838329

2003

7857.691182

22218.966500

2004

8826.576863

26308.815799

2005

9713.826255

30616.569637

2006

10252.894313

33189.382429

2007

10566.527362

34100.495064

2008

10580.520024

34052.276749

2009

10889.263592

33954.651792

2010

10977.017218

33884.236826

2011

11035.346176

32946.454471

2012

11562.836825

33150.706035

2013

11211.113491

32207.571607

2014

11227.354594

31517.346141

2015

11564.786088

31764.865490

2016

12193.026562

33186.064958

2017

12656.261666

34900.390499

2018

13180.171893

37805.202605

Посмотрим на графике:

plt = df_crimes1.plot(xticks=df_crimes1.index)plt.set_xticklabels(df_fenc_agg.index, rotation='vertical')plt

Промежуточные выводы:

1. Белые совершают в 2 раза больше преступлений, чем черные, в абсолютном выражении, но в 3 раза меньше в относительном выражении (на миллион представителей своей расы).

2. Преступность среди белых относительно монотонно растет на протяжении всего периода (выросла в 2 раза за 18 лет). Преступность среди черных также растет, но скачкообразно: с 2001 по 2006 г. резкий рост, с 2007 по 2016 она даже убывала, с 2017 года опять резкий рост. За весь период преступность среди черных выросла также в 2 раза (аналогично белым).

3. Если не принимать во внимание спад среди черной преступности в 2007-2016 гг., преступность среди черных растет более быстрыми темпами, чем среди белых.

Итак, мы ответили на второй вопрос:

- Представители какой расы статистически чаще совершают преступления?

- Черные статистически совершают преступления в 3 раза чаще белых.

Криминальность и гибель от рук полиции

Теперь мы подошли к самому важному: необходимо ответить на третий поставленный вопрос, а именно "Можно ли сказать, что полиция стреляет насмерть пропорционально количеству совершаемых преступлений?"

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

Начнем с того, что объединим эти два датасета в один:

# объединяем датасетыdf_uof_crimes = df_fenc_agg.join(df_crimes1, lsuffix='_uof', rsuffix='_cr')# удаляем лишние столбцы (абс. показатели по жертвам)df_uof_crimes = df_uof_crimes.loc[:, 'White_pop':'Black_promln_cr']

Что получили?

White_pop

Black_pop

White_promln_uof

Black_promln_uof

White_promln_cr

Black_promln_cr

Year

2000

218756353

35410436

1.330247

4.179559

6115.058976

17697.409882

2001

219843871

35758783

1.605685

4.418495

6829.701429

20431.707645

2002

220931389

36107130

1.643044

4.458953

7282.333249

20972.838329

2003

222018906

36455476

1.747599

4.910099

7857.691182

22218.966500

2004

223106424

36803823

1.949742

4.265861

8826.576863

26308.815799

2005

224193942

37152170

2.016112

4.871855

9713.826255

30616.569637

2006

225281460

37500517

2.041890

5.653255

10252.894313

33189.382429

2007

226368978

37848864

1.983487

5.786171

10566.527362

34100.495064

2008

227456495

38197211

1.943229

5.576323

10580.520024

34052.276749

2009

228544013

38545558

2.091501

6.459888

10889.263592

33954.651792

2010

229397472

38874625

2.205778

5.633495

10977.017218

33884.236826

2011

230838975

39189528

2.499578

7.399936

11035.346176

32946.454471

2012

231992377

39623138

2.724227

7.621809

11562.836825

33150.706035

2013

232969901

39919371

2.974633

7.765653

11211.113491

32207.571607

2014

233963128

40379066

3.009021

6.538041

11227.354594

31517.346141

2015

234940100

40695277

3.102919

6.683822

11564.786088

31764.865490

2016

234644039

40893369

3.081263

6.578084

12193.026562

33186.064958

2017

235507457

41393491

3.154889

6.401973

12656.261666

34900.390499

2018

236173020

41617764

3.281493

6.367473

13180.171893

37805.202605

Давайте вспомним, что хранится в каждом поле:

  1. White_pop - численность белых

  2. Black_pop - численность черных

  3. White promln_uof - количество жертв полиции среди белых (на 1 млн)

  4. Black promln_uof - количество жертв полиции среди черных (на 1 млн)

  5. White promln_cr - количество преступлений, совершенных белыми (на 1 млн)

  6. Black promln_cr - количество преступлений, совершенных черными (на 1 млн)

Наверное, можно было бы не полениться и дать этим столбцам русские названия... Но я надеюсь, читатели меня простят :)

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

plt = df_uof_crimes['White_promln_cr'].plot(xticks=df_uof_crimes.index, legend=True)df_uof_crimes['White_promln_uof'].plot(xticks=df_uof_crimes.index, legend=True, secondary_y=True, style='g')plt.set_xticklabels(df_uof_crimes.index, rotation='vertical')plt

То же самое на диаграмме рассеяния:

Отметим мимоходом, что определенная корреляция есть. ОК, теперь то же для черных:

plt = df_uof_crimes['Black_promln_cr'].plot(xticks=df_uof_crimes.index, legend=True)df_uof_crimes['Black_promln_uof'].plot(xticks=df_uof_crimes.index, legend=True, secondary_y=True, style='g')plt.set_xticklabels(df_uof_crimes.index, rotation='vertical')plt

И скаттерплот:

Здесь все намного хуже: тренды явно "пляшут", хотя общая тенденция все равно прослеживается: пропорция здесь явно прямая, хотя и нелинейная.

Давайте воспользуемся методами матстатистики для определения величины этих корреляций, построив корреляционную матрицу на основе коэффициента Пирсона:

df_corr = df_uof_crimes.loc[:, ['White_promln_cr', 'White_promln_uof', 'Black_promln_cr', 'Black_promln_uof']].corr(method='pearson')df_corr.style.background_gradient(cmap='PuBu')

Получаем такую картинку:

White_promln_cr

White_promln_uof

Black_promln_cr

Black_promln_uof

White_promln_cr

1.000000

0.885470

0.949909

0.802529

White_promln_uof

0.885470

1.000000

0.710052

0.795486

Black_promln_cr

0.949909

0.710052

1.000000

0.722170

Black_promln_uof

0.802529

0.795486

0.722170

1.000000

Коэффициенты корреляции для обеих рас выделены жирным: для белых = 0.885, для черных = 0.722. Таким образом, положительная корреляция между гибелью от полиции и преступностью прослеживается и для белых, и для черных, но для белых она гораздо выше (статистически значима), в то время как для черных она близка к статистической незначимости. Последний результат, конечно, связан с большей неоднородностью данных как по жертвам полиции, так и по преступлениям среди черных.

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

# агрегированные значения (по годам)df_uof_crimes_agg = df_uof_crimes.loc[:, ['White_promln_cr', 'White_promln_uof', 'Black_promln_cr', 'Black_promln_uof']].agg(['mean', 'sum', 'min', 'max'])# "вероятность" преступника быть застреленнымdf_uof_crimes_agg['White_uof_cr'] = df_uof_crimes_agg['White_promln_uof'] * 100. / df_uof_crimes_agg['White_promln_cr']df_uof_crimes_agg['Black_uof_cr'] = df_uof_crimes_agg['Black_promln_uof'] * 100. / df_uof_crimes_agg['Black_promln_cr']

Получаем такие данные:

White_promln_cr

White_promln_uof

Black_promln_cr

Black_promln_uof

White_uof_cr

Black_uof_cr

mean

10238.016198

2.336123

30258.208024

5.872145

0.022818

0.019407

sum

194522.307758

44.386338

574905.952459

111.570747

0.022818

0.019407

min

6115.058976

1.330247

17697.409882

4.179559

0.021754

0.023617

max

13180.171893

3.281493

37805.202605

7.765653

0.024897

0.020541

Отобразим полученные значения в виде столбчатой диаграммы:

plt = df_uof_crimes_agg.loc['mean', ['White_uof_cr', 'Black_uof_cr']].plot.bar()

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

Промежуточные выводы:

1. Гибель от рук полиции связана с криминальностью (количеством совершаемых преступлений). При этом эта корреляция неоднородна по расам: для белых она близка к идеальной, для черных далека от идеальной.

2. При рассмотрении совмещенных диаграмм гибели от полиции и преступности видно, что фатальные встречи с полицией растут "в ответ" на рост преступности, с лагом в несколько лет (особенно видно по данным среди черных). Это согласуется с логическим предположением о том, что власти "отвечают" на преступность (больше преступлений -> больше безнаказанности -> больше стычек с представителями закона -> больше смертельных исходов).

3. Белые преступники немного чаще встречают смерть от рук полиции, чем черные. Однако эта разница почти несущественна.

Итак, ответ на третий вопрос:

- Можно ли сказать, что полиция стреляет насмерть пропорционально количеству совершаемых преступлений?

- Да, такая корреляция наблюдается, хотя она неоднородна по расам: для белых почти идеальная, для черных - почти неидеальная.

В следующей части статьи посмотрим на географическое распределение анализируемых данных по штатам США.

Подробнее..

Преступления на почве расизма в США статистический анализ

15.09.2020 04:20:57 | Автор: admin
После моей недавней статьи (части 1, 2, 3) о криминале и полицейской стрельбе в США и их связи с расовой принадлежностью я решил продолжить эту тему и в таком же ключе проанализировать другие открытые данные благо, таких еще достаточно благодаря программе криминальной отчетности ФБР.

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

Дисклеймер
Позвольте мне быть ленивым и отправить вас, уважаемые читатели, посмотреть дисклеймер в начале моей первой статьи о криминале в США :) Все, что там написано, подходит и для этого исследования.


Исходные данные


В качестве исходных данных я скачал датасет с сайта Crime Data Explorer, поддерживаемого ФБР в рамках программы криминальной отчетности США (об этом сайте я уже писал в предыдущей статье). Скачать по прямой ссылке можно здесь (4.4 МБ). Скачанный архив содержит собственно сами данные в формате CSV, а также текстовое описание. Данные я никак не трансформировал, поэтому если вы захотите повторить анализ самостоятельно, вы должны получить те же результаты.

Также я использовал данные по численности населения США с разбивкой по расовой принадлежности, полученные из официальных данных Бюро переписи населения и дополненные модельными данными за период с 1991 по 2009 г. Скачать можно здесь (Яндекс.Диск). Для анализа географического распределения удельных показателей мне понадобилась и численность населения по штатам, полученные из того же источника (скачать здесь). Эти же данные я использовал в своей предыдущей статье.

Что такое преступления на почве нетерпимости и как они регистрируются?


С сайта ФБР:
The FBIs UCR Program defines hate crime as a committed criminal offense which is motivated, in whole or in part, by the offenders bias(es) against a race, religion, disability, sexual orientation, ethnicity, gender, or gender identity.

Перевод:
Программа криминальной отчетности ФБР определяет преступление на почве нетерпимости как совершенное преступление, мотивированное (частично или полностью) предвзятостью правонарушителя против расы, религии, физического ограничения, сексульной ориентации, принадлежности к этнической группе, пола или половой самоидентификации.

В справке, сопровождающей исходный датасет по преступлениям, также указано следующее (курсив сохранен):
Because motivation is subjective, it is sometimes difficult to know with certainty whether a crime resulted from the offenders bias. Moreover, the presence of bias alone does not necessarily mean that a crime can be considered a hate crime. Only when a law enforcement investigation reveals sufficient evidence to lead a reasonable and prudent person to conclude that the offenders actions were motivated, in whole or in part, by his or her bias, should an agency report an incident as a hate crime.

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

Естественно, проверить выводы следствия по каждому случаю невозможно, поскольку база агрегирует отчетность сотен различных служб правопорядка по всей стране и доступ ко всем материалам следствия есть (можно предположить) только для сотрудников ФБР. Сама база предоставляет только готовую статистику.

Структура базы данных


База содержит данные по преступлениям на почве нетерпимости с 1991 по 2018 г. На момент написания статьи последняя запись датируется 31 декабря 2018 г., всего 201403 записи. Каждая запись один случай преступления. Таким образом, получаем в среднем 7193 преступлений в год.

Список полей базы данных в исходном CSV формате
  1. INCIDENT_ID: ID события (преступления)
  2. DATA_YEAR: год, в который совершено преступление
  3. ORI: ID агентства (службы правопорядка), предоставившего данные
  4. PUB_AGENCY_NAME: публичное название агентства / службы (обычно совпадает с городом)
  5. PUB_AGENCY_UNIT: название подразделения службы (например, округ)
  6. AGENCY_TYPE_NAME: тип службы (муниципальная / окружная)
  7. STATE_ABBR: сокращенное наименование штата
  8. STATE_NAME: полное название штата
  9. DIVISION_NAME: название региона (куда входят несколько штатов)
  10. REGION_NAME: название макрорегиона (куда входят несколько регионов)
  11. POPULATION_GROUP_CODE: код места совершения преступления по численности населения
  12. POPULATION_GROUP_DESC: описание места совершения преступления по численности населения (например город с населением от 0,5 до 1 млн.)
  13. INCIDENT_DATE: дата совершения преступления
  14. ADULT_VICTIM_COUNT: количество совершеннолетних пострадавших
  15. JUVENILE_VICTIM_COUNT: количество несовершеннолетних пострадавших
  16. TOTAL_OFFENDER_COUNT: общее количество преступников
  17. ADULT_OFFENDER_COUNT: количество совершеннолетних преступников
  18. JUVENILE_OFFENDER_COUNT: количество несовершеннолетних преступников
  19. OFFENDER_RACE: раса/-ы преступника/-ов
  20. OFFENDER_ETHNICITY: этническая группа преступника/-ов (латиноамериканская / не латиноамериканская / смешанная / неизвестная)
  21. VICTIM_COUNT: общее количество пострадавших (физических и юридических лиц)
  22. OFFENSE_NAME: вид совершенного преступления
  23. TOTAL_INDIVIDUAL_VICTIMS: общее количество пострадавших (физических лиц)
  24. LOCATION_NAME: место преступления (например, квартира, шоссе, школа и т.д.)
  25. BIAS_DESC: вид нетерпимости (мотив преступления)
  26. VICTIM_TYPES: категория/-и пострадавших (физические лица / власти / частная компания и т.п.)
  27. MULTIPLE_OFFENSE: маркер множественного преступления (т.е. если совершено не одно, а несколько видов преступлений)
  28. MULTIPLE_BIAS: маркер множественного мотива (не один, а несколько видов нетерпимости)



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

Виды преступлений


В базу попадают 13 основных видов преступлений:

  • преступления против личности: убийство, изнасилование, нападение, тяжкое нападение, личная угроза и торговля людьми (сексуальное рабство и рабский труд)
  • преступления против собственности: грабеж, незаконное проникновение, хищение, угон, поджог и порча имущества / вандализм

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

Все 48 категорий преступлений (названия в оригинале)
Aggravated Assault
All Other Larceny
Animal Cruelty
Arson
Assisting or Promoting Prostitution
Betting/Wagering
Bribery
Burglary/Breaking & Entering
Counterfeiting/Forgery
Credit Card/Automated Teller Machine Fraud
Destruction/Damage/Vandalism of Property
Drug Equipment Violations
Drug/Narcotic Violations
Embezzlement
Extortion/Blackmail
False Pretenses/Swindle/Confidence Game
Fondling
Hacking/Computer Invasion
Human Trafficking, Commercial Sex Acts
Identity Theft
Impersonation
Incest
Intimidation
Kidnapping/Abduction
Motor Vehicle Theft
Murder and Nonnegligent Manslaughter
Negligent Manslaughter
Not Specified
Pocket-picking
Pornography/Obscene Material
Prostitution
Purchasing Prostitution
Purse-snatching
Rape
Robbery
Sexual Assault With An Object
Shoplifting
Simple Assault
Sodomy
Statutory Rape
Stolen Property Offenses
Theft From Building
Theft From Coin-Operated Machine or Device
Theft From Motor Vehicle
Theft of Motor Vehicle Parts or Accessories
Weapon Law Violations
Welfare Fraud
Wire Fraud


Виды нетерпимости / мотивы преступлений


В соответствии с определением выше, в базу заносятся следующие виды нетерпимости:
  1. против расовой принадлежности (против белых, против черных, против азиатов, против евреев и т.д.)
  2. против этнической принадлежности (против латиноамериканцев)
  3. против конфессии или религиозного мировоззрения (против христиан, против атеистов, против мусульман, против Свидетелей Иеговы и т.д.)
  4. против сексуальной ориентации или пола (против мужских и женских гомосексуалов, против мужчин, против женщин, против трансгендеров и т.д.)
  5. против физических ограничений (ненависть к инвалидам)


При этом каждое преступление может иметь до 5 различных видов нетерпимости в качестве мотива. Поэтому при работе с такими множественными характеристиками нам придется укрупнять категории.

Категории пострадавших


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

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

Препарируем данные


image

Как и в предыдущей статье, весь анализ я выполняю в Jupyter Lab / Notebook на Python 3.8. Здесь я не буду приводить и комментировать сам код его вы можете скачать по этой ссылке (в архиве листинг и файл в формате Jupyter Notebook). Сосредоточимся больше на получаемых результатах. Все графики кликабельны.

Обзор данных и топ-листы


После загрузки данных из CSV (только нужных для исследования столбцов) получаем такой датафрейм:

YEAR STATE_NAME OFFENDER_RACE OFFENSE_NAME BIAS_DESC VICTIM_TYPES
0 1991 Arkansas White Intimidation Anti-Black or African American Individual
1 1991 Arkansas Black or African American Simple Assault Anti-White Individual
2 1991 Arkansas Black or African American Aggravated Assault Anti-Black or African American Individual
3 1991 Arkansas Black or African American Aggravated Assault;Destruction/Damage/Vandalis... Anti-White Individual
4 1991 Arkansas Black or African American Aggravated Assault Anti-White Individual
... ... ... ... ... ... ...
201398 2018 West Virginia NaN Burglary/Breaking & Entering Anti-Black or African American Individual
201399 2018 West Virginia White Simple Assault Anti-Black or African American Individual
201400 2018 West Virginia NaN Intimidation Anti-Asian Individual
201401 2018 West Virginia White Intimidation Anti-White Law Enforcement Officer
201402 2018 West Virginia NaN Burglary/Breaking & Entering;Destruction/Damag... Anti-Other Religion Religious Organization

201403 rows 6 columns



Более 200 тысяч строк и чуть больше 8 МБ памяти. Давайте для начала посмотрим на топ-10 совершаемых преступлений, видов нетерпимости (мотивов), рас преступников и категорий жертв:

Кликабельно

Кликабельно

Итак, что мы здесь наблюдаем:
  • Самый распространенный вид преступления порча имущества / вандализм, за ним с небольшим отставанием личная угроза (intimidation). Каждый из этих видов преступления занимает почти треть всех случаев. Далее идут нападения, а грабеж и другие преступления уже гораздо менее распространены.
  • Среди видов нетерпимости с большим отрывом лидирует нетерпимость к чернокожим (больше трети всех случаев), затем в порядке убывания, но примерно на одном уровне: нетерпимость к евреям, нетерпимость к белым, нетерпимость к геям. Остальные виды нетерпимости статистически на порядок реже лидера.
  • 70% всех преступлений совершаются белыми, порядка 23% черными, остальные в пределах погрешности.
  • Преступления против личности составляют 80% всех случаев.


Смотря только на эти графики, можно представить, будто почти все преступления это белые, угрожающие черным расправой или портящие их имущество Однако давайте посмотрим, какие преступления и виды нетерпимости наиболее типичны для каждой расовой категории преступников:


OFFENSE_COUNT TOP_OFFENSE TOP_OFFENSE_SHARE TOP_BIAS TOP_BIAS_SHARE TOP_VICTIM TOP_VICTIM_SHARE
OFFENDER_RACE
White 79514 Intimidation 36.796036 Anti-Black or African American 46.877279 Individual 92.730840
Black or African American 25956 Simple Assault 36.292187 Anti-White 46.594236 Individual 94.760364
Multiple 4047 Simple Assault 36.545589 Anti-Black or African American 29.033852 Individual 91.153941
Asian 1453 Simple Assault 31.865107 Anti-Black or African American 30.075705 Individual 93.048864
American Indian or Alaska Native 1095 Simple Assault 40.182648 Anti-White 31.415525 Individual 93.059361
Native Hawaiian or Other Pacific Islander 35 Simple Assault 45.714286 Anti-Other Religion 22.857143 Individual 77.142857


В этой таблице:

  • OFFENSE_COUNT общее количество преступлений, совершенных представителями данной расы
  • TOP_OFFENSE самый частый вид преступления для представителей данной расы
  • TOP_BIAS самый частый вид нетерпимости (мотива преступления) для представителей данной расы
  • TOP_VICTIM самая частая категория потерпевших для представителей данной расы

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

Здесь можно увидеть, что для черных и белых основным мотивом является расовая нетерпимость по отношению к представителям противоположной расы (47% преступлений для обеих рас). При этом белые преступники, в основном, занимаются угрозами и запугиванием (37% преступлений), а черные нападениями без отягчающих обстоятельств (36% преступлений). (Удивительно, какое совпадение по процентным долям обнаруживают эти две расы!) Кстати говоря, только для белых преступников основной вид преступлений не связан с физическим ущербом (угрозы); представители других рас чаще совершают нападения.

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

Взглянем на количество преступлений по годам для каждой расы преступников:

Кликабельно

Как и следовало предположить, преступления белых и черных на графике доминируют над остальными расами, по которым даже не видно изменений из-за разницы в масштабе. Пик со стороны белых здесь приходится на 1995 2002 гг., а со стороны черных начало 1990-х. С 2002 г. количество преступлений, совершенных белыми на почве нетерпимости, довольно уверенно спадало, снизившись в 2 раза по сравнению с пиковым 2001-м; однако после 2016 г. вновь начало круто расти. Нетерпимость среди черных плавно спадала с 1995 по 2004 г., однако затем так же плавно начала расти, выйдя в 2018 г. на уровень 1995 г.

Здесь интересно отметить, что при Бараке Обаме (который, как мы знаем, принадлежит к афроамериканской расе), то есть с 2009 по 2017 гг., количество преступлений среди белых очень резко снизилось, но в это же самое время количество преступлений среди черных обнаружило стабильный рост. Ранее при Буше (2001 2009 гг.) после пика преступлений среди белых в первый год его президентства количество преступлений, совершаемых представителями обеих рас, вышло на полку и практически не менялось. А вот при Клинтоне (1993 2001 гг.) преступления среди белых росли быстро, почти год от года, в то время как преступления среди черных, наоборот, плавно снизились.

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

Первая фильтрация: по видам преступлений и потерпевших


В соответствии с исследованием, представленным в моей предыдущей статье, произведем аналогичную фильтрацию данных для анализа:

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

Посмотрим, что получилось:


YEAR STATE_NAME OFFENDER_RACE OFFENSE_NAME BIAS_DESC COUNT
0 1991 Arizona Black or African American Assault Anti-Gay (Male) 1
1 1991 Arizona Black or African American Assault Anti-White 4
2 1991 Arizona White Assault Anti-Black or African American 10
3 1991 Arkansas Black or African American Assault Anti-Black or African American 1
4 1991 Arkansas Black or African American Assault Anti-White 4
... ... ... ... ... ... ...
16428 2018 Wisconsin White Assault Anti-Hispanic or Latino 1
16429 2018 Wisconsin White Assault Anti-Hispanic or Latino;Anti-White 1
16430 2018 Wisconsin White Assault Anti-Physical Disability 1
16431 2018 Wisconsin White Assault Anti-Sikh 1
16432 2018 Wisconsin White Assault Anti-White 1

16433 rows 6 columns



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

В качестве промежуточного шага посмотрим на распределение преступлений по расе преступников:

Кликабельно

и по видам нетерпимости:

Кликабельно

Итак, белые и черные преступники составляют вместе 93% всех случаев (преступлений среди белых в два раза больше, но мы же знаем, что белых и самих в 5 раз больше). Поэтому совершенно не удивляет и то, что почти та же пропорция и по видам нетерпимости: 33% преступлений мотивировано нетерпимостью к черным, 18% нетерпимостью к белым. Здесь попутно интересно отметить, что преступления на почве нетерпимости к белым количественно примерно равны преступлениям на почве нетерпимости к гомосексуалам это третий по величине мотив.

Вторая фильтрация: по расе преступников и мотиву преступлений


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


YEAR STATE_NAME OFFENDER_RACE OFFENSE_NAME BIAS_DESC COUNT
0 1991 Arizona Black Assault Anti-White 4
1 1991 Arizona White Assault Anti-Black 10
2 1991 Arkansas Black Assault Anti-Black 1
3 1991 Arkansas Black Assault Anti-White 4
4 1991 Arkansas Black Murder Anti-White 1
... ... ... ... ... ... ...
3870 2018 West Virginia White Assault Anti-White 2
3871 2018 Wisconsin Black Assault Anti-Black 1
3872 2018 Wisconsin Black Assault Anti-White 4
3873 2018 Wisconsin White Assault Anti-Black 6
3874 2018 Wisconsin White Assault Anti-White 2

3875 rows 6 columns



Пора включить в анализ удельные показатели (на количество населения по каждой расовой группе). Для этого подгрузим данные по численности населения из файла us_pop_1991-2018.csv.

Посмотрим, как в целом распределено население США по расам (среднегодовые показатели за 1991 2018 гг.):

Кликабельно

Белых получается в 5.8 раз больше, чем черных. Все остальные расы составляют 11% населения.

Далее добавляем в наш датасет данные по численности и вычисляем удельное количество преступлений на 1 млн. представителей каждой расы.

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

Кликабельно

Отдельно для убийств и изнасилований (т.к. их на общих графиках не видно):

Кликабельно

Что же мы здесь видим? А видим вот что:

  • Из анализируемых видов преступлений с большим отрывом лидируют нападения (в 25 раз больше, чем грабеж, в 250 раз чем убийство и изнасилование).
  • Нападений, совершенных белыми, в два раза больше, но в удельном отношении черные совершают нападения почти в 3 раза чаще.
  • Грабежей, совершенных черными, в 1.5 раза больше в абсолютных цифрах и в 10 раз больше в удельных.
  • Суммарно белые совершили несколько больше убийств, чем черные, и примерно столько же изнасилований. В удельном же выражении черные насилуют в 6 раз чаще и убивают в 3.6 раз чаще, чем белые. Между убийством и изнасилованием белые предпочитают убийство, а черные изнасилование.


Преступления на почве расизма по годам


Посмотрим, как изменялось количество расистских преступлений, совершенных черными и белыми, за весь период:

Кликабельно

Кликабельно

Нетрудно по этим графикам сделать очевидные выводы:

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


Взглянем и на обобщенные (среднегодовые) показатели:

Кликабельно

Лишний раз убеждаемся в сделанных наблюдениях: в среднем белые совершают на 15-16% больше преступлений на почве расизма, но при этом из-за разницы в численности белых и черных, как мы знаем, почти в 6 раз, черные в столько же раз чаще совершают такие преступления.

Только ли белые против черных, черные против белых?


Давайте к нашим обобщенным показателям добавим параметр нетерпимости, т.е. мотива преступлений. Как вы помните, в результате фильтрации мы оставили только два мотива: нетерпимость к белой расе и нетерпимость к чернокожей расе. Как они распределены между белыми и черными преступниками? 100% полярно, конечно же? А вот и нет!

Кликабельно

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

Но что здесь любопытно: доля преступлений, совершаемых черными на почве ненависти к своим же составляет 11% от всех преступлений, совершаемых черными, а для белых этот показатель равен 9%. То есть чернокожий имеет несколько более высокий шанс обернуться против своих.

География преступлений


Наконец, посмотрим на распределение преступности на почве расизма по штатам США. Для вычисления удельных показателей нам, как обычно, надо будет загрузить численность по штатам и расам из файла us_pop_states_race_2010-2019.csv.

Среднегодовые показатели численности белых и черных по штатам:

Кликабельно

ОК, ничего нового: перенаселенные Калифорния, Техас, Флорида и Нью-Йорк, где, как вы могли видеть из прошлой статьи, совершается количественно больше преступлений.

Но везде ли одинакова доля чернокожего населения пресловутые 13%? Посмотрим:

Кликабельно

Итак, черных больше половины всего Округа Колумбия (где находится славный город Пентагон Вашингтон), около трети в хлопковых южных штатах Миссисипи, Луизиане, Джорджии, Алабаме, Южной Каролине и в одном северном (Мэриленде, где Округ Колумбия, где славный город...); в остальных меньше четверти. Это, как говорится, просто для справки.

А что с преступлениями? Смотрим на среднегодовые показатели в абсолютных и удельных выражениях:

Кликабельно

Кликабельно

Видно, что по абсолютному количеству преступлений лидирует самый населенный штат Калифорния. Но далее Флориду и Техас потеснили Мичиган, Иллинойс и Мэриленд экономически более развитые северные штаты. А на удельном графике выбились вперед наименее населенные штаты Монтана, Вермонт, Айдахо, Северная и Южная Дакота, Аляска (все тоже на севере страны). При этом видно, что пропорция преступлений между белыми и черными не одинакова по штатам, несмотря на доминирование черных по удельным показателям (например, в белую сторону выделяется Округ Колумбия и Гавайи).

Отобразим на карте (для большей наглядности заменим среднегодовые показатели накопленной суммой).

Сначала в абсолютном выражении:

Кликабельно

Здесь выделяется северо-восток страны (особенно Мичиган) плюс Калифорния и Вашингтон на тихоокеанском побережье. И в удельном выражении:

Кликабельно

Здесь заметно преобладание севера с наименее населенными штатами: Округ Колумбия, обе Дакоты и все тот же Вашингтон, а также по паре штатов с восточной и западной стороны. При этом южные штаты не обнаруживают значительной преступности среди населения.

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

Вместо выводов


Как там у Булгакова? Факты самая упрямая в мире вещь. Если нам что-то твердят со всех сторон, совсем необязательно это является правдой это может оказаться полуправдой или же ложью. Но имея в руках факты в виде N-ного количества наборов данных, вы можете сами подтвердить или опровергнуть те или иные рассуждения. Можно строить гипотезы и подтверждать / опровергать их статистическими методами, а можно просто без всяких гипотез рассмотреть данные и найти в них некие закономерности, которые уже в свою очередь помогут либо сделать выводы, либо предложить гипотезы, которые далее можно так же препарировать. Вам решать верить всему на слово или проверять.

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

PS. В комментариях к моему предыдущему исследованию меня много раз просили разделить чисто белых и латиносов, так как культуры все-таки имеют различия. Я бы и не против, но, к сожалению, это невозможно сделать ни в том, ни в этом случае по причине скудности сведений об этом этническом признаке в исходных данных. Так, например, в данных, которые мы разбираем в этой статье, из 79514 преступлений, совершенных белыми, только 6999 имеют пометку об этнической принадлежности, причем только 489 помечены как Hispanic or Latino (это 0,6%). Конечно, такие данные нельзя использовать для анализа.
Подробнее..

Перевод Учимся обращаться к данным и запрашивать их при помощи Google BigQuery. С примерами на Python и R

19.09.2020 14:18:00 | Автор: admin
Привет, Хабр!

Совсем недавно у нас вышла подробная книга о работе с хранилищем данных Google BigQuery. Сегодня мы решили вновь кратко затронуть эту тему и опубликовать небольшой кейс о выполнении запросов к данным BigQuery на Python и R.

Сообщите в комментариях, интересует ли публикация на тему машинного обучения с применением BigQuery




Обзор



В этой статье мы рассмотрим, как загружать данные Google BigQuery при помощи Python и R, а потом поговорим о запросах к данным, позволяющим делать полезные выводы. Мы воспользуемся библиотекой Google Cloud BigQuery для подключения к BigQuery Python и библиотекой bigrquery, чтобы добиться того же на языке R.

Также обсудим два этапа операций с данными BigQuery при помощи Python/R:

  • Подключение к Google BigQuery и доступ к данным
  • Запрашивание данных при помощи Python/R


В этой статье предполагается, что все ваши пользовательские данные сохранены в Google BigQuery.

Python



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

Подключение к Google BigQuery при помощи Python



Чтобы запрашивать данные Google BigQuery при помощи Python, необходимо подключить клиент Python к инстансу BigQuery. При этом используется облачная клиентская библиотека для Google BigQuery API. Также существуют и альтернативные решения для подключения к BigQuery при помощи Python; например, отлично подойдет библиотека BigQuery-Python от tylertreat.

Мы будем работать с библиотекой Google Cloud BigQuery, так как она стабильна и официально поддерживается Google.

Здесь предполагается, что у вас уже настроена среда разработки для Python.
Чтобы установить библиотеку, запустите в командной строке следующую команду:

pip install --upgrade google-cloud-bigquery

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

Теперь, когда у нас все настроено, переходим к инициализации соединения. Для этого используется следующий код Python:

rom google.cloud import bigqueryfrom google.oauth2 import service_accountcredentials = service_account.Credentials.from_service_account_file('path/to/file.json')project_id = 'my-bq'client = bigquery.Client(credentials= credentials,project=project_id)


В вышеприведенном фрагменте вам потребуется указать project_id и местоположение JSON-файла с ключом, заменив 'path/to/file.json' на фактически верный путь к сохраненному на локальной машине файлу JSON.

В Google BigQuery проект является контейнером верхнего уровня и предоставляет задаваемый по умолчанию контроль доступа над всеми множествами данных.

Выполнение запросов к данным BigQuery при помощи Python



Теперь, когда наш клиент BigQuery настроен и готов к использованию, можно выполнять запросы к множеству данных BigQuery.

Для этого используется метод запроса, помещающий задание запроса в очередь BigQuery. Затем запросы выполняются асинхронно это означает, что мы не указываем никаких задержек, а клиент дожидается, пока задание будет выполнено. Как только это произойдет, метод возвращает экземпляр Query_Job, содержащий результаты.

Подробнее о том, как работает этот метод, рассказано в официальной документации здесь.

Вот как выглядит интересующий нас код Python:

query_job = client.query("""   SELECT *   FROM dataset.my_table   LIMIT 1000 """)results = query_job.result() # Дожидаемся завершения задания.


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

job_config.use_legacy_sql = Truequery_job = client.query("""   SELECT *   FROM dataset.my_table   LIMIT 1000""", job_config = job_config)results = query_job.result() # Дожидаемся завершения задания.


R



Язык R популярная альтернатива Python, активно применяется в data science. Если вас интересует детальный и методичный статистический анализ данных, то мало найдется языков, способных потягаться в этом с R.

При работе с Google BigQuery язык R также предлагает надежную и удобную в использовании библиотеку для запрашивания данных и для операций с ними. Здесь мы будем работать с библиотекой bigrquery, которую создал и поддерживает Хадли Уикем, директор по исследовательской работе из RStudio.

Здесь предполагается, что вы уже настроили среду для разработки в R. Если нет воспользуйтесь этим руководством для настройки RStudio.

Подключение к Google BigQuery при помощи R



Для установки bigrquery запускаем следующую команду из консоли R:

install.packages(bigrquery)

Вот так просто! Мы готовы к работе.

Как и в случае с Python, требуется авторизация нашего клиента R для доступа к Google Cloud Services. Как следует из документации по bigrquery, проследуем по приглашению из консоли R, чтобы открыть URL для авторизации, после чего скопируем код в консоль.

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

Выполнение запросов к данным BigQuery при помощи R



Чтобы запрашивать данные BigQuery на языке R, выполним следующие шаги:

  • Укажем ID проекта из консоли Google Cloud, так, как это делалось в Python.
  • Сформируем строку запроса, при помощи которой запросим данные.
  • Вызовем query_exec с ID нашего проекта и строкой запроса.


Вот код, при помощи которого все это реализуется:

# импортируем библиотекуlibrary(bigrquery)# здесь идет ID нашего проектаproject_id <- "your-project-id" # пример запросаsql_string <- "SELECT * FROM dataset.my_table LIMIT 1000"# выполняем запрос и сохраняем результатquery_results <- query_exec(sql_string, project = project_id, useLegacySql = FALSE)


Как и в случае с Python, можно выполнять запросы, написанные на унаследованном SQL. Также можно изменить значение useLegacySql на TRUE в вашей функции query_exec.

Заключение



Итак, мы рассмотрели, как легко и просто работать с данными, сохраненными в Google BigQuery, обращаясь к ним на языках Python и R.

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

Перевод Отбор признаков в машинном обучении

02.09.2020 10:06:10 | Автор: admin

Привет, Хабр!

Мы в Рексофт перевели на русский язык статью Feature Selection in Machine Learning. Надеемся, будет полезно всем, кто неравнодушен к теме.

В реальном мире данные не всегда такие чистые, как порой думают бизнес-заказчики. Именно поэтому востребован интеллектуальный анализ данных (data mining и data wrangling). Он помогает выявлять недостающие значения и паттерны в структурированных с помощью запросов данных, которые не может определить человек. Для того, чтобы найти и использовать эти паттерны для предсказания результатов с помощью обнаруженных связей в данных пригодится машинное обучение (Machine Learning).

Для понимания любого алгоритма необходимо просмотреть все переменные в данных и выяснить, что эти переменные представляют. Это крайне важно, потому что обоснование результатов основывается на понимании данных. Если данные содержат 5 или даже 50 переменных, можно изучить их все. А что если их 200? Тогда просто не хватит времени изучить каждую отдельную переменную. Более того, некоторые алгоритмы не работают для категориальных данных, и тогда придется привести все категориальные колонки к количественным переменным (они могут выглядеть количественными, но метрики покажут, что они категориальные), чтобы добавить их в модель. Таким образом, количество переменных увеличивается, и их становится около 500. Что теперь делать? Можно подумать, что ответом будет снижение размерности. Алгоритмы снижения размерности уменьшают число параметров, но негативно влияют на интерпретируемость. Что если существуют другие техники, которые исключают признаки и при этом позволяют легко понять и интерпретировать оставшиеся?

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

Сильно коррелированные переменные

Сильно коррелированные друг с другом переменные дают модели одну и ту же информацию, следовательно, для анализа не нужно использовать их все. Например, если набор данных (dataset) содержит признаки Время в сети и Использованный трафик, можно предположить, что они будут в некоторой степени коррелированы, и мы увидим сильную корреляцию, даже если выберем непредвзятый образец данных. В таком случае в модели нужна только одна из этих переменных. Если использовать обе, то модель окажется переобучена (overfit) и предвзята относительно одного отдельного признака.

P-значения

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

Прямой отбор

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

Обратный отбор

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

Рекурсивное исключение признаков

RFE является широко используемой техникой/алгоритмом для выбора точного числа значимых признаков. Иногда метод используется, чтобы объяснить некоторое число самых важных признаков, влияющих на результаты; а иногда для уменьшения очень большого числа переменных (около 200-400), и оставляются только те, которые вносят хоть какой-то вклад в модель, а все остальные исключаются. RFE использует ранговую систему. Признакам в наборе данных выставляются ранги. Затем эти ранги используются для рекурсивного исключения признаков в зависимости от коллинеарности между ними и значимости этих признаков в модели. Кроме ранжирования признаков, RFE может показать, важны ли эти признаки или нет даже для заданного числа признаков (потому что очень вероятно, что выбранное число признаков может являться не оптимальным, и оптимальное число признаков может быть как больше, так и меньше выбранного).

Диаграмма важности признаков

Говоря об интерпретируемости алгоритмов машинного обучения, обычно обсуждают линейные регрессии (позволяющие проанализировать значимость признаков с помощью p-значений) и деревья решений (буквально показывающие важность признаков в форме дерева, а заодно и их иерархию). С другой стороны, в таких алгоритмах, как Random Forest, LightGBM и XG Boost, часто используется диаграмма значимости признаков, то есть строится диаграмма переменных и количества их важности. Это особенно полезно, когда нужно предоставить структурированное обоснование важности признаков с точки зрения их влияния на бизнес.

Регуляризация

Регуляризация делается для контроля за балансом между предвзятостью (bias) и отклонением (variance). Предвзятость показывает, насколько модель переобучилась (overfit) на тренировочном наборе данных. Отклонение показывает, насколько различны были предсказания между тренировочным и тестовым датасетами. В идеале и предвзятость, и дисперсия должны быть маленькими. Тут на помощь приходит регуляризация! Существует две основных техники:

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

L2 Регуляризация методом Ridge: Задачей Ridge является сохранение всех переменных и в то же время присвоение им важности на основе вклада в эффективность модели. Ridge будет хорошим выбором, если набор данных содержит небольшое число переменных и все они необходимы для интерпретации выводов и полученных результатов.

Так как Ridge оставляет все переменные, а Лассо лучше устанавливает их важность, был разработан алгоритм, объединяющий лучшие особенности обеих регуляризаций и известный как Elastic-Net.

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

Спасибо за чтение! Счастливого обучения!

Подробнее..

Перевод Временные сверточные сети революция в мире временных рядов

19.09.2020 18:15:27 | Автор: admin
Перевод статьи подготовлен в преддверии старта курса Deep Learning. Basic.



В этой статье мы поговорим о последних инновационных решениях на основе TCN. Для начала на примере детектора движения рассмотрим архитектуру временных сверточных сетей (Temporal Convolutional Network) и их преимущества перед традиционными подходами, такими как сверточные нейронные сети (CNN) и рекуррентные нейронные сети (RNN). Затем поговорим о последних примерах применения TCN, включая улучшение прогнозирования трафика, локализатор и детектор звука и вероятностное прогнозирование.

Краткий обзор TCN


В фундаментальной работе Леа и др. (2016) было впервые предложено использовать временные сверточные сети для сегментации действий на основе видео. Обычно процесс разбивается на два этапа: во-первых, вычисление низкоуровневых признаков с использованием (чаще всего) CNN, которая кодирует пространственно-временную информацию, и во-вторых, ввод низкоуровневых признаков в классификатор, который получает высокоуровневую временную информацию с помощью (чаще всего) RNN. Главным недостатком такого подхода является потребность в двух отдельных моделях. TCN предлагает унифицированный подход, чтобы покрыть оба уровня информации по принципу иерархии.

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



Шумиха вокруг TCN дошла даже до журнала Nature, где недавно появилась публикация работы Яна и др. (2020) об использовании TCN в задачах прогнозирования погоды. В своей работе авторы провели эксперимент по сравнению TCN и LSTM. Одним из результатов стал вывод о том, что TCN хорошо справляется с задачами прогнозирования временных рядов.



В следующих разделах представлены реализация и расширение классической TCN.

Улучшение прогнозирования трафика


Сервисы райдшеринга и онлайн-навигации могут улучшить прогнозирование трафика и изменить пребывание на дорогах к лучшему. Уменьшение количества пробок, уменьшение загрязнения окружающей среды, безопасное и быстрое вождение вот всего несколько целей, которых можно достичь за счет улучшения прогнозирования дорожного движения. Поскольку эта проблема основывается на данных в реальном времени, необходимо использовать накопленные данные о трафике. По этой причине Дай и др. (2020) недавно представили гибридную пространственно-временную графовую сверточную сеть (Hybrid Spatio-Temporal Graph Convolutional Network, H-STGCN). Основная идея заключается в том, чтобы использовать преимущества отношения кусочно-линейной скользящей плотности потока и преобразовывать предстоящий объем трафика в его эквивалент времени движения. Одним из наиболее интересных подходов, которые они использовали в своей работе, является свертка графа для получения временной зависимости. Составная матрица смежности отражает врожденные характеристики аппроксимации трафика (чтобы узнать больше, читайте статью Ли 2017 года). В следующей архитектуре представлены четыре модуля для описания всего процесса прогнозирования.



Локализация и обнаружение звуковых событий


Область локализации и обнаружения звуковых событий (SELF) продолжает расти. В автономной навигации понимание среды играет большую роль. Гирджис и др. (2020) недавно предложили новую архитектуру звуковых событий SELF-TCN. Группа исследователей утверждает, что их фреймворк превосходит современные решения в этой области, сокращая время обучения. В их SELDnet (архитектура представлена ниже) многоканальная аудиозапись, дискретизированная на частоте 44,1 кГц, извлекает, применяя кратковременное преобразование Фурье, фазу и величину спектра и выделяет их в виде отдельных входных признаков. Затем соединяются сверточные блоки и рекуррентные блоки (двунаправленные GRU), а затем идет полностью соединенный блок. На выходе из SELDnet можно получить обнаружение звуковых событий и направление, откуда пришел звук.



И для того, чтобы превзойти существующее решение, авторы представили SELD-TCN:



Поскольку расширенные свертки позволяют сети обрабатывать различные входные данные, может потребоваться более глубокая сеть (на которую будут влиять нестабильные градиенты во время обратного распространения ошибки). Авторы исследования эту проблему смогли решить, адаптировав архитектуру WaveNet (Дарио и др., 2017). Они показали, что рекуррентные слои не требуются для задач SELD, и при этом смогли определить время начала и окончания активных звуковых событий.

Вероятностное прогнозирование


Новый фреймворк, разработанный Ченом и др. (2020) может быть применен для оценки плотности вероятности. Прогнозирование временных рядов улучшает многие сценарии принятия бизнес-решений (например, управление ресурсами). Вероятностное прогнозирование позволяет извлекать информацию из исторических данных и минимизировать неопределенность будущих событий. Когда задача прогнозирования состоит в том, чтобы предсказать миллионы связанных временных рядов (как в розничном бизнесе), требуются непомерно большие трудовые и вычислительные ресурсы для оценки параметров. Чтобы разрешить эти трудности, авторы предложили систему оценки плотности и прогнозирования на основе CNN. Их структура может выучить скрытую корреляцию между рядами. Научная новизна в их работе заключается в предложенной ими глубокой TCN, представленной в их архитектуре:



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

Заключение


В этой статье мы рассмотрели последние работы, связанные с временными сверточными сетями, которые превосходят по тем или иным характеристикам классические подходы CNN и RNN в решении задач временных рядов.

Источники


  • Lea, Colin, et al. Temporal convolutional networks: A unified approach to action segmentation. European Conference on Computer Vision. Springer, Cham, 2016.
  • Lea, Colin, et al. Temporal convolutional networks for action segmentation and detection. proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017.
  • Yan, Jining, et al. temporal convolutional networks for the Advance prediction of enSo. Scientific Reports 10.1 (2020): 115.
  • Li, Yaguang, et al. Diffusion convolutional recurrent neural network: Data-driven traffic forecasting. arXiv preprint arXiv:1707.01926 (2017).
  • Rethage, Dario, Jordi Pons, and Xavier Serra. A wavenet for speech denoising. 2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2018.
  • Chen, Yitian, et al. Probabilistic forecasting with temporal convolutional neural network. Neurocomputing (2020).
  • Guirguis, Karim, et al. SELD-TCN: Sound Event Localization & Detection via Temporal Convolutional Networks. arXiv preprint arXiv:2003.01609 (2020).




Читать ещё:


Подробнее..

Лаборатория Тинькофф как студенты разрабатывают визуального робота

22.09.2020 20:11:13 | Автор: admin

image


В Тинькофф есть образовательный проект Лаборатория Финансовые технологии. Мы отбираем студентов и магистров московских технических вузов, которые хотят работать с ИТ-проектами банка. Оформляем их на работу в штат на 20, 30 или 40 часов в неделю, даем задачи, ментора и помогаем расти профессионально. Мы работаем в партнерстве с МФТИ: преподаватели и старшекурсники вуза выступают менторами для студентов.


Лаборант может выбрать, в какой из пяти команд работать:


  • Computer Vision;
  • Speech-to-Tech;
  • Аналитика;
  • Обработка естественного языка;
  • Рекомендательные системы.

У каждой команды свои задачи и специфика. Но принцип общий: учим решать сложные академические задачи на реальных кейсах.


Рассказываем о внутренней кухне Лаборатории на примере работы команды Computer Vision весной-летом 2020 года.


Проект команды Computer Vision: Говорящие головы


Куратор проекта: Константин Осминин, Тинькофф
Ментор: Аркадий Ильин, Лаборатория гибридных интеллектуальных систем МФТИ
Лаборанты: Кирилл Рыжиков (2 курс) и Дмитрий Гадецкий (1 курс магистратуры)


В Лаборатории мы решаем наукоемкие задачи, которые в перспективе можно применить на практике в работе банка. В команде Computer Vision в этом году работали над задачей audio-to-video. Это генерация реалистичного видео с человеком на основе его речи на русском языке.
Изначально тут был не только бизнес, но в значительной степени исследовательский интерес. Если кратко: нужно было обучить компьютерную модель генерировать видеоизображение на основе только фото человека и аудиодорожки. То есть мы даем модели аудио и картинку, а на выходе получаем видео с говорящим человеком.


Такая технология впервые появилась в Китае, а в России представлена сервисом по генерации виртуальных ведущих в Мейл.ру. У Сбербанка робот-ведущий Елена читает 30-секундные новости.


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


Константин Осминин, куратор команды Computer Vision в Тинькофф
Область виртуальных аватаров сейчас очень востребована в индустрии. Лаборатория это больше образовательный проект, для нас важно поработать с самой технологией, проверить уже существующие решения и придумать что-то свое.
Сначала мы работали над исследовательской частью, а потом поняли, как можно применить технологию в бизнесе. Теперь мы разрабатываем свой прототип ориентированного на бизнес сервиса, визуально общающегося с пользователем.

Задача: разработать говорящую голову


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


  • создание правдоподобной мимики лица на основе аудио (сгенерировать движение глаз, губ, бровей);
  • рендеринг видео.

Первый челлендж: исследовать чужие наработки


Сначала нам нужно было глубоко разобраться в области. Некоторые компании уже работали над этой задачей, например Samsung AI Center, Сбербанк. Но код у них закрытый и получить доступ к нему нельзя. Поэтому мы работали с открытыми источниками, они все в основном на английском. Больше всего информации нашли на агрегаторе Arxiv.


image
Пример статьи c arxiv.org


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


image
Пример неофициальной имплементации архитектуры генератора говорящих голов из статьи Few-Shot Adversarial Learning of Realistic Neural Talking Head Models (Egor Zakharov et al.)


Дмитрий Гадецкий, лаборант Тинькофф, студент 1 курса магистратуры
В первый месяц мы почти все время читали статьи на Arxiv и проверяли разные подходы. По опыту скажу: чтобы разобраться в вопросе, нужно вдумчиво изучить около десяти статей и проверить их код на работоспособность. Только когда понимаешь архитектуру кода, появляется возможность применить описанные принципы к конкретным задачам.
У нас был случай, когда мы проверяли подход к генерации из статьи китайских коллег. Мы не могли запустить код несколько дней. Пришлось писать авторам статьи с просьбой о помощи. В итоге они ответили, дописали код, чтобы все заработало.

Второй челлендж: датасет, лэндмарки и моргание


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


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


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


Встал вопрос, на каких данных обучать свой комплекс нейросетей. Готовых данных у нас не было. В сети датасетов с видео на английском языке тысячи часов (например, voxceleb, voxceleb2), а на русском их просто нет.


Нужно было собрать свой датасет:


  • видео на русском языке;
  • где четко видно лицо;
  • без шумов.

Изначально для парсинга мы выбрали лекции на Курсере. У них есть API, которая позволяет скачивать видео. Мы скачали видео с ресурса и приступили к его обработке.


Для этого написали программный модуль: он нарезал видео на отдельные кусочки, проверял, что на этом кусочке речь одного человека. Еще он искал в кадре того человека, кто говорил. Вырезанные куски с головой говорящего человека в кадре складывали в датасет.


С Курсеры мы собрали 20 часов видео. Но качество видео этого датасета было не очень. Лицо получалось в плохом разрешении. Поэтому нам пришлось собирать второй датасет уже с Ютуба. Оттуда скачали видео, которые больше соответствовали нашим требованиям: лицо говорящего человека занимало не меньше 40% экрана, смотрело в камеру. Этот датасет был в 60 часов.


image
Параметры датасета


На собранной базе видео мы запустили работу модели по разметке лиц. Мы прогнали одну модель (FaceAlign), которая искала на лице определенные ключевые точки лэндмарки. Всего их 68.


image
Сеть извлекает на каждом кадре видео эти точки и переводит их вот в такое представление:


image


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


На этих данных о ключевых точках обучался пререндер, построенный и обученный нами с оглядкой на архитектуру, предложенную Захаровым (a.k.a. Samsung)). Ему подавалась входная аудиодорожка, а он должен был сгенерировать видео. Сначала модуль генерировал абсолютное положение точек, но модель на таком подходе генерировала неправдоподобное изображение.


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


Кирилл Рыжиков, лаборант
Чтобы наша сеть генерировала правдоподобное изображение, мы искали другой подход. Попробовали генерировать не абсолютное положение ключевых точек, а отклонение от их положения на нейтральном лице, когда человек смотрит на вас прямо с закрытым ртом и спокойными бровями. И эврика! сеть сгенерировала правдоподобную мимику. Мы поняли, что идем в правильном направлении, и начали работать именно с этим подходом.
Отдельно мы решали задачу генерации моргания, чтобы лицо на видео выглядело реалистично. Без моргания говорящее лицо смотрится жутко. Выяснилось, что моргание не синхронизировано с речью. Поэтому наша модель его просто сэмплировала.

Третий челлендж: пререндеринг и рендеринг


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


В качестве пострендера использовали LipGAN, чтобы уточнить движение губ.



Где готовый продукт


Ребята показали результат в июле этого года. На общей презентации было 60 сотрудников Тинькофф, что необычно для Лаборатории. Как правило, проекты защищаются перед меньшей аудиторией.


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


Готовый результат ждем к концу этого года. Скорее всего, это будет 3D-модель, как тут:



Встречались вживую только один раз


Лаборанты с ментором и куратором встречались вживую только один раз, на собеседовании. Остальное время общались в Телеграме и Зуме. Это принцип Лаборатории: удаленная работа в удобное участникам время.


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

Три раза в неделю рабочие созвоны, где обсуждают текущие задачи, гипотезы, методы решений.


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


image
Обычный рабочий созвон с обсуждением найденной архитектуры генератора мимики


Лаборанты готовые R&D-специалисты


Так как работа в Лаборатории идет на стыке науки и практики, ее результаты публикуют и в академических кругах. Например, первые результаты работы в проекте Говорящие головы ментор и студенты готовят для доклада на 63-ю научную конференцию в МФТИ в ноябре этого года.


Аркадий Ильин, ментор
То, что делаем мы, мало кто делает в бизнес-сообществе. Поэтому хотим донести результаты и до академической среды.

До 27 сентября открыт прием заявок в лабораторию, подробнее об открытых проектах и сроках

Подробнее..

Личный опыт Как специалисту по Data Science с тремя годами опыта устроиться в Google и переехать в Лондон

17.09.2020 22:09:55 | Автор: admin
Привет, Хабр! Продолжаем делиться с вами историями IT-эмиграции. После Амстердама, Риги, Сиднея настала очередь Лондона. Анастасия Манохина Cloud-инженер в Google, поделится своим опытом прохождения собеседований и переезда в британскую столицу. Передаем ей слово!



Всем привет, меня зовут Настя, и вот уже несколько месяцев я работаю в Google в Лондоне. Это время оказалось крайне насыщенным: переезд, погружение в новую среду, а затем карантин и массовая удаленная работа. Но обо всем по порядку.

Как я переехала: начало процесса, собеседования


Все вышло во многом случайно. Я спокойно работала Data Scientistом в IT-компаниях в Москве, но у меня была подруга, которая устроилась в Google и переехала в Лондон. Именно ей пришла идея, что мне стоит отправить свое резюме. Я подумала, что это хорошая возможность потренироваться в прохождении интервью на английском, посмотреть, как все устроено. То есть я хотела попробовать и получить новый опыт, не более того.

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

Как получить оффер с релокейтом в Лондон? Можно искать работу самостоятельно, а можно подписаться на вакансии с релокейтом в нашем боте @g_jobbot. Он просто и быстро настраивается: сфера, зарплата, локация релокейт. Подходящие вам варианты будут приходить в Телеграм.

image

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

Сначала меня рассматривали на позицию software engineer. Для нее нужно было пройти онлайн coding challenge можно выбрать любой язык программирования, я выбрала python. Неудобно, что нужно писать код в Google Docs, для чего этот инструмент, прямо скажем, не подходит. На данном этапе важно не просто молча писать код, а рассказывать ход своих мыслей. Как я поняла, важно не только решить задачу, а показать как именно ты мыслишь. Так что к этому моменту уже важно иметь более-менее неплохой английский было непросто процессить сразу и решение, и иностранный язык, хотя я довольно активно подтягивала язык.

К своему даже удивлению, я решила задачу, и через пару дней получила приглашение на onsite interview. Изначально речь даже не шла о Лондоне, предполагалось, что в случае успеха, я буду работать в Мюнхене, так что я поехала именно туда. Компания оплатила билеты, забронировала отель рядом с офисом, куда я заселилась за день до интервью.

В назначенный день я пришла в офис, и началась череда собеседований. На позицию software engineer их было пять четыре на кодинг и одно на leadership, где проверяют уже soft skills.

Каждое интервью проводит новый человек. После трех интервью был обед в этот момент с тобой тоже находится сотрудник компании. После обеда состоялось интервью по soft skills, а затем уже еще одно самое сложное на написание кода. Это очень выматывает. Если в начале дня ты на адреналине и готов к приключениям, то к концу уже и голова не варит, и язык еле ворочается говорить то все время нужно на английском!

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

То есть задач про квадратные люки и прочих brain teasers не было вообще. Все довольно практично. Интервьюеров интересовал ход мысли и эффективность выбранного решения.

Весь процесс растянулся от 10 утра до 15-16 часов дня. Это был очень длинный и тяжелый день.

На какую позицию я в итоге попала


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

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

Процесс переезда и адаптация на новом месте


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

Вся подготовка к переезду занимает 3-4 месяца за это время компания оформляет разрешение на работу, собирает документы для визы. С моей стороны нужно было получить сертификат IELTS нужно сдать хотя бы на 4 балла из 9, что не так трудно.

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

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

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



В итоге мы нашли подходящую нам квартиру в 20 минутах на метро от офиса, правда из-за карантина я много туда не ездила. Как много где в Европе квартиры тут измеряются по спальням у нас two bedroom и еще есть гостиная. То есть по российским меркам это трехкомнатная квартира. Аренда стоит 2200 в месяц плюс коммунальные платежи и интернет. Сейчас рынок немного упал, возможно, возможно мы смогли бы снять ее дешевле, но точно не знаю.

Чего ждать в офисе, культура Google


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

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

Все коллеги очень приветливы, постоянно предлагают помощь. Люди понимают, что переезд в другую страну, в такую огромную компанию это тяжело, и информации очень много. Я работаю не в самом большом лондонском офисе Google, и здесь русскоязычных сотрудников не так много, так что разговаривать приходилось в основном на английском. Но в крупнейшем офисе на Kings Cross ситуация другая, там русскую речь можно услышать регулярно.

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

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

Не сказать, что у меня были какие-то проблемы с коллегами в России, но культура общения все-таки отличается. К примеру, в Google я не могу представить ситуацию, когда на code review ты читаешь комментарии коллег по твоему коду, и у тебя портится настроение. Здесь все супер-уважительно, хотя наверное исключения бывают везде, но я не сталкивалась с таким.

Досуг, развлечения, путешествия


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

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



Белые скалы Дувра



Граффити Бэнкси в Бристоле

Заключение: 5 практических советов


В завершение, пара советов, которые точно помогут сделать процесс переезда менее болезненным:

  • Нужно как можно больше заниматься английским, желательно с носителем языка.
  • Попробуйте найти рекомендацию если ваше резюме рекомендует тот, кто уже работает в Google, с вами свяжутся гораздо быстрее.
  • При переезде берите relocation bonus не деньгами, а услугами (если есть возможность) лучше вам помогут решить бытовые вопросы, чем вы сами будете это делать в новой стране.
  • Если бонуса нет соберите максимум информации до переезда: как снимать квартиру, на чем могут обмануть, что со страховками и банковским счетом. Чем лучше подготовитесь, тем меньше будет проблем.
  • Готовьтесь показать свое мышление понятно, знание алгоритмов нужно, но в целом проверяют общую адекватность, умение мыслить и соответствие культуре.

Используйте бот g-mate (@g_jobbot), чтобы получать вакансии по своему профилю с возможностью релокации в Нидерланды, Германию, Великобританию и десятки других стран прямо в Telegram. Компании могут опубликовать первые 3 вакансии бесплатно переходите по ссылке.

Еще больше ссылок о релокации и поиске работы в разных странах:


Подробнее..

Из песочницы Data Science в обувном магазине предсказали поведение клиентов и увеличили конверсию сайта на 16

22.09.2020 14:11:12 | Автор: admin
Российский производитель обуви Mario Berluchi автоматизировал маркетинг, внедрил привычные для интернет-магазинов механики, но не остановился на этом и запустил направление Data Science. Теперь магазин с помощью алгоритмов машинного обучения предсказывает действия клиента: что он сделает после добавления товара в корзину купит или уйдет, а если уйдет, то когда вернется.

Предсказание помогает в нужный момент побуждать клиента к покупке или, наоборот, не трогать его, если он купит и так. В рамках AB-теста механика персонализации сайта на основе предсказания помогла увеличить конверсию интернет-магазина на 16,5% и ARPU на 35,7% относительно контрольной группы.

Азамат Тибилов, директор по маркетингу Mario Berluchi, рассказывает о механике с предсказанием, измерении результатов, истории запуска направления Data Science и делится советами для интернет-магазинов, которые тоже хотят растить выручку за счет полезного и основанного на данных маркетинга.

Mario Berluchi российский производитель обуви, сумок и аксессуаров с пятью офлайн-магазинами в Москве и онлайн-магазином.

Масштаб. 200 тысяч посетителей сайта в месяц.

ИТ. Сайт на Bitrix, бэк-офис на 1С, платформа клиентских данных Mindbox.

Задача. Повысить выручку за счет работы с накопленными данными.

Результат. Рост конверсии сайта на 16,5% в рамках AB-теста, рост ARPU на 35,7%, снижение доли брошенных корзин на 17,2%.

Как работает механика персонализации сайта на основе предсказания


Когда клиент заходит на сайт, мы записываем его действия и прогоняем через алгоритм предсказания: купит в текущей сессии или не купит и вернется в течение 7 дней или не вернется. Предсказание пересчитывается раз в 10 секунд для каждого клиента.

Условия срабатывания механики:

  • если в корзине есть товары,
  • если не применен скидочный купон,
  • если по предсказанию вероятность покупки меньше 30%,
  • если по предсказанию клиент не вернется в течение 7 дней.

Если условия выполнены, клиент видит в корзине попап и решает, купить ли товар в текущей сессии или нет:

image

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

Результаты механики с предсказанием


АB-тесты с достоверностью 95%


Часть клиентов в рамках теста находилась в контрольной группе и не видела попап для неё механика была отключена, а другая часть видела. Мы сравнили в этих группах конверсию, ARPU и долю брошенных корзин получили статистически значимые результаты с достоверностью 95%:

16,5%
Рост конверсии сайта относительно контрольной группы по методу t-test

35,7%
Рост ARPU по методу bootstrap

17,2%
Снижение доли брошенных корзин по методу z-test

Сравнение конверсий и ARPU: в мае 2019 и мае 2020 после внедрения механики с предсказанием


image
Конверсия до и после внедрения механики с предсказанием

image
ARPU до и после внедрения механики с предсказанием

Зачем запустили направление Data Science


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

Для сквозной аналитики было необходимо собирать данные о поведении пользователей в базу Google BigQuery. Помимо стандартных действий пользователей добавления товара в корзину, посещения продуктовой карточки товара, совершения покупки мы собирали еще много действий с контентом сайта хитов. Ежедневно накапливалось более 20 тысяч строк хитов, и эти данные у нас хранились в базе, за которую мы, конечно же, платили.

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

В итоге собрали отдел Data Science и за полгода реализовали механику с предсказанием действий пользователя, которая повысила выручку. Таким образом мы открыли для себя новое направление бизнеса, которое приносит нам более 30% выручки и хорошо окупается.

Какие специалисты понадобились для Data Science


Каждый этап запуска механик с предсказанием подразумевает работу специалистов разных по функционалу, но из смежных областей. В штате у нас:

Аналитик. Анализирует данные, находит аномалии и проводит AB-тесты.

Два специалиста Data Science. Пишут алгоритмы, которые возвращают ответы-предсказания в виде вероятности того или иного действия пользователя на сайте.

Маркетолог. Разрабатывает и запускает механики с применением алгоритмов.

Разработчик. Внедряет механики и алгоритмы на сайте.

Как технически устроена механика с предсказанием


1. Размечаем исходные данные Google Analytics с помощью Google Tag Manager и используем стриминг OWOX BI для сбора данных в базе Google BigQuery. Эти шаги занимает мало времени с первой минуты можно видеть, как данные укладываются в базу.

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

3. Специалисты Data Science создают признаки (feature engineering) из визитов и контента, например количество просмотренных товаров, количество добавлений товаров в избранное, количество добавленных товаров за сессию в корзину.

image
Распределения весов признаков алгоритма на их основе предсказываем поведение клиента

4. Обучаем модель на исторических данных. Допустим, мы хотим предсказывать, будет ли у пользователя следующий сеанс или вернется ли он к нам в течение 7 дней. Для этого берем исторические данные, признаки и реализуем алгоритм. Для предсказания мы используем классификацию биномиальный ответ в виде 1 или 0.

5. Валидируем модель на исторических данных: точность прогноза, бизнес-метрики.

Прежде всего мы смотрим на долю accuracy (долю правильных ответов) и ROC-AUC (площадь под кривой ошибок):

image

Accuracy (доля правильных предсказаний) 0,88 говорит о том, что в 88% случаях мы точно предсказываем, что пользователь вернется или не вернется. Precision (точность) о том, какая доля предсказаний, что пользователь вернется, оказалась правильной. Recall (полнота) о том, какую долю реальных возвращений мы предсказали.

image
AUC ROC (площадь под кривой ошибок) используем для оценки качества работы алгоритма на выборке данных

Помимо ответов алгоритма 1 и 0 есть еще вероятность действия в процентах. И здесь мы задаем порог: если вероятность возврата пользователя более 30% и такие пользователи чаще всего действительно возвращаются, то ответ 1.

6. Прогнозируем действия пользователя.

7. Маркетолог разрабатывает механики для применения прогноза.

8. Запускаем АB-тест только на новых пользователях, которые познакомились с нашим сайтом прямо сейчас. Тест длится около трех недель, и в течение этого времени мы смотрим, как меняется накопительный p-value. В какой-то момент разница между группами становится значимой, понимаем, что скоро тест можно завершать и выкатывать механику в продакшен.

9. Аналитик измеряет результаты механики.

На основе каких клиентских данных работает предсказание


Visit-based. На основе действий на сайте: просмотр карточек товаров, добавление товаров в корзину, покупки.

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

Подходы visit based и content based пересекаются. Но в visit based мы оцениваем поведение пользователя, а в content based сам контент.

CRM-based. Обогащение данных из CRM интернет-магазина, учет истории покупок.

Советы интернет-магазинам


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

2. Рост конверсии, ключевой метрики интернет-магазина, самый сильный фактор развития вашего бизнеса.

3. Не бойтесь строить инфраструктуру и внедрять новые технологии в ваш бизнес. Внедрение машинного обучения позволяет сделать шаг вперед и уйти в отрыв от конкурентов.

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

Дальнейшие планы по развитию маркетинга


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

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

Как повторить механику с предсказанием в вашем интернет-магазине


Мы развиваем сотрудничество с Mindbox и предлагаем клиентам платформы внедрить нашу механику с предсказанием. Если хотите повторить в вашем интернет-магазине пишите коллегам.

***

Авторы:
Азамат Тибилов, директор по маркетингу Mario Berluchi
Мария Байкаускас, менеджер Mindbox
Сёма Сёмочкин, редактор Mindbox
Подробнее..

Сколько зарабатывает Аналитик данных обзор зарплат и вакансий в России и за рубежом в 2020

25.09.2020 20:20:19 | Автор: admin

Привет, Хабр! 28 сентября, Skillfactory запускает новый поток курса Data Analyst, поэтому мы решили сделать широкий обзор рынка вакансий, которые предлагают сегодня компании.

Действительно ли профессия аналитика данных может приносить до 300к/наносек? Какие умения требуют работодатели от аналитиков и что вообще нужно знать, чтобы стать востребованным и высокооплачиваемым спецом? Какие возможности для роста предлагает рынок сегодня?

Мы проанализировали 450 вакансий на должность аналитика данных в России и за рубежом и собрали результаты в этой статье.

Кто такой аналитик данных и что он должен знать


Прежде чем анализировать вакансии, разберемся, что делает Data Analyst в компании. В IT-сфере есть три направления специальностей по работе с данными: Data Analyst, Data Engineer и Data Scientist.

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

Результат работы аналитика данных это основа для принятия любых бизнес-решений.

Data Engineer работает больше не с самими данными, а с их инфраструктурой: базами данных, хранилищами и системами обработки. Инженер данных определяет, как анализировать данные, чтобы они были полезными для проекта. Если обобщить, то Data Engineer налаживает конвейер обработки данных.

Data Scientist занимается стратегической работой с информацией. Именно он создает системы прогнозирования, моделирования и динамического анализа, внедряет алгоритмы автоматизации и обучения.

Главная сложность в том, что границы между этими тремя специальностями довольно размыты. Большинство компаний не видят разницы, поэтому часто в вакансиях Data Analyst встречаются требования, которые больше подходят специалистам Data Engineer или Data Scientist.

В основном это обусловлено спецификой рынка. Если в IT-компаниях знают, что Data Analyst, Data Engineer и Data Scientist это в идеале три разных специалиста или даже три разных подразделения, то в продуктовых компаниях и производствах часто об этом даже не задумываются.

Что требуют работодатели от аналитика данных


Мы проанализировали свыше 450 вакансий на позицию аналитика данных, открытых в августе-сентябре 2020 года.

Во многих случаях требования к специалистам очень отличаются. Как мы писали выше, границы между Data Analyst, Data Engineer и Data Scientist стерты, поэтому часто бывает, что в заголовке вакансии пишут Аналитик данных, а фактически вакансия полностью соответствует Инженеру данных.

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

Хард скилы


Python с библиотеками для анализа данных Pandas и NumPy. Это мастхэв, его знание хотя бы на базовом уровне требуют 83% компаний в отрасли. Знание R, JavaScript и других ЯП требуют нужны всего лишь 17% работодателям.

Интересно, что в 2013 году по результатам опроса Data Analyst и Data Scientist язык R в аналитике данных был куда популярнее его использовали 61% специалистов.

SQL практически во всех вакансиях требуется знание SQL и навыки работы с реляционными базами данных. Чаще всего требуют умение писать запросы и оптимизировать их.

Навыки работы с NoSQL системами управления базами данных вроде MongoDB, CouchDB или Apache Cassandra работодатели требуют довольно редко примерно в 9% вакансий.

Power BI, Qlik, Tableau. Большинство компаний не требует знаний какой-нибудь конкретной программы визуализации данных. Обычно они указывают одну из трех на выбор или пишут системы визуализации данных без указания конкретной.

В целом специалисты могут сами выбирать, что именно им удобнее использовать. Принципиальной позиции у абсолютного большинства работодателей нет.

Опыт работы с Agile, Scrum, Kanban. Почти в половине вакансий работодатели указывают, что дополнительным плюсом будет умение соискателя работать с гибкими методологиями создания продуктов.

То есть, важно не только то, что делает аналитик данных в рамках своей специальности, но и то, как он это делает.

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

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

Действительно, маленьким командам часто незачем использовать мощные ресурсы SQL, если для обработки данных вполне хватает и обычного Excel. Но нужно понимать, что в таких ситуациях аналитик данных часто занимается сразу всем: сбором и анализом данных, инфраструктурой и автоматизацией.

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

Высшее образование в области математики пригодится, но при должном усердии все необходимые функции можно изучить и самому. Но для Data Scientist глубокое знание математики уже считается критичным. Если вы планируете расти из Data Analyst в Data Scientist, то математику нужно будет подтянуть.

По основным хард скилам это все. Остальные встречаются реже, чем в 10% вакансий, поэтому их можно списать на индивидуальные особенности работы в отдельных компаниях.

Софт скиллы


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

  • Критическое мышление
  • Аналитический склад ума
  • Умение правильно излагать и доносить информацию
  • Ответственность и внимание к деталям
  • Бизнес-мышление
  • Готовность принимать решения и брать ответственность за результат
  • Многозадачность
  • Чувство юмора

Интересно то, что многие считают профессию аналитика данных малообщительной. Аналитик кажется нердом, который работает только с цифрами, а не с людьми.

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

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

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

Зарплата и другие плюшки для аналитика данных


Теперь перейдем к самому интересному к зарплате. Мы проанализировали открытые вакансии на сайтах HH.ru и Хабр Карьера.

Больше всего вакансий для аналитиков данных по состоянию на 12.09.2020 открыто в Москве (241) и в Санкт-Петербурге (74). Для сравнения, во всей остальной России актуально всего 99 вакансий на эту должность.

Интересно, что только 20% компаний указывают уровень заработной платы в самом объявлении. Остальные 80% предпочитают обсуждать денежное вознаграждение в личной беседе с соискателем.

Разброс зарплат довольно большой. Зависит он не только от опыта соискателя, но и от географии. К примеру, аналитик-стажер в Перми получает 25 000 рублей, а Data Analyst в московском офисе международной компании зарабатывает 200 000 рублей.

В Москве средняя зарплата аналитика данных составляет 134 000 рублей. На нее вполне может рассчитывать хороший специалист с опытом от 2 лет.

Стажеры и Junior-спецы получают от 60 000 рублей. Есть небольшое количество вакансий, которые предлагают ниже этой суммы (8%), но они в основном предлагают работу не на полный день либо с ограниченной загрузкой в неделю.



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

Руководители отделов аналитики и Senior-спецы могут рассчитывать на зарплату от 170 000 рублей. Есть даже вакансии, которые предлагают больше 250 000 рублей в месяц. Да, для них требуется опыт больше 5 лет в аналитике и большой пул компетенций, но такие вакансии есть. Так что вполне ясно, куда можно расти.

В качестве дополнительных плюшек и мотиваторов часто указывают возможность корпоративного обучения, медицинскую страховку и даже корпоративные пенсионные программы. Некоторые компании предлагают релокацию в Европу или США после определенного количества лет, проработанных в компании.

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

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

Аналитики данных востребованы в любом крупном и среднем бизнесе, особенно в тех проектах, которые относятся к диджитал и IT. Финтех-банки, диджитал-агентства, продуктовые компании, которые налаживают онлайн-систему продаж, консалтинговые проекты.

Среди вакансий есть представители бизнеса практически всех сфер: от медицины до тяжелой промышленности. Так что профессия очень востребованная.

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

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

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

Мы также провели сравнительный анализ вакансий из Украины и Беларуси.

Средняя зарплата аналитика данных в Украине порядка 20 000 гривен (53 000 рублей). В столице есть вакансии с оплатой в 2-2,5 раза выше, но их выставляют преимущественно международные компании с филиалами в Киеве.

Абсолютно та же ситуация и в Беларуси. Средние размер заработной платы аналитика данных составляет 2800 белорусских рублей (81 000 рублей), Но разброс зарплат очень большой. В Гомеле, к примеру, аналитик с опытом от года получает в среднем 1100 белорусских рублей (31 000 российских рублей), а в Минске специалист может зарабатывать вплоть до 10 000 (287 000 российских рублей).

Откуда прийти в профессию и куда расти аналитику данных


Есть мнение, что попасть в касту аналитиков можно только с исключительными знаниями математики. Но это не так.

В аналитику обычно уходят Junior- и Middle-разработчики на Python. Если вдобавок есть базовые знания SQL вообще отлично. В таком случае разобраться со всеми особенностями работы будет намного проще.

Также можно начать карьеру непосредственно с аналитика. Выбирайте один из десятков доступных курсов и вперед. Высшую математику знать необязательно. Для Data Analyst уровня Junior и Middle нужно только знание инструментов работы с данными. А в большинстве случаев хватит и школьных знаний математики.

Возможностей роста для специалиста аналитики данных тоже хватает. Три самых очевидных: Data Mining Specialist, Data Engineer, Data Scientist. Первый работает непосредственно с поиском данных для аналитики, второй разрабатывает инфраструктуры данных, а третий прогнозированием и стратегией.

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

Специально для материала, мы попросили дать комментарий о необходимых навыках для роста в BI-аналитике,Александра Царёва, основателя компании SmartDataLab, лидера образовательного курса BI SkillFactory и Сергея Земскова руководителя направления Power BI/DWH SmartDataLab и преподавателя Bootcamp SkillFactory.

В обзоре указаны мастхэв компетенции, но если вы хотите и дальше расти как Аналитик данных, вам понадобится быть в курсе ETL и изучить:
Так называемый золотой треугольник Microsoft: SSRS, SSIS, SSAS;
Иметь представление о других промышленных ETL, например, KNIME;
Литературу по архитектуре данных, например, книгу Билла Инмона Методология Кимбалла;
Также нужно хотя бы в первом приближении понимать, что такое Informatica, GreenPlum, Pentaho, чем они друг от друга отличаются и как работают.
Быть в курсе, что такое SAP Web Analytics и другие новые BI решения от SAP, хотя сейчас отмечается переход с этих решений на Power BI (который, по исследованию проведенному в июле-августе телеграм каналом вакансий и фриланса в BI/DWH BI HeadHunter, в топе по запросу от работодателей).

Это солидный пласт знаний, но он сделает вас уберспецом.

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

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

В вакансиях на сайтах работы часто смешивают понятия. Даже встречаются предложения вроде Бизнес/системный аналитик. Не надо так. Это два разных направления.

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

Аналитик данных это перспективная и востребованная профессия. И чтобы стать Data Analyst, не нужно быть Перельманом и уметь решать теорему Пуанкаре хватит школьных знаний математики и упорства в освоении инструментов аналитика.

Совсем недавно мы запустили первый в России Онлайн-буткемп по Data Analytics, включающий в себя 5 недель обучения, 5 проектов в портфолио, оплачиваемая стажировка для лучшего выпускника. Это суперинтенсивный формат для самых целеустремленных: учиться нужно фултайм. Зато в итоге выход на работу уже через 13 месяца.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:



Подробнее..

Категории

Последние комментарии

© 2006-2020, personeltest.ru