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

# 前回のおさらい
前回（第１回目）投稿では、とあるID-POSデータから2017年1月のデータを抽出し、「客単価」と「来店頻度」の２軸で店舗間比較を行いました。
その結果、「来店頻度」のばらつきよりも、「客単価」のばらつきの方が大きいことが分かりました。
念のため、前回作成した散布図を改めて表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/ae3b0a5d-b4db-b5b9-f193-b612ed22726e.png)

# 今回のテーマ
そこで今回（第２回目）は「客単価」が最も高い店舗と低い店舗の店舗間比較を行い、「客単価」に差が生じる要因を明らかにしていきたいと思います。

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

1.　2017年1月において、「客単価」が最も高い店舗と低い店舗を特定する
2.　**客単価＝買上点数×買上商品単価**に分解し、各々の店舗についてこれら指標を計算する
3.　（1回当たりの）買上点数と（1回当たりの）買上商品単価を比較し、客単価に差異が生じる要因を特定する

# Rによる実装
#### 1.　2017年1月において、「客単価」が最も高い店舗と低い店舗を特定する
```R:code
#tidyverseの読み込み
library(tidyverse)
``````
```R:code
#前回作成した"id_pos_2017_1_sales_per_customer"を確認
id_pos_2017_1_sales_per_customer
``````
id_pos_2017_1_sales_per_customerの先頭20行を表示
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/454a0b60-94ee-e45d-7ce1-1b2aee7991f8.png)

まずid_pos_2017_1_sales_per_customerの中から、客単価が最大の店舗を抽出します。
```R:code
#id_pos_2017_1_sales_per_customerの中から客単価が最大の店舗と最小の店舗を抽出
max_row <- id_pos_2017_1_sales_per_customer %>% 
filter(sales_per_customer == max(sales_per_customer))
``````
結果を表示します
```R:code
#結果を表示
print(max_row)
``````
>store_cd 　sales_store_amount　 Row_count 　sales_per_customer
  <chr>                 <dbl>     <int>              <dbl>
1 S14010       　/         39320     /　   85        　/       463.

店舗コード「S14010」の店舗が客単価最大となり、「463」であることが分かりました。

続いてid_pos_2017_1_sales_per_customerの中から、客単価が最小の店舗を抽出します。
```R:code
#id_pos_2017_1_sales_per_customerの中から客単価が最小の店舗を抽出
min_row <- id_pos_2017_1_sales_per_customer %>% 
  filter(sales_per_customer == min(sales_per_customer))
``````
結果を表示します
```R:code
#結果を表示
print(min_row)
``````
> store_cd　sales_store_amount　   Row_count　   sales_per_customer
  <chr>                 <dbl>     <int>              <dbl>
1 S14022       /         12016    /    59       /        204.

店舗コード「S1402」の店舗が客単価最小となり、「204」であることが分かりました。

#### 2.　**客単価＝買上点数×買上商品単価**に分解する
続いて、客単価を買上点数と買上商品単価に分解していきます。
（1回購入あたりの）買上点数は以下の通り定義します。
> （1回購入あたりの）買上点数＝総買上点数÷のべ購入回数

（1回購入あたりの）買上商品単価は以下の通り定義します。
>（1回購入あたりの）買上商品単価＝合計売上金額÷総買上点数

以下、前回（第1回目）作成したid_pos_2017_1_sales_amountを使い計算していきます。

id_pos_2017_1_sales_amountの先頭20行を表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834217/38ef2385-266f-34eb-f9d1-1bc87be1ad04.png)

quantityが「買上点数」、amountが「単価」、sales_amountが「売上金額」です。

##### 2-1.客単価が最大である店舗コード「S14010」について
まずは、客単価が最大である店舗コード「S14010」から見ていきます。

ここからの集計の流れは以下の通り行います。

2-1-1.　店舗コード「S14010」の行を抽出し、合計売上金額、総買上点数、のべ購入回数を計算
2-1-2.　総買上点数÷のべ購入回数で（1回購入あたりの）買上点数を計算
2-1-3.　合計売上金額÷総買上点数で（1回購入あたりの）買上商品単価を計算

はじめに、「2-1-1.　店舗コード「S14010」の行を抽出し、合計売上金額、総買上点数、のべ購入回数を計算」を実装していきます。

