Как проводить исследовательский анализ данных
Исследовательский анализ данных (EDA) – это процесс анализа наборов данных для обобщения их основных характеристик, часто с использованием графических методов. В рамках данной статьи рассмотрим основные шаги и подходы к проведению EDA.
1. Получение данных
Первым шагом в EDA является получение данных. Данные могут иметь различный формат, например, CSV, Excel, JSON и другие. Вам может потребоваться использовать различные инструменты для работы с данными в зависимости от формата и источника данных.
Пример загрузки данных из CSV-файла с использованием библиотеки pandas:
import pandas as pd data = pd.read_csv('data.csv')
2. Предварительная обработка данных
На этом этапе важно обработать данные, чтобы они были готовы к анализу. Некоторые из основных задач предварительной обработки данных:
- Удаление дубликатов
- Обработка пропущенных значений
- Преобразование типов данных
- Удаление выбросов
Пример обработки пропущенных значений:
data = data.dropna()
Аналитик данных: новая работа через 5 месяцев
Получится, даже если у вас нет опыта в IT

3. Описательная статистика
Следующим шагом является рассмотрение основных статистических характеристик данных, таких как среднее, медиана, стандартное отклонение и т. д. Это поможет вам лучше понять распределение данных и их особенности.
Пример использования описательной статистики с помощью pandas:
data.describe()
4. Визуализация данных
Визуализация данных – один из самых мощных инструментов в EDA, который позволяет наглядно представить распределение данных, выявить тренды и зависимости. Некоторые из популярных видов графиков для визуализации данных:
- Гистограмма
- Ящик с усами (box plot)
- Точечная диаграмма (scatter plot)
- График плотности (density plot)
Пример создания гистограммы с помощью библиотеки seaborn:
import seaborn as sns sns.histplot(data['column_name'])
5. Интерпретация результатов
После проведения описательной статистики и визуализации данных, вам необходимо проанализировать полученные результаты и сделать выводы. Это может включать выявление инсайтов, гипотез и направлений для дальнейшего анализа данных.
Заключение
Исследовательский анализ данных является важным этапом в аналитике данных, который позволяет лучше понять данные и выявить основные характеристики и закономерности. Следуйте данным шагам и используйте соответствующие инструменты для проведения эффективного анализа данных.
Не забудьте обратить внимание на онлайн школу, которая учит специалистов в сфере «Аналитика данных». Вставьте в текст спец.тег
Как событийно-ориентированная архитектура решает проблемы современных веб-приложений

