Análisis de conteo de palabras para conocer su frecuencia.
Para este caso se hace el análisis de la charla “Detección de cáncer de mama con Inteligencia Artificial” impartida por David Gonzalez el 27 de abril de 2021
- Esta es la primera asignación de la materia de probabilidad y estadística de la clase de las 9:00 a.m. (LMV).
Detección de cáncer de mama con Inteligencia Artificial
Paquetes
library(pacman)
p_load("dplyr", "stringr", "ggplot2", "wordcloud","rmdformats","vembedr", "xfun")
Video de charla
embed_url("https://www.youtube.com/watch?v=JZ5v42qZAAU")
Funciones
FreqCategory <- function(value) {
strCategory <- ifelse(value <=5, " 5",
ifelse(value <=10, " 10",
ifelse(value <=20, " 20",
ifelse(value <=50, " 50",
ifelse(value <=100, " 100",
ifelse(value <=500, " 500",
ifelse(value <=1000, " 1,000",
">1,000")))))))
strCategory
}
Datos
setwd("~/ea9am")
cancerMama <- readLines ("cancermama.txt",encoding = "UTF-8")
head(cancerMama)
## [1] "x" "" "y" "" "j" ""
Conteo de lineas
# Longitud de vector
intLineCount <- length(cancerMama)
intLineCount
## [1] 2814
Palabras por linea
# separar
lstUNPrfLines <- str_split(cancerMama," ")
# palabras por linea
vciUNPrfWperL <- unlist(lapply(lstUNPrfLines, length))
# imprimir media de palabras por linea
mean(vciUNPrfWperL)
## [1] 3.656716
Conteo de palabras
# deslistar para obtener un vector de palabras
vcsUNPrfWords <- unlist(lstUNPrfLines)
# recuento total de palabras = longitud del vector
intWordCount <- length(vcsUNPrfWords)
# imprimir
intWordCount
## [1] 10290
Mostrar palabras
head(vcsUNPrfWords,100)
## [1] "x" "" "y" ""
## [5] "j" "" "y" "todavía"
## [9] "no" "está" "ahí" "están"
## [13] "ya" "está" "" "llegando"
## [17] "a" "las" "personas" "súper"
## [21] "" "estamos" "en" "vivo"
## [25] "" "muy" "buenas" "tardes"
## [29] "a" "todos" "y" "todas"
## [33] "mi" "" "nombre" "es"
## [37] "lourdes" "velasco" "y" "soy"
## [41] "parte" "" "del" "equipo"
## [45] "de" "hacerla" "calixto" "trabajando"
## [49] "" "desde" "el" "componente"
## [53] "de" "emprendimiento" "" "muchas"
## [57] "gracias" "por" "acompañarnos" "a"
## [61] "esta" "" "charla" "sobre"
## [65] "inteligencia" "artificial" "les" ""
## [69] "comparto" "que" "al" "finalizar"
## [73] "la" "sesión" "" "tendremos"
## [77] "unos" "minutos" "para" "preguntas"
## [81] "y" "" "respuestas" ""
## [85] "les" "pedimos" "de" "favor"
## [89] "las" "escriban" "en" "la"
## [93] "" "parte" "de" "ley"
## [97] "y" "en" "la" "sección"
Limpieza de palabras
# lower case
vcsUNPrfWords <- str_to_lower(vcsUNPrfWords)
# remove numbers
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:digit:]]", "")
# remove punctuation
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:punct:]]", "")
# remove white spaces
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:space:]]", "")
# remove special chars
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[~@#$%&-_=<>]", "")
# remove empty vectors
vcsUNPrfWords <- vcsUNPrfWords[vcsUNPrfWords != ""]
# hack & remove $
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="$", "")
# head
head(vcsUNPrfWords,100)
## [1] "x" "y" "j" "y"
## [5] "todavía" "no" "está" "ahí"
## [9] "están" "ya" "está" "llegando"
## [13] "a" "las" "personas" "súper"
## [17] "estamos" "en" "vivo" "muy"
## [21] "buenas" "tardes" "a" "todos"
## [25] "y" "todas" "mi" "nombre"
## [29] "es" "lourdes" "velasco" "y"
## [33] "soy" "parte" "del" "equipo"
## [37] "de" "hacerla" "calixto" "trabajando"
## [41] "desde" "el" "componente" "de"
## [45] "emprendimiento" "muchas" "gracias" "por"
## [49] "acompañarnos" "a" "esta" "charla"
## [53] "sobre" "inteligencia" "artificial" "les"
## [57] "comparto" "que" "al" "finalizar"
## [61] "la" "sesión" "tendremos" "unos"
## [65] "minutos" "para" "preguntas" "y"
## [69] "respuestas" "les" "pedimos" "de"
## [73] "favor" "las" "escriban" "en"
## [77] "la" "parte" "de" "ley"
## [81] "y" "en" "la" "sección"
## [85] "de" "comentarios" "de" "la"
## [89] "transmisión" "en" "vivo" "de"
## [93] "facebook" "y" "bueno" "pues"
## [97] "antes" "de" "iniciar" "queremos"
Data frame de palabras normales
# make data frame
dfrUNPrfWords <- data.frame(vcsUNPrfWords)
colnames(dfrUNPrfWords) <- c("Words")
dfrUNPrfWords$Words <- as.character(dfrUNPrfWords$Words)
# normal word count
head(dfrUNPrfWords,10)
## Words
## 1 x
## 2 y
## 3 j
## 4 y
## 5 todavía
## 6 no
## 7 está
## 8 ahí
## 9 están
## 10 ya
Conteo de palabras “normales”
# resumiendo los datos
dfrUNPrfFreq <- dfrUNPrfWords %>%
group_by(Words) %>%
summarise(Freq=n()) %>%
arrange(desc(Freq))
head(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 de 504
## 2 que 411
## 3 a 308
## 4 la 234
## 5 es 226
## 6 y 204
Nube de palabras normales
# nube de palabras
wordcloud(dfrUNPrfFreq$Words[1:100], dfrUNPrfFreq$Freq[1:100], random.order=F, max.words=100, colors=brewer.pal(8, "Dark2"))
Data frame de palabras realmente significantes
Quitamos “stop words”
# significant words only
# remove all words with len <= 2
dfrUNPrfWords <- filter(dfrUNPrfWords, str_length(Words)>2)
# remover las "stop words" o palabras comunes como conjunciones
vcsCmnWords <- c("de","que","en","y","la","a","el","es","una","un","pues","no","para","los","se","las","como","con","más","por","lo","hay","del","o","entonces","este","está","nos","pero","también","creo","porque","también","yo","ya","esta","si","me","al","son","tiene","donde","bueno","ha","sobre","ejemplo","bien","gracias","ser","eso","todo","uso","ver","tener","esto","estos","muchas","cómo","cuando","sea","tenemos","su","tienen","así","desde","han","parte","ahí","les","tal","qué","estar","vamos","nosotros","algoritmos","nuestro","van","aquí","hacer","muchos","todos","buenos","esa","ocurre","obtuvimos","varios","puede","otros","tres","poder","fue","utilizar","otra","clima","entre","queremos","cualquier","estamos","tan","esos")
dfrUNPrfWords <- filter(dfrUNPrfWords, !(Words %in% vcsCmnWords))
# remover las palabras no significativas para este contexto
vcsBadWords <- c("decir","muy","están","cada","cuenta","uno","algo","dos","clase","david","estas","fueron","pueden","imagen","pueden","grupo","bancos","banco","datos","forma")
dfrUNPrfWords <- filter(dfrUNPrfWords, !(Words %in% vcsBadWords))
# show
head(dfrUNPrfWords)
## Words
## 1 todavía
## 2 llegando
## 3 personas
## 4 súper
## 5 vivo
## 6 buenas
Conteo de palabras significativas
dfrUNPrfFreq <- dfrUNPrfWords %>%
group_by(Words) %>%
summarise(Freq=n()) %>%
arrange(desc(Freq))
head(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 algoritmo 69
## 2 cáncer 37
## 3 segmentación 34
## 4 clasificación 28
## 5 patrones 24
## 6 sistema 24
“Cola” de palabras significativas
tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 wilber 1
## 2 wisconsin 1
## 3 word 1
## 4 work 1
## 5 zacatones 1
## 6 zona 1
Eliminar palabras dispersas
# palabras con una frecuencia absoluta menor a 5
dfrUNPrfFreq <- filter(dfrUNPrfFreq, Freq>5)
tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 medidas 6
## 2 nuestra 6
## 3 original 6
## 4 píxeles 6
## 5 presentan 6
## 6 primero 6
Conteo final de palabras
# total word count = length of vector
intWordCountFinal <- length(dfrUNPrfFreq$Words)
# print
intWordCountFinal
## [1] 106
Categorización por frecuencias
# add FrequencyCategory colum
dfrUNPrfFreq <- mutate(dfrUNPrfFreq, Fcat=FreqCategory(dfrUNPrfFreq$Freq))
# new data frame for Frequency Of Categorized Frequencies ...
dfrUNPrfFocf <- dfrUNPrfFreq %>% group_by(Fcat) %>% summarise(Rfrq=n())
#
dfrUNPrfFocf$Fcat <- factor(dfrUNPrfFocf$Fcat, levels=dfrUNPrfFocf$Fcat, ordered=T)
# head
head(dfrUNPrfFocf,10)
## # A tibble: 4 x 2
## Fcat Rfrq
## <ord> <int>
## 1 " 10" 78
## 2 " 20" 21
## 3 " 50" 6
## 4 " 100" 1
Nueva nube de palabras
wordcloud(dfrUNPrfFreq$Words[1:50], dfrUNPrfFreq$Freq[1:50], random.order=F, max.words=100, colors=brewer.pal(8, "Dark2"))
Gráfica de barra de palabras
ggplot(slice(dfrUNPrfFreq,1:30), aes(x=reorder(Words,-Freq),y=Freq)) +
geom_bar(stat="identity", fill=rainbow(30)) +
ylab("Frequency") +
xlab("Words") +
ggtitle("Primeras 30 palabras con mayor frecuencia") +
theme(plot.title=element_text(size=rel(1.5), colour="blue")) +
coord_flip()
Gráfica de frecuencia
ggplot(dfrUNPrfFocf, aes(Fcat,Rfrq))+
geom_bar(stat="identity", width=0.8, fill=rainbow(length(dfrUNPrfFocf$Fcat))) +
xlab("Words With Frequency Less Than") + ylab("Frequency") +
theme(axis.text.x=element_text(angle=60, hjust=1, vjust=1),axis.text.y=element_text(angle=60, hjust=1, vjust=1),plot.title=element_text(size=rel(1.5), colour="blue")) +
ggtitle("Frequency Of Word Count")
Longitud de palabras
dfrUNPrfChrs <- data.frame(Chars=nchar(dfrUNPrfFreq$Words))
#intRowCount <- nrow(table(dfrUNPrfChrs))
ggplot(dfrUNPrfChrs, aes(x=Chars)) +
geom_histogram(binwidth=1, fill='blue') +
geom_vline(xintercept=mean(nchar(dfrUNPrfFreq$Words)), color='black', size=1.5, alpha=.5) +
xlab("Word Length (Chars)") + ylab("Number Of Words (Frequency)")
Conclusión
Tras haber limpiado algunas de las palabras que eran poco significativas o irrelevantes, nos damos cuenta de que las palabras que más se repiten en la conferencia, hacen sentido con el tema que se toca en la misma. Como se puede apreciar en la nube de palabras, donde ‘algoritmo’ y ‘cáncer’ son palabras que tienen bastante frecuencia, como era de esperarse debido a que es una charla acerca de la detección de cáncer de mama con inteligencia artificial. Con esto nos damos cuenta de que el conteo de palabras es funcional y nos dice mucho sobre el contexto, siendo muy útil para realizar diversos estudios en otros ámbitos.