Профессия Data Science, хотя ее часто неправильно понимают (даже в самой области - возможно, тема для другого поста), Harvard Business Review в издании Harvard Business Review назвал ее самой сексуальной работой 21 века ». Октябрь 2012 года. С того времени компании, образовательные учреждения и потенциальные таланты все перепрыгивают через себя, чтобы заработать на соуснике. Я имею в виду, что с такими терминами, как искусственный интеллект (AI), машинное обучение (ML), прогнозное моделирование, нейронные сети, кого бы не волновало, правда ?!

Чего глянцевые брошюры не расскажут о науке о данных, так это о том, что легендарный специалист по данным будет час за часом выполнять очень несексуальную задачу… подождать… очистки данных. Очистка данных - это не буквальная очистка и уборка, а рутинный процесс очистки данных, которые были определены как неправильные («грязные») или отсутствующие.

Вместо того, чтобы сетовать на очистку данных и пытаться убедить вас на словах, мы будем работать с примером из Big Data Bowl НФЛ, который в настоящее время запускается на Kaggle. Соревнование ставит перед конкурентами задачу построить модель, которая может наилучшим образом предсказать Сколько ярдов наберет игрок НФЛ после получения передачи?

[Статья по теме: Святой Грааль исследователя данных - помеченные наборы данных]

Данные

Данные, которые мы будем использовать для очистки данных, были предоставлены Next Gen Stats и содержат данные отслеживания текущих воспроизведений. Каждая строка в наборе данных соответствует участию одного игрока в игре, поэтому в одной игре будет 22 записи (11 игроков на команду). Имеется 509 762 строк и 49 переменных (столбцов), от положения каждого игрока, скорости, ускорения, роста и веса до сведений о стадионе, данных о погоде, схемах и играх.

Рабочий процесс Data Science

Итак, как только специалист по анализу данных соберет данные (этот пример не совсем такой репрезентативный, как нам были переданы данные), первым шагом будет выполнение так называемого EDA - исследовательского анализа данных - для выявления определенных закономерностей / взаимосвязей / причуды в данных. Для выполнения исследования и очистки будут широко использоваться пакеты из экосистемы tidyverse. Будут использоваться такие пакеты, как следующие:

  • dplyr; борьба с данными
  • stringr; обработка строк (текста)
  • ggplot2, scales; визуализация данных
  • lubridate; работа с переменными на основе даты

Категориальные переменные

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

Чтобы выбрать только категориальные переменные, функция select_if() упрощает задачу. Чтобы проверить, что у нас есть, glimpse() предоставляет, возможно, более привлекательный результат str().

# to select just the categorical variables:
train_cat <- train %>% 
  select_if(is.character)
# quickly inspect the data
glimpse(train_cat)

Этот пост ограничится этими тремя переменными.

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

Рост игрока

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

Существует 16 уровней высоты, и они также не отсортированы по категориям, т. е. «5–10» перед «5–6»…

В результате мы можем преобразовать высоту, отображаемую в настоящее время как футы-дюймы, в дюймы, а затем построить непрерывную переменную в виде гистограммы:

# Function to convert to inches
convert_to_inches <- function(x) {
  (as.numeric(str_extract(x, "[^-]+")) * 12) + as.numeric(str_extract(x, "[^-]*$"))
}
# apply the function using mapply()
train_cat <- train_cat %>% 
  mutate(PlayerHeight = mapply(convert_to_inches, PlayerHeight))

Стадион

При вводе следующего кода length(unique(train_cat$Stadium)) выясняется, что существует 55 различных стадионов ... это довольно высокий показатель, учитывая, что в НФЛ всего 32 команды. Позвольте сюжету узнать, на каких стадионах проходили игры:

Хорошо, я вижу, что здесь произошло. При сборе данных некоторые названия стадионов должны были быть изменены / собраны из разных источников. Например, у FirstEnergy Stadium три разных названия; «FirstEnergyStadium», «FirstEnergy Stadium» и «FirstEnergy». Приведенная ниже функция очистит их, так что на стадион будет только один законный вход.