Пока у нас продолжается распродажа на самые взыскательные вкусы, мы обратим ваше внимание на еще одну тему нашего творческого поиска: событийно-ориентированную архитектуру (EDA). Под катом вас ожидают красивые блок-схемы и рассказ о том, как данная инновационная парадигма помогает при разработке веб-приложений.
В этой статье будут рассмотрены некоторые проблемы, подстегивающие развитие инноваций в современной веб-разработке. Далее мы погрузимся в тему событийно-ориентированной архитектуры (EDA), призванной решить эти проблемы, по-новому трактуя архитектуру серверной части.
Веб-приложения прошли долгий путь с тех времен, когда контент, оформленный в виде статических HTML-страниц, подавался с сервера. Сегодня веб-приложения стали гораздо сложнее, в их работе используются разнообразные фреймворки, датацентры и технологии. В последние пару лет можно отметить две тенденции, определяющие развитие IT-рынка:
- Перенос приложений в облако;
- Внедрение микросервисной архитектуры.
Актуальные проблемы современного веба
Любая веб-технология должна справляться с теми вызовами, которым должны отвечать современные многопользовательские асинхронные приложения, рассчитанные на бесперебойную работу:
Доступность
Теперь мы работаем не с одним приложением, а с многими – десятками или даже сотнями – связанными сервисами, и каждый из них должен решать свои задачи круглосуточно, семь дней в неделю. Как этого добиться? Чаще всего сервис горизонтально масштабируют на множество инстансов, которые могут быть распределены в нескольких датацентрах – так обеспечивается высокая доступность. Все запросы, поступающие на данный конкретный сервис, маршрутизируются и равномерно распределяются по всем инстансам. В некоторых инструментах развертывания предоставляются возможности самовосстановления, поэтому при отказе одного инстанса создается другой, заступающий на его место.
Масштабируемость
Масштабируемость во многом сродни доступности. Суть доступности – обеспечить, что как минимум один экземпляр сервиса активен и работает, готов обслуживать входящие запросы. Масштабируемость, в свою очередь, связана, прежде всего, с производительностью. Если какое-либо приложение перегружено, то создаются новые экземпляры этого приложения, чтобы подстроиться к возросшему количеству запросов. Но вертикальное масштабирование приложений – нетривиальная задача, в особенности если речь идет о приложениях с сохранением состояния.
Единый источник истины
До появления микросервисов такая задача решалась довольно просто. Все данные располагались в одном местоположении, как правило, это была та или иная реляционная база данных. Но, когда множество сервисов совместно используют базу данных, могут создаваться такие проблемы, как возникающие между разными командами зависимости, касающиеся изменений схемы или проблем с производительностью. Обычно эта проблема решалась выделением своей базы данных на каждый сервис. Распределенный источник истины очень хорошо помогает соблюдать чистую архитектуру, но в такой ситуации приходится иметь дело с распределенными транзакциями и сложностью, сопряженной с поддержкой множественных баз данных.
Синхронность
При реализации типичного сценария вида «запрос-отклик» клиент дожидается, пока ответит сервер; он блокирует все действия, пока не получит ответ, либо пока не истечет заданная задержка. Если взять такое поведение и внедрить его в микросервисную архитектуру при помощи цепочек вызовов, пронизывающих всю систему, то можно легко оказаться в так называемом «микросервисном аду». Все начинается с вызова всего одного сервиса, назовем его «сервис А». Но затем сервис A должен вызвать сервис B, и начинается самое интересное. Проблема с данным поведением такова: если сам сервис связан с заблокированными ресурсами (например, висит поток), то задержки растут экспоненциально. Если у нас разрешена задержка в 500 мс на сервис, а в цепочке пять вызовов сервисов, то первому сервису понадобится задержка в 2500 мс (2,5 секунды), а последнему – 500 мс.

Вызовы современного веба
Знакомство с событийно-ориентированной архитектурой
Событийно-ориентированная архитектура (EDA) – это парадигма программной архитектуры, способствующая порождению, обнаружению, потреблению событий и реакции на них.
В классических трехуровневых приложениях ядром системы является база данных. В EDA фокус смещается на события и на то, как они просачиваются через систему. Такая смена акцентов позволяет полностью изменить подход к проектированию приложений и решению вышеупомянутых проблем.
Прежде, чем рассмотреть, как именно это делается в EDA, рассмотрим, что же такое «событие». Событие – это действие, инициирующее либо некоторое уведомление, либо изменение в состоянии приложения. Свет включился (уведомление), термостат отключил обогревательную систему (уведомление), у пользователя изменился адрес (изменение состояния), у кого-то из ваших друзей изменился номер телефона (изменение состояния). Все это — события, но еще не факт, что мы должны добавлять их в событийно-ориентированное решение. Предполагается, что в архитектуру добавляются лишь события, важные с точки зрения бизнеса. Событие «пользователь оформляет заказ» важно с точки зрения бизнеса, а «пользователь съедает заказанную пиццу или обед» — нет.
Если подумать над некоторыми событиями, то по поводу некоторых сразу понятно, что они важны для бизнеса, а по поводу некоторых – нет. Особенно по поводу тех, что происходят в ответ на другие события. Для выявления событий, идущих через систему, применяется техника под названием «событийный штурм». Созываются участники разработки приложения (от программистов до разработчиков бизнес-логики и экспертов в предметной области) и общими силами картируют все бизнес-процессы, представляя их в виде конкретных событий. Когда такая карта будет готова, результат работы формулируется в виде требований, которые должны выполняться при разработке приложений.

