1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ID-POSデータを活用したデータ分析入門 その3

Posted at

前回のおさらい

前回(第2回目)投稿では、「客単価」が最も高い店舗と低い店舗の店舗間比較分析を行いました。
具体的には、各々の店舗の「客単価」を「買上点数×買上商品単価」に分解し、「客単価」に差が生じる原因を深堀していきました。

以下がその結果です。

店舗コード「S14010」
(1回当たりの)買上点数 1.05ケ
(1回当たりの)買上商品単価 442

店舗コード「S14022」
(1回当たりの)買上点数 1.02ケ
(1回当たりの)買上商品単価 200

どちらも1回当たりの買上点数にはそれほど大きな差はないものの、買上商品単価に2.21倍の差があることが分かりました。

今回のテーマ

そこで今回は、各々の店舗でどのような商品が売れているのかについて、売上金額ベースのABC分析を行い、各店舗の売れ筋商品の違いについて見ていきたいと思います。

分析の流れ

分析の流れは大まかに以下の通りとします。

1. 店舗コード「S14010」について売上金額の相対度数と累積相対度数を計算、累積相対度数をもとにABCランク付けを行う。「S14022」

2. 店舗コード「S14022」について売上金額の相対度数と累積相対度数を計算、累積相対度数をもとにABCランク付けを行う。

3. 各店舗のAランク商品について比較を行う。

Rによる実装

1. まずは客単価が最も高い店舗コード「S14010」について分析

1-1. 2017年1月のID-POSデータから店舗コード「S14010」のデータをそれぞれ抽出し、売上金額を計算する。
code
#tidyverseの読み込み
library(tidyverse)
code
#id_pos_2017_1からstore_cdがs14010の店舗のデータのみを抽出した後、
#売上金額列(sales_amount)を追加しS14010_2017_1へ格納

S14010_2017_1 <- id_pos_2017_1 %>% 
  filter(store_cd == "S14010") %>% 
  mutate(sales_amount = quantity * amount)

ちなみに、“id_pos_2017_1”は元のID-POSデータから2017年1月のデータのみを抽出したデータでした。

先頭20行を表示します。

image.png

この中から、店舗コードが「S14010」のデータのみ抽出し、売上金額列(sales_amount列)を追加しました。
先頭20行を表示します。

image.png

1-2. 売上金額を降順に並び替え、相対度数と累積相対度数を計算する。

まずは集計に必要のない列を削除します。

code
S14010_2017_1_select <- S14010_2017_1 %>% 
  select(sales_ymd, store_cd, product_cd, quantity, amount, sales_amount) 

上位20行を表示します。
集計に不要な列が削除されました。

image.png

続いてsales_amount列(売上金額列)を対象に降順に並び替えます。

code
S14010_2017_1_arrange <- S14010_2017_1_select %>% 
  arrange(desc(sales_amount))

売上金額列が降順に並び替えられました。

image.png

続いて、"sales_amount列"(売上金額列)を対象に、相対度数と累積相対度数を計算します。

code
#sales_amount列の相対度数を計算する
S14010_2017_1_rf <- S14010_2017_1_arrange %>%
  mutate(relative_freq = prop.table(S14010_2017_1_arrange$sales_amount))

相対度数が計算できました。
"reletive_freq列"が相対度数です。

image.png

続いて、累積相対度数を計算します。

code
#relative_freq列の累積相対度数を計算する
S14010_2017_1_crf <- S14010_2017_1_rf %>%
  mutate(cum_relative_freq = cumsum(S14010_2017_1_rf$relative_freq))

累積相対度数が計算できました。
"cum_relative_freq列"が累積相対度数です。

image.png

最後に累積相対度数に基づき、ABCランクを付けていきます。
今回は、累積相対度数が80%までがAランク、80%から90%がBランク、それ以上がCランクとしました。

