Predecir los clics en los anuncios de los clientes mediante el Machine Learning

    Introducci贸n

    El marketing de Internet se ha apoderado de las estrategias de marketing tradicionales en el pasado reciente. Las empresas prefieren anunciar sus productos en sitios web y plataformas de redes sociales. Sin embargo, dirigirse a la audiencia adecuada sigue siendo un desaf铆o en el marketing online. Gastar millones para mostrar el anuncio a una audiencia que probablemente no compre sus productos puede ser costoso.

    En este art铆culo, trabajaremos con los datos publicitarios de una agencia de marketing para desarrollar un algoritmo de Machine Learning que predice si un usuario en particular har谩 clic en un anuncio. Los datos constan de 10 variables: ‘Tiempo diario de permanencia en el sitio’, ‘Edad’, ‘Ingresos del 谩rea’, ‘Uso diario de Internet’, ‘L铆nea de tema del anuncio’, ‘Ciudad’, ‘Hombre’, ‘Pa铆s’, Marca de tiempo ‘ y “Se hizo clic en el anuncio”.

    La variable principal que nos interesa es ‘Se hizo clic en el anuncio’. Esta variable puede tener dos resultados posibles: 0 y 1, donde 0 se refiere al caso en el que un usuario no hizo clic en el anuncio, mientras que 1 se refiere al escenario en el que un usuario hace clic en el anuncio.

    Veremos si podemos usar las otras 9 variables para predecir con precisi贸n el valor de la variable ‘Se hizo clic en el anuncio’. Tambi茅n realizaremos un an谩lisis de datos exploratorio para ver c贸mo el ‘Tiempo diario invertido en el sitio’ en combinaci贸n con la ‘L铆nea de tema del anuncio’ afecta la decisi贸n del usuario de hacer clic en el anuncio.

    Importaci贸n de bibliotecas

    Para desarrollar nuestro modelo de predicci贸n, necesitamos importar las bibliotecas de Python necesarias:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    %matplotlib inline
    

    Importar el conjunto de datos

    El conjunto de datos de este art铆culo se puede descargar de este Enlace de Kaggle. Descomprima el archivo zip descargado y coloque el archivo “Advertising.csv” en su unidad local. Este es el archivo que usaremos para entrenar nuestro modelo de Machine Learning.

    Ahora necesitamos cargar los datos:

    data = pd.read_csv('E:/Datasets/advertising.csv')
    

    Veamos las primeras diez l铆neas de nuestro DataFrame:

    data.head(10)
    

    Bas谩ndonos en las primeras l铆neas de la tabla, podemos obtener una visi贸n b谩sica de los datos con los que estamos trabajando. Queremos comprobar cu谩ntos datos tenemos dentro de cada variable.

    data.info()
    

    Salida:

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1000 entries, 0 to 999
    Data columns (total 10 columns):
    Daily Time Spent on Site    1000 non-null float64
    Age                         1000 non-null int64
    Area Income                 1000 non-null float64
    Daily Internet Usage        1000 non-null float64
    Ad Topic Line               1000 non-null object
    City                        1000 non-null object
    Male                        1000 non-null int64
    Country                     1000 non-null object
    Timestamp                   1000 non-null object
    Clicked on Ad               1000 non-null int64
    dtypes: float64(3), int64(3), object(4)
    memory usage: 78.2+ KB
    

    隆Buenas noticias! Todas las variables est谩n completas y no hay valores perdidos dentro de ellas. Cada uno de ellos contiene 1000 elementos y no habr谩 necesidad de preprocesamiento adicional de datos brutos.

    Tambi茅n usaremos el describe funci贸n para obtener informaci贸n sobre los rangos en los que cambian las variables:

    data.describe()
    

    Un dato interesante de la tabla es que el ingreso del 谩rea m谩s peque帽a es $ 13,996.50 y el m谩s alto es $ 79,484.80. Esto significa que los visitantes del sitio son personas que pertenecen a diferentes clases sociales. Tambi茅n se puede concluir que estamos analizando un sitio web popular ya que los usuarios pasan entre 32 y 91 minutos en el sitio web en una sola sesi贸n. 隆Estos son n煤meros realmente grandes!

    Adem谩s, la edad media de un visitante es de 36 a帽os. Vemos que el usuario m谩s joven tiene 19 a帽os y el mayor tiene 61 a帽os. Podemos concluir que el sitio est谩 dirigido a usuarios adultos. Por 煤ltimo, si nos preguntamos si el sitio es visitado m谩s por hombres o por mujeres, podemos ver que la situaci贸n es casi igual (52% a favor de las mujeres).

    Para analizar m谩s a fondo nuestros datos, dibujemos primero un histograma con la estimaci贸n de la densidad del kernel para la variable ‘Edad’.

    from scipy.stats import norm
    sns.distplot(data['Age'], hist=False, color="r", rug=True, fit=norm);
    

    Se puede concluir que la variable ‘Edad’ tiene una distribuci贸n normal de datos. Veremos en algunos de los siguientes art铆culos por qu茅 esto es bueno para un procesamiento de datos eficaz.

    Tracemos una gr谩fica de densidad bidimensional para determinar la interdependencia de dos variables. Veamos c贸mo se vinculan la edad del usuario y el tiempo que pasa en el sitio.

    f, ax = plt.subplots(figsize=(10, 10))
    sns.kdeplot(data.Age, data['Daily Time Spent on Site'], color="b", ax=ax)
    sns.rugplot(data.Age, color="r", ax=ax)
    sns.rugplot(data['Daily Time Spent on Site'], vertical=True, ax=ax)
    

    De la imagen, podemos concluir que los usuarios m谩s j贸venes pasan m谩s tiempo en el sitio. Esto implica que los usuarios de entre 20 y 40 a帽os pueden ser el principal grupo objetivo de la campa帽a de marketing. Hipot茅ticamente, si tenemos un producto destinado a personas de mediana edad, este es el sitio adecuado para la publicidad. Por el contrario, si tenemos un producto destinado a personas mayores de 60 a帽os, ser铆a un error anunciarlo en este sitio.

    Presentaremos otro gr谩fico de densidad y determinaremos la interdependencia del ‘Tiempo diario empleado en el sitio’ y el ‘Uso diario de Internet’.

    f, ax = plt.subplots(figsize=(8, 8))
    cmap = sns.cubehelix_palette(as_cmap=True, start=0, dark=0, light=3, reverse=True)
    sns.kdeplot(data["Daily Time Spent on Site"], data['Daily Internet Usage'],
        cmap=cmap, n_levels=100, shade=True);
    

    De la figura anterior, est谩 claro que los usuarios que pasan m谩s tiempo en Internet tambi茅n pasan m谩s tiempo en el sitio.

    Ahora mostraremos c贸mo visualizar tendencias en los datos usando el scatter_matrix funci贸n. Incluiremos solo variables num茅ricas para realizar an谩lisis.

    from pandas.plotting import scatter_matrix
    scatter_matrix(data[['Daily Time Spent on Site', 'Age','Area Income', 'Daily Internet Usage']],
        alpha=0.3, figsize=(10,10))
    

    El panorama general ofrece una buena perspectiva de las propiedades de los usuarios que hacen clic en los anuncios. Sobre esta base, se pueden realizar una gran cantidad de an谩lisis adicionales. Te los dejamos a ti, intenta encontrar otros datos interesantes a partir de los datos y comp谩rtelo con nosotros en los comentarios.

    Preprocesamiento de datos

    Es posible que haya notado que “L铆nea de tema del anuncio”, “Ciudad” y “Pa铆s” son columnas categ贸ricas. Tracemos todos los valores 煤nicos para estas columnas.

    object_variables = ['Ad Topic Line', 'City', 'Country']
    data[object_variables].describe(include=['O'])
    

    Como podemos ver en la tabla anterior, todos los valores de la columna “L铆nea de tema del anuncio” son 煤nicos, mientras que la columna “Ciudad” contiene 969 valores 煤nicos de 1000. Hay demasiados elementos 煤nicos dentro de estas dos columnas categ贸ricas y es generalmente es dif铆cil realizar una predicci贸n sin la existencia de un patr贸n de datos. Por eso, se omitir谩n de un an谩lisis posterior. La tercera variable categ贸rica, es decir, “Pa铆s”, tiene un elemento 煤nico (Francia) que se repite 9 veces. Adem谩s, podemos determinar los pa铆ses con el mayor n煤mero de visitantes:

    pd.crosstab(index=data['Country'], columns="count").sort_values(['count'], ascending=False).head(20)
    

    La siguiente tabla muestra los 20 pa铆ses m谩s representados en nuestro DataFrame.

    Ya hemos visto que hay 237 pa铆ses 煤nicos diferentes en nuestro conjunto de datos y ning煤n pa铆s es demasiado dominante. Una gran cantidad de elementos 煤nicos no permitir谩n que un modelo de Machine Learning establezca relaciones f谩cilmente valiosas. Por esa raz贸n, esta variable tambi茅n se excluir谩.

    data = data.drop(['Ad Topic Line', 'City', 'Country'], axis=1)
    

    A continuaci贸n, analizaremos la categor铆a ‘Marca de tiempo’. Representa la hora exacta en que un usuario hizo clic en el anuncio. Ampliaremos esta categor铆a a 4 categor铆as nuevas: mes, d铆a del mes, d铆a de la semana y hora. De esta manera, obtendremos nuevas variables que un modelo ML podr谩 procesar y encontrar posibles dependencias y correlaciones. Como hemos creado nuevas variables, excluiremos la variable original “Marca de tiempo” de la tabla. La variable “D铆a de la semana” contiene valores de 0 a 6, donde cada n煤mero representa un d铆a espec铆fico de la semana (de lunes a domingo).

    data['Timestamp'] = pd.to_datetime(data['Timestamp'])
    
    data['Month'] = data['Timestamp'].dt.month
    data['Day of the month'] = data['Timestamp'].dt.day
    data["Day of the week"] = data['Timestamp'].dt.dayofweek
    data['Hour'] = data['Timestamp'].dt.hour
    data = data.drop(['Timestamp'], axis=1)
    
    data.head()
    

    Conjuntos de datos de entrenamiento y prueba

    Una vez que se procesa el conjunto de datos, debemos dividirlo en dos partes: entrenamiento y conjunto de prueba. Importaremos y usaremos el train_test_split funci贸n para eso. Todas las variables excepto “Se hizo clic en el anuncio” ser谩n los valores de entrada X para los modelos ML. La variable ‘Se hizo clic en el anuncio’ se almacenar谩 en yy representar谩 la variable de predicci贸n. Elegimos arbitrariamente asignar el 33% de los datos totales para el conjunto de entrenamiento.

    from sklearn.model_selection import train_test_split
    
    X = data[['Daily Time Spent on Site', 'Age', 'Area Income', 'Daily Internet Usage',
        'Male', 'Month', 'Day of the month' ,'Day of the week']]
    y = data['Clicked on Ad']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
    

    Procedimientos de desarrollo y ajuste de modelos

    En este art铆culo, se desarrollar谩n dos modelos de ML diferentes: un modelo de regresi贸n log铆stica y un modelo de 谩rbol de decisi贸n.

    El modelo de regresi贸n log铆stica es un algoritmo que utiliza una funci贸n log铆stica para modelar variables dependientes binarias. Es una herramienta de an谩lisis predictivo y se utiliza para explicar las relaciones entre m煤ltiples variables. Puede obtener m谩s informaci贸n sobre esta t茅cnica en el siguiente enlace: Regresi贸n log铆stica.

    El 谩rbol de decisiones es una de las t茅cnicas de miner铆a de datos m谩s utilizadas para el an谩lisis y el modelado. Se utiliza para clasificaci贸n, predicci贸n, estimaci贸n, agrupaci贸n, descripci贸n de datos y visualizaci贸n. Las ventajas de los 谩rboles de decisi贸n, en comparaci贸n con otras t茅cnicas de miner铆a de datos, son la simplicidad y la eficiencia de c谩lculo. Puede encontrar algunos antecedentes sobre los 谩rboles de decisiones y c贸mo usarlos con Scikit-Learn aqu铆: 脕rboles de decisiones en Python con Scikit-Learn

    El primer modelo que importaremos ser谩 un modelo de regresi贸n log铆stica. Primero, es necesario cargar el LogisticRegression funci贸n de la sklearn.linear_model biblioteca. Adem谩s, cargaremos el accuracy_score para evaluar los rendimientos de clasificaci贸n del modelo.

    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import accuracy_score
    from sklearn.metrics import confusion_matrix
    

    Los siguientes pasos son la inicializaci贸n del modelo, su entrenamiento y finalmente, hacer predicciones.

    model_1 = LogisticRegression(solver="lbfgs")
    model_1.fit(X_train, y_train)
    predictions_LR = model_1.predict(X_test)
    
    print('Logistic regression accuracy:', accuracy_score(predictions_LR, y_test))
    print('')
    print('Confusion matrix:')
    print(confusion_matrix(y_test,predictions_LR))
    

    Salida:

    Logistic regression accuracy: 0.906060606060606
    
    Confusion matrix:
    [[158   4]
     [ 27 141]]
    

    La precisi贸n del modelo de regresi贸n log铆stica es 0.906 o 90.6%. Como se puede observar, el desempe帽o del modelo tambi茅n est谩 determinado por la matriz de confusi贸n. La condici贸n para usar esta matriz es explotar en un conjunto de datos con valores conocidos verdaderos y falsos. Puede encontrar informaci贸n adicional sobre la matriz de confusi贸n aqu铆: Matriz de confusi贸n.

    Nuestra matriz de confusi贸n nos dice que el n煤mero total de predicciones precisas es 158 + 141 = 299. Por otro lado, el n煤mero de predicciones incorrectas es 27 + 4 = 31. Podemos estar satisfechos con la precisi贸n de predicci贸n de nuestro modelo.

    Ahora importaremos DecisionTreeClassifier de sklearn.tree biblioteca. model_2 se basar谩 en la t茅cnica del 谩rbol de decisi贸n, se entrenar谩 como en el caso anterior y se har谩n las predicciones deseadas.

    from sklearn.tree import DecisionTreeClassifier
    
    model_2 = DecisionTreeClassifier()
    model_2.fit(X_train, y_train)
    predictions_DT = model_2.predict(X_test)
    
    print('Decision tree accuracy:', accuracy_score(predictions_DT, y_test))
    print('')
    print('Confusion matrix:')
    print(confusion_matrix(y_test,predictions_DT))
    

    Salida:

    Decision tree accuracy: 0.9333333333333333
    
    Confusion matrix:
    [[151  11]
     [ 11 157]]
    

    Se puede concluir que el modelo de 脕rbol de Decisi贸n mostr贸 mejores desempe帽os en comparaci贸n con el modelo de Regresi贸n Log铆stica. La matriz de confusi贸n nos muestra que las 308 predicciones se han realizado correctamente y que solo hay 22 predicciones incorrectas. Adem谩s, la precisi贸n del 谩rbol de decisiones es mejor en aproximadamente un 3% en comparaci贸n con el primer modelo de regresi贸n.

    Conclusi贸n

    Los resultados obtenidos mostraron el valor de uso de ambos modelos de Machine Learning. El modelo de 谩rbol de decisi贸n mostr贸 un rendimiento ligeramente mejor que el modelo de regresi贸n log铆stica, pero definitivamente, ambos modelos han demostrado que pueden tener mucho 茅xito en la resoluci贸n de problemas de clasificaci贸n.

    Los resultados de la predicci贸n ciertamente se pueden cambiar con un enfoque diferente al an谩lisis de datos. Te animamos a que hagas tu an谩lisis desde el principio, para encontrar nuevas dependencias entre variables y visualizarlas gr谩ficamente. Despu茅s de eso, cree un nuevo conjunto de entrenamiento y un nuevo conjunto de prueba. Deje que el conjunto de entrenamiento contenga una mayor cantidad de datos que en el art铆culo. Ajuste y eval煤e su modelo. Al final, felic铆tese en un comentario si obtiene mejores actuaciones.

    隆Te deseamos un trabajo m谩gico y exitoso!

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *