R como una herramienta de cambio en el uso de Open Sources.

R es un entorno y lenguaje de programación con un enfoque al análisis estadístico.

R es una implementación de software libre del lenguaje S pero con soporte de alcance estático. Se trata de uno de los lenguajes más utilizados en investigación por la comunidad estadística, siendo además muy popular en el campo de la minería de datos, la investigación biomédica, la bioinformática y las matemáticas financieras. A esto contribuye la posibilidad de cargar diferentes bibliotecas o paquetes con funcionalidades de cálculo y gráficas.

R es parte del sistema GNU y se distribuye bajo la licencia GNU GPL. Está disponible para los sistemas operativos Windows, Macintosh, Unix y GNU/Linux.

Fue desarrollado inicialmente por Robert Gentleman y Ross Ihaka del Departamento de Estadística de la Universidad de Auckland en 1993. Sin embargo, si se remonta a sus bases iniciales, puede decirse que inició en los Bell Laboratories de AT&T y ahora Alcatel-Lucent en Nueva Jersey con el lenguaje S. Este último, un sistema para el análisis de datos desarrollado por John Chambers, Rick Becker, y colaboradores diferentes desde finales de 1970. La historia desde este punto es prácticamente la del lenguaje S. Los diseñadores iniciales, Gentleman y Ihaka, combinaron las fortalezas de dos lenguajes existentes, S y Scheme. En sus propias palabras: “El lenguaje resultante es muy similar en apariencia a S, pero en el uso de fondo y la semántica es derivado desde Scheme”. El resultado se llamó R “en parte al reconocimiento de la influencia de S y en parte para hacer gala de sus propios logros”.

*Fuente:https://es.wikipedia.org/wiki/R_(lenguaje_de_programaci%C3%B3n) (13 de octubre de 2017)

Las ventajas en el uso de R.

R proporciona un amplio abanico de herramientas estadísticas (modelos lineales y no lineales, tests estadísticos, análisis de series temporales, algoritmos de clasificación y agrupamiento, etc.) y gráficas.

Al igual que S, se trata de un lenguaje de programación, lo que permite que los usuarios lo extiendan definiendo sus propias funciones. De hecho, gran parte de las funciones de R están escritas en el mismo R, aunque para algoritmos computacionalmente exigentes es posible desarrollar bibliotecas en C, C++ o Fortran que se cargan dinámicamente. Los usuarios más avanzados pueden también manipular los objetos de R directamente desde código desarrollado en C. R también puede extenderse a través de paquetes desarrollados por su comunidad de usuarios.

R hereda de S su orientación a objetos. La tarea de extender R se ve facilitada por su permisiva política de lexical scoping.

Además, R puede integrarse con distintas bases de datos y existen bibliotecas que facilitan su utilización desde lenguajes de programación interpretados como Perl y Python.

Otra de las características de R es su capacidad gráfica, que permite generar gráficos con alta calidad. R posee su propio formato para la documentación basado en LaTeX.

R también puede usarse como herramienta de cálculo numérico, campo en el que puede ser tan eficaz como otras herramientas específicas tales como GNU Octave y su equivalente comercial, MATLAB. Se ha desarrollado una interfaz, RWeka para interactuar con Weka que permite leer y escribir ficheros en el formato arff y enriquecer R con los algoritmos de minería de datos de dicha plataforma.

*Fuente:https://es.wikipedia.org/wiki/R_(lenguaje_de_programaci%C3%B3n) (13 de octubre de 2017)

El uso de R para leer archivos en programas no accesibles al público en general.

Como neófito de R al conocer la herramienta lo primero que quise saber era el alcance de la misma y el uso que le podría dar en el trabajo diario.

Al paso de las sesiones de clase fui entendiendo que R es una herramienta muy robusta a la cual se puede accedar de forma gratuita (lo cual es una gran ventaja) y que puede se utilizada de múltiples formas.

