library(knitr)

Ejemplo de Naive Bayes

Caso

Dos bolsitas con bolitas rojas y negras Se tienen dos buzones. El Buzón 1 con 5 bolitas negras y 3 rojas. El Buzón 2, con 6 negras y 4 rojas. El experimento aleatorio, consiste en sacar una bolita del primer buzón e introducirla en el segundo, para después extraer una bolita de este último buzón y ahí preguntar probabilidades de ocurrencia. El hecho de sacar una bolita se le llama evento, cuya probabilidad es siempre diferente de cero. (El experimento tiene como condición, siempre sacar una bolita)

Variables

buz1 <- 8
buz2 <- 10
buz1roja <- 3
buz1negra <- 5
buz2roja <- 4
buz2negra <- 6

buzon

Arbol de decision

arbol

Primer evento: Sacar una bolita del Buzón 1, esta acción puede seguir dos opciones: Comenzar sacando una bolita de color Negro o sacar una de color Rojo. Inmediatamente introducirla en el Buzón 2. En ambas situaciones, se aumenta en una bolita el espacio muestral o número total de bolitas del segundo buzón. Segundo evento: Sacar una bolita del Buzón 2, después de haber introducido la bolita que proviene del Buzón 1, la cual también sigue las dos mismas opciones o ramas (N o R)

¿Cual es la probabilidad de que sea roja en la bolsita 2?

La probabilida de que sea roja es de 3/8 o 0.375 en el primer evento. La probabilida de que sea nuevamente roja en el segundo evento es 5/11 o sea 0.4545. La bolsa 2 tenía 4 rojas y se le incopora 1 roja, entonces ahora tiene 5.

Verificación

Evento 1 Suceso N: Sacar una bolita negra, probabilidad 5/8) Suceso R: Sacar una bolita roja, probabilidad 3/8) PR Probabilida de que sea Roja (3/8) PN Probabilida de que sea Negra (5/8)

PR <- (3/8)
PN <- (5/8)
PR
## [1] 0.375
PN
## [1] 0.625

la probabilidad de que la bolita sea roja es de 0.375 y la probabilidad de que sea negra es de 0.625

Evento 2 Opcion 1 del evento 2 Sacar una bolita negra cuando la primera fue negra, N/N Sacar una bolita roja cuando la primera fue negra, N/R PN.PN: Pobabilida de que sea negra y negra PN.PR: Pobabilida de que sea negra y roja ¿Cuántas bolitas hay en total en la segunda bolsa?, 11, toda vez se agregó una negra ¿Cuántas negras? 7 de 11 ¿Cuántas rojas? 4 de 11

PN.PN <- (7/11)
PN.PR <- (4/11)
PN.PN
## [1] 0.6363636
PN.PR
## [1] 0.3636364

La probabilidad de que en el evento 2 se saque una bolita negra luego de que en el evento 1 haya sido negra es de 0.6363 y de que sea una roja 0.3636

Opcion 2 del evento 2 Sacar una bolita negra cuando la primera fue roja, R/N Sacar una bolita roja cuando la primera fue roja, R/R PR.PN: Pobabilida de que sea negra y negra PR.PR: Pobabilida de que sea negra y roja ¿Cuántas bolitas hay en total en la segunda bolsa?, 11, toda vez se agregó una roja ¿Cuántas negras? 6 de 11 ¿Cuántas rojas? 5 de 11

PR.PN <- (6/11)
PR.PR <- (5/11)
PR.PN
## [1] 0.5454545
PR.PR
## [1] 0.4545455

La probabilidad de que en el evento 2 se saque una bolita roja luego de que en el evento 1 haya sido roja es de 0.5454 y de que sea una roja 0.454

Calculando las probabilidades

¿Cuál es la probabilidad que sea roja? A partir del diagrama, se calcula la probabilidad de sacar una bolita roja del Buzón 2, dado el experimento en cuestión. Respondiendo la pregunta formulada: ¿Cuál es la probabilidad que sea roja? Hacemos una variable PRdenominador que se usará en Fórmula de Bayes mas adelante PRdenominador <- (PN * PN.PR) + (PR * PR.PR)