Пример приложения для бронирования, описанного методом событийного штурма
Выявив интересующие нас события и определившись, как их идентифицировать, давайте рассмотрим, как при помощи данной парадигмы можно решить типичные проблемы, упомянутые выше.
Поток событий является однонаправленным: от производителя к потребителю. Сравните данную ситуацию с вызовом REST. Производитель событий в принципе не ожидает отклика от потребителя, тогда как в случае REST-вызова отклик будет всегда. Нет отклика – значит не необходимости блокировать выполнение кода, пока не произойдет что-то еще. В таком случае события становятся асинхронными по природе своей, что полностью исключает риск увязнуть в задержках.
События происходят в результате действия, поэтому целевой системы здесь нет; нельзя сказать, что сервис A инициирует события в сервисе B; но можно сказать, что сервис B интересуют события, порождаемые сервисом A. Правда, в этой системе могут быть и другие «заинтересованные стороны», например, сервисы C или D.
Как же нам убедиться, что событие, инициированное в некоторой системе, достигнет всех «заинтересованных» сервисов? Как правило, подобные системы решаются при помощи брокеров сообщений. Брокер – это просто приложение, действующее в качестве посредника между генератором события (приложением, создавшим это событие) и потребителем события. Таким образом, приложения удается аккуратно открепить друг от друга, позаботившись о проблеме доступности, речь о которой шла выше в этом посте. Если именно в данный момент приложение недоступно, то, вернувшись в онлайн, оно начнет потреблять события и обрабатывать их, наверстав все те события, которые успели произойти за период, пока оно оставалось недоступным.
Что насчет хранилища данных? Можно ли хранить события в базе данных, либо вместо базы данных требуется что-то иное? Определенно, события можно хранить в базах данных, но в таком случае утрачивается их «событийная» сущность. Как только событие произошло, скорректировать его мы уже не можем, поэтому события по сути своей неизменяемы. Базы данных, в свою очередь… изменяемы, после занесения данных в базу их вполне можно изменить.
Лучше хранить события в логах событий. Логи событий – не что иное, как централизованное хранилище данных, где каждое событие записано в виде последовательности неизменяемых записей, так называемого «лога». Лог можно сравнить с журналом, где каждое новое событие добавляется в конец списка. Всегда можно воссоздать наиболее актуальное состояние, воспроизведя все события лога от начала до настоящего момента.
Итак, мы затронули все вопросы, кроме масштабируемости. Сервисы, создаваемые в событийно-ориентированном ключе, всегда рассчитаны на развертывание во множестве инстансов. Поскольку состояние как таковое хранится в логе событий, сам сервис будет без сохранения состояния, что обеспечивает хирургически точное масштабирование любого интересующего нас сервиса.
Единственным исключением из этого принципа являются сервисы, предназначенные для создания материализованных представлений. В сущности, материализованное представление – это состояние, описывающее лог событий в определенный момент времени. Такой подход используется, чтобы было проще запрашивать данные. Возвращаясь к проблеме масштабирования, скажем, что материализованное представление – это просто совокупное представление событий, напоминающее по форме таблицу; но где мы храним эти таблицы? Чаще всего приходится видеть такие агрегации в памяти, и при этом наш сервис автоматически превращается в сохраняющий состояние. Быстрое и легкое решение – снабдить локальной базой данных каждый сервис, создающий материализованные представления. Таким образом, состояние хранится в базе данных, и сервис работает без сохранения состояния.

