Изучение того, как использовать экосистему Python для аудита качества данных.

Нельзя управлять тем, что нельзя измерить — Питер Друкер

Введение

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

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

Содержание:

  1. Понимание качества данных и его аспектов
  2. Проверка данных с использованием Pydantic и pandas_dq
  3. Сравнение Pydantic и pandas_dq
  4. Исследование точности и согласованности
  5. Аудит качества данных с помощью pandas_dq
  6. Заключение

Аудит качества данных

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

Полнота

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

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

Профилирование данных – это систематическое изучение и оценка наборов данных для выявления закономерностей, несоответствий и аномалий.

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

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

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

import missingno as msno
import sweetviz as sv
from pandas_dq import dq_report

# completeness check
msno.matrix(df)

# data profiling
Report = sv.analyze(df)

Report.show_notebook()

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

# check for missing values
import seaborn as sns
import matplotlib.pyplot as plt

def plot_missing_values(df: pd.DataFrame, 
                        title="Missing Values Plot"):
    plt.figure(figsize=(10, 6))

    sns.displot(
        data=df.isna().melt(value_name="missing"),
        y="variable",
        hue="missing",
        multiple="fill",
        aspect=1.25
    )
    plt.title(title)
    plt.show()

plot_missing_values(df)

Уникальность

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

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

# verify integrity check
df_loans = pd.concat([df, df_pdf], verify_integrity=True)

# check duplicated ids
df_loans[df_loans.duplicated(keep=False)].sort_index()

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

def check_duplicates(df, col):
    '''
    Check how many duplicates are in col.
    '''
    # first step set index
    df_check = df.set_index(col)
    count = df_check.index.duplicated().sum()
    del df_check
    print("There are {} duplicates in {}".format(count, col))

Своевременность

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

Период действия

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

# data validation on the data dictionary
from pydantic import BaseModel, Field, conint, condecimal, constr

class LoanApplication(BaseModel):
    Loan_ID: int
    Gender: conint(ge=1, le=2)
    Married: conint(ge=0, le=1)
    Dependents: conint(ge=0, le=3)
    Graduate: conint(ge=0, le=1)
    Self_Employed: conint(ge=0, le=1)
    ApplicantIncome: condecimal(ge=0)
    CoapplicantIncome: condecimal(ge=0)
    LoanAmount: condecimal(ge=0)
    Loan_Amount_Term: condecimal(ge=0)
    Credit_History: conint(ge=0, le=1)
    Property_Area: conint(ge=1, le=3)
    Loan_Status: constr(regex="^[YN]$")

# Sample loan application data
loan_application_data = {
    "Loan_ID": 123456,
    "Gender": 1,
    "Married": 1,
    "Dependents": 2,
    "Graduate": 1,
    "Self_Employed": 0,
    "ApplicantIncome": 5000,
    "CoapplicantIncome": 2000,
    "LoanAmount": 100000,
    "Loan_Amount_Term": 360,
    "Credit_History": 1,
    "Property_Area": 2,
    "Loan_Status": "Y"
}

# Validate the data using the LoanApplication Pydantic model
loan_application = LoanApplication(**loan_application_data)

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

# data validation on the data dictionary
from pydantic import ValidationError
from typing import List

# Function to validate DataFrame and return a list of failed LoanApplication objects
def validate_loan_applications(df: pd.DataFrame) -> List[LoanApplication]:
    failed_applications = []

    for index, row in df.iterrows():
        row_dict = row.to_dict()
        
        try:
            loan_application = LoanApplication(**row_dict)
        except ValidationError as e:
            print(f"Validation failed for row {index}: {e}")
            failed_applications.append(row_dict)

    return failed_applications

# Validate the entire DataFrame
failed_applications = validate_loan_applications(df_loans.reset_index())

# Print the failed loan applications or "No data quality issues" 
if not failed_applications:
    print("No data validation issues")
else:
    for application in failed_applications:
        print(f"Failed application: {application}")

Мы можем сделать то же самое с pandas_dq, используя гораздо меньше кода:

from pandas_dq import DataSchemaChecker

schema = {
    'Loan_ID': 'int64',
    'Gender': 'int64',
    'Married': 'int64',
    'Dependents': 'int64',
    'Graduate': 'int64',
    'Self_Employed': 'int64',
    'ApplicantIncome': 'float64',
    'CoapplicantIncome': 'float64',
    'LoanAmount': 'float64',
    'Loan_Amount_Term': 'float64',
    'Credit_History': 'int64',
    'Property_Area': 'int64',
    'Loan_Status': 'object'
}

checker = DataSchemaChecker(schema)

checker.fit(df_loans.reset_index())

Это возвращает простой для чтения отчет в стиле фрейма данных Pandas, в котором подробно описаны любые проблемы проверки. Я предоставил неверную схему, в которой int64 переменных указаны как float64 переменных. Библиотека правильно определила это:

Несоответствие типов данных устраняется одной строкой кода с использованием объекта проверки, созданного из класса DataSchemaChecker:

# fix issues
df_fixed = checker.transform(df_loans.reset_index())

Пидантик или pandas_dq?

Есть некоторые различия между Pydantic и pandas_dq:

  1. Декларативный синтаксис: возможно, Pydantic позволяет вам определять схему данных и правила проверки, используя более краткий и удобочитаемый синтаксис. Это может облегчить понимание и поддержку вашего кода. Я считаю очень полезным иметь возможность определять диапазоны возможных значений, а не просто тип данных.
  2. Встроенные функции проверки: Pydantic предоставляет различные мощные встроенные функции проверки, такие как conint, condecimal и constr, которые позволяют применять ограничения к вашим данным без необходимости писать собственные функции проверки.
  3. Комплексная обработка ошибок: при использовании Pydantic, если входные данные не соответствуют определенной схеме, создается ValidationError с подробной информацией об ошибках. Это может помочь вам легко определить проблемы с вашими данными и принять необходимые меры.
  4. Сериализация и десериализация. Pydantic автоматически выполняет сериализацию и десериализацию данных, что упрощает работу с различными форматами данных (например, JSON) и преобразование между ними.

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

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

Точность и согласованность

Есть еще 2 измерения качества данных, которые мы до сих пор не исследовали:

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

Вы можете проверить все проблемы с качеством данных, присутствующие в наборе данных, с помощью функции dq_report:

from pandas_dq import dq_report

dq_report(df_loans.reset_index(), target=None, verbose=1)

Он обнаруживает следующие проблемы с качеством данных:

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

Заключение

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

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

Ссылка на полный код: https://github.com/mohwarsame273/Medium-Articles/blob/main/DataQualityAudit.ipynb

Рекомендации

[1] Pydantic (2023): Документация https://docs.pydantic.dev/ (по состоянию на 24 апреля 2023 г.)

[2] Pandas_dq (2023): Документация https://github.com/AutoViML/pandas_dq (по состоянию на 24 апреля 2023 г.)

[3] Параметры качества данных (EDM Совета по управлению корпоративными данными): https://cdn.ymaws.com/edmcouncil.org/resource/resmgr/featured_documents/BP_DQ_Dimensions_Oct17.pdf (по состоянию на 24 апреля 2023 г.)

[4] Батини, К., Каппиелло, К., Франкаланчи, К., и Маурино, А. (2009). Методологии оценки и улучшения качества данных. Вычислительные опросы ACM (CSUR), 41(3), стр. 1–52.

[5] Гюнтер, Л. К., Коланджело, Э., Виндал, Х. Х. и Бауэр, К., (2019). Оценка качества данных для улучшения принятия решений: методология для малых и средних предприятий. Procedia Manufacturing, 29, стр. 583–591.