En lo personal debo comentar que en la SCT por algún motivo tuve la necesidad de acceder al padrón de beneficiarios de televisores que fueron entregados con motivo de la Transición a la Televisión Digital Terrestre. El padrón es público y se encuentra en la página de la SCT en el siguiente vínculo: http://www.sct.gob.mx/comunicaciones/transicion-a-la-television-digital-terrestre/

Sin entrar en mucho detalle debo comentar que en el Programa de Transición a la TDT se entregaron 10.2 millones de televisores a los beneficiarios de los programas sociales determinados por la Secretaría de Desarrollo Social.

Como se podrá suponer en el padrón de usuarios se encuentran los 10.2 millones de personas a las que se les otorgó el beneficio. En la página de la TDT se puede obtener el documento con el padrón, sin embargo, se observa que el documento se encuentra en con terminación CSV (Comma Separated Values) y si lo descargas y no tienes el programa la información se despliega en Excel.

El problema con el Excel es que únicamente se pueden leer 1,495,000 líneas porque el programa no es lo suficientemente robusto para soportar los 10.2 millones de datos, entonces la información que se obtiene es incompleta y hasta se puede llegar a pensar que está incompleta.

Para poder leer el documento en CSV se necesita recurrir a algún programa que pueda abrir ese tipo de formato, lo cual no es sencillo o fácil para las personas en general, sin embargo, R es una opción que se puede ocupar para esta situación.

Datos en formato CSV.

El formato CSV (Comma Separated Values) es uno de los más comunes a la hora de intercambiar datos entre aplicaciones. Un archivo en este formato es un archivo de texto, en el que cada fila es una muestra u ocurrencia y cada columna una variable. Los datos en cada fila se separan entre sí mediante comas, de ahí la denominación.

Un archivo CSV puede incluir o no un encabezado, una primera línea especificando el nombre de cada una de las columnas de datos. En caso de que el separador para la parte decimal de los números sea la coma en lugar del punto, los datos de cada fila se separan entre sí mediante punto y comas. Los datos no numéricos, especialmente cadenas de caracteres, pueden ir delimitados por comillas o no.

En suma, existe una cierta variabilidad en el formato CSV si bien su estructura fundamental es siempre la misma. Por elo R cuenta con varias funciones distintas para operar con este tipo de archivos.

Lectura de archivos CSV.

En la mayoría de las ocasiones necesitaremos importar datos almacenados en formato CSV, obteniendo como resultado un data frame R. Con este fin podemos recurrir a funciones como read.table, read.csv y read.csv2, siendo estas dos últimas versiones especializadas de la primera, en las que se asigna un valor por defecto concreto a algunos parámetros:

#read.table(file = archivo[,header=TRUE|FALSE,sep=separadorDatos, dec=separadorDecimal,quote=delimitadorCadenas,stringsAsFactors=TRUE|FALSE])

Función genérica para la lectura de datos en formato CSV. EL único argumento obligatorio es file, con el que se facilita el nombre del archivo a leer. Este debe incluir la extensión y, si fuese preciso, también la ruta. El resto de parámetros tiene la siguiente finalidad:

header:De tipo logical. Indica a la función si el archivo contiene una cabecera o no. sep: Determina cuál es el separador de datos en cada fila. dec:Para datos numéricos, establece cuál es el separador entre parte entera y decimal. quote: Para datos alfanuméricos, establece el carácter que se usa como delimitador. stringsAsFactors:Tiene la misma finalidad que en la función data.frame.

read.csv (archivo): Es una implementación especializada de read.table en la que se asume que los parámetros header, sep y dec toman los valores TRUE,“,” y “.”, respectivamente. Acepta los parámetros que read.table.

read.csv2(archivo): Es una implementación especializada de read.table en la que se asume que los parámetros header, sep y dec toman los valores TRUE,“;” y “,”, respectivamente. Acepta los parámetros que read.table.

read.delim(archivo): Es una implementación especializada de read.table en la que se asume que los parámetros header, sep y dec toman los valores TRUE,“/” y “.”, respectivamente. Acepta los parámetros que read.table.

