Un sitio web llamada publicidad.com despliega anuncios en su sitio en un listado, donde muestra un numero maximo de 4 anuncios cada vez que un usuario entra a la pagina. Cuando un usuario hace click en el anuncio este es redirigido al sitio web del anunciante y el anunciate le paga a publicidad.com no por haber mostrado su anuncio si no por los clientes llegan a su sitio, es decir publicidad.com solo recibe un pago por cada click recibido en sus anuncios.
Publicidad.com guarda un registro de los anuncios en que posicion salieron y si recibieron click o no, como se muestra acontinuacion:
Los datos sumarizados serian los siguientes:
Como vemos la posicion 4 no aporta clicks, por lo que podemos obviarla ya que no solo agrega ruido y error al modelo.
Como vemos la tasa de clicks vs impresiones es baja, por lo que nuestro modelo ira mas orientada a predecir los no-clicks que los clicks. Realizaremos una grafica solamente para ejemplicar de mejor manera los datos
Como la data no esta ordenada, vamos a proceder a partir nuestro data set en dos, el primero es con el que generaremos el modelo y el segundo es con el que haremos las pruebas. Para ello utilizaremos un esquema 70/30, es decir entrenaremos el modelo con el 70% de la data y probraremos con el 30. Primero veamos cuantas tuplas tiene el dataset.
nrow(filter_clicks)
[1] 3186
Procedemos a partir los datasets:
c(nrow(training_data), nrow(test_data))
[1] 2230 956
Ahora procedemos a generar nuestro modelo usando la data de entrenamiento, utilizamo glm para generar el modelo y la distribucion binomial logit para hacerla una regresion logistica. Usamos una regresion logistica porque esta se utiliza para valores clasificativos es decir es o no es, 1 o 0, YES or No, como en este caso queremos predecir si tendra o no click basicamente lo que buscamos es que el modelo nos prediga si es un 1 o 0:
summary(model)
Call:
glm(formula = TieneClick ~ Posicion, family = binomial(link = "logit"),
data = training_data)
Deviance Residuals:
Min 1Q Median 3Q Max
-0.8979 -0.8979 -0.6047 -0.3948 2.2763
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.20605 0.13346 1.544 0.123
Posicion -0.90629 0.07709 -11.756 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2242.8 on 2229 degrees of freedom
Residual deviance: 2078.6 on 2228 degrees of freedom
AIC: 2082.6
Number of Fisher Scoring iterations: 5
Como vemos el valor del error estimado es negativo, por lo que muy probablemente la variable de posicion por si misma no sirva muy bien para explicar si el usuario puede o no hacer click en el anuncion. Al armar el modelo vemos que nos coloca siempre las mismas probabilidades para las posiciones 1,2 y 3.
Veamos que sucede cuando las predicciones que se hicieron decimos que si es mayor de 0.3 o 30% lo tome como un posible click y generamos la matriz de confusion para validar el modelo.
confusionMatrix(as.factor(prediccion_tiene_click), as.factor(test_data$TieneClick))
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 520 101
1 242 93
Accuracy : 0.6412
95% CI : (0.6099, 0.6717)
No Information Rate : 0.7971
P-Value [Acc > NIR] : 1
Kappa : 0.1273
Mcnemar's Test P-Value : 4.053e-14
Sensitivity : 0.6824
Specificity : 0.4794
Pos Pred Value : 0.8374
Neg Pred Value : 0.2776
Prevalence : 0.7971
Detection Rate : 0.5439
Detection Prevalence : 0.6496
Balanced Accuracy : 0.5809
'Positive' Class : 0
Como vemos en la matriz de confusion nos dice que el model tiene una Accuracy del 64% este valor es muy bajo es decir, es ligeramente mejor que tirar una ficha al aire para validar si el usuario puede hacer click o no sobre el anuncion. Otro aspecto a notar es que el modelo nos indica que esto tiene mas tendencia a buscar el no-click que los clicks, en donde tiene una sensibilidad del 68% (acerto 68 de 100 veces a no click), asi mismo vemos que tiene una especificidad del 47%, es decir que a la hora de predecir si realmente el usuario hara click esto lo predice de una manera muy mala por lo que este modelo no serviria para el proposito de predecir si el usuario hara o no click. Esto demuestra que la variable posicion por si solo no es suficiente para explicar si el usuario hara o no click, existen otros factores y variables que se deben tomar en cuenta para poder construir un modelo mas robusto.