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

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

  1. Обнаружение структуры: проверяет непротиворечивость данных и соответствие формату.
  2. Обнаружение контента: проверяет качество данных. Например, в наборе данных о доставке посылок, если адрес имеет неправильный формат, клиенты могут быть недоступны.
  3. Обнаружение отношений: проверяет связи между различными столбцами или атрибутами и/или наборами данных.

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

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

Открытия структуры и содержания в наборе данных об уровнях ожирения в Мексике, Перу и Колумбии

Во-первых, загрузите соответствующий набор данных по этой ссылке: https://archive.ics.uci.edu/ml/machine-learning-databases/00544/ObesityDataSet_raw_and_data_sinthetic%20(2).zip

Шаг 1. Загрузите набор данных в интегрированную среду разработки (IDE) Python, например Jupyter Notebook.

импортировать панд как pd
df = pd.read_csv("ObesityDataSet_raw_and_data_sinthetic.csv")

Шаг 2. Сверьте атрибуты в наборе данных с данными поставщика набора данных.

Покажите первые 50 строк набора данных, затем просмотрите и сравните типы данных значений каждого столбца (текстовые, числовые или категориальные) с информацией, предоставленной исходной статьей по этой ссылке: https://www.sciencedirect.com/science /статья/pii/S2352340919306985?через%3Dihub

дф.голова(50)

Результат проверки атрибутов

  • Пол (текст и категория): Мужской/Женский. Вывод: синхронизировано со статьей провайдера
  • Возраст (числовой): возраст. Вывод: синхронизировано со статьей провайдера
  • Высота (числовая): высота. Вывод: синхронизировано со статьей провайдера
  • Вес (числовой): вес. Вывод: синхронизировано со статьей провайдера
  • family_history_with_overweight (текст и категория): страдал или страдает ли член семьи от избыточного веса; да нет. Вывод: синхронизировано со статьей провайдера
  • FAVC (текст и категория): Высокое потребление калорий; да нет. Вывод: синхронизировано со статьей провайдера
  • FCVC (числовой и категориальный): ест ли человек овощи во время еды; Никогда (1), Иногда (2) и Всегда (3). Вывод: синхронизировано со статьей провайдера
  • NCP (неоднозначно, может быть числовым или категориальным): количество основных приемов пищи в день. В статье поставщика говорится, что есть три возможных ответа; между 1 и 2 приемами пищи (1), 3 приемами пищи (2) и более чем 3 приемами пищи (3), однако мы замечаем значения «4» в строках, поэтому этот столбец не синхронизирован с информацией, указанной в статье поставщика. . Этот столбец неоднозначен, потому что может подразумеваться, что значения представляют собой фактическое количество приемов пищи или что существует необъяснимая категория «4». Вывод: не синхронизирована с провайдером статья
  • CAEC (текст и категория): ест ли человек какую-либо пищу между приемами пищи; Нет/Иногда/Часто/Всегда. Вывод: синхронизировано со статьей провайдера
  • SMOKE (текст и категория): курит ли человек; да нет. Вывод: синхронизировано со статьей
  • CH2O (числовой и категориальный): количество воды, которое человек выпивает ежедневно; Менее литра (1), от 1 до 2 л (2) и более 2 л (3). Вывод: синхронизировано со статьей
  • SCC (текст и категория): контролирует ли человек свои ежедневные калории; да нет. Вывод: синхронизировано со статьей
  • FAF (числовой и категориальный): частота еженедельной физической активности; У меня нет (0), 1 или 2 дня (1), 2 или 4 дня (2) и 4 или 5 дней (3). Вывод: синхронизировано со статьей
  • TUE (числовой и категориальный): частота использования технологических устройств, таких как мобильный телефон, видеоигры, телевидение, компьютер и другие; 0–2 часа (0), 3–5 часов (1) и более 5 часов (2). Вывод: синхронизировано со статьей
  • CALC (текст и категория): Частота употребления алкоголя; Не пью/Иногда/Часто/Всегда. Вывод: синхронизировано со статьей
  • MTRANS (текст и категория): вид транспорта; Автомобиль/мотоцикл/велосипед/общественный транспорт/прогулки. Вывод: синхронизировано со статьей
  • NObeyesdad (текст и категория): статья поставщика не содержит описания, но, наблюдая за значениями в наборе данных, мы можем предположить, что этот столбец представляет уровень ожирения; Нормальный_Вес/Избыточный_Уровень_I/Избыточный_Уровень_II

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

Шаг 3. Выберите числовой атрибут (вес) для анализа и подсчета количества его наблюдений или строк (включая нулевые значения).

length = len(df["Вес"])
print(length)
2111

Шаг 4. Подсчитайте количество его наблюдений или строк (исключая пустые значения).

наблюдения = df["Вес"].count()
print(наблюдения)
2111

Вывод: набор данных небольшой, поскольку он охватывает три страны.

Шаг 5. Подсчитайте количество пропущенных значений.

numberOfMissingValues ​​= длина — наблюдения
print(numberOfMissingValues)
0

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

Шаг 6. Определите минимальное значение.

print("Минимальное значение: ", df["Вес"].min())
Минимальное значение: 39,0

Шаг 7. Определите максимальное значение.

print("Максимальное значение: ", df["Вес"].max())
Максимальное значение: 173,0

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

