R Markdown

1. Установить пакет CARET, выполнить команду names(getModelInfo()), ознакомиться со списком доступных методов выбора признаков. Выполните графический разведочный анализ данных с использованием функции featurePlot() для набора данных из справочного файла пакета CARET:

install.packages("caret")
library(caret)
install.packages("ggplot2")
library(ggplot2)
names(getModelInfo())

[1] "ada"                 "AdaBag"              "AdaBoost.M1"        
[4] "adaboost"            "amdai"               "ANFIS"              
[7] "avNNet"              "awnb"                "awtan"              
[10] "bag"                 "bagEarth"            "bagEarthGCV"        
[13] "bagFDA"              "bagFDAGCV"           "bam"                
[16] "bartMachine"         "bayesglm"            "binda"              
[19] "blackboost"          "blasso"              "blassoAveraged"     
[22] "bridge"              "brnn"                "BstLm"              
[25] "bstSm"               "bstTree"             "C5.0"               
[28] "C5.0Cost"            "C5.0Rules"           "C5.0Tree"           
[31] "cforest"             "chaid"               "CSimca"             
[34] "ctree"               "ctree2"              "cubist"             
[37] "dda"                 "deepboost"           "DENFIS"             
[40] "dnn"                 "dwdLinear"           "dwdPoly"            
[43] "dwdRadial"           "earth"               "elm"                
[46] "enet"                "evtree"              "extraTrees"         
[49] "fda"                 "FH.GBML"             "FIR.DM"             
[52] "foba"                "FRBCS.CHI"           "FRBCS.W"            
[55] "FS.HGD"              "gam"                 "gamboost"           
[58] "gamLoess"            "gamSpline"           "gaussprLinear"      
[61] "gaussprPoly"         "gaussprRadial"       "gbm_h2o"            
[64] "gbm"                 "gcvEarth"            "GFS.FR.MOGUL"       
[67] "GFS.LT.RS"           "GFS.THRIFT"          "glm.nb"             
[70] "glm"                 "glmboost"            "glmnet_h2o"         
[73] "glmnet"              "glmStepAIC"          "gpls"               
[76] "hda"                 "hdda"                "hdrda"              
[79] "HYFIS"               "icr"                 "J48"                
[82] "JRip"                "kernelpls"           "kknn"               
[85] "knn"                 "krlsPoly"            "krlsRadial"         
[88] "lars"                "lars2"               "lasso"              
[91] "lda"                 "lda2"                "leapBackward"       
[94] "leapForward"         "leapSeq"             "Linda"              
[97] "lm"                  "lmStepAIC"           "LMT"                
[100] "loclda"              "logicBag"            "LogitBoost"         
[103] "logreg"              "lssvmLinear"         "lssvmPoly"          
[106] "lssvmRadial"         "lvq"                 "M5"                 
[109] "M5Rules"             "manb"                "mda"                
[112] "Mlda"                "mlp"                 "mlpKerasDecay"      
[115] "mlpKerasDecayCost"   "mlpKerasDropout"     "mlpKerasDropoutCost"
[118] "mlpML"               "mlpSGD"              "mlpWeightDecay"     
[121] "mlpWeightDecayML"    "monmlp"              "msaenet"            
[124] "multinom"            "mxnet"               "mxnetAdam"          
[127] "naive_bayes"         "nb"                  "nbDiscrete"         
[130] "nbSearch"            "neuralnet"           "nnet"               
[133] "nnls"                "nodeHarvest"         "null"               
[136] "OneR"                "ordinalNet"          "ordinalRF"          
[139] "ORFlog"              "ORFpls"              "ORFridge"           
[142] "ORFsvm"              "ownn"                "pam"                
[145] "parRF"               "PART"                "partDSA"            
[148] "pcaNNet"             "pcr"                 "pda"                
[151] "pda2"                "penalized"           "PenalizedLDA"       
[154] "plr"                 "pls"                 "plsRglm"            
[157] "polr"                "ppr"                 "pre"                
[160] "PRIM"                "protoclass"          "qda"                
[163] "QdaCov"              "qrf"                 "qrnn"               
[166] "randomGLM"           "ranger"              "rbf"                
[169] "rbfDDA"              "Rborist"             "rda"                
[172] "regLogistic"         "relaxo"              "rf"                 
[175] "rFerns"              "RFlda"               "rfRules"            
[178] "ridge"               "rlda"                "rlm"                
[181] "rmda"                "rocc"                "rotationForest"     
[184] "rotationForestCp"    "rpart"               "rpart1SE"           
[187] "rpart2"              "rpartCost"           "rpartScore"         
[190] "rqlasso"             "rqnc"                "RRF"                
[193] "RRFglobal"           "rrlda"               "RSimca"             
[196] "rvmLinear"           "rvmPoly"             "rvmRadial"          
[199] "SBC"                 "sda"                 "sdwd"               
[202] "simpls"              "SLAVE"               "slda"               
[205] "smda"                "snn"                 "sparseLDA"          
[208] "spikeslab"           "spls"                "stepLDA"            
[211] "stepQDA"             "superpc"             "svmBoundrangeString"
[214] "svmExpoString"       "svmLinear"           "svmLinear2"         
[217] "svmLinear3"          "svmLinearWeights"    "svmLinearWeights2"  
[220] "svmPoly"             "svmRadial"           "svmRadialCost"      
[223] "svmRadialSigma"      "svmRadialWeights"    "svmSpectrumString"  
[226] "tan"                 "tanSearch"           "treebag"            
[229] "vbmpRadial"          "vglmAdjCat"          "vglmContRatio"      
[232] "vglmCumulative"      "widekernelpls"       "WM"                 
[235] "wsrf"                "xgbDART"             "xgbLinear"          
[238] "xgbTree"             "xyf"       

