El objetivo de nuestro trabajo consiste en comparar el desempeño de dos clases de discos duros (0: SDD, 1: HDD), para ello se dispone de una base de datos con las variables: Tiempo de respuesta (en segundos) y Carga del sistema (Número de consultas por minuto).
#Librerias
Antes de comenzar con el trabajo decidimos realizar la lectura de las librerias.
library(readr)
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v dplyr 1.0.7
## v tibble 3.1.6 v stringr 1.4.0
## v tidyr 1.1.4 v forcats 0.5.1
## v purrr 0.3.4
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(ggplot2)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.1.3
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.1.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.1.3
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.1.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tseries)
## Warning: package 'tseries' was built under R version 4.1.3
library(fImport)
## Warning: package 'fImport' was built under R version 4.1.3
## Loading required package: timeDate
## Loading required package: timeSeries
##
## Attaching package: 'timeSeries'
## The following object is masked from 'package:zoo':
##
## time<-
library(nortest)
Datos<- read_tsv("C:/Users/Pc User/Documents/Taller general 2 de R/DatosTaller.txt")
## Rows: 25 Columns: 3
## -- Column specification --------------------------------------------------------
## Delimiter: "\t"
## dbl (3): Conf, Carga, Tiempo
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Antes de desarollar el primer punto, empezamos con la lectura de datos, y así conocer un poco sobre ella.
View(Datos)
colnames(Datos)
## [1] "Conf" "Carga" "Tiempo"
dim(Datos)
## [1] 25 3
str(Datos)
## spec_tbl_df [25 x 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Conf : num [1:25] 1 0 1 0 1 1 0 0 0 1 ...
## $ Carga : num [1:25] 1 2 2.4 3.1 4 4.3 5.8 6.6 7.5 8 ...
## $ Tiempo: num [1:25] 0.9 0.3 2 0.8 2.7 2.6 2.5 3.2 3.7 3.9 ...
## - attr(*, "spec")=
## .. cols(
## .. Conf = col_double(),
## .. Carga = col_double(),
## .. Tiempo = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
summary(Datos)
## Conf Carga Tiempo
## Min. :0.00 Min. : 1.000 Min. :0.300
## 1st Qu.:0.00 1st Qu.: 3.100 1st Qu.:1.500
## Median :1.00 Median : 5.800 Median :3.200
## Mean :0.52 Mean : 5.648 Mean :2.828
## 3rd Qu.:1.00 3rd Qu.: 8.000 3rd Qu.:3.900
## Max. :1.00 Max. :10.200 Max. :5.800
Conclusión: de acuerdo a la lectura de datos,sabemos que hay 3 variables: Conf, Carga y Tiempo. Además, tenemos 25 observaciones.
Seleccionamos las variables de interes para realizar el trabajo y declaramos los niveles correctos de la variable tipo factor Conf.
Datos <- dplyr::select(Datos, Conf, Carga, Tiempo)
Conf<-Datos$Conf
Carga<-Datos$Carga
Tiempo<-Datos$Tiempo
level_Conf <- c("1"="HDD","0"="SDD")
Datos <- transform(Datos,
Conf=factor(dplyr::recode(Conf, !!!level_Conf)))
view(Datos)
Resulta que, para graficar la relación entre el tiempo de respuesta y la carga de trabajo diferenciados los dos tipos de disco duro, SDD y HDD, debemos de hacer un subset de los datos.
DatosHDD <- subset(Datos, Conf=="HDD")
nrow(DatosHDD)
## [1] 13
DatosSDD<- subset(Datos, Conf=="SDD")
nrow(DatosSDD)
## [1] 12
ggplot(Datos, aes(Carga, Tiempo)) +
geom_point(colour="chocolate3", shape=21, size = 4,
aes(fill = factor(Conf)))+scale_fill_manual(values=c("chocolate3", "cyan4"))
Con lo anterior, se pudo evidenciar la distribución de los 25 puntos u observaciones en toda la base. Además, se observa una relación lineal cuando se tiene en cuenta ambos discos, SDD y HDD.
ggplot(DatosHDD, aes(Carga, Tiempo)) +
geom_point(colour="chocolate3", shape=21, size = 4,
aes(fill = factor(Conf)))+scale_fill_manual(values=c("chocolate3", "cyan4"))
Podemos ver que en la relación entre el tiempo de respuesta y la carga de trabajo diferenciado a través del disco duro HDD, es una relación lineal. En esta primera gráfica se nota la distribución de las 13 observaciones.
ggplot(DatosSDD, aes(Carga, Tiempo)) +
geom_point(colour="blue", shape=21, size = 4,
aes(fill = factor(Conf)))+scale_fill_manual(values=c("blue", "cyan4"))
En el caso del disco SDD, podemos ver la relación entre el tiempo de respuesta y la carga de trabajado siendo esta una relación lineal. Además, se logra observar la distribución de los 12 datos.
Para determinar la correlación entre las variables primero vamos a observar qué tipo de correlación debe aplicarse observando la normalidad de las variables, si ambas presentan normalidad se realizará la prueba de Pearson pero si una de las dos variables es asimetrica entonces se realiza la prueba de Spearman.
#H0: La variable presenta normalidad
#H1: La variable no presenta normalidad
shapiro.test(Carga)
##
## Shapiro-Wilk normality test
##
## data: Carga
## W = 0.9373, p-value = 0.1282
shapiro.test(Tiempo)
##
## Shapiro-Wilk normality test
##
## data: Tiempo
## W = 0.96267, p-value = 0.4703
En este caso, ambos resultados presentan un p-valor mayor a 0.05 por lo cual no hay suficiente información para rechazar la hipotesis nula, es decir, las variables no presentan problemas de normalidad y se puede continuar con la realización de la prueba de Pearson.
cor.test(x= DatosHDD$Carga, y= DatosHDD$Tiempo, alternative = "less", method = "pearson" )
##
## Pearson's product-moment correlation
##
## data: DatosHDD$Carga and DatosHDD$Tiempo
## t = 12.024, df = 11, p-value = 1
## alternative hypothesis: true correlation is less than 0
## 95 percent confidence interval:
## -1.0000000 0.9871297
## sample estimates:
## cor
## 0.9640003
cor.test(x= DatosSDD$Carga, y= DatosSDD$Tiempo, alternative = "less", method = "pearson" )
##
## Pearson's product-moment correlation
##
## data: DatosSDD$Carga and DatosSDD$Tiempo
## t = 28.334, df = 10, p-value = 1
## alternative hypothesis: true correlation is less than 0
## 95 percent confidence interval:
## -1.0000000 0.9979347
## sample estimates:
## cor
## 0.9938293
Tanto para el disco duro HDD como la el SDD las variables tiempo de respuesta y la carga de trabajo presentan una relación lineal positiva. Para el caso de HDD el test de correlación de Pearson evidencia una relación positiva casi perfecta ya que equivale a 0.96, patrón que se repite con el disco duro SDD donde la correlación entre las variables es de 0.99 lo cual implica una dependencia alta entre ellas.
ggplot(data=Datos, mapping= aes(x=Carga)) +
geom_histogram(aes(y= ..density..), color= "black", fill="gray") +
stat_function(fun= dnorm, args= list(mean= mean(Datos$Carga), sd= sd(Datos$Carga)))+
geom_density(fill="black", alpha=0.2)+
theme_bw()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(data=Datos, mapping= aes(x=Tiempo)) +
geom_histogram(aes(y= ..density..), color= "black", fill="gray") +
stat_function(fun= dnorm, args= list(mean= mean(Datos$Tiempo), sd= sd(Datos$Tiempo)))+
geom_density(fill="black", alpha=0.2)+
theme_bw()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
En estos histograma de densidad, se puede observar que la mayoría de valores de la variable carga presentan la misma frecuencia excepto cuando toma el valores cercanos a 2, pues en este caso se presenta un efecto modal.Para la variable tiempo ocurre algo similar donde la mayoría de los datos tienen la misma densidad, pero, hay excepciones de valores que se repiten más veces.
ggplot(data=Datos, mapping= aes(x=Carga)) +
geom_boxplot()+
theme_bw()
ggplot(data=Datos, mapping= aes(x=Tiempo)) +
geom_boxplot()+
theme_bw()
De acuerdo a los diagramas de caja, se evidencia que no hay datos atípicos, que la mediana de la carga de trabajo está alrededor de 6 y la mediana del tiempo de respuesta en 3.2.
ggplot(data=Datos, mapping= aes(x=Carga)) +
geom_dotplot(dotsize=0.3, binwidth=1)+
theme_bw()
ggplot(data=Datos, mapping= aes(x=Tiempo)) +
geom_dotplot(dotsize=0.3, binwidth=1)+
theme_bw()
Los dotplot muestran que hay solo una observación con valores de carga alrededor de 10 y que la mayoría de disco duro tiene tiempos cercanos o iguales a 4.0.
qqPlot(Datos$Carga, pch=20)
## [1] 1 13
qqPlot(Datos$Tiempo, pch=20)
## [1] 25 2
Por último, los gráficos de cuantiles muestras que aunque ambas variables no muestran un ajuste perfecto sí hay un buen ajuste el cual se mantiene dentro de los límites.
\(H0 :La\ distribución \ es \ normal\)
\(H1: La\ distribución\ no\ es\ normal\)
shapiro.test(DatosHDD$Tiempo)
##
## Shapiro-Wilk normality test
##
## data: DatosHDD$Tiempo
## W = 0.89801, p-value = 0.1256
shapiro.test(DatosHDD$Carga)
##
## Shapiro-Wilk normality test
##
## data: DatosHDD$Carga
## W = 0.92028, p-value = 0.2531
for (i in DatosHDD) {
x <- rnorm(i)
qqnorm(x, main=bquote(~ DatosHDD$Tiempo == .(i)))
qqline(x) # Para agregar la linea de referencia
}
for (i in DatosHDD) {
x <- rnorm(i)
qqnorm(x, main=bquote(~ DatosHDD$Carga == .(i)))
qqline(x) # Para agregar la linea de referencia
}
\(H0 :La\ distribución \ es \ normal\)
\(H1: La\ distribución\ no\ es\ normal\)
shapiro.test(DatosSDD$Tiempo)
##
## Shapiro-Wilk normality test
##
## data: DatosSDD$Tiempo
## W = 0.94783, p-value = 0.6055
shapiro.test(DatosSDD$Carga)
##
## Shapiro-Wilk normality test
##
## data: DatosSDD$Carga
## W = 0.94901, p-value = 0.6225
for (i in DatosSDD) {
x <- rnorm(i)
qqnorm(x, main=bquote(~ DatosSDD$Tiempo == .(i)))
qqline(x) # Para agregar la linea de referencia
}
for (i in DatosSDD) {
x <- rnorm(i)
qqnorm(x, main=bquote(~ DatosSDD$Carga == .(i)))
qqline(x) # Para agregar la linea de referencia
}
En ambos test de normalidad de las variables Tiempo y Carga y los discos duros SDD y HDD, se evidencia que son normales dado que el p valor es mayor a los resultados obtenidos.
shapiro.test(Datos$Tiempo)
##
## Shapiro-Wilk normality test
##
## data: Datos$Tiempo
## W = 0.96267, p-value = 0.4703
shapiro.test(Datos$Carga)
##
## Shapiro-Wilk normality test
##
## data: Datos$Carga
## W = 0.9373, p-value = 0.1282
La prueba de Shapiro nos da un p valor de 0.47 para el tiempo y 0.13 para la carga por lo cual no podemos rechazar la hipótesis nula que sostiene que la distribución es normal.
cor.test(x= Datos$Carga, y= Datos$Tiempo, alternative = "less", method = "pearson" )
##
## Pearson's product-moment correlation
##
## data: Datos$Carga and Datos$Tiempo
## t = 11.783, df = 23, p-value = 1
## alternative hypothesis: true correlation is less than 0
## 95 percent confidence interval:
## -1.00000 0.96272
## sample estimates:
## cor
## 0.9262224
Por el lado de la correlación, el test de Pearson nos muestra que estas variables tienen una relación positiva de 0.93.
mod1<- lm(Tiempo ~ Carga, Datos)
summary(mod1)
##
## Call:
## lm(formula = Tiempo ~ Carga, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.16824 -0.40281 -0.03945 0.43541 1.07627
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.04838 0.26321 0.184 0.856
## Carga 0.49214 0.04177 11.783 3.18e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5837 on 23 degrees of freedom
## Multiple R-squared: 0.8579, Adjusted R-squared: 0.8517
## F-statistic: 138.8 on 1 and 23 DF, p-value: 3.177e-11
En el modelo 1 la variable explicativa (x) es la carga de trabajo y la variable explicada (y) es tiempo de respuesta, el modelo presenta una bondad de ajuste de 0.8275, lo cual significa que el modelo explica el 82,75% de los cambios ocurridos en Y, en este caso, el tiempo. De manera general, el modelo presenta un p-value de 2.541e-07 que frente a un p-valor<0.05, se rechaza la Ho de que el modelo NO es significativo en su conjunto.En cuanto al resiultado de las estimaciones obtenemos que la carga es significativa con un nivel de significancia del 1% por lo que se puede decir que ante un cambio marginal en la carga el tiempo aumenta en 0,49 unidades, mientras que el intercepto no dio significativo.
mod2<-lm(Tiempo~ Carga+ Conf + Carga*Conf, Datos)
summary(mod2)
##
## Call:
## lm(formula = Tiempo ~ Carga + Conf + Carga * Conf, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.68547 -0.11333 0.06881 0.15302 0.41807
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.88842 0.16323 5.443 2.12e-05 ***
## Carga 0.36246 0.02555 14.185 3.14e-12 ***
## ConfSDD -2.26391 0.26520 -8.536 2.86e-08 ***
## Carga:ConfSDD 0.35734 0.04227 8.454 3.36e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2844 on 21 degrees of freedom
## Multiple R-squared: 0.9692, Adjusted R-squared: 0.9648
## F-statistic: 220.2 on 3 and 21 DF, p-value: 5.042e-16
El modelo presenta una bondad de ajuste de 0.9569, lo cual significa que el modelo explica el 95,69% de las variaciones en la variable Y, en este caso, el tiempo. Por otro lado, tenemos que el modelo NO es significativo en su conjunto. Cuando todas las variables explicativas toman un valor de cero el tiempo de respuesta de los discos toma un valor de 0.89, cuando la carga tiene un cambio marginal y todo lo demás se mantiene constante el tiempo aumenta en 0.36, cuando el disco duro es SDD el tiempo de carga disminuye en 2.26 frente a si fuera un disco duro HDD y cuando se utiliza el disco duro SDD un cambio marginal en la carga genera un aumento en el tiempo de 0.357.
Ecuación modelo 2
\(Y \sim \beta_0 + Carga\beta_1 + Conf\beta_2 + (Carga*ConfSDD) + \epsilon\)
Reemplazando los valores:
Tiempo = 0.88842 + 0.36246 Carga - 2.26391 Conf + 0.35734CargaConf
ggplot(data = Datos) +
geom_point(aes(x= Carga, y=Tiempo, color= Conf)) +
geom_line(aes(x= Carga, y= predict(mod2), color= Conf))
#Punto 5. Comparación entre modelos
compareCoefs(mod1, mod2)
## Calls:
## 1: lm(formula = Tiempo ~ Carga, data = Datos)
## 2: lm(formula = Tiempo ~ Carga + Conf + Carga * Conf, data = Datos)
##
## Model 1 Model 2
## (Intercept) 0.0484 0.8884
## SE 0.2632 0.1632
##
## Carga 0.4921 0.3625
## SE 0.0418 0.0256
##
## ConfSDD -2.264
## SE 0.265
##
## Carga:ConfSDD 0.3573
## SE 0.0423
##
ANOVA
\(Ho: Los\ dos\ modelos\ tienen\ similar\ ajuste\) \(H1: El\ modelo2\ (con\ más\ elementos\ )\ presenta\ mejor\ en\ ajuste\ que\ el\ modelo\ 1\ (\ menos\ elementos).\)
anova(mod1, mod2)
## Analysis of Variance Table
##
## Model 1: Tiempo ~ Carga
## Model 2: Tiempo ~ Carga + Conf + Carga * Conf
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 23 7.8375
## 2 21 1.6990 2 6.1386 37.938 1.067e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La realización del test ANOVA nos permitió comparar el ajuste de nuestros modelos, y como resultado nos arroja un p-valor menor a 0.0001 por lo que es significativo, de tal forma podemos rechazar la hipótesis nula que plantea que los modelos tienen un ajuste similar, es decir, el modelo 2 que incluye la variable cualitativa configuración del disco presenta mejor ajuste que el que se limita a tener como variable explicativa la carga de trabajo.
Inspección de los residuos del mod1
x11()
par(mfrow=c(2,2))
plot(mod1)
Diagnostico de los residuos del mod2
x11()
par(mfrow=c(2,2))
plot(mod2)
#La comparación entre las gráficos de ambos residuales respaldan los resultados de la anova sobre la validez del modelo 2 sobre el modelo 1
Distribución de los errores: media
mean(residuals(mod2))
## [1] -2.942633e-17
Como resultado de calcular la media de los errores del modelo 2, obtenemos que su media es cercana a 0, por lo que podemos decir que tiene media cero.
Varianza constante
H0: Homocedasticidad
H1: Heterocedasticidad
bptest(mod2, studentize = FALSE)
##
## Breusch-Pagan test
##
## data: mod2
## BP = 2.8848, df = 3, p-value = 0.4097
La prueba de Breush-Pagan arroja un p-valor = 0.4097 > 0.05 lo que implica que se acepta la hipotesis nula de homocedasticidad
Normalidad:
H0: La variable presenta normalidad
H1: La variable no presenta normalidad
ad.test(residuals(mod2))
##
## Anderson-Darling normality test
##
## data: residuals(mod2)
## A = 0.41309, p-value = 0.3132
La prueba de normalidad de Anderson-Darling muestra un p-valor = 0.3132 > 0.05 indicando que existe normalidad en los terminos de error
Autocorrelación:
H0: Ausencia de autocorrelación
H1: Autocorrelación
dwtest(mod2, alternative = "two.sided", iterations = 1000)
##
## Durbin-Watson test
##
## data: mod2
## DW = 1.3285, p-value = 0.06843
## alternative hypothesis: true autocorrelation is not 0
La Prueba de Durbin-Watson arroja un p-valor = 0.06843 > 0.05 indicando que no existe un problema de autocorrelacion
Para los residuales del modelo 1 podemos observar que se ajustan en su mayoría a la recta de 45° por lo que no exhiben problemas de normalidad, además tienen una varianza constante, están alrededor de 0 y no hay datos influyentes. Para el modelo 2 los residuales presentan una curvatura en la esquina inferior izquierda lo que equivale a que no presenten una distribución normal, además, tiene un dato influyente que es el 13 debido a que cae fuera de la distancia Cook.