Documente Academic
Documente Profesional
Documente Cultură
Minera de Datos I
Dr. Oldemar Rodrguez R.
En este documento se presenta una introduccin al
Paquete R, especialmente orientado a su lenguaje de
programacin, con nfasis en aplicaciones a la Minera
de Datos.
Escuela de Informtica Universidad Nacional
09/03/2013
La consola y el editor de R
Lo primero que nos aparece es una ventana, tambin llamada consola,
donde podemos manejar R mediante la introduccin de cdigo. Por
ejemplo, podemos escribir 2+2 en ella, pulsando Intro, lo que nos
devolver en la misma consola el valor 4.
Sin embargo, esta no es la manera ms eficiente de trabajar en R. A
poco que estemos realizando un trabajo de mediana complejidad, ser
muy til manejar todas las entradas que solicitemos a R en un entorno
donde podamos corregirlas, retocarlas, repetirlas, guardarlas para
continuar el trabajo en otro momento, etc. Esta es la funcin del editor
de R.
Vectores
Matrices
Factores
Hojas de datos (data frames)
Listas
Vectores
Un vector en R puede contener una coleccin de nmeros o de
caracteres no numricos. Para definir un vector, por ejemplo, el vector
x = (1, 3, 5), usaramos la orden:
> x<-c(1,3,5)
As podremos llamar al vector x en el futuro. Observemos que se
utiliza el operador asignacin <- y no el operador = que se reserva
para otro tipo de definiciones. Observemos tambin que es la funcin
de concatenacin c() la que construye el vector.
Tambin es posible definir un vector de nmeros consecutivos, por
ejemplo, el vector (1, 2, 3, 4, 5) mediante 1:5. De forma ms general, la
funcin seq() permite definir secuencias desde un inicio hasta un n con
una determinada separacin entre ellos. Por ejemplo,
> y<-seq(-3,3,0.5)
> y
retorna:
[1] -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0
1.5 2.0 2.5 3.0
Es til la funcin rep() para definir vectores como repeticin de otros
vectores. Por ejemplo, rep(0,100) devolvera un vector de 100 ceros. O
tambin, rep(1:3,3) devolvera [1] 1 2 3 1 2 3 1 2 3.
Si queremos saber la longitud de un vector, usaremos length(). Por
ejemplo, length(y) nos devolvera el valor 13.
Decir, por ltimo, que no hay problema en que un vector, en vez de
incluir nmeros, incluya caracteres, siempre que stos estn entre
comillas. Por ejemplo, podramos definir el vector:
> genero<-c("Mujer","Hombre")
Factores
Los factores son un tipo especial de vectores que permiten analizar
variables Estadstica y la Minera de Datos nominales o cualitativas
(como veremos ms adelante en el curso). Por ejemplo, la variable
Provincia cuyas modalidades o posibles valores son: "San
Jos","Alajuela","Heredia","Cartago","Puntarenas","Limn","Guanacast
e". En R se podra tener:
> provincia<factor(c("Alajuela","Heredia","Alajuela","Cartag
o","Heredia"))
> provincia
Visto como una tabla Estadstica o de Minera de Datos sera:
Individuo
1
2
3
4
5
Provincia
Alajuela
Heredia
Alajuela
Cartago
Heredia
Matrices
Una matriz se define mediante la funcin matrix() a la que hay que
especificarle los elementos y la dimensin. Por ejemplo, para definir la
matriz:
Se hace usando:
> matriz<-matrix(c(1,2,3,4,5,6,7,8,9),3,3)
Las dimensiones (n de filas y columnas) de la matriz pueden
obtenerse mediante la funcin dim(). Por ejemplo, dim(matriz)
proporcionara el valor 3 3. Si queremos llegar a elementos concretos
de una matriz lo haremos utilizando corchetes para indicar las y
columnas. Por ejemplo, matriz[2,3] devolvera el valor 8, matriz[1:2,2:3]
devolvera
Por otra parte, tanto para vectores como para matrices, funcionan las
operaciones suma y diferencia sin ms complicaciones. En el caso del
producto, sin embargo, hay que clarificar que, por ejemplo,
matriz*matriz devuelve la multiplicacin elemento a elemento, es
decir:
Matemticas
Ciencias Espaol
Historia
Educacin
Fsica
Luca
7.0
6.5
9.2
8.6
8.0
Pedro
7.5
9.4
7.3
7.0
7.0
Ins
7.6
9.2
8.0
8.0
7.5
Luis
5.0
6.5
6.5
7.0
9.0
Andrs
6.0
6.0
7.8
8.9
7.3
Ana
7.8
9.6
7.7
8.0
6.5
Carlos
6.3
6.4
8.2
9.0
7.2
Jos
7.9
9.7
7.5
8.0
6.0
Sonia
6.0
6.0
6.5
5.5
8.7
Mara
6.8
7.2
8.7
9.0
7.0
Color.ojos
1
Azules
2
Marrones
3
Marrones
Peso
68
75
88
Altura
1.65
1.79
1.85
Listas
Como ejemplo, considere una base de datos de empleados.
Supongamos que por cada empleado se almacena el nombre, salario
y un booleano que indica pertenencia o no al grupo (unin) de
empleados. Podramos iniciar nuestra base de datos en vaco como
sigue:
> j <- list()
Para insertar el primer empleado se puede hacer como sigue:
> j <- list(nombre="Luis", salario=55000,
union=T)
> j
$nombre
[1] "Luis"
$salario
[1] 55000
$union
[1] TRUE
En realidad, los nombres de los elementos, por ejemplo, "sueldo", son
opcionales. Uno tambin podra hacerlo:
> j2 <- list("Luis",
> j2
55000, T)
[[1]]
[1] "Luis"
[[2]]
[1] 55000
[[3]]
[1] TRUE
Los nombres de los elementos en una lista se llaman tags. Estos se
pueden obtener con el operador names():
> names(j)
[1] "nombre"
"salario" "union"
<- unlist(j)
nombre salario
"Luis" "55000"
union
"TRUE"
de=5)
> j$salario
[1] 55000
> j[["salario"]]
[1] 55000
> j[[2]]
[1] 55000
El operador [ ] se utiliza para extraer sub-listas que son retornadas
como listas, por ejemplo:
> j[1]
$nombre
[1] "Luis"
> j[1:2]
$nombre
[1] "Luis"
$salario
[1] 55000
Otro ejemplo:
> car<-j[[1]]
> cdr<-j[2:length(j)]
> car
[1] "Luis"
> cdr
$salario
[1] 55000
$union
[1] TRUE
> class(car)
[1] "character"
> class(cdr)
[1] "list"
$a
[1] "abc"
$b
[1] 12
$c
[1] 1
Tambin se puede agregar elementos usando los ndices del vector:
> z[[4]]<-28
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] 1
[[4]]
[1] 28
> z[5:7]<-c(FALSE,TRUE,FALSE)
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] 1
[[4]]
[1] 28
[[5]]
[1] FALSE
[[6]]
[1] TRUE
[[7]]
[1] FALSE
Los elementos de un vector pueden ser eliminados usando NULL, por
ejemplo:
> z$b <- NULL
> z
$a
[1] "abc"
$c
[1] 1
[[3]]
[1] 28
[[4]]
[1] FALSE
[[5]]
[1] TRUE
[[6]]
[1] FALSE
Funciones ms comunes en R
En este apartado se destacan algunas funciones de R que se usan en
el resto de este documento. Por ejemplo:
sum() proporciona la suma de los elementos del argumento. As,
teniendo en cuenta que x = (1, 3, 5), sum(x) dara el valor 9.
Operaciones lgicas
A continuacin se enumeran los operadores lgicos ms utilizados: <,
>, <= y >= son los operadores menor, mayor, menor que y mayor que,
respectivamente, == es el operador de comparacin, & y | son los
operadores y y o, respectivamente. Por ejemplo;
> vec <- c(1, 3, 5)
> vec
[1] 1 3 5
> vec>=1.5
[1] FALSE TRUE TRUE
Manejo de Datos
Introduccin de datos nuevos
En una situacin general en la que se tiene informacin sobre n
individuos y que se refiere a k variables. En ese caso, la forma en que
la Estadstica y la Minera de Datos usa para organizar toda esta
informacin es una matriz de dimensiones n k en la que en cada fila
Matemticas
Ciencias Espaol
Historia
Educacin
Fsica
Luca
7.0
6.5
9.2
8.6
8.0
Pedro
7.5
9.4
7.3
7.0
7.0
Ins
7.6
9.2
8.0
8.0
7.5
Luis
5.0
6.5
6.5
7.0
9.0
Andrs
6.0
6.0
7.8
8.9
7.3
Ana
7.8
9.6
7.7
8.0
6.5
Carlos
6.3
6.4
8.2
9.0
7.2
Jos
7.9
9.7
7.5
8.0
6.0
Sonia
6.0
6.0
6.5
5.5
8.7
Mara
6.8
7.2
8.7
9.0
7.0
159
206
241
163
197
193
209
189
169
201
Datos faltantes
Qu ocurre si, por alguna razn, nos falta el dato de una variable
referida a un individuo concreto? Eso se conoce en Minera de Datos
como dato faltante o missing data. Para R es muy fcil identificar
esos datos cuando los introducimos a mano: basta con dejar esa
casilla vaca, en cuyo caso el editor de datos escribir en ella NA,
acrnimo de Not Available.
Importar datos
Hay que decir que introducir datos a mano puede convertirse en una
tarea muy pesada a poco que el nmero de casos o de variables sea
medianamente alto. Hoy en da, por otra parte, es bastante comn
tener los datos almacenados en algn tipo de formato electrnico y la
clave del xito para aprovechar estos recursos y no tener que
introducir los datos manualmente radica en hacer que nuestro
programa de Minera de Datos, en este caso R, lea estos datos.
Los formatos de archivo ms habituales en los que nos podemos
encontrar unos datos son, en primer lugar, los archivos tipo texto (con
extensin .txt) y, en segundo lugar, los archivos de Microsoft Excel(con
extensin .xls). La extensin que por defecto asigna R a sus archivos
de datos es RData, mientras que R Commander utiliza por defecto rda.
Sin embargo, no hay ningn problema con que desde R se guarden o
se lean archivos con extensin rda ni para que R Commander guarde
o lea archivos con extensin RData.
Datos
Podemos hacer lo mismo si abrimos con el bloc de notas el archivo
NotasEscolares.txt, seleccionamos y copiamos todos los datos
(seleccionamos con el ratn y pulsamos Control+C) y, una vez que
estos datos estn en el portapapeles, ejecutamos.
Datos<read.table("Clipboard",header=TRUE,sep="",dec=".")
Mediante R Commander
Nos vamos a la opcin del men Datos Importar datos desde
archivo de texto o portapapeles...
Mediante R Commander
En el caso de los archivos tipo Excel, R Commander no necesita que
le digamos nada, ya que detecta automticamente los nombres de las
variables si estn presentes. No obstante, stos no deben incluir
caracteres extraos, y deben estar todos los nombres de todas las
variables o ninguno; en cualquier otro caso, la importacin podra ser
invlida. Tan slo tenemos que utilizar la opcin del men:
Datos Importar datos desde conjunto de datos
Excel
Exportar datos
Existe la posibilidad de exportar el conjunto de datos activo para que
pueda ser ledo por cualquier otro programa. El formato ms sencillo
en que podemos hacerlo mediante R es el formato de texto .txt.
La funcin write.table permite crear archivos de texto que contienen
hojas de datos de R. La sintaxis de dicha funcin, con las opciones
ms habituales, es la siguiente:
write.table(hoja,file="fichero.txt",sep="\t",na="NA"
,dec=".",row.names=TRUE, col.names=TRUE)
Vamos a comentar los detalles de cada argumento:
Mediante R Commander
Utilizaremos la opcin del men:
Datos Conjunto de datos activo Exportar el
conjunto de datos activo.
Programacin en R
Ejemplo 1: Este es un ejemplo de un programa para calcular las
races reales de una ecuacin cuadrtica. Note el uso de # para
comentar el cdigo.
# limpia workspace
rm(list=ls())
# entrada
a2 <- 2
a1 <- 1
a0 <- -3
# clculos
raiz1 <- (-a1 + sqrt(a1^2 - 4*a2*a0))/(2*a2)
raiz2 <- (-a1 - sqrt(a1^2 - 4*a2*a0))/(2*a2)
# salida
show(c(raiz1, raiz2))
Salida:
[1]
1.0 -1.5
Ejemplo 2: Calculando
factorial <- function(n) {
fact <- prod(1:n)
return(fact)
}
combinaciones <- function(n, r) {
comb <- factorial(n)/factorial(r)*factorial(n-r)
return(comb)
}
Salida:
> factorial(9)
[1] 362880
> combinaciones(9,3)
[1] 43545600
Ciclos IF-ELSE
if (logical_expression)
expression_1
...
}
if (logical_expression)
expression_1
...
} else {
expression_2
...
}
Ejemplo 3:
Cuadratica2 <- function(a0, a1, a2) {
# encuentra los ceros de a2*x^2 + a1*x + a0 = 0
if (a2 == 0 && a1 == 0 && a0 == 0) {
raices <- NA
} else if (a2 == 0 && a1 == 0) {
raices <- NULL
} else if (a2 == 0) {
raices <- -a0/a1
} else {
# calcula el discriminante
discrim <- a1^2 - 4*a2*a0
if (discrim > 0) {
raices <- c((-a1+sqrt(a1^24*a2*a0))/(2*a2),(-a1-sqrt(a1^2-4*a2*a0))/(2*a2))
} else if (discrim == 0) {
raices <- -a1/(2*a2)
} else {
raices <- NULL
}
}
return(raices)
}
Salida:
> Cuadratica2(-3,1,2)
[1] 1.0 -1.5
> Cuadratica2(1,1,1)
NULL
> Cuadratica2(1,3,0)
[1] -0.3333333
Ciclos FOR
for (x in vector) {
expression_1
...
}
Ejemplo 4:
x_lista
x_lista
<-
seq(1,
9,
by
2)
suma_x <- 0
for (x in x_lista) {
suma_x <- suma_x + x
cat("El valor de x es:", x, "\n")
cat("El total acumulado es:", suma_x,\n")
}
Salida:
El
El
El
El
El
El
El
El
El
El
valor
total
valor
total
valor
total
valor
total
valor
total
de x es: 1
acumulado es:
de x es: 3
acumulado es:
de x es: 5
acumulado es:
de x es: 7
acumulado es:
de x es: 9
acumulado es:
1
4
9
16
25
Ejemplo 5:
Suma <- function(x_lista) {
suma_x <- 0
for (x in x_lista) {
suma_x <- suma_x + x
cat("El valor de x es:", x, "\n")
cat("El total acumulado es:", suma_x,"\n")
}
}
x_lista <- seq(1,
Suma(x_lista)
9,
by
2)
Salida:
> Suma(x_lista)
El valor de x es: 1
El total acumulado es:
El valor de x es: 3
El total acumulado es:
El valor de x es: 5
El total acumulado es:
El valor de x es: 7
El total acumulado es:
El valor de x es: 9
El total acumulado es:
1
4
9
16
25
Ejemplo 6:
nfact1 <- function(n) {
n_factorial <- 1
for (i in 1:n) {
n_factorial <- n_factorial * i
}
return(n_factorial)
}
nfact1(6)
Ejemplo 7: (Recursivo)
nfact2 <- function(n) {
if (n == 1) {
return(1)
} else {
return(n*nfact2(n-1))
}
}
nfact2(6)
Recursin Lineal
Ejemplo:
+
# Recursin Normal
u<- function(n){
if(n == 0)
return(0)
else
if(n == 1)
return(2)
else
(2*u(n-1))-(3*u(n-2))
}
# Ejemplo Recursin Lineal
u2 <- function(n){
aux.u2(1, 0, 2, n)
}
aux.u2 <- function(i, ant, res, n){
if(n == 0)
return(ant)
else
if(n == 1)
return(res)
else
if(i==n)
return(res)
else
Ciclos WHILE
while (logical_expression)
expression_1
...
}
Ejemplo 8:
Teniendo en cuenta los nmeros de Fibonacci de la F1, F2,. . ., que se
definen inductivamente por:
F1 = 1, F2 = 1,
Fn = Fn-1 + Fn-2 para n 2.
Salida:
> fibonacci_despues_x(100)
[1] 144
Ejemplo 9: Leyendo del teclado
cuadratica3 <- function() {
# Entrada
cat("Encuentra los ceros de a2*x^2 + a1*x + a0 =
0\n")
a2 <- as.numeric(readline("a2 = "))
a1 <- as.numeric(readline("a1 = "))
a0 <- as.numeric(readline("a0 = "))
# calcula el discriminante
discrim <- a1^2 - 4*a2*a0
if (discrim > 0) {
raices <- (-a1 + c(1,-1) * sqrt(a1^2 4*a2*a0))/(2*a2)
} else {
if (discrim == 0) {