Хотя, событийно-ориентированная архитектура существует уже более 15 лет, она лишь недавно снискала серьезную популярность, и это неслучайно. Большинство компаний проходят этап «цифровой трансформации», сопровождаемый дикими требованиями. Из-за сложности этих требований инженерам приходится осваивать новые подходы к проектированию ПО, предполагающие, в частности, ослабление связанности сервисов друг с другом и снижение издержек на обслуживание сервисов. EDA — одно из возможных решений этих проблем, но не единственное. Также не рассчитывайте, что все проблемы решатся, стоит только перейти на EDA. Для реализации некоторых фич по-прежнему могут потребоваться надежные дедовские REST API или хранение информации в базе данных. Выберите наиболее подходящий для вас вариант и спроектируйте его как следует!
- event-driven architecture
- web-разработка
- высокая производительность
- чистая архитектура
- Блог компании Издательский дом «Питер»
- Программирование
- Проектирование и рефакторинг
Разведочный анализ данных в одной строке кода
Разведочный анализ данных (Exploratory Data Analysis, EDA) — это выявление скрытой информации в наборе данных.
sweetviz — библиотека, которая предоставляет важную информацию о наборе данных без написания большого количества кода.
Сначала установим sweetviz с помощью следующей команды:
pip install sweetviz
Я использую ноутбук Jupyter в редакторе VS CODE. Вы можете выбрать редактор кода по своему усмотрению.
Импортируем sweetviz и библиотеку pandas:
Теперь импортируем набор данных. Я использую набор Titanic, с которым вы, возможно, уже сталкивались при изучении МО.
Датафрейм выглядит так:
Теперь создадим EDA-отчет по набору данных:
Анализируем данные с помощью sweetviz, а затем выводим результаты в браузер в виде HTML-страницы (сайта), которая также сохраняется по умолчанию в текущем каталоге.
Когда вы запустите указанную выше ячейку, в браузере откроется новая вкладка, содержащая важную информацию о наборе данных.
Мы получили всеобъемлющую информацию о наборе данных, а также информацию о каждом его столбце.
Если вы щелкнете по любому из столбцов, на боковой панели веб-страницы откроется подробная статистическая информация по нему.
По различным типам столбцов предоставляется большое количество информации. Также можно воспользоваться несколькими видами визуализаций (в зависимости от типа столбца).
Перейдя на вкладку Associations, вы можете создать график матрицы корреляции.
Мы можем выполнить EDA в отношении обучающих и тестовых данных. Разделение на такие наборы — важный этап, который оказывает решающее влияние на производительность модели.
Вот так выглядит датафрейм:
Столбец Survived представлен как переменная Y, а остальные столбцы — как переменные x. Разделим набор данных на X и y.
Теперь создадим обучающий и тестовый наборы данных из переменных X и y.
Выполним EDA обучающих и тестовых данных, создав отчет по их сравнению.
Ниже представлен вывод, т.е. отчет по сравнению.
Вы можете визуализировать сравнение одного и того же столбца из наборов обучающих и тестовых данных, щелкнув по нему. После этого откроется боковая панель, содержащая детальную информацию.
Sweetviz предоставляет важные сведения о наборе данных, которые можно упустить во время работы с matplotlib, seaborn и другими библиотеками. Подобную информацию важно учитывать перед реализацией задач МО.
- Как получить данные в нужном формате с помощью Pandas
- Решение алгоритмических проблем: Поиск повторяющихся элементов в массиве
- Лучшие бесплатные источники наборов данных для анализа
Читайте нас в Telegram, VK и Дзен
Разведочный анализ (EDA)

