Kodomo

Пользователь

Тренировка перед контрольной работой

Задача про цены

Исходные данные

Таблица, содержащая данные о ценах на различные продукты в различных регионах России в январе 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. Постройте распределение таких коэффициентов (для всех продуктов и регионов), найдите его медианное значение.