Задание 1

library(ggplot2)
library(lattice)
library(caret)
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, y)
featurePlot(x=data[, 1:5], y=data$y, plot="density")

Эти графики демонстрируют кривые плотности для каждого класса. Они показывают, как часто встречаются те или иные значения признаков в данных для каждого класса.

На графике X4 видно, что пиковые значения у кривых различаются: у одной это -1, у другой - 1. Это означает, что классы крайне различны по значению этого признака.

В то же ввремя на графике Х5 вино, что пиковые значения и сами кривые практически идентичны и близки к 0. Это означает, что признак не дает явного разделения между классами.

Задание 2

library(FSelector)
data(iris)
importance <- information.gain(Species ~ ., data=iris)
print(importance)
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360

Важность признаков для классификации в наборе данных iris показывает, что Petal.Length и Petal.Width являются наиболее информативными для разделения классов, с наибольшими значениями важности (0.94 и 0.95 соответственно). Эти признаки играют ключевую роль в классификации, указывая на важность размера и формы лепестков для различения видов ирисов. В то время как Sepal.Length имеет среднюю важность (0.45), а Sepal.Width имеет наименьшую важность (0.27). Таким образом, для задачи классификации ирисов признаки, связанные с лепестками, являются наиболее значимыми.

Задание 3

