Extracción de datos

La extracción de datos es muy importante cuando se trata del mundo de los negocios, ya que es necesaria para completar la investigación de mercado. Las empresas requieren extraen datos para estar al tanto de los cambios en el mercado, su público objetivo, para poder generar nuevas ideas para su negocio, mejorar su estrategia son respecto a la competencia, analizar promociones y publicidad, etc.



Datos estructurados (Structured Data): Los datos estructurados tienen perfectamente definido la longitud, el formato y el tamaño de sus datos. Se almacenan en formato tabla, hojas de cálculo o en bases de datos relacionales.



Ejemplo de datos estructurados.



Datos no estructurados (Unstructured Data): Los datos no estructurados se caracterizan por no tener un formato específico. Se almacenan en múltiples formatos como documentos PDF o Word, correos electrónicos, ficheros multimedia de imagen, audio o video, etc.



Ejemplo de datos no estructurados.



Datos semiestructurados (Semistructured Data): Los datos semiestructurados son una mezcla de los dos anteriores, no presentan una estructura perfectamente definida como los datos estructurados pero si presentan una organización definida en sus metadatos donde describen los objetos y sus relaciones, y que en algunos casos están aceptados por convención, como por ejemplo los formatos HTML, XML o JSON.



Ejemplo de datos semiestructurados.



Importar archivos de datos con formato utilizando las funciones del paquete foreign

El paquete foreign contiene funciones que le permitirán importar archivos de datos de algunos de los paquetes de software estadístico más utilizados, como SAS, Stata y SPSS. Para descargar el paquete foreign del sitio web de CRAN desde R, haga clic en “Paquetes” y luego en “Instalar paquete(s) de CRAN”. Luego deberá cargar el paquete y podrá usar la función de ayuda.



Para descargar el paquete:

install.packages("foreign")

El paquete contiene las siguientes funciones:

library(foreign)
help(package=foreign)



A continuación un ejemplo para importar un archivo con formato Stata llamado test.dta https://stats.idre.ucla.edu/stat/data/test.dta.

test.stata <- read.dta("https://stats.idre.ucla.edu/stat/data/test.dta")
print(test.stata)
##    make   model mpg weight price
## 1   AMC Concord  22   2930  4099
## 2   AMC   Pacer  17   3350  4749
## 3   AMC  Spirit  22   2640  3799
## 4 Buick Century  20   3250  4816
## 5 Buick Electra  15   4080  7827



Importación de archivos de datos con formato (delimitados) con la función read.table



La función read.table es muy útil cuando se lee en archivos ASCII que contienen datos rectangulares. Cuando el archivo contiene los nombres de las variables en la primera línea de datos, el encabezado de la opción debe establecerse en VERDADERO. El delimitador predeterminado es el espacio en blanco, se deben especificar otros delimitadores utilizando la opción sep y configurándolo igual al delimitador entre comillas (es decir, sep = “;” para el archivo de datos delimitados por punto y coma).

Aquí hay algunos ejemplos de datos con diferentes tipos de delimitadores. Comenzaremos observando un tipo de archivo de datos ASCII delimitado por espacios llamado test.txt https://stats.idre.ucla.edu/wp-content/uploads/2016/02/test.txt.

test.txt <- read.table("https://stats.idre.ucla.edu/wp-content/uploads/2016/02/test.txt", header=T)
print(test.txt)
##    make   model mpg weight price
## 1   AMC Concord  22   2930  4099
## 2   AMC   Pacer  17   3350  4749
## 3   AMC  Spirit  22   2640  3799
## 4 Buick Century  20   3250  4816
## 5 Buick Electra  15   4080  7827



Otro tipo de archivo muy común es el archivo delimitado por comas. El archivo test-1.csv se ha guardado de Excel como un archivo delimitado por comas. La función read.table puede leer este archivo mediante la opción sep, pero también puede leerlo la función read.csv, que se escribió específicamente para archivos delimitados por comas. https://stats.idre.ucla.edu/wp-content/uploads/2016/02/test-1.csv

