Тренировка перед контрольной работой
Задача про цены
Исходные данные
Таблица, содержащая данные о ценах на различные продукты в различных регионах России в январе 2014 и январе 2015. Таблица в "расплавленном" (melted) формате и имеет следующие колонки: год - продукт - регион - цена.
http://makarich.fbb.msu.ru/artemov/R/prices_stat3.csv
prices=read.csv("prices_stat3.csv")
Создание "двумерной" таблицы
Вспомните про функцию melt. Она требовалась для подгодовки данных для рисования при помощи ggplot. Обратное действие можно совершить при помощи функции cast из библиотеки reshape (update: лучше использовать dcast из reshape2):
Превратим исходную таблицу в двумерную таблицу, по строкам - продукт, по столбцам - регион, в ячейках - цены.
library(reshape) prices2015_melted=prices[prices$year==2015, c("item", "region", "price")] prices2015=cast(prices2015_melted, formula=item~region, fun.aggregate=mean, value="price") prices2014_melted=prices[prices$year==2014, c("item", "region", "price")] prices2014=cast(prices2014_melted, formula=item~region, fun.aggregate=mean, value="price")
Удобнее работать с матрицами (не придется отрезать числовую часть)
m_prices2015=data.matrix(prices2015[,2:ncol(prices2015)]) row.names(m_prices2015)=prices2015[,1] m_prices2014=data.matrix(prices2014[,2:ncol(prices2014)]) row.names(m_prices2014)=prices2014[,1]
Подробнее про melt и cast см.: http://www.statmethods.net/management/reshape.html
Статистические тесты
Распределена ли нормально цена на хлеб?
shapiro.test(m_prices2014["Хлеб и булочные изделия из пшеничной муки высшего сорта",]) hist(m_prices2014["Хлеб и булочные изделия из пшеничной муки высшего сорта",])
Значимо ли отличается цена на хлеб в 2014 и в 2015? Постройте наложенные друг на друга гистограммы и примените подходящий статистический тест.
wilcox.test(m_prices2014["Хлеб и булочные изделия из пшеничной муки высшего сорта",], m_prices2015["Хлеб и булочные изделия из пшеничной муки высшего сорта",])
Можно ли утверждать, что выборки отличаются на уровне значимости: 0.05, 0.01, 0.001?
Гистограмму будем рисовать на основании исходной (melted) таблицы:
prices_bread=prices[prices$item=="Хлеб и булочные изделия из пшеничной муки высшего сорта",]
Такой вариант не совсем корректен - из-за разного количества точек (регионов) в разные года
ggplot(prices_bread, aes(price, fill=as.factor(year) ))+geom_histogram()
Првильнее рисовать вместо штук (counts) плотность (density)
ggplot(prices_bread, aes(price, fill=as.factor(year) ))+geom_histogram(aes(y = ..density..), position = 'identity', alpha=0.5)
Альтернативный вариант - пользоваться density вместо гистограммы:
ggplot(prices_bread, aes(price, fill=as.factor(year) ))+geom_density(alpha=0.2)
Парный тест
Парный тест сделать сложнее, потому что список регионов в 2014 и 2015 отличается (2 новых региона и 1 новый федеральный округ, те самые). Простой способ - взять два вектора из названий колонок и найти их пересечение их функцией intersect.
cn_both=intersect(colnames(m_prices2014), colnames(m_prices2015)) wilcox.test(m_prices2014["Хлеб и булочные изделия из пшеничной муки высшего сорта",cn_both], m_prices2015["Хлеб и булочные изделия из пшеничной муки высшего сорта",cn_both], paired=T)
Тесты для всех продуктов
При помощи for или apply примените тест для каждого из продуктов. Для каких продуктов цены значимо не изменились (уровень значимости 0.5)?
Много вариантов, например, так
pvs=sapply(1:nrow(m_prices2014), function(i){ wilcox.test(m_prices2014[i,], m_prices2015[i,])$p.value }) m_prices2014[pvs>=0.05,] rownames(m_prices2014)[pvs>=0.05]
Для парного теста (который без учета Крыма)
pvs=sapply(1:nrow(m_prices2014), function(i){ wilcox.test(m_prices2014[i,cn_both], m_prices2015[i,cn_both], paired=T)$p.value }) m_prices2014[pvs>=0.05,] rownames(m_prices2014)[pvs>=0.05]
Инфляция
(Дополнительная задача). Оцените уровень инфляции. Например, так (можно и любым другим разумным способом): для каждого продукта и каждого региона вычислите коэффициент, равный отношению цены в 2015 и 2014. Постройте распределение таких коэффициентов (для всех продуктов и регионов), найдите его медианное значение.