7 важных проверок качества данных с помощью Pandas

7 ключевых проверок качества данных с помощью Pandas

 

Как профессионал в области данных, вы, вероятно, знакомы с тем, какой ценой приходится платить за плохое качество данных. Во всех проектах по данным — больших или маленьких — необходимо проводить основные проверки качества данных.

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

Мы будем использовать набор данных о жилье в Калифорнии из scikit-learn для этого учебника.

 

Обзор набора данных о жилье в Калифорнии

 

Мы будем использовать набор данных о жилье в Калифорнии из модуля наборов данных Scikit-learn datasets. Набор данных содержит более 20 000 записей с восьмью числовыми параметрами и целевым значением медианной стоимости дома.

Давайте считаем набор данных в кадр данных pandas df:

from sklearn.datasets import fetch_california_housing
import pandas as pd
# Получаем набор данных о жилье в Калифорнии
data = fetch_california_housing()
# Преобразуем набор данных в кадр данных Pandas
df = pd.DataFrame(data.data, columns=data.feature_names)
# Добавляем столбец целевых значений
df['MedHouseVal'] = data.target

 

Для получения подробного описания набора данных запустите data.DESCR как показано ниже:

print(data.DESCR)

 

 

Давайте получим некоторую базовую информацию о наборе данных:

df.info()

 

Вот результат:

Output >>>RangeIndex: 20640 entries, 0 to 20639
Data columns (total 9 columns):
 #   Column     Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   MedInc      20640 non-null  float64
 1   HouseAge    20640 non-null  float64
 2   AveRooms    20640 non-null  float64
 3   AveBedrms   20640 non-null  float64
 4   Population   20640 non-null  float64
 5   AveOccup   20640 non-null  float64
 6   Latitude    20640 non-null  float64
 7   Longitude   20640 non-null  float64
 8   MedHouseVal  20640 non-null  float64
dtypes: float64(9)
memory usage: 1.4 MB

 

Поскольку у нас есть числовые параметры, давайте также получим сводку статистических показателей с помощью метода describe():

df.describe()

 

 

1. Проверка на отсутствующие значения

 

Реальные наборы данных часто содержат отсутствующие значения. Чтобы анализировать данные и строить модели, вам необходимо обрабатывать эти отсутствующие значения.

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

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

Этот код проверяет наличие отсутствующих значений в каждом столбце кадра данных df:

# Проверяем наличие отсутствующих значений в кадре данных
missing_values = df.isnull().sum()
print("Отсутствующие значения:")
print(missing_values)

 

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

Output >>>Missing Values:MedInc         0HouseAge       0AveRooms       0AveBedrms      0Population     0AveOccup       0Latitude       0Longitude      0MedHouseVal    0dtype: int64

 

Как видно, в этом наборе данных нет пропущенных значений.

 

2. Определение дублирующихся записей

 

Дублирующиеся записи в наборе данных могут искажать анализ. Поэтому вам следует проверить и удалить дублирующиеся записи по мере необходимости.

Вот код для определения и вывода дублирующихся строк в df. Если есть дублирующиеся строки, они будут включены в результат:

# Проверить наличие дублирующихся строк в DataFrameduplicate_rows = df[df.duplicated()]print("Дублирующиеся строки:")print(duplicate_rows)

 

Результатом является пустой DataFrame. Это означает, что в наборе данных нет дублирующихся записей:

Output >>>Дублирующиеся строки:Пустой DataFrameСтолбцы: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Индексы: []

 

3. Проверка типов данных

 

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

Этот код проверяет типы данных каждого столбца в DataFrame df:

# Проверить типы данных каждого столбца в DataFramedata_types = df.dtypesprint("Типы данных:")print(data_types)

 

Здесь все числовые функции имеют тип данных float, как и ожидалось:

Output >>>Типы данных:MedInc        float64HouseAge     float64AveRooms     float64AveBedrms    float64Population   float64AveOccup     float64Latitude     float64Longitude    float64MedHouseVal  float64dtype: object

 

4. Проверка выбросов

 

Выбросы – это точки данных, значительно отличающиеся от других точек в наборе данных. Если вы помните, мы запустили метод describe() для DataFrame.

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

  • MedInc
  • AveRooms
  • AveBedrms
  • Population

Один из подходов к обработке выбросов – использовать межквартильный размах, разницу между 75-м и 25-м квартилями. Если Q1 – это 25-й квартиль, а Q3 – это 75-й квартиль, то интерквартильный размах определяется по формуле: Q3 – Q1. 

Затем мы используем квартили и интерквартильный размах для определения интервала [Q1 - 1.5 * IQR, Q3 + 1.5 * IQR]. Все точки вне этого диапазона являются выбросами.