suppressMessages(library(Matrix))
suppressMessages(library(arules))
data(iris)
intervals <- discretize(iris$Sepal.Width, method="interval", breaks=3)
print(intervals)
##   [1] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [3.6,4.4] [2.8,3.6)
##   [8] [2.8,3.6) [2.8,3.6) [2.8,3.6) [3.6,4.4] [2.8,3.6) [2.8,3.6) [2.8,3.6)
##  [15] [3.6,4.4] [3.6,4.4] [3.6,4.4] [2.8,3.6) [3.6,4.4] [3.6,4.4] [2.8,3.6)
##  [22] [3.6,4.4] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6)
##  [29] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [3.6,4.4] [3.6,4.4] [2.8,3.6)
##  [36] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8)  
##  [43] [2.8,3.6) [2.8,3.6) [3.6,4.4] [2.8,3.6) [3.6,4.4] [2.8,3.6) [3.6,4.4]
##  [50] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8)   [2,2.8)   [2,2.8)  
##  [57] [2.8,3.6) [2,2.8)   [2.8,3.6) [2,2.8)   [2,2.8)   [2.8,3.6) [2,2.8)  
##  [64] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8)   [2,2.8)   [2,2.8)  
##  [71] [2.8,3.6) [2,2.8)   [2,2.8)   [2,2.8)   [2.8,3.6) [2.8,3.6) [2,2.8)  
##  [78] [2.8,3.6) [2.8,3.6) [2,2.8)   [2,2.8)   [2,2.8)   [2,2.8)   [2,2.8)  
##  [85] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8)   [2.8,3.6) [2,2.8)   [2,2.8)  
##  [92] [2.8,3.6) [2,2.8)   [2,2.8)   [2,2.8)   [2.8,3.6) [2.8,3.6) [2.8,3.6)
##  [99] [2,2.8)   [2,2.8)   [2.8,3.6) [2,2.8)   [2.8,3.6) [2.8,3.6) [2.8,3.6)
## [106] [2.8,3.6) [2,2.8)   [2.8,3.6) [2,2.8)   [2.8,3.6) [2.8,3.6) [2,2.8)  
## [113] [2.8,3.6) [2,2.8)   [2,2.8)   [2.8,3.6) [2.8,3.6) [3.6,4.4] [2,2.8)  
## [120] [2,2.8)   [2.8,3.6) [2,2.8)   [2,2.8)   [2,2.8)   [2.8,3.6) [2.8,3.6)
## [127] [2,2.8)   [2.8,3.6) [2,2.8)   [2.8,3.6) [2,2.8)   [3.6,4.4] [2,2.8)  
## [134] [2,2.8)   [2,2.8)   [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6)
## [141] [2.8,3.6) [2.8,3.6) [2,2.8)   [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8)  
## [148] [2.8,3.6) [2.8,3.6) [2.8,3.6)
## attr(,"discretized:breaks")
## [1] 2.0 2.8 3.6 4.4
## attr(,"discretized:method")
## [1] interval
## Levels: [2,2.8) [2.8,3.6) [3.6,4.4]
intervals <- discretize(iris$Sepal.Width, method="frequency", breaks=3)
print(intervals)
##   [1] [3.2,4.4] [2.9,3.2) [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [3.2,4.4]
##   [8] [3.2,4.4] [2.9,3.2) [2.9,3.2) [3.2,4.4] [3.2,4.4] [2.9,3.2) [2.9,3.2)
##  [15] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4]
##  [22] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4]
##  [29] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2)
##  [36] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [2,2.9)  
##  [43] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [3.2,4.4]
##  [50] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [2,2.9)   [2,2.9)   [2,2.9)  
##  [57] [3.2,4.4] [2,2.9)   [2.9,3.2) [2,2.9)   [2,2.9)   [2.9,3.2) [2,2.9)  
##  [64] [2.9,3.2) [2.9,3.2) [2.9,3.2) [2.9,3.2) [2,2.9)   [2,2.9)   [2,2.9)  
##  [71] [3.2,4.4] [2,2.9)   [2,2.9)   [2,2.9)   [2.9,3.2) [2.9,3.2) [2,2.9)  
##  [78] [2.9,3.2) [2.9,3.2) [2,2.9)   [2,2.9)   [2,2.9)   [2,2.9)   [2,2.9)  
##  [85] [2.9,3.2) [3.2,4.4] [2.9,3.2) [2,2.9)   [2.9,3.2) [2,2.9)   [2,2.9)  
##  [92] [2.9,3.2) [2,2.9)   [2,2.9)   [2,2.9)   [2.9,3.2) [2.9,3.2) [2.9,3.2)
##  [99] [2,2.9)   [2,2.9)   [3.2,4.4] [2,2.9)   [2.9,3.2) [2.9,3.2) [2.9,3.2)
## [106] [2.9,3.2) [2,2.9)   [2.9,3.2) [2,2.9)   [3.2,4.4] [3.2,4.4] [2,2.9)  
## [113] [2.9,3.2) [2,2.9)   [2,2.9)   [3.2,4.4] [2.9,3.2) [3.2,4.4] [2,2.9)  
## [120] [2,2.9)   [3.2,4.4] [2,2.9)   [2,2.9)   [2,2.9)   [3.2,4.4] [3.2,4.4]
## [127] [2,2.9)   [2.9,3.2) [2,2.9)   [2.9,3.2) [2,2.9)   [3.2,4.4] [2,2.9)  
## [134] [2,2.9)   [2,2.9)   [2.9,3.2) [3.2,4.4] [2.9,3.2) [2.9,3.2) [2.9,3.2)
## [141] [2.9,3.2) [2.9,3.2) [2,2.9)   [3.2,4.4] [3.2,4.4] [2.9,3.2) [2,2.9)  
## [148] [2.9,3.2) [3.2,4.4] [2.9,3.2)
## attr(,"discretized:breaks")
## [1] 2.0 2.9 3.2 4.4
## attr(,"discretized:method")
## [1] frequency
## Levels: [2,2.9) [2.9,3.2) [3.2,4.4]
intervals <- discretize(iris$Sepal.Width, method="cluster", breaks=3)
print(intervals)
##   [1] [3.28,4.4]  [2.69,3.28) [2.69,3.28) [2.69,3.28) [3.28,4.4]  [3.28,4.4] 
##   [7] [3.28,4.4]  [3.28,4.4]  [2.69,3.28) [2.69,3.28) [3.28,4.4]  [3.28,4.4] 
##  [13] [2.69,3.28) [2.69,3.28) [3.28,4.4]  [3.28,4.4]  [3.28,4.4]  [3.28,4.4] 
##  [19] [3.28,4.4]  [3.28,4.4]  [3.28,4.4]  [3.28,4.4]  [3.28,4.4]  [3.28,4.4] 
##  [25] [3.28,4.4]  [2.69,3.28) [3.28,4.4]  [3.28,4.4]  [3.28,4.4]  [2.69,3.28)
##  [31] [2.69,3.28) [3.28,4.4]  [3.28,4.4]  [3.28,4.4]  [2.69,3.28) [2.69,3.28)
##  [37] [3.28,4.4]  [3.28,4.4]  [2.69,3.28) [3.28,4.4]  [3.28,4.4]  [2,2.69)   
##  [43] [2.69,3.28) [3.28,4.4]  [3.28,4.4]  [2.69,3.28) [3.28,4.4]  [2.69,3.28)
##  [49] [3.28,4.4]  [3.28,4.4]  [2.69,3.28) [2.69,3.28) [2.69,3.28) [2,2.69)   
##  [55] [2.69,3.28) [2.69,3.28) [3.28,4.4]  [2,2.69)    [2.69,3.28) [2.69,3.28)
##  [61] [2,2.69)    [2.69,3.28) [2,2.69)    [2.69,3.28) [2.69,3.28) [2.69,3.28)
##  [67] [2.69,3.28) [2.69,3.28) [2,2.69)    [2,2.69)    [2.69,3.28) [2.69,3.28)
##  [73] [2,2.69)    [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28)
##  [79] [2.69,3.28) [2,2.69)    [2,2.69)    [2,2.69)    [2.69,3.28) [2.69,3.28)
##  [85] [2.69,3.28) [3.28,4.4]  [2.69,3.28) [2,2.69)    [2.69,3.28) [2,2.69)   
##  [91] [2,2.69)    [2.69,3.28) [2,2.69)    [2,2.69)    [2.69,3.28) [2.69,3.28)
##  [97] [2.69,3.28) [2.69,3.28) [2,2.69)    [2.69,3.28) [3.28,4.4]  [2.69,3.28)
## [103] [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28) [2,2.69)    [2.69,3.28)
## [109] [2,2.69)    [3.28,4.4]  [2.69,3.28) [2.69,3.28) [2.69,3.28) [2,2.69)   
## [115] [2.69,3.28) [2.69,3.28) [2.69,3.28) [3.28,4.4]  [2,2.69)    [2,2.69)   
## [121] [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28) [3.28,4.4]  [2.69,3.28)
## [127] [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28) [3.28,4.4] 
## [133] [2.69,3.28) [2.69,3.28) [2,2.69)    [2.69,3.28) [3.28,4.4]  [2.69,3.28)
## [139] [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28) [2.69,3.28)
## [145] [3.28,4.4]  [2.69,3.28) [2,2.69)    [2.69,3.28) [3.28,4.4]  [2.69,3.28)
## attr(,"discretized:breaks")
## [1] 2.000000 2.691466 3.278481 4.400000
## attr(,"discretized:method")
## [1] cluster
## Levels: [2,2.69) [2.69,3.28) [3.28,4.4]
disc_interval <- discretize(iris$Sepal.Width, method = "fixed", breaks = c(2,3,4,5))
print(disc_interval)
##   [1] [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [3,4) [3,4) [3,4)
##  [13] [3,4) [3,4) [4,5] [4,5] [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4)
##  [25] [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [4,5] [4,5] [3,4) [3,4)
##  [37] [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4)
##  [49] [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [2,3) [2,3) [3,4) [2,3) [2,3) [2,3)
##  [61] [2,3) [3,4) [2,3) [2,3) [2,3) [3,4) [3,4) [2,3) [2,3) [2,3) [3,4) [2,3)
##  [73] [2,3) [2,3) [2,3) [3,4) [2,3) [3,4) [2,3) [2,3) [2,3) [2,3) [2,3) [2,3)
##  [85] [3,4) [3,4) [3,4) [2,3) [3,4) [2,3) [2,3) [3,4) [2,3) [2,3) [2,3) [3,4)
##  [97] [2,3) [2,3) [2,3) [2,3) [3,4) [2,3) [3,4) [2,3) [3,4) [3,4) [2,3) [2,3)
## [109] [2,3) [3,4) [3,4) [2,3) [3,4) [2,3) [2,3) [3,4) [3,4) [3,4) [2,3) [2,3)
## [121] [3,4) [2,3) [2,3) [2,3) [3,4) [3,4) [2,3) [3,4) [2,3) [3,4) [2,3) [3,4)
## [133] [2,3) [2,3) [2,3) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [3,4)
## [145] [3,4) [3,4) [2,3) [3,4) [3,4) [3,4)
## attr(,"discretized:breaks")
## [1] 2 3 4 5
## attr(,"discretized:method")
## [1] fixed
## Levels: [2,3) [3,4) [4,5]

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