# function to clean stadiums
clean_stadiums <- function(stadium) {
  if(stadium == "Broncos Stadium At Mile High") {
    "Broncos Stadium at Mile High"
  } else if(stadium == "CenturyField" | stadium == "CenturyLink") {
    "CenturyLink Field"
  } else if(stadium == "EverBank Field") {
    "Everbank Field"
  } else if(stadium == "First Energy Stadium" | stadium == "FirstEnergy" | stadium == "FirstEnergyStadium") {
    "FirstEnergy Stadium"
  } else if(stadium == "Lambeau field") {
    "Lambeau Field"
  } else if(stadium == "Los Angeles Memorial Coliesum") {
    "Los Angeles Memorial Coliseum"
  } else if(stadium == "M & T Bank Stadium" | stadium == "M&T Stadium") {
    "M&T Bank Stadium"
  } else if(stadium == "Mercedes-Benz Dome") {
    "Mercedes-Benz Superdome"
  } else if(stadium == "MetLife" | stadium == "Metlife Stadium"){
    "MetLife Stadium"
  } else if(stadium == "NRG") {
    "NRG Stadium"
  } else if(stadium == "Oakland Alameda-County Coliseum") {
    "Oakland-Alameda County Coliseum"
  } else if(stadium == "Paul Brown Stdium") {
    "Paul Brown Stadium"
  } else if(stadium == "Twickenham") {
    "Twickenham Stadium"
  } else {
    stadium
  }
}
# apply function
train <- train %>% 
  mutate(Stadium = mapply(clean_stadiums, Stadium))

В результате изменения у нас осталось 37 уникальных стадионов - намного лучше.

Скорость ветра

Как ни странно, WindSpeed отображается как категориальная переменная ... давайте разберемся, почему это так.

Последние три записи должны быть для WindDirection…

Ага! У нас есть записи, в которых явно указано «MPH» и даже «порывы до». Кроме того, похоже, что некоторые WindDirection значения попали в переменную WindSpeed («E», «SE», «SSW»). Учитывая, что, похоже, наиболее часто используемые значения - это целые числа (числа), мы продолжим и очистим переменную, чтобы получить только целые числа.

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

Затем значение «Штиль» было заменено на 0 - можно было предположить, что при штилевом ветре скорость будет близка к нулю.

train_cat <- train_cat %>% 
  mutate(WindSpeedClean = ifelse(str_detect(WindSpeed, "E"), WindDirection, ifelse(str_detect(WindSpeed, "SE"), WindDirection, ifelse(str_detect(WindSpeed, "SSW"), WindDirection, WindSpeed)))) %>% 
  mutate(WindSpeedClean = str_replace(WindSpeedClean, "Calm", "0"),
         WindSpeedClean = tolower(WindSpeedClean))

Затем мы удаляем все варианты «миль в час», включая «MPh» и «MPH», а также любые дополнительные пробелы (ведущие или конечные пробелы).

Наконец, там, где был диапазон, нижний предел был сохранен. Например, для значений скорости ветра 10–20 в качестве значения было оставлено 10, как и «15» в «15 порывах до 25».

# remove "mph" and additional whitespace
train_cat$WindSpeedClean <- gsub("mph", "", train_cat$WindSpeedClean) %>% str_squish()
# take first number before the "-"
train_cat$WindSpeedClean <- str_extract(train_cat$WindSpeedClean, "[^-]+")
# take the first number before the first space
train_cat$WindSpeedClean <- str_extract(train_cat$WindSpeedClean, "[^ ]+")

Затем мы наносим данные на график, чтобы убедиться, что мы удалили ошибочные записи:

Последние три записи должны быть для WindDirection…

Вывод

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

Оригинальный пост здесь.

Прочтите больше статей по науке о данных на OpenDataScience.com, включая учебные пособия и руководства от новичка до продвинутого уровня! Подпишитесь на нашу еженедельную рассылку здесь и получайте последние новости каждый четверг.