Разведочный анализ данных, или EDA, – это как археологические раскопки в мире информации. Это первый шаг, когда мы берем на себя роль исследователя данных и начинаем расследовать, как устроены наши данные, как они взаимосвязаны и что они нам могут рассказать. EDA – это не просто скучная предварительная обработка, это настоящее приключение, в ходе которого мы обнаруживаем неожиданные моменты, паттерны и закономерности, которые часто прячутся на первый взгляд.
Представь, что ты археолог, который обнаружил древний город. Первое, что ты делаешь, – это изучаешь артефакты, учишься понимать их значение и связи между ними, прежде чем начнешь рассказывать историю этого города. Точно так же и EDA позволяет нам раскрывать истории, заложенные в данных. Мы открываем для себя ключевые факторы, влияющие на наши переменные, выявляем паттерны поведения и взаимосвязи, которые нередко оказывают решающее влияние на стратегии и принимаемые бизнес-решения.
Помимо этого, EDA – это наша страховка от неприятных сюрпризов. Мы находим аномалии данных, которые могут исказить наши выводы, и можем предпринять меры для их коррекции. Также EDA помогает нам определить, какие данные нам не хватает, чтобы получить полное представление о ситуации, и планомерно заполнить эти пробелы.
Цели разведочного анализа данных
A. Понимание структуры и характеристик набора данных
На этом этапе EDA мы пристально изучаем структуру и характеристики данных, чтобы полностью понять, с чем имеем дело. Это включает в себя обзор размера набора данных, типов переменных, наличия пропущенных значений, дубликатов и других важных аспектов. Разведка на этом уровне позволяет нам сформировать четкое представление о данных, что становится фундаментом для дальнейшего анализа.
B. Выявление аномалий и выбросов
Иногда данные могут хранить в себе сюрпризы, которые могут существенно повлиять на наши выводы. Используя методы EDA мы обнаруживаем аномалии и выбросы в наших данных. Эти значения, отклоняющиеся от общего паттерна, могут возникать из-за ошибок ввода, случайных событий или даже указывать на систематические проблемы в сборе данных. Определение и устранение таких аномалий становится критической частью нашего анализа, чтобы гарантировать надежность результатов.
C. Идентификация связей и корреляций между переменными
Используя статистические меры EDA позволяет идентифицировать взаимосвязи между переменными, что помогает понять, как одни факторы влияют на другие. Это может стать отправной точкой для формулирования гипотез и принятия важных бизнес-решений.
D. Подготовка данных для дальнейших этапов анализа
На этом этапе EDA мы обрабатываем данные для того, чтобы подготовить их к более сложным аналитическим методам. Мы чистим данные от шума, заполняем пропущенные значения, проводим масштабирование или преобразования переменных, чтобы обеспечить их качественную и интерпретируемую структуру. Только с надлежаще подготовленными данными мы можем достичь точных и надежных результатов на последующих этапах анализа.
Инструменты и методы разведочного анализа данных (EDA)
A. Визуализация данных
Визуализация данных позволяет нам увидеть и понять паттерны, тренды и взаимосвязи в данных через графику и диаграммы.
-
Гистограммы и диаграммы рассеянияГистограмма – это графическое представление распределения данных по различным интервалам. Она позволяет нам оценить, как часто значения попадают в определенные диапазоны и какие у нас имеются пики или провалы в данных. Диаграмма рассеяния – это график, в котором каждая точка представляет собой отдельное наблюдение и показывает взаимосвязь между двумя переменными. Это может помочь нам определить, есть ли какая-либо зависимость или корреляция между ними. Пример Python-кода для построения гистограммы и диаграммы рассеяния:
import matplotlib.pyplot as plt import seaborn as sns # Генерируем случайные данные data = [23, 34, 45, 67, 23, 56, 78, 89, 43, 65, 34, 56, 76] # Построение гистограммы plt.hist(data, bins=10, color='blue', alpha=0.7) plt.xlabel('Значения') plt.ylabel('Частота') plt.title('Гистограмма данных') plt.show() # Построение диаграммы рассеяния x = [1, 2, 3, 4, 5, 6, 7, 8] y = [15, 25, 30, 40, 50, 60, 70, 80] plt.scatter(x, y, color='red') plt.xlabel('Переменная X') plt.ylabel('Переменная Y') plt.title('Диаграмма рассеяния') plt.show()

Ящик с усами (box plot)Ящик с усами – это визуализация статистических характеристик распределения данных, таких как медиана, квартили и выбросы. Он помогает нам быстро оценить разброс и симметрию данных, а также выявить потенциальные аномалии. Пример Python-кода для построения ящика с усами:
import matplotlib.pyplot as plt import seaborn as sns # Генерируем случайные данные data = [23, 34, 45, 67, 23, 56, 78, 89, 43, 65, 34, 56, 76] # Построение ящика с усами plt.boxplot(data) plt.ylabel('Значения') plt.title('Ящик с усами') plt.show()

