A1U1

Alex Gael García Acosta

29/1/2022

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.