El siguiente informe explicará de forma detallada un análisis estadístico-descriptivo de los datos comprendidos en la base de datos “Alumnos”, haciendo un análisis de cada variable y relacionándolas entre sí a través de la realización de distintos gráficos en RStudio y con la ayuda de distintas librerías que facilitan la visualización de los datos de diversas formas.
Entre dichas librerías podemos encontrar:
ggplot2: Nos ayuda a mostrar gráficamente los datos de forma detallada y llamativa por medio de distintas geometrías y presentaciones. Cabe resaltar que esta librería se puede relacionar muy fácilmente con otras librerías como plotly, rayshader, entre otros.
Plotly: Permite que los gráficos realizados con ggplot2 se vuelvan interactivos con el fin de mejorar el aspecto y la visualización de los datos.
KableExtra: Esta librería permite organizar y mostrar los datos en tablas de tal forma que facilita la visualización y comprensión de estos.
Tidyverse, Janitor y Modeest: Estas librerías agregan distintas funciones al programa que permiten tener un mayor control de los datos y realizar cálculos que son más difíciles de obtener utilizando únicamente R base.
Readxl: esta librería permite al programa leer archivos de Excel, lo cual es primordial para realizar el análisis estadístico de los datos alojados en este tipo de documentos.
#Tabla de frecuencias de Carreras
Frec_abs=as.vector(table(Alumnos$carrera))
Frec_abs_acum=cumsum(table(Alumnos$carrera))
Frec_rel=as.vector(prop.table(table(Alumnos$carrera)))
Frec_rel_acum=cumsum(prop.table(table(Alumnos$carrera)))
tabla_frecuencia=data.frame(Frec_abs,Frec_abs_acum,Frec_rel,Frec_rel_acum)
#Tabla con Estilo
tabla_frecuencia %>%
kbl(col.names = c(
"Frec Absoluta",
"Frec Absolut acum",
"Frec Relativa",
"Frec Relativa acum"), align = rep("c",4)) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T)%>%
column_spec(1, bold = T, border_right = T) %>%
add_header_above(c("Carreras"=5)) %>%
add_header_above(c("Tabla de Frecuencias"=5))| Frec Absoluta | Frec Absolut acum | Frec Relativa | Frec Relativa acum | |
|---|---|---|---|---|
| ADMINISTRACION | 390 | 390 | 0.078 | 0.078 |
| ARQUITECTURA | 421 | 811 | 0.084 | 0.162 |
| BIOQUIMICA | 374 | 1185 | 0.075 | 0.237 |
| CIVIL | 378 | 1563 | 0.076 | 0.313 |
| ELECTRICA | 407 | 1970 | 0.081 | 0.394 |
| ELECTRONICA | 403 | 2373 | 0.081 | 0.475 |
| INDUSTRIAL | 379 | 2752 | 0.076 | 0.550 |
| INFORMATICA | 354 | 3106 | 0.071 | 0.621 |
| MECANICA | 336 | 3442 | 0.067 | 0.688 |
| MECATRONICA | 345 | 3787 | 0.069 | 0.757 |
| QUIMICA | 415 | 4202 | 0.083 | 0.840 |
| SISTEMAS | 397 | 4599 | 0.079 | 0.920 |
| TIC | 401 | 5000 | 0.080 | 1.000 |
De acuerdo a la tabla de frecuencias de las carreras, la carrera con mayor cantidad de estudiantes en la universidad es Arquitectura con 421 estudiantes que equivalen aproximadamente al 8,4% del total de estudiantes, mientras que la carrera con menor cantidad de estudiantes es Mecánica con 336 estudiantes que equivalen aproximadamente al 6,7% del total de estudiantes.
Los datos obtenidos en la anterior tabla, se pueden graficar de tal forma que podemos visualizar el panorama global de las carreras en el siguiente diagrama de barras.
Hist_carreras<- ggplot(Alumnos, aes(x=carrera, fill=carrera))+
geom_bar()+
scale_x_discrete(labels=abbreviate)+
labs(title = "Cantidad de estudiantes por carrera",
x="Carrera",
y="Estudiantes")+
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
ggplotly(Hist_carreras)En base al total de estudiantes en la universidad, además de la carrera, podemos diferenciarlos por su género masculino o femenino, por lo que al relacionar las variables de carrera y género, se puede obtener el siguiente gráfico donde se ve una peculiar distribución en donde las carreras más demandadas por los hombres son Arquitectura e Ingeniería eléctrica, mientras que las carreras más demandadas por las mujeres son Química y TIC. También se puede evidenciar que la única carrera en la que hay estudiantes de ambos géneros es Ingeniería industrial.
barras_carrera_genero=ggplot(Alumnos,aes(x=carrera, fill=genero))+
geom_bar(position = position_dodge(0.9))+
scale_x_discrete(labels=abbreviate)+
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
labs(title = "Comparación de carrera entre femenino y masculino",
x="Carrera",
y="Cantidad de estudiantes")
ggplotly(barras_carrera_genero)#Tabla de frecuencias de Estratos
Estrato=seq(1:6)
Frec_abs=as.vector(table(Alumnos$Estrato))
Frec_abs_acum=as.vector(cumsum(table(Alumnos$Estrato)))
Frec_rel=as.vector(prop.table(table(Alumnos$Estrato)))
Frec_rel_acum=cumsum(prop.table(table(Alumnos$Estrato)))
tabla_frecuencia=data.frame(Estrato,Frec_abs,Frec_abs_acum,Frec_rel,Frec_rel_acum)
#Tabla con Estilo
tabla_frecuencia %>%
kbl(col.names = c("Estrato",
"Frec Absoluta",
"Frec Absolut acum",
"Frec Relativa",
"Frec Relativa acum"), align = rep("c",6)) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T)%>%
column_spec(1, bold = T, border_right = T) %>%
add_header_above(c("Estratos"=5))%>%
add_header_above(c("Tabla de frecuencias"=5)) | Estrato | Frec Absoluta | Frec Absolut acum | Frec Relativa | Frec Relativa acum |
|---|---|---|---|---|
| 1 | 784 | 784 | 0.157 | 0.157 |
| 2 | 808 | 1592 | 0.162 | 0.318 |
| 3 | 860 | 2452 | 0.172 | 0.490 |
| 4 | 865 | 3317 | 0.173 | 0.663 |
| 5 | 850 | 4167 | 0.170 | 0.833 |
| 6 | 833 | 5000 | 0.167 | 1.000 |
De acuerdo a la tabla de frecuencias de los estratos, el estrato con mayor frecuencia, es decir, el estrato que tiene mayor cantidad de estudiantes es el estrato 4 con 865 estudiantes que equivalen aproximadamente al 17,3% del total de estudiantes, mientras que, el estrato donde hay menor cantidad de estudiantes es el estrato 1 con 784 estudiantes que equivalen al 15,7% del total de estudiantes.
Los datos presentados en la tabla se pueden representar gráficamente como se ve en el siguiente diagrama de donut.
Alumnos_estrato = Alumnos %>%
count(Estrato, sort = FALSE) %>%
transform(Estrato = as.character(Estrato))
Alumnos_estrato$porcentaje = prop.table(Alumnos_estrato$n)*100
Alumnos_estrato$fraccion = Alumnos_estrato$n / sum(Alumnos_estrato$n)
Alumnos_estrato$ymax = cumsum(Alumnos_estrato$fraccion)
Alumnos_estrato$ymin = c(0, head(Alumnos_estrato$ymax, n=-1))
Alumnos_estrato$labelPosition <- (Alumnos_estrato$ymax + Alumnos_estrato$ymin) / 2
Alumnos_estrato$label <- paste0(Alumnos_estrato$Estrato, "\n", Alumnos_estrato$porcentaje,"%")
torta_estrato = ggplot(Alumnos_estrato,
aes(ymax=ymax,
ymin=ymin,
xmax=4,
xmin=3,
fill=Estrato)) +
geom_rect() +
coord_polar(theta="y") +
geom_text( x=2, aes(y=labelPosition, label=label, color=Estrato), size=4) +
xlim(c(-1, 4)) +
theme_void() +
theme(legend.position = "none",plot.title = element_text(hjust = 0.5)) +
labs(title = "Estrato de los estudiantes")
torta_estratoCaja_Estrato<-ggplot(Alumnos, aes(x="", y=Estrato))+
geom_boxplot(fill="red",alpha=0.7)+
xlab("")+scale_x_discrete(breaks = NULL)+
coord_flip()+
theme_bw()
ggplotly(Caja_Estrato)En el diagrama de caja se puede evidenciar que la mitad de los estudiantes se encuentran entre los estratos 1-4 y la mayoría de los estudiantes están entre el estrato 2-4
Frec_abs=as.vector(table(Alumnos$genero))
Frec_abs_acum=as.vector(cumsum(table(Alumnos$genero)))
Frec_rel=as.vector(prop.table(table(Alumnos$genero)))
Frec_rel_acum=cumsum(prop.table(table(Alumnos$genero)))
Alumnos_genero=data.frame(Frec_abs,Frec_abs_acum,Frec_rel,Frec_rel_acum)
row.names(Alumnos_genero) = c("Femenino", "Masculino")
Alumnos_genero %>%
kbl(col.names = c(
"Frec Absoluta",
"Frec Absolut acum",
"Frec Relativa",
"Frec Relativa acum"), align = rep("c",4)) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T)%>%
column_spec(1, bold = T, border_right = T) %>%
add_header_above(c("Genero"=5))%>%
add_header_above(c("Tabla de frecuencias"=5)) | Frec Absoluta | Frec Absolut acum | Frec Relativa | Frec Relativa acum | |
|---|---|---|---|---|
| Femenino | 2436 | 2436 | 0.487 | 0.487 |
| Masculino | 2564 | 5000 | 0.513 | 1.000 |
Con base a la tabla de frecuencia de los generos, se puede evidenciar que dentro de la universidad hay más estudiantes masculinos que femeninos.
A continuación se puede ver la información de la anterior tabla presentada en un gráfico de donut.
Alumnos_genero = Alumnos %>%
count(genero, sort = FALSE)
Alumnos_genero[1,1]="Femenino"
Alumnos_genero[2,1]="Masculino"
Alumnos_genero$prop = prop.table(Alumnos_genero$n)*100
Alumnos_genero$fraccion = Alumnos_genero$n / sum(Alumnos_genero$n)
Alumnos_genero$ymax = cumsum(Alumnos_genero$fraccion)
Alumnos_genero$ymin = c(0, head(Alumnos_genero$ymax, n=-1))
Alumnos_genero$labelPosition <- (Alumnos_genero$ymax + Alumnos_genero$ymin) / 2
Alumnos_genero$label <- paste0(Alumnos_genero$genero, "\n", Alumnos_genero$prop,"%")
ggplot(Alumnos_genero,
aes(ymax=ymax,
ymin=ymin,
xmax=4,
xmin=3,
fill=genero)) +
geom_rect() +
coord_polar(theta="y") +
geom_text( x=1.5, aes(y=labelPosition, label=label, color=genero), size=4) +
xlim(c(-1, 4)) +
theme_void() +
theme(legend.position = "none",plot.title = element_text(hjust = 0.5)) +
labs(title = "Género de los estudiantes")Al igual que hicimos anteriormente, los estudiantes pueden ser diferenciados tanto por su estrato como por su genero, por lo cual al relacionar estas dos variables obtenemos la siguiente gráfica, donde se observa que la grán mayoria de estudiantes hombres se encuentran en el estrato 4 mientras la gran mayoria de mujeres pertenecen al estrato 3 y 6.
Alumnos = transform(Alumnos, Estrato = as.character(Estrato))
barras_estrato_genero=ggplot(Alumnos,aes(x=Estrato, fill=genero))+
geom_bar(position = position_dodge(0.9))+
labs(title = "Comparación de estrato entre femenino y masculino",
x="Estrato",
y="Cantidad de estudiantes")
ggplotly(barras_estrato_genero)#Tabla de frecuencias de Edad
Frec_abs=as.vector(table(Alumnos$edad))
Frec_abs_acum=as.vector(cumsum(table(Alumnos$edad)))
Frec_rel=as.vector(prop.table(table(Alumnos$edad)))
Frec_rel_acum=cumsum(prop.table(table(Alumnos$edad)))
tabla_frecuencia=data.frame(Frec_abs,Frec_abs_acum,Frec_rel,Frec_rel_acum)
#Tabla con Estilo
tabla_frecuencia %>%
kbl(col.names = c(
"Frec Absoluta",
"Frec Absolut acum",
"Frec Relativa",
"Frec Relativa acum"), align = rep("c",4)) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T)%>%
column_spec(1, bold = T, border_right = T) %>%
add_header_above(c("Edad"=5))%>%
add_header_above(c("Tabla de frecuencias"=5)) | Frec Absoluta | Frec Absolut acum | Frec Relativa | Frec Relativa acum | |
|---|---|---|---|---|
| 17 | 2 | 2 | 0.000 | 0.000 |
| 18 | 44 | 46 | 0.009 | 0.009 |
| 19 | 310 | 356 | 0.062 | 0.071 |
| 20 | 1187 | 1543 | 0.237 | 0.309 |
| 21 | 1891 | 3434 | 0.378 | 0.687 |
| 22 | 1204 | 4638 | 0.241 | 0.928 |
| 23 | 339 | 4977 | 0.068 | 0.995 |
| 24 | 21 | 4998 | 0.004 | 1.000 |
| 25 | 2 | 5000 | 0.000 | 1.000 |
En base a la anterior tabla podemos decir que la mayor cantidad de estudiantes se encuentran en la edad de 21 años con una frecuencia absoluta de 1891 estudiantes los cuales equivalen al 37,8% del total de estudiantes, mientras que los estudiantes que tienen la edad de 17 y 25 años son los que tienen una frecuencia absoluta menor, con tan solo 2 y 4 estudiantes respectivamente, los cuales equivale al 0.04% del total de estudiantes.
Como se dijo en el anterior enunciado, al hacer una distribución de los datos en un histograma podemos ver que la gran mayoria de estudiantes tienen 21 años y los demas estudiantes tienen una tendencia a este rango de edad.
Hist_edad=ggplot(Alumnos,aes(x=edad))+
geom_histogram(color="black",fill="dodgerblue",alpha=0.5 ,bins=9, position = "identity")+
scale_x_continuous(breaks = seq(17,25,1))+
labs(title = "Histograma Edad",
x="Edad",
y="Cantidad de estudiantes")
ggplotly(Hist_edad)Nuestro diagrama de caja como es una representación de una distribución normal nuestra moda, media y mediana son las mismas y sus elementos se distribuyen de manera simétrica.
Caja_Edad<-ggplot(Alumnos, aes(x="", y=edad))+
geom_boxplot(fill="#7FFFD4")+
xlab("")+scale_x_discrete(breaks = NULL)+
coord_flip()+
labs(title = "Diagrama de caja Edad")
ggplotly(Caja_Edad)Una vez mas podemos relacionar las variables de la edad y el género para obtener la siguiente gráfica, de la que podemos determinar que la gran mayoría de hombres y mujeres en la universidad se encuentran en el rango de 21 años.
barras_estrato_genero=ggplot(Alumnos,aes(x=edad, fill=genero))+
geom_bar(position = position_dodge(0.9))+
scale_x_continuous(breaks = seq(17,25,1))+
labs(title = "Comparación de estrato entre femenino y masculino",
x="edad",
y="Cantidad de estudiantes")
ggplotly(barras_estrato_genero)Para tener una mejor visualización de los datos se hace necesario crear algunos intervalos que contengan la altura de los estudiantes. Aquí podemos observar que la mayor cantidad de estudiantes se encuentran en el intervalo de altura entre (159,162] con 1159 estudiantes que equivalen al 23,18% del total de estudiantes y los estudiantes en el intervalo de altura entre (189,192] son los que menos hay, con tan solo 4 estudiantes que equivalen al 0.08% del total de estudiantes
#En los datos continuos vamos a realizar intervalos
brx <- pretty(range(Alumnos$altura),
n=nclass.Sturges(Alumnos$altura), min.n = 1)
k=nclass.Sturges(Alumnos$altura) #Cantidad de intervalos que tiene
A=diff(range(Alumnos$altura))/13 #Amplitud de un Intervalo a otro
A=3
m=min(Alumnos$altura)
L=m-0.05+A*(0:13)
Marcas=(L[0:k]+L[1:k+1])/2 #Marca de clase (media de cada intervalo)
Intervalos=cut(Alumnos$altura, breaks = L, include.lowest = TRUE) #Datos en intervalos
#Tabla de frecuencias de Altura
Frec_abs=as.vector(table(Intervalos))
Frec_abs_acum=as.vector(cumsum(table(Intervalos)))
Frec_rel=as.vector(prop.table(table(Intervalos)))
Frec_rel_acum=cumsum(prop.table(table(Intervalos)))
tabla_frecuencia=data.frame(Frec_abs,Frec_abs_acum,Frec_rel,Frec_rel_acum)
#Tabla con Estilo
tabla_frecuencia %>%
kbl(col.names = c(
"Frec Absoluta",
"Frec Absolut acum",
"Frec Relativa",
"Frec Relativa acum"), align = rep("c",4)) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T)%>%
column_spec(1, bold = T, border_right = T) %>%
add_header_above(c("Altura"=5))%>%
add_header_above(c("Tabla de frecuencias"=5)) | Frec Absoluta | Frec Absolut acum | Frec Relativa | Frec Relativa acum | |
|---|---|---|---|---|
| [153,156] | 79 | 79 | 0.016 | 0.016 |
| (156,159] | 633 | 712 | 0.127 | 0.142 |
| (159,162] | 1159 | 1871 | 0.232 | 0.374 |
| (162,165] | 525 | 2396 | 0.105 | 0.479 |
| (165,168] | 40 | 2436 | 0.008 | 0.487 |
| (168,171] | 6 | 2442 | 0.001 | 0.488 |
| (171,174] | 61 | 2503 | 0.012 | 0.501 |
| (174,177] | 309 | 2812 | 0.062 | 0.562 |
| (177,180] | 818 | 3630 | 0.164 | 0.726 |
| (180,183] | 878 | 4508 | 0.176 | 0.902 |
| (183,186] | 400 | 4908 | 0.080 | 0.982 |
| (186,189] | 88 | 4996 | 0.018 | 0.999 |
| (189,192] | 4 | 5000 | 0.001 | 1.000 |
Con ayuda de la tabla de frecuencias, construimos un histograma que nos entrega un resultado bastante interesante, puesto que podemos ver dos tendencias marcadas en los rangos de altura (159,162] y (180,183].
Hist_altura=ggplot(Alumnos,aes(x=altura))+
geom_histogram(color="black",fill="dodgerblue",alpha=0.5 ,breaks=L, position = "identity")+
scale_x_continuous(breaks = seq(153,192,3))+
labs(title = "Histograma Altura",
x="Altura",
y="Cantidad de estudiantes")
ggplotly(Hist_altura)Si bien el anterior histograma nos arrojo unos rangos de altura distintos, a través de la siguiente distribución se puede comprender mejor la dispersión de los datos, donde vemos que en el intervalo [153,168] se presenta la distribución de altura para las mujeres, mientras que del intervalo (168,192] se presenta la distribución de altura para los hombres.
Hist_altura_g=ggplot(Alumnos,aes(x=Intervalos, fill=genero))+
geom_bar()+
theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust=1))+
labs(title = "Distribución de altura entre femenino y masculino",
x="Altura",
y="Cantidad de estudiantes")
ggplotly(Hist_altura_g)Caja_Altura<-ggplot(Alumnos, aes(x="", y=altura))+
geom_boxplot(fill="#FFB90F")+
xlab("")+scale_x_discrete(breaks = NULL)+
coord_flip()+
labs(title = "Diagrama de caja Altura")
ggplotly(Caja_Altura)en este gráfico se puede evidenciar que gran parte de la distribución de la altura de los estudiantes se encuentra entre 160.05 y 173.69
Finalmente esta variable puede relacionarse también con la edad, por lo que en este gráfico de dispersión de datos se puede ver que la gran mayoria de datos se concentran entorno a la edad de 21 años donde vemos la misma distribución de alturas que habian en los histogramas anteriores
Disp_Alt_Edad<-ggplot(Alumnos, aes(x=altura,y=edad))+
geom_point()+
coord_flip()+
scale_y_continuous(breaks = seq(17,25,1))+
labs(title = "Relación entre edad y altura de los estudiantes")
ggplotly(Disp_Alt_Edad)#En los datos continuos vamos a realizar intervalos
brx <- pretty(range(Alumnos$peso),
n=nclass.Sturges(Alumnos$peso), min.n = 1)
k=nclass.Sturges(Alumnos$peso) #Cantidad de intervalos que tiene
A=diff(range(Alumnos$peso))/k #Amplitud de un Intervalo a otro
A=3
m=min(Alumnos$peso)
L=m-0.05+A*(0:13)
Marcas=(L[0:k]+L[1:k+1])/2 #Marca de clase (media de cada intervalo)
Intervalos=cut(Alumnos$peso, breaks = L, include.lowest = TRUE) #Datos en intervalos
#Tabla de frecuencias de peso
Frec_abs=as.vector(table(Intervalos))
Frec_abs_acum=as.vector(cumsum(table(Intervalos)))
Frec_rel=as.vector(prop.table(table(Intervalos)))
Frec_rel_acum=cumsum(prop.table(table(Intervalos)))
tabla_frecuencia=data.frame(Frec_abs,Frec_abs_acum,Frec_rel,Frec_rel_acum)
#Tabla con Estilo
tabla_frecuencia %>%
kbl(col.names = c(
"Frec Absoluta",
"Frec Absolut acum",
"Frec Relativa",
"Frec Relativa acum"), align = rep("c",4)) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T)%>%
column_spec(1, bold = T, border_right = T) %>%
add_header_above(c("Peso"=5))%>%
add_header_above(c("Tabla de frecuencias"=5)) | Frec Absoluta | Frec Absolut acum | Frec Relativa | Frec Relativa acum | |
|---|---|---|---|---|
| [52.7,55.7] | 79 | 79 | 0.016 | 0.016 |
| (55.7,58.7] | 633 | 712 | 0.127 | 0.142 |
| (58.7,61.7] | 1159 | 1871 | 0.232 | 0.374 |
| (61.7,64.7] | 525 | 2396 | 0.105 | 0.479 |
| (64.7,67.7] | 40 | 2436 | 0.008 | 0.487 |
| (67.7,70.7] | 6 | 2442 | 0.001 | 0.488 |
| (70.7,73.7] | 61 | 2503 | 0.012 | 0.501 |
| (73.7,76.7] | 309 | 2812 | 0.062 | 0.562 |
| (76.7,79.7] | 818 | 3630 | 0.164 | 0.726 |
| (79.7,82.7] | 878 | 4508 | 0.176 | 0.902 |
| (82.7,85.7] | 400 | 4908 | 0.080 | 0.982 |
| (85.7,88.7] | 88 | 4996 | 0.018 | 0.999 |
| (88.7,91.7] | 4 | 5000 | 0.001 | 1.000 |
A partir de la tabla de frecuencias de el peso se puede concluir que el intervalo de peso que tiene una mayor cantidad de estudiantes es (58.7,61.7], donde se encuentra aproximadamente el 23,18% del total de estudiantes y el intervalo de peso donde hay menor cantidad de estudiantes es (88.7,91.7], donde se encuentra aproximadamente el 0,08% del total de estudiantes.
Al igual que sucedió con los histogramas de altura, vemos que en este histograma existe una dispersión de los datos similar, pues estos tienden a dos rangos distintos, por una parte al rango de (58.7,61.7] y por otra al rango de (79.7,82.7].
Hist_peso=ggplot(Alumnos,aes(x=peso))+
geom_histogram(color="black",fill="dodgerblue",alpha=0.5 ,breaks=L, position = "identity")+
labs(title = "Histograma Peso",
x="Peso",
y="Cantidad de estudiantes")
ggplotly(Hist_peso)Nuevamente podemos explicar este tipo de distribución relacionando el peso con el género, donde evidenciamos que el intervalo [52.7,67.7] se encuentran todas las estudiantes mujeres, mientras que en el intervalo (67.7,91.7] se encuentran todos los estudiantes hombres.
Hist_peso_g=ggplot(Alumnos,aes(x=Intervalos, fill=genero))+
geom_bar()+
theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust=1))+
labs(title = "Distribución de peso entre femenino y masculino",
x="Pesos",
y="Cantidad de estudiantes")
ggplotly(Hist_peso_g)En el siguiente gráfico podemos ver como la distribución de los datos se encuentra mayormente comprendida entre los pesos 60.05 y 73.69.
Caja_Peso<-ggplot(Alumnos, aes(x="", y=peso))+
geom_boxplot(fill="#7FFF00")+
xlab("")+scale_x_discrete(breaks = NULL)+
coord_flip()+
labs(title = "Diagrama de caja Peso")
ggplotly(Caja_Peso)Finalmente esta variable puede estar relacionada a la altura por lo que al graficar la relacion 1 a 1 entre estos dos, obtenemos la siguiente grafica, en donde evidenciamos que a mayor altura se presenta un mayor peso tanto para el rango de altura y peso de las mujeres como para el rango de altura y peso de los hombres.
Disp_Alt_Peso<-ggplot(Alumnos, aes(x=altura,y=peso))+
geom_point()+
theme(plot.title = element_text(hjust = 0.5))+
labs(title = "Relación entre peso y altura de los estudiantes")
ggplotly(Disp_Alt_Peso)#En los datos continuos vamos a realizar intervalos
brx <- pretty(range(Alumnos$promedio),
n=nclass.Sturges(Alumnos$promedio), min.n = 1)
k=nclass.Sturges(Alumnos$promedio) #Cantidad de intervalos que tiene
A=diff(range(Alumnos$promedio))/k #Amplitud de un Intervalo a otro
A=5
m=min(Alumnos$promedio)
L=m-0.05+A*(0:6)
Marcas=(L[0:k]+L[1:k+1])/2 #Marca de clase (media de cada intervalo)
Intervalos=cut(Alumnos$promedio, breaks = brx, include.lowest = TRUE) #Datos en intervalos
#Tabla de frecuencias de promedio
Frec_abs=as.vector(table(Intervalos))
Frec_abs_acum=as.vector(cumsum(table(Intervalos)))
Frec_rel=as.vector(prop.table(table(Intervalos)))
Frec_rel_acum=cumsum(prop.table(table(Intervalos)))
tabla_frecuencia=data.frame(Frec_abs,Frec_abs_acum,Frec_rel,Frec_rel_acum)
#Tabla con Estilo
tabla_frecuencia %>%
kbl(col.names = c(
"Frec Absoluta",
"Frec Absolut acum",
"Frec Relativa",
"Frec Relativa acum"), align = rep("c",4)) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T)%>%
column_spec(1, bold = T, border_right = T) %>%
add_header_above(c("Promedio"=5))%>%
add_header_above(c("Tabla de frecuencias"=5)) | Frec Absoluta | Frec Absolut acum | Frec Relativa | Frec Relativa acum | |
|---|---|---|---|---|
| [72,74] | 2 | 2 | 0.000 | 0.000 |
| (74,76] | 14 | 16 | 0.003 | 0.003 |
| (76,78] | 56 | 72 | 0.011 | 0.014 |
| (78,80] | 161 | 233 | 0.032 | 0.047 |
| (80,82] | 428 | 661 | 0.086 | 0.132 |
| (82,84] | 750 | 1411 | 0.150 | 0.282 |
| (84,86] | 1130 | 2541 | 0.226 | 0.508 |
| (86,88] | 1025 | 3566 | 0.205 | 0.713 |
| (88,90] | 779 | 4345 | 0.156 | 0.869 |
| (90,92] | 428 | 4773 | 0.086 | 0.955 |
| (92,94] | 177 | 4950 | 0.035 | 0.990 |
| (94,96] | 44 | 4994 | 0.009 | 0.999 |
| (96,98] | 4 | 4998 | 0.001 | 1.000 |
| (98,100] | 2 | 5000 | 0.000 | 1.000 |
La tabla de frecuencias del promedio no muestra que la mayor cantidad de estudiantes, es decir, 1130 tienen un promedio entre (84,86], lo cual equivale aproximadamente al 22,6% del total de estudiantes. Por otro lado sólo el 0.04% de estudiantes tienen un promedio de [72,74] o (98,100]. ## Histograma del promedio
En este histograma vemos una distribución de datos casi simetrica entorno al promedio de 86 y vemos que muy pocos estudiantes tienen promedios muy altos o muy bajos.
Hist_promedio=ggplot(Alumnos,aes(x=promedio))+
geom_histogram(color="black",fill="dodgerblue",alpha=0.5 ,breaks=brx, position = "identity")+
scale_x_continuous(breaks=seq(70,100,2))+
labs(title = "Histograma Promedio",
x="Promedio",
y="Cantidad de estudiantes")
ggplotly(Hist_promedio)Al hacer una comparación entre el promedio y el género encontramos que tanto los hombres como las mujeres siguen una distribución muy similar al histograma anterior, por lo que podremos concluir que el género no afecta la distribución del promedio.
Hist_prom_g=ggplot(Alumnos,aes(x=Intervalos, fill=genero))+
geom_bar(position = position_dodge(0.9))+
theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust=1))+
labs(title = "Comparación de promedio entre femenino y masculino",
x="Promedio",
y="Cantidad de estudiantes")
ggplotly(Hist_prom_g)A continuación, podemos hacer una comparación entre los promedios de cada carrera, donde se evidencia que todas las carreras siguen una distribución muy similar al histograma del promedio. También podemos concluir que carrreras como bioquímica, ingeniería civil y TIC, tienen una distribución ligeramente mas grande para promedios superiores a 90.
Carreras_prom<-ggplot(data = Alumnos, mapping = aes(x = Alumnos$promedio, fill=carrera)) +
geom_histogram(bins = 30, color = "white") +
facet_wrap(~ carrera, nrow = 5)+
labs(title = "Promedio por carreras",
x="Promedio",
y="Cantidad de estudiantes")
ggplotly(Carreras_prom)Caja_Promedio<-ggplot(Alumnos, aes(x="", y=promedio))+
geom_boxplot(fill="blue",alpha=0.7)+
xlab("")+scale_x_discrete(breaks = NULL)+
coord_flip()+
theme_bw()+
scale_y_continuous(breaks = seq(70,100,5))+
labs(title = "Diagrama de caja Promedio")
ggplotly(Caja_Promedio)Aquí podemos ver que el menor promedio es de 73.28 y el máximo promedio es de 99.20, tambien se puede ver una distribución un poco sesgada hacía la derecha, mostrandonos que hay más estudiantes con un promedio mayor a la mediana de 85.95 que hacía la izquierda. Además, es la única gráfica que nos muestra dátos atípicos.
Primero calculamos la media, moda y mediana para cada variable y luego organizamos la información en la siguiente tabla.
#Esta es la función que nos dará la moda
mode <- function(x) {
return(as.numeric(names(which.max(table(x)))))
}
#Creamos un nuevo data.frame con las medidas de tendencia central
Tabla_medidas_tendencia<-Alumnos %>%
summarise(Variable=c("Edad",
"Estrato",
"Promedio",
"Altura",
"Peso"),
Media= c(mean(edad),
mean(Estrato),
mean(promedio),
mean(altura),
mean(peso)),
Moda= c(mode(edad),
mode(Estrato),
mode(promedio),
mode(altura),
mode(peso)),
Mediana=c(median(edad),
median(Estrato),
median(promedio),
median(altura),
median(peso))
)#Tabla con Estilo
Tabla_medidas_tendencia %>%
kbl(align = c("l","c","c","c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T,full_width = F)%>%
column_spec(1, bold = T, border_right = T, width = "4cm") %>%
column_spec(2, border_right = T, width = "2cm")%>%
column_spec(3, border_right = T, width = "2cm")%>%
column_spec(4, border_right = T, width = "2cm")%>%
add_header_above(c("Tabla de medidads de tendencia central"=4))| Variable | Media | Moda | Mediana |
|---|---|---|---|
| Edad | 21.0 | 21.0 | 21.0 |
| Estrato | NA | 4.0 | NA |
| Promedio | 86.0 | 83.7 | 86.0 |
| Altura | 170.2 | 160.4 | 173.7 |
| Peso | 70.2 | 60.4 | 73.7 |
Observese que la edad tiene la misma moda, mediana y media, esto ocurre es cuando una distribución de frecuencia es simétrica y podemos evidenciarlo en el siguiente gráfico.
Densidad_edad=ggplot(Alumnos,aes(x=edad))+
geom_histogram(color="white",fill="dodgerblue",alpha=0.3 ,bins=9, position = "identity", aes(y=..density..))+
scale_x_continuous(breaks = seq(17,25,1))+
geom_density()+
geom_vline(aes(xintercept=mean(edad),
color="Media"), linetype="dashed", size=1)+
geom_vline(aes(xintercept=median(edad),
color="Mediana"), linetype="dashed", size=0.6)+
geom_vline(aes(xintercept=mode(edad),
color="Moda"), linetype="dashed", size=0.8)
ggplotly(Densidad_edad)