ここに、あるストアの顧客の購買ヒストリーのデータがあります。顧客がいつどの商品を買い、どれだけのお金を費やしたかという情報が入っています。

データの期間は2012年1月1日から2015年12月31日です。

この期間の間に一人の顧客が複数回購買しています。ある顧客は毎月定期的に購買しているかもしれませんし、ある顧客は2、3ヶ月に一度といったようにたまに購買しているかもしれません。

それでは、それぞれの顧客の購買の間隔はどれくらいなのでしょうか?それら購買の間隔の全体での平均はどれくらいなのでしょうか?

また、その購買間隔は時間とともに変わってきているのでしょうか?さらに、それはいつ顧客になったかによって変わるのでしょうか?つまり、3年前に顧客になった人たちの購買期間は最近顧客になった人達と比べてどのように違うのでしょうか?

今日は、データラングリングとチャートを使ってこうした質問に答えていってみたいと思います。

顧客ごとのデータの準備

このデータは顧客の購買記録が、いつどのプロダクトを買ったかという単位で入っています。

つまり、同じ日に複数の注文をした顧客は同じ日の複数の行があります。

今回は最終的にはそれぞれの顧客の購買の間隔を調べたいので、まずはデータを顧客と購買日のレベルで一度集計してしまいます。

集計するときは、まずはデータを集計したいレベルでグループ化(Group By)します。その後に、実際の集計をSummarizeというステップを使って行います。

Group By

もう一つの列、Order Dateもグループ化に入れます。

これでデータのグループ化ができました。

Summarize

次に、それぞれの顧客の購買日ごとでどれだけの売上があったのか、何件の注文があったのかを計算してみましょう。

列ヘッダーメニューから、

集計(Summarize) -> 合計値

を選びます。

次に、テーブルの列ヘッダーにある、プラスボタンを押します。

ダイアログの中で、すでに”行の数”が選ばれているので、そのままにして、新しくできる列の名前をわかりやすいように、”counts“などにしておきます。

これで、一顧客、一購買日というレベルのデータができました。

顧客の購買間隔を計算する

これからがいよいよこの記事のメインな部分です。

lag関数を使って購買間隔を計算する

これから購買間隔を計算したいのですが、基本的には、単純にOrder Date列の値を見て、一つ前の値を引いたものが購買間隔になります。つまり、以下のデータの場合、1行目、2行目にAA−10315102という顧客がいますがこの人は2012-07-03と2015-01-07の2回購買しています。

ということは、

2015-01-07 - 2012-07-03

という計算をすることで、2回目の時の購買間隔がわかります。ちなみに1回目の時の購買間隔はそれ以前の購買がないので、NAです。

ということは、前の値さえ取れてしまえばこの計算は簡単にできそうです。前の値を取るには、lag()という関数があります。(ちなみに、その逆、つまり次の値の場合は、lead()という関数があります。)

このlag()という関数を使うと、

Order Date - lag(Order Date)

上記のような計算式を書くことで、購買間隔が計算できます。

lag関数を使う時の注意点

ただここで2つ注意が必要です。

1つ目は、lag()という関数は単純に前の行の値をとってくるだけなので、データが事前にOrder Dateでソートされてある必要があります。

まずはCustomer IDの列ヘッダーメニューから、並べ替えを選びます。

さらに、肝心のOrder Dateの列をソートに加えたいので、その列ヘッダーメニューから、並べ替えを選びます。

これで、データが顧客、注文日の順でソートされました。

2つ目は、今回計算したいのは、顧客ごとの購買間隔です。ですので、この購買間隔の計算を違う顧客をまたがって行いたくありません。例えば、上記のデータの場合、2行目と3行目は違う顧客なので3行目の計算を行うときには、lag()関数に前の値をとってきてほしくありません。これに関しては、実はデータフレームをグループ化することで解決できます。つまりlag()関数はデータフレームのグループをリスペクトし、グループをまたがって計算することがありません。

ですので、データが顧客ごとにグループ化されていればいいわけです。そして、実はこのエキササイズだと、データフレームがすでに顧客ごとにグループ化されています。

もともと、

Customer ID, Order Date

の2つの列で、グループ化されていたのですが、Summarizeのステップで集計を行うことで一番下のグループレベル、つまりOrder Date列がグループ化のキーとなる列から外されています。ですので、現在はCustomer IDのみがグループ化のキー列となっています。

ちなみに、もしこの記事のこのあたりから始める場合など、グループ化が顧客レベルでできていない場合は、グループ化をしたい列のヘッダーメニューから、グループ化を選ぶことで正しく設定することができます。