En el siguiente ejercicio se carga el contenido de un archivo CSV, con datos sobre el rendimiento de diversos algoritmos, y se muestra información sobre su estructura y parte de los datos leídos.

Lectura del contenido de un archivo CSV.

A continuación vamos a explorar uno de los documentos de entrega de televisiones del primer trimestre del año 2015.

Una vez cargado el documento cuando le aplicamos el comando str() nos presenta el despliegue de dataframe y ahí podemos observar todas las datos que contiene. En el presente caso contemplamos las columnas:folio, nombre, fechadeentrega, entidad, municipio y localidad.

Para poder generar el dataframe que vamos a manipular se utiliza el comando “head” con las variables que queremos, como a continuación se muestra:

Informe<- read.csv("InformeTDT-1erTrimestre-2015-reporte-entregas.csv")
save(Informe,file = "Informe.csv")
class(Informe)
## [1] "data.frame"
str(Informe)
## 'data.frame':    1491241 obs. of  6 variables:
##  $ folio       : int  38774982 51455758 36704040 36539336 80485295 78835892 65171992 80485663 36398507 65171983 ...
##  $ nombre      : Factor w/ 1384656 levels "A BIGAIL VIOLETA GALICIA SANCHEZ",..: 1162243 1109331 497974 659205 533751 304460 1066024 536023 298351 943947 ...
##  $ fechaentrega: Factor w/ 1101307 levels "2015-01-02 08:01:11",..: 2 3 4 5 6 7 8 9 10 11 ...
##  $ entidad     : Factor w/ 20 levels "BAJA CALIFORNIA",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ municipio   : Factor w/ 447 levels "ABASOLO","ACAMBARO",..: 146 146 146 146 146 146 146 146 146 146 ...
##  $ localidad   : Factor w/ 12463 levels "10 DE ABRIL",..: 4433 10005 5080 5080 9827 1965 10005 1965 4433 10005 ...
head(Informe[,c("folio","nombre","fechaentrega","entidad","municipio","localidad")])
##      folio                         nombre        fechaentrega entidad
## 1 38774982          PAULINA MARQUZ GARCIA 2015-01-02 08:01:32  MEXICO
## 2 51455758        NATALIA MONTA?O NICOLAS 2015-01-02 08:01:37  MEXICO
## 3 36704040 INES INOCENCIA MONTA?O MONTA?O 2015-01-02 08:01:45  MEXICO
## 4 36539336           LIDIA MENDOZA CHIMAL 2015-01-02 08:02:00  MEXICO
## 5 80485295 JACQUELINE SANTILLAN GUTIERREZ 2015-01-02 08:02:05  MEXICO
## 6 78835892          ELSA MARTINEZ MENESES 2015-01-02 08:02:09  MEXICO
##    municipio            localidad
## 1 HUEHUETOCA EX-HACIENDA DE JALPA
## 2 HUEHUETOCA          SAN BARTOLO
## 3 HUEHUETOCA           HUEHUETOCA
## 4 HUEHUETOCA           HUEHUETOCA
## 5 HUEHUETOCA           SALITRILLO
## 6 HUEHUETOCA COLONIA SANTA TERESA

Ahora bien, si queremos seleccionar ciertos datos que requerimos del dataframe con el mismo comando “head” lo podemos hacer. En este caso vamos a ver el nombre del beneficiario, el folio con el que le dieron su televisor y la entidad a la que pertenece.

