A pesar de las fuertes críticas a las que son sujetas, las evaluaciones de cursos hechas por estudiantes han llegado para quedarse. Una práctica común en estas evaluaciones, es darle la oportunidad a los estudiantes para que opinen con respecto al curso.
Después de que el curso concluyó y que los estudiantes opinaron, los profesores nos sentamos a revisar las evaluaciones y a leer los comentarios de los estudiantes. La pregunta del millón es: ¿Qué hacemos realmente con esos comentarios? En clases pequeñas no es problema contar palabras y sacar conclusiones, pero la situación se complica rápidamente en cursos grandes.
El objetivo de esta nota técnica es presentar dos análisis sencillos para ayudar a los profesores a entender mejor e interpretar los comentarios de los estudiantes. El primer análisis es un conteo de palabras, de una y dos palabras. El segundo análisis es una técnica de modelación de tópicos, que es una técnica de machine learning para identificar temas en los comentarios. Aunque análisis de sentimientos es posibles, se omitirá por esta ocasión.
Este tutorial no pretende reemplazar su experencia, simplemente es una alternativa para ayudarle a estructurar la información contenida en los comentarios y ayudarle en su interpretación de los comentarios de su curso.
Lo más probable es que las evaluaciones de sucurso estén en formato pdf, así que será necesario hacer un par de manipulaciones entre adobe y pdf antes de comenzar. Si está en su capacidad, pida que le entreguen las evaluaciones de su curso en formato csv.
Para esta nota técnica, haré uso de una de las evaluaciones de mis cursos.
Seleccione el texto de los comentarios de la evaluación de su curso, así como su fuera a copiarlos para pegarlos en word. Abra Excel y pegue ahí los comentarios. Deberá de quedarle un archivo con una sola columna y tantas filas como comentarios. Agregue una nueva fila a la izquierda de los comentarios y asignele número correlativos desde 1 hasta el último comentario. Este número será utilizado como número de identificación del comentario. Su archivo tendrá dos columnas. La columna A con el número correlativo y la columna B con los comentarios. Guarde el archivo como commna separated values (*.csv). Guarde el archivo en un carpeta de fácil acceso.
El codigo a continuación le permitirá importar el archivo csv que creó. La función head le permitirá visuaizar las primeras observaciones de los datos.
library(readr)
comentarios <- read_csv("/Users/luissandoval/Desktop/Personal_Data_Science_Projects/Estadistica_evaluacion.csv")
head(comentarios)
## # A tibble: 6 x 2
## Review_id Comentarios
## <dbl> <chr>
## 1 1 1 todo
## 2 2 2 todo bien
## 3 3 3 todo bien
## 4 4 4 todo bien.
## 5 5 5 tiene todo lo necesario para aprender adecuadamente igualmente la…
## 6 6 6 sin comentarios, el curso fue muy bueno
Descargue este archivo y también importelo a r: https://drive.google.com/file/d/1DZNo3kO2lcsyrvMu_ewWQWSL4nBzuYgz/view?usp=sharing
Estas son palabras stop, y se consideradas palabras de relleno del texto. Las utilizaremos para eliminarlas de nuestro análisis.
palabras_stop <- read_csv("/Users/luissandoval/Desktop/Personal_Data_Science_Projects/palabras_stop.csv")
head(palabras_stop)
## # A tibble: 6 x 1
## word
## <chr>
## 1 0
## 2 1
## 3 2
## 4 3
## 5 4
## 6 5
El procedimiento de tokenizado separa los comentarios en palabras, mientras que la función anti_join se asegura de remover las palbras de relleno. El resultado es que nuestro archivo original de 118 comentarios, ahora tiene 562 observaciones o palabras útiles para el análisis.
library(tidytext)
library(tidyverse)
comentarios1 <- comentarios %>%
unnest_tokens(word, Comentarios) %>%
anti_join(palabras_stop)
head(comentarios1, n = 10)
## # A tibble: 10 x 2
## Review_id word
## <dbl> <chr>
## 1 5 necesario
## 2 5 aprender
## 3 5 adecuadamente
## 4 5 igualmente
## 5 5 dudas
## 6 5 claran
## 7 5 video
## 8 5 conferencias
## 9 5 videos
## 10 5 sube
Ahora tenemos un archivo con información útil a partir de los comentarios de los estudiantes.
El primer análisis que haremos será un sencillo conteo de la palabras, para poder identificar las palabras mencionadas con mayor frecuencia. La función count estimará la frecuencia con que se menciona cada palabra. La función arrange se encarga de ordenar las palabras de la mayor a la menor frecuencia y filter de que únicamente observemos palabras con frecuencias de dos o más. La frecuencia puede y debe ajustarse según las condiciones de cada evaluación. Este procedimiento resultará en la reducción de la base de datos de 562 a 30 observaciones últiles para el análisis.
comentarios2 <- comentarios1 %>%
count(word) %>%
arrange(desc(n)) %>%
filter(n > 2)
Ahora proceda a visualizar las frecuencias. La función mutate creará una nueva variable que permitirá visualizar el gráfico con las frecuencias mayores en la parte superior.
comentarios3 <- comentarios2 %>%
mutate(word2 = fct_reorder(word, n))
ggplot(comentarios3, aes(x = word2, y = n)) +
geom_col() +
coord_flip() +
theme_classic()
La modelación de tópicos le permitira identificar las palabras más probables según la cantidad de tópicos que usted desee identificar en los comentarios. Si no sabe cuantos tópicos modelar, puede preguntarme y con gusto le explicaré.
Note que para este análisis estamos partiendo de comentarios1, que es el archivo después de haber eliminado únicamente las palabras de relleno.
El resutado del código será un gráfico triple, con las palbras más probables en cada tópico. La interpretación es subjetiva y debe ser sustentada a partir de leer los comentarios de los estudiantes.
De este análisis se pueden interpretar los tópicos de esta manera:
Tópico 1: Los estudiantes hacen comentarios haciendo referencia al docente y la clase. Note que no hay sentimiento positivo ni negativo.
Tópico 2: Los estudiantes hacen referencia al excelente profesor que soy. Fin de la discusión.
Tópico 3:Los estudiantes hacen referencias a los temas del curso/clase. Sin sentimiento positivo ni negativo.
library(topicmodels)
dtm_comentarios <- comentarios1 %>%
count(word, Review_id) %>%
cast_dtm(Review_id, word, n)
lda_out <- LDA(
dtm_comentarios,
k = 3,
method = "Gibbs",
control = list(seed = 42)
)
lda_topics <- lda_out %>%
tidy(matrix = "beta")
lda_topics %>%
arrange(desc(beta))
## # A tibble: 1,185 x 3
## topic term beta
## <int> <chr> <dbl>
## 1 3 temas 0.0611
## 2 3 curso 0.0517
## 3 1 docente 0.0509
## 4 2 contenido 0.0486
## 5 3 clase 0.0471
## 6 2 excelente 0.0442
## 7 1 clase 0.0299
## 8 2 gusta 0.0223
## 9 1 doctor 0.0215
## 10 1 dr 0.0215
## # … with 1,175 more rows
word_probs2 <- lda_topics %>%
group_by(topic) %>%
top_n(10, beta) %>%
ungroup() %>%
mutate(term2 = fct_reorder(term, beta))
ggplot(
word_probs2,
aes(x = term2, y = beta, fill = as.factor(topic))
) +
geom_col(show.legend = FALSE) +
facet_wrap(~topic, scales = "free") +
coord_flip() +
theme_classic()
El minado de texto, incluso en su forma más sencilla, ofrece una alternativa para ayudar a estructurar la información contenida en los comentarios de la evaluación de cursos hechas por los estudiantes. Si bien, la interpretación de los resultados es subjetiva, poder contar las palabras e identificar las palabras más probables según la cantidad de tópicos deseados, ayuda a reducir el sesgo en la interpretación de los comentarios.