El conjunto de datos para este ejercicio Books in Spanish: token count proporciona un resumen de diferentes tipos de libros. Los datos contienen el título y la categoría del libro, más allá de eso, también tiene el recuento total de diferentes tipos de palabras (nombres, verbos, adjetivos, etc.) presentes en los libros.
Para realizar el análisis de datos, se crearán algunos gráficos para mostrar la relación entre el recuento total de adjetivos y los verbos de los libros. Además, se trazará una nube de palabras de los títulos del libro.
Los libros del conjunto de datos se escribieron originalmente en cuatro idiomas diferentes. Para este proyecto, el conjunto de datos se filtrará para contener solo los libros que se escribieron originalmente en inglés y español. En consecuencia, el análisis de datos podrá comparar las similitudes y diferencias de los libros escritos en estos dos idiomas diferentes.
Para comenzar este proyecto, todos las las librerías necesarias para completar el proyecto se cargarán en R. Después de eso, el conjunto de datos se ingresará en R. Además, se realizará un análisis básico de las variables del conjunto de datos.
# Importar las librerías
library(tidyverse)
library(plotly)
library(tidytext)
library(stopwords)
library(wordcloud2)
# Importar lo conjunto de datos
data <- read.csv('BooksDataset.csv', encoding = "UTF-8", stringsAsFactors = TRUE)
# Revisar el conjunto de datos
str(data)
## 'data.frame': 611 obs. of 18 variables:
## $ Author : Factor w/ 103 levels "Asensi Matilde",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Year : int 1999 2000 2001 2003 2006 2007 2010 2012 2015 2019 ...
## $ Title : Factor w/ 608 levels " (Guardianes de la Ciudadela 2_El secreto de Xein",..: 204 321 219 186 554 447 448 449 199 520 ...
## $ Source.language : Factor w/ 4 levels "alemán","español",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ Category : Factor w/ 4 levels "biografía","ensayo",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ X..of.names : int 12287 21151 36917 32039 29320 13711 16425 20079 37351 20912 ...
## $ X..of.verbs : int 9266 18037 31255 29090 26634 11708 13933 16810 33829 18468 ...
## $ X..of.adjectives : int 4630 7612 13668 11751 12206 4260 5268 6276 12995 8022 ...
## $ X..of.adverbs : int 3098 6005 10115 9541 8781 3331 4100 5185 11685 6386 ...
## $ X..of.pronouns : int 3953 8429 14255 13527 12194 5796 7112 9110 16244 8536 ...
## $ X..of.determiners : int 8463 15596 27845 24234 22908 10430 11914 14563 26465 15204 ...
## $ X..of.prepositions : int 8884 15991 26228 23867 21945 10596 12366 15102 26905 15430 ...
## $ X..of.conjuctions : int 3734 7361 12874 12050 10442 5367 5920 7334 14039 7522 ...
## $ X..of.interjections: int 37 45 94 80 47 6 44 26 61 18 ...
## $ X..of.punctuation : int 10495 20281 36028 30284 23274 11390 14410 18208 35907 17523 ...
## $ X..of.acronyms : int 2 4 9 11 2 3 1 8 10 1 ...
## $ X..of.unknown : int 935 2692 3660 2954 2638 1735 2085 2911 3156 1552 ...
## $ Total.tokens : int 65784 123204 212948 189428 170391 78333 93578 115612 218647 119574 ...
Con el análisis de datos inicial, se puede notar que el conjunto de datos tiene un total de 18 columnas y 611 filas.
Más allá de eso, también se puede observar que la variable de la columna 3 Source.language representa el lenguaje del libro. Por lo tanto, es necesario filtrar el conjunto de datos seleccionando solo los valores español e inglés de esta columna.
Finalmente, las columnas utilizadas para el análisis de datos se filtrarán del conjunto de datos y sus nombres se refinarán para mostrar una definición clara de cada variable.
# Separar los libros en spañol y ingles
data <- data %>%
filter(Source.language == 'español' |
Source.language == 'inglés') %>%
select('Title','Source.language','Category','X..of.verbs','X..of.adjectives')
# Refinar nombres de las columnas
names(data) <- c('Titulo','Idioma','Categoria','Verbo','Adjetivo')
# Revisar el conjunto de datos
str(data)
## 'data.frame': 578 obs. of 5 variables:
## $ Titulo : Factor w/ 608 levels " (Guardianes de la Ciudadela 2_El secreto de Xein",..: 204 321 219 186 554 447 448 449 199 520 ...
## $ Idioma : Factor w/ 4 levels "alemán","español",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ Categoria: Factor w/ 4 levels "biografía","ensayo",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ Verbo : int 9266 18037 31255 29090 26634 11708 13933 16810 33829 18468 ...
## $ Adjetivo : int 4630 7612 13668 11751 12206 4260 5268 6276 12995 8022 ...
Después de la limpieza de datos obtenemos un total de 5 columnas y 578 filas en el conjunto de datos. Esos nombres y definiciones de variables se ilustran en la Tabla 1.
| Columna | Descripción |
|---|---|
| Titulo | Titulo del libro |
| Idioma | Idioma en el que el libro fue escrito originalmente |
| Categoria | Categoría de libro |
| Verbo | Cantidad de palabras que son verbos |
| Adjetivo | Cantidad de palabras que son adjetivos |
Antes de comenzar el análisis de datos, es necesario verificar si faltan valores en el conjunto de datos.
# Verificar valores faltantes del conjunto de datos
any(is.na(data))
## [1] FALSE
No faltan valores en el conjunto de datos. En consecuencia, el análisis del conjunto de datos puede comenzar
Inicialmente se trazará un gráfico para ilustrar la variable Categoria de los libros de acuerdo con su lenguaje escrito original que está representado por la variable Idioma.
# Plotar gráfico
plot1 <- ggplot(data, aes(x = Categoria, fill = Idioma)) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c('brown', 'blue')) +
theme_minimal()
ggplotly(plot1)
La Figura 1 muestra que la categoría principal a la que pertenecen los libros es novela. Más allá de eso, también se puede notar que hay más libros escritos originalmente en inglés en el conjunto de datos.
Para continuar con el análisis de datos, se creará la Figura 2 para mostrar la relación entre la cantidad de adjetivos y verbos de los libros de acuerdo con su idioma original. Más allá de eso, también se crearán dos líneas de regresión lineal para mostrar la tendencia de la cantidad de verbos y adjetivos del libros. Tambien es posisble ver el título de cada libro en Figura 2.
# Plotar gráfico
plot2 <-
ggplot(data,
aes(x = Adjetivo, y = Verbo, color = Idioma, label = Titulo)) +
geom_point(alpha = 0.4) +
geom_smooth() +
scale_color_manual(values = c('brown', 'blue')) +
labs(x = 'Cantidad de Adjetivos', y = 'Cantidad de Verbos') +
theme_minimal()
ggplotly(plot2)
Según la Figura 2, se puede concluir que los libros escritos originalmente en español tienden a tener más verbos que adjetivos cuando el libro es más largo. De manera diferente que cuando los libros son más cortos, donde los libros tienden a tener la misma proporción de verbos y adjetivos.
Una nube de palabras es una visualización popular de palabras asociadas con datos de texto, el gráfico exhibe la frecuencia de cada palabra presente en el conjunto de datos. Para crear una nube de palabras, primero es necesario limpiar de los datos los símbolos, números y stopwords. De esa manera, la visualización ilustrará las palabras importantes y significativas del conjunto de datos.
A menudo algunas palabras son frecuentes pero proporcionan poca información. Estas se llaman stopwords, y es importante eliminarlas antes de crear el análisis de nube de palabras. Un ejemplo de stopword en español son de, la, el, que, en, y, entre otros.
Por lo tanto, antes de trazar la nube de palabras, el conjunto de datos se limpiará y la palabra de los libros escritos originalmente en español se separará del libro originalmente escrito en inglés.
# Retirar números y fichas de columna Titulo
data$Titulo <- as.character(data$Titulo)
data$Titulo <-
gsub(data$Titulo, pattern = "[0-9]+|[[:punct:]]|\\(.*\\)", replacement = "")
data$Titulo <- tolower(data$Titulo)
# Obtener stopwords en español
stopwords <- stopwords("spanish")
# Crear conjunto de datos auxiliar
aux <- data %>%
select(Titulo, Idioma) %>%
unnest_tokens(word, Titulo) %>%
filter(!word %in% stopwords)
# Separe lo conjunto de datos según idioma
wordclound_espanol <- filter(aux, Idioma =='español')
wordclound_ingles <- filter(aux, Idioma =='inglés')
# Crear datos del nube de palabras
wordclound_ingles <- wordclound_ingles %>% count(word, sort = TRUE)
wordclound_espanol <- wordclound_espanol %>% count(word, sort = TRUE)
wordclound_df <- data.frame('word' = c(wordclound_espanol$word, wordclound_ingles$word),
'freq' = c(wordclound_espanol$n, wordclound_ingles$n))
# Colores de nube de palabras según idioma
label_lang <-
c(rep('brown', nrow(wordclound_espanol)), rep('blue', nrow(wordclound_ingles)))
Finalmente, la nube de palabras de la Figura 3 muestra las palabras en color \(\color{brown}{\text{marrón}}\) que representan las palabras de los títulos de los libros escritos originalmente en idioma español \(\color{brown}{\text{español}}\), en contraste, las palabras en \(\color{blue}{\text{azul}}\) representan las palabras de los títulos de los libros escritos originalmente en idioma \(\color{blue}{\text{inglés}}\). Más allá de eso, el número ilustra la frecuencia de cada palabra en el conjunto de datos.
# Plotar nube de palabras
wordcloud2(data = wordclound_df,
color = label_lang,
size = 2,
ellipticity = 1,
shape = "oval")
Para concluir, el análisis de datos realizado por este informe demuestra que la mayoría de los libros del conjunto de datos son novela, esto se puede ver por la gran cantidad de palabras historia, crónicas y odisea en la nube de palabras ilustrada en la Figura 3.
Más allá de eso, la comparación entre las palabras de los títulos de los libros de diferentes idiomas mostró que el libro de origen español tiene más acción. Esto se demuestra por la gran cantidad de la palabra alatriste, que es una serie épica española de novelas de guerra de 2006 escrita por el autor español Arturo Pérez-Reverte. Además, por la gran cantidad de verbos presentes en los libros en español, como lo ilustra la Figura 2.