Preprocesamiento -Volumen 1-



Santiago Banchero
Leo Lucianna
Juan Manuel Fernandez


Minería de Datos - UBA

Preprocesamiento (Volumen I)


En esta clase, vamos a abordar las siguientes técnicas a través del lenguaje R:

  • Integración de datos de múltiples fuentes
  • Limpieza de datos: Manejo de Ruido
  • Selección de variables: Detección de Atributos Redundantes

Integración de datos de múltiples fuentes

Existen, varias operaciones para integrar datos, por ejemplo merge:

productos<-data.frame(Codigo=c(45, 46), Denominacion=c("Licuadora", "TV 4k"), Precio=c(1245.10, 14742))
head(productos)
  Codigo Denominacion  Precio
1     45    Licuadora  1245.1
2     46        TV 4k 14742.0
stock<-data.frame(Cod=c(45, 46), stock=c(8650, 145))
dataset<-merge(productos, stock, by.x = "Codigo",  by.y = "Cod")
head(dataset)
  Codigo Denominacion  Precio stock
1     45    Licuadora  1245.1  8650
2     46        TV 4k 14742.0   145


Bonus Track: Librerías sqldf y dplyr.

Bonus Track para Integración/Manipulación de datos: sqldf y dplyr

Con sqldf vamos a manipular los dataframes como si fueran tablas sql:

library(sqldf)
join_string = "SELECT Codigo, Denominacion, Precio, stock as Stock FROM productos p INNER JOIN stock s ON p.Codigo=s.Cod"
sql_query = sqldf(join_string,stringsAsFactors = FALSE)
head(sql_query)
  Codigo Denominacion  Precio Stock
1     45    Licuadora  1245.1  8650
2     46        TV 4k 14742.0   145

Otra librería muy conocida de R para la manipulación de dataframes es dplyr:

library(dplyr)
data.dplyr = inner_join(productos, stock, by = c("Codigo" = "Cod"))
head(data.dplyr)
  Codigo Denominacion  Precio stock
1     45    Licuadora  1245.1  8650
2     46        TV 4k 14742.0   145

Integración de datos de múltiples fuentes (++)

Además, como vimos antes, debemos tener en cuenta:

  • Diferentes nombres de atributos,
names(stock)
[1] "Cod"   "stock"
names(stock)[1]="Codigo"
names(stock)
[1] "Codigo" "stock" 
  • Diferente representación de los mismos datos,
celsius=c(26,32)
fahrenheit=(celsius*1.8)+32
print(fahrenheit)
[1] 78.8 89.6
  • Diferente granularidad.
library(lubridate)
fechas <- c(as.Date("2011-06-26"), as.Date("2013-07-15"))
meses <- c(5, 8)
todos <- cbind(meses, month(fechas))

Limpieza de datos: Manejo de Ruido

Manejo de Ruido por Binning: Equal Freq // Equal Width

library(infotheo)

# Discretize recibe el atributo, el método de binning y la cantidad de bins
bin_eq_freq <- discretize(iris$Sepal.Width,"equalfreq", 5)

# Nos copiamos el atributo original
bin_eq_freq$Sepal.Width = iris$Sepal.Width

# Por cada bin calculamos la media y reemplazamos en el atributo suavizado
for(bin in 1:5){
  bin_eq_freq$suavizado[ bin_eq_freq$X==bin] = mean(bin_eq_freq$Sepal.Width[ bin_eq_freq$X==bin])
}

Limpieza de datos: Manejo de Ruido (++)

# grafico Sepal.Width ordenado de menor a mayor
plot(sort(iris$Sepal.Width) , type = "l", col="red", ylab = "Sepal.Width", xlab = "Observaciones", main = "Dato original vs suavizado")
# Agrego la serie de la variable media 
lines(sort(bin_eq_freq$suavizado),
      type = "l", col="blue")
legend("topleft", legend=c("Original", "Suavizado"), col=c("red", "blue"), lty=1)

plot of chunk unnamed-chunk-9

Reducción de datos: Atributos Redundantes

En datos de tipo cualitativos/nominales: Test de Chi-Cuadrado

Hacemos la tabla de contingencia:

library(MASS)
tbl_cont = table(survey$Smoke, survey$Exer)
print(tbl_cont)

        Freq None Some
  Heavy    7    1    3
  Never   87   18   84
  Occas   12    3    4
  Regul    9    1    7




Luego aplicamos el Test de Chi-cuadrado:

chisq.test(tbl_cont)

    Pearson's Chi-squared test

data:  tbl_cont
X-squared = 5.4885, df = 6, p-value = 0.4828

Reducción de datos: Atributos Redundantes (++)

En datos de tipo cuantitativos/numéricos: Coeficiente de Correlación & Covarianza

llamadas=read.csv('llamadas.csv')
cor(llamadas$minutos,llamadas$unidades)  # Coeficiente de Pearson
[1] 0.9936987



Debemos recordar validar los supuestos para una regresión -a menudo, esto no aparece en la Bibliografía-

plot(llamadas$minutos,llamadas$unidades, main = "Relación entre unidades y minutos", xlab = "Duración de la llamada (minutos)", ylab = "Unidades") # Gráficamente

plot of chunk unnamed-chunk-14