機械学習による顧客広告クリックの予測

インターネット・マーケティングは、近年、従来のマーケティング戦略に取って代わられている。企業は、ウェブサイトやソーシャル・メディア・プラットフォームで自社の製品を宣伝することを好む。しかし,オンラインマーケ ティングでは,適切な視聴者をターゲットにすること が依然として課題である。製品を購入する可能性のない聴衆に広告を表示するために何百万も費やすことは、コスト高になりかねません。

今回は、あるマーケティング会社の広告データを使って、特定のユーザーが広告をクリックするかどうかを予測する機械学習アルゴリズムを開発します。データは、「サイト滞在時間」「年齢」「地域収入」「日々のインターネット利用」「広告トピックライン」「都市」「男性」「国」「タイムスタンプ」「広告クリック」の10変数から構成されています。

我々が注目する主な変数は、’Clicked on Ad’です。この変数は、2つの可能な結果を持つことができます。0はユーザーが広告をクリックしなかったケースを指し、1はユーザーが広告をクリックしたシナリオを指します。

我々は、他の9つの変数を使って、’Clicked on Ad’変数の値を正確に予測できるかどうかを見ます。また、’Daily Time Spent on Site’ と ‘Ad Topic Line’ の組み合わせが、ユーザーの広告クリックの意思決定にどのように影響するか、いくつかの探索的データ分析を行います。

ライブラリのインポート

予測モデルを開発するために、必要なPythonライブラリをインポートする必要があります。

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


%matplotlib inline


データセットのインポート

この記事のデータセットは、このKaggleのリンクからダウンロードすることができます。ダウンロードしたzipファイルを解凍し、「advertising.csv」ファイルをローカルドライブに置いてください。これは、機械学習モデルを学習するために使用するファイルです。

さて、データをロードする必要があります。

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


DataFrameの最初の10行を見てみましょう。

data.head(10)


テーブルの最初の行に基づいて、私たちが扱っているデータについての基本的な洞察を得ることができます。各変数の中にどれだけのデータがあるのかを確認したいと思います。

data.info()


出力

<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


良いニュースです。すべての変数が完全で、それらの中に欠損値もありません。それぞれの変数には1000個の要素があり、生データに追加の前処理をする必要はありません。

また、変数が変化する範囲についての洞察を得るために describe 関数を使用する予定です。

data.describe()


この表から得られる興味深い事実は、最小の地域所得が$13,996.50で、最大の地域所得が$79,484.80であるということです。これは、サイト訪問者がさまざまな社会階層に属する人々であることを意味します。また、ユーザーが1回のセッションで32分から91分もウェブサイトを利用することから、私たちは人気のあるウェブサイトを分析していると結論付けることができます。これは非常に大きな数字です。

さらに、訪問者の平均年齢は36歳です。最年少は19歳で、最年長は61歳です。このサイトは、成人ユーザーをターゲットにしていると結論づけることができます。最後に、このサイトは男性と女性のどちらに多く訪問されているかというと、ほぼ同じ状況であることがわかります(52%が女性を支持)。

データをさらに分析するために、まず「年齢」変数についてカーネル密度推定でヒストグラムをプロットしてみましょう。

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


これは、変数’Age’はデータの正規分布を持っていると結論づけることができます。なぜこれが効果的なデータ処理に良いのか、次のいくつかの記事で見ていきましょう。

2つの変数の相互依存性を決定するために、2次元密度プロットをプロットしてみましょう。ユーザーの年齢とサイトでの滞在時間がどのようにリンクしているかを見てみましょう。

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)


この図から、若いユーザーほどサイトでの滞在時間が長いと結論付けることができます。これは、20歳から40歳のユーザーをマーケティングキャンペーンのメインターゲットにできることを示唆しています。仮に、中高年向けの製品がある場合、このサイトは広告に適しています。逆に、60歳以上を対象とした製品があれば、このサイトに広告を出すのは間違いでしょう。

もう一つの密度グラフを紹介し、「1日のサイト滞在時間」と「1日のインターネット利用時間」の相互依存性を判断することにする。

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);


上の図から、インターネット利用時間が長いユーザーは、サイト利用時間も長いことがわかります。

それでは、scatter_matrix関数を用いて、データの傾向を可視化する方法を紹介します。ここでは、分析を行うために数値の変数のみを含めることにします。

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))


全体像を見ると、広告をクリックしたユーザーの特性がよくわかる。これをもとに、さらに多くの分析が可能です。このデータから他の興味深い事実を見つけ、コメントで私たちと共有してみてください。

データ前処理

Ad Topic Line”, “City”, “Country “がカテゴリーカラムであることにお気づきでしょうか。これらのカラムのユニークな値をすべてプロットしてみましょう。

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


