Online shopping has become a part of our daily lives, and online stores are continually seeking to improve their sales. One way to achieve this is by using machine learning to predict customers’ purchase intentions. This innovative process can help businesses understand their customers’ behavior and tailor their marketing strategies accordingly.
In this article, we will explore the practical side of purchase intention prediction. Our focus is on developing a classification model that predicts whether a visitor will make a purchase or not. We’ll use Scikit-Learn’s machine learning library to train a Logistic Regression algorithm, and evaluate the model’s performance. Our ultimate goal is to provide insights into the circumstances under which customers make purchase decisions.
Predicting purchase intentions can offer significant benefits to online stores, such as identifying potential customers who are most likely to buy and targeting their marketing efforts accordingly. By understanding the practical application of machine learning for purchase intention prediction, online businesses can gain a competitive edge and increase their revenue.
Also: Sentiment Analysis with Naive Bayes and Logistic Regression in Python
About Modeling Customer Purchase Intentions
Customer purchase intention prediction is the process of using machine learning algorithms to predict the likelihood that a particular customer will make a purchase. This can be useful for various applications, such as identifying potential customers most likely interested in a particular product or service and targeting marketing and sales efforts accordingly.
To make accurate predictions about customer purchase intentions, it is important to have access to high-quality data about the customer, such as their demographic information, purchasing history, and other relevant factors. By analyzing this data and applying appropriate machine learning algorithms, it is possible to identify patterns and trends that can predict the likelihood that a particular customer will make a purchase.
There are many different approaches to customer purchase intention prediction, and the specific methods used can vary depending on the application and the data available. Some common techniques for predicting customer purchase intentions include using regression analysis to model the relationship between purchase intentions and other variables and using classification algorithms to classify customers as likely or unlikely to make a purchase. By using these techniques, it is possible to make more accurate and useful predictions about customer purchase intentions.
Also: Customer Churn Prediction – Understanding Models with Feature Permutation Importance
How Modeling Purchase Intentions can Lead to a Better Customer Understanding
Predicting the purchase intentions of online shoppers can be a step for online stores to understand their customers better. Creating predictive models makes it possible to conclude the factors influencing customers’ buying behavior. At what time of day are our customers most inclined to buy? For which products do customers often abandon the purchase process? Such questions are fascinating for marketing departments. Once understood, they can enable marketers to optimize their customers’ buying experience and achieve a higher conversion rate. In this way, intention prediction can help online stores target customers with the right products at the right time and thus take a step toward marketing automation.
Implementing a Prediction Model for Purchase Intentions with Python
Logistic regression is a widely-used algorithm in machine learning that is particularly useful for solving two-class classification problems. One of the primary benefits of using logistic regression models is that they can help us understand the factors that influence the predictions made by the model. This interpretability is a key advantage of logistic regression, making it a popular choice in many real-world applications.
In the next steps of our analysis, we will develop a two-class classification model that utilizes the logistic regression algorithm to predict the purchase intentions of online shoppers. By analyzing a set of features that are likely to influence a shopper’s decision to purchase, such as product price, customer reviews, and shipping time, we can build a model that accurately predicts the likelihood of a shopper completing a purchase. The logistic regression algorithm will be particularly useful in this case, as it allows us to identify which features are the most significant predictors of purchase intention.
The code is available on the GitHub repository.
Prerequisites
Before starting the coding part, make sure that you have set up your Python 3 environment and required packages. If you don’t have an environment, consider the Anaconda Python environment. To set it up, you can follow the steps in this tutorial. Please ensure to install all required packages:
In addition, we will be using the machine learning library Scikit-learn and Seaborn for visualization. You can install packages using console commands:
- pip install <package name>
- conda install <package name> (if you are using the anaconda packet manager)
About the Dataset
In this tutorial, we will be working with a public dataset from Kaggle.com. The data consists of 18 feature vectors belonging to 12,330 shopping sessions. You can download the data via the link below:
The data stems from a big shopping website that has recorded the session for one year. Each record belongs to a separate shopping session and user. Thus, there is no bias in the data, such as a specific period, user, or day to avoid.
Below you will find an overview of the features contained in the data (Source: Kaggle.com):
- “Administrative,” “Administrative Duration,” “Informational,” “Informational Duration,” “Product Related,” and “Product-Related Duration” represent the number of different types of pages visited by the visitor in that session and the total time spent in each of these page categories.
- The “Bounce Rate,” “Exit Rate,” and “Page Value” features represent the metrics measured by “Google Analytics” for each page on the e-commerce site.
- The “Special Day” feature indicates the closeness of the site visiting time to a specific special day (e.g., Mother’s Day, Valentine’s Day)
- The dataset also includes an operating system, browser, region, traffic type, visitor type as returning or new visitor, a Boolean value indicating whether the date of the visit is a weekend, and the month of the year.
The ‘Revenue’ attribute is the class label, called the “prediction label.”
Step #1 Load the Data
We begin by loading the shopping dataset into a Pandas DataFrame. Afterward, we will print a brief overview of the data.
import calendar import math import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib import cm import seaborn as sns from sklearn.model_selection import train_test_split as train_test_split from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import confusion_matrix, roc_curve, auc, roc_auc_score from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # Load train data filepath = "data/classification-online-shopping/" df_shopping_base = pd.read_csv(filepath + 'online_shoppers_intention.csv') df_shopping_base
Administrative Administrative_Duration Informational Informational_Duration ProductRelated ProductRelated_Duration BounceRates ExitRates PageValues SpecialDay Month OperatingSystems Browser Region TrafficType VisitorType Weekend Revenue 0 0.0 0.0 0.0 0.0 1.0 0.000000 0.20 0.20 0.0 0.0 Feb 1 1 1 1 Returning_Visitor False False 1 0.0 0.0 0.0 0.0 2.0 64.000000 0.00 0.10 0.0 0.0 Feb 2 2 1 2 Returning_Visitor False False 2 0.0 -1.0 0.0 -1.0 1.0 -1.000000 0.20 0.20 0.0 0.0 Feb 4 1 9 3 Returning_Visitor False False 3 0.0 0.0 0.0 0.0 2.0 2.666667 0.05 0.14 0.0 0.0 Feb 3 2 2 4 Returning_Visitor False False 4 0.0 0.0 0.0 0.0 10.0 627.500000 0.02 0.05 0.0 0.0 Feb 3 3 1 4 Returning_Visitor True False
Step #2 Cleaning the Data
Before we can start training our prediction model, we’ll do some cleanups (handling missing data, data type conversions, treating outliers, and so on).
# Replacing visitor_type to int print(df_shopping_base['VisitorType'].unique()) df_shop = df_shopping_base.replace({'VisitorType' : { 'New_Visitor' : 0, 'Returning_Visitor' : 1, 'Other' : 2 }}) # Coverting month column to numeric numeric values monthlist = df_shop['Month'].replace('June', 'Jun') mlist = [] m = np.array(monthlist) for mi in m: a = list(calendar.month_abbr).index(mi) mlist.append(a) df_shop['Month'] = mlist # Delete records with NAs df_shop.dropna(inplace=True) df_shop.head()
['Returning_Visitor' 'New_Visitor' 'Other'] Administrative Administrative_Duration Informational Informational_Duration ProductRelated ProductRelated_Duration BounceRates ExitRates PageValues SpecialDay Month OperatingSystems Browser Region TrafficType VisitorType Weekend Revenue 0 0.0 0.0 0.0 0.0 1.0 0.000000 0.20 0.20 0.0 0.0 2 1 1 1 1 1 False False 1 0.0 0.0 0.0 0.0 2.0 64.000000 0.00 0.10 0.0 0.0 2 2 2 1 2 1 False False 2 0.0 -1.0 0.0 -1.0 1.0 -1.000000 0.20 0.20 0.0 0.0 2 4 1 9 3 1 False False 3 0.0 0.0 0.0 0.0 2.0 2.666667 0.05 0.14 0.0 0.0 2 3 2 2 4 1 False False 4 0.0 0.0 0.0 0.0 10.0 627.50
Step #3 Exploring the Data
Next, we will familiarize ourselves with the data.
3.1 Class Labels
First, we take a look at the class labels to see how balanced they are. If class labels are balanced, it means that each class has an approximately equal number of examples in the training data. This is important because it helps ensure that the trained model will be able to make accurate predictions on new data. If the class labels are unbalanced, then the model is more likely to be biased towards the more common classes, which can lead to poor performance on less common classes. Additionally, unbalanced class labels can make it more difficult to evaluate the performance of a machine learning model, because the model’s accuracy may not be an accurate reflection of its ability to generalize to new data.
# Checking the balance of prediction labels plt.figure(figsize=(16,2)) fig = sns.countplot(y="Revenue", data=df_shop, palette="muted") plt.show()
Our class labels are somewhat imbalanced, as there are much more cases in the data with a prediction “false.” The reason is that more visitors won’t buy anything. Imbalanced data can affect the performance of classification models. But now that we are aware of the imbalance in our data, we can choose appropriate evaluation metrics later.
3.2 Feature Correlation
When developing classification models, not all features are usually equally useful. It is important that features are not correlated because correlated features can provide redundant information to a machine learning model. If two or more features are highly correlated, they may convey the same information to the model, which can make the model’s predictions less accurate. Additionally, having correlated features can make it more difficult to interpret the model’s predictions, because it is not clear which features are actually contributing to the model’s decision-making process.
Let’s check which of our features are correlated. First, we will create a series of Whiskerplots for the features in our dataset. They help us identify potential outliers and get a better idea of how the data looks.
# Whiskerplots c= 'black' df_shop.drop('Revenue', axis=1).plot(kind='box', subplots=True, layout=(4,4), sharex=False, sharey=False, figsize=(14,14), title='Whister plot for input variables') plt.show()
The Whiskerplots show that there are a couple of outliers in the data. However, the outliers are not significant enough to worry about them.
Histograms are another way of visualizing the distribution of numerical or categorical variables. They give a rough sense of the density of the distribution. To create the histograms, run the code below.
# # Create pariplots for feature columns separated by prediction label value df_plot = df_shop.copy() # class_columnname = 'Revenue' sns.pairplot(df_plot, hue="Revenue", height=2.5)
Finally, we create a correlation matrix and visualize it as a heat map. The matrix provides a quick overview of which features are correlated and not.
# Feature correlation plt.figure(figsize=(15,4)) f_cor = df_shop.corr() sns.heatmap(f_cor, cmap="Blues_r")
The correlation plot shows that some features are highly correlated. The following features are highly correlated:
- ProductRelated and ProductRelated_Duration.
- BounceRates and ExitRates
plt.figure(figsize=(8,5)) sns.scatterplot(x= 'BounceRates',y='ExitRates',data=df_shop,hue='Revenue') plt.title('Bounce Rate vs. Exit Rate', fontweight='bold', fontsize=15) plt.show()
plt.figure(figsize=(8,5)) sns.scatterplot(x= 'ProductRelated',y='ProductRelated_Duration',data=df_shop,hue='Revenue') plt.title('Bounce Rate vs. Exit Rate', fontweight='bold', fontsize=15) plt.show()
When we start to train our model, we will only use one of the features from the two pairs.
Step #4 Data Preprocessing
Now that we are familiar with the data, we can prepare the data to train the purchase intention classification model. Firstly, we will include only selecting the features from the original shopping dataset. Second, we will split the data into two separate datasets: train and test with a ratio of 70%. Train X_train and X_test datasets contain the features, while y_train and y_test include the respective prediction labels. Thirdly, we will use the MinMaxScaler to scale the numeric features between 0 and 1. Scaling makes it easier for the algorithm to interpret the data and improve classification performance.
# Separate labels from training data features = ['Administrative', 'Administrative_Duration', 'Informational', 'Informational_Duration', 'ProductRelated', 'BounceRates', 'PageValues', 'Month', 'Region', 'TrafficType', 'VisitorType'] X = df_shop[features] #Training data y = df_shop['Revenue'] #Prediction label # Split the data into x_train and y_train data sets X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=0) # Scale the numeric values scaler = MinMaxScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)
Step #5 Train a Purchase Intention Classifier
Next, it is time to train our prediction model. Various classification algorithms could be used to solve this problem, for example, decision trees, random forests, neural networks, or support-vector machines. We will use the logistic regression algorithm, a common choice for simple two-class prediction problems.
We start the training process using the “fit” method of the logistic regression algorithm.
# Training a classification model using logistic regression logreg = LogisticRegression(solver='lbfgs') score = logreg.fit(X_train, y_train).decision_function(X_test)
The trained model returns a training score showing how well the model has performed on the test dataset.
Step #6 Evaluate Model Performance
Finally, we will evaluate the performance of our classification model. For this purpose, we first create a confusion matrix. Then we calculate and compare different error metrics.
6.1 Confusion Matrix
The confusion matrix is a holistic and clean way to illustrate the results of a classification model. It differentiates between predicted labels and actual labels. For a binary classification model, the matrix comprises 2×2 quadrants that show the number of cases in each quadrant.
# create a confusion matrix y_pred = logreg.predict(X_test) cnf_matrix = confusion_matrix(y_test, y_pred) # create heatmap %matplotlib inline class_names=[False, True] # name of classes fig, ax = plt.subplots(figsize=(7, 6)) tick_marks = np.arange(len(class_names)) plt.xticks(tick_marks, class_names) plt.yticks(tick_marks, class_names) sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu", fmt='g') ax.xaxis.set_label_position("top") plt.tight_layout() plt.title('Confusion matrix') plt.ylabel('Actual label') plt.xlabel('Predicted label')
In the upper left (0,0), we see that the model correctly predicted for 3102 online shopping sessions that these sessions will not lead to a purchase (True negatives). In 30 cases, the model was wrong and expected that there would be a purchase, but there wasn’t (False positives). For 412 buyers, the model predicted that they would not buy anything, even though they were buying something (False negatives). In the lower right corner, we see that only in 151 cases could buyers be correctly identified as such (True positives).
6.2 Performance Metrics for Classification Models
Next, let’s take a brief look at the performance metrics. Four standard metrics that measure the performance of classification models are Accuracy, Precision, Recall, and f1_score.
print('Accuracy: {:.2f}'.format(accuracy_score(y_test, y_pred))) print('Precision: {:.2f}'.format(precision_score(y_test, y_pred))) print('Recall: {:.2f}'.format(recall_score(y_test, y_pred))) print('f1_score: {:.2f}'.format(f1_score(y_test, y_pred)))
Accuracy
The accuracy of the test set shows that 88% of the online shopper sessions were correctly classified. However, our data is imbalanced. That is to say, most labels have the value “False,” and only a few target labels are “True.” Consequently, we must ensure that our model does not classify all online shoppers as “non-buyers” (label: False) but also correctly predicts the buyers (label: True).
Precision
We calculate the precision as the number of True Positives divided by the number of True Positives and False Positives. Similar to Accuracy, Precision puts too much emphasis on the True negatives. Therefore, it does not say much about our model. The precision score for our model is just a little lower than the accuracy (83%).
Recall
We calculate the Recall by dividing the number of True Positives by the sum of the True Positives and the False Negatives. The Recall of our model is 27%, which is significantly below accuracy and precision. In our case, the precision call is more meaningful than precision and Recall because it puts a higher penalty on the low number of True positives.
F1-Score
The formula for the F1-Score is 2*((precision*recall)/(precision+recall)). Because the formula includes the Recall, the F-1 Score of our model is only 41%. Imagine we want to optimize our classification model further. In this case, we should look out for both F1-Score and Recall.
6.3 Interpretation
Metrics for classification models can be misleading. We should thus choose them carefully. Depending on which use case we are dealing with, False-negative and False-positive predictions can have different costs. Therefore, model evaluation is not always about exactness (precision and accuracy). Instead, the choice of performance metrics depends on what we want to achieve.
The challenge for our model is to correctly classify the smaller group of buyers (True positives). So, optimizing our model would be about achieving a balance between good accuracy without significantly lowering the F1_Score and Recall.
Step #7 Insights on Customer Purchase Intentions
Finally, we will use permutation feature importance to gain additional insights into our prediction model’s features. Permutation Feature Importance is a technique that measures the influence of features on the predictions of our model. Features with a high positive or negative score substantially impact predicting the prediction label. In contrast, features with scores close to zero play a lesser role in the predictions.
# Load the data r = permutation_importance(model_lgr, X_test, y_test, n_repeats=30, random_state=0) # Plot the barchart data_im = pd.DataFrame(r.importances_mean, columns=['feature_permuation_score']) data_im['feature_names'] = X.columns data_im = data_im.sort_values('feature_permuation_score', ascending=False) fig, ax = plt.subplots(figsize=(16, 5)) sns.barplot(y=data_im['feature_names'], x="feature_permuation_score", data=data_im, palette='nipy_spectral') ax.set_title("Logistic Regression Feature Importances")
We can see that the three features with the highest impact are PageValues, BounceRates and Administration_Duration.
- The higher the page’s value, the higher the customer’s chance to make a purchase.
- The higher the average bounce rate that the customer visits, the higher the chance the customer makes a purchase.
- In contrast, the more time a customer spends on administrative settings, the lower the chance the customer completes the purchase.
These were just a few sample findings. There is much more to explore in the data, and deeper analysis can uncover much more about the customers’ buying decisions.
Summary
This article has presented customer purchase prediction as an interesting use case for machine learning in e-commerce. After discussing the use case, we have developed a classification model that predicts the purchase intentions of online shoppers. You have learned to preprocess the data, train a logistic regression model and evaluate the model’s performance. Classifying purchase intentions can help online shops understand their customers better and automate certain online marketing activities. The previous section showed how marketers could use this to gain further insights into their customers’ behavior.
Thanks for reading and if you have any questions, let me know in the comments.
Sources and Further Reading
I hope this article was helpful. If you have any remarks or questions, please write them in the comments.
The links above to Amazon are affiliate links. By buying through these links, you support the Relataly.com blog and help to cover the hosting costs. Using the links does not affect the price.