PRdenominador <- (PN * PN.PR) + (PR  * PR.PR)
PRdenominador
## [1] 0.3977273

Calculando la probabilida de que sea roja según el diagrama de árbol: 0.3977273

Aplicando el teorema de bayes

bayes

¿Cual es la probabilidad de de sacar una bolita roja del segundo evento o buzón, dado que en el primero fue bolita roja?

Se utiliza la variable PTB.R.R a esta probabilidad formulada por Bayes, para tener una notación coherente. Probabilidad y de acuerdo al Teorema de Bayes de que primero sea roja y luego roja

PTB.R.R <- (PR * PN.PR )/ (PRdenominador)
PTB.R.R
## [1] 0.3428571

la probabilidad de de sacar una bolita roja del segundo evento o buzón, dado que en el primero fue bolita roja es de 0.3428571

¿Cual es la probabilidad de de sacar una bolita negra del segundo evento o buzón, dado que en el primero fue bolita negra?

Se utiliza la variable PTB.N.N a esta probabilidad formulada por Bayes, para tener una notación coherente. Probabilidad y de acuerdo al Teorema de Bayes de que primero sea negra y luego negra

PTB.N.N <- (PN * PN.PN )/ (PRdenominador)
PTB.N.N
## [1] 1

la probabilidad de de sacar una bolita negra del segundo evento o buzón, dado que en el primero fue bolita negra es de 1

Ejemplo de Naive Bayes

# leemos la base de datos
# tabla_1<-read.csv("tabla_1.csv",header = TRUE)

# vamos a crear el ejemplo de cero: CREAMOS UNA TABLA DE DATOS
tabla_1<-data.frame(hora=c(8,14,24,8,14,24,8,14,24,8,14,24,8,14,24,8,14,24,24,24))
tabla_1$lugar<-c("casa","restaurante","casa",
                 "trabajo","trabajo","casa",
                 "trabajo","trabajo","casa",
                 "casa","restaurante","casa",
                 "trabajo","trabajo","casa",
                 "casa","restaurante","casa","cine","cine")
tabla_1$finde<-c(T,T,T,
                 F,F,F,
                 F,F,F,
                 T,T,T,
                 F,F,F,
                 T,T,T,
                 T,F
                )
str(tabla_1)
## 'data.frame':    20 obs. of  3 variables:
##  $ hora : num  8 14 24 8 14 24 8 14 24 8 ...
##  $ lugar: chr  "casa" "restaurante" "casa" "trabajo" ...
##  $ finde: logi  TRUE TRUE TRUE FALSE FALSE FALSE ...
head(tabla_1)
##   hora       lugar finde
## 1    8        casa  TRUE
## 2   14 restaurante  TRUE
## 3   24        casa  TRUE
## 4    8     trabajo FALSE
## 5   14     trabajo FALSE
## 6   24        casa FALSE
# vemos como ejemplo el numero de registros de hora según el lugar
table(tabla_1$hora,tabla_1$lugar)
##     
##      casa cine restaurante trabajo
##   8     3    0           0       3
##   14    0    0           3       3
##   24    6    2           0       0

Como vemos, es una tabla con 20 regisros y 3 variables en columnas, sobre la que queremos practicar pronósticos bayesianos de probabilidad condicionada.

Vamos cargar la librería naivebayes con objeto de crear un modelo de pronóstico de la variable dependiente lugar a partir de las variables independientes hora y finde. Este modelo nos diría por ejemplo la probabilidad de que: sabiendo la hora y si es o no fin de semana, Juan se encuentre en un lugar determinado.

# cargamos la librería    
    library(naivebayes)
## Warning: package 'naivebayes' was built under R version 4.1.3
## naivebayes 0.9.7 loaded
# creamos el modelo de pronostico
    m <- naive_bayes(lugar ~ hora+finde, data = tabla_1)#, laplace = 1)
