---
title: "Ejercicios Redes Neuronales"
author: "Ricardo R. Palma"
date: "18 de octubre de 2020"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```


## Carge de bibliotecas

```{r}
library(neuralnet)  # regression

library(nnet) # classification 

library(NeuralNetTools)

library(plyr)
```



## Carga de Datos

```{r}
library(readr)
Startups <- read_csv("/home/rpalma/AAA_Datos/2020/Posgrado/Di3/Datasets/50 Start Ups/50_Startups_LAC.csv")
```

```{r}
Categoric <- read_csv("/home/rpalma/AAA_Datos/2020/Posgrado/Di3/Datasets/50 Start Ups/50_Startups_Categoric_LAC.csv")
```

La columna supervivencia de la tabla Categoric tiene etiquetas que identifican la situación en la que terminaron los emprendimientos, a saber:

* **SpinOf** La empresa se separó de una principal y logró su independencia económica

* **RevEq** La empresa alcanzó su punto de equilibrio canceló su deuda con el banco y fue comprada por la competencia.

* **BankR** La empresa no prosperó y el banco se quedó con los activos que vendidos no compensaron el preśtamo inicial (Banca Rota).



## Tratamiento de variables categóricas




```{r}
tabla1 <- table(Categoric$Pais)
tabla2 <- table(Categoric$Supervivencia)
tabla3 <- table(Categoric$Pais,Categoric$Supervivencia)
```


```{r}
plot(tabla1, col=c("red","green","blue"))

```

```{r}
plot(tabla2, col=c("red","green","blue"))
```


```{r}
plot(tabla3, col=c("red","green","blue"))
```


## Histogramas superpuestos


```{r}
ind_1 <- which(Categoric$Pais=="Colombia")
p1 <- as.matrix(Categoric[ind_1,5])

ind_2 <- which(Categoric$Pais=="Ecuador")
p2 <- as.matrix(Categoric[ind_2,5])

ind_3 <- which(Categoric$Pais=="Chile")
p3 <- as.matrix(Categoric[ind_3,5])

```

```{r}
hp1 <- hist(p1)
hp2 <- hist(p2)
hp3 <- hist(p3)

par(mfrow=c(3,1))
plot( hp1, col=rgb(0,0,1,1/4), xlim=c(30000,200000),ylim=c(0,5),main="Ecuador")
plot( hp2, col=rgb(1,0,0,1/4),xlim=c(30000,200000),ylim=c(0,10),main="Colombia") 
plot( hp3, col=rgb(1,0,0,1/4),xlim=c(30000,200000),ylim=c(0,10),main="Chile") 
```


```{r}
par(mfrow=c(1,3))
plot( hp1, col=rgb(0,0,1,1/4), xlim=c(30000,200000),ylim=c(0,5),main="Ecuador")
plot( hp2, col=rgb(1,0,0,1/4),xlim=c(30000,200000),ylim=c(0,10),main="Colombia") 
plot( hp3, col=rgb(1,0,0,1/4),xlim=c(30000,200000),ylim=c(0,10),main="Chile") 
```




```{r}
pairs(Categoric[ ,1:3])
```

```{r}
boxplot(Categoric[ ,1:3])
```



```{r}
Categoric$Pais <- as.numeric(revalue(Categoric$Pais,
                          c("Colombia"="0", "Ecuador"="1",
                            "Chile"="2")))
```

## Cuadro de campos categóricos

```{r}
Categoric$Supervivencia <- as.numeric(revalue(Categoric$Supervivencia,
                          c("BankR"="0", "RevEq"="1",
                            "SpinOff"="2")))
```

## Profit versus País


```{r}
plot(Categoric$Pais, Categoric$Profit)


```


## Visualización de Tablas

Tabla Textual

```{r}
library(kableExtra)
kable(head(Categoric), "pipe")
```


Tabla Simple

```{r}
kable(head(Categoric), "simple")
```




## Normailización


```{r}
normalize<-function(x){
  return ( (x-min(x))/(max(x)-min(x)))
}