Тепловые карты (heatmap)Тепловая карта – это графическое представление матрицы данных, где цветовая шкала показывает степень взаимосвязи между переменными. Это помогает выявить паттерны и зависимости в больших наборах данных. Пример Python-кода для построения тепловой карты:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns # Генерируем случайные данные data = np.random.rand(5, 5) # Построение тепловой карты sns.heatmap(data, annot=True, cmap='YlGnBu') plt.title('Тепловая карта') plt.show()

Визуализация данных в Python предоставляет нам мощные инструменты для исследования, анализа и визуализации информации из набора данных. Это лишь небольшой обзор возможностей, и в зависимости от задачи и типа данных можно использовать более сложные графики и визуализации для раскрытия потенциала данных.
B. Сводные статистики и меры центральной тенденции
Сводные статистики и меры центральной тенденции позволяют нам получить обобщенное представление о распределении данных и основных характеристиках. Это ключевые числовые метрики, которые помогают нам понять типичные и наиболее значимые значения в наборе данных.
- Среднее (Mean): Это сумма всех значений, разделенная на количество значений. Оно представляет общую «среднюю» величину данных.
- Медиана (Median): Это среднее значение двух средних значений, если количество значений четное, или среднее значение самого центрального числа, если количество значений нечетное. Медиана предоставляет более устойчивую меру центральной тенденции в присутствии выбросов.
- Мода (Mode): Это значение, которое встречается наиболее часто в наборе данных. Мода может быть полезна для определения наиболее типичного значения.
Пример Python-кода для расчета среднего, медианы и моды:
import numpy as np from scipy import stats # Генерируем случайные данные data = np.random.randint(1, 100, 20) # Расчет среднего mean = np.mean(data) print("Среднее:", mean) # Расчет медианы median = np.median(data) print("Медиана:", median) # Расчет моды mode = stats.mode(data) print("Мода:", mode.mode[0])
C. Корреляционный анализ
Корреляционный анализ помогает нам понять, какие переменные взаимосвязаны между собой и насколько сильна эта связь. Коэффициент корреляции измеряет степень линейной зависимости между двумя переменными.
- Положительная корреляция: Если одна переменная увеличивается, другая также увеличивается. Коэффициент корреляции находится в диапазоне от 0 до 1.
- Отрицательная корреляция: Если одна переменная увеличивается, другая уменьшается. Коэффициент корреляции находится в диапазоне от 0 до -1.
- Нулевая корреляция: Отсутствие линейной зависимости между переменными. Коэффициент корреляции близок к 0.
Пример Python-кода для расчета коэффициента корреляции:
import numpy as np import matplotlib.pyplot as plt # Генерируем случайные данные x = np.array([1, 2, 3, 4, 5, 6]) y = np.array([2, 3, 4, 4, 5, 7]) # Расчет коэффициента корреляции Пирсона correlation = np.corrcoef(x, y)[0, 1] print("Коэффициент корреляции:", correlation) # Визуализация данных plt.scatter(x, y) plt.xlabel('Переменная X') plt.ylabel('Переменная Y') plt.title('Диаграмма рассеяния и корреляция') plt.show()