test.csv1 <- read.table("https://stats.idre.ucla.edu/wp-content/uploads/2016/02/test-1.csv", header=T, sep=",")
print(test.csv1)
##    make   model mpg weight price
## 1   amc concord  22   2930  4099
## 2   amc   oacer  17   3350  4749
## 3   amc  spirit  22   2640  3799
## 4 buick century  20   3250  4816
## 5 buick electra  15   4080  7827
test.csv1 <- read.table("https://stats.idre.ucla.edu/wp-content/uploads/2016/02/test-1.csv", header=T, sep=",")
print(test.csv1)
##    make   model mpg weight price
## 1   amc concord  22   2930  4099
## 2   amc   oacer  17   3350  4749
## 3   amc  spirit  22   2640  3799
## 4 buick century  20   3250  4816
## 5 buick electra  15   4080  7827



Por supuesto, también es posible utilizar la función read.table para leer en archivos con otros delimitadores. En los datos llamados testsemicolon.txt tiene delimitadores de punto y coma y la prueba del conjunto de datos llamada testz.txt usa la letra z como delimitador, los cuales son delimitadores aceptables en R. https://stats.idre.ucla.edu/wp-content/uploads/2016/02/testsemicolon.txt

test.semi <- read.table("https://stats.idre.ucla.edu/wp-content/uploads/2016/02/testsemicolon.txt", header=T, sep=";")
print(test.semi)
##    make   model mpg weight price
## 1   AMC Concord  22   2930  4099
## 2   AMC   Pacer  17   3350  4749
## 3   AMC  Spirit  22   2640  3799
## 4 Buick Century  20   3250  4816
## 5 Buick Electra  15   4080  7827
test.z <- read.table("https://stats.idre.ucla.edu/wp-content/uploads/2016/02/testz.txt", header=T, sep="z")
print(test.z)
##    make   model mpg weight price
## 1   AMC Concord  22   2930  4099
## 2   AMC   Pacer  17   3350  4749
## 3   AMC  Spirit  22   2640  3799
## 4 Buick Century  20   3250  4816
## 5 Buick Electra  15   4080  7827

Exportar archivos usando la función write.table

La función write.table genera archivos de datos con un formato. El primer argumento especifica qué tabla (data.frame) en R se va a exportar. El siguiente argumento especifica el archivo que se creará. El separador predeterminado es un espacio en blanco, pero cualquier separador se puede especificar en la opción sep. El valor predeterminado para las opciones row.names y col.names es TRUE. En el ejemplo, especificamos que no deseamos incluir nombres de fila. La configuración predeterminada para la opción de cotización es incluir comillas alrededor de todos los valores de caracteres, es decir, alrededor de valores en variables de cadena y alrededor de los nombres de columna. Como hemos mostrado en el ejemplo, es muy común no querer las comillas al crear un archivo de texto.

write.table(test.csv1, "test1.txt", row.names=F, quote=F)



Web Scraping

Hay muchos datos en los sitios web, pero no siempre hay la opción de descargarlos. El web scraping es un proceso de extracción de datos no estructurados de sitios web en un formato estructurado para que pueda realizar un análisis más detallado.



Fuentes de datos.

Este ejemplo,consiste en obtener las letras de las canciones más populares de los 10 mejores artistas: Primero se usa rvest para extraer el top 25 de artistas nacionales https://www.chartsecuador.biz/top-25-artistas-ecuatorianos/.



Primero, por supuesto, debemos instalar y cargar los siguientes paquetes.

library(tidyverse)
library(rvest)
library(stringr)

Extraer a los 10 mejores artistas pop de todos los tiempos

1. Identifique la url de la que desea extraer datos. Luego use la función read_html() para crear un documento html desde la url.

2. A continuación, debe identificar el selector CSS que apunta a los datos que desea extraer. Es útil tener un poco de conocimiento sobre HTML y CSS. De lo contrario, puede usar la práctica extensión de Chrome SelectorGadget para encontrar el selector CSS. La forma más fácil que encontré es hacer clic derecho en cualquier elemento de la página en Chrome y seleccionar Inspeccionar elemento.

