DevGang
Авторизоваться

Практический аудит качества данных: Всеобъемлющее руководство

Изучение того, как использовать экосистему 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)
График отсутствующих значений. Изображение источника.
График отсутствующих значений. Изображение источника.

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

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

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

# 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. Изображение источника.
Вывод DataSchemaChecker. Изображение источника.

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

# fix issues
df_fixed = checker.transform(df_loans.reset_index())
Выходные данные преобразования DataSchemaChecker. Изображение источника.
Выходные данные преобразования DataSchemaChecker. Изображение источника.

Pydantic или 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 аспекта качества данных, которые мы до сих пор не изучали:

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

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

from pandas_dq import dq_report

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

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

  1. Сильно связанные переменные (мультиколлинеарность)
  2. Столбцы без отклонений (избыточные функции)
  3. Асимметричное распределение данных (аномалии, выбросы и т.д.)
  4. Нечастые случаи в категории
Отчет DQ из библиотеки pandas dq. Изображение источника.
Отчет DQ из библиотеки pandas dq. Изображение источника.

Вывод

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

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

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

Источник:

#Python #Data Science
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу