ウィキペディアでは、ブラックフライデーとは、アメリカ合衆国で11月の第4木曜日に行われる感謝祭の翌日の金曜日の非公式な呼び名であると定義している。[ブラックフライデーは)アメリカのクリスマス商戦の始まりと見なされている(…)。
この記事では、ブラックフライデー・ショッピングのデータセットから、さまざまな傾向を探ってみる。ブラックフライデーに買い物をするのはどのような性別の人が多いのか?人々の職業は売り上げに影響を与えるか?どの年齢層が最もお金を使うのか?
最終的には、性別、年齢、職業などの特徴に応じて、ブラックフライデーに消費しそうな金額を予測するシンプルな機械学習アルゴリズムを作成する予定です。
この記事で使用するデータセットには、小売店で行われたブラックフライデーに関する55万件の観測結果が含まれています。このファイルは以下のKaggleのリンクからダウンロードすることができます。ブラックフライデーのケーススタディ
データ分析
まず、このセクションで必要となるライブラリのインポートを行います。
import pandas as pd
import numpy as np
import matplotlib as pyplot
%matplotlib inline
import seaborn as sns
次に、データをインポートする必要があります。
コード偽
データの基本的な情報を見てみましょう。
data = pd.read_csv('E:/Datasets/BlackFriday.csv')
出力されます。
data.info()
データを見ると、このセットは12種類のパラメータを持っていると結論付けることができます。7つの数値(整数と浮動小数点)、5つのオブジェクト変数です。さらに、このデータセットには2つの短いタイプの変数があります: Product_Category_2
とProduct_Category_3
です。この問題をどのように処理するかは、後ほど説明します。
さて、データの全体像がわかったところで、最初の5人の顧客(DataFrameの最初の5行)についての情報を表示してみましょう。
<class 'pandas.core.frame.dataframe'=""
RangeIndex: 537577 entries, 0 to 537576
Data columns (total 12 columns):
User_ID 537577 non-null int64
Product_ID 537577 non-null object
Gender 537577 non-null object
Age 537577 non-null object
Occupation 537577 non-null int64
City_Category 537577 non-null object
Stay_In_Current_City_Years 537577 non-null object
Marital_Status 537577 non-null int64
Product_Category_1 537577 non-null int64
Product_Category_2 370591 non-null float64
Product_Category_3 164278 non-null float64
Purchase 537577 non-null int64
dtypes: float64(2), int64(5), object(5)
memory usage: 49.2+ MB
この研究の最初の質問ですが、男性に比べて女性客の優位性が高いというのは本当でしょうか?ここでは、seaborn
ライブラリとcountplot
関数を使って、男性客と女性客の人数をプロットすることにします。
data.head()
わあ!すごい このグラフを見ると、男性客の方が女性客よりも3倍近く多いことがわかりますね なぜでしょうか?もしかしたら、男性客の方が、女性客に何か買ってあげようと思うかもしれませんね。
性別」カテゴリーをもう少し詳しく見てみましょう。今度は、性別変数の分布を見たいのですが、年齢
カテゴリを考慮します。再び countplot
関数が使用されますが、今度は hue
パラメータが定義されています。
sns.countplot(data['Gender'])
上の図から、男女とも26歳から35歳の年齢層に最も多くの顧客が属していると簡単に結論づけることができます。若年層と高齢者層は、ブラックフライデーに参加する人が圧倒的に少ないことがわかります。この結果から、小売店では20代後半から30代前半をターゲットにした商品を多く販売することが望ましいと考えられます。利益を上げるためには、30代前後をターゲットにした商品の数を増やし、年配者や若年層をターゲットにした商品の数を減らせばよいのです。
次に、describe関数を使って、平均値、最小値、最大値、標準偏差などの観点から、カテゴリーを分析する…
sns.countplot(data['Age'], hue=data['Gender'])
さらに、以下では User_ID
カラムを nunique
メソッドで解析しています。この結果から、この小売店では、ブラックフライデー期間中に、5,891人の異なる顧客が、この店で何かを購入したと結論づけることができます。また、「Product_ID」カラムからは、3,623種類の商品が販売されたという情報を抽出することができます。
data.describe()
出力
data['User_ID'].nunique()
5891
出力
data['User_ID'].nunique()
次に、Occupation
カテゴリを調べてみましょう。職業`の番号は、各顧客の職業の種類を示すID番号です。約20種類の職業が存在することがわかります。しかし、厳密な分析を行ってみましょう。まず、1つのカラムからユニークな要素をすべて抽出する(異なる職業をすべて抽出する)関数を作成する必要があります。
そのために、Pythonライブラリ numpy
の unique
関数を使用します。
3623
def unique(column):
x = np.array(column)
print(np.unique(x))
出力
print("The unique ID numbers of customers occupations:")
unique(data['Occupation'])
見ての通り、21の異なる職業IDが買い物中に登録されています。
例えば、1番はエンジニア、2番は医者、3番は芸術家といった具合に、職業番号で顧客の職業を表すことができる。
また、(職業IDでグループ化された)各消費者グループが、どれだけのお金を使ったかを見るのも興味深いでしょう。そのためには、forループを使って、個々の職業IDごとに使われたお金を合計すればよいのです。
The unique ID numbers of costumers occupations:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
出力
occupations_id = list(range(0, 21))
spent_money = []
for oid in occupations_id:
spent_money.append(data[data['Occupation'] == oid]['Purchase'].sum())
spent_money
0 から 20 までの職業 ID に対して、合計した金額のドルを含むリスト spent_money
を作成しました。この結果を見ると、何億ドルも費やされていることが不思議に思えるかもしれません。しかし、我々のデータセットには500,000のオブザベーションが含まれているので、これは実際に非常にありそうなことであることを心に留めておいてください。あるいは、その小売店は実際には大きなショッピングモールなのかもしれません。また、各職業で使われた金額が膨大なのは、このデータが1回だけでなく、複数のブラックフライデーの夜の取引を表している可能性があります。
さて、これで職業別の支出額に関する情報が得られました。では、この情報をグラフにしてみましょう。
[625814811,
414552829,
233275393,
160428450,
657530393,
112525355,
185065697,
549282744,
14594599,
53619309,
114273954,
105437359,
300672105,
71135744,
255594745,
116540026,
234442330,
387240355,
60249706,
73115489,
292276985]
職業が0と4の人が、ブラックフライデーで最もお金を使うことがよくわかります。一方、ID18,19、特にID8の職業に属する人々は、最も少ない金額を消費しています。これは、これらのグループが最も貧しい人々、あるいは逆に、そのような小売店での買い物を好まない最も裕福な人々であることを意味することができます。この質問に答えるには情報が不足しているので、ここではOccupation
カテゴリの分析に止めます。
次は City_Category
変数です。このカテゴリは、顧客の出身都市に関する情報を与えてくれます。まず、何種類の都市があるか見てみましょう。
import matplotlib.pyplot as plt; plt.rcdefaults()
import matplotlib.pyplot as plt
objects = ('0', '1', '2', '3', '4', '5','6','7','8','9','10', '11','12', '13', '14', '15', '16', '17', '18', '19', '20')
y_pos = np.arange(len(objects))
plt.bar(y_pos, spent_money, align='center', alpha=0.5)
plt.xticks(y_pos, objects)
plt.ylabel('Money spent')
plt.title('Occupation ID')
plt.show()
出力してみましょう。
data['City_Category'].nunique()
ここで、各都市のお客様の比率をパーセンテージで見てみると面白いでしょう。この情報は、色付きの円グラフの形で表示されます。これは5行のコードで実現できます。Almigh
MLアルゴリズムのためのデータ前処理
これまで,生データを分析するための基本的な手法をいくつか取り上げてきました.機械学習アルゴリズムを適用する前に、データセットを機械学習アルゴリズムが動作する特定の形式に変換する必要があります。学習アルゴリズムのタスクは、顧客情報を入力として、変数「Purchase」の値を予測することである。
最初にしなければならないことは、Product_Category_2
と Product_Category_3
の列のデータの欠損を処理することです。Product_Category_3内のデータは30%しかなく、
Product_Category_2内のデータは69%しかありません。30%の実データは少ない比率なので、このカテゴリ内の欠損値を既存の値の平均値で埋めることができますが、それは70%のデータが人工的であることを意味し、将来の機械学習モデルを台無しにしてしまう可能性があります。この問題に対する最良の代替案は、この列を今後の分析から除外することです。そのためには、
drop`関数を使用します。
3
Product_Category_2` 列は、約30%の欠損データを持っています。ここで、欠損値を埋めて、この列を機械学習モデルの適合に使用することは理にかなっています。我々は、この列の既存の値の平均値を欠損フィールドに挿入することによって、この問題を解決します。
explode = (0.1, 0, 0)
fig1, ax1 = plt.subplots(figsize=(11,6))
ax1.pie(data['City_Category'].value_counts(), explode=explode, labels=data['City_Category'].unique(), autopct='%1.1f%%')
plt.legend()
plt.show()
それでは、もう一度データ・フレームをチェックしてみましょう。
data = data.drop(['Product_Category_3'], axis=1)
出力
data['Product_Category_2'].fillna((data['Product_Category_2'].mean()), inplace=True)
欠損値の問題は解決されました。次に、予測に役立たない列を削除します。
User_ID` は各顧客に自動的に割り当てられる番号であり、予測には役に立ちません。
Product_ID` カラムは、購入した製品に関する情報を含んでいます。これは顧客の特徴ではありません。したがって、これも削除します。
data.info()
出力します。
<class 'pandas.core.frame.dataframe'=""
RangeIndex: 537577 entries, 0 to 537576
Data columns (total 11 columns):
User_ID 537577 non-null int64
Product_ID 537577 non-null object
Gender 537577 non-null object
Age 537577 non-null object
Occupation 537577 non-null int64
City_Category 537577 non-null object
Stay_In_Current_City_Years 537577 non-null object
Marital_Status 537577 non-null int64
Product_Category_1 537577 non-null int64
Product_Category_2 537577 non-null float64
Purchase 537577 non-null int64
dtypes: float64(1), int64(5), object(5)
memory usage: 45.1+ MB
予測したい変数(Purchase
列)と機械学習モデルの訓練に使用する8つの変数です。
情報表からわかるように、我々は4つのカテゴリカルな列を扱っています。しかし、基本的な機械学習モデルは、数値を処理することができます。そのため、カテゴリカラムを数値に変換する必要がある。
Pythonの関数 get_dummies
を使えば、カテゴリ値を一発符号化されたベクトルに変換することができます。どのように動作するのでしょうか?データセットには3つの都市があります。例えば、ある顧客が都市Bの出身であるとします。get_dummies関数は、そのレコードのワンホットエンコーディングされたベクトルを返します。
[0 1 0]. 都市 A の顧客は
[1 0 0]で、都市 C の顧客は
[0 0 1]` です。つまり、都市ごとに新しい列が作成され、その顧客がその都市に属している行を除いて、すべて 0 で埋められます。そのような行には1が入る。
以下のスクリプトは、Gender
, Age
, City
, Stay_In_Current_City_Years
カラムに対してワンホットエンコードされたベクトルを生成する。
data = data.drop(['User_ID','Product_ID'], axis=1)
data.info()
以下のスクリーンショットでは、新しく作成されたダミーカラムが表示されています。見ての通り、すべてのカテゴリ変数が数値に変換されています。同様に、男性の顧客であれば、’M’ というカラムは 1 になり、’F’ というカラムは 0 になります。
これで、機械学習モデルの学習に簡単に利用できるデータが揃った。
支出額の予測
この記事では、最も単純な機械学習モデルの1つである線形回帰モデルを用いて、ブラックフライデーに顧客が費やした金額を予測することにする。
線形回帰は、教師あり学習の非常にシンプルな手法であり、定量的な反応を予測するのに有効なツールです。基本的な情報はこちらで確認できます。Pythonの線形回帰
このモデルは、多くの教師あり機械学習アルゴリズムと同様に、入力特徴量に基づいて予測を行います。予測された出力値は望ましい出力との比較に使用され、誤差が計算される。誤差信号はモデルを通じて伝搬され、誤差を最小化するようにモデルのパラメータが更新される。最後に、誤差が十分に小さい場合、モデルは完全に学習されたとみなされる。これは非常に基本的な説明であり、今後の記事でこれらのプロセスすべてを詳細に分析する予定です。
理論はもういいとして、実際のMLシステムを作ってみましょう。まず,モデルの入力と出力のベクトルを作成する必要があります.
<class 'pandas.core.frame.dataframe'=""
RangeIndex: 537577 entries, 0 to 537576
Data columns (total 9 columns):
Gender 537577 non-null object
Age 537577 non-null object
Occupation 537577 non-null int64
City_Category 537577 non-null object
Stay_In_Current_City_Years 537577 non-null object
Marital_Status 537577 non-null int64
Product_Category_1 537577 non-null int64
Product_Category_2 537577 non-null float64
Purchase 537577 non-null int64
dtypes: float64(1), int64(4), object(4)
memory usage: 36.9+ MB
次に、すべてのデータをトレーニングセットとテストセットの2つに分割するために、 train_test_split
関数をインポートします。トレーニングセットはモデルの適合に使用されます。トレーニングデータは常に学習、モデルのパラメータの調整、出力の誤差の最小化に使用されます。残りのデータ(テストセット)は性能を評価するために使用されます。
以下のスクリプトでは、データセットを60%のトレーニングセットと40%のテストセットに分割しています。
df_Gender = pd.get_dummies(data['Gender'])
df_Age = pd.get_dummies(data['Age'])
df_City_Category = pd.get_dummies(data['City_Category'])
df_Stay_In_Current_City_Years = pd.get_dummies(data['Stay_In_Current_City_Years'])
data_final = pd.concat([data, df_Gender, df_Age, df_City_Category, df_Stay_In_Current_City_Years], axis=1)
data_final.head()
それでは、線形回帰モデルをインポートして、トレーニングセットで学習させましょう。
X = data_final[['Occupation', 'Marital_Status', 'Product_Category_2', 'F', 'M', '0-17', '18-25', '26-35', '36-45', '46-50', '51-55', '55+', 'A', 'B', 'C', '0', '1', '2', '3', '4+']]
y = data_final['Purchase']
出力。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)
おめでとうございます。モデルが学習されました。学習手順の後、切片パラメータの値とモデルのすべての係数の値を表示することができます。
from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X_train, y_train)
print(lm.fit(X_train, y_train))
出力。
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
ご覧のように、データセットの各カテゴリは、1つの回帰係数で定義されています。学習プロセスでは、学習フェーズでこれらの係数の最適値を探しました。上の出力で示された値は、機械学習モデルの係数として最も最適な値です。
いよいよテストデータをモデルの入力として使用し、我々のモデルがどの程度うまく機能するかを確認する時が来ました。
print('Intercept parameter:', lm.intercept_)
coeff_df = pd.DataFrame(lm.coef_, X.columns, columns=['Coefficient'])
print(coeff_df)
出力
Intercept parameter: 11224.23064289564
Coefficient
Occupation 8.110850
Marital_Status -79.970182
Product_Category_2 -215.239359
F -309.477333
M 309.477333
0-17 -439.382101
18-25 -126.919625
26-35 67.617548
36-45 104.096403
46-50 14.953497
51-55 342.248438
55+ 37.385839
A -376.683205
B -130.046924
C 506.730129
0 -46.230577
1 4.006429
2 32.627696
3 11.786731
4+ -2.190279
MLモデルの性能推定
最終的には,予測値の平均絶対誤差(MAE)と平均2乗誤差(MSE)を求めることで,結果を推定するのがよいでしょう.これらの誤差の計算方法はこちらでご覧いただけます。機械学習モデルの正しい評価指標を選択する方法。
これらの値を求めるには、sklearn
ライブラリの metrics
クラスのメソッドを使用します。
predictions = lm.predict(X_test)
print("Predicted purchases (in dollars) for new costumers:", predictions)
出力する。
Predicted purchases (in dollars) for new costumers: [10115.30806914 8422.51807746 9976.05377826 ... 9089.65372668
9435.81550922 8806.79394589]
結論
機械学習は様々なタスクに利用することができます。この記事では、機械学習アルゴリズムを使って、顧客がブラックフライデーに使うであろう金額を予測しました。また、データセットから興味深い傾向を見つけるために、探索的なデータ分析を行いました。実践のために、顧客の性別、年齢、職業によって、顧客が購入する可能性が高い製品を予測してみることを提案します。
</class