columns_to_check = ['MedInc', 'AveRooms', 'AveBedrms', 'Population']# Функция для поиска записей с выбросамиdef find_outliers_pandas(data, column):   Q1 = data[column].quantile(0.25)    Q3 = data[column].quantile(0.75)    IQR = Q3 - Q1   lower_bound = Q1 - 1.5 * IQR    upper_bound = Q3 + 1.5 * IQR    outliers = data[(data[column] < lower_bound) | (data[column] > upper_bound)]  return outliers# Найти записи с выбросами для каждого указанного столбцаoutliers_dict = {}for column in columns_to-check:  outliers_dict[column] = find_outliers_pandas(df, column)# Вывести записи с выбросами для каждого столбцаfor column, outliers in outliers_dict.items(): print(f"Выбросы в '{column}':")   print(outliers) print("\n")

5. Проверка числового диапазона

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

Этот код проверяет, что значение ‘MedInc’ находится в предполагаемом диапазоне и определяет точки данных, которые не соответствуют критериям:

# Проверка числового диапазона значений для столбца 'MedInc'valid_range = (0, 16)  value_range_check = df[~df['MedInc'].between(*valid_range)]print("Проверка числового диапазона значений (MedInc):")print(value_range_check)

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

Output >>>Проверка числового диапазона значений (MedInc):Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []

6. Проверка зависимости между столбцами

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

Хотя функции – индивидуально – могут принимать значения в ожидаемом диапазоне, отношение между ними может быть несогласованным.

Вот пример для нашего набора данных. В допустимой записи ‘AveRooms’ обычно должно быть больше или равно ‘AveBedRms’.

# Значение AveRooms не должно быть меньше AveBedroomsinvalid_data = df[df['AveRooms'] < df['AveBedrms']]print("Недопустимые записи (AveRooms < AveBedrms):")print(invalid_data)

В наборе данных о жилье в Калифорнии, с которым мы работаем, мы видим, что нет недопустимых записей:

Output >>>Недопустимые записи (AveRooms < AveBedrms):Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []

7. Проверка на несогласованность данных

Несогласованность ввода данных – это распространенная проблема качества данных в большинстве наборов данных. Примеры включают:

  • Несогласованное форматирование в столбцах с датами
  • Неоднородное фиксирование значений категориальных переменных
  • Фиксация показаний в разных единицах измерения

В нашем наборе данных мы проверили типы данных столбцов и идентифицировали выбросы. Но также можно провести проверки на несогласованный ввод данных.

Давайте составим простой пример для проверки, соответствуют ли все записи дате формату YYYY-MM-DD.

Здесь мы используем регулярные выражения в сочетании с функцией apply() из библиотеки pandas, чтобы проверить, соответствует ли каждая запись даты ожидаемому формату YYYY-MM-DD:

import pandas as pdimport redata = {'Date': ['2023-10-29', '2023-11-15', '23-10-2023', '2023/10/29', '2023-10-30']}df = pd.DataFrame(data)# Определение ожидаемого формата датыdate_format_pattern = r'^\d{4}-\d{2}-\d{2}$'  # Формат YYYY-MM-DD# Функция для проверки, соответствует ли значение даты ожидаемому форматуdef check_date_format(date_str, date_format_pattern):   return re.match(date_format_pattern, date_str) is not None# Применение проверки формата к столбцу 'Date'date_format_check = df['Date'].apply(lambda x: check_date_format(x, date_format_pattern))# Определение и получение записей, не соответствующих ожидаемому форматуnon_adherent_dates = df[~date_format_check]if not non_adherent_dates.empty:   print("Записи, не соответствующие ожидаемому формату:")    print(non_adherent_dates)else:  print("Все даты соответствуют ожидаемому формату.")

Это возвращает записи, не соответствующие ожидаемому формату:

Output >>>Ошибки ввода, не соответствующие ожидаемому формату:        Date2  23-10-20233  2023/10/29

 

Заключение

 

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

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

Если вы интересуетесь изучением анализа данных, ознакомьтесь с руководством 7 шагов для овладения анализом данных с помощью библиотеки Pandas и Python.  

[Bala Priya C](https://twitter.com/balawc27) – разработчик и технический писатель из Индии. Ей нравится работать на пересечении математики, программирования, науки о данных и создания контента. Ее интересы и экспертиза включают DevOps, науку о данных и обработку естественного языка. Она любит чтение, письмо, кодирование и кофе! В настоящее время она работает над изучением и обменом своими знаниями с разработческим сообществом, создавая учебники, руководства, мнения и многое другое.