Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 101 additions & 48 deletions clasificacion/Shaira_Perez.Rmd
Original file line number Diff line number Diff line change
@@ -1,18 +1,39 @@
---
title: "Tarea_Mineria"
author: "Shaira Pérez"
date: "Saturday, June 20, 2015"
output: html_document
---

```{r eval=TRUE}
msg = "Eval debe estar en TRUE, la primera vez que cargo el archivo no se evalua install"
print(msg)
El objetivo de este informe es clasificar qué tan aceptable es cierto carro estableciendo una relación entre su precio total y sus comodidades, entre ellas la seguridad que ofrece.

Para esto utilizamos un modelo obtenido de evaluar las instancias del [repositorio](http://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data) de un DataSet. El cual contiene las siguientes variables:

Variable | Tipo | D.A | Rango | Explicación |
----------- |:---------:|:-------:|:---------------------:|:-------------------------------------: |
buying | Ordinal | No |v-high, high, med, low | El precio total de compra |
maint | Ordinal | No |v-high, high, med, low | Precio de mantenimiento |
doors | Ordinal | No | 2, 3, 4, 5-more | Número de puertas |
persons | Ordinal | No | 2, 4, more | Capacidad de personas que pueden ocuparlo |
lug_boot | Ordinal | No | small, med, big | Tamaño de la maleta |
safety | Ordinal | No | low, med, high | Seguridad estimada |
class | Ordinal | No |unacc, acc, good, vgood| Aceptabilidad del carro en cuestión |

##Obtención de los datos

Procedemos a descargar el dataset car.data, el cual contiene las instancias del modelo descrito anteriormente. Son 1728 instancias, las cuales tienen un valor en todos los atributos, es decir, el dataset no tiene valores NA.

```{r, echo=FALSE, cache=TRUE}
#2._ Obtener Dataset car
data<- read.csv(url("http://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data"), header = FALSE, col.names=c("buying","maint", "doors", "persons", "lug_boot", "safety","class"))
data
```

```{r echo=FALSE, eval=TRUE}
##Preprocesamiento de los datos

Antes de realizar el análisis, se instalan los paquetes necesarios para realizar todas las operaciones.

```{r, echo=FALSE}
#1._ Importar librerías necesarias para .Rmd
#Creamos la función que recibe los paquetes
install = function(pkg){
#Si ya está instalado, no lo instala.
if (!require(pkg, character.only = TRUE)) {
Expand All @@ -21,71 +42,103 @@ install = function(pkg){
}
}

#Instalamos primero "foreach"
install("foreach")

#Seleccionamos los archivos que queremos instalar
archive = c("rJava", "shiny", "rmarkdown", "foreach", "caret", "e1071", "rpart", "tree", "RWeka", "C50")
archive = c("rJava", "shiny", "rpart.plot", "rmarkdown", "foreach", "caret", "e1071", "rpart", "tree", "RWeka", "C50")
foreach(i = archive) %do% install(i)

```
El dataset con el cual se hará el procesación es car, por lo que procedemos a descargarlo:

Ahora se realiza una selección de variables para obtener una representación reducida del conjunto de datos, que es mucho más pequeña en volumen pero produce los mismos (o casi iguales) resultados analíticos.

```{r echo=TRUE}
#3._ Selección de variables
data$buying <- as.factor(data$buying)
data$maint <- as.factor(data$maint)
data$doors <- as.factor(data$doors)
data$persons <- as.factor(data$persons)
data$lug_boot <- as.factor(data$lug_boot)
data$safety <- as.factor(data$safety)

```{r echo=FALSE, cache=TRUE}
#2._ Obtener Dataset car
file<- "http://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data"
Data<-read.csv(file, header = FALSE, sep = ",")
Data
DT<-as.data.frame(data)

AttributeSelection <- make_Weka_filter("weka.filters.supervised.attribute.AttributeSelection")

rd=AttributeSelection(class ~ ., DT, control = Weka_control(E = "weka.attributeSelection.InfoGainAttributeEval", S = "weka.attributeSelection.Ranker -T -1.7976931348623157E308 -N 4"))
```
Como no se desea trabajar con todas la variables del dataset, sólo con las más "significativas", se realiza una reducción de dimensionalidad con la función de RWeka AttributeSelection, obteniendo:

```{r echo=FALSE}
#3._ Selección de variables
library("RWeka")
AS<- make_Weka_filter("weka.filters.supervised.attribute.AttributeSelection")
DatosS=AS(Data)
DatosS
##División de los datos

