Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
статан3.docx
Скачиваний:
0
Добавлен:
28.12.2024
Размер:
375.77 Кб
Скачать

Приложение 1 листинг программы

Листинг 1 - код программы

  1. library("XML")

  2. library("plotrix")

  3. library("moments")

  4. library("writexl")

  5. library("dplyr")

  6. library("ggplot2")

  7. library("cowplot")

  8. library("car")

  9.  

  10. #1 Берем города Воронеж, Псков и Липецк

  11. urlVor <- "http://www.pogodaiklimat.ru/history/34123.htm"

  12. urlPs <- "http://www.pogodaiklimat.ru/history/26258.htm"

  13. urlLip <- "http://www.pogodaiklimat.ru/history/27930.htm"

  14.  

  15. yearsVor <- readHTMLTable(urlVor, which = 1)

  16. yearsPs <- readHTMLTable(urlPs, which = 1)

  17. yearsLip <- readHTMLTable(urlLip, which = 1)

  18.  

  19. tableVor <- readHTMLTable(urlVor, which = 2)

  20. tableVor['year'] <- yearsVor

  21. tablePs <- readHTMLTable(urlPs, which = 2)

  22. tablePs['year'] <- yearsPs

  23. tableLip <- readHTMLTable(urlLip, which = 2)

  24. tableLip['year'] <- yearsLip

  25.  

  26. tableVor[tableVor == 999.9] <- NA

  27. tablePs[tablePs == 999.9] <- NA

  28. tableLip[tableLip == 999.9] <- NA

  29.  

  30. tableVor <- na.omit(tableVor)

  31. tablePs <- na.omit(tablePs)

  32. tableLip <- na.omit(tableLip)

  33.  

  34. #Приведем датафреймы к числовому формату

  35. tableVor <- tableVor %>% mutate_at(c("янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек", "за год"), as.numeric)

  36. tablePs <- tablePs %>% mutate_at(c("янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек", "за год"), as.numeric)

  37. tableLip <- tableLip %>% mutate_at(c("янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек", "за год"), as.numeric)

  38. #Сделаем датафреймы со среднегодовыми значениями температуры

  39.  

  40. meansVor <- data.frame(

  41. year=tableVor[, 14],

  42. Voronezh=cbind(rowMeans(tableVor[, 1:12]))

  43. )

  44. meansPs <- data.frame(

  45. year=tablePs[, 14],

  46. Pskov=cbind(rowMeans(tablePs[, 1:12]))

  47. )

  48. meansLip <- data.frame(

  49. year=tableLip[, 14],

  50. Lipetsk=cbind(rowMeans(tableLip[, 1:12]))

  51. )

  52.  

  53. means <- merge(x = meansVor, y= meansPs, by="year")

  54. means<- merge(x=means, y=meansLip, by="year")

  55. #Датафрейм "means" - искомые данные со средними значениями, в них оставлены только те года, когда среднюю температуру можно было подсчитать для всех 3-х городов, объем каждой из выборок равен 87

  56. #2

  57. #построим диаграмму рассеяния

  58. vPlot<-ggplot(means) + aes(x=Voronezh, y=year)+ geom_jitter()+theme(legend.position = "none")

  59. pPlot <- ggplot(means) + aes(x=Pskov, y=year)+ geom_jitter()+theme(legend.position = "none")

  60. lPlot <- ggplot(means) + aes(x=Lipetsk, y=year)+ geom_jitter()+theme(legend.position = "none")

  61. plot_grid(vPlot, pPlot, lPlot, labels=c("Voronezh", "Pskov", "Lipetsk"))

  62.  

  63. #здесь я переформатирую наши данные так, чтобы все наши функции работали

  64. y <- c();

  65. m <- c();

  66. t <- c();

  67. for (i in 1:87){

  68. for (j in 2:4){

  69. y <- append(y, means[i, 1])

  70. m<-append(m, means[i, j])

  71. if (j == 2){

  72. t<-append(t, "Voronezh")

  73. }

  74. else if (j==3){

  75. t<-append(t, "Pskov")

  76. }

  77. else{

  78. t<-append(t, "Lipetsk")

  79. }

  80. }

  81. }

  82. meansForFunctions <- data.frame(

  83. year = y,

  84. mean = m,

  85. town = t

  86. )

  87.  

  88.  

  89. aggregate(meansForFunctions[,2],by=list(meansForFunctions[,3]),FUN= function(x) round(c(mean = mean(x),

  90. sd = sd(x)), 2))

  91. #По итогу получаем табличку со средними и стандартными отклонениями для наших городов

  92. #Средние значения и стандартные отклонения в городах отличаются достаточно сильно, чтобы предположить, что в результате

  93. #дисперсионного анализа нулевая гипотеза будет отклонена и разница между средними будет признана статистически значимой

  94.  

  95.  

  96. #3

  97. #Данные являются независимыми, так как извлечены из генеральной совокупности случайно и независимо друг от друга(???)

  98. #Проверка нормальности данных:

  99. shapiro.test(means[,2]) #проверяем Воронеж, получаем что p=0.3503, что больше, чем 0.05, данные распределены нормально

  100. shapiro.test(means[,3]) #Проверяем Псков, получаем p=0.3916, данные распределены нормально

  101. shapiro.test(means[,4]) #Проверяем Липецк, получаем p=0.3843, данные распределены нормально

  102.  

  103. #Строим графики

  104. res_aov <- aov(mean~town, data=meansForFunctions)

  105. par(mfrow = c(1, 2))

  106. hist(res_aov$residuals)

  107. car::qqPlot(res_aov$residuals, id = FALSE)

  108.  

  109. #Объем выборки = 87 > 30, выборка достаточно велика, чтобы судить о нормальности данных визуально и по критерию Шапиро-Уилка

  110. #Проверяем однородность дисперсии

  111. boxplot(mean~town, data = meansForFunctions)

  112. #Используем критерий Левенэ для проверки однородности дисперсий с центром в выборочном среднем, так как распределения умеренно ассиметричны и минимальное и максимальное стандартные отклонения отличаются менее, чем в 2 раза

  113. leveneTest(mean~town, data=meansForFunctions, center = mean)

  114. #По результатам теста получаем p=0.5174, что больше чем 0.05, не можем отвергнуть нулевую гипотезу о том, что дисперсии однородны

  115. #4

  116. #Мы получили, что распределения близки к нормальному. Значит, можно применять параметричсекие критерии.

  117. #Тест должен быть однофакторным, так как мы изучаем влияние одного фактора (а именно, города, в котором проводились измерения) на среднегодовую температуру

  118. #Можно применить критерий Уэлча, так как данные независимы, нормально распределены и дисперсии однородны, а средние мы предполагаем не равными (п.2)

  119. oneway.test(mean~town, data=meansForFunctions, var.equal = FALSE)

  120. #получаем p=1.048e-07, нулевая гипотеза о равенстве средних отвергается

  121.  

  122. #5

  123.  

  124.  

  125. #6

  126. TukeyHSD(res_aov)

  127. plot(TukeyHSD(model, conf.level= .95 ), las = 2 ) #это прост визуализация, вроде необяз

  128. #можно применить Тьюки-Крамера тк дисперсии однородны.

  129. #В первом случае доверительный интервал включает 0, что указывает

  130. #на отсутствие различий между соответствующими группами(на это же указывает P>0.05)

  131. #В свою очередь, при сравнении пар Воронеж-Липецк и Воронеж-Псков можно заметить,

  132. #что 0 в дов интервал не попадает, а значение p сильно меньше 0.05, т.е. эти пары существенно отличаются

  133.  

  134. #7

  135.  

Соседние файлы в предмете Статистический анализ