data(iris)
x <- matrix(rnorm(50 * 5), ncol=5)
y <- factor(rep(c("A", "B"), each=25))
data <- data.frame(x=x, y=y)
featurePlot(x=data[, 1:5], y=data$y, plot="pairs")
Фото графика задания 1
Фото графика задания 1

На графике показана матрица рассеяния, которая отображает взаимосвязь между пятью различными переменными. Каждая ячейка матрицы показывает двумерное рассеяние двух переменных.

Например, верхняя левая ячейка показывает рассеяние между переменными x.1 и x.2, а нижняя правая ячейка показывает рассеяние между переменными x.4 и x.5.

По графику видно, что есть несколько пар переменных, которые демонстрируют слабую корреляцию. Например, между x.1 и x.4, x.2 и x.5.

Также видно, что некоторые пары переменных демонстрируют более ясную корреляцию. Например, между x.1 и x.3.

Важно отметить, что этот график только показывает визуальное представление взаимосвязей между переменными. Чтобы получить более точные выводы о корреляции, нужно провести статистический анализ данных.

2.С использование функций из пакета Fselector [2] определить важность признаков для решения задачи классификации. Использовать набор data(iris). Сделать выводы.

library(FSelector)
library(datasets)

install.packages("FSelector")
library(FSelector)
library(datasets)
data(iris)

important <- information.gain(Species ~ ., data=iris)
print(important)

             attr_importance
Sepal.Length       0.4521286
Sepal.Width        0.2672750
Petal.Length       0.9402853
Petal.Width        0.9554360

Анализ важности признаков для классификации ириса с помощью пакета Fselector показал, что Petal.Length и Petal.Width являются наиболее значимыми признаками для классификации.

Sepal.Length имеет среднюю важность, а Sepal.Width – наименьшую.

Petal.Length и Petal.Width - наиболее различимы между различными видами ирисов, поэтому они наиболее информативны для классификации. Sepal.Length и Sepal.Width - менее различимы между видами, что делает их менее важными признаками для классификации. На основе полученных результатов можно сделать вывод, что длина и ширина лепестка являются наиболее важными признаками для классификации видов ириса.

3. С использованием функции discretize() из пакета arules выполните преобразование непрерывной переменной в категориальную [3] различными методами: «interval» (равная ширина интервала), «frequency» (равная частота), «cluster» (кластеризация) и «fixed» (категории задают границы интервалов). Используйте набор данных iris. Сделайте выводы

install.packages("arules")
library(arules)
install.packages("Matrix")
library(arules)

data(iris)

disc_interval <- discretize(iris$Sepal.Length, method="interval", categories=3)
print(disc_interval)

  [1] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
  [9] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [5.5,6.7) [5.5,6.7)
 [17] [4.3,5.5) [4.3,5.5) [5.5,6.7) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
 [25] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
 [33] [4.3,5.5) [5.5,6.7) [4.3,5.5) [4.3,5.5) [5.5,6.7) [4.3,5.5) [4.3,5.5) [4.3,5.5)
 [41] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
 [49] [4.3,5.5) [4.3,5.5) [6.7,7.9] [5.5,6.7) [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7)
 [57] [5.5,6.7) [4.3,5.5) [5.5,6.7) [4.3,5.5) [4.3,5.5) [5.5,6.7) [5.5,6.7) [5.5,6.7)
 [65] [5.5,6.7) [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7)
 [73] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9] [6.7,7.9] [5.5,6.7) [5.5,6.7)
 [81] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [4.3,5.5) [5.5,6.7) [6.7,7.9] [5.5,6.7)
 [89] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [4.3,5.5) [5.5,6.7) [5.5,6.7)
 [97] [5.5,6.7) [5.5,6.7) [4.3,5.5) [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9] [5.5,6.7)