Informe<- read.csv("InformeTDT-1erTrimestre-2015-reporte-entregas.csv")
save(Informe,file = "Informe.csv")
class(Informe)
## [1] "data.frame"
str(Informe)
## 'data.frame':    1491241 obs. of  6 variables:
##  $ folio       : int  38774982 51455758 36704040 36539336 80485295 78835892 65171992 80485663 36398507 65171983 ...
##  $ nombre      : Factor w/ 1384656 levels "A BIGAIL VIOLETA GALICIA SANCHEZ",..: 1162243 1109331 497974 659205 533751 304460 1066024 536023 298351 943947 ...
##  $ fechaentrega: Factor w/ 1101307 levels "2015-01-02 08:01:11",..: 2 3 4 5 6 7 8 9 10 11 ...
##  $ entidad     : Factor w/ 20 levels "BAJA CALIFORNIA",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ municipio   : Factor w/ 447 levels "ABASOLO","ACAMBARO",..: 146 146 146 146 146 146 146 146 146 146 ...
##  $ localidad   : Factor w/ 12463 levels "10 DE ABRIL",..: 4433 10005 5080 5080 9827 1965 10005 1965 4433 10005 ...
head(Informe[,c("nombre","folio","entidad")])
##                           nombre    folio entidad
## 1          PAULINA MARQUZ GARCIA 38774982  MEXICO
## 2        NATALIA MONTA?O NICOLAS 51455758  MEXICO
## 3 INES INOCENCIA MONTA?O MONTA?O 36704040  MEXICO
## 4           LIDIA MENDOZA CHIMAL 36539336  MEXICO
## 5 JACQUELINE SANTILLAN GUTIERREZ 80485295  MEXICO
## 6          ELSA MARTINEZ MENESES 78835892  MEXICO

En el mismo sentido, le pediremos ahora que nos muestre únicamente el folio del beneficiario, la fecha de entrega y la localidad.

Informe<- read.csv("InformeTDT-1erTrimestre-2015-reporte-entregas.csv")
save(Informe,file = "Informe.csv")
class(Informe)
## [1] "data.frame"
str(Informe)
## 'data.frame':    1491241 obs. of  6 variables:
##  $ folio       : int  38774982 51455758 36704040 36539336 80485295 78835892 65171992 80485663 36398507 65171983 ...
##  $ nombre      : Factor w/ 1384656 levels "A BIGAIL VIOLETA GALICIA SANCHEZ",..: 1162243 1109331 497974 659205 533751 304460 1066024 536023 298351 943947 ...
##  $ fechaentrega: Factor w/ 1101307 levels "2015-01-02 08:01:11",..: 2 3 4 5 6 7 8 9 10 11 ...
##  $ entidad     : Factor w/ 20 levels "BAJA CALIFORNIA",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ municipio   : Factor w/ 447 levels "ABASOLO","ACAMBARO",..: 146 146 146 146 146 146 146 146 146 146 ...
##  $ localidad   : Factor w/ 12463 levels "10 DE ABRIL",..: 4433 10005 5080 5080 9827 1965 10005 1965 4433 10005 ...
head(Informe[,c("folio","fechaentrega","localidad")])
##      folio        fechaentrega            localidad
## 1 38774982 2015-01-02 08:01:32 EX-HACIENDA DE JALPA
## 2 51455758 2015-01-02 08:01:37          SAN BARTOLO
## 3 36704040 2015-01-02 08:01:45           HUEHUETOCA
## 4 36539336 2015-01-02 08:02:00           HUEHUETOCA
## 5 80485295 2015-01-02 08:02:05           SALITRILLO
## 6 78835892 2015-01-02 08:02:09 COLONIA SANTA TERESA

Continuando con el ejemplo, solicitaremos únicamente el nombre de los beneficiarios y su entidad.

Informe<- read.csv("InformeTDT-1erTrimestre-2015-reporte-entregas.csv")
save(Informe,file = "Informe.csv")
class(Informe)
## [1] "data.frame"
str(Informe)
## 'data.frame':    1491241 obs. of  6 variables:
##  $ folio       : int  38774982 51455758 36704040 36539336 80485295 78835892 65171992 80485663 36398507 65171983 ...
##  $ nombre      : Factor w/ 1384656 levels "A BIGAIL VIOLETA GALICIA SANCHEZ",..: 1162243 1109331 497974 659205 533751 304460 1066024 536023 298351 943947 ...
##  $ fechaentrega: Factor w/ 1101307 levels "2015-01-02 08:01:11",..: 2 3 4 5 6 7 8 9 10 11 ...
##  $ entidad     : Factor w/ 20 levels "BAJA CALIFORNIA",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ municipio   : Factor w/ 447 levels "ABASOLO","ACAMBARO",..: 146 146 146 146 146 146 146 146 146 146 ...
##  $ localidad   : Factor w/ 12463 levels "10 DE ABRIL",..: 4433 10005 5080 5080 9827 1965 10005 1965 4433 10005 ...
head(Informe[,c("nombre","entidad")])
##                           nombre entidad
## 1          PAULINA MARQUZ GARCIA  MEXICO
## 2        NATALIA MONTA?O NICOLAS  MEXICO
## 3 INES INOCENCIA MONTA?O MONTA?O  MEXICO
## 4           LIDIA MENDOZA CHIMAL  MEXICO
## 5 JACQUELINE SANTILLAN GUTIERREZ  MEXICO
## 6          ELSA MARTINEZ MENESES  MEXICO

