Быстрый и грязный анализ данных с помощью Pandas
Прежде чем вы сможете выбрать и подготовить данные для моделирования, вам необходимо понять, с чего вам нужно начать.
Если вы используете стек Python для машинного обучения, для лучшего понимания ваших данных вы можете использовать библиотеку Pandas.
В этом посте вы найдете несколько быстрых и простых рецептов для Pandas, которые помогут улучшить понимание ваших данных с точки зрения их структуры, распределения и взаимосвязей.
Начните свой проект с моей новой книги «Освоение машинного обучения с помощью Python», включающей пошаговые руководства и файлы исходного кода Python для все примеры.
Давайте начнем.
- Обновление, март 2018 г.: добавлена альтернативная ссылка для загрузки набора данных, поскольку оригинал, похоже, был удален.
Анализ данных
Анализ данных заключается в том, чтобы задавать вопросы о ваших данных и отвечать на них.
Как специалист по машинному обучению, вы, возможно, не очень хорошо знакомы с областью, в которой работаете. Идеально иметь под рукой экспертов в данной области, но это не всегда возможно.
Эти проблемы также возникают, когда вы изучаете прикладное машинное обучение либо со стандартными наборами данных машинного обучения, либо консультируетесь, либо работаете с наборами данных соревнований.
Вам нужно вызвать вопросы о ваших данных, на которые вы сможете ответить. Вам необходимо лучше понимать данные, которые у вас есть. Это можно сделать путем суммирования и визуализации данных.
Панды
Библиотека Pandas Python создана для быстрого анализа и обработки данных. Это одновременно удивительно по своей простоте и знакомо, если вы работали над этой задачей на других платформах, таких как R.
Сильная сторона Pandas, по-видимому, заключается в манипулировании данными, но он поставляется с очень удобными и простыми в использовании инструментами для анализа данных, предоставляя оболочки для стандартных статистических методов в статистических моделях и методов построения графиков в matplotlib.
Начало диабета
Нам нужен небольшой набор данных, который вы можете использовать для изучения различных рецептов анализа данных с помощью Pandas.
Репозиторий машинного обучения UIC предоставляет широкий спектр различных стандартных наборов данных машинного обучения, которые вы можете использовать для изучения и практики прикладного машинного обучения. Моим фаворитом является набор данных о диабете индейцев Пима.
Набор данных описывает возникновение или отсутствие возникновения диабета у женщин индейцев Пима с использованием данных из их медицинских записей. (обновление: скачать здесь). Загрузите набор данных и сохраните его в текущем рабочем каталоге под именем pima-indians-diabetes.data.
Обобщение данных
Мы начнем с понимания имеющихся у нас данных, рассмотрев их структуру.
Загрузить данные
Начните с загрузки данных CSV из файла в память в виде фрейма данных. Мы знаем имена предоставленных данных, поэтому мы установим эти имена при загрузке данных из файла.
import pandas as pd
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pd.read_csv('pima-indians-diabetes.data', names=names)
Узнайте больше о функциях ввода-вывода Pandas и функции read_csv.
Описать данные
Теперь мы можем посмотреть на форму данных.
Мы можем просмотреть первые 60 строк данных, распечатав фрейм данных напрямую.
print(data)
Мы видим, что все данные являются числовыми и что значение класса в конце является зависимой переменной, относительно которой мы хотим делать прогнозы.
В конце дампа данных мы видим описание самого фрейма данных в виде 768 строк и 9 столбцов. Итак, теперь у нас есть представление о форме наших данных.
Далее мы можем получить представление о распределении каждого атрибута, просматривая сводную статистику.
print(data.describe())
Отобразится таблица с подробной информацией о распределении для каждого из 9 атрибутов в нашем фрейме данных. В частности: количество, среднее значение, стандартное отклонение, минимум, максимум и 25-й, 50-й (медиана), 75-й процентили.
Мы можем просмотреть эту статистику и начать отмечать интересные факты о нашей проблеме. Например, среднее количество беременностей составляет 3,8, минимальный возраст — 21 год, а у некоторых людей индекс массы тела равен 0, что невозможно и является признаком того, что некоторые значения атрибутов следует пометить как отсутствующие.
Узнайте больше о функции описания в DataFrame.
Визуализация данных
График гораздо лучше рассказывает о распределении и взаимосвязях атрибутов.
Тем не менее, важно сначала не торопиться и просмотреть статистику. Каждый раз, когда вы просматриваете данные по-разному, вы открываете возможность заметить разные аспекты и потенциально получить другое понимание проблемы.
Pandas использует matplotlib для создания графиков и предоставляет для этого удобные функции. Вы можете узнать больше о визуализации данных в Pandas.
Распределение функций
Первое и простое свойство для рассмотрения — это распределение каждого атрибута.
Мы можем начать и проанализировать распространение каждого атрибута, просмотрев диаграммы «ящик и усы».
import matplotlib.pyplot as plt
data.boxplot()
Этот фрагмент меняет стиль рисования графиков (через matplotlib) на стиль по умолчанию, который выглядит лучше.
Мы видим, что атрибут test имеет много выбросов. Мы также можем видеть, что атрибут plas имеет относительно равномерное распределение. Мы также можем посмотреть на распределение каждого атрибута путем дискретизации значений по сегментам и просмотреть частоту в каждом сегменте в виде гистограмм.
data.hist()
Это позволяет вам отметить интересные свойства распределения атрибутов, такие как возможное нормальное распределение атрибутов, таких как pres и скин.
Вы можете просмотреть более подробную информацию о функции boxplot и hist в DataFrame.
Отношения классов объектов
Следующая важная связь, которую необходимо изучить, — это связь каждого атрибута с атрибутом класса.
Один из подходов — визуализировать распределение атрибутов экземпляров данных для каждого класса, примечаний и различий. Вы можете создать матрицу гистограмм для каждого атрибута и одну матрицу гистограмм для каждого значения класса следующим образом:
data.groupby('class').hist()
Данные группируются по атрибуту класса (две группы), затем создается матрица гистограмм для атрибутов, находящихся в каждой группе. В результате получается два изображения.
Это помогает указать на различия в распределениях между классами, например, для атрибута plas.
Вы можете лучше сопоставить значения атрибутов для каждого класса на одном графике.
data.groupby('class').plas.hist(alpha=0.4)
Это группирует данные по классам, отображая только гистограмму Plas, показывающую значение класса 0 красным цветом и значение класса 1 синим цветом. Вы можете увидеть нормальное распределение аналогичной формы, но со сдвигом. Этот атрибут, вероятно, будет полезен для различения классов.
Вы можете прочитать больше о функции groupby в DataFrame.
Отношения между функциями
Последняя важная взаимосвязь, которую следует изучить, — это взаимосвязь между атрибутами.
Мы можем просмотреть отношения между атрибутами, посмотрев на распределение взаимодействий каждой пары атрибутов.
from pandas.plotting import scatter_matrix
scatter_matrix(data, alpha=0.2, figsize=(6, 6), diagonal='kde')
При этом используется встроенная функция для создания матрицы диаграмм рассеяния всех атрибутов в сравнении со всеми атрибутами. Диагональ, на которой каждый атрибут будет построен против самого себя, вместо этого показывает оценку плотности ядра атрибута.
Это мощный сюжет, из которого можно почерпнуть много вдохновения в отношении данных. Например, мы можем видеть возможную корреляцию между возрастом и беременностью и другую возможную связь между кожей и массой.
Краткое содержание
В этом посте мы рассмотрели очень многое.
Мы начали с поиска быстрых и грязных однострочников для загрузки наших данных в формате CSV и их описания с использованием сводной статистики.
Далее мы рассмотрели различные подходы к построению графиков наших данных для выявления интересных структур. Мы рассмотрели распределение данных на диаграммах «ящик» и «усы» и гистограммах, затем мы посмотрели на распределение атрибутов по сравнению с атрибутом класса и, наконец, на отношения между атрибутами на парных диаграммах рассеяния.