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

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

以下がその結果です。

>店舗コード「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」のデータをそれぞれ抽出し、売上金額を計算する。
````R:code
#tidyverseの読み込み
library(tidyverse)
``````
```R: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/5d1f7af6-0545-97fb-b49d-903c51bd73f9.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/2ebb4f6d-80e2-ae4e-3a54-2d31536c106d.png)

##### 1-2. 売上金額を降順に並び替え、相対度数と累積相対度数を計算する。
まずは集計に必要のない列を削除します。
```R:code
S14010_2017_1_select　<- S14010_2017_1 %>% 
  select(sales_ymd, store_cd, product_cd, quantity, amount, sales_amount) 
``````
上位20行を表示します。
集計に不要な列が削除されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/ab447874-82a3-6f4d-6b5a-7d0a89ebafa6.png)

続いてsales_amount列（売上金額列）を対象に降順に並び替えます。
```R:code
S14010_2017_1_arrange <- S14010_2017_1_select %>% 
  arrange(desc(sales_amount))
``````
売上金額列が降順に並び替えられました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/bee0cd65-89e5-a54a-3249-3c8b435c809f.png)

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

```R: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/6caf3aa8-11a0-3108-c7f7-bb3f52df30a7.png)

続いて、累積相対度数を計算します。
```R: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/8b6823a4-9ac4-baf6-6473-7eff218e302b.png)

最後に累積相対度数に基づき、ABCランクを付けていきます。
今回は、累積相対度数が80%までがAランク、80%から90%がBランク、それ以上がCランクとしました。
```R: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/94f779f8-4462-30af-131f-214c06ecef36.png)

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

#### 2. 次に、客単価が最も低い店舗コード「S14022」について分析します。
##### 2-1. 2017年1月のID-POSデータから店舗コード「S14022」のデータをそれぞれ抽出し、売上金額を計算する。

```R: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. 売上金額を降順に並び替え、相対度数と累積相対度数を計算する。
まずは集計に必要のない列を削除します。

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/d289ef14-62a6-08a5-d317-a850ced549f3.png)

続いてsales_amount列（売上金額列）を対象に降順に並び替えます。
```R:code
#sales_amount列を降順に並びかえる
S14022_2017_1_arrange <- S14022_2017_1_select %>% 
  arrange(desc(sales_amount))
``````

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/5e32478d-c523-a5fe-25bc-f1745a9d0511.png)

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

```R: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/50c410ca-d365-503e-258a-dfd5be5c267d.png)

続いて、累積相対度数を計算します。
```R:code
#relative_freq列の累積相対度数を計算する
S14022_2017_1_crf <- S14022_2017_1_rf %>%
  mutate(cum_relative_freq = cumsum(S14022_2017_1_rf$relative_freq))
``````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/854c7722-8ab2-bb6a-0bc5-4385b24b3731.png)

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

```R: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ランクとしました。

```R: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/4f77be66-0482-5b3c-a738-556c440b8107.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/94f779f8-4462-30af-131f-214c06ecef36.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/4f77be66-0482-5b3c-a738-556c440b8107.png)

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

#### 4.まとめ

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

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

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