Статья Автор: Деникина Н.В., Деникин А.В.

Когда таблица начинает врать

Когда таблица начинает врать

Есть неприятный вид ошибок, который программа почти никогда не замечает сама. Файл открывается, столбцы на месте, df.head() выглядит аккуратно — и всё же выводы из таблицы могут оказаться неверными.

Так происходит потому, что для компьютера значение прежде всего имеет форму: число, строка, дата. А для нас у него есть ещё и смысл. Число 130 вполне допустимо как обычное число, но уже невозможно, если столбец power по условию хранит значения только от 1 до 100. Строки "Earth" и " Earth " различаются для pandas, хотя человек почти наверняка считает их одной категорией.

В этом модуле мы будем работать с уже знакомым набором marvel_characters5.csv: 302 профиля персонажей и 10 признаков — от возраста и силы до стоимости костюма. Исходная версия сама по себе аккуратна: в ней нет пропусков и полных дублей. Это удобно. На её примере можно увидеть главное: предобработка начинается не с команды fillna() и не с удаления строк, а с вопроса «что в этой таблице считается правильным?»
 

Данные портятся не только из-за ошибок

Реальные данные редко рождаются сразу в одной идеальной таблице. Часть приходит из формы, часть — из Excel, часть — через API, что-то вводится вручную, а потом несколько источников объединяются. В одном месте появляется лишний пробел, в другом число записывается текстом, в третьем пропадает значение. Иногда два источника используют разные единицы измерения и при этом оба присылают обычные числа.

Поэтому предобработка — это не косметический ремонт. Её задача гораздо строже: сделать данные сопоставимыми и объяснимыми, не подменяя неизвестные факты удобными догадками.

Обнаружить что не так? Объяснить почему возникло? Выбрать что делать? Исправить изменить данные Проверить стало ли лучше? Предобработка — цепочка решений, а не одна команда pandas

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


Представьте, что вы нашли подозрительное значение. В каком порядке лучше действовать, чтобы не испортить данные?


Странное значение ещё не ошибка

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

Другое дело — заранее известное правило. Если признак power определён на шкале от 1 до 100, значение 130 действительно нарушает смысл столбца. Получается важное различие: редкое — это статистическое свойство, а ошибочное — нарушение известного правила или контекста.

Исходник нужен как точка отсчёта

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

df_original = pd.read_csv("marvel_characters5.csv")
df = df_original.copy()

print(df_original.shape)
print(df_original.dtypes)
print(df_original.isna().sum())
print(df_original.duplicated().sum())

Дальше мы будем менять копию и всё время сравнивать её с df_original. Такой простой приём превращает очистку из серии необратимых правок в проверяемое исследование.

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

Перейти к лаборатории «Спасти базу супергероев» →

Печать