Help us understand the problem. What is going on with this article?

消費者へのリーチを最大化する商品組み合わせを知るTURF分析というのがあるらしい。

More than 1 year has passed since last update.

はじめに

マーケティングの世界には、「TURF分析」という分析手法があるらしく、恥ずかしながら最近まで知らなかったので、分析手法の説明からRでの実行までをまとめておきます。今もturf分析を理解してるわけではないですが…。

TURF分析

TURFとはTotal Unduplicated Reach and Frequencyという言葉の頭文字の略で、言葉通りコミュニケーションによって到達したユーザー数(リーチ)と、リーチを最大にする最小の組み合わせ?を明らかにする分析手法のようです。つまり、消費者へのリーチが最大になるような組み合わせ(単純に上位からn個とるわけではない)を分析する手法です。予算やカニバリなどの問題、最適な組み合わせがわからないときに有効な分析手法です。

たとえば、ある企業が新しい商品を販売する際に、カラーラインを10色用意しようとしているとしましょう。しかし、実際には定番の2色のみが売れていく可能性があります。そんなときに、TURF分析を行うことで、購入客の総数を最大にする商品カラーの組み合わせを特定できます。

他にも、マクロミルのHPのTURF分析にあるように、下記のような分析が可能です。わかりやすいの画像もお借りします。

  • 店頭に並べる商品ラインナップの選択をしたい
  • 最もカニバリゼーションが起きにくい商品ライン・組み合わせの設計をしたい
  • 広告コミュニケーション素材の選択をしたい
  • 予算内で最も効果的な広告メディアの選択をしたい

image_001.png
Source|マクロミル-TURF分析-

turfRパッケージ

ここでは{turfR}パッケージを利用して、TURF分析を実行します。サンプルデータはこんな感じです。

R
library(turfR)
df
# A tibble: 100 x 22
      id weight   x01   x02   x03   x04   x05   x06   x07   x08   x09   x10   x11   x12   x13   x14   x15   x16   x17   x18   x19   x20
   <int>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1     1      1     0     1     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 2     2      1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 3     3      1     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 4     4      1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 5     5      1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1
 6     6      1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 7     7      1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 8     8      1     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 9     9      1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
10    10      1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

Vol.7 マクロミル小笠原道明|コラムにあるように、某アイドルグループ(やたら人の数が多いグループ)の仮想データを使ってTURF分析を行ってみましょう。

ここには、100人分のファンの「各アイドル(x01~x20の20人分)の握手会」への参加有無が記録されています。大人の事情で、20人分のマネジメントからなにから、とにかく人数が多いとお金と時間が膨大にかかってしまいます。

そのため、分析目的としては、最大限のリーチを確保しながら、必要な人数にグループを限定し、さらに必要なアイドルに絞りたい、という感じです。そこでTURF分析です。

引数はnにアイテムの数を入れます。ここでは、20人のアイドルがいるのでn=20です。例えば、検討したい商品が100個ならn=100ですし、広告の5個のクリエイティブならn=5です。

kには組み合わせの最大数を入れます。ここでは2:19までのパターンで分析したいの、k=2:19としています。

turf()は、1列目にID、2列目にweightを入れる必要があります。weightを考慮しない場合は、1を設定しておきます。計算結果はリストの形で返されます。

R
n_item <- ncol(df)-2
n_reach <- 2:19
list_turf <- turf(data = df,   # データ
                  n = n_item,  #アイテムの総数
                  k = n_reach) #組み合わせのリーチ数

アウトプットはこんな感じです。comboは組み合わせに振られた識別番号なので無視します。rchXはリーチの割合、frqXは重みをかけた際の値になります。数字列は、該当しているアイテムの組み合わせを表してます。

R
list_turf$turf[[1]][1:5,] # k=2
  combo rchX frqX 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1     1 0.64 0.83 1 1 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
2     2 0.57 0.62 1 0 1 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
3    20 0.54 0.63 0 1 1 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
4    21 0.49 0.54 0 1 0 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
5     3 0.47 0.53 1 0 0 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0

各組み合わせにおけるリーチが最大となる組み合わせを取り出して、リーチの飽和点を確認します。

R
list_df <- list()
for (i in 1:18) {
  list_df[[i]] <- list_turf$turf[[i]][1,]  
}

df_item2 <- 
map_dfr(list_df, bind_rows) %>% 
  select(-frqX, -combo) %>% 
  mutate(rch_n = rep(n_reach, each = 1),
         rchX = round(rchX, 4)) %>% 
  arrange(desc(rchX))