Startups_norm<-as.data.frame(lapply(Categoric,FUN=normalize))
summary(Startups_norm$Profit)

```

Datos Originales y Datos normalizados

```{r}
head(Categoric$Profit)
head(Startups_norm)

```


Muestreo para entrenamento

```{r}
indice <- sample(2, nrow(Startups_norm), replace = TRUE, prob = c(0.7,0.3))
startups_train <- Startups_norm[indice==1,]
startups_test  <- Startups_norm[indice==2,]
```



## Modelo de Neural Net



```{r}
library(neuralnet)
attach(Categoric)

startups_model <- neuralnet(Profit ~ R_D_Spend+ POM + Logist_Market + Pais , data = startups_train)

str(startups_model)
```


## Ploteo de la red Neuronal


```{r}
plot(startups_model, rep = "best")
```

## Ploteo de la red proporcional

Esto me indica cuales son los KPI

```{r}
par(mar = numeric(4), family = 'serif')
plotnet(startups_model, alpha = 0.6)
```



### Evaluación de la performance del modelo


```{r}
model_results <- compute(startups_model,startups_test[1:4])
predicted_profit <- model_results$net.result
```


##  Predicted profit Vs Actual profit of test data.

```{r}
cor(predicted_profit,startups_test$Profit)
```




## Desnormalización de los resultados

Dado que hicimos la predicciones con los datos normalizados, ahora deberemos des-normalizarlos



```{r}

str_max <- max(Startups$Profit)
str_min <- min(Startups$Profit)

unnormalize <- function(x, min, max) { 
  return( (max - min)*x + min )
}

ActualProfit_pred <- unnormalize(predicted_profit,str_min,str_max)
head(ActualProfit_pred)
```


## Mejoramiento de la performance del modelo

Es posible mejorar la performance con el agregado de más capas ocultas.


```{r}
Startups_model2 <- neuralnet(Profit~R_D_Spend+ POM + Logist_Market + Pais , data = startups_train, hidden = c(2,4))

plot(Startups_model2 ,rep = "best")
```


## Performance del modelo mejorado

```{r}
model_results2<-compute(Startups_model2,startups_test[1:4])
predicted_Profit2<-model_results2$net.result
cor(predicted_Profit2,startups_test$Profit)
```


## Modelo Mejorado KPI

```{r}
par(mar = numeric(4), family = 'serif')
plotnet(Startups_model2, alpha = 0.6)
```

## Neural Net Clasificación

Armamos el dataset de datos a clasificar


```{r}
library(nnet)

supervivencia <- as.factor(Categoric$Supervivencia)
R_D_Spend <- as.matrix(Categoric$R_D_Spend)
POM <- as.matrix(Categoric$POM)
Logist_Market <- as.matrix(Categoric$Logist_Market)
Clasificar <- data.frame (supervivencia,R_D_Spend,POM,Logist_Market)
```

## Muestreo

```{r}
indice <- sample(2, nrow(Clasificar), replace = TRUE, prob = c(0.7,0.3))

clasificar_train <- Startups_norm[indice==1,]
clasificar_test  <- Startups_norm[indice==2,]

supervivientes_clasificados <- factor(clasificar_train$Supervivencia)

```



Entrenamiento de nnet como clasificador


```{r}
supervivientes_train<-nnet(supervivientes_clasificados~clasificar_train$R_D_Spend + clasificar_train$POM+ clasificar_train$Logist_Market ,data=clasificar_train,size=5, decay=5e-4, maxit=2000)
```


## Visualización del clasificador

```{r}
plotnet(supervivientes_train, alpha = 0.6)
```



## Aramdos de set de entrenamiento y de predicción




<https://stackoverrun.com/es/q/3338607>

crs$nnet <- nnet(as.factor(Target) ~ .,
                    data=crs$dataset[crs$sample,c(crs$input, crs$target)],
                    size=10, skip=TRUE, MaxNWts=10000, 
                    trace=FALSE, maxit=100)
                    




