Mapeo de saberes final

Author

Diwo

Mapeo de saberes

Librerias.

library(ggplot2) 
library(readxl) 
library(dplyr) 

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(fmsb) 
library(tidyverse) 
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ lubridate 1.9.2     ✔ tibble    3.2.1
✔ purrr     1.0.1     ✔ tidyr     1.3.0
✔ readr     2.1.4     
── 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 dataframe
nuevo_df <- as.data.frame(conteo_saberes)

# Renombrar las columnas en el nuevo dataframe
colnames(nuevo_df) <- c("Valor", "Frecuencia")

# Ordenar el nuevo dataframe por la columna "Valor" 
nuevo_df <- nuevo_df[order(nuevo_df$Valor), ]

# Ver el nuevo dataframe
print(nuevo_df)
   Valor Frecuencia
1      1          5
2      2          9
3      3         23
4      4         10
5      5         14
6      6         10
7      7          6
8      8          1
9      9          5
10    10          3
11    11          2
12    13          2
13    14          4
14    15          5
15    16          6
16    17          1
17    28          2
18    29          1
19    30          1
20    32          3
21    33          5
22    34          1
23    35          1
24    36          2
25    37          1
26    38          1
27    39          1
28    41          2
29    42          2
30    43          2
31    45          3
32    46          2
33    49          1
34    67          2
35    68          1

Nuevo data frame de mapeo con las frecuencias

# Realizar una unión izquierda entre el dataframe "mapeo" y "nuevo_df" para incorporar las frecuencias
mapeo_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 0
mapeo_con_frecuencias$Frecuencia[is.na(mapeo_con_frecuencias$Frecuencia)] <- 0

# Ver el dataframe resultante
print(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 S
suma_frecuencia <- mapeo_con_frecuencias %>%
  filter(Tipo %in% c('F', 'I', 'S')) %>%
  group_by(Tipo) %>%
  summarise(SumaFrecuencia = sum(Frecuencia))

# Ver los resultados
print(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 frame
data_1 <- suma_frecuencia %>%
  pivot_wider(names_from = Tipo, values_from = SumaFrecuencia)

# Mostrar el nuevo data frame
print(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 120
data_1 <- rbind(rep(120, 3), rep(0, 3), data_1)

# The radar chart for 'data_1'
radarchart(data_1, axistype=1,
           # Custom polygon
           pcol=NA, pfcol=rgb(0.2,0.5,0.5,0.5), plwd=4,
           
           # Custom grid
           cglcol="grey", cglty=1, axislabcol="grey", caxislabels=seq(0,120,30), cglwd=0.8,
           
           # Custom labels
           vlcex=0.8)

Gráfico #2 por tipo-subtipo

# Filtrar y sumar las frecuencias
suma_frecuencias_2 <- mapeo_con_frecuencias %>%
  filter(Tipo %in% c("F", "I", "S") & Subtipo %in% c("C", "H", "A")) %>%
  group_by(Tipo, Subtipo) %>%
  summarise(SumaFrecuencia = sum(Frecuencia))
`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 filas
nuevo_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 regular
nuevo_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 necesaria
nuevo_data_frame <- nuevo_data_frame[, -1]

colnames(nuevo_data_frame) <- c("Fundamentos", "Investigación", "Biología y sociedad")



print(nuevo_data_frame)
                       Fundamentos Investigación Biología y sociedad
Actitudes y valores             12             1                   0
Conocimientos teóricos          78             4                   0
Habilidades prácticas           16            26                   3
#######################################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 vector

colors_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 polygon
    pcol=NA , pfcol=colors_in , plwd=4 , plty=1,
    #custom the grid
    cglcol="grey", cglty=1, axislabcol="grey", caxislabels=seq(0,80,20), cglwd=0.8,
    #custom labels
    vlcex=0.8 
    )

# Add a legend
legend(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 saberes

mapeo_con_frecuencias$Saberes <- paste("Saber", mapeo_con_frecuencias$Saberes)

#Hacer 3 nuevos data frame
Fu <- 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ón

plot_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 top
    geom_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áficos
plot_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.

Conclusiones