Все эти методы и меры позволяют нам более глубоко понимать структуру и зависимости в данных, что, в свою очередь, помогает нам принимать более обоснованные аналитические решения.
E. Преобразование данных (например, нормализация или стандартизация)
Преобразование данных – это процесс изменения шкалы или распределения переменных, чтобы сделать их более подходящими для анализа или моделирования. Это важный этап EDA, который помогает сгладить различия между переменными и создать более устойчивые и интерпретируемые данные.
- Нормализация (Normalization): Этот метод масштабирует значения переменных так, чтобы они находились в диапазоне от 0 до 1. Это особенно полезно, когда у нас есть переменные с разными единицами измерения и масштабами.
- Стандартизация (Standardization): Этот метод преобразует значения переменных так, чтобы их среднее было равно 0, а стандартное отклонение – 1. Он делает распределение более «стандартным» и симметричным.
Пример Python-кода для нормализации и стандартизации данных:
import numpy as np from sklearn.preprocessing import MinMaxScaler, StandardScaler # Генерируем случайные данные data = np.array([[1, 2], [2, 3], [3, 4], [4, 5]]) # Нормализация данных scaler = MinMaxScaler() normalized_data = scaler.fit_transform(data) print("Нормализованные данные:") print(normalized_data) # Стандартизация данных scaler = StandardScaler() standardized_data = scaler.fit_transform(data) print("Стандартизованные данные:") print(standardized_data)
Преобразование данных может быть особенно полезным, когда у нас есть переменные с разными диапазонами значений, что может затруднять интерпретацию результатов. Это также может помочь алгоритмам машинного обучения работать более эффективно, так как они часто ожидают, что переменные будут иметь определенный масштаб или распределение.
D. Анализ выбросов и аномалий
Анализ выбросов и аномалий – это процесс выявления и исследования значений данных, которые существенно отличаются от остальных наблюдений. Выбросы и аномалии могут возникнуть из-за ошибок в данных, случайных событий или указывать на особенности исследуемого явления.
Основные шаги анализа выбросов и аномалий:
- Визуализация данных: Используйте графики, такие как ящик с усами (box plot) или диаграммы рассеяния, чтобы визуально выявить потенциальные выбросы.
- Статистический анализ: Используйте статистические методы, чтобы определить, какие значения считаются выбросами на основе критериев, таких как интерквартильный размах или Z-оценка.
- Принятие решения: Решите, какие действия необходимо предпринять с выбросами, например, удалить их, заменить на другие значения или оставить без изменений.
Пример Python-кода для анализа выбросов с использованием ящика с усами:
import numpy as np import matplotlib.pyplot as plt # Генерируем случайные данные с выбросами data = np.array([10, 15, 20, 25, 30, 500]) # Построение ящика с усами plt.boxplot(data) plt.ylabel('Значения') plt.title('Анализ выбросов') plt.show()