En el caso particular es necesario denotar que se trabajó con una muestra de la base de datos ya que la base de datos principal pesa 984 MB y la base de datos más “ligera” es de 64 MB, por lo que el programa tarda mucho en cargar los documentos.

En el mismo sentido se manifiesta el hecho de no realizar el ejercicio de traer de una URL estos archivos.

Lectura de un archivo CSV desde una URL.

#Primero descargamos el archivo.
URL<-"https://github.com/fcharte/ExploraVisualizaconR/blob/master/scripts/data/results.csv"
download.file(URL,destfile = "results.csv")
Res<-read.csv("results.csv", head=TRUE,sep = ",")
save(Res,file = "results.csv")
class(Res)
## [1] "data.frame"
str(Res)
## 'data.frame':    169 obs. of  1 variable:
##  $ X..DOCTYPE.html.: Factor w/ 130 levels "  ","    ","      ",..: 126 83 58 88 89 90 91 92 93 94 ...
#Para convertir todos los elementos en factor:
Res <- read.csv("results.csv", na.strings = "NA", colClasses = rep("factor", 44))
## Warning in read.table(file = file, header = header, sep = sep, quote =
## quote, : line 3 appears to contain embedded nulls
## Warning in read.table(file = file, header = header, sep = sep, quote =
## quote, : line 4 appears to contain embedded nulls
## Warning in read.table(file = file, header = header, sep = sep, quote =
## quote, : line 5 appears to contain embedded nulls
## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec =
## dec, : embedded nul(s) found in input
## Warning in read.table(file = file, header = header, sep = sep, quote =
## quote, : cols = 1 != length(data) = 44
#Verificando de nueva cuenta su estructura.
str(Res)
## 'data.frame':    7252 obs. of  1 variable:
##  $ RDX2: Factor w/ 3449 levels "  ","    ","      ",..: 3448 3130 3124 3129 3128 3126 58 3372 3439 28 ...
#Solicitando el head.
head(Res[,c("RDX2")])
## [1] X                                              
## [2]         placeholder=Search                     
## [3]         aria-label=Search this repository      
## [4]         data-unscoped-placeholder=Search GitHub
## [5]         data-scoped-placeholder=Search         
## [6]         autocapitalize=off>                    
## 3449 Levels:         ... data.frame

Exportación de datos a CSV.

Si necesitamos guardar un data frame podemos usar, como con cualquier otro objeto, la función save(), esta almacena el contenido del objeto en formato binario. Dicho formato es más compacto y rápido de procesar, pero no resulta útil en caso de que se precise leer la información desde otras aplicaciones.

Las funciones read.table, read.csv y read.csv2 descritas con antelación cuentan con las complementarias write.table, write.csv y write.csv2.

#write.table()

Función genérica para la escritura de datos en formato CSV. El único argumento obligatorio, aparte del objeto a almacenar es “file”, con el que se facilita el nombre del archivo en el que se escribirá. El contenido de este se perderá a menos que se de el valor “TRUE” al parámetro “append”. El parámetro col.names determina si se agregará o no una fila como cabecera, con los nombres de las columnas. El resto de parámetros son equivalentes a los de “read.table()”"

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.