Шаг 8. Проверка предположения о сочетании данных.

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

print("Минимальный возраст: ", df["Возраст"].min())
Минимальный возраст: 14,0
print("Максимальное значение: ", df["Возраст"].max())
Максимальное значение: 61,0

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

Шаг 9. Определите наиболее часто встречающееся значение (режим).

print("Значение режима: ", df["Вес"].mode())
80.0

Вывод: 80 кг – распространенная масса тела среди подростков и взрослых, поэтому такое модовое значение является ожидаемым.

Шаг 10. Определите среднее значение (mean).

print("Среднее значение: ", df["Вес"].mean())
Среднее значение: 86,58605812648037

Вывод: средний вес 86,6 кг недалеко от модного значения (80 кг), следовательно, ожидаем.

Шаг 11. Определите медианное значение.

print("Среднее значение: ", df["Вес"].median())
Медианное значение: 83,0

Вывод: медианный вес 83 кг недалеко от модного значения (80 кг), поэтому тоже является ожидаемым значением.

Шаг 12. Определите значение стандартного отклонения.

print("Значение стандартного отклонения: ", df["Вес"].std())
Значение стандартного отклонения: 26,19117174520469

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

Шаг 13.Рассчитайте квантильную статистику.

quantile = df[«Вес»].quantile([.25, 0.5, .75])
print(quantile)
0,25 65,473343
0,50 83,000000
0,75 107,430682

Вывод: 25% наблюдаемых весов равны или меньше 65,5 кг, 50% наблюдаемых весов равны или меньше 83 кг (это подтверждает медианное значение), и 75% наблюдаемых весов равны или меньше 107,4 кг (это подтверждает значение режима).

Шаг 14. Визуализируйте распределение данных.

импортировать Seaborn как sns
sns.set(color_codes=True)
sns.set_palette(sns.color_palette("приглушенный"))
sns.distplot(df["Weight"].dropna( )) # исключая нулевые значения

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

Шаг 15.Рассчитайте корреляции между числовыми атрибутами.

df[[«Возраст», «Рост», «Вес», «FCVC», «NCP», «CH2O», «FAF», «ВТ»]].corr()

Из приведенных выше показателей корреляции Пирсона видно, что рост имеет самую высокую корреляцию с весом (0,46), FCVC (потребление овощей) имеет 2-ю самую высокую корреляцию с весом (0,216), а CH2O (потребление воды) имеет 3-ю самую высокую корреляцию с весом. вес (0,200).

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

Обнаружение связи в наборе данных об уровнях ожирения в Мексике, Перу и Колумбии

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

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

рост, вес, семейная_история_с_избыточным весом, FAVC, NCP, CAEC, SMOKE, SCC, FAF, CALC и MTRANS определяют NObeyesdad (основано на личном предположении, которое не было подтверждено врачом, диетологом или биологом)

Шаг 2. При необходимости нормализуйте набор данных.

  • Проверка первой нормальной формы (1NF):

Набор данных не содержит многозначный атрибут, поэтому он находится в 1NF.

  • Проверка второй нормальной формы (2NF):

Основываясь на выявленных зависимостях на шаге 1 ранее, предполагается, что NObeyesdad зависит от всех детерминант, то есть от частичной зависимости, поэтому набор данных находится во 2NF.

  • Проверка третьей нормальной формы (3NF):

Транзитивной зависимости не существует, особенно потому, что есть только один зависимый атрибут (или атрибут не-UID в терминах реляционной базы данных), поэтому набор данных находится в 3NF.

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

Резюме

  1. Результат обнаружения структуры и содержания предполагает, что размер набора данных недостаточно велик. Для набора данных, который, как утверждается, содержит наблюдения из трех стран (Мексика, Перу и Колумбия), 2111 образцов считаются недостаточными, особенно для набора медицинских данных — область, которая, как известно, меняет жизнь.
  2. Результат проверки атрибутов обнаруживает, что столбец NCP неточно объяснен поставщиком набора данных, и в то же время они также не объясняют столбец NObeyesdad в опубликованной статье.
  3. Также обнаружено, что набор данных смешивает данные подростков и взрослых, что может исказить аналитику, если не будут добавлены дополнительные отличительные признаки, например, скорость метаболизма.
  4. Показатели корреляции Пирсона могут свидетельствовать о том, что рост, потребление овощей и воды больше всего коррелируют с весом. Это звучит логично, хотя все соответствующие оценки ниже 0,5.
  5. Обнаружение связи проверяет, что набор данных уже находится в 1NF, 2NF и 3NF (полностью нормализован) с самого начала.

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

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

  • Идентификация уникального идентификатора (UID)/первичного ключа: проверьте атрибуты и их данные, если один или несколько из них являются идентификаторами или составным ключом (в случае нескольких UID).
  • Идентификация внешнего ключа: проверьте атрибуты и их данные на возможность того, что один или несколько из них получены или импортированы из другого набора данных.
  • Идентификация шаблона строки: проверьте атрибуты и их данные на наличие повторяющегося шаблона строки.
  • Другие дополнительные действия по профилированию данных можно найти в этой справочной статье: https://hpi.de/fileadmin/user_upload/fachgebiete/naumann/publications/2017/SIGMOD_2017_Tutorial_Data_Profiling.pdf