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

P

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!

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad