set.seed(456)
survey_periods <- c("2023Q1", "2023Q2", "2023Q3", "2023Q4")
create_survey_data <- function(period) {
tibble(
period = period,
respondent_id = 1:500,
age_group = sample(c("20代", "30代", "40代", "50代", "60代以上"),
500, replace = TRUE),
service_satisfaction = sample(c("非常に不満", "不満", "普通", "満足", "非常に満足"),
500, replace = TRUE,
prob = c(0.05, 0.1, 0.25, 0.45, 0.15)),
price_satisfaction = sample(c("高すぎる", "やや高い", "適正", "やや安い", "安い"),
500, replace = TRUE,
prob = c(0.15, 0.25, 0.4, 0.15, 0.05)),
recommendation = sample(c("全く推奨しない", "推奨しない", "どちらでもない",
"推奨する", "強く推奨する"),
500, replace = TRUE,
prob = c(0.05, 0.1, 0.2, 0.5, 0.15))
)
}
all_survey_data <- map_dfr(survey_periods, create_survey_data)
all_survey_data <- all_survey_data %>%
mutate(
age_group = fct_relevel(age_group, "20代", "30代", "40代", "50代", "60代以上"),
service_satisfaction = fct_relevel(service_satisfaction,
"非常に不満", "不満", "普通", "満足", "非常に満足"),
price_satisfaction = fct_relevel(price_satisfaction,
"高すぎる", "やや高い", "適正", "やや安い", "安い"),
recommendation = fct_relevel(recommendation,
"全く推奨しない", "推奨しない", "どちらでもない",
"推奨する", "強く推奨する")
)
period_age_analysis <- all_survey_data %>%
group_by(period, age_group) %>%
nest() %>%
mutate(
analysis = map(data, ~ {
list(
service_pos_rate = mean(.x$service_satisfaction %in% c("満足", "非常に満足")),
price_acceptable_rate = mean(.x$price_satisfaction %in% c("適正", "やや安い", "安い")),
recommendation_rate = mean(.x$recommendation %in% c("推奨する", "強く推奨する")),
sample_size = nrow(.x)
)
})
)
detailed_analysis <- period_age_analysis %>%
mutate(
service_pos_rate = map_dbl(analysis, ~ .x$service_pos_rate),
price_acceptable_rate = map_dbl(analysis, ~ .x$price_acceptable_rate),
recommendation_rate = map_dbl(analysis, ~ .x$recommendation_rate),
sample_size = map_dbl(analysis, ~ .x$sample_size)
) %>%
select(-data, -analysis) %>%
arrange(period, age_group)
print(detailed_analysis)
satisfaction_scores <- all_survey_data %>%
group_by(period) %>%
nest() %>%
mutate(
overall_score = map_dbl(data, ~ {
service_score <- mean(as.numeric(.x$service_satisfaction))
price_score <- mean(as.numeric(.x$price_satisfaction))
recommendation_score <- mean(as.numeric(.x$recommendation))
(service_score + price_score + recommendation_score) / 3
})
) %>%
select(period, overall_score)
print(satisfaction_scores)