Descripcion del problema

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               
                                          

Conclusion

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.

LS0tDQp0aXRsZTogIlByb3llY3RvIEVjb25vbWV0cmlhIDEiDQphdXRob3I6ICJPYmVkIEVzcGlub3phIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXJldCkNCmNsaWNrcyA8LSByZWFkLmNzdigiY2xpY2tzLmNzdiIpDQoNCmBgYA0KDQojI0Rlc2NyaXBjaW9uIGRlbCBwcm9ibGVtYQ0KVW4gc2l0aW8gd2ViIGxsYW1hZGEgcHVibGljaWRhZC5jb20gZGVzcGxpZWdhIGFudW5jaW9zIGVuIHN1IHNpdGlvIGVuIHVuIGxpc3RhZG8sIGRvbmRlIG11ZXN0cmEgdW4gbnVtZXJvIG1heGltbyBkZSA0IGFudW5jaW9zIGNhZGEgdmV6IHF1ZSB1biB1c3VhcmlvIGVudHJhIGEgbGEgcGFnaW5hLiBDdWFuZG8gdW4gdXN1YXJpbyBoYWNlIGNsaWNrIGVuIGVsIGFudW5jaW8gZXN0ZSBlcyByZWRpcmlnaWRvIGFsIHNpdGlvIHdlYiBkZWwgYW51bmNpYW50ZSB5IGVsIGFudW5jaWF0ZSBsZSBwYWdhIGEgcHVibGljaWRhZC5jb20gbm8gcG9yIGhhYmVyIG1vc3RyYWRvIHN1IGFudW5jaW8gc2kgbm8gcG9yIGxvcyBjbGllbnRlcyBsbGVnYW4gYSBzdSBzaXRpbywgZXMgZGVjaXIgcHVibGljaWRhZC5jb20gc29sbyByZWNpYmUgdW4gcGFnbyBwb3IgY2FkYSBjbGljayByZWNpYmlkbyBlbiBzdXMgYW51bmNpb3MuDQoNClB1YmxpY2lkYWQuY29tIGd1YXJkYSB1biByZWdpc3RybyBkZSBsb3MgYW51bmNpb3MgZW4gcXVlIHBvc2ljaW9uIHNhbGllcm9uIHkgc2kgcmVjaWJpZXJvbiBjbGljayBvIG5vLCBjb21vIHNlIG11ZXN0cmEgYWNvbnRpbnVhY2lvbjoNCg0KYGBge3J9DQpjbGlja3MNCmBgYA0KDQpMb3MgZGF0b3Mgc3VtYXJpemFkb3Mgc2VyaWFuIGxvcyBzaWd1aWVudGVzOg0KDQpgYGB7cn0NCnN1bW1hcml6YXRpb24gPC0gY2xpY2tzICU+JQ0KICBncm91cF9ieShQb3NpY2lvbikgJT4lDQogIHN1bW1hcml6ZSh0b3RhbF9jbGlja3MgPSBzdW0oVGllbmVDbGljayksIGltcHJlc2lvbmVzID0gbigpKQ0KDQpzdW1tYXJpemF0aW9uDQpgYGANCkNvbW8gdmVtb3MgbGEgcG9zaWNpb24gNCBubyBhcG9ydGEgY2xpY2tzLCBwb3IgbG8gcXVlIHBvZGVtb3Mgb2J2aWFybGEgeWEgcXVlIG5vIHNvbG8gYWdyZWdhIHJ1aWRvIHkgZXJyb3IgYWwgbW9kZWxvLg0KYGBge3J9DQpmaWx0ZXJfY2xpY2tzIDwtIGNsaWNrcyAlPiUgZmlsdGVyKFBvc2ljaW9uIDwgNCkNCg0Kc3VtbWFyaXphdGlvbiA8LSBmaWx0ZXJfY2xpY2tzICU+JQ0KICBncm91cF9ieShQb3NpY2lvbikgJT4lDQogIHN1bW1hcml6ZSh0b3RhbF9jbGlja3MgPSBzdW0oVGllbmVDbGljayksIGltcHJlc2lvbmVzID0gbigpKQ0KDQpzdW1tYXJpemF0aW9uDQpgYGANCg0KQ29tbyB2ZW1vcyBsYSB0YXNhIGRlIGNsaWNrcyB2cyBpbXByZXNpb25lcyBlcyBiYWphLCBwb3IgbG8gcXVlIG51ZXN0cm8gbW9kZWxvIGlyYSBtYXMgb3JpZW50YWRhIGEgcHJlZGVjaXIgbG9zIG5vLWNsaWNrcyBxdWUgbG9zIGNsaWNrcy4gUmVhbGl6YXJlbW9zIHVuYSBncmFmaWNhIHNvbGFtZW50ZSBwYXJhIGVqZW1wbGljYXIgZGUgbWVqb3IgbWFuZXJhIGxvcyBkYXRvcw0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gc3VtbWFyaXphdGlvbiAsIGFlcyhQb3NpY2lvbiwgdG90YWxfY2xpY2tzKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoY29sb3I9InJlZCIpICsNCiAgZ2d0aXRsZSgiQ2xpY2tzIHBvciBQb3NpY2lvbiIpICsNCiAgbGFicyh4ID0gIlBvc2ljaW9uZXMiKSArIA0KICBsYWJzKHkgPSAiQ29udGVvIikgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KQ29tbyBsYSBkYXRhIG5vIGVzdGEgb3JkZW5hZGEsIHZhbW9zIGEgcHJvY2VkZXIgYSBwYXJ0aXIgbnVlc3RybyBkYXRhIHNldCBlbiBkb3MsIGVsIHByaW1lcm8gZXMgY29uIGVsIHF1ZSBnZW5lcmFyZW1vcyBlbCBtb2RlbG8geSBlbCBzZWd1bmRvIGVzIGNvbiBlbCBxdWUgaGFyZW1vcyBsYXMgcHJ1ZWJhcy4gUGFyYSBlbGxvIHV0aWxpemFyZW1vcyB1biBlc3F1ZW1hIDcwLzMwLCBlcyBkZWNpciBlbnRyZW5hcmVtb3MgZWwgbW9kZWxvIGNvbiBlbCA3MCUgZGUgbGEgZGF0YSB5IHByb2JyYXJlbW9zIGNvbiBlbCAzMC4gUHJpbWVybyB2ZWFtb3MgY3VhbnRhcyB0dXBsYXMgdGllbmUgZWwgZGF0YXNldC4NCg0KYGBge3J9DQpucm93KGZpbHRlcl9jbGlja3MpDQpgYGANClByb2NlZGVtb3MgYSBwYXJ0aXIgbG9zIGRhdGFzZXRzOg0KYGBge3J9DQp0cmFpbmluZ19kYXRhID0gY2xpY2tzWzE6KDAuNypucm93KGZpbHRlcl9jbGlja3MpKSxdDQp0ZXN0X2RhdGEgPSBjbGlja3NbKDAuNypucm93KGZpbHRlcl9jbGlja3MpKTpucm93KGZpbHRlcl9jbGlja3MpLCBdDQoNCmMobnJvdyh0cmFpbmluZ19kYXRhKSwgbnJvdyh0ZXN0X2RhdGEpKQ0KYGBgDQoNCkFob3JhIHByb2NlZGVtb3MgYSBnZW5lcmFyIG51ZXN0cm8gbW9kZWxvIHVzYW5kbyBsYSBkYXRhIGRlIGVudHJlbmFtaWVudG8sIHV0aWxpemFtbyBnbG0gcGFyYSBnZW5lcmFyIGVsIG1vZGVsbyB5IGxhIGRpc3RyaWJ1Y2lvbiBiaW5vbWlhbCBsb2dpdCBwYXJhIGhhY2VybGEgdW5hIHJlZ3Jlc2lvbiBsb2dpc3RpY2EuIFVzYW1vcyB1bmEgcmVncmVzaW9uIGxvZ2lzdGljYSBwb3JxdWUgZXN0YSBzZSB1dGlsaXphIHBhcmEgdmFsb3JlcyBjbGFzaWZpY2F0aXZvcyBlcyBkZWNpciBlcyBvIG5vIGVzLCAxIG8gMCwgWUVTIG9yIE5vLCBjb21vIGVuIGVzdGUgY2FzbyBxdWVyZW1vcyBwcmVkZWNpciBzaSB0ZW5kcmEgbyBubyBjbGljayBiYXNpY2FtZW50ZSBsbyBxdWUgYnVzY2Ftb3MgZXMgcXVlIGVsIG1vZGVsbyBub3MgcHJlZGlnYSBzaSBlcyB1biAxIG8gMDoNCg0KDQpgYGB7cn0NCm1vZGVsIDwtIGdsbShmb3JtdWxhID0gVGllbmVDbGljayB+IFBvc2ljaW9uLCBkYXRhID0gdHJhaW5pbmdfZGF0YSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpKQ0KDQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQpDb21vIHZlbW9zIGVsIHZhbG9yIGRlbCBlcnJvciBlc3RpbWFkbyBlcyBuZWdhdGl2bywgcG9yIGxvIHF1ZSBtdXkgcHJvYmFibGVtZW50ZSBsYSB2YXJpYWJsZSBkZSBwb3NpY2lvbiBwb3Igc2kgbWlzbWEgbm8gc2lydmEgbXV5IGJpZW4gcGFyYSBleHBsaWNhciBzaSBlbCB1c3VhcmlvIHB1ZWRlIG8gbm8gaGFjZXIgY2xpY2sgZW4gZWwgYW51bmNpb24uIEFsIGFybWFyIGVsIG1vZGVsbyB2ZW1vcyBxdWUgbm9zIGNvbG9jYSBzaWVtcHJlIGxhcyBtaXNtYXMgcHJvYmFiaWxpZGFkZXMgcGFyYSBsYXMgcG9zaWNpb25lcyAxLDIgeSAzLg0KDQpgYGB7cn0NCnByZWRpY3Rpb25zIDwtIHByZWRpY3Qob2JqZWN0ID0gbW9kZWwsDQogICAgICAgICAgICAgICAgIG5ld2RhdGEgPSB0ZXN0X2RhdGEsDQogICAgICAgICAgICAgICAgIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQpyZXN1bHRhZG9zIDwtIGRhdGEuZnJhbWUodGVzdF9kYXRhJENvZGlnbywgdGVzdF9kYXRhJFBvc2ljaW9uLCB0ZXN0X2RhdGEkVGllbmVDbGljaywgcHJvYmFiaWxpZGFkPXByZWRpY3Rpb25zKQ0KcmVzdWx0YWRvcw0KYGBgDQpWZWFtb3MgcXVlIHN1Y2VkZSBjdWFuZG8gbGFzIHByZWRpY2Npb25lcyBxdWUgc2UgaGljaWVyb24gZGVjaW1vcyBxdWUgc2kgZXMgbWF5b3IgZGUgMC4zIG8gMzAlIGxvIHRvbWUgY29tbyB1biBwb3NpYmxlIGNsaWNrIHkgZ2VuZXJhbW9zIGxhIG1hdHJpeiBkZSBjb25mdXNpb24gcGFyYSB2YWxpZGFyIGVsIG1vZGVsby4NCmBgYHtyfQ0KcHJlZGljY2lvbl90aWVuZV9jbGljayA8LSBpZmVsc2UocHJlZGljdGlvbnMgPj0gMC4zMCwgMSwgMCkNCg0KY29uZnVzaW9uTWF0cml4KGFzLmZhY3RvcihwcmVkaWNjaW9uX3RpZW5lX2NsaWNrKSwgYXMuZmFjdG9yKHRlc3RfZGF0YSRUaWVuZUNsaWNrKSkNCmBgYA0KIyNDb25jbHVzaW9uDQoNCkNvbW8gdmVtb3MgZW4gbGEgbWF0cml6IGRlIGNvbmZ1c2lvbiBub3MgZGljZSBxdWUgZWwgbW9kZWwgdGllbmUgdW5hIEFjY3VyYWN5IGRlbCA2NCUgZXN0ZSB2YWxvciBlcyBtdXkgYmFqbyBlcyBkZWNpciwgZXMgbGlnZXJhbWVudGUgbWVqb3IgcXVlIHRpcmFyIHVuYSBmaWNoYSBhbCBhaXJlIHBhcmEgdmFsaWRhciBzaSBlbCB1c3VhcmlvIHB1ZWRlIGhhY2VyIGNsaWNrIG8gbm8gc29icmUgZWwgYW51bmNpb24uIE90cm8gYXNwZWN0byBhIG5vdGFyIGVzIHF1ZSBlbCBtb2RlbG8gbm9zIGluZGljYSBxdWUgZXN0byB0aWVuZSBtYXMgdGVuZGVuY2lhIGEgYnVzY2FyIGVsIG5vLWNsaWNrIHF1ZSBsb3MgY2xpY2tzLCBlbiBkb25kZSB0aWVuZSB1bmEgc2Vuc2liaWxpZGFkIGRlbCA2OCUgKGFjZXJ0byA2OCBkZSAxMDAgdmVjZXMgYSBubyBjbGljayksIGFzaSBtaXNtbyB2ZW1vcyBxdWUgdGllbmUgdW5hIGVzcGVjaWZpY2lkYWQgZGVsIDQ3JSwgZXMgZGVjaXIgcXVlIGEgbGEgaG9yYSBkZSBwcmVkZWNpciBzaSByZWFsbWVudGUgZWwgdXN1YXJpbyBoYXJhIGNsaWNrIGVzdG8gbG8gcHJlZGljZSBkZSB1bmEgbWFuZXJhIG11eSBtYWxhIHBvciBsbyBxdWUgZXN0ZSBtb2RlbG8gbm8gc2VydmlyaWEgcGFyYSBlbCBwcm9wb3NpdG8gZGUgcHJlZGVjaXIgc2kgZWwgdXN1YXJpbyBoYXJhIG8gbm8gY2xpY2suIEVzdG8gZGVtdWVzdHJhIHF1ZSBsYSB2YXJpYWJsZSBwb3NpY2lvbiBwb3Igc2kgc29sbyBubyBlcyBzdWZpY2llbnRlIHBhcmEgZXhwbGljYXIgc2kgZWwgdXN1YXJpbyBoYXJhIG8gbm8gY2xpY2ssIGV4aXN0ZW4gb3Ryb3MgZmFjdG9yZXMgeSB2YXJpYWJsZXMgcXVlIHNlIGRlYmVuIHRvbWFyIGVuIGN1ZW50YSBwYXJhIHBvZGVyIGNvbnN0cnVpciB1biBtb2RlbG8gbWFzIHJvYnVzdG8uDQo=