code
#累積相対度数に基づき、ABCランクをつける
ABC_rank_S14010 <- S14010_2017_1_crf %>% 
  mutate(ABC_rank = case_when(cum_relative_freq <= 0.8 ~ "A",
                              cum_relative_freq <= 0.9 ~ "B",
                              TRUE ~ "C")

Aランクの上位20行を表示します。

image.png

"amount列"が商品単価の列です。

2. 次に、客単価が最も低い店舗コード「S14022」について分析します。

2-1. 2017年1月のID-POSデータから店舗コード「S14022」のデータをそれぞれ抽出し、売上金額を計算する。
code
#id_pos_2017_1からstore_cdがS14022の店舗のデータのみを抽出し、売上金額列を追加しS14022_2017_1へ格納

S14022_2017_1 <- id_pos_2017_1 %>% 
  filter(store_cd == "S14022") %>% 
  mutate(sales_amount = quantity * amount)
2-2. 売上金額を降順に並び替え、相対度数と累積相対度数を計算する。

まずは集計に必要のない列を削除します。

code
#余計な列を削除
S14022_2017_1_select <- S14022_2017_1 %>% 
  select(sales_ymd, store_cd, product_cd, quantity, amount, sales_amount)

上位20行を表示します。
集計に不要な列が削除されました。

image.png

続いてsales_amount列(売上金額列)を対象に降順に並び替えます。

code
#sales_amount列を降順に並びかえる
S14022_2017_1_arrange <- S14022_2017_1_select %>% 
  arrange(desc(sales_amount))

売上金額列が降順に並び替えられました。

image.png

続いて、"sales_amount列"(売上金額列)を対象に、相対度数と累積相対度数を計算します。

code
#sales_amount列の相対度数を計算する
S14022_2017_1_rf <- S14022_2017_1_arrange %>% 
  mutate(relative_freq = prop.table(S14022_2017_1_arrange$sales_amount))

相対度数が計算できました。
"reletive_freq列"が相対度数です。

image.png

続いて、累積相対度数を計算します。

code
#relative_freq列の累積相対度数を計算する
S14022_2017_1_crf <- S14022_2017_1_rf %>%
  mutate(cum_relative_freq = cumsum(S14022_2017_1_rf$relative_freq))

image.png

累積相対度数が計算できました。
"cum_relative_freq列"が累積相対度数です。

code
#累積相対度数を基づき、ABCランクをつける
ABC_rank_S14022 <- S14022_2017_1_crf %>% 
  mutate(ABC_rank = case_when(cum_relative_freq <= 0.8 ~ "A",
                              cum_relative_freq <= 0.9 ~ "B",
                              TRUE ~ "C"))

最後に累積相対度数に基づき、ABCランクを付けていきます。
今回は、累積相対度数が80%までがAランク、80%から90%がBランク、それ以上がCランクとしました。

code
#累積相対度数を基づき、ABCランクをつける
ABC_rank_S14022 <- S14022_2017_1_crf %>% 
  mutate(ABC_rank = case_when(cum_relative_freq <= 0.8 ~ "A",
                              cum_relative_freq <= 0.9 ~ "B",
                              TRUE ~ "C"))

Aランクの上位20行を表示します。
"amount列"が商品単価の列です。

image.png

3. 各店舗のAランク商品について比較を行う

ここで、店舗コード「S14010」と「S14022」の上位20行に表示されたAランク商品をもう一度見てみます。

店舗コード「S14010」の上位20商品

image.png

店舗コード「S14022」の上位20商品

image.png

"amount"列が「商品単価」の列ですが、比較すると店舗コード「S14010」の店舗の方が、単価が高い商品が売れていることがわかります。

4.まとめ

前回(2回目)投稿の分析で、店舗コード「S14010」の方が高い商品が売れていることが分かり、今回(3回目)投稿では、その要因を明らかにしようとしましたが、最終的には、前回(2回目)投稿を裏付ける程度の分析結果しか得られませんでした。

客単価に差が生じる要因を明らかにするためには、ID-POSなどの定量的な分析に加え、『店舗コード「S14010」の方が陳列、見せ方が上手い』、『店舗コード「S14010」の方が接客力が高い』といったような定性的な分析や、商圏人口の所得などの分析が必要になってきます。

今回はサンプルデータなので、陳列や接客、商圏などについての分析は行いませんが、実店舗の分析においては、定量・定性の両面から分析を進めることで要因の絞り込みが出来、効果的な販促活動に繋がる示唆を得ることができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?