df_item2
   rchX 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 rch_n
1  0.78 1 1 1 1 0 0 0 1 0  1  0  0  0  0  0  0  1  0  0  0     7
2  0.78 1 1 1 1 1 0 0 1 0  1  0  0  0  0  0  0  1  0  0  0     8
3  0.78 1 1 1 1 1 0 1 1 0  1  0  0  0  0  0  0  1  0  0  0     9
4  0.78 1 1 1 1 1 0 1 1 0  1  1  0  0  0  0  0  1  0  0  0    10
5  0.78 1 1 1 1 1 0 1 1 0  1  1  0  0  0  1  0  1  0  0  0    11
6  0.78 1 1 1 1 1 0 1 1 0  1  1  0  0  0  1  0  1  1  0  0    12
7  0.78 1 1 1 1 1 0 1 1 0  1  1  1  0  0  1  0  1  1  0  0    13
8  0.78 1 1 1 1 1 0 1 1 0  1  1  1  1  0  1  0  1  1  0  0    14
9  0.78 1 1 1 1 1 0 1 1 0  1  1  1  1  0  1  1  1  1  0  0    15
10 0.78 1 1 1 1 1 0 1 1 0  1  1  1  1  0  1  1  1  1  0  1    16
11 0.78 1 1 1 1 1 0 1 1 0  1  1  1  1  0  1  1  1  1  1  1    17
12 0.78 1 1 1 1 1 1 1 1 0  1  1  1  1  0  1  1  1  1  1  1    18
13 0.78 1 1 1 1 1 1 1 1 1  1  1  1  1  0  1  1  1  1  1  1    19
14 0.77 1 1 1 1 0 0 0 1 0  1  0  0  0  0  0  0  0  0  0  0     6
15 0.76 1 1 1 1 0 0 0 1 0  0  0  0  0  0  0  0  0  0  0  0     5
16 0.75 1 1 1 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0     4
17 0.73 1 1 1 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0     3
18 0.64 1 1 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0     2

組み合わせとしては7人からはリーチは増加せず一定のようです。つまり、グループ人数を7人以上にしても、特にリーチが増えるわけでもないので、最低7人のグループであれば問題ないといえます。

R
ggplot(df_item2, aes(as.numeric(rch_n), rchX)) + 
  geom_line(size = 1) + geom_point(size = 3) + 
  geom_vline(xintercept = 7, col = "red", linetype="dashed") + 
  theme_classic() + 
  xlab("Number of Items") + 
  ylab("% of Reach") +
  scale_x_discrete(limits=c(2:19))

plot_zoom_png.png

また、その7人の組み合わせについて、上位5件を見てみたところ、0.78~0.77となっています。大きな差があるわけではないので、x1~x4,x8,x10は確定として、残り1人はx5,x17のどちらから、担当者が総合的に判断して決めればよいかと思います。

R
list_turf$turf[[6]][1:5,] # k=7
  combo rchX frqX 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1   292 0.78 1.21 1 1 1 1 0 0 0 1 0  1  0  0  0  0  0  0  1  0  0  0
2    29 0.77 1.27 1 1 1 1 1 0 0 1 0  1  0  0  0  0  0  0  0  0  0  0
3    36 0.77 1.26 1 1 1 1 1 0 0 1 0  0  0  0  0  0  0  0  1  0  0  0
4    57 0.77 1.26 1 1 1 1 1 0 0 0 0  1  0  0  0  0  0  0  1  0  0  0
5   198 0.77 1.23 1 1 1 1 0 0 1 1 0  1  0  0  0  0  0  0  0  0  0  0

まとめ

グループの人数は7人以上に増やしてもリーチは増えないこと、そして、メンバーは、x1~x4,x8,x10は確定として、残り1人はx5,x17のどちらかで良いことがわかりました。

単純に上位何人という取り方だと、リーチが最大にできない場合や適切な組み合わせを取れない場合もあるので、とりあえずTURF分析をやってみるのも良いかもしれません。

しかし、今回のデータは実は、列合計を計算するとこうなっています。x8,x10,x5,x17は実は100人中数名しかフラグが立っていません。

R
apply(df[,3:22], 2, sum)
x01 x02 x03 x04 x05 x06 x07 x08 x09 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 
 41  42  21  12   7   0   3   2   0   2   3   2   2   0   3   2   1   3   1   2 

TURF分析の計算上、リーチを最大化するため、このような組み合わせになってしまいます。分析結果を盲目的に信じるのは、分析結果は判断材料の1つとして、意思決定することが望まれます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away