Mi nombre es Gabriela Borja, tengo 21 años y estudio Ingenieria en Biotecnologia en la Universidad de las Fuerzas Armadas - ESPE. Me gustaria dedicarme a la Biotecnología humana, ya que la salud es un area que me llama mucho la atención, aunque tambien me atrae la Biotecnología Vegetal. Tras culminar mis estudios espero seguir una maestria fuera del paíss. En mis tiempos libres me gusta hacer yoga y salir a correr con mis perritos, me gustan las comedias romanticas.
Gaby
Mi nombre es Pamela Montatixe, tengo 22 años, estudio en la Universidad de las Fuerzas Armadas “ESPE” la carrera de Ingeniería en Biotecnología, me gusta realizar deporte, pasar tiempo en familia y mis principales metas son graduarme y realizar una especialización en el campo al que tenga mayor afinidad.
Mi nombre es Silvana Romo, estudio Ingeniería en Biotecnología por que me gusta la química y la biología y me encantaría aplicar todos mis conocimientos en el area de alimentos. Mi pasión es el baile, ya que mediante este se pueden expresar muchas emociones. Uno de mis hobbies es realizar postres y manualidades.
Empleados es la base de datos que contiene tres variables, Edad que es un variable discreta, Peso y Altura que son variables continuas y una variable de tipo factor o categórica que es sexo representada con los niveles Hombre y Mujer.
Empleados exitosos
library(readxl)
empleados <- read_excel("empleados.xls")
empleados$Sexo<- as.factor(empleados$Sexo)
levels(empleados$Sexo)
[1] "Hombre" "Mujer"
library(readr)
library(ggplot2)
library(corrplot)
library(mlbench)
library(Amelia)
library(plotly)
library(reshape2)
library(caret)
library(caTools)
library(dplyr)
empleados<-data.frame(empleados)
str(empleados)
'data.frame': 99 obs. of 4 variables:
$ Edad : num 20 18 19 19 21 18 20 18 19 18 ...
$ Altura: num 178 168 194 159 177 180 180 168 190 187 ...
$ Peso : num 82 87 94 62 78 53 62 68 82 79 ...
$ Sexo : Factor w/ 2 levels "Hombre","Mujer": 1 1 1 2 1 1 2 1 1 2 ...
head(empleados)
summary(empleados$Edad)
Min. 1st Qu. Median Mean 3rd Qu. Max.
18.00 18.00 19.00 20.52 22.00 51.00
summary(empleados$Altura)
Min. 1st Qu. Median Mean 3rd Qu. Max.
159 171 178 177 182 200
summary(empleados$Peso)
Min. 1st Qu. Median Mean 3rd Qu. Max.
51.00 67.00 72.00 74.76 82.00 120.00
summary(empleados$Sexo)
Hombre Mujer
55 44
missmap(empleados,col=c('purple4','plum2'),y.at=1,y.labels='',legend=TRUE)
#legend=TRUE
#Permite quela infografia se ubique a la derecha del grafico
Se puede visualizar que en la base de datos empleados no hay datos perdidos.
boxplot(Altura~Sexo,empleados,horizontal=T, col="palegreen", main="Diagrama de caja 'Altura'")
El diagrama de caja anterior indica que no existen valores atípicos para las variables hombre y mujer respecto a la Altura. Todas las mujeres tienen al menos una altura de 187 cm y todos los hombres tienen una altura de 200. cm. El 75% de las mujeres tienen una altura de 173 cm o más, mientras que el 75% de los hombres tienen una altura de 171 cm o más.
boxplot(Peso~Sexo,empleados,horizontal=T, col="pink", main="Diagrama de caja 'Peso'")
En el diagrama de caja que se muestra en el anterior gráfico se visualiza los valores atípicos del peso para hombres y mujeres. El 75% de las mujeres pesa 65 kg o más, mientras que el 75% de los hombres pesa 69 kg o más.
gbd<-data.frame(table(empleados$Edad))
mi.color.23 <-colorRampPalette(c("greenyellow", "orange1", "yellow1"))
#Genero del diagrama de barras
ggplot(gbd,aes(x=Var1, y=Freq) ) +
geom_bar(fill=mi.color.23(12), stat="identity") +
labs(title="Diagrama de barras",subtitle="Edad")+ #Título y subtítulo
theme_update(plot.title = element_text(hjust = 0.5))+ #Permite centrar el título y subtítulo
theme_update(plot.subtitle = element_text(hjust = 0.5))
En el diagrama de barras podemos observar que 36 de los empleados tienen 18 años que corresponde al 33,36%, el 61% de los empleados tienen más de 18 años y menos de 30 años, y solo el 2,02% tiene mas de 30 años.
Los diagramas de correlación son una gran forma de explorar datos y ver si hay algún término de interacción. En el diagrama de correlación los colores fríos representan una correlacion lineal directa (r=1),los colores cálidos representan una correlacion lineal inversa(r= -1), y los colores tenues indican que no hay una correlacion lineal (r=0).
correlacion <-corrplot(cor(select(empleados,-Sexo)))
correlacion
Edad Altura Peso
Edad 1.00000000 0.09399014 0.2553284
Altura 0.09399014 1.00000000 0.5439601
Peso 0.25532839 0.54396008 1.0000000
#La correlacion es alta o buena solo cuando es lineal cuando se acerca a una recta siendo directa.
#Peso es dependiente y las demas independiente
Entre la edad y la altura no hay una correlación lineal ya que el valor es cercano a cero igual entre la edad y el peso. Mientras que entre el peso y la altura hay una mejor correlación, pero esta no es directa o lineal ya que tienen un valor de 0.544.
# Permite visualizar la distribucion de la variable independiente
empleados %>%
ggplot(aes(Peso)) +
stat_density(fill="hotpink", col="mediumvioletred") +
theme_bw()
Revela que las densidades máximas de Peso están entre 65 y 80.
ggplotly(empleados %>%
ggplot(aes(Peso)) +
stat_density(fill="olivedrab1", col="olivedrab4") +
theme_bw())
Revela que las densidades máximas de Peso están entre 65 y 80.
Muestre el efecto de las variables independientes con respecto a la variable dependiente.
empleados %>%
select(c(Edad, Altura,Peso)) %>%
melt(id.vars = "Peso") %>%
ggplot(aes(x = value, y = Peso, colour = variable)) +
geom_point(alpha = 0.7) +
stat_smooth(aes(colour = " ")) +
facet_wrap(~variable, scales = "free", ncol = 2) +
labs(x = "Variable Value", y = "peso") +
theme_minimal()
La variable dependiente Peso está en mayor correlación o interacción con la variable altura ya que la dispersión de los datos es menor en comparación con la variable edad.
Generamos dos variables: Peso es la variable respuesta (continua) y Sexo es la variable factor (establece los grupos de interés):
Exploramos los datos de la muestra:
boxplot(empleados$Peso ~ empleados$Sexo, col = c("deeppink1", "greenyellow"), ylab = "Peso de los empleados")
#Boxplot de Peso en funcion de una varibale tipo factor(colores)
#Se generan el numero de diagramas de cajas que esfecifique en la variable factor.
En el diagrama de caja se compara dos categorias de una variable mostrando la distribución por pesos, se puede ver que los valores estan cercanos, casi alineados, se dice que son iguales debido a que estan dentro de un mismo rango, los pesos fluctuan dependiendo del sexo, según el ancho de la caja existe mayor dispersión para los hombres y según la media las mujeres tienen un peso promedio menor que el de los varones.
tapply(empleados$Peso, empleados$Sexo, mean)
Hombre Mujer
76.94545 72.02273
#Aplica una tabla asignandole la media a Peso respecto a el sexo.
er = aov( lm(empleados$Peso ~ empleados$Sexo) )
El modelo lineal busca la relacion entre las variables, insectos es variable de tipo continua y colores variable tipo factor. Cuando se aplica el modelo de regresión lineal lm, genera el analisis anova(aov)
summary(er)
Df Sum Sq Mean Sq F value Pr(>F)
empleados$Sexo 1 592 592.4 3.533 0.0632 .
Residuals 97 16266 167.7
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
#Cuando hay *** es significativa la variable colores, cuanto a las medias.
#Las medias es significativa es por que no son iguales, el valor se acerca a cero.
Ya qe el valor se acerca a uno las medias son iguales
names(er)
[1] "coefficients" "residuals" "effects" "rank" "fitted.values" "assign"
[7] "qr" "df.residual" "contrasts" "xlevels" "call" "terms"
[13] "model"
#Muestra los argumentos con los que se genera el modelo.
qf(0.05, 2-1, 99-2, lower.tail = F)
[1] 3.939126
#Usamos qf para tener la prueba(N.C, I-1, n-1)
# si el valor de tabla es > que teorico(qf) se rechaza Ho (iguales): entonces son las medias distintas.
#LAS MEDIAS SON IGUALES
Valores del estadístico < 3.939126, por lo tanto estarán incluidos dentro de la regón de aceptación es decir se acepta la Hipótesis nula (las medias son iguales) y se rechaza la hipótesis alternativa
#length(t(empleados %>% filter(Sexo=="Hombre") %>% select(Sexo)))
mediaP <- mean(empleados$Peso[empleados$Sexo =="Hombre"])
valor_tP <- pt(0.05/2, 99 - 2)
spP <- sqrt(167.7) #desviacion típica de la varianza muestral común
eeP <- valor_tP * (spP/ sqrt(55)) #error de estimación (55) es el n de cada grupo.
mediaP
[1] 76.94545
límite superior del intervalo de confianza de la media del peso de los empleados que son hombres
mediaP + eeP
[1] 77.83591
límite inferior del intervalo de confianza de la media del peso de los empleados que son hombres
mediaP - eeP
[1] 76.055
El peso de los empleados que son hombres con un 95 % del nivel de confianza esta entre 76.055 y 77.83591 [kg].
#length(t(empleados %>% filter(Sexo=="Hombre") %>% select(Sexo)))
mediaP1 <- mean(empleados$Peso[empleados$Sexo =="Mujer"])
valor_tP1 <- pt(0.05/2, 99 - 2)
spP1 <- sqrt(167.7) #desviación tÃ<U+FFFD>pica de la varianza muestral común
eeP1 <- valor_tP1 * (spP1/ sqrt(44)) #error de estimación (6) es el n de cada grupo.
mediaP1
[1] 72.02273
límite superior del intervalo de confianza de la media de insectos capturados para las trampas amarillas
mediaP1 + eeP1
[1] 73.01828
limite inferior del intervalo de confianza de la media de insectos capturados para las trampas amarillas
mediaP1 - eeP1
[1] 71.02717
El peso de los empleados que son mujeres con un 95 % del nivel de confianza esta entre 71.02717 y 73.01828[kg].
intervalsP = TukeyHSD(er)
intervalsP
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = lm(empleados$Peso ~ empleados$Sexo))
$`empleados$Sexo`
diff lwr upr p adj
Mujer-Hombre -4.922727 -10.12103 0.2755793 0.063177
#Nos ayuda a ver entre cuales hay diferencia.
#son diferentes si p adj es cercano a cero, si es cercano a uno son iguales.
plot(intervalsP)
#Si un intervalo contiene al cero son estadisticamente iguales.
Se observa que se acerca a cero por lo tanto son estadisticamente iguales
A partir de los residuos del modelo comprobaremos si el modelo ANOVA es adecuado. Los supuestos que se deben cumplir son tres: independencia, homocedasticidad y normalidad.
color_1 <-colorRampPalette(c("magenta", "skyblue1", "magenta"))
plot(er$residuals,main = "Prueba de independencia" ,pch=20,cex = 2, col=color_1(120), ylab = "Residuos", xlab = " ")
#fm guardamos el anova.
#La grafica mas dispersa mejor, hay menor correlacion, cumplen con uno de los supuestos de los residuos.
Se puede ver que los datos no estan dispersos por lo que están correlacionados.
Los gráficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos: Ya sabemos que las medias son iguales. Ahora la varianza es diferente o igual?
summary(er$residuals)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-25.945 -7.523 -1.945 0.000 6.516 47.977
#Homocedastidad: igual varianza.
boxplot(er$residuals, col="palegreen", main="Diagrama de caja Residuos")
La caja está definida por el segundo y tercer cuartil, mientras que los bigotes por el primero y el cuarto, por lo que dentro de la caja tenemos el 50 % de los datos de la muestra, como casi son del mismo ancho entonces se dice que la varianza es igual.
color_2 <-colorRampPalette(c("orchid1", "darkviolet", "dodgerblue"))
hist(er$residuals, main = "Histograma de Residuos", ylab = "Frecuencia", xlab = "Residuales", col=color_2(12))
#Nos dice si se aproxima a una campana de Gauss.
Se puede observar una simetría en la dispersión de los valores por lo que se aproxima a una disribución normal.
qqnorm(er$residuals, col="orange")
qqline(er$residuals)
#Grafico cuantil cuantil, cuando en verdad son normales. No hay datos atÃ<U+FFFD>picos y casi están sobre la linea normal.
La mayoría de los datos se encuentran cerca de la diagonal entonces se puede decir que la distribución es normal.
Los gráficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos:
boxplot(er$residuals~empleados$Sexo, col = c("yellow", "blue"),main="Diagrama de Caja")
#Diferencia, la varianza a partir de los residuos.
#nos fijamos en el ancho de las cajas.
#La varianza de los grupos se obtiene a traves de los residuos.
En el gráfico se puede observar que tienen las medianas muy similares y al comparar el ancho de las cajas se puede afirmar la igualdad de varianzas entre hombres y mujeres.
desviacionesP <- tapply(er$residuals, empleados$Sexo, sd)
#Desv std por grupo.
Comparando la desviacion maxima con la minima obtenemos una orientacion sobre la falta de homocedasticidad (>2 aproximadamente)
max(desviacionesP) / min(desviacionesP)
[1] 1.140433
#si este valor es >2 no hay homocedasticidad, la varianza no es igual.
Ya que el valor es menor que 2 se afirma que existe homocedasticidad (las varianzas son iguales)
El test de Bartlett indica que no tenemos evidencia suficiente para rechazar la hipotesis nula (las varianzas son iguales)
bartlett.test(er$residuals ~ empleados$Sexo)
Bartlett test of homogeneity of variances
data: er$residuals by empleados$Sexo
Bartlett's K-squared = 0.80783, df = 1, p-value = 0.3688
#Test de Bartlett para homocedasticidad.
#p valor es > a 0.05 se rechaza la hipotesis nula, no hay homocedasticidad.
En este caso el p-valor es mayr que 0.05 por lo cual no hay sufciente evidencia para rechazar la hipótesis nula.
¿Que hipotesis contrasta la prueba de Kruskal-Wallis?
Ho: la variable respuesta es la misma en todas las poblaciones valoradas
Ha: la variable respuesta es mayor en alguna de las poblaciones
Cuando no se cumplen las hipotesis exigidas por el modelo ANOVA, es posible utilizar la prueba no paramétrica Kruskal-Wallis: ¿hay diferencias significativas entre las poblaciones?
kruskal.test(empleados$Peso, empleados$Sexo)
Kruskal-Wallis rank sum test
data: empleados$Peso and empleados$Sexo
Kruskal-Wallis chi-squared = 3.5706, df = 1, p-value = 0.05881
Indica cual es el estadistico de contraste, los grados de libertad, el p-valor correspondiente y cual seria el valor critico que definiria las regiones de aceptacion y rechazo con un nivel de significacion alfa = 0.05.
Bajo la Ho el estadistico de contraste H del test de Kruskal-Wallis se distribuye como una Chi-cuadrado de grados de libertad (I-1) (donde I es el número de grupos que disponemos). Asi obtenemos el cuantil buscado:
qchisq(0.05, 2-1, lower.tail = F)#Valor teorico
[1] 3.841459
#chi cuadrado es 3.5706 <3.84 se acepta la Ho.
Valores del estadístico < 3.841459 estarán incluidos en la región de aceptación. En nuetro caso 3.5706 es menor que el valor crítico obtenido,por lo cual se acepta la hipótesis nula, la variable respuesta es la misma en todas las poblaciones valoradas.
Si transformamos los datos de la variable respuesta, utilizando logaritmos y después aplicaramos el test de KrusKal-Wallis al logaritmo del número de insectos atrapados, ¿variarian los resultados del test estadistico?
kruskal.test(log(empleados$Peso), empleados$Sexo) #log para reducir escala de dispersión
Kruskal-Wallis rank sum test
data: log(empleados$Peso) and empleados$Sexo
Kruskal-Wallis chi-squared = 3.5706, df = 1, p-value = 0.05881
Los resultados son exactamente los mismos. No se producen variaciones porque el test de Kruskal-Wallis trabaja sobre rangos, es decir, sobre ordenaciones de los valores de la variable en cada uno de los grupos. Aunque realicemos una transformacion logaritmica, el orden entre los valores de la variable se mantiene y por lo tanto la transformacion no afecta a los resultados del test.
Permite dividir los datos en entrenamento y prueba de datos utilizando la biblioteca caTools. Lets split the data into train and test data using caTools library.
# establecer una semilla
set.seed(123) # (123) Puede ir cualquier numero
#Seccionar los datos , `split ()` asigna un booleano a una nueva columna basada en el SplitRatio especificado.
split <- sample.split(empleados,SplitRatio =0.75) #Se da la base de datos, y se especifica que porcentaje de train data se asigna.
train <- subset(empleados,split==TRUE) # Si incluye en la muestra del Train data
#muestra las columnas de hpusing y solo filas para entrenar el modelo
test <- subset(empleados,split==FALSE) # FALSE no incluye en el test data.
# train <- select(train,-b)
# test <- select(test,-b)
Vamos a construir nuestro modelo teniendo en cuenta que edad y altura influyen en la variable objetivo.
modelP <- lm(Peso ~ -1 + Altura, data = train) #MODELO CORREGIDO
#modelP <- lm(Peso ~ -1 + Altura + Edad , data = train) MODELO INICIAL
#-1 para quitar el intercepto
summary(modelP)
Call:
lm(formula = Peso ~ -1 + Altura, data = train)
Residuals:
Min 1Q Median 3Q Max
-23.383 -6.898 -1.656 6.026 41.466
Coefficients:
Estimate Std. Error t value Pr(>|t|)
Altura 0.424351 0.007349 57.74 <2e-16 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 11.34 on 74 degrees of freedom
Multiple R-squared: 0.9783, Adjusted R-squared: 0.978
F-statistic: 3334 on 1 and 74 DF, p-value: < 2.2e-16
#Funcion lm: lineal model
#Varibles(depend ~ indep + indep)
A partir de los resultados obtenidos al construir nuestro modelo lineal, se puede contestar la siguiente pregunta: ¿cual es la probabilidad de que la variable edad no sea estadisticamente significativa para el modelo?
Como el p-value < 2.2e-16, se puede concluir que la variable edad es estadisticamente significativa para el modelo.
Por otro lado obtenemos un R^2= 0.97 que es mayor a 0.5, que indica que el modelo es bueno, lo cual se ira comprobando mas adelante.
El modelo construido se obtiene una ecuación que se presenta a continuación:
[1] "Peso= 0.42 NA NA + NA"
Permite visualizar nuestro modelo de regresion lineal trazando los residuos. La diferencia entre el valor observado de la variable dependiente (y) y el valor predicho (y) se denomina residual (e).
resP <- residuals(modelP)
#Se calculan los residuales.
# Convertir residuos en un DataFrame
resP <- as.data.frame(resP)
ggplot(resP,aes(resP)) + geom_histogram(fill='cyan2',alpha=0.5) +
labs(title="Diagrama de barras")+ #Titulo y subtitulo
theme_update(plot.title = element_text(hjust = 0.5)) #Permite centrar el titulo y subtitulo
Si los residuos siguen una distribucion N(0,1) tienen la forma de la campana de Gauss.
A partir del grafico anterior se puede concluir que los residuos obtenidos en el modelo construido con anterioridad siguen una distribucion N(0,1), ya que el histograma se aproxima a la forma de campana de Gauss. Por lo tanto, se puede concluir que las hipotesis basicas del modelo construido son ciertas y que el comportamiento de los residuos es normal, es decir no hay muchas discrepancias en las varianzas del error. Se puede decir qued el modelo construido es bueno.
plot(modelP)
#Grafico 2: Linea reacta se ajusta a los residuos(distribucion teorica), circulo distribucion empirica.
#Grafico 3: Residuos estandarizados: quitan la distancia de los datosy solo mide el ajuste de los datos, identificando la naturaleza de los residuos.
#
#Grafico 4: Curvas de nivel: Pasan por los datos, miden la tendencia.
Las cuatro graficas obtenidas nos permiten visualizar que los residuos no estan correlacionados y siguen una distribucion normal, es decir mas cercano a cero.
Grafico 1: En este grafico se puede observar que la línea roja se aproxima al origen, por lo que se puede concluir que el modelo encontrado explica una relación lineal, sin embargo de debe tomar en cuenta que se encuentran algunos datos atipicos que deben ser corregidos.
Grafico 2: En este grafico se puede observar que los residuos se aproximan a una linea recta que pasa por el origen, por lo tanto, se puede concluir que los residuos siguen una distribución normal.
Grafico 3: En este grafico se puede observar que los residuos aparecen dispersos al azar, tendiendo a un linea horizontal, por lo tanto se puede concluir que los residuos se reparten equitativamente a lo largo de los rangos de los predictores. Por lo tanto siguen una distribucion normal.
Grafico 4: En este grafico se puede observar que no hay casos influyentes en el modelo, ya que apenas se pueden ver las lineas de tendencia de CooK ya que todos los casos estan dentro de las lineas de distancia Cook. Por lo tanto siguen una distribucion normal.
Probemos nuestro modelo prediciendo en nuestro conjunto de datos de prueba.
test$predicted.Peso <- predict(modelP,test) #Se usa el test data
pl1 <-test %>%
ggplot(aes(Peso,predicted.Peso)) +
geom_point(alpha=0.5) + #puntos, alpha mide el ancho de los puntos
stat_smooth(aes(colour='red')) + #Calcula el intervalo de confianza, parte ploma
xlab('Actual value of Peso') +
ylab('Predicted value of Peso')+
theme_bw() #Malla y color del margen
ggplotly(pl1) #Se aplica plotly a ggplot, para obtener la herramientas dinamicas.
La linea roja indica el ajuste de los datos con una posible interpolacion para identificar la tendencia de los datos. Sombreado gris es el intervalo de confianza.
A partir del grafico se puede obtener una prediccion de peso en funcion a la ecuacion obtenida al construir nuestro modelo, la mayoria de los valores de peso tienen una tendencia similar. El sombreado gris nos muestra el intervalo de confianza, como se puede ver la mayoria de casos el intervalo de confianza es sumamente grande, por lo que se puede concluir que con el modelo no se puede estar seguro del valor real.
usando Root Mean Square Error, una medida estandarizada de cuan lejos estabamos con nuestros valores predichos.
error <- test$Peso-test$predicted.Peso
rmse <- sqrt(mean(error)^2)
rmse
[1] 1.098456
Respuesta: Si RMSE cercano a uno el modelo es bueno.El Root Mean Square Error (RMSE) para nuestro modelo es 1.098456 y los resultados pueden mejorarse aun mas utilizando la extraccion de variables y entrenando el modelo