Desde hace casi ya, un año y medio, a todos nos ha cambiado la vida, de alguna u otra manera, debido a la pandemia provocada por el Coronavirus. En cada lugar del mundo afecta de manera diferente a cada Pais, Región, ciudad, etc.
Este hecho ha acelerado el proceso de digitalización, por el cual, los procedimientos de trabajo y las relaciones sociales, estan cambiando continuamente.
Esta “transformación digital”, a nivel mundial, conlleva modificaciones, que más tarde o más temprano deberán llevarse a cabo. Por ello, y desde un punto de vista de aprendizaje, se ha realizado este pequeño proyecto, sobre la digitalización en España.
Se han tenido en cuenta, cuatro informes, que han servido de base para analizar este proceso de digitalización y su relación, correlación, entre diferentes sectores de España.
Como se indica en la bibliografía, los documentos son públicos, y son:
Con estos textos se ha llevado a cabo, este proyecto de Text Mining.
options(scipen = 999999)
library(NLP)
library(tm) # Para stopwords en español
library(tidyverse)
library(tidytext)
library(data.table)
library(readxl)
library(knitr)
library(pdftools)
library(scales)
library(gridExtra)
library(stringi) # Para quitar tildes
library(RColorBrewer) # Para nube de palabras
library(MASS)
library(wordcloud) # Para nube de palabras
# Cargamos datos
df1<-pdf_text("Agenda_Digital_2025_270121.pdf")
df2<-pdf_text("PlanCompetenciasDigitale_270121.pdf")
df3<-pdf_text("PlanDigitalizacionAdministracionesOptimizado_270121.pdf")
df4<-pdf_text("PlanDigitalizacionPYME01Optimizado_270121.pdf")
# Convertimos el texto a formato estructurado
df1<- tibble(line = 1:45, text = df1)
df2<- tibble(line = 1:72, text = df2)
df3<- tibble(line = 1:61, text = df3)
df4<- tibble(line = 1:51, text = df4)
El proceso de limpieza de texto, dentro de text mining, consiste en analizar, modificar y eliminar todo aquello que no aporte información, sobre el tema en cuestión, y que disminuya la veracidad de los resultados de los datos tratados.
Se comenzará con el proceso de tokenización, con la función unnest_token del paquete “tidytext”. Siendo un token: “una unidad significativa de texto”, generalmente una palabra, que estamos interesados en usar para un análisis más detallado. La tokenización es el proceso de dividir el texto en tokens.
Para ello se ejecutará la función:
“unnest_tokens”
Obteniendo una estructura de datos compacta y posible de analizar mediante las herramientas del paquete dplyr, es decir, podremos filtrar, seleccionar, eliminar, datos, etc.
Posteriormente se ejecutaran las funciones indicadas, para el limpiado del texto:
# Estoy tratando un vector, mas adelante se eliminaran los datos trabajando con el tibble creado. Ver función: "Limpiar_2"
Limpiar_1 <- function(texto){
# El orden de la limpieza no es aleatorio
# Eliminación de páginas web (palabras que empiezan por "http." seguidas
# de cualquier cosa que no sea un espacio)
nuevo_texto <- str_replace_all(texto,"http\\S*", "")
# Eliminación de signos de puntuación
nuevo_texto <- str_replace_all(nuevo_texto,"[[:punct:]]", " ")
# Eliminación de números
nuevo_texto <- str_replace_all(nuevo_texto,"[[:digit:]]", " ")
# Eliminación de tildes
nuevo_texto <- stri_trans_general(nuevo_texto,"Latin-ASCII")
# Eliminación de espacios en blanco múltiples
nuevo_texto <- str_replace_all(nuevo_texto,"[\\s]+", "")
return(nuevo_texto)
}
Limpiar_2<-function(palabras){
# Para las palabras en Español
stop_words_spanish <- tibble(line_Number = 1:311,
word =c(stopwords("spanish"),"ello","va","s")) # Incluimos algunas letras que se repiten
palabras<-anti_join(palabras, stop_words_spanish)
# Para eliminar problemas con función Limpiar_1.
# No elimina palabras con una sola vocal.
# Lo hago tras eliminar las stopwords
palabras<-palabras %>%
filter(str_detect(word,"[a-z]")) %>% # Selecciono solo palabras
filter(!str_detect(word,"^[aeiou]")) %>% # Elimino cadenas con una sola vocal
filter(!str_detect(word,"^[^aeiou]+$")) # Elimino cadenas con una sola consonante
return(palabras)
}
# Realizamos la tokenización
df1<-unnest_tokens(df1,word, text) # Digitalización España 2025
df2<-unnest_tokens(df2,word, text) # Competencias Digitales 2021
df3<-unnest_tokens(df3,word, text) # Digitalización Administraciones 2021
df4<-unnest_tokens(df4,word, text) # Digitalización Pymes 2021
# Limpio lo mas posible los dataset
# Tener presente que unnest_tokens realiza varias funciones:
# 1. Se conservan otras columnas, como el número de línea del que proviene cada palabra.
# 2. Se ha eliminado la puntuación.
# 3. De forma predeterminada, unnest_tokens()convierte los tokens a minúsculas, lo que los hace más fáciles de comparar o combinar con otros conjuntos de datos. (Utilice el to_lower = FALSEargumento para desactivar este comportamiento).
# Llamada a la función de limpieza.
df1$word<-Limpiar_1(texto=df1$word)
df2$word<-Limpiar_1(texto=df2$word)
df3$word<-Limpiar_1(texto=df3$word)
df4$word<-Limpiar_1(texto=df4$word)
# Llamada a la función que elimina las palabras comunes en Español
df1<-Limpiar_2(palabras =df1 )
df2<-Limpiar_2(palabras =df2 )
df3<-Limpiar_2(palabras =df3 )
df4<-Limpiar_2(palabras =df4 )
Frecuencia<-bind_rows(
mutate(df1,line= row_number(), `Plan`= "Digi_2025"),
mutate(df2,line= row_number(), `Plan`= "Competen_Digi_2021"),
mutate(df3,line= row_number(), `Plan`= "Digi_Adminis_2021"),
mutate(df4,line= row_number(), `Plan`= "Digi_Pymes_2021")) %>%
count(Plan, word) %>%
group_by(Plan) %>%
mutate(proportion = n / sum(n)) %>%
dplyr::select(-n) %>% # Para eliminar el problema con el select de la libería Mass
spread(Plan, proportion) %>%
gather(Plan, proportion, `Digi_Pymes_2021`:`Competen_Digi_2021`)
Es necesario sustituir nulos para graficar (ggplot)
Estudiando la frecuencia y la correlación de las palabras en cada plan, podremos ver en que plan incide más, una palabra u otra, y cual de ellas tiene mas importancia en un tipo de proyecto o en otro.
Para ello se analizará:
Palabras por Plan
Palabras distintas usadas por cada Plan.
Palabras mas usadas por Plan
Stop words
Nube de PalabrasPalabras totales usadas por Plan o Proyecto
# Visualizamos Datos
kable(Frecuencia1)
| Plan | Numero_Palabras |
|---|---|
| Digi_2025 | 10044 |
| Competen_Digi_2021 | 9300 |
| Digi_Pymes_2021 | 4695 |
| Digi_Adminis_2021 | 4563 |
# Gráfico
Frecuencia1 %>%
ggplot(aes(x=reorder(Plan,-Numero_Palabras),y=Numero_Palabras, color=Plan, fill=Plan))+
labs(x="Plan", y =" Número de Palabras")+
geom_col() +
theme_bw()
Palabras distintas usadas por cada Plan o Proyecto
# Visualizamos Datos
kable(Frecuencia2)
| Plan | Palabras_Distintas |
|---|---|
| Digi_2025 | 2394 |
| Competen_Digi_2021 | 2036 |
| Digi_Pymes_2021 | 1335 |
| Digi_Adminis_2021 | 1312 |
# Gráfico
Frecuencia2 %>%
ggplot(aes(x=reorder(Plan,-Palabras_Distintas),y=Palabras_Distintas, color=Plan, fill=Plan))+
labs(x="Plan", y = "Número Palabras Distinas" )+
geom_col() +
theme_bw()
Palabras mas usadas por cada Plan o Proyecto
| Plan | word | n |
|---|---|---|
| Competen_Digi_2021 | digitales | 437 |
| Competen_Digi_2021 | competencias | 367 |
| Competen_Digi_2021 | digital | 308 |
| Competen_Digi_2021 | plan | 159 |
| Competen_Digi_2021 | formacion | 153 |
| Digi_2025 | digital | 368 |
| Digi_2025 | digitales | 175 |
| Digi_2025 | servicios | 143 |
| Digi_2025 | sector | 105 |
| Digi_2025 | desarrollo | 87 |
| Digi_Adminis_2021 | digital | 113 |
| Digi_Adminis_2021 | plan | 110 |
| Digi_Adminis_2021 | digitalizacion | 103 |
| Digi_Adminis_2021 | servicios | 103 |
| Digi_Adminis_2021 | publicas | 92 |
| Digi_Pymes_2021 | digitalizacion | 194 |
| Digi_Pymes_2021 | pymes | 148 |
| Digi_Pymes_2021 | digital | 128 |
| Digi_Pymes_2021 | financiacion | 103 |
| Digi_Pymes_2021 | plan | 91 |
Stop words
En cada idioma hay palabras que se repiten con mucha frecuencia, y que en la mayoría de los análisis no tienen relevancia, como es nuestro caso. Para ello, se eliminan de las palabras existentes en los textos coincidentes con ellas.
En este proyecto hemos usado la función stopwords (“spanish”), que representa las palabras mas usadas en el castellano y no relevantes. Se visualizan, solo las 50 primeras:
# Paquete tm
head(stopwords("spanish"),50)
## [1] "de" "la" "que" "el" "en" "y" "a"
## [8] "los" "del" "se" "las" "por" "un" "para"
## [15] "con" "no" "una" "su" "al" "lo" "como"
## [22] "más" "pero" "sus" "le" "ya" "o" "este"
## [29] "sí" "porque" "esta" "entre" "cuando" "muy" "sin"
## [36] "sobre" "también" "me" "hasta" "hay" "donde" "quien"
## [43] "desde" "todo" "nos" "durante" "todos" "uno" "les"
## [50] "ni"
Wordclouds
Otra forma de representar las palabras mas frecuentes, es el diagrama de nube de palabras, donde las de mayor uso se indican mas grandes, y viceversa. En este caso se ha representado, en un solo diagrama, los cuatro planes, al tener previamente, las frecuencias.
# Graficamos Nube de Palabras, de los 4 planes en total.
wordcloud(words = Frecuencia3$word, freq = Frecuencia3$n, min.freq = 5,
max.words=200, random.order=FALSE, rot.per=0.35, colors=brewer.pal(9, "Dark2"))
Correlación Entre Palabras y Planes
Una forma de cuantificar la similitud entre los planes, es calculando la correlación en el uso de palabras. Si utilizan el mismo vocabulario estarán enlazados en las mismas ideas.
Gráficamente:
**Relación con Plan Digitalización 2025
# El efecto de no quitar los nulos y de eliminar la columna n, afecta mucho a todos los gráficos.
ggplot(Frecuencia4, aes(Digi_2025, Digi_Adminis_2021)) +
geom_jitter(alpha = 0.1, size = 2.5, width = 0.1, height = 0.3) +
geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
geom_abline(color = "red") +
theme_classic() +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank())
ggplot(Frecuencia4, aes(Digi_2025, Digi_Pymes_2021)) +
geom_jitter(alpha = 0.1, size = 2.5, width = 0.25, height = 0.25) +
geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
geom_abline(color = "red") +
theme_classic() +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank())
ggplot(Frecuencia4, aes(Digi_2025, Competen_Digi_2021)) +
geom_jitter(alpha = 0.1, size = 2.5, width = 0.25, height = 0.25) +
geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
geom_abline(color = "red") +
theme_classic() +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank())
Conclusiones:
Las palabras que están cerca de la línea roja, en estos gráficos, tienen frecuencias similares en ambos conjuntos de textos y, por tanto, serán comunes a los mismos. Por ejemplo, para el gráfico 2, se aprecia que las palabras comercio, PYMES y valor, están alineadas para ambos proyectos, lo que tiene sentido, no así con públicos, lo cual es lógico.
Las palabras que están lejos de la línea roja, se encuentran más en un conjunto de textos que en otro, y, por tanto, alejadas entre ambos planes. Por ejemplo, para el gráfico 1, la palabra sector, situado a la derecha y abajo, es poco relevante para la Digitalización de las Administraciones, en comparación con el Plan de Digitalización para 2025, lo cual tiene lógica.
Correlaciones numéricas
cor.test(Digi_2025, Digi_Adminis_2021, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: Digi_2025 and Digi_Adminis_2021
## t = 65.03, df = 4174, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6940159 0.7241629
## sample estimates:
## cor
## 0.7094138
cor.test(Digi_2025, Competen_Digi_2021, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: Digi_2025 and Competen_Digi_2021
## t = 62.741, df = 4174, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6807293 0.7119627
## sample estimates:
## cor
## 0.696676
cor.test(Digi_2025, Digi_Pymes_2021, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: Digi_2025 and Digi_Pymes_2021
## t = 47.999, df = 4174, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.5764665 0.6155668
## sample estimates:
## cor
## 0.5963703
Conclusiones:
Se aprecia, tanto gráfica como numéricamente, que existe menor correlación entre el lenguaje usado dentro del Plan Pymes 2021 y Digitalización 2025, que en el resto de casos. De menor a mayor le siguen Digitalización de Competencias 2021 y Digitalización Administraciones 2021.
Tiene sentido, ya que debe estar mas relacionado con administraciones públicas, que con PYMES, que normalmente son privadas y no públicas. Si bien es cierto, que la correlación sigue siendo alta para todos los casos.
Se aprecia, además, que en todos los casos es positiva, por lo que su relación es en la misma dirección o en el mismo sentido, es decir, en el mismo tipo de palabras.
En este punto analizaremos el subtema, dentro de la minería de opiniones, como es el análisis de sentimientos, que ocurre en todos los textos o conjuntos de textos. Siempre se pueden realizar valoraciones emocionales sobre si las secciones son positivas o negativas, para ello una forma es considerar cada texto, como la suma de las valoraciones emocionales de cada palabra de la que está compuesto.
En este sentido existen tres grupos de palabras, valoradas, que pueden ser utilizados para estudiarse:
bingde Bing Liu y colaboradores: Valor positivo o negativo
Los tres léxicos se basan en unigramas o palabras sueltas, puntuadas de forma binaria (si/no) o (positivo/negativo) y de forma numérico (Afinn). Nosotros usaremos " bing".
EN CONSTRUCCIÓN
Una cuestión central en la minería de textos y el procesamiento del lenguaje natural es, saber, cómo cuantificar de qué trata un documento, así como la importancia de cada término que lo compone.
Es fundamental saber la frecuencia de las palabras tf, como se vió en el punto 4, pero otro enfoque que nos sirve para averiguar el peso de ciertas palabras, en un texto o conjunto de ellos, es el término de frecuencia inversa de documentos idf, que reduce el peso de las palabras de uso común.
idf= ln(n documentos/n documentos que contienen el término)
Con el termino tf-idf, que se calcula como el producto de tf por idf, obtenemos la frecuencia de un término teniendo presente lo poco que se utiliza. Esa es la misión de la función “bind_tf_idf”.
Todo ello puede calcularse con la función bind_tf_idf. Que nos indica la frecuencia tf, la frecuencia inversa y la importancia en el documento/s.
Vemos que idf y por tanto, tf_idf son cero para palabras extremadamente comunes. Veamos una visualización de estas palabras
# Visualizamos este peso en palabras
Plan_tf_idf %>%
mutate(word=factor(word,levels = word)) %>%
group_by(Plan) %>%
arrange(desc(tf_idf)) %>%
slice_max(tf_idf, n = 5) %>%
ggplot(aes(x=tf_idf, y=fct_reorder(word, tf_idf), fill = Plan)) +
geom_col(show.legend = FALSE) +
facet_wrap(~Plan, ncol = 2, scales = "free") +
labs(x = "tf-idf", y = NULL)
Se comprueba que tiene sentido el tener palabras como profesional, personas, comercio, entre los primeros puestos. Se aprecian variaciones, con respecto a las frecuencias de palabras (Punto 4), si vemos el diagrama de nube de palabras; ya que las palabras de mayor tamaño, en ese diagrama, no son de mayor frecuencia de uso en esta sección.
Por ejemplo, la palabra competencia, que es una de las de mayor tamaño en el gráfico: wordcloud, no aparece con las de mayor frecuencia en ninguno de estos cuatro gráficos. Esto es por la propia definición de la función “bind_tf_idf”.
Aquí está la base de este apartado, es decir, el peso de una palabra, según este estadístico, varía también en función de su “no uso”, no solo de su uso.
# Seguimos con la función Plan:tf_idf
Plan_tf_idf %>%
mutate(total=n/tf) %>%
ggplot( aes(n/total, fill = Plan)) +
geom_histogram(show.legend = TRUE) +
labs(x="Frecuencia", y= "Número Palabras")+
xlim(NA, 0.0009) +
facet_wrap(~Plan, ncol = 2)
# Vemos salida
Plan_tf_idf %>%
top_n(5,n) %>%
arrange(desc(tf_idf)) %>%
kable()
| Plan | word | n | tf | idf | tf_idf |
|---|---|---|---|---|---|
| Digi_Pymes_2021 | financiacion | 103 | 0.0219382 | 0.6931472 | 0.0152064 |
| Competen_Digi_2021 | digitales | 437 | 0.0469892 | 0.0000000 | 0.0000000 |
| Competen_Digi_2021 | competencias | 367 | 0.0394624 | 0.0000000 | 0.0000000 |
| Competen_Digi_2021 | digital | 308 | 0.0331183 | 0.0000000 | 0.0000000 |
| Competen_Digi_2021 | plan | 159 | 0.0170968 | 0.0000000 | 0.0000000 |
| Competen_Digi_2021 | formacion | 153 | 0.0164516 | 0.0000000 | 0.0000000 |
| Digi_2025 | digital | 368 | 0.0366388 | 0.0000000 | 0.0000000 |
| Digi_2025 | digitales | 175 | 0.0174233 | 0.0000000 | 0.0000000 |
| Digi_2025 | servicios | 143 | 0.0142374 | 0.0000000 | 0.0000000 |
| Digi_2025 | sector | 105 | 0.0104540 | 0.0000000 | 0.0000000 |
| Digi_2025 | desarrollo | 87 | 0.0086619 | 0.0000000 | 0.0000000 |
| Digi_Adminis_2021 | digital | 113 | 0.0247644 | 0.0000000 | 0.0000000 |
| Digi_Adminis_2021 | plan | 110 | 0.0241069 | 0.0000000 | 0.0000000 |
| Digi_Adminis_2021 | digitalizacion | 103 | 0.0225729 | 0.0000000 | 0.0000000 |
| Digi_Adminis_2021 | servicios | 103 | 0.0225729 | 0.0000000 | 0.0000000 |
| Digi_Adminis_2021 | publicas | 92 | 0.0201622 | 0.0000000 | 0.0000000 |
| Digi_Pymes_2021 | digitalizacion | 194 | 0.0413206 | 0.0000000 | 0.0000000 |
| Digi_Pymes_2021 | pymes | 148 | 0.0315229 | 0.0000000 | 0.0000000 |
| Digi_Pymes_2021 | digital | 128 | 0.0272630 | 0.0000000 | 0.0000000 |
| Digi_Pymes_2021 | plan | 91 | 0.0193823 | 0.0000000 | 0.0000000 |
De lo anterior podemos ver o extraer, la Ley de Zipf, que establece: " la frecuencia con la que aparece una palabra es inversamente proporcional a su rango o ranking, en el número de uso. Es decir, cuanto mas próxima está una palabra a ser la número uno en uso, menor es el número del ranking en el que se encuentra ordenada por dicho uso.
# Calculamos la frecuencia
Plan_tf_idf_1<-Plan_tf_idf %>%
mutate(total=n/tf) %>%
group_by(Plan) %>%
mutate(Clasificacion = row_number(),
`Frecuencia` = n/total) %>%
ungroup()
# Vemos la salida
head(Plan_tf_idf_1,10)
| Plan | word | n | tf | idf | tf_idf | total | Clasificacion | Frecuencia |
|---|---|---|---|---|---|---|---|---|
| Competen_Digi_2021 | digitales | 437 | 0.0469892 | 0.0000000 | 0.0000000 | 9300 | 1 | 0.0469892 |
| Competen_Digi_2021 | competencias | 367 | 0.0394624 | 0.0000000 | 0.0000000 | 9300 | 2 | 0.0394624 |
| Competen_Digi_2021 | digital | 308 | 0.0331183 | 0.0000000 | 0.0000000 | 9300 | 3 | 0.0331183 |
| Competen_Digi_2021 | plan | 159 | 0.0170968 | 0.0000000 | 0.0000000 | 9300 | 4 | 0.0170968 |
| Competen_Digi_2021 | formacion | 153 | 0.0164516 | 0.0000000 | 0.0000000 | 9300 | 5 | 0.0164516 |
| Competen_Digi_2021 | nacional | 115 | 0.0123656 | 0.0000000 | 0.0000000 | 9300 | 6 | 0.0123656 |
| Competen_Digi_2021 | personas | 104 | 0.0111828 | 0.2876821 | 0.0032171 | 9300 | 7 | 0.0111828 |
| Competen_Digi_2021 | profesional | 78 | 0.0083871 | 0.6931472 | 0.0058135 | 9300 | 8 | 0.0083871 |
| Competen_Digi_2021 | desarrollo | 76 | 0.0081720 | 0.0000000 | 0.0000000 | 9300 | 9 | 0.0081720 |
| Competen_Digi_2021 | tic | 76 | 0.0081720 | 0.0000000 | 0.0000000 | 9300 | 10 | 0.0081720 |
Veamos las leyes de distribución que siguen los cuatro planes
# Graficamos
Plan_tf_idf_1 %>%
ggplot(aes(Clasificacion, `Frecuencia`, color = Plan)) +
geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) +
scale_x_log10() +
scale_y_log10()
Se aprecian variaciones en la zona superior izquierda (respecto línea de puntos discontinuos-modelo) y en la zona inferior derecha. Esto quiere decir que las palabras mas usadas, no tienen correlación entre planes, y las menos usadas tampoco, pero su diferencia se produce en menor medida. La temática central tiene una gran relación.
# Realizamos modelo para ver variaciones
Modelo<-lm(log10(`Frecuencia`) ~ log10(Clasificacion), data = Plan_tf_idf_1)
summary(Modelo)
##
## Call:
## lm(formula = log10(Frecuencia) ~ log10(Clasificacion), data = Plan_tf_idf_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.68794 -0.05569 0.01699 0.06443 0.18336
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.918230 0.007173 -128.0 <0.0000000000000002 ***
## log10(Clasificacion) -0.937923 0.002504 -374.5 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.09363 on 7075 degrees of freedom
## Multiple R-squared: 0.952, Adjusted R-squared: 0.952
## F-statistic: 1.403e+05 on 1 and 7075 DF, p-value: < 0.00000000000000022
El modelo se ajusta bien. Tiene un p-value para la F-statistic muy bajo, además el error, recogido en la R2, es muy bajo, al ser R2=0.952, muy próximo a uno.
La variable frecuencia es muy significativa para el modelo estudiado, luego el ajuste es adecuado y puede ser usado.
Plan_tf_idf_1 %>%
ggplot(aes(Clasificacion, `Frecuencia`, color = Plan)) +
geom_abline(intercept = -0.91823, slope = -0.937923,
color = "gray50", linetype = 2) +
geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) +
scale_x_log10() +
scale_y_log10()
Hemos encontrado un resultado cercano a ley de Zipf, para los cuatro planes. No hay grandes variaciones en la parte derecha del gráfico, es decir, para palabras menos usadas, y sí pequeñas variaciones en la parte izquierda, provocada por la suma de los cuatro planes.
El uso de tf_idf nos da una idea de las palabras que son características de un documento, dentro de una colección, como es nuestro caso.
Teniendo presente que este ejercicio, solo tienen un carácter de aprendizaje, sobre todo para el que lo realiza, se pueden indicar que las conclusiones extraídas encajan con las de text mining.
Los cuatro textos tienen un alto grado de alineación en su léxico, como no podía ser de otra forma, a excepción de la digitalización en PYMES.
El uso de palabras mas usadas, en termino de número absoluto, no es el mismo que el visto con la función bind_tf_idf. Lo que nos da una idea del cambio en el uso de esas palabras, aunque en un inicio hubiese parecido que no existía ese cambio. Ver conclusiones apartado 6.1
Se realizará análisis de sentimiento dentro de los planes, una vez finalizado punto 5.
Gobierno de España. Presidencia del Gobierno Plan Digitalización España2021
Ciencia de Datos, Estadística, Machine Learning y Programación. Joaquín Amat Rodrigo Text mining con R: ejemplo práctico Twitter
Minería de texto con R : un enfoque ordenado. Julia Silge y David Robinson Libro
R para ciencia de datos.Hadley Wickman & Garret Grolemund Libro