E. Преобразование данных (например, нормализация или стандартизация)
Преобразование данных – это процесс изменения шкалы или распределения переменных, чтобы сделать их более подходящими для анализа или моделирования. Это важный этап EDA, который помогает сгладить различия между переменными и создать более устойчивые и интерпретируемые данные.
- Нормализация (Normalization): Этот метод масштабирует значения переменных так, чтобы они находились в диапазоне от 0 до 1. Это особенно полезно, когда у нас есть переменные с разными единицами измерения и масштабами.
- Стандартизация (Standardization): Этот метод преобразует значения переменных так, чтобы их среднее было равно 0, а стандартное отклонение – 1. Он делает распределение более «стандартным» и симметричным.
Пример Python-кода для нормализации и стандартизации данных:
import numpy as np from sklearn.preprocessing import MinMaxScaler, StandardScaler # Генерируем случайные данные data = np.array([[1, 2], [2, 3], [3, 4], [4, 5]]) # Нормализация данных scaler = MinMaxScaler() normalized_data = scaler.fit_transform(data) print("Нормализованные данные:") print(normalized_data) # Стандартизация данных scaler = StandardScaler() standardized_data = scaler.fit_transform(data) print("Стандартизованные данные:") print(standardized_data)
Преобразование данных может быть особенно полезным, когда у нас есть переменные с разными диапазонами значений, что может затруднять интерпретацию результатов.
Шаги разведочного анализа данных
Давайте рассмотрим каждый шаг.
A. Загрузка и первичный осмотр данных
Первый шаг – загрузка данных и их первичный осмотр. Для этого мы будем использовать библиотеку Pandas, которая позволяет работать с табличными данными.
Задача: Предположим, у нас есть CSV-файл sales_data.csv с данными о продажах. Давайте загрузим данные из файла и выведем первые пять строк таблицы на экран.
import pandas as pd # Загрузка данных data = pd.read_csv('sales_data.csv') # Вывод первых 5 строк таблицы print(data.head())
B. Обработка пропущенных значений
Пропущенные значения могут повлиять на анализ, поэтому важно обработать их. В этом шаге мы будем заполнять пропущенные значения средними или медианными значениями.
Задача: Допустим, у нас есть пропущенные значения в столбце Цена . Мы решим эту проблему, заполнив пропущенные значения средней ценой продуктов.
mean_price = data['Цена'].mean() data['Цена'].fillna(mean_price, inplace=True)
C. Анализ распределения переменных
В этом шаге мы будем изучать распределение числовых переменных. Мы построим гистограммы и диаграммы рассеяния для лучшего понимания данных.
Задача: Представим, что нам интересно распределение цен на продукты. Давайте построим гистограмму для этой переменной.
import matplotlib.pyplot as plt plt.hist(data['Цена'], bins=20, color='blue', alpha=0.7) plt.xlabel('Цена') plt.ylabel('Частота') plt.title('Распределение цен на продукты') plt.show()
D. Исследование корреляций между переменными
В этом шаге мы рассмотрим корреляции между числовыми переменными. Мы используем коэффициент корреляции, чтобы определить, какие переменные взаимосвязаны.
Задача: Допустим, мы хотим понять, существует ли связь между ценой продукта и его количеством продаж. Давайте рассчитаем коэффициент корреляции между этими переменными.
correlation = data['Цена'].corr(data['Количество']) print("Корреляция между ценой и количеством продаж:", correlation)
E. Выявление выбросов и аномалий
В этом шаге мы будем искать выбросы и аномалии в данных. Для этого используется визуализация, например, ящик с усами (box plot).
Задача: Давайте определим, есть ли выбросы в столбце Количество (количество продаж продукта). Мы построим ящик с усами для этой переменной.
plt.boxplot(data['Количество']) plt.ylabel('Количество') plt.title('Анализ выбросов в количестве продаж') plt.show()
F. Изучение категориальных переменных
Категориальные переменные тоже важны. В этом шаге мы будем исследовать их распределение и частоты.
Задача: Пусть нас интересует, какие продукты являются наиболее популярными среди покупателей. Давайте построим график частоты продаж для каждого продукта.
product_counts = data['Продукт'].value_counts() product_counts.plot(kind='bar') plt.xlabel('Продукт') plt.ylabel('Частота продаж') plt.title('Частота продаж продуктов') plt.xticks(rotation=45) plt.show()
G. Визуализация результатов EDA
Последний шаг – визуализация результатов всего EDA. Мы объединим несколько графиков для более полного представления.
Задача: Давайте создадим обобщенную визуализаци
ю результатов EDA, включая гистограмму, диаграмму рассеяния и ящик с усами.
plt.figure(figsize=(10, 6)) plt.subplot(2, 2, 1) plt.hist(data['Цена'], bins=20, color='blue', alpha=0.7) plt.xlabel('Цена') plt.ylabel('Частота') plt.title('Распределение цен на продукты') plt.subplot(2, 2, 2) plt.scatter(data['Цена'], data['Количество'], color='green') plt.xlabel('Цена') plt.ylabel('Количество') plt.title('Диаграмма рассеяния между ценой и количеством продаж') plt.subplot(2, 2, 3) plt.boxplot(data['Количество']) plt.ylabel('Количество') plt.title('Анализ выбросов в количестве продаж') plt.tight_layout() plt.show()
С помощью данных шагов мы прошлись от загрузки и осмотра данных до визуализации результатов анализа. Этот процесс позволяет нам лучше понять данные, выявить паттерны и зависимости, а также подготовиться к следующим этапам анализа или моделирования.
Заключение
Разведочный анализ данных является неотъемлемой частью успешного анализа данных и позволяет сделать первые выводы, идентифицировать интересные тренды и подготовить данные для последующих этапов работы. При проведении EDA важно не только использовать технические методы, но и иметь интуитивное понимание данных и их контекста.
Напоследок хочу порекомендовать вам бесплатный вебинар, где коллеги из OTUS расскажут про то, какие виды требований бывают и как они коррелируют между собой. Как понять, что заказчик пришел к тебе с реальной проблемой, и как отличить проблему, потребность и решение.