社員の成長と活躍を促す人事制度を構築するなら

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

【中小企業必見!】データ分析で店舗の強み・弱みを発見!~ID-POSデータ活用術~

日々データ活用の重要性を耳にするけれど、具体的にどんなデータを使って、どう分析すればいいのか、悩んでいませんか?特に中小企業の経営者や店長さんは、専門知識や人手が足りない中で、データ分析に二の足を踏んでしまうこともあるかもしれません。

そこで今回は、ID-POSデータを使って、複数店舗を展開する中小企業の皆さんに役立つ分析事例をご紹介します!難しい専門用語はなるべく使わず、わかりやすく解説していきますので、ぜひ最後まで読んでみてください。

なぜID-POSデータ?

ID-POSデータとは、コンビニやスーパーなどで買い物をした時のデータを、お客様一人ひとりに紐づけたものです。「いつ」「どこで」「誰が」「何を買ったか」といった情報がわかるので、お客様の行動を深く理解することができます。

今回は、このID-POSデータを使って、店舗ごとの強み・弱みを明らかにし、今後の改善に繋げることを目指します。

分析のポイント:客単価と来店頻度

今回の分析では、「客単価」「来店頻度」という2つの指標に着目します。

  • 客単価:お客様が1回の来店でどれくらいのお金を使っているか
  • 来店頻度:お客様がどれくらいの頻度で来店しているか

この2つの指標を組み合わせることで、店舗の特徴が見えてきます。例えば、

  • 客単価が高く、来店頻度も高い → 優良店。この状態を維持・強化していくことが目標となります
  • 客単価は高いが、来店頻度は低い → 高級店のようなイメージ。来店頻度を上げる施策が有効かもしれません
  • 客単価は低いが、来店頻度は高い → コンビニのようなイメージ。客単価を上げる工夫が必要となります
  • 客単価も低く、来店頻度も低い → 課題店。早急な対策が必要です

このように、店舗の特徴を把握することで、それぞれのお店に合った改善策を立てることができます。

では具体的に見ていきましょう。

分析対象データ

本記事では「ID-POSデータ」を分析対象のデータとします。
「ID-POSデータ」の分析を通じて、小売・流通業界の役に立つことを目標とします。

使用するデータについて

データは、ソシム社から出版されている「データサイエンス100本ノック 構造化データ加工編ガイドブック(森谷和弘・鈴木雅也 著)」で用意されているサンプルデータを使用します。
(MITライセンスで自由に利用して良いとの事です。ありがとうございます。)

ID-POSデータとは

コンビニやスーパーで買い物をするとき、バーコードを読み込んで代金を計算しますが、この時に集められるデータが「POSデータ」です。
「POSデータ」からは、「いつ」「どこで」「どの商品が」「いくつ」「いくらで」売れたかという販売時点情報が得られます。この「POSデータ」に「誰が」という情報が加わったものが「ID-POSデータ」です。

分析の3つの視点

分析の視点として、

① 店舗視点の分析
② 商品視点の分析
③ 顧客視点の分析
の3つの視点で分析をしていきます。
(各回1テーマを取り扱う予定です)

今回のテーマ

早速、今回のテーマですが、「店舗視点の分析」をしていきます。
複数店舗を運営している小売業を想定し「客単価」と「来店頻度」の2軸で店舗間の比較をします。
「客単価」と「来店頻度」の2軸での比較を通し、店舗ごとに取り組むべき課題を抽出していきます。

分析の流れ

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

① 上記出典元の『レシートデータ』より、2017年1月のデータを抽出
② 店舗ごとの客単価と来店頻度を算出
③ 散布図を使い可視化
④ 可視化により、各店舗の取り組むべき課題を抽出

Rによる実装

まずは、Tidyverseを読み込みます。

library(tidyverse)

“`

次に、データを読み込みます

id_pos <- read_csv("receipt.csv")

“`

ちなみにデータはこんな感じです
“id_pos”テーブルを表示

image.png

先頭20行のみ表示しました
データ自体は104,681行 9列のデータです

このデータの中から2017年1月のデータのみ抽出していきます
まずはsales_ymd列のデータ型を調べます。

class(id_pos$sales_ymd)

“`

[1] “numeric”

“numeric”型(数値型)なので、日時型へ変換します

id_pos$sales_ymd <- parse_data_time(id_pos$sales_ymd, order = "ymd")

“`

念のため、変換されたかの確認をします

class(id_pos$sales_ymd)

“`

[1] “POSIXct” “POSIXt”

無事、日時型に変換されましたので、2017年1月のデータのみ抽出し、昇順で並び替えます

id_pos_2017_1 <- id_pos %>% 
  filter(year(sales_ymd) == 2017,
         month(sales_ymd) == 1) %>% 
  arrange(sales_ymd)

“`

上位20行だけだとわかりづらいですが、2017年1月のデータのみ抽出しました
“id_pos_2017_1″テーブルを表示

image.png

次に、集計に必要な列のみ抽出したのち、”quantity(数量)列”と”amount(金額)列”から売上金額を計算し、”sales_amount(売上金額)”列を新たに追加

id_pos_2017_1_sales_amount <- id_pos_2017_1 %>%
  select(sales_ymd, store_cd, customer_id, product_cd, quantity, amount) %>% 
  mutate(sales_amount = quantity*amount)