[105] [5.5,6.7) [6.7,7.9] [4.3,5.5) [6.7,7.9] [6.7,7.9] [6.7,7.9] [5.5,6.7) [5.5,6.7)
[113] [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9] [6.7,7.9] [5.5,6.7)
[121] [6.7,7.9] [5.5,6.7) [6.7,7.9] [5.5,6.7) [6.7,7.9] [6.7,7.9] [5.5,6.7) [5.5,6.7)
[129] [5.5,6.7) [6.7,7.9] [6.7,7.9] [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9]
[137] [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9] [6.7,7.9] [6.7,7.9] [5.5,6.7) [6.7,7.9]
[145] [6.7,7.9] [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7)
attr(,"discretized:breaks")
[1] 4.3 5.5 6.7 7.9
attr(,"discretized:method")
[1] interval
Levels: [4.3,5.5) [5.5,6.7) [6.7,7.9]

disc_interval <- discretize(iris$Sepal.Length, method = "frequency", categories = 3)
print(disc_interval)

[1] [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [5.4,6.3) [4.3,5.4) [4.3,5.4)
  [9] [4.3,5.4) [4.3,5.4) [5.4,6.3) [4.3,5.4) [4.3,5.4) [4.3,5.4) [5.4,6.3) [5.4,6.3)
 [17] [5.4,6.3) [4.3,5.4) [5.4,6.3) [4.3,5.4) [5.4,6.3) [4.3,5.4) [4.3,5.4) [4.3,5.4)
 [25] [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [5.4,6.3)
 [33] [4.3,5.4) [5.4,6.3) [4.3,5.4) [4.3,5.4) [5.4,6.3) [4.3,5.4) [4.3,5.4) [4.3,5.4)
 [41] [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4)
 [49] [4.3,5.4) [4.3,5.4) [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [6.3,7.9] [5.4,6.3)
 [57] [6.3,7.9] [4.3,5.4) [6.3,7.9] [4.3,5.4) [4.3,5.4) [5.4,6.3) [5.4,6.3) [5.4,6.3)
 [65] [5.4,6.3) [6.3,7.9] [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3)
 [73] [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [5.4,6.3)
 [81] [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [6.3,7.9] [6.3,7.9]
 [89] [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [4.3,5.4) [5.4,6.3) [5.4,6.3)
 [97] [5.4,6.3) [5.4,6.3) [4.3,5.4) [5.4,6.3) [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9]
[105] [6.3,7.9] [6.3,7.9] [4.3,5.4) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9]
[113] [6.3,7.9] [5.4,6.3) [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3)
[121] [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [5.4,6.3)
[129] [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [6.3,7.9]
[137] [6.3,7.9] [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [6.3,7.9]
[145] [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [5.4,6.3)
attr(,"discretized:breaks")
[1] 4.3 5.4 6.3 7.9
attr(,"discretized:method")
[1] frequency
Levels: [4.3,5.4) [5.4,6.3) [6.3,7.9]

disc_interval <- discretize(iris$Sepal.Length, method = "cluster", categories = 3)
print(disc_interval)

[1] [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45) 
  [7] [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45) 
 [13] [4.3,5.45)  [4.3,5.45)  [5.45,6.46) [5.45,6.46) [4.3,5.45)  [4.3,5.45) 
 [19] [5.45,6.46) [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45) 
 [25] [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45) 
 [31] [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [5.45,6.46) [4.3,5.45)  [4.3,5.45) 
 [37] [5.45,6.46) [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45) 
 [43] [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45)  [4.3,5.45) 
 [49] [4.3,5.45)  [4.3,5.45)  [6.46,7.9]  [5.45,6.46) [6.46,7.9]  [5.45,6.46)
 [55] [6.46,7.9]  [5.45,6.46) [5.45,6.46) [4.3,5.45)  [6.46,7.9]  [4.3,5.45) 
 [61] [4.3,5.45)  [5.45,6.46) [5.45,6.46) [5.45,6.46) [5.45,6.46) [6.46,7.9] 
 [67] [5.45,6.46) [5.45,6.46) [5.45,6.46) [5.45,6.46) [5.45,6.46) [5.45,6.46)
 [73] [5.45,6.46) [5.45,6.46) [5.45,6.46) [6.46,7.9]  [6.46,7.9]  [6.46,7.9] 
 [79] [5.45,6.46) [5.45,6.46) [5.45,6.46) [5.45,6.46) [5.45,6.46) [5.45,6.46)
 [85] [4.3,5.45)  [5.45,6.46) [6.46,7.9]  [5.45,6.46) [5.45,6.46) [5.45,6.46)
 [91] [5.45,6.46) [5.45,6.46) [5.45,6.46) [4.3,5.45)  [5.45,6.46) [5.45,6.46)
 [97] [5.45,6.46) [5.45,6.46) [4.3,5.45)  [5.45,6.46) [5.45,6.46) [5.45,6.46)
[103] [6.46,7.9]  [5.45,6.46) [6.46,7.9]  [6.46,7.9]  [4.3,5.45)  [6.46,7.9] 
[109] [6.46,7.9]  [6.46,7.9]  [6.46,7.9]  [5.45,6.46) [6.46,7.9]  [5.45,6.46)
[115] [5.45,6.46) [5.45,6.46) [6.46,7.9]  [6.46,7.9]  [6.46,7.9]  [5.45,6.46)
[121] [6.46,7.9]  [5.45,6.46) [6.46,7.9]  [5.45,6.46) [6.46,7.9]  [6.46,7.9] 
[127] [5.45,6.46) [5.45,6.46) [5.45,6.46) [6.46,7.9]  [6.46,7.9]  [6.46,7.9] 
[133] [5.45,6.46) [5.45,6.46) [5.45,6.46) [6.46,7.9]  [5.45,6.46) [5.45,6.46)
[139] [5.45,6.46) [6.46,7.9]  [6.46,7.9]  [6.46,7.9]  [5.45,6.46) [6.46,7.9] 
[145] [6.46,7.9]  [6.46,7.9]  [5.45,6.46) [6.46,7.9]  [5.45,6.46) [5.45,6.46)
attr(,"discretized:breaks")
[1] 4.300000 5.452320 6.461111 7.900000
attr(,"discretized:method")
[1] cluster
Levels: [4.3,5.45) [5.45,6.46) [6.46,7.9]

disc_interval <- discretize(iris$Sepal.Length, method = "fixed", breaks = c(4,5,6,7))
print(disc_interval)

[1] [5,6) [4,5) [4,5) [4,5) [5,6) [5,6) [4,5) [5,6) [4,5) [4,5) [5,6) [4,5) [4,5)
 [14] [4,5) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [4,5) [5,6) [4,5) [5,6)
 [27] [5,6) [5,6) [5,6) [4,5) [4,5) [5,6) [5,6) [5,6) [4,5) [5,6) [5,6) [4,5) [4,5)
 [40] [5,6) [5,6) [4,5) [4,5) [5,6) [5,6) [4,5) [5,6) [4,5) [5,6) [5,6) [6,7] [6,7]
 [53] [6,7] [5,6) [6,7] [5,6) [6,7] [4,5) [6,7] [5,6) [5,6) [5,6) [6,7] [6,7] [5,6)
 [66] [6,7] [5,6) [5,6) [6,7] [5,6) [5,6) [6,7] [6,7] [6,7] [6,7] [6,7] [6,7] [6,7]
 [79] [6,7] [5,6) [5,6) [5,6) [5,6) [6,7] [5,6) [6,7] [6,7] [6,7] [5,6) [5,6) [5,6)
 [92] [6,7] [5,6) [5,6) [5,6) [5,6) [5,6) [6,7] [5,6) [5,6) [6,7] [5,6) <NA>  [6,7]
[105] [6,7] <NA>  [4,5) <NA>  [6,7] <NA>  [6,7] [6,7] [6,7] [5,6) [5,6) [6,7] [6,7]
[118] <NA>  <NA>  [6,7] [6,7] [5,6) <NA>  [6,7] [6,7] <NA>  [6,7] [6,7] [6,7] <NA> 
[131] <NA>  <NA>  [6,7] [6,7] [6,7] <NA>  [6,7] [6,7] [6,7] [6,7] [6,7] [6,7] [5,6)
[144] [6,7] [6,7] [6,7] [6,7] [6,7] [6,7] [5,6)
attr(,"discretized:breaks")
[1] 4 5 6 7
attr(,"discretized:method")
[1] fixed
Levels: [4,5) [5,6) [6,7]

Анализ таблиц, полученных в результате применения различных методов discretize() к непрерывной переменной (Sepal.Length) из набора данных iris, позволяет сделать следующие выводы:

  1. Метод interval (Равная ширина интервала)

Интервалы равны по ширине, что обеспечивает равномерное распределение наблюдений по категориям. Не учитывает частоту значений и не обеспечивает равное количество наблюдений в каждой категории. Подходит, когда необходимо создать категории с равным шагом для дальнейшего анализа. 2. Метод frequency (Равная частота)

Обеспечивает одинаковое количество наблюдений в каждой категории, но границы интервалов могут быть не равными. Подходит, когда необходимо создать категории с примерно одинаковым количеством наблюдений. Не учитывает кластерную структуру данных, может привести к объединению похожих значений в разные категории. 3. Метод cluster (Кластеризация)

Создает категории, основанные на кластерной структуре данных, что может лучше отражать реальные различия между наблюдениями. Использует алгоритм k-means для определения границ интервалов, обеспечивая оптимальное разделение данных. Подходит, когда необходимо найти кластеры в данных и использовать их для категоризации. 4. Метод fixed (Заданные границы)

Обеспечивает гибкость в определении границ категорий, позволяя задать их вручную. Подходит, когда известны определенные точки разделения, которые имеют практический смысл. Не учитывает частоту значений или кластерную структуру, может привести к неравномерному распределению наблюдений. Выбор метода discretize() зависит от конкретной задачи и цели анализа.

Interval: для равномерной категоризации. Frequency: для одинакового количества наблюдений в каждой категории. Cluster: для создания категорий, основанных на кластерной структуре данных. Fixed: для гибкости в определении границ категорий.

4.Установите пакет Boruta и проведите выбор признаков для набора данных data(“Ozone”) [4, 5, 6]. Построить график boxplot, сделать выводы.

install.packages("Boruta")
library(Boruta)

data("airquality")
head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6


airquality <- na.omit(airquality)
airquality$OzoneLevel <- factor(ifelse(airquality$Ozone > median(airquality$Ozone, na.rm = TRUE), "High", "Low"))
set.seed(123)
result <- Boruta(OzoneLevel ~ ., data = airquality, doTrace = 2)

print(result)
Boruta performed 62 iterations in 0.4244909 secs.
 6 attributes confirmed important: Day, Month, Ozone, Solar.R, Temp and 1
more;
 No attributes deemed unimportant.

priznak <- getSelectedAttributes(result, withTentative = FALSE)
> print(priznak)
[1] "Ozone"   "Solar.R" "Wind"    "Temp"    "Month"   "Day"   

 boxplot(airquality$Solar.R ~ airquality$OzoneLevel,main = "Boxplot of Solar Radiation by Ozone Level",xlab = "Ozone Level", ylab = "Solar Radiation",col = c("lightblue", "lightgreen"))
Фото для 1 графика задания 4
Фото для 1 графика задания 4
boxplot(airquality$Wind ~ airquality$OzoneLevel,main = "Boxplot of Wind by Ozone Level",xlab = "Ozone Level", ylab = "Wind", col = c("lightblue", "lightgreen"))
Фото для 2 графика задания 4
Фото для 2 графика задания 4

На основе представленных boxplot-графиков можно сделать следующие выводы. График “Solar Radiation by Ozone Level” показывает, что при высоком уровне озона значения солнечной радиации в среднем выше, чем при низком уровне озона. При этом распределение солнечной радиации при высоком уровне озона более плотное вокруг медианы и имеет меньшее количество выбросов. Это может указывать на то, что высокий уровень озона связан с большей солнечной радиацией, что, возможно, связано с влиянием солнечного света, усиливающего радиацию и способствующего образованию озона.

График “Wind by Ozone Level” демонстрирует, что при низком уровне озона средняя скорость ветра выше, чем при высоком уровне. При низком уровне озона также наблюдается большее количество выбросов, что указывает на более изменчивую скорость ветра. Высокий уровень озона, скорее всего, возникает при более низкой скорости ветра, так как спокойные атмосферные условия могут способствовать накоплению озона.

Таким образом, можно предположить, что солнечная радиация и уровень озона положительно связаны, тогда как скорость ветра, напротив, отрицательно связана с уровнем озона. Это объясняется тем, что солнечный свет способствует образованию озона, а ветер рассеивает его, снижая концентрацию.