Motivación

  • 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:

    1. Agenda Digitalización 2025
    2. Plan de Competencias Digitales 2021
    3. Plan Digitalización Administraciones Optimizado 2021
    4. Plan Digitalización Pyme Optimizado 2021

Con estos textos se ha llevado a cabo, este proyecto de Text Mining.

0. Inicio

options(scipen = 999999)

1. Carga de Paquetes

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

2. Carga de Datos

# 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)

3. Limpieza de texto y tokenización

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:

  • Limpiar_1
  • Limpiar_2

3.1 Cargamos Funciones

# 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)
}
  • Función segunda limpieza de texto. Para eliminar las palabras usuales en Español
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)
}

3.2 Tokenización y limpieza del dataset - Datos Estructurados

# 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 )

4. Exploración de texto

  • Vamos a comenzar creando un nuevo formato, tibble, con todos los planes, para realizar el análisis comparando por plan, en un solo archivo:
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)

4.1 Frecuencia de Palabras

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 Palabras

Palabras 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

  • Gráfico 1
# 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())

  • Gráfico 2
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())

  • Gráfico 3
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.

5. Análisis de Sentimientos. EN CONSTRUCCIÓN

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:

AFINN: asigna a cada palabra un valor entre -5 y 5. Siendo -5 el máximo de negatividad y +5 el máximo de positividad

bingde Bing Liu y colaboradores: Valor positivo o negativo

nrcde Saif Mohammad y Peter Turney: clasifica cada palabra en uno o más de los siguientes sentimientos: positive, negative, anger, anticipation, disgust, fear, joy, sadness, surprise, and trust

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

6. Estadístico tf-idf. Peso de las palabras

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”.

6.1 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)

  • Conclusiones:

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.

  • Vemos como son las distribuciones de las palabras por plan, que siguen una distribución como la indicada en los gráficos siguientes:
# 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

6.2 Ley de Zipf.

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.

7. Conclusiones

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.

8. Bibliografía

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

RStudio Community RMarkdown