---
title: "KNN"
author: "Ricardo R. Palma"
date: "22 de octubre de 2020"
output: html_document
---

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

## KNN


### Kesimo Vecino Más Próximo

    Es una técnica de agrupamiento
    Separa a los datos en grupos (entrenamiento)
    Si vengo con un caso nuevo me dice como quien se va a comportar



### Cargar datos frontera pareto

```{r}


library(readr)
datos <- read_delim("https://themys.sid.uncu.edu.ar/rpalma/R-cran/Frontera_Pareto.csv", 
    ";", escape_double = FALSE, locale = locale(decimal_mark = ",", 
        grouping_mark = "|"), trim_ws = TRUE)

datos
```

Leer Riesgo Rentabilidad delos primeros valores

```{r}
head(datos)

```

Polteo Datos


```{r}
my <- datos$Rentabilidad 
mx <- datos$Riesgo

plot(mx,my,type="p", main="Frontera Pareto en Mendoza",ylab="Riesgo %",xlab="Rentabilidad")
```

## Creación de clusters

La creación de conglomerados se realiza cambiando el parámetro $5$ para que el la cantidad de muestras que quedan en cada grupo sean aproximadamente las misma. 
Se supone que en Mendoza hay un grupo de empresas (Almacenes y Negocios de Alimentos de Proximidad) más abundante que el resto.

Para realizar el entrenamiento (fit) se van probando valores 1,2,3...5,6,etc hasta que se observa un valanceo que se aproxima a la distribución de la población analizada.


```{r}
set.seed(123)
library(cluster)
fit <- kmeans(datos, 5)
fit



```

## Crear nombres

Es ahora necesario que generemos un nombre para cada cluster.
En este caso usaremos la denominación **"Group_N"** donde N representa un número secuencial, pero podríamos asignar palabras o rubros que nos faciliten el análisis.

Luego de tener este modelo entrenado podremos tomar una empresa cuya actividad desconocemos y con la rentabilidad y riesgo conocido saber cuales son los negocios más parecidos y a que grupo pertenecen estos vecinos.

```{r}
set.seed(123)
aggregate(datos,by=list(fit$cluster),FUN=mean)
mi_cluster <- data.frame(datos, fit$cluster)

```

Ver pertenencia de cada individuo de la problación y el cluster que se le asigna en función de riesgo y rentabilidad.

```{r}
mi_cluster
```

## Ploteo de Clusters con PCA


```{r}
clusplot(mi_cluster,mi_cluster$fit.cluster)
```

Del análisis de los componentes principales podemos inferir que solamente con dos variables logramos explicar 87,91% del comportamiento de las empresas. Si al estudiar el PCA de otro caso los primeros dos o tres componentes explican solamente un valor menor al 50% será necesario agregar una columna más a los datos iniciales y repetir todos los pasos.


## Figura de Familias

Clasificacion de Familias agrupadas por Rentabilidad

```{r}
plot(mi_cluster$Rentabilidad , mi_cluster$Riesgo , col=mi_cluster$fit.cluster, main = "Localización de cada cluster")

```

Tomando una de los dos dimensiones del cluster entrenado vemos que el primer componente principal logra establecer un gráfico muy parecido al de la frontera de pareto, pero se ve que se marcan las divisiones entre cada familia de negocios.


## Entrenamiento KNN

El enrenamiento de un modelo de vecino próximo puede ser una buena opción cuando la problación es muy grande. Es como trabajar con una muestra de la problación.

En el caso de estudio que se presenta sabemos a que actividad se dedica cada una de las empresas que fueron encuestadas sobre riesgo percibido de sus actividad y rentabilidad.

```{r}

train <- mi_cluster
cl  <- factor(mi_cluster$fit.cluster, levels = c("1", "2","3","4","5"),labels = c("Prost, Penalist, Casino","Bank, Cred_pers, Tel_Cel, Bebidas", "Manufactura, Metal_Mec, Servicios ,Seguros,Bodegas","MOA, Restaurant, Emprendimientos BT","Transporte, Pasajeros, Indumentaria, Perecederos"))
 
             
```

Clusters Identificados según muestra de encuestas

```{r}
summary(cl)
```
```{r}
plot(cl, main="Casos en la muestra", las = 2)
```


## Caso de estudio


Tenemos una nueva empresa sobre la que nos interesa saber de que tipo de actividad se trata. 


* Rentabilidad 50.000 %
* Riesgo 62,23%
* 3 Vecinos más próximos
```{r}
mi_caso <- cbind (50,62.23,3 )
mi_caso
```

Busco a que grupo pertenecen los 20 vecinos más próximos


```{r}
set.seed(123)
library(class)
knn(train, mi_caso, k=20, cl, prob=TRUE)
```
Puedo asegurar con un 70% de nivel de confianza que se trata de una empresa del grupo.

* Manufactura
* Matalmecánica
* Servicios profesionales
* Agente de seguros
* Bodegas pequeñas




