Octubre 2014

Sobre mi:

¿Qué es R?

R es un lenguaje y entorno de programación para el análisis estadístico y gráfico.

 

http://www.r-project.org/

¿Por qué R?

Ejemplo práctico: ¡Viva el vino!

Web Scraping

Descargamos los datos haciendo uso de los paquetes XLM, RCurl y RSelenium.

Los datos

Vino Añada Bodega Puntos Comentarios Precio DO
Torelló Brut Reserva 2008 Torelló Cava 8.7 1 10-20 D.O. Cava
Protos selección 2005 Bodegas Protos 8.4 1 20-30 D.O. Ribera del Duero
Pesquera Magnum Reserva 2007 Alejandro Fernández - Tinto Pesquera NA 0 50-100 D.O. Ribera del Duero
Chafandin Tempranillo 2004 Bodegas y Viñedos del Jaro (Compañía de Viñedos Iberian) NA 0 30-50 D.O. Ribera del Duero
Montesierra Crianza Réhoboam 2004 2004 Pirineos NA 0 30-50 D.O. Somontano
Protos rosado 2008 Bodegas Protos 7.9 1 5-10 D.O. Ribera del Duero
Las Alcaydias Selección Barricas 2002 Viñedos Heretat de Cesilia 8.0 12 5-10 D.O. Alicante
Vinya Orlina Blanco 2012 Celler Cooperatiu D´Espolla NA 0 0-5 D.O. Empordà

Un total de 18.037 registros.

Relación precio y puntuación

ggplot(todo[!is.na(todo$Precio),],aes(x=Precio,y=Puntos))+geom_boxplot(fill="deepskyblue2")

Relación añada y puntuación

ggplot(todo[todo$Añada>=1950,],aes(x=Añada,y=Puntos))+geom_point()+
  geom_smooth(se=FALSE,lwd=1,col="orange")

Mapas

  1. Descargamos el mapa vectorial de las Denominaciones de Origen del Ministerio de Agricultura, Alimentación y Medio Ambiente.

  2. Agregamos los datos de Verema:

todo[,list(.N,Puntos=mean(Puntos,na.rm = T),Precio=mean(Precio2)),by=DO_id]
##                  DO_id   N   Puntos    Precio
## 1:          binissalem  52 8.035135 14.375000
## 2: campo de la guardia   4 8.075000 11.250000
## 3:          pago ayles  13 8.338462  6.346154
## 4: pago los balagueses   8 8.614286 15.000000
## 5:           somontano 446 7.993939 10.829596
## 6:     valle de guimar  10 8.350000 13.750000
## 7:              alella  82 8.165000 13.445122
## 8:            cataluna 197 7.904196  9.213198
  1. Cruzamos ambas tablas por D.O.

Mapas

Usando el paquete ggmap, descargamos un mapa base y pintamos encima:

ggmap(map,extent = "device")+
  geom_polygon(aes(x=long,y=lat,group=group,fill=Puntos),data=ddoo_df,col="white",alpha = .4, size = .2)

Machine Learning

Los datos

Se dispone de 11 medidas químicas para 6.497 "Vinho verde" (Portugal).

str(xx.all)
## 'data.frame':    6497 obs. of  13 variables:
##  $ fixed.acidity       : num  7.4 7.8 7.8 11.2 7.4 7.4 7.9 7.3 7.8 7.5 ...
##  $ volatile.acidity    : num  0.7 0.88 0.76 0.28 0.7 0.66 0.6 0.65 0.58 0.5 ...
##  $ citric.acid         : num  0 0 0.04 0.56 0 0 0.06 0 0.02 0.36 ...
##  $ residual.sugar      : num  1.9 2.6 2.3 1.9 1.9 1.8 1.6 1.2 2 6.1 ...
##  $ chlorides           : num  0.076 0.098 0.092 0.075 0.076 0.075 0.069 0.065 0.073 0.071 ...
##  $ free.sulfur.dioxide : num  11 25 15 17 11 13 15 15 9 17 ...
##  $ total.sulfur.dioxide: num  34 67 54 60 34 40 59 21 18 102 ...
##  $ density             : num  0.998 0.997 0.997 0.998 0.998 ...
##  $ pH                  : num  3.51 3.2 3.26 3.16 3.51 3.51 3.3 3.39 3.36 3.35 ...
##  $ sulphates           : num  0.56 0.68 0.65 0.58 0.56 0.56 0.46 0.47 0.57 0.8 ...
##  $ alcohol             : num  9.4 9.8 9.8 9.8 9.4 9.4 9.4 10 9.5 10.5 ...
##  $ quality             : int  5 5 5 6 5 5 5 7 7 5 ...
##  $ tipo                : Factor w/ 2 levels "Blanco","Tinto": 2 2 2 2 2 2 2 2 2 2 ...

Gráfico de correlaciones

corrplot(cor(xx.all[,-indY]),order="hclust",bg = "transparent")

¿Tinto o blanco?

Queremos predecir de manera automática si un vino es tinto o blanco.

ggplot(melt(xx.all,id.vars = "tipo"),aes(x=value,col=tipo))+facet_wrap(~variable,scales = "free")+
  geom_density()+scale_color_manual(values=c("#009f5d","#820000"))

¿Tinto o blanco?

Realizamos el aprendizaje usando el algoritmo Random Forest. Consiguiendo resultados muy buenos:

confusionMatrix(pred.test.class,xx.test$tipo)
     
    
    

Confusion Matrix and Statistics

          Reference
Prediction Blanco Tinto
    Blanco    978     2
    Tinto       1   317
                                          
               Accuracy : 0.9977
roc(xx.test$tipo,pred.test.prob[, 2],plot=T)

## 
## Call:
## roc.default(response = xx.test$tipo, predictor = pred.test.prob[,     2], plot = T)
## 
## Data: pred.test.prob[, 2] in 979 controls (xx.test$tipo Blanco) < 319 cases (xx.test$tipo Tinto).
## Area under the curve: 1

¿Tinto o blanco?

También podemos observar las variables más importantes en el modelo:

¿Calidad?

Vamos a intentar predecir la variable quality usando Support Vector Machine.

ggplot(xx.all,aes(x=quality))+geom_bar(fill="orange2")+geom_text(aes(y = (..count..),
  label=scales::percent((..count..)/sum(..count..))),stat="bin",colour="darkgreen",vjust=-0.2) 

¿Calidad?

Lanzamos el modelo:

svm.fit = train ( xx.train[ , -indY ] , xx.train$quality , 
                  method = "svmRadial", 
                  trControl = cv.ctrl,
                  tuneGrid = svmGrid
                  )
Confusion Matrix and Statistics

          Reference
Prediction   3   4   5   6   7   8   9
         3   0   0   0   0   0   0   0
         4   0   4   4   1   0   0   0
         5   0   9 297  80  12   2   0
         6   6  30 124 457  93  19   1
         7   0   0   2  28 110   8   0
         8   0   0   0   1   0   9   0
         9   0   0   0   0   0   0   0

Overall Statistics
                                          
               Accuracy : 0.6762 

!Gracias!