[МУЗЫКА] [МУЗЫКА] В этом модуле мы разберем особенности хранения и кодирования данных в R. Статистика имеет дело с данными, и данные бывают разных типов. Тип данных определяется объектом, который вы исследуете, и методами, которыми вы пользуетесь для этого. Например, перед вами чашки с чаем. И чай этот может быть зеленый или черный, он может быть разной степени крепкости или разной температуры. На самом деле это все данные разных типов. Нам нужно научиться кодировать их в R. Интервальные данные бывают двух типов — они бывают непрерывные и дискретные. Что значит непрерывные? Это значит, что они могут принимать неограниченное множество значений из какого-то диапазона. Например, если мы померим температуру чая в этих чашках, то это вполне себе непрерывная величина, потому что может быть как 53 градуса, так и 79,5. Как нам это закодировать? Очень просто. Мы можем воспользоваться числовым вектором, вы с ними познакомились еще в прошлом модуле. Все, что нам нужно, это просто перечислить возможные значения. Вектор temperature теперь описывает температуру чая в этих чашках. Но интервальные данные бывают и другого типа, они бывают дискретными. Например, если вы захотите посчитать количество кусков сахара, которые положили в чай, то это дискретная величина: на самом деле бывает ноль кусков сахара, один, два, три, четыре, пять — в любом случае, когда мы что-то считаем, у нас получаются дискретные данные. Как это закодировать? Точно так же: для этого нам всего лишь нужен числовой вектор. Мы можем создать переменную sugar, в которую запишем число кусков сахара в каждой из чашек. Категориальные данные — это такие данные, у которых всего два возможных варианта значений или несколько возможных вариантов. В данном случае мы сначала разберемся с данными с двумя категориях. Например, мы можем попробовать закодировать, есть ли в этой чашке сахар. Или какого цвета чай в этой чашке: если он черный, мы запишем единицу, например, если он зеленый, мы запишем ноль. Или по-другому: мы можем написать TRUE, если это черный чай в чашке, потому что это отвечает на вопрос черный ли чай. То есть на самом деле нам нужен просто какой-то дискретный набор значений, и мы точно так же можем создать из них векторы. Собственно, самый простой способ кодирования таких дискретных данных — это числовой вектор, где мы значением ноль обозначаем какое-то одно состояние, единица — альтернативное. Можем написать black_numeric, и это будет числовой вектор, который кодирует, черный ли в чашке чай. На самом деле необязательно кодировать разные альтернативные состояния цифрами, очень легко запутаться, можно использовать слова. С этим типом данных вы, по-моему, сталкивались только мельком. Это текстовые данные. Как R понимает, что это текст, а не что-нибудь иное, не названия переменных? Вы видите: слова окружены символами кавычек. На самом деле в R можно использовать разные кавычки — привычные вам двойные, или одинарные. Это в большинстве случаев совершенно все равно. На наших слайдах вы увидите одинарные кавычки, потому что тогда вы сможете копировать код со слайдов и выполнять его в R без всякого редактирования. Собственно, мы можем просто прямо записать, какого цвета в чашках чай: зеленый, черный, черный, черный. Это будет текстовый вектор. И наконец, зачем нам использовать слова, мы можем записать при помощи логических значений TRUE или FALSE, какого цвета чай. Это идентификаторы, которые в R зарезервированы за логическим типом данных. Обратите внимание, TRUE и FALSE пишется большими буквами. Если вы напишете это маленькими буквами или с большой буквы, а все остальные маленькими, R не поймет. Все буквы должны быть большими. Собственно, мы создаем логический вектор. Там, где у нас чай не черный, будет написано FALSE, а там, где чай черный, везде будет написано TRUE. И то же самое, те же самые данные можем таким же образом закодировать. Еще один тип данных — это категориальные данные с большим количеством категорий. Ведь на самом деле бывают такие свойства, где двумя категориями не обойдешься. Например, если мы захотим записать тип напитков в чашке, там может быть чай, вода, кофе или вообще что-нибудь другое, двух категорий нам уже будет недостаточно. Соответственно для кодирования такого типа данных нам проще всего использовать какой-то текстовый вектор. Мы можем просто перечислить какой-то диапазон значений и таким образом данные опишем. Мы могли бы использовать здесь числа, конечно, и закодировать, например, чай единицей, воду — двойкой, кофе — тройкой, и записать в виде числового вектора. Но это не очень удобно, потому что R не будет знать, что это какая-то дискретная переменная, а будет думать, что это переменная числовая. Нам придется с ней делать какие-то дополнительные манипуляции. Сейчас мы увидим какие. На самом деле в чисто текстовом виде такие категориальные данные с множеством категорий хранят очень редко. Обычно их преобразовывают в другой тип — в так называемые факторы. Что такое факторы? Факторы создаются из любого набора значений при помощи таблицы перекодировки. У нас есть возможные варианты: в чашке может быть вода, кофе или чай. И мы каждый раз, когда встречаем воду, заменяем ее на единицу. Каждый раз, когда встречаем кофе, заменяем это на 2. И каждый раз, когда встречаем чай, заменяем это на 3. Это происходит внутри вектора. Снаружи пользователь будет видеть по-прежнему этикетки, которые называются уровни фактора. Как мы это сделаем? У нас уже создана переменная drink, в которой записан тип напитка в чашке. Давайте попробуем ее превратить в фактор. Превращение будет делать функция, которая так и называется — factor, мы ей передаем наш вектор текстовый и складываем то, что получилось, в переменную, которую назовем drink_fact, чтобы изучить, как она устроена внутри. Собственно, куда складывать — это ваше дело. В данный момент нам удобно создать новую переменную. Если мы распечатаем получившийся фактор в консоли, нам покажут этикетки и покажут таблицу перекодировок. Видите, что текстовые названия этикеток показаны без кавычек. Это сделано для того, чтобы у нас не создалось впечатление, что это просто текст. Это фактор, это только условное обозначение. В том, что внутри фактора хранятся числа, легко убедиться, в R есть группа функций, названия которых начинаются на as — они умеют превращать один тип данных в другой, если это каким-то образом можно описать при помощи формальных правил. Так вот, для факторов есть такое формальное правило: фактор можно превратить в число, если каждому уровню сопоставить его значение из таблицы перекодировки. Поэтому когда мы наш drink_fact превращаем обратно в числовой вектор при помощи функции as.numeric, мы получим числовые коды этих категорий. Чай у нас был обозначен цифрой 3, вода, второй элемент вектора, у нас была обозначена цифрой 1, дальше идет кофе, который обозначался цифрой 2, и чай, который обозначался цифрой 3. Ровно все в том же самом порядке. Чем определяется порядок значений уровней? Он определяется алфавитным порядком этикеток. Если вам нужен какой-то другой порядок, вы можете это изменить, изменяя соответствующие параметры функции factor. Как это сделать, можете узнать в справке к этой функции. Ранговые данные — это нечто среднее между категориальными данными и числовыми. С одной стороны, там есть-то какой-то ограниченный набор значений, например, мы можем описать степень заварки чая разными словами: чай бывает слабый, бывает средний, бывает крепкий, А с другой стороны, между этими дискретными категориями есть какие-то отношения. Ясно, что крепкий чай — у него степень заварки больше, чем у среднего чая. И эти отношения довольно-таки субъективны, то есть мы не можем это описать просто числами, потому что разница между крепким и средним чаем совершенно необязательно такого же размера, как разница между слабым чаем и средним. То есть это не просто числа. Конечно, для того чтобы это закодировать, нам пригодятся снова факторы. В текстовом векторе в векторе мы можем просто перечислить набор значений, но здесь мы не сможем сохранить информацию об упорядоченности этих уровней. Чтобы сохранить информацию об упорядоченности этих данных, нам нужно создать фактор, и не просто фактор, а упорядоченный фактор. Как это делается? Вектор strength у нас уже создан, в нем только текстовые значения, чтобы создать из него упорядоченный фактор, нам нужно использовать ту же самую функцию factor. Но на этот раз помимо самого вектора мы ей передаем еще порядок уровней — так себе, средний, крепкий — в том порядке, в котором мы хотим,чтобы они сохранялись в этом факторе. И значению «так себе» будет сопоставлена цифра 1, значению «средний» будет сопоставлена цифра 2, и значению «крепкий» — цифра 3. Чтобы это был не просто фактор, а упорядоченный, нам нужно изменить аргумент ordered — это переключатель. По умолчанию этот переключатель принимает значение FALSE. Мы хотим, чтобы фактор был упорядоченный, поэтому мы говорим ordered = TRUE. И в результате вектор, который мы вновь создали, strength_ord, это будет упорядоченный фактор. Если мы его распечатаем в консоли, то нам по-прежнему покажут этикетки для каждого из значений, а еще внизу уровни фактора, которые будут разделены значками «меньше». Это будет символизировать, что эти уровни фактора следуют в определенном порядке. Внутри упорядоченных факторов точно так же, как и внутри обычных факторов, зашиты числовые значения, функция as.numeric превратит упорядоченный фактор в вектор из чисел. Для того чтобы правильно закодировать любые данные, нужно уметь отличать значения нулевые и отсутствующие. Представьте себе, что у вас есть несколько чашек чая, и вы знаете, что в некоторых из них нет сахара. Если вы захотите записать эту информацию, вы напишете «0 кусков сахара». Как это закодировать? Числовой вектор. Если же вы вдруг наблюдаете за тем, как люди кладут сахар в чашки, и внезапно ваше внимание было отвлечено, и вы не знаете, что было со второй чашкой, положил туда кто-то кусочек сахара или не положил, если положил, то сколько — что вы можете там записать? Можете ли вы там записать число? Нет, потому что вы точно не знаете, сколько там было. Можете вы там записать 0? Точно так же нет, потому что вдруг там есть какое-то количество сахара. И для такой ситуации придумали свой способ обозначений. В R это обозначается аббревиатурой NA от английского not available. Это тот случай, когда объект был, измерение не было сделано, мы не знаем, чему может быть равно его значение. Собственно, значение NA может скрываться в любом месте вектора совершенно любого типа. Оно появляется там, когда вы не знаете, что должно быть записано на этом месте. Мы с вами в этом видео рассмотрели несколько разных типов данных. До этого вы уже встречались с числовыми данными, здесь мы увидели, как выглядят данные текстовые логические, как выглядят факторы простые и упорядоченные. О логическом типе данных мы поговорим гораздо подробнее. В следующем видео мы рассмотрим основные операции с логическими векторами, а потом будем использовать логические векторы для того, чтобы добывать кусочки данных — кусочки из векторов и кусочки из более сложных структур. [БЕЗ_ЗВУКА]