Python

Автоматизируем проверку качества данных

Время прочтения: 5 мин.

«Все хотят работать с моделью, а не с информацией»

Дик Вейсингер – Президент фирмы по разработке ПО Formtek Пенсильвания

По статистике Alation SDCA 87% организаций не применяют AI из-за низкого качества данных, а исследование McKinsey показывают, что повышение качества данных помогут организациям, занимающимся BigData, достичь конкурентного преимущества.

Специалисты по обработке данных нередко оценивают моделирование как интересную работу, а чистку данных, как мучительную задачу. Трудности с данными, на решение которых не уделяется достаточно времени, приводят к негативным результатам при разработке AI. На сегодняшний день, все еще не хватает готовых инструментов, позволяющих проанализировать главные недостатки свойств данных и сделать их лучше. YData Quality, библиотека Python с открытым кодом для оценки свойств данных. Основные характеристики библиотеки:

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

Основные свойства модулей в YData Quality:

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

Практика по использованию библиотеки. Для установки YData Quality в командной строке вводим:

pip install ydata-quality

Библиотека установлена. Код для применения библиотеки будет таким:

from ydata_quality import DataQuality
import pandas as pd
#Для тестирования библиотеки используем открытый датасет, содержащий наборы данных о жилье в Калифорнии «California_housing_train» расположенный в открытом доступе на Google Colaboratory (https://colab.research.google.com/) 
#Загружаем данные
data = pd.read_csv('/content/sample_data/California_housing_train.csv')
# создаем объект DataQuality из основного класса, который содержит все модули качества
data_quality = DataQuality(df=data)
# Запускаем анализ качества данных и выводим результат
res = data_quality.evaluate()

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

Warnings:
    TOTAL: 2 warning(s)
    Priority 2: 2 warning(s)
Priority 2 - usage allowed, limited human intelligibility:
    * [DATA RELATIONS - CONFOUNDED CORRELATIONS] 
      Found 5 independently correlated variable pairs that disappeared after controling for the remaining variables. This is an indicator of potential confounder effects in the dataset.
    * [DATA RELATIONS - HIGH COLLINEARITY - NUMERICAL] Found 6 numerical variables with high Variance Inflation Factor (VIF>5.0). The variables listed in results are highly collinear with other variables in the dataset. These will make model explainability harder and potentially give way to issues like overfitting.Depending on your end goal you might want to remove the highest VIF variables

В итоге отображаются два предупреждения со вторым приоритетом.

Первое предупреждение: найдено 5 независимо коррелированных пар переменных. Вероятный признак некорректных данных.

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

Для получения отчета в разрезе колонок по найденным проблемам воспользуемся методом get_warnings(). Этот метод поможет определить столбцы с отклонениями.

dq.get_warnings(test=" CONFOUNDED CORRELATIONS")
dq.get_warnings(test 2=" HIGH COLLINEARITY - NUMERICAL")
[QualityWarning(category=' CONFOUNDED CORRELATIONS', test=' CONFOUNDED CORRELATIONS', category=' HIGH COLLINEARITY - NUMERICAL ', test2=' HIGH COLLINEARITY - NUMERICAL ', description='Found 5 columns with CONFOUNDED CORRELATIONS.', priority=<Priority.P2: 2>, data={'column_1': ['column_4'], description='Found 6 columns with HIGH COLLINEARITY - NUMERICAL.', priority=<Priority.P2: 2>, data={'column_2': ['column_5']})]

Отчет демонстрирует, что в датасете столбцы column_1 и column_4 имеют независимо коррелированные пары, столбцы column_2 и column_5 содержат высококореллированные переменный с высокой дисперсией.

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

# Устанавливаем библиотеку
import pandas as pd
from ydata_quality.duplicates import DuplicateChecker
# Загружаем данные
df = pd.read_csv('../datasets/transformed/guerry_histdata.csv')
# Фиксируем проверку на дубликаты 
dc = DuplicateChecker(df=df, entities=['Region', 'MainCity'])
# Выводим результаты:
results = dc.evaluate()
results.keys()

Скорость выполнения кода по таблице 87 строк на 26 столбцов составила 1 минуту 45 секунд. Получаем ответ:

Warnings:
	TOTAL: 3 warning(s)
	Priority 1: 1 warning(s)
	Priority 2: 2 warning(s)

Priority 1 - heavy impact expected:
	* [DUPLICATES - DUPLICATE COLUMNS] Found 1 columns with exactly   the same feature values as other columns.
Priority 2 - usage allowed, limited human intelligibility:
	* [DUPLICATES - ENTITY DUPLICATES] Found 20 duplicates after      grouping by entities.
	* [DUPLICATES - EXACT DUPLICATES] Found 20 instances with exact   duplicate feature values.

Наблюдаем три предупреждения:

  • первого приоритета: в выборке содержатся колонки с одинаковыми значениями;
  • второго приоритета: найдено 20 дубликатов после группировки по сущностям;
  • Без приоритета: найдено 20 значений с повторяющимися функциями.

Пример 3. Рассмотрение выборки всеми модулями библиотеки:

# Устанавливаем библиотеку
from ydata_quality import DataQuality
import pandas as pd
# Используем датасет переписи населения Канады 2010 года находящийся в открытом доступе .
df = pd.read_csv(f'../datasets/transformed/census_10k.csv')
# Используем класс, содержащий все модули библиотеки
dq = DataQuality(df=df)  
# выводим результаты

Скорость выполнения кода по таблице 90 строк на 15столбцов составила 2 минуту 30секунд. Результат выполнения кода:

results = dq.evaluate() 
 Warnings:
	TOTAL: 5 warning(s)
	Priority 1: 1 warning(s)
	Priority 2: 4 warning(s)
Priority 1 - heavy impact expected:
	* [DUPLICATES - DUPLICATE COLUMNS] Found 1 columns with exactly the same feature values as other columns.
Priority 2 - usage allowed, limited human intelligibility:
	* [DATA RELATIONS - HIGH COLLINEARITY - NUMERICAL] Found 3 numerical variables with high Variance Inflation Factor (VIF>5.0). The variables listed in results are highly collinear with other variables in the dataset. These will make model explainability harder and potentially give way to issues like overfitting. Depending on your end goal you might want to remove the highest VIF variables.
	* [ERRONEOUS DATA - PREDEFINED ERRONEOUS DATA] Found 60 ED values in the dataset.

Наблюдаем пять предупреждений:

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

Вывод: Использование библиотеки YData Quality позволяет повысить качество данных при решении AI задач.

Советуем почитать