“`
“id_pos_2017_1_sales_amount”テーブルを表示

image.png

次に”store_cd(店舗コード)”でグループ化した後、2017年1月の店舗ごとの合計売上金額を計算し、”sales_store_amount”列を新たに追加

id_pos_2017_1_sales_store_amount <- id_pos_2017_1_sales_amount %>% group_by(store_cd) %>% 
  summarise(sales_store_amount = sum(sales_amount))

“`

店舗ごとの2017年1月の合計売上金額が計算できました
“id_pos_2017_1_sales_store_amount”テーブルを表示

image.png

次に、2017年1月の店舗ごとの、「のべ購入回数」を計算し、”Row_count”列を新たに追加

id_pos_2017_1_store_count <- id_pos_2017_1 %>% 
  group_by(store_cd) %>% 
  summarise(Row_count = n())

“`

店舗ごとの「のべ購入回数」が計算できました
“id_pos_2017_1_store_count” テーブルを表示

image.png

次に、上で計算した「店舗ごとの2017年1月の合計売上金額」と「のべ購入回数」から「客単価」を計算していきます
まず、店舗ごとの売上合計金額のテーブルとのべ購入回数のテーブルを結合します

id_pos_2017_1_join <- left_join(id_pos_2017_1_sales_store_amount, id_pos_2017_1_store_count, 
by = "store_cd")

“`
“id_pos_2017_1_join”テーブルを表示

image.png

“sales_store_amount(店舗ごとの売上合計金額)”と”Row_count(のべ購入回数)”から客単価を計算していきます

id_pos_2017_1_sales_per_customer <- id_pos_2017_1_join %>%
  mutate(sales_per_customer = sales_store_amount / Row_count)

“`

“id_pos_2017_1_sales_per_customer”テーブルを表示

image.png

“sale_per_customer(客単価)”が計算できました

つぎに店舗ごとの来店頻度を計算していきます
そのために、まず、店舗ごとのユニーク顧客数を計算します

id_pos_2017_1_unique <- id_pos_2017_1 %>% 
  group_by(store_cd) %>% 
  summarise(unique_customer = n_distinct(customer_id))

“`
“id_pos_2017_1_unique”テーブルを表示します

image.png

店舗ごとの”unique_customer(ユニーク顧客数)”が計算できました
このユニーク顧客数とのべ購入回数から、店舗ごとの来店頻度を計算していきます

まずは、のべ購入回数のテーブルと、上で計算したユニーク顧客数のテーブルを結合します

id_pos_2017_1_join_2 <- left_join(id_pos_2017_1_store_count, id_pos_2017_1_unique, 
by = "store_cd")

“`

“id_pos_2017_1_join_2″テーブルを表示します

image.png

店舗ごとの「のべ購入回数」と「ユニーク顧客数」から店舗ごとの「来店頻度」を求めます

id_pos_2017_1_freq <- id_pos_2017_1_join_2 %>% 
  mutate(customer_freq = Row_count / unique_customer)

“`
“id_pos_2017_1_freq”テーブルを表示します

image.png

店舗ごとの「来店頻度」”customer_freq”が計算できました

これで店舗ごとの客単価と来店頻度が計算できましたので一つのテーブルにまとめます

id_pos_2017_1_for_plot <- left_join(id_pos_2017_1_sales_per_customer,id_pos_2017_1_freq,
                    by = "store_cd" )

“`
“id_pos_2017_1_for_plot”テーブルを表示します

image.png

上テーブルの”sales_per_customer”列が「客単価」、”customer_freq”列が「来店頻度」です
このテーブルから、散布図を作っていきます

ggplot(data = id_pos_2017_1_for_plot) + 
  geom_point(aes(x = customer_freq, y = sales_per_customer,
                 colour =store_cd)) + 
  theme_classic() +
  scale_x_continuous(limits = c(0,10))

“`
散布図を表示します

image.png

店舗によって来店頻度よりも客単価のばらつきが大きいことが分かりました

この散布図に、客単価、来店頻度それぞれの平均値を加えてみます

#客単価、来店頻度の平均値を計算する
x_mean <- mean(id_pos_2017_1_for_plot$customer_freq)
y_mean <- mean(id_pos_2017_1_for_plot$sales_per_customer)

#平均値を散布図に加える
ggplot(data = id_pos_2017_1_for_plot) + 
  geom_point(aes(x = customer_freq, y = sales_per_customer,
                 colour =store_cd)) + 
  theme_classic() +
  scale_x_continuous(limits = c(0,10)) +
  geom_vline(xintercept = x_mean, linetype = "dashed", color = "red") +
  geom_hline(yintercept = y_mean, linetype = "dashed", color = "red")

“`
image.png

客単価と来店頻度の平均値を加えることで、4象限に分けられました
これをもとに、各店舗が客単価向上に取り組むべきか、それとも来店頻度向上に取り組むべきか等、現状を踏まえた改善施策が可能になりそうです

まとめ

今回は長くなってしまったので、ひとまず散布図で可視化したところまでとしました。
次回以降、ここからさらに、客単価がばらつく要因を調べたり、客単価が高い店舗と低い店舗では売れている商品にどのような違いがあるかなど深堀していきたいと思います。

コメント

この記事へのコメントはありません。

関連記事