```R:code
#店舗コード「S14010」のみ抽出し合計売上金額、総買上点数、のべ購入回数を計算
#合計売上金額が"total_sales_amount"、総買上点数が"total_quantity"、のべ購入回数が"total_count"
s14010 <- id_pos_2017_1_sales_amount %>% 
  filter(store_cd == "S14010") %>% 
  summarise(total_sales_amount = sum(sales_amount), 
            total_quantity = sum(quantity),
            total_count = n()) 
``````
結果を表示します。
```R:code
#結果を表示
s14010
``````
>total_sales_amount（合計売上金額）/total_quantity（総買上点数）/total_count（のべ購入回数）
               <dbl>          <dbl>       <int>
             39320      /       89     /     85

これをもとに、2-1-2.「（1回購入あたりの）買上点数」と2-1-3.「（1回購入あたりの）買上商品単価」を計算していきます

```R:code
#（1回購入あたりの）買上点数と（1回購入あたりの）買上商品単価を計算する
#（1回購入あたりの）買上点数が"quantity_per_count"、（1回購入あたりの）買上商品単価が
#"product_amount"

s14010_data <- s14010 %>% 
  mutate(quantity_per_count = total_quantity / total_count,
         product_amount = total_sales_amount / total_quantity)
``````
結果を表示します

```R:code
#結果を表示
s14010_data
``````
> quantity_per_count（1回購入あたりの買上点数）/ product_amount（1回当たりの買上商品単価）
 <dbl>          <dbl>
   1.05      　/　     442.

これで客単価が最大である店舗コード「S14010」の（1回購入あたりの）買上点数と（1回購入あたりの）買上商品単価が計算できました。

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

##### 2-2.客単価が最小である店舗コード「S14022」について
続いて、客単価が最小である店舗コード「S14022」を見ていきます。

集計の流れは同じです。

```R:code
#続いて店舗コード「S14022」のみ抽出し合計売上金額、総買上点数、のべ購入回数を計算
#合計売上金額が"total_sales_amount"、総買上点数が"total_quantity"、のべ購入回数が"total_count"

s14022 <- id_pos_2017_1_sales_amount %>% 
  filter(store_cd == "S14022") %>% 
  summarise(total_sales_amount = sum(sales_amount),
            total_quantity = sum(quantity),
            total_count = n())
``````
結果を表示します
```R:code
#結果を表示
s14022
``````
>total_sales_amount（合計売上金額）/total_quantity（総買上点数）/total_count（のべ購入回数）
               <dbl>          <dbl>       <int>
         12016      ／        60      ／    59

これをもとに、「1回あたりの買上点数」と「1回あたりの買上商品単価」を計算していきます

```R:code
#1回あたりの買上点数と1回あたりの買上商品単価を計算する
#1回あたりの買上点数が"quantity_per_count"、1回あたりの買上商品単価が"product_amount"

s14022_data <- s14022 %>% 
  mutate(quantity_per_count = total_quantity / total_count,
         product_amount = total_sales_amount / total_quantity)
``````
結果を表示します

```R:code
#結果を表示
s14022_data
``````
> quantity_per_count（1回あたりの買上点数）/ product_amount（1回あたりの買上商品単価）
             1.02      ／     200.

これで客単価が最小である店舗コード「S14022」の1回あたりの買上点数と1回あたりの買上商品単価が計算できました。

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

#### 3. （1回当たりの）買上点数と（1回当たりの）買上商品単価を比較し、客単価に差異が生じる要因を特定する

店舗コード「S14010」と「S14022」の計算結果を並べてみます
>店舗コード「S14010」
（1回当たりの）買上点数　1.05ケ
（1回当たりの）買上商品単価　442

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

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

店舗コード「S14010」の方が、高い商品が売れているという事が分かりました。

要因としては、以下のような仮説が考えられます。

1. 店舗コード「S14010」の商圏内には所得の高い世帯が住んでいる
2. 店舗コード「S14010」の方が、高単価商品の品揃えが豊富
3. 店舗コード「S14010」の方が、高単価商品の陳列や見せ方がうまい
4. 店舗コード「S14010」の従業員の接客スキルが高い

などなど…

これらの仮説を検証し、客単価の低い店舗コード「S14022」で実行すれば、客単価の改善、そして売上の改善に繋がりそうです。

次回は、これら仮説のうちID-POSデータで検証可能な
『2. 店舗コード「S14010」の方が、高単価商品の品揃えが豊富』という仮説を検証していきます。