3. Luego puede usar la función html_nodes() con el selector CSS para extraer los datos que desee.

4. Entonces todo lo que necesita es guardar sus resultados en un data frame.



#Identificar la url desde donde queremos extraer datos 

base_url <- "https://www.chartsecuador.biz/top-25-artistas-ecuatorianos/"
webpage <- read_html(base_url)


# Obtenemos el nombre de los artistas

canciones <- html_nodes(webpage, "p:nth-child(1) span")
canciones <- as.character(html_text(canciones))
canciones
##  [1] "LAS 25 CANCIONES DE PRODUCCIÓN NACIONAL O DE ARTISTAS ECUATORIANOS MÁS POPULARES DE LA SEMANA EN ECUADOR.  "
##  [2] "*10 semanas*"                                                                                               
##  [3] "*10 semanas*"                                                                                               
##  [4] "Parece Mentira"                                                                                             
##  [5] "Prende (Remix)"                                                                                             
##  [6] "Ana"                                                                                                        
##  [7] "No Te Quiero Perder"                                                                                        
##  [8] "Cosa Linda"                                                                                                 
##  [9] "Zapateando Juyayay"                                                                                         
## [10] "Apareciste"                                                                                                 
## [11] "Prueba Conmigo"                                                                                             
## [12] "Quiero"                                                                                                     
## [13] "Lo Que Pasa"                                                                                                
## [14] "Dejémoslo Aquí"                                                                                             
## [15] "Me Descuidaste"                                                                                             
## [16] ""                                                                                                           
## [17] "Mala"                                                                                                       
## [18] "Loquita Por Ti"                                                                                             
## [19] "Ya Estoy Bien"                                                                                              
## [20] "Perdón"                                                                                                     
## [21] "Pienso En Tí"                                                                                               
## [22] "*REINGRESO*"                                                                                                
## [23] "*REINGRESO*"                                                                                                
## [24] "Envenenado"                                                                                                 
## [25] "Por Tí"                                                                                                     
## [26] "Arreglarlo Bailando"                                                                                        
## [27] "*NUEVO*"                                                                                                    
## [28] "*NUEVO*"                                                                                                    
## [29] "*NUEVO*"                                                                                                    
## [30] "*REINGRESO*"                                                                                                
## [31] "*REINGRESO*"                                                                                                
## [32] "*REINGRESO*"
canciones = canciones[canciones!='' & canciones!='*NUEVO*' & canciones!='*REINGRESO*' & canciones!='*10 semanas*']
canciones
##  [1] "LAS 25 CANCIONES DE PRODUCCIÓN NACIONAL O DE ARTISTAS ECUATORIANOS MÁS POPULARES DE LA SEMANA EN ECUADOR.  "
##  [2] "Parece Mentira"                                                                                             
##  [3] "Prende (Remix)"                                                                                             
##  [4] "Ana"                                                                                                        
##  [5] "No Te Quiero Perder"                                                                                        
##  [6] "Cosa Linda"                                                                                                 
##  [7] "Zapateando Juyayay"                                                                                         
##  [8] "Apareciste"                                                                                                 
##  [9] "Prueba Conmigo"                                                                                             
## [10] "Quiero"                                                                                                     
## [11] "Lo Que Pasa"                                                                                                
## [12] "Dejémoslo Aquí"                                                                                             
## [13] "Me Descuidaste"                                                                                             
## [14] "Mala"                                                                                                       
## [15] "Loquita Por Ti"                                                                                             
## [16] "Ya Estoy Bien"                                                                                              
## [17] "Perdón"                                                                                                     
## [18] "Pienso En Tí"                                                                                               
## [19] "Envenenado"                                                                                                 
## [20] "Por Tí"                                                                                                     
## [21] "Arreglarlo Bailando"
# Obtener los artistas

artistas <- html_nodes(webpage, xpath = '//*[@id="cc-m-9566740669"]/p[3]')
artistas=html_text(artistas)
artistas = str_squish(gsub("\n", "", artistas))
artistas
## [1] "4 AM Featuring Arévalo"