上の表からわかるように、「Ad Topic Line」列の値はすべて一意であり、「City」列は1000個中969個の一意な値を含んでいます。この2つのカテゴリーカラムにはユニークな要素が多すぎるため、一般的にデータパターンが存在しないと予測を行うことは困難です。そのため、それらはさらなる分析から省かれます。3番目のカテゴリカル変数、すなわち「国」は、9回繰り返されるユニークな要素(フランス)を持っています。さらに、訪問者の数が最も多い国を決定することができます。

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


以下の表は、DataFrameで最も多く表示されている20カ国を表しています。

私たちはすでに、データセットには237の異なるユニークな国があり、単一の国が支配的すぎるということはないことを見てきました。多くのユニークな要素は、機械学習モデルが簡単に価値ある関係を確立することを許しません。そのため、この変数も除外されます。

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


次に、「Timestamp」カテゴリを分析します。これは、ユーザーが広告をクリックした正確な時刻を表します。このカテゴリを、月、日、曜日、時間の4つの新しいカテゴリに拡張します。このようにして、MLモデルが処理し、可能な依存性と相関性を見つけることができる新しい変数を得ることができます。我々は新しい変数を作成したので、元の変数 “Timestamp” を表から除外します。Day of the week” 変数は、0から6までの値を含み、各数値は特定の曜日(月曜日から日曜日まで)を表します。

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()


学習用データセットとテスト用データセット

データセットが処理されたら、それをトレーニングセットとテストセットの2つに分割する必要があります。そのために、train_test_split関数をインポートして使用します。Clicked on Ad’を除く全ての変数がMLモデルの入力値 X となる。変数 ‘Clicked on Ad’ は y に格納され、予測変数を表します。学習セットには全データの33%を任意に割り当てることにした。

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)


モデル開発とフィッティングの手順

この記事では、ロジスティック回帰モデルと決定木モデルの2種類のMLモデルを開発する。

ロジスティック回帰モデルは、2値の従属変数をモデル化するためにロジスティック関数を使用するアルゴリズムである。これは予測分析のためのツールで、複数の変数間の関係を説明するために使用されます。この手法については、以下のリンクで詳しく説明されています。ロジスティック回帰

決定木は、分析およびモデリングのために最も一般的に使用されるデータマイニング技術の1つです。分類、予測、推定、クラスタリング、データ記述、可視化などに使用されます。他のデータマイニング手法と比較した場合の決定木の利点は、単純さと計算の効率性である。決定木の背景とScikit-Learnでの使用方法については、こちらをご覧ください。PythonでScikit-Learnを使った決定木の使い方

最初にインポートするモデルは、ロジスティック回帰モデルです。まず、 sklearn.linear_model ライブラリから LogisticRegression 関数をロードする必要がある。また、モデルの分類性能を評価するために、accuracy_score をロードします。

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


次のステップは、モデルの初期化、学習、そして最終的に予測を行います。

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))


出力。

Logistic regression accuracy: 0.906060606060606


Confusion matrix:
[[158   4]
 [ 27 141]]


ロジスティック回帰モデルの精度は、0.906または90.6%です。観察されるように、モデルの性能は混同行列によっても決定されます。この行列を使用する条件は、既知の真値と偽値を持つデータ集合で利用されることです。混同行列に関する追加情報はこちらでご覧になれます。混同行列

この混同行列から、正確な予測の総数は158 + 141 = 299であることがわかります。一方、不正確な予測の数は「27 + 4 = 31」です。私たちのモデルの予測精度に満足することができます。

次に、sklearn.tree ライブラリから DecisionTreeClassifier をインポートする。model_2` は決定木に基づくモデルとなり、先程と同様に学習され、目的の予測がなされます。

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))


出力

Decision tree accuracy: 0.9333333333333333


Confusion matrix:
[[151  11]
 [ 11 157]]


決定木モデルは、ロジスティック回帰モデルと比較して、より良い性能を示したと結論付けることができます。混同行列は、308の予測が正しく行われ、22の不正確な予測しかないことを示しています。さらに、決定木の精度は、最初の回帰モデルと比較して、約3%優れています。

結論

得られた結果は、両方の機械学習モデルの利用価値を示している。決定木モデルは、ロジスティック回帰モデルよりもわずかに良い性能を示したが、間違いなく、両モデルとも分類問題の解決に非常に成功することが示された。

予測結果は、データ解析のアプローチの違いによって確実に変化します。是非、最初から分析を行い、変数間の新しい依存関係を見つけ、それをグラフで表示することをお勧めします。その後、新しいトレーニングセットと新しいテストセットを作成します。トレーニングセットには、記事中よりも多くのデータを含ませてください。モデルを適合させ、評価する。最後に、パフォーマンスが向上したら、コメントで自分を褒めてあげてください。

私たちは、あなたの成功や魔法のような仕事を祈っています。

</class

タイトルとURLをコピーしました