Метод interval (Равная ширина интервала): Создает интервалы одинаковой ширины, но не учитывает частоту значений. Подходит, когда нужно равномерно распределить данные по категориям.

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

Метод cluster (Кластеризация): Разделяет данные на основе кластеров, что помогает выделить естественные группы. Подходит для поиска скрытых паттернов в данных.

Метод fixed (Заданные границы): Позволяет вручную задать границы категорий. Используется, когда известны важные точки разделения, но не учитывает частоту значений.

Выбор метода зависит от цели анализа:

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

Задание 4

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)
##  1. run of importance source...
##  2. run of importance source...
##  3. run of importance source...
##  4. run of importance source...
##  5. run of importance source...
##  6. run of importance source...
##  7. run of importance source...
##  8. run of importance source...
##  9. run of importance source...
##  10. run of importance source...
## After 10 iterations, +0.18 secs:
##  confirmed 5 attributes: Day, Ozone, Solar.R, Temp, Wind;
##  still have 1 attribute left.
##  11. run of importance source...
##  12. run of importance source...
##  13. run of importance source...
##  14. run of importance source...
##  15. run of importance source...
##  16. run of importance source...
##  17. run of importance source...
##  18. run of importance source...
##  19. run of importance source...
##  20. run of importance source...
##  21. run of importance source...
##  22. run of importance source...
##  23. run of importance source...
##  24. run of importance source...
##  25. run of importance source...
##  26. run of importance source...
##  27. run of importance source...
##  28. run of importance source...
##  29. run of importance source...
##  30. run of importance source...
##  31. run of importance source...
##  32. run of importance source...
##  33. run of importance source...
##  34. run of importance source...
##  35. run of importance source...
##  36. run of importance source...
##  37. run of importance source...
##  38. run of importance source...
##  39. run of importance source...
##  40. run of importance source...
##  41. run of importance source...
##  42. run of importance source...
##  43. run of importance source...
##  44. run of importance source...
##  45. run of importance source...
##  46. run of importance source...
##  47. run of importance source...
## After 47 iterations, +0.77 secs:
##  confirmed 1 attribute: Month;
##  no more attributes left.
print(result)
## Boruta performed 47 iterations in 0.767771 secs.
##  6 attributes confirmed important: Day, Month, Ozone, Solar.R, Temp and
## 1 more;
##  No attributes deemed unimportant.
boxplot(airquality$Wind ~ airquality$OzoneLevel,main = "Wind and Ozone Level",xlab = "Ozone Level", ylab = "Wind",col = c("red", "blue"))

График 1

Данный график показывает, что при высоком уровне озона скорость ветра ниже, чем при низком его уровне. И при низком, и при высоком уровне озона имеется большие отклонения от медианы что показывает на нестабильность скорости ветра.

boxplot(airquality$Temp ~ airquality$OzoneLevel,main = "Temp and Ozone Level",xlab = "Ozone Level", ylab = "Temp",col = c("red", "blue"))

График 2

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