このレポートはキャンプに関するマーケテイング施策の提案における分析のコードを取り上げている。 再現可能性のためにデータの読み込みや加工、分析までのコードを載せている。
結論は、関与の層ごとに「気軽にできるキャンプを提供する」ことで、 若者中心にキャンプブームを加速させることである。
*Rmarkdownで作成。
*使いやすさ、見やすさの観点からtidyverseパッケージを使用し、 関数にはパッケージ名をつけている。
若者(大学生中心)をターゲットに、キャンプに興味をもってもらい、 緩やかにキャンプブームを再燃させる。 また、今求められているキャンプの姿を把握し、クラスターごとにあったキャンプマーケティングを考える。
キャンプの定義:「自然環境のもとで、必要最小限の装備で生活したり宿泊したり活動したりすること(日本オートキャンプ協会)」とします。そのため、グランピングやコテージでの宿泊等を除きます。
出身地やキャンプ経験、キャンプに行かない理由やイメージ、また、 知っているアウトドアブランドなどを把握する。 キャンプに対する関心やポジティブ、ネガティブなイメージを知り、どうマーケティングするべきか考える。 いくつか仮説検定を実行し、マーケティング課題解決の客観的事実として取り扱う。
以下は、アンケートにより取得したデータである。 最初の6行だけ表示している。
camp_data <- read.csv("camp_data.csv")
head(camp_data)
## タイムスタンプ X1..性別
## 1 2025/06/10 13:31:41 女性
## 2 2025/06/10 13:32:38 女性
## 3 2025/06/10 13:34:21 女性
## 4 2025/06/10 13:34:27 女性
## 5 2025/06/10 13:34:52 女性
## 6 2025/06/10 13:35:08 男性
## X2.1..あなたの出身地は.次のうちどちらに該当しますか.
## 1 都会(人口が多く、商業施設やインフラが充実している地域)
## 2 都会(人口が多く、商業施設やインフラが充実している地域)
## 3 地方(自然が多く、比較的のどかな地域)
## 4 都会(人口が多く、商業施設やインフラが充実している地域)
## 5 地方(自然が多く、比較的のどかな地域)
## 6 地方(自然が多く、比較的のどかな地域)
## X2.2..あなたの出身地は.以下のどのような環境に近いと感じますか.
## 1 都市的(ビル・住宅・商業施設が多かった)
## 2 都市的(ビル・住宅・商業施設が多かった)
## 3 自然と都市のバランスが取れていた
## 4 都市的(ビル・住宅・商業施設が多かった)
## 5 自然と都市のバランスが取れていた
## 6 自然が多い(山・川・森などが身近だった)
## X3.1..キャンプ経験はありますか..キャンプの定義は最初に書いています.
## 1 いいえ
## 2 はい
## 3 いいえ
## 4 はい
## 5 いいえ
## 6 はい
## X3.2..キャンプ経験者に質問です.キャンプをする頻度はどれくらいですか.
## 1
## 2 年に1回以上
## 3
## 4 今はしていない
## 5
## 6 今はしていない
## X4.1..キャンプにどのくらい興味がありますか..1.まったく興味がない.2.興味がない.3.どちらでもない.4興味がある.5.とても興味がある
## 1 3
## 2 3
## 3 1
## 4 4
## 5 3
## 6 5
## X4.2..キャンプに対するイメージを教えてください...非日常を体験できて魅力的だ.
## 1 とても思う
## 2 思う
## 3 全く思わない
## 4 思う
## 5 とても思う
## 6 全く思わない
## X4.2..キャンプに対するイメージを教えてください...自然を感じ開放的だ.
## 1 とても思う
## 2 思う
## 3 思う
## 4 どちらでもない
## 5 とても思う
## 6 全く思わない
## X4.2..キャンプに対するイメージを教えてください...映える写真が撮れる.
## 1 とても思う
## 2 どちらでもない
## 3 全く思わない
## 4 どちらでもない
## 5 思う
## 6 全く思わない
## X4.2..キャンプに対するイメージを教えてください...お金がかかる.
## 1 とても思う
## 2 思う
## 3 思う
## 4 とても思う
## 5 思わない
## 6 全く思わない
## X4.2..キャンプに対するイメージを教えてください...準備など大変そう.
## 1 とても思う
## 2 思う
## 3 とても思う
## 4 とても思う
## 5 とても思う
## 6 全く思わない
## X4.2..キャンプに対するイメージを教えてください...初心者には難しい.
## 1 とても思う
## 2 思う
## 3 とても思う
## 4 とても思う
## 5 とても思う
## 6 全く思わない
## X4.2..キャンプに対するイメージを教えてください...快適ではなさそう.
## 1 とても思う
## 2 思う
## 3 とても思う
## 4 どちらでもない
## 5 思う
## 6 全く思わない
## X4.3..キャンプをしない.またはしにくい.理由として当てはまるものを選んでください..複数選択可.
## 1 道具がない, 女性は危険
## 2 虫が苦手
## 3 虫が苦手, 時間がない, インドア派
## 4 虫が苦手, 道具がない, 道具が高い, テント設営、火起こしなどが面倒
## 5 虫が苦手, 道具がない, 時間がない
## 6 道具が高い
## X4.5....もっと気軽に体験できるキャンプイベントがあれば.参加してみたいですか.
## 1 はい
## 2 はい
## 3 いいえ
## 4 いいえ
## 5 いいえ
## 6 はい
## X5..SNSやYouTubeなどでキャンプ関連の情報を見たことがありますか.
## 1 あまり見ない
## 2 あまり見ない
## 3 全く見ない
## 4 全く見ない
## 5 全く見ない
## 6 全く見ない
## X6.1...知っているアウトドアブランドを選んでください..複数選択可.
## 1 スノーピーク, ノースフェイス, コロンビア
## 2 モンベル, コールマン, スノーピーク, ノースフェイス, パタゴニア, コロンビア
## 3 モンベル, ノースフェイス
## 4 モンベル, コールマン, スノーピーク, ノースフェイス, コロンビア
## 5 ノースフェイス
## 6 モンベル, コールマン, ノースフェイス, パタゴニア, コロンビア
## X6.2...上記の問で回答したブランドイメージを簡単に教えてください...なしの方は.なし.と回答ください...例.スノーピーク.お高いイメージ...ノースフェイス.ファッションのイメージが強い
## 1 スノーピーク おしゃれなイメージ
## 2 ノースフェイス、スノーピークはキャンプ利用者はほとんど使っているイメージ、それ以外のイメージは特になし
## 3 わからない
## 4 高級そう
## 5 ノースフェイス ファッションのイメージが強い。アウトドア商品も多数販売している
## 6 なし
ここではデータの列を英語名に変換または、結果をダミー変数への変換を行っている。 基本は読み飛ばしてもらって構わない。
*renameは効率性の観点からcahtgptに作成してもらった。
camp_data <- camp_data |>
dplyr::select(!タイムスタンプ) |>
dplyr::rename(
gender = "X1..性別",
area_type = "X2.1..あなたの出身地は.次のうちどちらに該当しますか.",
environment = "X2.2..あなたの出身地は.以下のどのような環境に近いと感じますか.",
camp_experience = "X3.1..キャンプ経験はありますか..キャンプの定義は最初に書いています.",
camp_freq = "X3.2..キャンプ経験者に質問です.キャンプをする頻度はどれくらいですか.",
camp_interest = "X4.1..キャンプにどのくらい興味がありますか..1.まったく興味がない.2.興味がない.3.どちらでもない.4興味がある.5.とても興味がある",
image_unique = "X4.2..キャンプに対するイメージを教えてください...非日常を体験できて魅力的だ.",
image_open = "X4.2..キャンプに対するイメージを教えてください...自然を感じ開放的だ.",
image_photo = "X4.2..キャンプに対するイメージを教えてください...映える写真が撮れる.",
image_cost = "X4.2..キャンプに対するイメージを教えてください...お金がかかる.",
image_hard = "X4.2..キャンプに対するイメージを教えてください...準備など大変そう.",
image_difficult = "X4.2..キャンプに対するイメージを教えてください...初心者には難しい.",
image_uncomfortable = "X4.2..キャンプに対するイメージを教えてください...快適ではなさそう.",
reason_no_camp = "X4.3..キャンプをしない.またはしにくい.理由として当てはまるものを選んでください..複数選択可.",
sns_usage = "X5..SNSやYouTubeなどでキャンプ関連の情報を見たことがありますか.",
brands_known = "X6.1...知っているアウトドアブランドを選んでください..複数選択可.",
brands_image = "X6.2...上記の問で回答したブランドイメージを簡単に教えてください...なしの方は.なし.と回答ください...例.スノーピーク.お高いイメージ...ノースフェイス.ファッションのイメージが強い",
try_event = "X4.5....もっと気軽に体験できるキャンプイベントがあれば.参加してみたいですか."
)
camp_data <- camp_data |>
dplyr::mutate(
camp_experience_dummy = ifelse(camp_experience == "はい", 1, 0),
sns_usage_dummy = ifelse(sns_usage %in% c("よく見る", "時々見る"), 1, 0),
camp_freq_dummy = ifelse(camp_freq == "今はしていない", 1, 0)
)
仮説検定は2標本t検定を行い、出身が都会と地方で関心が異なるのか検証した。 結果は以下のとおりである。p値が有意水準5パーセント未満でないため仮説は有意であるとは言えなかった。
大学生を対象とすると、出身の違いではキャンプに対する関心は大きな差が無いことが分かった。
今回は、出身で分けたマーケテイング施策は考えないとする。
t.test(camp_interest ~ area_type, data = camp_data)
##
## Welch Two Sample t-test
##
## data: camp_interest by area_type
## t = -0.84496, df = 19.332, p-value = 0.4085
## alternative hypothesis: true difference in means between group 地方(自然が多く、比較的のどかな地域) and group 都会(人口が多く、商業施設やインフラが充実している地域) is not equal to 0
## 95 percent confidence interval:
## -1.2664553 0.5373913
## sample estimates:
## mean in group 地方(自然が多く、比較的のどかな地域)
## 3.428571
## mean in group 都会(人口が多く、商業施設やインフラが充実している地域)
## 3.793103
こちらの仮説も大きく差があると言えなかった。 これは質問の仕方が適切ではなかった可能性がある。
能動的に見ているか問いたかったが、質問の言い回しが受動的に見た場合も含まれてしまうものだった。
→「SNSやYouTubeなどでキャンプ関連の情報を見たことがありますか」 そのため、SNSの効果が無いとは言えない。SNSの効果は期待できるため、ターゲットを絞って活用していく。
t.test(camp_interest ~ sns_usage_dummy, data = camp_data)
##
## Welch Two Sample t-test
##
## data: camp_interest by sns_usage_dummy
## t = -1.3593, df = 36.708, p-value = 0.1824
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -1.2182170 0.2401468
## sample estimates:
## mean in group 0 mean in group 1
## 3.458333 3.947368
キャンプ未経験であることで興味をもつことも考えられたがこちらの仮説を検証した。 実際にp‐value=0.02288であり、統計的に有意であると言えた。 しかし、経験者の中で”今はしていない”という人が多いことが気になった。
以下ではこの点について分析する。
今はしていない”人の割合を調べると61.3%であった。 このことからほとんどの人が、昔にキャンプを行ったことがあり、趣味として行うわけではないと考えられる。 興味はあるが、すぐに行動に移せない原因や障壁があると考えられる。経験の有無でどういったイメージがあるのか、しない理由は何か、以下で分析していく。
t.test(camp_interest ~ camp_experience, camp_data)
##
## Welch Two Sample t-test
##
## data: camp_interest by camp_experience
## t = -2.5165, df = 16.024, p-value = 0.02288
## alternative hypothesis: true difference in means between group いいえ and group はい is not equal to 0
## 95 percent confidence interval:
## -1.9364094 -0.1657411
## sample estimates:
## mean in group いいえ mean in group はい
## 2.916667 3.967742
camp_data_experience <- camp_data |>
dplyr::filter(camp_experience_dummy == 1)
head(camp_data_experience)
## gender area_type
## 1 女性 都会(人口が多く、商業施設やインフラが充実している地域)
## 2 女性 都会(人口が多く、商業施設やインフラが充実している地域)
## 3 男性 地方(自然が多く、比較的のどかな地域)
## 4 男性 都会(人口が多く、商業施設やインフラが充実している地域)
## 5 男性 都会(人口が多く、商業施設やインフラが充実している地域)
## 6 男性 地方(自然が多く、比較的のどかな地域)
## environment camp_experience camp_freq
## 1 都市的(ビル・住宅・商業施設が多かった) はい 年に1回以上
## 2 都市的(ビル・住宅・商業施設が多かった) はい 今はしていない
## 3 自然が多い(山・川・森などが身近だった) はい 今はしていない
## 4 都市的(ビル・住宅・商業施設が多かった) はい 今はしていない
## 5 都市的(ビル・住宅・商業施設が多かった) はい 今はしていない
## 6 自然と都市のバランスが取れていた はい 今はしていない
## camp_interest image_unique image_open image_photo image_cost
## 1 3 思う 思う どちらでもない 思う
## 2 4 思う どちらでもない どちらでもない とても思う
## 3 5 全く思わない 全く思わない 全く思わない 全く思わない
## 4 3 思う 思う どちらでもない どちらでもない
## 5 3 思う とても思う 思う 思う
## 6 5 とても思う とても思う とても思う どちらでもない
## image_hard image_difficult image_uncomfortable
## 1 思う 思う 思う
## 2 とても思う とても思う どちらでもない
## 3 全く思わない 全く思わない 全く思わない
## 4 思う どちらでもない 思わない
## 5 とても思う 思う 思う
## 6 思う 思う 思わない
## reason_no_camp
## 1 虫が苦手
## 2 虫が苦手, 道具がない, 道具が高い, テント設営、火起こしなどが面倒
## 3 道具が高い
## 4 時間がない
## 5 虫が苦手, テント設営、火起こしなどが面倒, 時間がない
## 6 虫が苦手, キャンプをする時間がない(計画立てるのに時間かかりそうだし、、、)
## try_event sns_usage
## 1 はい あまり見ない
## 2 いいえ 全く見ない
## 3 はい 全く見ない
## 4 はい あまり見ない
## 5 はい あまり見ない
## 6 はい 時々見る
## brands_known
## 1 モンベル, コールマン, スノーピーク, ノースフェイス, パタゴニア, コロンビア
## 2 モンベル, コールマン, スノーピーク, ノースフェイス, コロンビア
## 3 モンベル, コールマン, ノースフェイス, パタゴニア, コロンビア
## 4 モンベル, コールマン, スノーピーク, ノースフェイス, パタゴニア, コロンビア
## 5 モンベル, コールマン, スノーピーク, ノースフェイス, パタゴニア, コロンビア
## 6 モンベル, ノースフェイス, パタゴニア
## brands_image
## 1 ノースフェイス、スノーピークはキャンプ利用者はほとんど使っているイメージ、それ以外のイメージは特になし
## 2 高級そう
## 3 なし
## 4 機能的
## 5 コールマン→万能で様々な商品を展開 スノーピーク・ノースフェイス・パタゴニア→高級路線 モンベル・コロンビア→あまり身近ではない
## 6 ノースフェイス:かっこいい パタゴニア:個性的 モンベル:モントベルと言ってしまいそうになる
## camp_experience_dummy sns_usage_dummy camp_freq_dummy
## 1 1 0 0
## 2 1 0 1
## 3 1 0 1
## 4 1 0 1
## 5 1 0 1
## 6 1 1 1
# ”今はしていない”人の割合を調べる”
camp_data_experience |>
dplyr::summarise(prop = mean(camp_freq == "今はしていない")) |>
dplyr::mutate(割合 = paste0("今はしていない割合:", round(prop * 100, 1), "%")) |>
dplyr::pull(割合)
## [1] "今はしていない割合:61.3%"
統計的に有意だと言えた。 つまり、未経験者は、経験者に比べネガティブなイメージを強くもちやすいと言える。
*イメージをポジティブ、ネガティブどちらも1~5に変換した。
*ポジティブ→image_unique, image_open, image_photo,
*ネガティブ→image_cost, image_hard, image_difficult, image_uncomfortable
# t.test
camp_data_image <- camp_data |>
dplyr::mutate(dplyr::across(
c(image_unique, image_open, image_photo, image_cost,
image_hard, image_difficult, image_uncomfortable),
~ dplyr::recode(
stringr::str_trim(as.character(.)),
"全く思わない" = 1,
"思わない" = 2,
"どちらでもない" = 3,
"思う" = 4,
"とても思う" = 5
),
.names = "{.col}"
)) |>
dplyr::mutate(dplyr::across(
c(image_unique, image_open, image_photo, image_cost,
image_hard, image_difficult, image_uncomfortable),
as.integer
))
camp_data_image <- camp_data_image |>
dplyr::mutate(image_score_neg = rowMeans(dplyr::across(
c(image_cost, image_hard, image_difficult, image_uncomfortable)))
)
t.test(image_score_neg ~ camp_experience, data = camp_data_image, var.equal = TRUE)
##
## Two Sample t-test
##
## data: image_score_neg by camp_experience
## t = 2.8763, df = 41, p-value = 0.006357
## alternative hypothesis: true difference in means between group いいえ and group はい is not equal to 0
## 95 percent confidence interval:
## 0.2039914 1.1656322
## sample estimates:
## mean in group いいえ mean in group はい
## 4.354167 3.669355
ここでは、ポジティブなイメージを1~5に、ネガティブなイメージを5~1に変換した。 つまり、合計が大きいほどポジティブなイメージをもっている言える。
仮説4の補強ということで、否定も言えるのか検証した。
この仮説も統計的に有意だと強く言うことができた。
実際に体験することで、未経験者が強く感じるネガティブなイメージが抑えられると言える。
ネガティブに感じている未経験者を、ひとまず体験させることがイメージ改善につながり、参入者が増加するだろう。
camp_data_image_2 <- camp_data_image |>
dplyr::mutate(dplyr::across(
c(image_cost, image_hard, image_difficult, image_uncomfortable),
~ 6 - .,
.names = "{.col}_rev"
))
camp_data_image_2 <- camp_data_image_2 |>
dplyr::mutate(image_score_avg = rowMeans(dplyr::across(
c(image_unique, image_open, image_photo,
image_cost_rev, image_hard_rev, image_difficult_rev, image_uncomfortable_rev)
), na.rm = TRUE))
t.test(image_score_avg ~ camp_experience, data = camp_data_image_2, var.equal = TRUE)
##
## Two Sample t-test
##
## data: image_score_avg by camp_experience
## t = -3.7181, df = 41, p-value = 0.0006013
## alternative hypothesis: true difference in means between group いいえ and group はい is not equal to 0
## 95 percent confidence interval:
## -0.9084785 -0.2689409
## sample estimates:
## mean in group いいえ mean in group はい
## 2.535714 3.124424
キャンプをしない理由が一つの列に含まれていたため、一つ一つ列に変換した。
未経験者と経験者のキャンプをしない理由トップ3を取り上げると、 双方ランクインしたものは同じだが、未経験の場合やはり道具がないことが一番の理由であった。経験者は虫を理由にしない、しにくいようである。それと同等に、道具が高いことを理由に挙げている。経験者ほど、どのようなギアが高いか把握しているからと考えられる。
# 項目ごと列に分解
camp_data_reason <- camp_data |>
dplyr::mutate(
reason_bug = ifelse(stringr::str_detect(reason_no_camp, "虫が苦手"), 1, 0),
reason_no_gear = ifelse(stringr::str_detect(reason_no_camp, "道具がない"), 1, 0),
reason_expensive = ifelse(stringr::str_detect(reason_no_camp, "道具が高い"), 1, 0),
reason_bother = ifelse(stringr::str_detect(reason_no_camp, "テント設営、火起こしなどが面倒"), 1, 0),
reason_no_time = ifelse(stringr::str_detect(reason_no_camp, "時間がない"), 1, 0),
reason_no_friend = ifelse(stringr::str_detect(reason_no_camp, "一緒に行く人がいない"), 1, 0),
reason_indoor = ifelse(stringr::str_detect(reason_no_camp, "インドア派"), 1, 0),
reason_other = ifelse(stringr::str_detect(reason_no_camp, "その他"), 1, 0)
) |>
dplyr::select(!reason_no_camp)
camp_data_reason <- camp_data_reason |>
dplyr::mutate(no_reason_sum = rowSums(dplyr::across(
c(reason_bug, reason_no_gear, reason_expensive, reason_bother, reason_no_time, reason_no_friend, reason_indoor, reason_other)
)))
reason_summary <- camp_data_reason |>
tidyr::pivot_longer(
cols = dplyr::starts_with("reason_"),
names_to = "reason",
values_to = "value"
) |>
dplyr::group_by(camp_experience, reason) |>
dplyr::summarise(count = sum(value), .groups = "drop")
# 日本語の列を作る
# 初めに日本語で列を作ればよかったが、縦長にする際、共通したreasonで始まっている方が都合がよかった。ここは改善の余地あり。
reason_summary <- reason_summary |>
dplyr::mutate(reason_jp = dplyr::case_when(
reason == "reason_bug" ~ "虫が苦手",
reason == "reason_no_gear" ~ "道具がない",
reason == "reason_expensive" ~ "道具が高い",
reason == "reason_bother" ~ "設営や火起こしが面倒",
reason == "reason_no_time" ~ "時間がない",
reason == "reason_no_friend" ~ "一緒に行く人がいない",
reason == "reason_indoor" ~ "インドア派",
reason == "reason_other" ~ "その他"
))
# 経験者のしない理由(円グラフ)
reason_exp <- reason_summary |>
dplyr::filter(camp_experience == "はい")
ggplot2::ggplot(reason_exp, ggplot2::aes(x = "", y = count, fill = reason_jp)) +
ggplot2::geom_col(width = 1) +
ggplot2::coord_polar(theta = "y") +
ggplot2::labs(title = "キャンプをしない理由(経験者)") +
ggplot2::theme_void()
# 未経験者のしない理由(円グラフ)
reason_noexp <- reason_summary |>
dplyr::filter(camp_experience == "いいえ")
ggplot2::ggplot(reason_noexp, ggplot2::aes(x = "", y = count, fill = reason_jp)) +
ggplot2::geom_col(width = 1) +
ggplot2::coord_polar(theta = "y") +
ggplot2::labs(title = "キャンプをしない理由(未経験者)") +
ggplot2::theme_void()
# 未経験者と経験者のキャンプをしない理由トップ3
top3_reasons <- reason_summary |>
dplyr::group_by(camp_experience) |>
dplyr::select(!reason) |>
dplyr::slice_max(order_by = count, n = 3)
print(top3_reasons)
## # A tibble: 6 × 3
## # Groups: camp_experience [2]
## camp_experience count reason_jp
## <chr> <dbl> <chr>
## 1 いいえ 9 道具がない
## 2 いいえ 7 虫が苦手
## 3 いいえ 6 道具が高い
## 4 はい 17 虫が苦手
## 5 はい 17 道具が高い
## 6 はい 12 道具がない
ここまでの分析から、「気軽にできるキャンプを提供する」ことで、経験者のリピートを促し、未経験者の体験の場を設けることができる。
以下では2つに分けて分析していく
具体的にどのようなサービスを提供するのか考えるため、ターゲット定める。そのために前半ではクラスター分析をし、気軽にできるキャンプをしたいと思っている人はクラスターごとにどの程度なのか把握する。
また、そういったサービスを提供するには顧客のブランドに対する認知を理解しなければならない。後半では、どのブランドが最も認知され、どういったイメージを顧客はもっているのか見ていく。
キャンプへの関心、しない理由、SNSで情報を得るかどうか、3つの要素で2つのクラスターに分け、気軽なキャンプに行きたいと思っているか分析した。
クラスター2は、1と比べてキャンプへの関心が高い。また、しない理由が少なく、SNSで情報を見ている割合が高いグループであると分かる。気軽なキャンプをしたい割合は、それぞれのクラスタ-ごとに45%、88%という結果となった。
χ二乗検定も行い、クラスター間で気軽なキャンプへの意欲に差があるということが統計的に有意だと言えた。
クラスター1を関与が低い層、クラスター2を関与が高い層として区別する。 それぞれに合ったマーケテイング施策を考えていく。
# クラスター構築
camp_data_cluster <- camp_data_reason |>
dplyr::select(camp_interest, no_reason_sum, sns_usage_dummy)
set.seed(123)
kmeans_result <- stats::kmeans(scale(camp_data_cluster), centers = 2)
camp_data_reason$cluster <- as.factor(kmeans_result$cluster)
table(camp_data_reason$cluster, camp_data_reason$try_event)
##
## いいえ はい
## 1 6 5
## 2 4 28
camp_data_cluster$cluster <- kmeans_result$cluster
# クラスター要約
camp_cluster_summary <- camp_data_cluster |>
dplyr::mutate(cluster = as.factor(kmeans_result$cluster)) |>
dplyr::group_by(cluster) |>
dplyr::summarise(
avg_interest = round(mean(camp_interest), 2),
avg_reason = round(mean(no_reason_sum), 2),
avg_sns = round(mean(sns_usage_dummy), 2)
)
print(camp_cluster_summary)
## # A tibble: 2 × 4
## cluster avg_interest avg_reason avg_sns
## <fct> <dbl> <dbl> <dbl>
## 1 1 2.09 3.36 0.27
## 2 2 4.22 2.22 0.5
# それぞれのクラスターごとの”はい”の割合
camp_data_reason |>
dplyr::group_by(cluster) |>
dplyr::summarise(
total = dplyr::n(),
yes_count = sum(try_event == "はい"),
yes_ratio = round(yes_count / total, 2)
)
## # A tibble: 2 × 4
## cluster total yes_count yes_ratio
## <fct> <int> <int> <dbl>
## 1 1 11 5 0.45
## 2 2 32 28 0.88
# χ二乗検定
# 仮説:クラスター間で気軽なキャンプへの意欲に差がある
chisq.test(table(camp_data_reason$cluster, camp_data_reason$try_event))
## Warning in chisq.test(table(camp_data_reason$cluster,
## camp_data_reason$try_event)): Chi-squared approximation may be incorrect
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(camp_data_reason$cluster, camp_data_reason$try_event)
## X-squared = 5.9237, df = 1, p-value = 0.01494
キャンプへの関心を知るには、アウトドアブランドへの認知がどのようなものか知ることが大切である。
ここでは、どんなイメージをもっているのか調べる。
始めに、何らかのブランドにファッションやリュックのイメージがある人について見ていく。そこでこういった仮説を考える、
仮説:彼らはSNS上のファッション寄りな投稿から影響を受けている
χ二乗検定を行ったが、有意であると言えなかった。
# 各ブランドを1,0で表記し列ごと並べる
camp_data_brands <- camp_data |>
dplyr::mutate(
montbell = ifelse(str_detect(brands_known, "モンベル"), 1, 0),
coleman = ifelse(str_detect(brands_known, "コールマン"), 1, 0),
snowpeak = ifelse(str_detect(brands_known, "スノーピーク"), 1, 0),
northface = ifelse(str_detect(brands_known, "ノースフェイス"), 1, 0),
patagonia = ifelse(str_detect(brands_known, "パタゴニア"), 1, 0),
columbia = ifelse(str_detect(brands_known, "コロンビア"), 1, 0),
captainstag = ifelse(str_detect(brands_known, "キャプテンスタッグ"), 1, 0),
nothing = ifelse(str_detect(brands_known, "なし"), 1, 0)
)
# ブランドイメージの中に”ファッション”や”リュック”の単語がある人を1とする。
camp_data_brands <- camp_data_brands |>
dplyr::mutate(fashion_image_dummy = ifelse(
stringr::str_detect(brands_image, "ファッション|リュック"),
1, 0
))
# χ二乗検定
table_result <- table(camp_data_brands$fashion_image_dummy, camp_data_brands$sns_usage_dummy)
chisq.test(table_result)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_result
## X-squared = 2.2637, df = 1, p-value = 0.1324
まず、多くの人に認知されているブランドが何か把握する。
結果、上位3つはノースフェイス、モンベル、コールマンであった。それぞれのイメージをキーワードに従って抽出する。
ノースフェイスはデザイン性のイメージが強いようだ。ファッションやリュックで見ると認識している人は少なくなかった。
機能性、コスパの面ではモンベルが強い。
コールマンは折りたたみイス、ランタンのイメージがあると回答する人がいた。一般的なキャンプギアというイメージがあるようだ。
適切なキーワード選定はchatgptがとても役に立った。 人によって表記が違うため、必ずしも正確とは言えない。
# ブランド数
brand_counts <- camp_data_brands |>
dplyr::summarise(
モンベル = sum(montbell),
コールマン = sum(coleman),
スノーピーク = sum(snowpeak),
ノースフェイス = sum(northface),
パタゴニア = sum(patagonia),
コロンビア = sum(columbia),
キャプテンスタッグ = sum(captainstag)
) |>
tidyr::pivot_longer(cols = dplyr::everything(), names_to = "brand", values_to = "count") |>
dplyr::arrange(desc(count))
print(brand_counts)
## # A tibble: 7 × 2
## brand count
## <chr> <dbl>
## 1 ノースフェイス 37
## 2 モンベル 32
## 3 コールマン 29
## 4 パタゴニア 28
## 5 コロンビア 27
## 6 スノーピーク 19
## 7 キャプテンスタッグ 4
ggplot2::ggplot(brand_counts, ggplot2::aes(x = reorder(brand, count), y = count)) +
ggplot2::geom_col(fill = "skyblue") +
ggplot2::geom_text(ggplot2::aes(label = paste0(count)),
hjust = -0.1, size = 4) +
ggplot2::coord_flip() +
ggplot2::labs(title = "アウトドアブランドの認知数",
x = "ブランド名",
y = "認知数") +
ggplot2::theme_minimal()
# ブランドごとのイメージ抽出
brand_patterns <- list(
"モンベル" = "モンベル|モントベル",
"コールマン" = "コールマン",
"ノースフェイス" = "ノースフェイス|ノースフェース|ノース"
)
classified_long <- purrr::map_dfr(names(brand_patterns), function(brand_name) {
pattern <- brand_patterns[[brand_name]]
dplyr::filter(camp_data_brands, stringr::str_detect(brands_image, stringr::regex(pattern, ignore_case = TRUE))) |>
dplyr::mutate(brand = brand_name)
})
classified_long <- dplyr::mutate(classified_long,
image_type = dplyr::case_when(
stringr::str_detect(brands_image, "おしゃれ|かっこいい|ファッション|リュック|かばん|カバン|カジュアル") ~ "デザイン性",
stringr::str_detect(brands_image, "性能|機能|丈夫|使いやすい|広く展開|ギア|アパレル|品質|しっかり") ~ "機能性",
stringr::str_detect(brands_image, "高い|高級|コスパ|安い|価格|リーズナブル|バランス") ~ "価格・コスパ",
stringr::str_detect(brands_image, "持ってる|使ってる|親|家族|兄弟|見かける|使っている") ~ "利用経験",
stringr::str_detect(brands_image, "知っている|聞いたことある|名前|有名") ~ "知名度・認知",
stringr::str_detect(brands_image, "キャンプ|テント|寝具|ランタン|用品|マグ|椅子|アウトドア") ~ "キャンプ用途",
stringr::str_detect(brands_image, "なし|わからない|特にない|初めて知った|記憶ない") ~ "イメージなし",
TRUE ~ "その他"
)
)
dplyr::count(classified_long, brand, image_type) |>
tidyr::pivot_wider(names_from = image_type, values_from = n, values_fill = 0)
## # A tibble: 3 × 6
## brand デザイン性 `価格・コスパ` 機能性 その他 利用経験
## <chr> <int> <int> <int> <int> <int>
## 1 コールマン 4 1 2 0 0
## 2 ノースフェイス 10 1 2 1 2
## 3 モンベル 6 3 3 1 1
以上、様々な仮説検定と分析を行ってきた。分析結果をまとめる。
前提として、ターゲットは若者(大学生中心)である。
経験者であるならばキャンプに興味があると言えたが、”今していない”人が一定数見られた。子供のころに林間学校や家族に連れられて経験したと考えられる。そこで、今キャンプをしない何か理由や障壁があるのでは、といった疑問をもった。未経験者も含め、キャンプに対するイメージとしない理由を分析すれば、疑問を解決できると考え仮説を検証した。
未経験者であるとキャンプに対してネガティブなイメージをもち、経験者であるとポジティブなイメージをもつと強く言うことができた。経験することによって、未経験者が一般に感じる不安が改善されるのだ。 次に未経験者と経験者のキャンプをしない理由を分析した。双方ともギアの有無や金額、虫が嫌いだという理由が多かった。
このような結果から、「気軽にできるキャンプを提供する」ことをマーケティング課題解決の施策として挙げる。経験者を再参入させることができ、未経験者には体験させることでイメージ改善にもつながる。 ”気軽にできる”というのは、安価なコストでギアをレンタルでき、必要があればインストラクターが指導してくれる、交通の便が良いなどである。
より具体的にするために、ある2つのクラスターに分け、気軽なキャンプへ参加したいと思っている人の割合を見た。関与が高い層では9割近い人が、低い層では5割弱が参加意欲を示した。
高い層は「集団」や「カップル」、「ソロ」といったスタイルごとに細分化し、それぞれにあったサービスを提供する。なぜなら既に関心があるため、細分化して個々のニーズに応えることで顧客の満足が得られると考えたためである。例えば、「集団」向けには大きな区画やギアを用意し、「カップル」や「ソロ」向けには静かな区画を提供する。
低い層は、インフルエンサーや有名なアウトドアブランドとのコラボにより関心を引くことが必要だ。そこで、ブランドの認知やイメージを把握した。ファッションのイメージが強いノースフェイスや機能性・コスパがよいモンベル、一般のギアのイメージが強いコールマンといったものが分析から分かった。この三つのブランドのいずれかとコラボしたキャンプ場で、その製品のギアが利用できるようにするなどが考えられる。また、低い層は特に未経験者が多いと考えられるため、インストラクターを交えたアウトドア勉強会のようなイベントを企画する。
他の方法として、キャンプ飯やアウトドアアクティビティをインセンティブに関心を持ってもらうことも考えられる。大学生を中心とした若者はSNSの活用に長けているため、参入させてしまえば間接的に広告することができ他の層への波及効果も期待できる。そのように連鎖的にキャンプへの関心を引き、イメージを改善することで緩やかにキャンプブームが再燃するだろう。
クラスター数の決定
・エルボー法 曲がっている点に注目 2
・シルエット法 平均シルエット幅最大値に注目 2,3,5,10
二つの方法と分析のしやすさからクラスター数2を採用
# エルボー法
wss <- numeric(10)
for (k in 1:10) {
set.seed(123)
wss[k] <- stats::kmeans(scale(camp_data_cluster), centers = k)$tot.withinss
}
elbow_data <- data.frame(
クラスター数 = 1:10,
WSS = wss
)
ggplot2::ggplot(elbow_data, ggplot2::aes(x = クラスター数, y = WSS)) +
ggplot2::geom_point() +
ggplot2::geom_line() +
ggplot2::labs(title = "エルボー法による適切なクラスター数の検討",
x = "クラスター数",
y = "クラスター内変動(WSS)") +
theme_minimal()
# シルエット法
silhouette_width <- numeric(10)
for (k in 2:10) {
km <- stats::kmeans(scale(camp_data_cluster), centers = k)
ss <- cluster::silhouette(km$cluster, stats::dist(scale(camp_data_cluster)))
silhouette_width[k] <- mean(ss[, 3])
}
silhouette_data <- data.frame(
クラスター数 = 2:10,
平均シルエット幅 = silhouette_width[2:10]
)
ggplot2::ggplot(silhouette_data, ggplot2::aes(x = クラスター数, y = 平均シルエット幅)) +
ggplot2::geom_point() +
ggplot2::geom_line() +
ggplot2::labs(title = "シルエット法による適切なクラスター数の検討",
x = "クラスター数",
y = "平均シルエット幅") +
theme_minimal()