lag関数を使う

ここで、いよいよlag()関数を使います。

ちなみに、このような、グループごとに、行をまたがるような計算を、”表計算”もしくは、”Window計算”と呼びます。これは、例えば平均を計算したりするようなグループごとにデータを集計する計算とは違うタイプのものです。集計に関するものであれば、上で既にやったように、Summarizeというステップでやればいいのですが、今回のような計算は集計するのではなく、むしろ一行ごとに計算を行ってその結果を一行ごとに返して欲しいわけです。

こうした一行一行ごとに計算を行ってその結果を一行ごとに返す場合は、Mutateというステップを使います。これは普通の計算をする場合と一緒です。Excelでいえば、普通にフォーミュラを使って行う計算と同じです。

ですので、列ヘッダーメニューから、”計算の作成”を選び、

以下の計算式を入力します。

`Order Date` - lag(`Order Date`)

ちなみに、列名、Order Dateの前と後にある記号はバックティックと呼びますが、列名にスペースが入っている場合などはこのバックティックで囲んであげる必要があります。Order Dateの列ヘッダーメニューから、計算の作成を選んだ場合は自動的にバックティックが入っているはずなので特別に追加する必要はありません。

さらに、lag()関数の中でも、列のドロップダウン・リストが出てくるのでそこから選ぶことで自動的にバックティックがついてきます。(ドロップダウン・リストが出てこない場合は、タブ・キーを押して下さい。)

新しい列の名前として、”duration“など自分にわかりやすい名前を入力して、実行すると以下のように、購買期間が計算されます。

この新しい列のデータタイプはdifftimeとなっていますが。これはDate型のデータ同士の計算を行ったときにできる特別なデータタイプです。ここではもとのデータタイプがDate型なので、この数値の単位は日となっています。ですので、2行目の値は918日と解釈することができます。

この後、購買間隔の平均などの計算を行うので、ここで一度Numeric(数値)型に変換しておきましょう。列ヘッダーメニューから、

データタイプを変換 -> 数値に変換 -> 日

を選びます。

そのまま実行すると、数値自体は変わりませんが、データ型が変わっているのが確認できます。

この状態でサマリービューに行くと、購買間隔の分布、さらに平均、最大値、最小値などの統計値を見ることができます。

顧客の購買間隔の変化

それでは、購買間隔がどのように推移してきたのかをチャートビューに行って見てましょう。

バーチャートを選んで、Order DateをX軸に、duration列をY軸にアサインします。Order Dateの方は、月単位にして、durationは平均を集計しましょう。

購買間隔が時間がたつに連れて大きくなってきているのがわかります。これは当たり前といえばそうかも知れません。最近の注文のほうがその前の註文した日との間隔がより大きくなる可能性は高くなります。

しかし、ここで購買間隔の平均をそれぞれの顧客が最初に購買した月を元にグループを作り、いつこのストアの顧客になったかをもとに購買間隔の平均を見てみたいと思います。

そのためにはまず、最初に購買した日という列を作ります。

この状態で、チャートビューに行って、最初に購買した月ごとの平均のトレンドを見てみましょう。

ここで、平均ではなくて購買間隔の分布を見てみたい場合は、箱ひげ図を以下のように使うことができます。

最後に、最初に購買した年をベースにしたグループ毎の顧客の購買間隔がどのように変化していっているのかを見てみましょう。

まずは、以下が購買間隔のトレンドです。

これをラインチャートで表してみましょう。

さらに、そのトレンドをわかりやすくするために、トレンドラインを引いてみます。この直線のラインは、もとのラインチャートの全てのデータポイントからの距離が一番小さくなるように描かれた線です。

ここで、先程作った最初に購買した日の列である first_order_dateを”色で分割”にアサインします。

するとそれぞれの線が、最初に購買した年をもとにしたグループごとの購買間隔の平均のトレンドを表しています。

ここで、それぞれの直線のCoefficientというものに注目します。

これは線の傾きを表します。この数字が高いほど傾きが激しい、つまり、この場合ですと、購買間隔がどんどん伸びていっているということになります。

この場合は、2012年に顧客になったグループは0.53という傾きになっています。

それと比べて、2015年に顧客になったグループは0.4と、2012年の顧客のグループに比べてよりゆっくりとした傾きになっています。

顧客は時間がたつに連れて購買間隔が大きくなっていくというのは以前にチャートで確認できていますが、ストアとしては、そのスピードが遅くあってほしいものです。ですので、このように年を追うに連れて傾きがゆるくなっていくというのは望ましいと言えます。