Menu

Среднее, медиана и стандартное отклонение в R

Как сводить данные в R: mean(), median(), sd(), var(), summary(), quantile() — что считает каждая, деталь про n−1 за sd() и почему mode() в R является ловушкой.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Среднее и медиана

Две самые используемые сводки во всей статистике — по одному вызову функции каждая:

mean() складывает всё и делит на количество. median() сортирует значения и берёт среднее по положению (или усредняет два средних, когда количество чётное). Для 32 машин в mtcars средняя экономичность составляет около 20.1 мили на галлон, а медиана 19.2 — они близки, и это говорит, что данные не сильно скошены. Когда же они сильно расходятся, это тоже информация; к этому мы вернёмся в конце.

Одна вещь удивляет всех: если вектор содержит хотя бы одно NA, обе функции возвращают NA:

Это сделано намеренно — R отказывается тихо делать вид, что пропущенного значения нет. na.rm = TRUE говорит: «считай по тем значениям, что есть». Почти каждая сводная функция в этой статье его принимает. Полная история о том, как распространяется NA, — в статье о пропущенных значениях.

Стандартное отклонение и дисперсия

sd() измеряет разброс: грубо говоря, насколько типичное значение отстоит от среднего, в тех же единицах, что и данные. var() — её квадрат:

Стандартное отклонение около 6 миль на галлон означает, что машины обычно укладываются примерно в 6 единиц от среднего значения 20.1. Поскольку sd() выражена в собственных единицах данных, именно её и сообщают; var() в основном всплывает внутри других формул.

Вот деталь, важная для учёбы: sd() и var() вычисляют выборочную статистику — они делят сумму квадратов отклонений на n − 1, а не на n:

Почему n − 1? Потому что среднее вы оценили по тем же данным, и отклонения вокруг этого оценённого среднего систематически чуть меньше нужного; деление на n − 1 это корректирует. Поскольку ваши данные почти всегда являются выборкой из чего-то большего, вам нужна версия с n − 1. Если у вас действительно вся генеральная совокупность (каждый студент в классе, каждый товар в каталоге), домножьте: var(x) * (n - 1) / n.

Стандартная ошибка среднего

Стандартное отклонение и стандартную ошибку постоянно путают, так что держите их врозь: sd описывает данные, SE описывает вашу оценку среднего. В R нет встроенной se(), но формула умещается в строку:

Стандартная ошибка уменьшается с ростом выборки — соберите вчетверо больше данных, и SE уменьшится вдвое, — потому что большая выборка точнее пришпиливает среднее. А sd с ростом выборки не уменьшается: машины настолько разнообразны, насколько они разнообразны, сколько бы вы их ни измерили. SE — строительный блок доверительных интервалов, где она и окупается.

summary() — обзор одним вызовом

summary() за один раз даёт пятичисловую сводку плюс среднее и работает на целых датафреймах:

Вызванная на датафрейме, она сводит каждый столбец: числовые получают минимум, квартили, среднее и максимум, а факторы — количества по уровням. Это первое, что стоит запускать на любом только что загруженном наборе данных: невозможные значения (отрицательный возраст, максимум 9999) сразу бросаются в глаза.

Квантили, размах и IQR

quantile() обобщает медиану на любую точку разреза:

Без аргументов она возвращает минимум, квартили и максимум. Передайте probs = для конкретных точек разреза — 10-й и 90-й процентили выше очерчивают, где живёт основная масса данных. IQR() (расстояние между 25-м и 75-м процентилями) — мера разброса, которая, в отличие от sd(), не таскается за выбросами. range() возвращает минимум и максимум парой.

Мода: mode() в R делает НЕ это

Эта ловушка ловит всех ровно один раз. В R есть функция mode(), и к статистике она не имеет никакого отношения — она сообщает тип хранения объекта:

Идиома, которую стоит запомнить: table(x) считает, как часто встречается каждое значение, which.max() находит наибольшее количество, а names() вытаскивает само значение. Учтите, что оно возвращается символьной строкой (имена таблицы всегда таковы); оберните в as.numeric(), если нужно с ним считать. Если два значения делят первое место, which.max() молча вернёт только первое — проверяйте таблицу сами, когда ничьи правдоподобны.

Среднее против медианы: что сообщать

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

Одно добавленное значение толкает среднее с примерно 49 300 до более чем 155 000 — числа, которое не описывает никого в данных, — тогда как медиана сдвигается лишь с 48 000 до 49 500. Поэтому доходы, цены на жильё и длительность госпитализации сообщают медианами: скошенные данные с длинным хвостом делают среднее вводящим в заблуждение. Для примерно симметричных данных обе меры сходятся, и среднее вполне годится (и статистически эффективнее). Быстрая гистограмма подскажет, в какой вы ситуации, — а сравнение вашего среднего с медианой само по себе является однострочной проверкой на скошенность.

Что вы уносите с собой

  • mean(x) и median(x) — добавляйте na.rm = TRUE, когда есть пропущенные значения.
  • sd(x) и var(x) считают выборочную статистику (знаменатель n − 1) — а это то, что вам нужно.
  • Стандартная ошибка это sd(x) / sqrt(length(x)) — она измеряет, насколько хорошо вы знаете среднее, а не насколько разбросаны данные.
  • summary() на свежем датафрейме — самая быстрая проверка здравого смысла в R.
  • Мода это names(which.max(table(x)))mode() в R про типы хранения.
  • Скошенные данные или выбросы: сообщайте медиану. Симметричные данные: среднее вполне годится.

Дальше: измерение того, как две переменные движутся вместе, — корреляция через cor() и cor.test().

Часто задаваемые вопросы

Как вычислить стандартное отклонение в R?

С помощью sd(x). Учтите, что она считает выборочное стандартное отклонение — делит на n − 1, а не на n. Именно это нужно почти в любом реальном анализе, потому что ваши данные почти всегда являются выборкой, а не всей генеральной совокупностью.

Как найти среднее и медиану в R?

mean(x) и median(x). Если вектор содержит пропущенные значения, обе вернут NA — добавьте na.rm = TRUE, чтобы считать по имеющимся значениям: mean(x, na.rm = TRUE).

Как найти моду в R?

Не через mode() — эта функция возвращает тип хранения объекта, а не самое частое значение. Используйте идиому с таблицей: names(which.max(table(x))) возвращает значение, встречающееся чаще всего.

Что такое стандартная ошибка в R?

Встроенной функции нет. Вычисляйте её как sd(x) / sqrt(length(x)). Стандартное отклонение описывает разброс ваших данных; стандартная ошибка описывает, насколько точно вы оценили среднее, и она уменьшается с ростом выборки.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