library("XML")
library("plotrix")
library("moments")
library("writexl")
library("dplyr")
library("ggplot2")
library("cowplot")
library("car")
#1
Берем города Воронеж, Псков и Липецк
urlVor
<-
"http://www.pogodaiklimat.ru/history/34123.htm"
urlPs
<-
"http://www.pogodaiklimat.ru/history/26258.htm"
urlLip
<-
"http://www.pogodaiklimat.ru/history/27930.htm"
yearsVor
<-
readHTMLTable(urlVor,
which = 1)
yearsPs
<-
readHTMLTable(urlPs,
which = 1)
yearsLip
<-
readHTMLTable(urlLip,
which = 1)
tableVor
<-
readHTMLTable(urlVor,
which = 2)
tableVor['year']
<-
yearsVor
tablePs
<-
readHTMLTable(urlPs,
which = 2)
tablePs['year']
<-
yearsPs
tableLip
<-
readHTMLTable(urlLip,
which = 2)
tableLip['year']
<-
yearsLip
tableVor[tableVor
== 999.9]
<-
NA
tablePs[tablePs
== 999.9]
<-
NA
tableLip[tableLip
== 999.9]
<-
NA
tableVor
<-
na.omit(tableVor)
tablePs
<-
na.omit(tablePs)
tableLip
<-
na.omit(tableLip)
#Приведем
датафреймы к числовому формату
tableVor
<-
tableVor %>%
mutate_at(c("янв",
"фев",
"мар",
"апр",
"май",
"июн",
"июл",
"авг",
"сен",
"окт",
"ноя",
"дек",
"за
год"),
as.numeric)
tablePs
<-
tablePs %>%
mutate_at(c("янв",
"фев",
"мар",
"апр",
"май",
"июн",
"июл",
"авг",
"сен",
"окт",
"ноя",
"дек",
"за
год"),
as.numeric)
tableLip
<-
tableLip %>%
mutate_at(c("янв",
"фев",
"мар",
"апр",
"май",
"июн",
"июл",
"авг",
"сен",
"окт",
"ноя",
"дек",
"за
год"),
as.numeric)
#Сделаем
датафреймы со среднегодовыми
значениями температуры
meansVor
<-
data.frame(
year=tableVor[,
14],
Voronezh=cbind(rowMeans(tableVor[,
1:12]))
)
meansPs
<-
data.frame(
year=tablePs[,
14],
Pskov=cbind(rowMeans(tablePs[,
1:12]))
)
meansLip
<-
data.frame(
year=tableLip[,
14],
Lipetsk=cbind(rowMeans(tableLip[,
1:12]))
)
means
<-
merge(x
= meansVor, y= meansPs, by="year")
means<-
merge(x=means,
y=meansLip, by="year")
#Датафрейм
"means" - искомые данные со средними
значениями, в них оставлены только
те года, когда среднюю температуру
можно было подсчитать для всех 3-х
городов, объем каждой из выборок
равен 87
#2
#построим
диаграмму рассеяния
vPlot<-ggplot(means)
+ aes(x=Voronezh,
y=year)+
geom_jitter()+theme(legend.position
= "none")
pPlot
<-
ggplot(means)
+ aes(x=Pskov,
y=year)+
geom_jitter()+theme(legend.position
= "none")
lPlot
<-
ggplot(means)
+ aes(x=Lipetsk,
y=year)+
geom_jitter()+theme(legend.position
= "none")
plot_grid(vPlot,
pPlot, lPlot, labels=c("Voronezh",
"Pskov",
"Lipetsk"))
#здесь
я переформатирую наши данные так,
чтобы все наши функции работали
y
<-
c();
m
<-
c();
t
<-
c();
for
(i
in
1:87){
for
(j
in
2:4){
y
<-
append(y,
means[i,
1])
m<-append(m,
means[i,
j])
if
(j
== 2){
t<-append(t,
"Voronezh")
}
else
if
(j==3){
t<-append(t,
"Pskov")
}
else{
t<-append(t,
"Lipetsk")
}
}
}
meansForFunctions
<-
data.frame(
year
= y,
mean
= m,
town
= t
)
aggregate(meansForFunctions[,2],by=list(meansForFunctions[,3]),FUN=
function(x)
round(c(mean
= mean(x),
sd
= sd(x)),
2))
#По
итогу получаем табличку со средними
и стандартными отклонениями для
наших городов
#Средние
значения и стандартные отклонения
в городах отличаются достаточно
сильно, чтобы предположить, что в
результате
#дисперсионного
анализа нулевая гипотеза будет
отклонена и разница между средними
будет признана статистически значимой
#3
#Данные
являются независимыми, так как
извлечены из генеральной совокупности
случайно и независимо друг от
друга(???)
#Проверка
нормальности данных:
shapiro.test(means[,2])
#проверяем
Воронеж, получаем что p=0.3503, что больше,
чем 0.05, данные распределены нормально
shapiro.test(means[,3])
#Проверяем
Псков, получаем p=0.3916, данные распределены
нормально
shapiro.test(means[,4])
#Проверяем
Липецк, получаем p=0.3843, данные
распределены нормально
#Строим
графики
res_aov
<-
aov(mean~town,
data=meansForFunctions)
par(mfrow
= c(1,
2))
hist(res_aov$residuals)
car::qqPlot(res_aov$residuals,
id = FALSE)
#Объем
выборки = 87 > 30, выборка достаточно
велика, чтобы судить о нормальности
данных визуально и по критерию
Шапиро-Уилка
#Проверяем
однородность дисперсии
boxplot(mean~town,
data
= meansForFunctions)
#Используем
критерий Левенэ для проверки
однородности дисперсий с центром в
выборочном среднем, так как распределения
умеренно ассиметричны и минимальное
и максимальное стандартные отклонения
отличаются менее, чем в 2 раза
leveneTest(mean~town,
data=meansForFunctions,
center = mean)
#По
результатам теста получаем p=0.5174, что
больше чем 0.05, не можем отвергнуть
нулевую гипотезу о том, что дисперсии
однородны
#4
#Мы
получили, что распределения близки
к нормальному. Значит, можно применять
параметричсекие критерии.
#Тест
должен быть однофакторным, так как
мы изучаем влияние одного фактора
(а именно, города, в котором проводились
измерения) на среднегодовую температуру
#Можно
применить критерий Уэлча, так как
данные независимы, нормально
распределены и дисперсии однородны,
а средние мы предполагаем не равными
(п.2)
oneway.test(mean~town,
data=meansForFunctions,
var.equal
= FALSE)
#получаем
p=1.048e-07, нулевая гипотеза о равенстве
средних отвергается
#5
#6
TukeyHSD(res_aov)
plot(TukeyHSD(model,
conf.level=
.95 ),
las = 2
)
#это
прост визуализация, вроде необяз
#можно
применить Тьюки-Крамера тк дисперсии
однородны.
#В
первом случае доверительный интервал
включает 0, что указывает
#на
отсутствие различий между
соответствующими группами(на это же
указывает P>0.05)
#В
свою очередь, при сравнении пар
Воронеж-Липецк и Воронеж-Псков можно
заметить,
#что
0 в дов интервал не попадает, а значение
p сильно меньше 0.05, т.е. эти пары
существенно отличаются
#7