Con el set de datos resultante del preprocesamiento se realiza un muestreo aleatorio con 80% de los datos para entrenamiento y 20% para prueba.

```{r echo=2:3}
#4._ Particionamiento de la data en 80% entrenamiento y 20% prueba usando muestreo aleatorio
trainIndex = createDataPartition(y=rd$class, p= 0.8, list=FALSE, times=1)
dataTrain <- rd[trainIndex,]
dataTest <- rd[-trainIndex,]
```
Ahora con este nuevo dataset usamos muestreo aleatorio con 80% de los datos para entrenamiento y 20% para prueba.

```{r echo=FALSE}
#4._ Particionamiento de la data en 80% entrenamiento y 20% prueba
library (caret)
set.seed ( 3456 )
trainIndex <- createDataPartition (DatosS, p = .8 , list = FALSE, times= 1)
DataTrain <- DatosS[-trainIndex]
DataTest <- DatosS[trainIndex]
Otra técnica para realizar la división del dataset es validación cruzada:

```{r echo=TRUE}
#BONO: Particionamiento de la data usando validación cruzada
cruzada = createFolds(y = rd$class, k = 2, list = TRUE, returnTrain = FALSE)

```
Generación de modelos:

##Generación del Modelo

La clasificación se realizará con el modelo de árbol de decisión. Y para esto primero se aplica el algoritmo C4.5 (provisto por la librería RWeka), el cual construye el árbol desde el conjunto de datos de entrenamiento, el cual es un ejemplo ya clasificado.

```{r echo=FALSE}
#5._ Generar modelo e imprimir árbol
library(grid)
library(partykit)
#5._Generación del modelo
AD <- J48(class ~., rd, control=Weka_control(C = 0.25, M=40)) #AD=árbol de decisión
plot(AD)
```

str(DatosS)
m1 <- J48(V1~., data = DatosS)
m1
plot(m1)
Sin embargo, otra manera de generar el árbol de decisión es a través del paquete Rpart, dando como resultado:

m2 <- J48(V7~., data = DatosS)
m2
plot(m2)
## Modelo Rpart

```
```{r echo=FALSE}
#6._ Uso de funcion predict()
fit1 <- rpart(class ~ .,rd, control=rpart.control(minsplit=2,cp=0.01), method="class")
fit2 <- rpart(class ~ .,rd, control=rpart.control(minsplit=140,cp=0.1), method="class")
fit3 <- rpart(class ~ .,rd, control=rpart.control(minsplit=550,cp=0.01), method="class")
fit4 <- rpart(class ~ .,rd, control=rpart.control(minsplit=1152,cp=0.01), method="class")

# VERIFICAR TIPO DE DATO DE DATATEST
table(DataTest$V1, predict(m1))
plot(m1)
rpart.plot(fit1)

```

##Predicción y Matriz de Confusión

En un sentido estricto ninguna clasificación puede considerarse completa hasta que su grado de exactitud sea evaluado. Este puede definirse como el grado de concordancia entre las clases asignadas por el clasificador y sus ubicaciones correctas.

El instrumento más usual para evaluar la exactitud de una clasificación es la matriz de confusión, la cual permite observar fácilmente si el sistema esta confundiendo las clases.

La matriz de confusión asociada al modelo generado por el algoritmo C4.5:

```{r echo=FALSE}
#7._ Matriz de confusion
#confusionMatrix(m1, positive = NULL, prevalence = NULL)
test <- dataTest
test$class=NULL
confusionMatrix(predict(AD,test,type="class"), dataTest$class)
```

Y la asociada a Rpart:

```{r echo=FALSE}
c1 = confusionMatrix(predict(fit1,test,type="class"), dataTest$class)
c2 = confusionMatrix(predict(fit2,test,type="class"), dataTest$class)
c3 = confusionMatrix(predict(fit3,test,type="class"), dataTest$class)
c4 = confusionMatrix(predict(fit4,test,type="class"), dataTest$class)
```


Escenario | Accuracy |
--------- |:---------------:|
1 |`r c1$overall[1]`|
2 |`r c2$overall[1]`|
3 |`r c3$overall[1]`|
4 |`r c4$overall[1]`|