── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidyr)
Introducción.
Para la elaboración de la nueva malla curricular del Bachillerato en Biología de la Universidad de Costa Rica, se desarrolló el ‘Perfil de la Persona Graduada del Bachillerato en Biología’. Este comprende un conjunto de ‘Saberes’ integrales que son deseables en la formación de un biólogo. Los Saberes se dividen en tres tipos: Fundamentos, Investigación, y Biología & Sociedad; a su vez, cada uno de estos se subdivide en: Conocimientos Teóricos, Habilidades Prácticas y Actitudes & Valores. Para poder comenzar a construir el nuevo plan de estudios del Bachillerato en Biología, surge la necesidad de evaluar la representación de cada uno de estos Saberes en los objetivos de los cursos actuales del Bachillerato.
Objetivo: Evaluar la representatividad de los Saberes ‘Perfil de la Persona Graduada del Bachillerato en Biología’ en el plan de estudios actual del Bach. En Biología.
Perfil del Bach
Metodología.
Para analizar la representatividad de los Saberes en el plan de estudios actual, primeramente se realizó una revisión exhaustiva de los cursos del plan de estudios actual. Posteriormente, se asignó el ‘Saber’ que representa a cada objetivo. Finalmente, se obtuvieron las frecuencias de cada uno de los ‘Saberes’ y se elaboraron diferentes gráficos descriptivos, en los que se puede observar la representatividad de los Saberes en diferentes niveles.
Algoritmo de Trabajo
Resultados.
Procesamiento de los datos
Cargar datos
datos <-read_excel("Datos Cindy - copia.xlsx")mapeo <-read_excel("Guía_Cindy.xlsx")summary(mapeo)
Saberes Tipo Subtipo
Min. : 1.00 Length:80 Length:80
1st Qu.:20.75 Class :character Class :character
Median :40.50 Mode :character Mode :character
Mean :40.50
3rd Qu.:60.25
Max. :80.00
Obtener la frecuencia.
# Contar las ocurrencias de cada valor único en la columna "Saberes"conteo_saberes <-table(datos$Saberes)# Convertir los resultados en un nuevo dataframenuevo_df <-as.data.frame(conteo_saberes)# Renombrar las columnas en el nuevo dataframecolnames(nuevo_df) <-c("Valor", "Frecuencia")# Ordenar el nuevo dataframe por la columna "Valor" nuevo_df <- nuevo_df[order(nuevo_df$Valor), ]# Ver el nuevo dataframeprint(nuevo_df)
# Realizar una unión izquierda entre el dataframe "mapeo" y "nuevo_df" para incorporar las frecuenciasmapeo_con_frecuencias <-merge(mapeo, nuevo_df, by.x ="Saberes", by.y ="Valor", all.x =TRUE)# Reemplazar los valores NA (que representan los valores que no estaban en "nuevo_df") con 0mapeo_con_frecuencias$Frecuencia[is.na(mapeo_con_frecuencias$Frecuencia)] <-0# Ver el dataframe resultanteprint(mapeo_con_frecuencias)
Saberes Tipo Subtipo Frecuencia
1 1 F C 5
2 2 F C 9
3 3 F C 23
4 4 F C 10
5 5 F C 14
6 6 F C 10
7 7 F C 6
8 8 F C 1
9 9 F H 5
10 10 F H 3
11 11 F H 2
12 12 F H 0
13 13 F H 2
14 14 F H 4
15 15 F A 5
16 16 F A 6
17 17 F A 1
18 18 F A 0
19 19 F A 0
20 20 F A 0
21 21 F A 0
22 22 F A 0
23 23 F A 0
24 24 F A 0
25 25 F A 0
26 26 F A 0
27 27 F A 0
28 28 I C 2
29 29 I C 1
30 30 I C 1
31 31 I C 0
32 32 I H 3
33 33 I H 5
34 34 I H 1
35 35 I H 1
36 36 I H 2
37 37 I H 1
38 38 I H 1
39 39 I H 1
40 40 I H 0
41 41 I H 2
42 42 I H 2
43 43 I H 2
44 44 I H 0
45 45 I H 3
46 46 I H 2
47 47 I H 0
48 48 I A 0
49 49 I A 1
50 50 I A 0
51 51 I A 0
52 52 I A 0
53 53 I A 0
54 54 I A 0
55 55 I A 0
56 56 I C 0
57 57 S C 0
58 58 S C 0
59 59 S C 0
60 60 S C 0
61 61 S C 0
62 62 S H 0
63 63 S H 0
64 64 S H 0
65 65 S H 0
66 66 S H 0
67 67 S H 2
68 68 S H 1
69 69 S H 0
70 70 S H 0
71 71 S H 0
72 72 S H 0
73 73 S H 0
74 74 S A 0
75 75 S A 0
76 76 S A 0
77 77 S A 0
78 78 S A 0
79 79 S A 0
80 80 S A 0
Gráficación RadarChart
Grafico #1 por tipo
####Prepración del data frame para el primer radar chart# Sumar la columna Frecuencia para los tipos F, I y Ssuma_frecuencia <- mapeo_con_frecuencias %>%filter(Tipo %in%c('F', 'I', 'S')) %>%group_by(Tipo) %>%summarise(SumaFrecuencia =sum(Frecuencia))# Ver los resultadosprint(suma_frecuencia)
# A tibble: 3 × 2
Tipo SumaFrecuencia
<chr> <dbl>
1 F 106
2 I 31
3 S 3
#Pasarlo al formato del radar chart# Usamos pivot_wider para crear el nuevo data framedata_1 <- suma_frecuencia %>%pivot_wider(names_from = Tipo, values_from = SumaFrecuencia)# Mostrar el nuevo data frameprint(data_1)
# A tibble: 1 × 3
F I S
<dbl> <dbl> <dbl>
1 106 31 3
####Graficación primer radar char######################################## Create data for 'data_1'data_1 <-as.data.frame(matrix(c(106, 31, 3), ncol=3))colnames(data_1) <-c("Fundamentos", "Investigación", "Biología y sociedad")# To use the fmsb package, we add 2 rows to the dataframe: the max and min for each variable# let's assume min is 0 and max is 120data_1 <-rbind(rep(120, 3), rep(0, 3), data_1)# The radar chart for 'data_1'radarchart(data_1, axistype=1,# Custom polygonpcol=NA, pfcol=rgb(0.2,0.5,0.5,0.5), plwd=4,# Custom gridcglcol="grey", cglty=1, axislabcol="grey", caxislabels=seq(0,120,30), cglwd=0.8,# Custom labelsvlcex=0.8)
`summarise()` has grouped output by 'Tipo'. You can override using the
`.groups` argument.
# Utilizando pivot_wider para reorganizar el data frame y convertir 'Subtipo' en nombres de filasnuevo_data_frame <-pivot_wider( suma_frecuencias_2,names_from = Tipo, # Crea las nuevas columnas a partir de 'Tipo'values_from = SumaFrecuencia # Rellena las celdas con las frecuencias)# Convertir el tibble a un data frame regularnuevo_data_frame <-as.data.frame(nuevo_data_frame)# Establecer los nombres de filas utilizando 'Subtipo'rownames(nuevo_data_frame) <-c("Actitudes y valores", "Conocimientos teóricos", "Habilidades prácticas")# Eliminar la columna 'Subtipo' si ya no es necesarianuevo_data_frame <- nuevo_data_frame[, -1]colnames(nuevo_data_frame) <-c("Fundamentos", "Investigación", "Biología y sociedad")print(nuevo_data_frame)
#######################################Graficación 02#################### To use the fmsb package, I have to add 2 lines to the dataframe: the max and min of each variable to show on the plot!nuevo_data_frame <-rbind(rep(80,3) , rep(0,3) , nuevo_data_frame)# plot with default options:radarchart(nuevo_data_frame)
#Plot con colores# Color vectorcolors_in=c( rgb(0.2,0.5,0.5,0.4), rgb(0.8,0.2,0.5,0.4) , rgb(0.7,0.5,0.1,0.4) )# plot with default options:radarchart( nuevo_data_frame , axistype=1 , #custom polygonpcol=NA , pfcol=colors_in , plwd=4 , plty=1,#custom the gridcglcol="grey", cglty=1, axislabcol="grey", caxislabels=seq(0,80,20), cglwd=0.8,#custom labelsvlcex=0.8 )# Add a legendlegend(x=0.7, y=1, legend =rownames(nuevo_data_frame[-c(1,2),]), bty ="n", pch=20 , col=colors_in , text.col ="grey", cex=1.2, pt.cex=3)
Graficación Circular barplott
3 gráficos y con subtipo.
library(ggplot2)library(dplyr)#Agregar los títulos de saberesmapeo_con_frecuencias$Saberes <-paste("Saber", mapeo_con_frecuencias$Saberes)#Hacer 3 nuevos data frameFu <- mapeo_con_frecuencias %>%filter(Tipo =="F")Fu <-subset(Fu, select =-Tipo)I <- mapeo_con_frecuencias %>%filter(Tipo =="I")I <-subset(I, select =-Tipo)S <- mapeo_con_frecuencias %>%filter(Tipo =="S")S <-subset(S, select =-Tipo)#Eliminar la columna tipo en los 3#######Graficación#######################################################Defino una función con los parámetros de graficaciónplot_circular_data <-function(data, empty_bar =4) {# Añadir las barras vacías al final de cada grupo/subtipo to_add <-data.frame(matrix(NA, empty_bar *nlevels(data$Subtipo), ncol(data)))colnames(to_add) <-colnames(data) to_add$Subtipo <-rep(levels(data$Subtipo), each=empty_bar) data <-rbind(data, to_add) data <- data %>%arrange(Subtipo) data$id <-seq(1, nrow(data))# Obtener el nombre y la posición en el eje y de cada etiqueta label_data <- data number_of_bar <-nrow(label_data) angle <-90-360* (label_data$id -0.5) / number_of_bar label_data$hjust <-ifelse(angle <-90, 1, 0) label_data$angle <-ifelse(angle <-90, angle +180, angle)# Crear el gráfico p <-ggplot(data, aes(x =as.factor(id), y = Frecuencia, fill = Subtipo)) +geom_bar(stat ="identity", alpha =0.5) +ylim(-100, 120) +theme_minimal() +theme(legend.position ="none",axis.text =element_blank(),axis.title =element_blank(),panel.grid =element_blank(),plot.margin =unit(rep(-1, 4), "cm") ) +coord_polar(start =0) +# 'start' parameter ensures that the polar plot starts from the topgeom_text(data = label_data, aes(x = id, y = Frecuencia +10, label = Saberes, hjust = hjust), color ="black", fontface ="bold", alpha =0.6, size =2.5, angle = label_data$angle, inherit.aes =FALSE)return(p)}#Se hacen los 3 gráficosplot_circular_data(Fu)
plot_circular_data(I)
plot_circular_data(S)
Resumiendo los resultados.
Resumen de los resultados
Conclusiones.
Teóricamente, y según los programas de los cursos actuales, los biólogos con Bachillerato de la UCR se gradúan principalmente con altos conocimientos de los fundamentos teóricos y con habilidades prácticas de investigación. Además, hay un claro déficit de conocimientos en la relación entre Biología y Sociedad.