## Warning: naive_bayes(): Feature finde - zero probabilities are present. Consider
## Laplace smoothing.
    # representamos graficamente el modelo
    plot(m)

# ejecutando predict(modelo) tenemos los resultados de pronostico para cada registro de datos
    tabla_1$p=predict(m)    
    head(tabla_1)
##   hora       lugar finde           p
## 1    8        casa  TRUE        casa
## 2   14 restaurante  TRUE restaurante
## 3   24        casa  TRUE        cine
## 4    8     trabajo FALSE     trabajo
## 5   14     trabajo FALSE restaurante
## 6   24        casa FALSE        cine
# pero si queremos un hecho concreto:        
# creamos un hecho a priori, sobre el que queremos pronosticar el resultado
# como el modelo es  lugar ~ hora+finde, aportamos un dato de hora y otro de finde
# en este caso queremos pronosticar donde se encuentra Juan a las 14 horas un día laborable
    h<-data.frame(hora= 24, finde=T)
    table(tabla_1$lugar,tabla_1$hora+tabla_1$finde)
##              
##               8 9 14 15 24 25
##   casa        0 3  0  0  3  3
##   cine        0 0  0  0  1  1
##   restaurante 0 0  0  3  0  0
##   trabajo     3 0  3  0  0  0
# llamamos a la función de predición
    predict(m,h)
## [1] cine
## Levels: casa cine restaurante trabajo
# idam con la probabilidad completa
    predict(m,h, type = "prob")
##              casa      cine  restaurante      trabajo
## [1,] 0.0006001881 0.9993923 7.515315e-06 7.298325e-10

La predicción que obtenemos con el modelo para (hora= 24, finde=T) es claramente erronea, pues solo 1 de los 4 registros que tenemos a las 24 horas en fin de semana es ir al cine, los otros 3 son estar en casa, por lo que algo falla en el modelo al ser el evento más probable estar en casa.

Este problema es habitual cuando usamos datos continuos, que nos generan distribuciones de probabilidad continuas. En este caso el evento de ir al cine tiene muy pocos datos, pero siempre a las 24 horas, por lo que la media se mantiene en 24 h. Sin embargo el hecho estar en casa tienen muchos registros en diferentes horas, por lo que el valor medio de la hora es un número intermedio 18,6 (ver el modelo m para más información).

Para evitar problemas debemos transformar las variables continuas en discretas y reducir al máximo los valores posibles realizando lo que denominamos una categorización previa de los datos. Por ejemplo convietiendo los datos en factores.

# Convertimos la variable continua numerica hora, en factor discreto
    tabla_1$hora<-as.factor(tabla_1$hora)
    str(tabla_1)
## 'data.frame':    20 obs. of  4 variables:
##  $ hora : Factor w/ 3 levels "8","14","24": 1 2 3 1 2 3 1 2 3 1 ...
##  $ lugar: chr  "casa" "restaurante" "casa" "trabajo" ...
##  $ finde: logi  TRUE TRUE TRUE FALSE FALSE FALSE ...
##  $ p    : Factor w/ 4 levels "casa","cine",..: 1 3 2 4 3 2 4 3 2 1 ...
# calculamos de nuevo el modelo ahora
  #  m <- naive_bayes(lugar ~ hora+finde, data = tabla_1)
# Hacemos de nuevo la predicción
    predict(m,h)
## [1] cine
## Levels: casa cine restaurante trabajo
 predict(m,h, type="prob")
##              casa      cine  restaurante      trabajo
## [1,] 0.0006001881 0.9993923 7.515315e-06 7.298325e-10
    # ojo al crear el hecho que debe ser acorde a los datos, 
# si es factor debe contener en levels los mismos que la tabla origen
# por ello lo creamos a partir de esta tabla mejor    
#    h<-tabla_1[1,c(1,3)]
 #       h$hora="24"
  #      h$finde=F
    predict(m,h)
## [1] cine
## Levels: casa cine restaurante trabajo

Como hemos visto al transformar en factor la variable numérica continua, hemos realizado un pronostico más acorde con los datos.

5.2 e1072