PARTE 2: Extracción de canciones y letras populares

Ahora que tiene los 10 mejores artistas pop, puede usar el sitio web genius.com para identificar las canciones más populares y extraer sus letras.

1. Primero identifique la URL de la página web del artista. Un poco de investigación en el sitio web mostró que todas las páginas web seguían el siguiente formato. https://genius.com/artists/

2. Luego use un bucle for anidado para extraer las canciones y sus letras. Aquí nuevamente, utilicé SelectorGadget para identificar el selector CSS correcto para el trabajo.

3. A continuación, almacene los resultados en una tabla.

4. Y, por último, no olvide incluir un intervalo de suspensión aleatorio entre cada iteración para evitar que ser expulsados del sitio web.



cancion = "Californication"
html_dir = paste0("https://www.google.com/","search?q=letra+cancion+",gsub(" ","+",cancion))
google = read_html(html_dir)
lirica = google %>% 
  html_nodes('div div div div div div div div div div div')
cat(html_text(lirica[8]))
## Psychic spies from China try to steal your mind's elation
## And little girls from Sweden dream of silver screen quotation
## And if you want these kind of dreams it's Californication
## 
## It's the edge of the world and all of western civilization
## The sun may rise in the East at least it's settled in a final location
## It's understood that Hollywood sells Californication
## 
## Pay your surgeon very well to break the spell of aging
## Celebrity skin is this your chin or is that war you're waging?
## 
## Firstborn unicorn
## Hardcore soft porn
## Dream of Californication
## Dream of Californication
## Dream of Californication
## Dream of Californication
## 
## Marry me girl, be my fairy to the world, be my very own constellation
## A teenage bride with a baby inside getting high on information
## And buy me a star on the boulevard, it's Californication
## 
## Space may be the final frontier but it's made in a Hollywood basement
## And Cobain can you hear the spheres singing songs off Station To Station?
## And Alderaan's not far away, it's Californication
## 
## Born and raised by those who praise, control of population
## Everybody's been there and I don't mean on vacation
## 
## Firstborn unicorn
## Hardcore soft porn
## Dream of Californication
## Dream of Californication
## Dream of Californication
## Dream of Californication
## 
## Destruction leads to a very rough road but it also breeds creation
## And earthquakes are to a girl's guitar, they're just another good vibration
## And tidal waves couldn't save the world from Californication
## 
## Pay your surgeon very well to break the spell of aging
## Sicker than the rest, there is no test but this is what you're craving?
## 
## Firstborn unicorn
## Hardcore soft porn
## Dream of Californication
## Dream of Californication
## Dream of Californication
## Dream of Californication

Ejemplo 2

busqueda = "Jorge Yunda"
news_pag = "https://news.google.com/"
html_dir = paste0(news_pag,"search?q=",gsub(" ","+",busqueda),"&hl=es-419&gl=US&ceid=US:es-419")
google_news = read_html(html_dir)
noticias = google_news %>% 
  html_nodes(css = "c-wiz div div div div main c-wiz div div div article")

news_pag = "https://news.google.com/"
noticia = noticias[[3]]
titular = noticia %>% html_node("h3") %>% html_text()
fecha = noticia %>% html_node("time") %>% html_attr("datetime")
diario = noticia %>% html_node("a.wEwyrc.AVN2gc.uQIVzc.Sksgp") %>% html_text()
link_enmascarado = noticia %>% html_node("h3 a") %>% html_attr("href")
link_enmascarado = paste0(news_pag,substring(link_enmascarado,3))  
link_enmascarado = read_html(link_enmascarado)
link = link_enmascarado %>% 
  html_node(css='c-wiz div div c-wiz div a') %>% 
  html_attr("href")
noticiaDF = data.frame(Titular=titular, Fecha=fecha, Diario=diario, Link=link, stringsAsFactors = F)

TALLER GRUPAL: Aplicación de web scrapping

Buscar un set de datos estructurado y uno no estructurado utilizando web scrapping. Los datos obtenidos deben ser útiles para el tópico de investigación de su grupo.