Tips: 点击每个section右上角的
code
即可选择全部默认显示代码
# rm(list = ls())
# setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
# setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
source("FUNCS.R")
source("FUNCS_plotly.R")
source("FUNCS_ggplot2.R")
#library(esquisse)
if(!require("corrplot")) install.packages("corrplot") # used for making correlation plot.
if(!require("psych")) install.packages("psych") # used for Factor Analysis
if(!require("car")) install.packages("car") # used for calculating VIF, to check multicollinearity
if(!require("factoextra")) install.packages("factoextra") # clustering algorithms & visualization
if(!require("xtable")) install.packages("xtable") # show regression table
if(!require("nFactors")) install.packages("nFactors")
replace_na <- tidyr::replace_na
renew_data <- function(){
read_excel("data/2021_04_29_02_11_56.xlsx") %>% slice(2:n()) %>% mutate_all(~ifelse(is.na(.x), "-",.x))}
#### 数据导入 ####
factor_to_int <- function(x) as.numeric(as.character(x))
# 知识
knowledge_raw = rev(c(
"非常了解",
"比较了解",
"只了解些大概",
"只是听过,不了解",
"没怎么听过,不了解",
"完全不了解也没听过"))
knowledge_value = 0:5
encode_knowledge <- function(x){
factor_to_int(
factor(x,
levels = knowledge_raw,
labels = knowledge_value))
}
decode_knowledge <- function(x){
factor(x,
levels = knowledge_value,
labels = knowledge_raw)
}
# 买车类型
cartype_raw = c(
"传统车(汽油车、柴油车及非充电的油电混合车等)",
"新能源车:插电式混合动力车纯电动车",
"新能源车:纯电动车",
"其他新能源车")
cartype_value = c(
"传统车",
"混动车",
"纯电车",
"其他新能源车"
)
encode_cartype <- function(x){
factor(x,
levels = cartype_raw,
labels = cartype_value)
}
# 买车间隔
buygap_raw = c(
"1个月或1个月内",
"1个月(不含)~3个月(含)",
"3个月(不含)~6个月(含)",
"6个月(不含)~1年(含)",
"1年(不含)~2年(含)",
"2年(不含)~3年(含)",
"3年(不含)~5年(含)",
"5年(不含)~7年(含)",
"7年内都没有买车打算,原因是:")
buygap_value = c(
0.5,
2,
4.5,
9,
12+6,
12*2+6,
12*4,
6*12,
7*12
)
buygap_string = c(
"1个月或1个月内",
"1~3个月",
"6个月~1年",
"1~2年",
"2~3年",
"3~5年",
"5~7年",
"7年内都没有买车打算")
encode_buygap <- function(x){
factor_to_int(
factor(x,
levels = buygap_raw,
labels = buygap_value))
}
decode_buygap <- function(x){
factor(x,
levels = buygap_value,
labels = buygap_string)
}
# 买车预算
budget_raw = c(
"-",
"<10万",
">=10万且<15万",
">=15万且<20万",
">=20万且<30万",
">=30万且<40万",
">=40万且<50万",
">=50万且<60万",
">=60万")
budget_value = c(
0,
5,
12.5,
17.5,
25,
35,
45,
55,
65
) * 10000
encode_budget <- function(x){
factor_to_int(
factor(x,
levels = budget_raw,
labels = budget_value))
}
decode_budget <- function(x){
factor(x,
levels = budget_value,
labels = budget_raw)
}
# 同意程度
agree_raw = rev(c(
"完全同意",
"同意",
"有些同意",
"认为无差异",
"有些不同意",
"不同意",
"完全不同意"))
agree_value = rev(c(
3,
2,
1,
0,
-1,
-2,
-3
))
encode_agree <- function(x){
factor_to_int(
factor(x,
levels = agree_raw,
labels = agree_value))
}
decode_agree <- function(x){
factor(x,
levels = agree_value,
labels = agree_raw)
}
# 资讯获取主动度
check_raw = rev(c(
"会时不时地主动了解",
"基本不会主动了解,但有资讯推送时会经常查看",
"基本不会主动了解,但有资讯推送时会偶尔会点开看",
"不会主动了解、收到推送也会忽略"))
check_value = 0:3
encode_check <- function(x){
factor_to_int(
factor(x,
levels = check_raw,
labels = check_value))
}
decode_check <- function(x){
factor(x,
levels = check_value,
labels = check_raw)
}
设计的问卷题目一共40题,问卷样例请见 credamo问卷链接
其中涉及的5类值标签通过以下字典转换为数值(interval / ordinal):
data <- read_excel("data/2021_04_29_02_11_56.xlsx") %>%
slice(2:n()) %>%
# 标记NA
dplyr::mutate_all(~ifelse(is.na(.x), "-",.x))
read_excel("data/EVCars_6个部分全部.xlsx",sheet=2) -> temp
temp %>% filter(!is.na(类型)) %>%
select(1,3,2) %>%
get_DT(pageLength = 10)
清洗后的数据 呈现如下:
如果想了解具体的清洗步骤,可以点击右侧的Code👉
data %>%
# 批量改一下列名
rename_at(vars(`您在考虑是否买新能源车时,以下因素中对您起关键决定性作用的五个(以最重要的因素开始选择)-获取牌照的难度`:`您在考虑是否买新能源车时,以下因素中对您起关键决定性作用的五个(以最重要的因素开始选择)-售后服务`),
~paste0(gsub("您在考虑是否买新能源车时,以下因素中对您起关键决定性作用的五个(以最重要的因素开始选择)-|(耐久度等)|的","",.x), "重要性")) %>%
transmute(
作答ID,
了解程度 = encode_knowledge(您对新能源车的了解程度),
#了解程度标签 = decode_knowledge(了解程度),
拥车辆 = as.integer(gsub("台", "", `您的家庭当前拥有多少台车`)), # 问卷问了34 但是只有012
# 第1台车的情况
第一台车类型 = case_when(
拥车辆 == 1 ~`您的家庭当前拥有的车的具体情况(<p> </p>-车辆类型)`,
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第一台-车辆类型)`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第一台-车辆类型)`
),
第一台车购买场景 = case_when(
拥车辆 == 1 ~`您的家庭当前拥有的车的具体情况(<p> </p>-购买场景)`,
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第一台-购买场景)`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第一台-购买场景)`
),
第一台车汽车单价 = case_when(
拥车辆 == 1 ~`您的家庭当前拥有的车的具体情况(<p> </p>-汽车单价)`,
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第一台-汽车单价)`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第一台-汽车单价)`
),
第一台车购车年份 = case_when(
拥车辆 == 1 ~`您的家庭当前拥有的车的具体情况(<p> </p>-购车年份(4位))`,
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第一台-购车年份(4位))`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第一台-购车年份(4位))`
),
# 第2台车的情况
第二台车类型 = case_when(
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第二台-车辆类型)`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第二台-车辆类型)`
),
第二台车购买场景 = case_when(
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第二台-购买场景)`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第二台-购买场景)`
),
第二台车汽车单价 = case_when(
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第二台-汽车单价)`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第二台-汽车单价)`
),
第二台车购车年份 = case_when(
拥车辆 == 2 ~`您的家庭当前拥有的2台车的具体情况(第二台-购车年份(4位))`,
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第二台-购车年份(4位))`
),
# 第3台车的情况
第三台车类型 = case_when(
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第三台-车辆类型)`
),
第三台车购买场景 = case_when(
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第三台-购买场景)`
),
第三台车汽车单价 = case_when(
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第三台-汽车单价)`
),
第三台车购车年份 = case_when(
拥车辆 == 3 ~`您的家庭当前拥有的3台车的具体情况(第三台-购车年份(4位))`
),
下次买车间隔月数 = encode_buygap(`您的家庭计划在多久后买第一台车(或下一台车):`),
下次买车预算 = encode_budget(`您的家庭计划买第一台车(或下一台车)的预算大概是:单位:人民币 元`),
买新能源车概率 = case_when(
下次买车间隔月数 == 7*12 ~ `如果未来有开车的需求和充足的预算,您有多大概率会买新能源车-买新能源车的概率(%)`,
下次买车间隔月数 != 7*12 ~ `您的家庭第一台车(或下一台车)多大概率会买新能源车-买新能源车的概率(%)`
),
买新能源车概率 = as.numeric(买新能源车概率) / 100,
下台车购买计划 = case_when(
买新能源车概率 <= 0.33 ~ "买传统车",
买新能源车概率 >= 0.66 ~ "买新能源车",
T ~ "不确定"
),
获取牌照难度重要性,充电体验重要性,续航里程重要性,汽车价格重要性,后续维修保养开销重要性,车辆保值情况重要性,车辆质量重要性,外观重要性,环保重要性,补贴或免税政策重要性,品牌形象重要性,车辆驾驶性能重要性,车辆乘坐体验重要性,售前服务重要性,售后服务重要性
) %>%
# 数据清洗
mutate_at(c("第一台车购车年份","第二台车购车年份","第三台车购车年份"),
~as.numeric(gsub("年","",.x))) %>%
mutate_at(c("第一台车类型","第二台车类型","第三台车类型"),
~encode_cartype(.x)) %>%
mutate_at(vars(获取牌照难度重要性:售后服务重要性),
~ifelse(is.na(.x) | .x == "-", 6, as.numeric(.x))) %>%
fillna_at(vars(获取牌照难度重要性:售后服务重要性),1) -> data_part_1
# 买车综合情况
temp = list()
for(col in c("第一台","第二台","第三台")){
data_part_1 %>%
select(作答ID,
contains(paste0(col,"车类型")),
contains(paste0(col,"车汽车单价")),
contains(paste0(col, "车购车年份"))) %>%
set_colnames(c("作答ID", "车辆类型", "车辆单价", "购车年份"))-> temp[[col]]
}
bind_rows(temp) %>%
filter_at(2:ncol(.), all_vars(!is.na(.))) -> car_info
# 提取车价信息
car_info %>%
group_by(作答ID) %>%
filter(购车年份 == max(购车年份)) %>%
mutate_at("车辆单价", ~ifelse(.x == "60万元以上", ">=60万", .x)) %>%
transmute(最后一台车单价 = encode_budget(车辆单价),
距上次买车 = 2021 - 购车年份) %>%
left_join(data_part_1 %>% select(作答ID),.) %>%
fillna_at("最后一台车单价", 0) %>%
ungroup %>%
mutate(距上次买车 = replace_na(距上次买车, max(距上次买车, na.rm=T))) -> last_car_info
data_part_1 %<>% left_join(last_car_info)
data_part_1 %>%
keep(is.numeric) %>%
gather() %>%
ggplot(aes(value)) +
facet_wrap(~ key, scales = "free") +
geom_histogram() + ppt_text -> p
ggplotly(p)
data_part_1 %>% get_DT()
如果想了解具体的清洗步骤,可以点击右侧的Code👉
data %>%
# 批量改一下列名
rename_at(vars(`与相比传统车相比,下列对新能源车的说法您的感受是?-新能源汽车的外观设计更符合我的偏好`:`与相比传统车相比,下列对新能源车的说法您的感受是?-电动汽车电池老化快`),
~gsub("与相比传统车相比,下列对新能源车的说法您的感受是?-","",.x)) %>%
#select_at(vars(新能源汽车的外观设计更符合我的偏好:电动汽车电池老化快)) %>%
#colnames() -> temp; paste0(temp,collapse = "`,`")
transmute(
作答ID,
`新能源汽车的外观设计更符合我的偏好`,
`新能源汽车有更先进的驾驶功能(自动驾驶及辅助驾驶等)`,`新能源汽车的人机交互系统体验更好`,`新能源汽车的安全性能(耐环境性、误操作防护及事故保护等)更好`,`新能源汽车的质量(零件不易损坏等)更好`,`新能源汽车的车内噪声更低`,`新能源汽车驾驶及乘坐舒适度更好(如更平稳等)`,`新能源汽车的起步加速更快`,`目前新能源车的续航不足`,`电动汽车充电不方便(如公共充电桩太少、家用充电桩不容易装等)`,`电动汽车电池老化快`
) %>%
mutate_at(2:ncol(.), ~encode_agree(ifelse(.x == "一般", "认为无差异", .x))) %>%
left_join(
data %>%
transmute(
作答ID,
预期百公里加速 = as.numeric(`如果买新能源汽车,符合您要求的车至少要达到的百公里加速百公里加速指的是0到100km/h加速时间,是对汽车动力最直观的一种体现。比如,特斯拉Model 3为5.35秒、小鹏P7为6.63秒-<p> </p>`
))) -> data_part_2
data_part_2 %>% get_DT()
如果想了解具体的清洗步骤,可以点击右侧的Code👉
data %>%
transmute(
作答ID,
续航里程要求 = `如果买新能源汽车,符合您要求的车至少要达到的续航里程-<p> </p>`,
家用充电桩充电时间要求 = `如果购买了电动汽车,您使用家用充电桩时,最长能够接受的充电时间-<p> </p>`,
公共充电桩充电时间要求 = `如果购买了电动汽车,您外出使用公共充电桩时,最长能够接受的充电时间(不含来回时间)-<p> </p>`,
充电路程时间要求 = `如果购买了电动汽车,您最长能够接受多少分钟的车程内有充电桩?0分钟表示:必须有条件装家用充电桩才会考虑买电动车-<p> </p>`) %>%
as.numeric_at(2:5) -> data_part_3
data_part_3 %>% get_DT()
如果想了解具体的清洗步骤,可以点击右侧的Code👉
data %>%
group_by(作答ID) %>%
select_at(vars(`如果购买新能源车,以下品牌您会更倾向于-比亚迪(BYD)`:`如果购买新能源车,以下品牌您会更倾向于-大众`)) %>%
rename_at(vars(`如果购买新能源车,以下品牌您会更倾向于-比亚迪(BYD)`:`如果购买新能源车,以下品牌您会更倾向于-大众`),
~paste0(
"倾向",
gsub("如果购买新能源车,以下品牌您会更倾向于-","",.x))) %>%
select(-倾向长城欧拉) -> data_part_4_brand
data %>%
group_by(作答ID) %>%
transmute(
新能源车意愿价位 = factor(`您能接受的新能源汽车价位?单位:人民币 元` ,
level = c("<10万",
">=10万且<15万",
">=15万且<20万",
">=20万且<30万",
">=30万且<40万",
">=40万且<50万",
">=50万且<60万",
">=60万")),
新能源车意愿溢价 = as.numeric(`相比传统车,您愿意为新能源车付出的溢价是-<p> </p>`),
汽车意愿年均使用成本 = as.numeric(`您能接受的汽车每年平均的使用费用(平均维修、保养)-<p> </p>`),
汽车意愿五年折价率 = as.numeric(`您能接受的汽车在买入5年后的保值率(5年后的二手价能保持在新车原价的多少)-<p> </p>`) / 100
) -> data_part_4_price
target = vars(`与相比传统车相比,下列对新能源车的说法您的感受是?-新能源汽车购买时会享有更多政府优惠补贴 或 购置税减免政策政策`:`与相比传统车相比,下列对新能源车的说法您的感受是?-新能源汽车维修保养的开销更大`)
data %>%
group_by(作答ID) %>%
transmute_at(target,
encode_agree) %>%
rename_at(target,
~paste0(
"",
gsub("与相比传统车相比,下列对新能源车的说法您的感受是?-新能源汽车|的|[[:space:]]","",.x))) -> data_part_4_policy
data_part_4_brand %>%
left_join(data_part_4_price) %>%
left_join(data_part_4_policy) -> data_part_4
data_part_4 %>% get_DT()
如果想了解具体的清洗步骤,可以点击右侧的Code👉
target = vars(
`与相比传统车相比,下列对新能源车的说法您的感受是?-新能源汽车上牌更容易`:
`与相比传统车相比,下列对新能源车的说法您的感受是?-新能源汽车更加环保`)
pre_text = "与相比传统车相比,下列对新能源车的说法您的感受是?-"
data %>%
group_by(作答ID) %>%
transmute_at(target, ~encode_agree(ifelse(.x == "一般", "认为无差异", .x))) %>%
rename_at(target,
~paste0(
"",
gsub(pre_text,"",.x))) %>%
left_join(
data %>%
group_by(作答ID) %>%
transmute(日常通勤来回路程 = as.numeric(`您日常平均每天出行的里程(来回)?-<p> </p>`)),.) -> data_part_5
data_part_5 %>% get_DT()
如果想了解具体的清洗步骤,可以点击右侧的Code👉
data = renew_data()
data %>%
group_by(作答ID) %>%
transmute(
性别 = 您的性别,
年龄 = 2021 - as.numeric(`您的出生年份(4位)`),
婚姻状况 = 您当前的婚姻状况,
家庭成员数 = as.numeric(gsub("人|及以上", "",`您共同生活的家庭成员的人数(包括自己)`)),
学历 = 您的最高学历,
所在地 = 您目前生活的城市,
家庭月收入 = as.numeric(`您家庭大致的每月平均收入(万元人民币)-<p> </p>`)*10000,
职业 = ifelse(您的主职业 == "其他", `您的主职业-其他-文本`, 您的主职业 ),
资讯获取主动度 = encode_check(`对于汽车品牌在社交网络发布的内容(如产品发布信息等)`)) %>%
#mutate
separate(所在地,sep = ",", into = c("省份","城市")) -> data_part_6_1
target <- vars(`您了解或接触汽车信息的渠道-亲朋好友`:`您了解或接触汽车信息的渠道-其他`)
pre_text = "您了解或接触汽车信息的渠道-"
data %>%
group_by(作答ID) %>%
transmute_at(target, ~.x) %>%
rename_at(target,
~paste0(
"",
gsub(pre_text,"",.x))) -> data_part_6_2
target <- vars(c(`您了解或接触汽车信息的渠道-汽车专业论坛-文本`, `您了解或接触汽车信息的渠道-社交媒体(微信、知乎、小红书等)-文本`, `您了解或接触汽车信息的渠道-网络视频平台(抖音、快手等)-文本`,
`您了解或接触汽车信息的渠道-其他-文本`))
pre_text = "您了解或接触汽车信息的渠道-|-文本"
data %>%
group_by(作答ID) %>%
transmute_at(target,~gsub("。|都有", "", .x)) %>%
transmute_at(target,~gsub(",|[[:space:]]|、", "、", .x)) %>%
rename_at(target,
~paste0(
"",
gsub(pre_text,"",.x))) -> temp
temp %>%
separate_rows(c("汽车专业论坛",
"社交媒体(微信、知乎、小红书等)",
"网络视频平台(抖音、快手等)",
"其他"
),sep = "、") %>%
set_colnames(c("作答ID", c("a","b","c","d"))) %>%
transmute(
途径 = paste0(c(a,b,c,d), collapse = "、")) %>%
separate_rows(途径,sep = "、") %>%
filter(途径!="-") %>%
mutate(有 = 1,
途径 = paste0("从", 途径)) %>% unique %>%
pivot_wider(id_cols = "作答ID",
names_from = 途径,
values_from = 有) -> data_part_6_3
data_part_6_1 %>%
left_join(data_part_6_2) %>%
left_join(data_part_6_3) -> data_part_6
data_part_6 %>% get_DT()
如果想了解具体的清洗步骤,可以点击右侧的Code👉
data %>%
select(作答ID:随机元素) -> user_info
user_info %>% get_DT()
# 输出
list("Part1-拥车现状与购车综合意愿" = data_part_1,
"Part2-车辆外观与性能因素" = data_part_2,
"Part3-车辆续航要求" = data_part_3,
"Part4-车辆品牌与价格因素" = data_part_4,
"Part5-车辆使用场景因素" = data_part_5,
"Part6-个人信息与社交媒体使用情况" = data_part_6) -> datas
# 整合
datas_all = data %>% distinct_at(1)
for(name in names(datas)){
datas_all %<>% left_join(datas[[name]])
}
data_all <- datas_all
datas_all
## # A tibble: 193 × 114
## 作答ID 了解程度 拥车辆 第一台车类型 第一台车购买场景 第一台车汽车单价
## <chr> <dbl> <int> <fct> <chr> <chr>
## 1 oZbi2E2Q4PRi 5 1 混动车 替换旧车(被替换旧… >=20万且<30万
## 2 dR9iYltl4PRu 4 1 传统车 家庭第一辆车 >=15万且<20万
## 3 mqeKuP974PR0 5 1 纯电车 替换旧车(被替换旧… >=20万且<30万
## 4 NCoUnKWK4PEN 4 1 传统车 家庭第一辆车 >=15万且<20万
## 5 axx8wjlG4PEK 4 1 传统车 家庭第一辆车 >=15万且<20万
## 6 Ha9ubotb4PEJ 4 1 传统车 家庭第一辆车 >=10万且<15万
## 7 piLAllfa4PEG 3 1 传统车 家庭第一辆车 >=15万且<20万
## 8 bRCMahEk4PEI 4 2 纯电车 家庭第一辆车 <10万
## 9 eMaYz8oC4PEY 4 1 传统车 家庭第一辆车 >=10万且<15万
## 10 USi0gkEf4PEm 3 1 纯电车 家庭第一辆车 >=10万且<15万
## # … with 183 more rows, and 108 more variables: 第一台车购车年份 <dbl>,
## # 第二台车类型 <fct>, 第二台车购买场景 <chr>, 第二台车汽车单价 <chr>,
## # 第二台车购车年份 <dbl>, 第三台车类型 <fct>, 第三台车购买场景 <chr>,
## # 第三台车汽车单价 <chr>, 第三台车购车年份 <dbl>, 下次买车间隔月数 <dbl>,
## # 下次买车预算 <dbl>, 买新能源车概率 <dbl>, 下台车购买计划 <chr>,
## # 获取牌照难度重要性 <dbl>, 充电体验重要性 <dbl>, 续航里程重要性 <dbl>,
## # 汽车价格重要性 <dbl>, 后续维修保养开销重要性 <dbl>, …
# 清洗
for(name in names(datas)){
datas[[name]] %<>% ungroup %>% mutate_all(~ifelse(is.na(.x) & .x =="-" ,
NA,
.x))
}
datas_all -> datas[["全部Part合并"]]
dict_excel = list()
for(col in c("knowledge","agree","budget","buygap","check")){
tibble(
"类型" = col,
"指标数值" = !!sym(paste0(col,"_value")),
"指标标签" = !!sym(paste0(col,"_raw"))
) -> dict_excel[[col]]
}
bind_rows(dict_excel) %>% group_by(类型) %>%
do(add_row(.)) -> datas[["数值的标签说明"]]
datas = datas[c(names(datas)[7:8],names(datas)[1:6])]
# datas %>% writeEXCEL("data/EVCars_6个部分全部.xlsx")
在进一步分析用户偏好前,先对原始数据形成一定认知
temp = list()
for(col in c("第一台","第二台","第三台")){
data_part_1 %>%
select(作答ID,
contains(paste0(col,"车类型")),
contains(paste0(col, "车购车年份"))) %>%
set_colnames(c("作答ID", "车辆类型","购车年份"))-> temp[[col]]
}
data_part_1 %>%
filter(拥车辆 == 0) %>%
transmute(作答ID,
购车年份 = 2021,
车辆类型 = "目前无车") -> no_car
bind_rows(temp) %>%
filter_at(2:3, all_vars(!is.na(.))) %>%
ggplot() +
aes(x = 购车年份,
fill = 车辆类型) +
geom_bar() +
#scale_fill_brewer(palette = "Greens", direction = 1) +
scale_fill_manual(values = c(get_blues(9)[2],get_greens(3))) +
ylab("购车数") +
ppt_theme
可以看到:
受访者离当前年份越近买车数量越多
2018年开始,受访者(193人)新购入车中电动车比例明显增加,2021年购车的受访者中甚至没有买传统车型的
data_part_1 %>%
filter((!is.na(第一台车类型) & 第一台车类型!="其他新能源车" & 第二台车类型!="其他新能源车" )| 拥车辆 == 1) %>%
mutate_at(c("第一台车类型","第二台车类型"), as.character) %>%
#distinct(第二台车类型)
mutate(第二台车类型 = replace_na(第二台车类型, "暂未购买")) -> foo_1_1
foo_1_1 %>% filter(第二台车类型 != "暂未购买") %>%
group_by(第一台车类型, 第二台车类型) %>%
summarise(num = n()) %>%
pivot_wider(id_cols = 1,
names_from = 第二台车类型,
values_from = num) %>%
fillna_at("混动车",0) -> temp
M = as.table(as.matrix(temp[,-1]))
names(dimnames(M)) = c("家庭第一台车","家庭第二台车")
dimnames(M)$家庭第一台车 <- c("传统车","混动车","纯电车")
labs <- round(prop.table(M,margin=1), 3) * 100
apply(
labs,
2,
function(u) sprintf( "%.1f%%", u )
) -> labs
dimnames(labs)[[1]] <-c("传统车","混动车","纯电车")
names(dimnames(labs)) = c("家庭第一台车","家庭第二台车")
library(vcd)
vcd::mosaic(#~ 第一台车类型 + 第二台车类型 , data = temp,
M,
highlighting_direction = "right",
pop = F,
shade = TRUE,
gp = shading_hcl,
#gp = shading_hcl(HairEyeColor, lty = 1:2),
gp_labels = gpar(fontsize = 9, fontfamily = "Microsoft YaHei"),
gp_varnames = gpar(fontsize = 12, fontfamily = "Microsoft YaHei"))
labeling_cells(text = labs, margin = 0)(M)
对当前家庭有2台车的56名受访者:
第一台车买传统车的车主有43%下一台尝试了混动,但较少直接购买纯电
第一台车买混动的车主有83%在下一台车都进一步买了纯电
说明新能源车需要一定的“体验时间”来增强消费自信
car_info %>%
mutate(已有新能源车 = ifelse(车辆类型 %in% c("混动车", "纯电车","其他新能源车"),1,0)) %>%
group_by(作答ID) %>%
summarise(已有新能源车 = max(已有新能源车)) %>%
transmute(作答ID,
拥车情况 = ifelse(已有新能源车 ==1, "已有新能源车", "只有传统车")) %>%
left_join(datas_all,.) %>%
mutate_at("拥车情况", ~replace_na(.,"无车")) -> foo
vcd::mosaic(~ 拥车情况 + 下台车购买计划, data = foo,
highlighting_direction = "right",
shade = TRUE,
gp = shading_hcl,
#gp = shading_hcl(HairEyeColor, lty = 1:2),
gp_labels = gpar(fontsize = 9, fontfamily = "Microsoft YaHei"),
gp_varnames = gpar(fontsize = 12, fontfamily = "Microsoft YaHei"))
进一步,对所有187名未来7年有购车计划的消费者:
当前开传统车的对下一辆车呈犹豫态度
当前开新能源车的车主很多会继续买新能源车
library(PupillometryR)
data_part_2 %>%
left_join(foo) %>%
ggplot() +
aes(x = 拥车情况, y = 预期百公里加速, fill = 性别) +
geom_flat_violin(
position = position_nudge(x = .2, y = 0),
trim = TRUE,
alpha = .4,
scale = "width") +
geom_point(aes(color = 性别),
position = position_jitter(w = .15, h = 0.9),
size = 1,
alpha = 0.4) +
geom_boxplot(width = .3,
outlier.shape = NA,
alpha = 0.5) +
scale_fill_manual( values =my_pick[-1],na.value = "#5f5f5f") +
scale_color_manual(values =my_pick[-1],na.value = "#5f5f5f") +
unity("秒") +
ppt_theme
可以看到:
开传统车的车主中更多的男性希望车辆拥有更快的百公里加速
开新能源车的女性对车辆加速度要求更高超过男性,而男性却减少了
data_part_2 %>%
left_join(datas_all %>% select(作答ID, 买新能源车概率,下台车购买计划)) %>%
select(-作答ID) -> foo
fit1 = lm(买新能源车概率 ~ ., data= foo %>% select(-下台车购买计划))
summary(fit1)$coefficients %>%
as_tibble(rownames = "Variable") %>%
arrange(`Pr(>|t|)`)
## # A tibble: 13 × 5
## Variable Estimate `Std. Error` `t value` `Pr(>|t|)`
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.533 0.0636 8.39 1.39e-14
## 2 新能源汽车的外观设计更符合我的偏好 0.0431 0.0178 2.42 1.65e- 2
## 3 新能源汽车的起步加速更快 0.0169 0.0120 1.41 1.61e- 1
## 4 电动汽车电池老化快 -0.0195 0.0139 -1.40 1.63e- 1
## 5 `新能源汽车有更先进的驾驶功能(自… 0.0221 0.0163 1.35 1.77e- 1
## 6 新能源汽车的车内噪声更低 0.0188 0.0154 1.22 2.24e- 1
## 7 `新能源汽车的质量(零件不易损坏等… 0.0158 0.0167 0.948 3.44e- 1
## 8 预期百公里加速 0.00421 0.00644 0.653 5.14e- 1
## 9 `电动汽车充电不方便(如公共充电桩… -0.00671 0.0132 -0.509 6.11e- 1
## 10 `新能源汽车驾驶及乘坐舒适度更好(… 0.00721 0.0170 0.426 6.71e- 1
## 11 目前新能源车的续航不足 0.00256 0.0145 0.176 8.60e- 1
## 12 新能源汽车的人机交互系统体验更好 -0.00198 0.0178 -0.111 9.11e- 1
## 13 `新能源汽车的安全性能(耐环境性、… -0.00153 0.0144 -0.106 9.16e- 1
vars(c(新能源汽车的外观设计更符合我的偏好,
预期百公里加速,
新能源汽车的起步加速更快,
`新能源汽车有更先进的驾驶功能(自动驾驶及辅助驾驶等)`,下台车购买计划)) -> keep
ggpairs(data = foo %>% select_at(keep) %>%
rename_all(~gsub(INSIDE_PARA,"",.x, perl=TRUE)) %>%
rename_all(~gsub("的","",.x, perl=TRUE)),
mapping = aes(color = 下台车购买计划),
upper = list(continuous = "smooth_loess",
combo = "box",
discrete = "box",
na = "na"),
lower = list(continuous = wrap("cor", size = 4, family = "Microsoft YaHei"),
combo = "box_no_facet",
discrete = "facetbar",
na = "na")) + ppt_theme
从上图可以看到
下台车基本能确定买新能源车的车主对车的外观、加速认可度更高
下台车买传统车的车主不认为新能源汽车的自动驾驶等功能比传统车好很多
read_excel("data/最新全国城市等级划分2020.xlsx", skip=1) %>%
select(城市, 城市等级 = 5) -> city_info
data_part_3 %>%
left_join(datas_all) %>%
left_join(data_part_5 %>% select(作答ID,日常通勤来回路程)) %>%
select(-作答ID) %>%
mutate(城市 = ifelse(城市 == "市辖区", 省份,城市)) %>%
left_join(city_info) %>% select(-c(城市,省份,家庭成员数,年龄,家庭月收入)) %>%
mutate(城市等级 = ifelse(城市等级 %in% c("三线","四线","五线"), "三四线",城市等级)) %>%
mutate(城市等级 = factor(城市等级, c("超一线","一线","二线","三四线"))) %>%
mutate(下台车购买计划 = factor(下台车购买计划, c("买传统车","不确定","买新能源车"))) %>%
arrange(城市等级,下台车购买计划) -> foo
#foo %>% report_na
ggplot(foo) +
aes(x = 下台车购买计划, y = 日常通勤来回路程, fill = 城市等级) +
geom_flat_violin(
position = position_nudge(x = .2, y = 0),
trim = TRUE,
alpha = .4,
scale = "width") +
geom_point(aes(color = 城市等级),
position = position_jitter(w = .15, h = 0.9),
size = 1,
show.legend = F,
alpha = 0.4) +
geom_boxplot(width = .3,
outlier.shape = NA,
alpha = 0.5) +
scale_fill_manual( values =my_pick[-1],na.value = "#5f5f5f") +
scale_color_manual(values =my_pick[-1],na.value = "#5f5f5f") +
unity("km") +
ppt_theme
ggplot(foo) +
aes(x = 下台车购买计划, y = 续航里程要求, fill = 城市等级) +
geom_flat_violin(
position = position_nudge(x = .2, y = 0),
trim = TRUE,
alpha = .4,
scale = "width") +
geom_point(aes(color = 城市等级),
position = position_jitter(w = .15, h = 0.9),
size = 1,
show.legend = F,
alpha = 0.4) +
geom_boxplot(width = .3,
outlier.shape = NA,
alpha = 0.5) +
scale_fill_manual( values =my_pick[-1],na.value = "#5f5f5f") +
scale_color_manual(values =my_pick[-1],na.value = "#5f5f5f") +
unity("km") +
ppt_theme
car_info %>%
group_by(作答ID) %>%
filter(购车年份 == max(购车年份)) %>%
left_join(datas_all) %>%
mutate(下次买车预算 = decode_budget(下次买车预算)) %>%
rename(当前车价位 = 车辆单价) -> foo
vcd::mosaic(~ 当前车价位 + 下次买车预算, data = foo,
highlighting_direction = "right",
shade = TRUE,
gp = shading_hcl,
#margin = c(3,4,2,1),
labeling= labeling_border(rot_labels = c(45,0,0,0),
fontfamily = "Microsoft YaHei",
just_labels = c("left",
"right",
"right",
"right"),
gp_labels = gpar(fontsize = 9, fontfamily = "Microsoft YaHei"),
gp_varnames = gpar(fontsize = 12, fontfamily = "Microsoft YaHei")))
大多数受访者会选择下一台车相较自己当前的车提升一个价格档位,说明存在消费升级的趋势
10~20万元是受访者购车的“甜蜜”区间
data_all %>%
mutate(
新能源车意愿价位 = encode_budget(新能源车意愿价位)
) %>%
select(
# Part-1
了解程度,
拥车辆,
下次买车间隔月数,
下次买车预算,
买新能源车概率,
最后一台车单价,
距上次买车,
#获取牌照难度重要性:售后服务重要性,
# Part 2 性能
新能源汽车的外观设计更符合我的偏好:新能源汽车的起步加速更快,
# Part 3 续航
目前新能源车的续航不足:充电路程时间要求,
# Part 4 价格
新能源车意愿价位:维修保养开销更大,
# Part 5 使用场景
新能源汽车上牌更容易:新能源汽车更加环保, 家庭成员数) -> trainset
trainset %>% select(-买新能源车概率) -> input
input %<>%
rename_all(~gsub(inside_para, "", .x, perl=TRUE))
# 计算相关系数并排序
cor_numVar <- cor(input, use="pairwise.complete.obs") #correlations of all numeric variables
# CorHigh <- c(names(which(apply(cor_sorted, 1, function(x) abs(x)>0.2))))
par(family = "Microsoft YaHei")
res1 <- cor.mtest(input, conf.level = .95)
corrplot(cor_numVar,
order = "hclust",
# 标记
p.mat = res1$p,
insig = "label_sig",
sig.level = c(.001, .01, .05),
pch.cex = .5,
pch.col = "#000000AA",
addrect = 5,
method = "ellipse",
tl.col="#000000DD",
tl.pos = "lt",
tl.srt = 50,
#mar
mar = c(1, 1, 1, 1),
tl.cex = 0.5,
cl.cex = 0.5,
number.cex = 0.4)
fit <- lm(买新能源车概率 ~ .,
data = trainset)
result <- summary(fit)
result %>% xtable %>% knitr::kable()
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 0.1977259 | 0.1399468 | 1.4128642 | 0.1596625 |
了解程度 | 0.0676621 | 0.0204016 | 3.3164996 | 0.0011310 |
拥车辆 | 0.0145492 | 0.0286684 | 0.5074999 | 0.6125117 |
下次买车间隔月数 | -0.0005400 | 0.0007037 | -0.7673098 | 0.4440425 |
下次买车预算 | 0.0000000 | 0.0000002 | -0.2075204 | 0.8358707 |
最后一台车单价 | -0.0000004 | 0.0000002 | -1.9728197 | 0.0502610 |
距上次买车 | -0.0092701 | 0.0034200 | -2.7105483 | 0.0074599 |
新能源汽车的外观设计更符合我的偏好 | 0.0176259 | 0.0186729 | 0.9439306 | 0.3466463 |
新能源汽车有更先进的驾驶功能(自动驾驶及辅助驾驶等) |
0.0142260 | 0.0164982 | 0.8622741 | 0.3898435 |
新能源汽车的人机交互系统体验更好 | 0.0001412 | 0.0171528 | 0.0082338 | 0.9934408 |
新能源汽车的安全性能(耐环境性、误操作防护及事故保护等)更好 |
-0.0115366 | 0.0145383 | -0.7935300 | 0.4286592 |
新能源汽车的质量(零件不易损坏等)更好 |
0.0200785 | 0.0163976 | 1.2244774 | 0.2225948 |
新能源汽车的车内噪声更低 | 0.0169537 | 0.0153331 | 1.1056899 | 0.2705415 |
新能源汽车驾驶及乘坐舒适度更好(如更平稳等) |
-0.0071110 | 0.0180017 | -0.3950177 | 0.6933626 |
新能源汽车的起步加速更快 | 0.0352589 | 0.0136451 | 2.5839921 | 0.0106716 |
目前新能源车的续航不足 | -0.0187547 | 0.0141264 | -1.3276372 | 0.1862130 |
电动汽车充电不方便(如公共充电桩太少、家用充电桩不容易装等) |
0.0012257 | 0.0128470 | 0.0954097 | 0.9241103 |
电动汽车电池老化快 | 0.0010165 | 0.0139998 | 0.0726078 | 0.9422101 |
预期百公里加速 | 0.0056424 | 0.0066001 | 0.8549047 | 0.3938984 |
续航里程要求 | 0.0001256 | 0.0001436 | 0.8743090 | 0.3832770 |
家用充电桩充电时间要求 | 0.0016010 | 0.0056690 | 0.2824183 | 0.7779924 |
公共充电桩充电时间要求 | 0.0005773 | 0.0008043 | 0.7177432 | 0.4739755 |
充电路程时间要求 | 0.0006663 | 0.0008088 | 0.8238902 | 0.4112439 |
新能源车意愿价位 | 0.0000005 | 0.0000003 | 1.8784149 | 0.0621667 |
新能源车意愿溢价 | 0.0032741 | 0.0070517 | 0.4643007 | 0.6430714 |
汽车意愿年均使用成本 | 0.0056818 | 0.0161516 | 0.3517827 | 0.7254699 |
汽车意愿五年折价率 | -0.0637581 | 0.1136038 | -0.5612320 | 0.5754345 |
购买时会享有更多政府优惠补贴或购置税减免政策政策 | 0.0065275 | 0.0196104 | 0.3328589 | 0.7396820 |
能源费用更低 | 0.0090811 | 0.0145541 | 0.6239543 | 0.5335574 |
维修保养开销更大 | -0.0193547 | 0.0098785 | -1.9592668 | 0.0518415 |
新能源汽车上牌更容易 | -0.0321471 | 0.0127917 | -2.5131251 | 0.0129690 |
新能源汽车可使用公交车道 | -0.0131938 | 0.0088968 | -1.4829731 | 0.1400735 |
新能源汽车出行更自由(不限行) |
0.0113583 | 0.0112758 | 1.0073150 | 0.3153236 |
新能源汽车更加环保 | 0.0302997 | 0.0170961 | 1.7723198 | 0.0782687 |
家庭成员数 | -0.0242717 | 0.0117460 | -2.0663714 | 0.0404256 |
# 确定应提取的因子个数
ev <- eigen(cor(input)) # 获取特征值
ap <- parallel(subject=nrow(input),var=ncol(input),
rep=100,cent=.05) # subject指样本个数,var是指变量个数
nS <- nScree(x=ev$values, aparallel=ap$eigen$qevpea) # 确定探索性因子分析中应保留的因子
plotnScree(nS) # 绘制碎石图
fit <- factanal(input, 6, rotation="varimax", scores="regression")
fit
##
## Call:
## factanal(x = input, factors = 6, scores = "regression", rotation = "varimax")
##
## Uniquenesses:
## 了解程度
## 0.712
## 拥车辆
## 0.806
## 下次买车间隔月数
## 0.751
## 下次买车预算
## 0.137
## 最后一台车单价
## 0.253
## 距上次买车
## 0.857
## 新能源汽车的外观设计更符合我的偏好
## 0.391
## 新能源汽车有更先进的驾驶功能
## 0.482
## 新能源汽车的人机交互系统体验更好
## 0.517
## 新能源汽车的安全性能更好
## 0.401
## 新能源汽车的质量更好
## 0.246
## 新能源汽车的车内噪声更低
## 0.707
## 新能源汽车驾驶及乘坐舒适度更好
## 0.603
## 新能源汽车的起步加速更快
## 0.453
## 目前新能源车的续航不足
## 0.300
## 电动汽车充电不方便
## 0.266
## 电动汽车电池老化快
## 0.304
## 预期百公里加速
## 0.831
## 续航里程要求
## 0.907
## 家用充电桩充电时间要求
## 0.876
## 公共充电桩充电时间要求
## 0.657
## 充电路程时间要求
## 0.641
## 新能源车意愿价位
## 0.082
## 新能源车意愿溢价
## 0.617
## 汽车意愿年均使用成本
## 0.744
## 汽车意愿五年折价率
## 0.718
## 购买时会享有更多政府优惠补贴或购置税减免政策政策
## 0.814
## 能源费用更低
## 0.761
## 维修保养开销更大
## 0.801
## 新能源汽车上牌更容易
## 0.405
## 新能源汽车可使用公交车道
## 0.817
## 新能源汽车出行更自由
## 0.430
## 新能源汽车更加环保
## 0.845
## 家庭成员数
## 0.880
##
## Loadings:
## Factor1 Factor2 Factor3
## 了解程度 0.115 -0.245 0.243
## 拥车辆 0.340 0.108
## 下次买车间隔月数 0.257 -0.132
## 下次买车预算 0.867 -0.124
## 最后一台车单价 0.858
## 距上次买车 -0.319
## 新能源汽车的外观设计更符合我的偏好 -0.254 0.331
## 新能源汽车有更先进的驾驶功能 0.260
## 新能源汽车的人机交互系统体验更好 0.267
## 新能源汽车的安全性能更好 0.152 -0.273 0.161
## 新能源汽车的质量更好 -0.254 0.138
## 新能源汽车的车内噪声更低 0.479
## 新能源汽车驾驶及乘坐舒适度更好 -0.122 0.456
## 新能源汽车的起步加速更快 -0.121 0.436
## 目前新能源车的续航不足 0.795
## 电动汽车充电不方便 0.833
## 电动汽车电池老化快 0.808
## 预期百公里加速
## 续航里程要求 0.152
## 家用充电桩充电时间要求 0.135
## 公共充电桩充电时间要求 -0.120
## 充电路程时间要求 -0.133
## 新能源车意愿价位 0.943
## 新能源车意愿溢价 -0.184
## 汽车意愿年均使用成本 0.361
## 汽车意愿五年折价率 0.270 0.117
## 购买时会享有更多政府优惠补贴或购置税减免政策政策 0.337
## 能源费用更低 -0.236 0.416
## 维修保养开销更大 0.108 0.402 -0.128
## 新能源汽车上牌更容易 -0.119 -0.149 0.529
## 新能源汽车可使用公交车道 -0.158 0.325
## 新能源汽车出行更自由 0.159 0.715
## 新能源汽车更加环保 0.355
## 家庭成员数 -0.162
## Factor4 Factor5 Factor6
## 了解程度 0.327 0.213
## 拥车辆 0.225 0.114
## 下次买车间隔月数 -0.364 0.116 0.138
## 下次买车预算 0.283 -0.118
## 最后一台车单价
## 距上次买车 0.156 -0.118
## 新能源汽车的外观设计更符合我的偏好 0.615 0.210 0.113
## 新能源汽车有更先进的驾驶功能 0.630 -0.103 0.164
## 新能源汽车的人机交互系统体验更好 0.612 0.183
## 新能源汽车的安全性能更好 0.287 0.180 0.600
## 新能源汽车的质量更好 0.417 0.277 0.644
## 新能源汽车的车内噪声更低 0.189 0.122
## 新能源汽车驾驶及乘坐舒适度更好 0.371 0.105 0.153
## 新能源汽车的起步加速更快 0.583
## 目前新能源车的续航不足 -0.107 -0.166 -0.164
## 电动汽车充电不方便 -0.117 -0.110 -0.107
## 电动汽车电池老化快 -0.151
## 预期百公里加速 0.382
## 续航里程要求 0.142 0.192
## 家用充电桩充电时间要求 -0.151 0.287
## 公共充电桩充电时间要求 -0.109 0.555
## 充电路程时间要求 0.575 0.102
## 新能源车意愿价位 0.140
## 新能源车意愿溢价 0.346 0.466 0.101
## 汽车意愿年均使用成本 0.155 0.314
## 汽车意愿五年折价率 0.212 0.379
## 购买时会享有更多政府优惠补贴或购置税减免政策政策 0.196 0.154
## 能源费用更低
## 维修保养开销更大
## 新能源汽车上牌更容易 -0.136 0.504
## 新能源汽车可使用公交车道 0.203
## 新能源汽车出行更自由 -0.159
## 新能源汽车更加环保 0.154
## 家庭成员数 0.289
##
## Factor1 Factor2 Factor3 Factor4 Factor5 Factor6
## SS loadings 3.041 2.661 2.389 2.334 1.875 1.690
## Proportion Var 0.089 0.078 0.070 0.069 0.055 0.050
## Cumulative Var 0.089 0.168 0.238 0.307 0.362 0.411
##
## Test of the hypothesis that 6 factors are sufficient.
## The chi square statistic is 606.66 on 372 degrees of freedom.
## The p-value is 1.61e-13
input %>% cbind(fit$scores) %>%
select(Factor1:Factor6) -> input_2
loadings_mat <- as.data.frame(matrix(nrow = 34, ncol =6))
loadings_mat$Variable <- colnames(input)
for (i in 1:6) {
for (j in 1:34) {
loadings_mat[j, i] <- fit$loadings[j, i]
}
}
loadings_mat %>% gather("Factor", "Value", 1:6) %>%
ggplot(aes(Variable, abs(Value), fill=Value)) +
facet_wrap(~ Factor, nrow=1) +
geom_bar(stat="identity") +
coord_flip() +
xlab("") + ylab("") +
scale_fill_gradient2(name = "Loading",
high = "blue", mid = "white", low = "red",
midpoint=0, guide=F) + ppt_theme + only_x
load <- fit$loadings[,1:2]
as_tibble(load, rownames = "变量") %>%
ggplot(aes(
x = Factor1,
y = Factor2,
label = 变量
)) +
#geom_text(family = "Microsoft YaHei",
# size = 3) +
geom_point() +
geom_text_repel(family = "Microsoft YaHei",
size = 4, min.segment.length = unit(0.4, "lines")) +
ppt_theme
load <- fit$loadings[,3:4]
as_tibble(load, rownames = "变量") %>%
ggplot(aes(
x = Factor3,
y = Factor4,
label = 变量
)) +
#geom_text(family = "Microsoft YaHei",
# size = 3) +
geom_point() +
geom_text_repel(family = "Microsoft YaHei",
size = 4, min.segment.length = unit(0.4, "lines")) +
ppt_theme
load <- fit$loadings[,5:6]
as_tibble(load, rownames = "变量") %>%
ggplot(aes(
x = Factor5,
y = Factor6,
label = 变量
)) +
#geom_text(family = "Microsoft YaHei",
# size = 3) +
geom_point() +
geom_text_repel(family = "Microsoft YaHei",
size = 4, min.segment.length = unit(0.4, "lines")) +
ppt_theme
bss <- numeric()
wss <- numeric()
# Run the algorithm for different values of k
set.seed(1234)
for(i in 1:10){
# For each k, calculate betweenss and tot.withinss
bss[i] <- kmeans(input_2, centers=i)$betweenss
wss[i] <- kmeans(input_2, centers=i)$tot.withinss
}
# Between-cluster sum of squares vs Choice of k
p3 <- qplot(1:10, bss, geom=c("point", "line"),
xlab="Number of clusters", ylab="Between-cluster sum of squares") +
scale_x_continuous(breaks=seq(0, 10, 1)) +
theme_bw()
# Total within-cluster sum of squares vs Choice of k
p4 <- qplot(1:10, wss, geom=c("point", "line"),
xlab="Number of clusters", ylab="Total within-cluster sum of squares") +
scale_x_continuous(breaks=seq(0, 10, 1)) +
theme_bw()
# Subplot
grid.arrange(p3, p4, ncol=2)
fit2 <- kmeans(input, centers = 2, nstart = 25)
fit3 <- kmeans(input, centers = 3, nstart = 25)
fit4 <- kmeans(input, centers = 4, nstart = 25)
fit5 <- kmeans(input, centers = 5, nstart = 25)
# plots to compare
p1 <- fviz_cluster(fit2, geom = "point", data = input) + ggtitle("k = 2")
p2 <- fviz_cluster(fit3, geom = "point", data = input) + ggtitle("k = 3")
p3 <- fviz_cluster(fit4, geom = "point", data = input) + ggtitle("k = 4")
p4 <- fviz_cluster(fit5, geom = "point", data = input) + ggtitle("k = 5")
library(gridExtra)
grid.arrange(p1, p2, p3, p4, nrow = 2)
fviz_nbclust(input, kmeans, method = "silhouette")
使用silhouette
方法判断时则明确给出了2类作为聚类数量,考虑到受访者中已经有了众多的新能源车车主,且整体愿意下台车购买新能源车概率在72.3%,因此已经是很好的用户群target了,从中再挖掘出1类细分用户也是足够的。
原因猜测:对新能源车不感兴趣的话不会填写这份问卷
trainset %>%
mutate(cluster = factor(fit2$cluster)) -> input_glm_k2
trainset %>%
mutate(cluster = factor(fit2$cluster)) -> input_glm_k3
data_all %>%
mutate(cluster = fit3$cluster) -> result_k3
data_all %>%
mutate(cluster = fit2$cluster) -> result_k2
# T-test
# Perform a t-test between groups
stat.test <- compare_means(
买新能源车概率 ~ cluster,
data = result_k3,
method = "t.test"
)
stat.test <- stat.test %>%
mutate(y.position = c(1.1,1.2,1.3))
p <- ggboxplot(result_k3, x = "cluster", y = "买新能源车概率")
p + stat_pvalue_manual(stat.test, label = "p = {p.adj} {p.signif}") -> p1
stat.test <- compare_means(
买新能源车概率 ~ cluster,
data = result_k2,
method = "t.test"
)
stat.test <- stat.test %>%
mutate(y.position = c(1.1))
p <- ggboxplot(result_k2, x = "cluster", y = "买新能源车概率")
p + stat_pvalue_manual(stat.test, label = "p = {p.adj} {p.signif}") -> p2
(p1 + ppt_theme) + (p2 + ppt_theme)
result <- result_k2 %>% mutate(cluster = factor(as.character(cluster),
level = c("1","2"),
label = c("第一类","第二类")))
# 除了家庭月收入、和人数
read_excel("data/最新全国城市等级划分2020.xlsx", skip=1) %>%
select(城市, 城市等级 = 5) -> city_info
result %>%
select(cluster) %>%
cbind(data_part_6 %>% ungroup %>% select(性别:职业)) %>%
as_tibble %>%
mutate(城市 = ifelse(城市 == "市辖区", 省份,城市)) %>%
left_join(city_info) %>% select(-c(城市,省份,家庭成员数,年龄,家庭月收入)) %>%
mutate(城市等级 = factor(城市等级, c("超一线","一线","二线","三线","四线","五线"))) %>%
arrange(城市等级) %>%
pivot_longer(性别:城市等级,names_to = "指标", values_to = "指标值") %>%
group_by(指标,cluster, 指标值) %>%
summarise(占比 = n()) %>%
group_by(指标, cluster) %>%
mutate(占比 = 占比 / sum(占比,na.rm=T)) %>%
ggplot() +
aes(x = `指标值`, fill = cluster, y = `占比`) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = rev(get_blues(2))) +
ppt_theme +
scale_y_continuous(expand = c(0, 0),
labels = scales::percent,
breaks = scales::breaks_pretty(5)) +
only_x +
coord_flip() +
facet_wrap(指标~. ,scales="free", ncol = 2)
result %>%
select(cluster) %>%
cbind(data_part_6 %>% ungroup %>% select(性别:职业)) %>%
as_tibble %>%
select(cluster,家庭成员数,年龄,家庭月收入) %>%
pivot_longer(家庭成员数:家庭月收入) %>%
ggplot() +
aes(x = name, y = value, fill = cluster) +
geom_flat_violin(
position = position_nudge(x = .2, y = 0),
trim = TRUE,
alpha = .4,
scale = "width") +
geom_point(aes(color = cluster),
position = position_jitter(w = .15, h = 0.9),
size = 1,
alpha = 0.4) +
geom_boxplot(width = .3,
outlier.shape = NA,
alpha = 0.5) +
scale_fill_manual( values =my_pick[-1],na.value = "#5f5f5f") +
scale_color_manual(values =my_pick[-1],na.value = "#5f5f5f") +
bigy +
ppt_theme +
ylab("") +
xlab("") +
facet_wrap(name~.,scale = "free")
result %>%
select(cluster, contains("倾向")) %>%
group_by(cluster) %>%
pivot_longer(2:ncol(.),
names_to = "品牌") %>%
mutate(value = as.numeric(value)) %>%
group_by(cluster, 品牌) %>%
summarise(品牌渗透率 = sum(value, na.rm=T)/n()) %>% ungroup %>%
ggplot() +
aes(x = 品牌, fill = cluster, y = 品牌渗透率) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = rev(get_blues(2))) +
ppt_theme +
coord_flip()
result %>%
#mutate_at(c("了解程度","资讯获取主动度"), ) %>%
transmute(
cluster,
了解程度 = decode_knowledge(了解程度),
资讯获取主动度 = decode_check(资讯获取主动度)
) -> temp
temp %>%
group_by(cluster, 了解程度) %>%
summarise(占比 = n() ) %>%
group_by(cluster) %>%
mutate(占比 = 占比/sum(占比)) %>%
ggplot() +
aes(x = `了解程度`, y = 占比, fill = cluster) +
geom_bar(stat = "identity", position = "dodge") +
scale_x_discrete(position = "bottom", labels = function(x) gsub(",|、","\n",x)) +
coord_flip() +
scale_fill_manual(values = rev(get_blues(2))) +
ppt_theme + only_x +
theme(legend.position = "none") +
scale_y_reverse() -> p1
temp %>%
group_by(cluster, 资讯获取主动度) %>%
summarise(占比 = n() ) %>%
group_by(cluster) %>%
mutate(占比 = 占比/sum(占比)) %>%
#esquisser(temp)
ggplot() +
aes(x = `资讯获取主动度`, y = 占比, fill = cluster) +
geom_bar(stat = "identity", position = "dodge") +
scale_x_discrete(position = "top", labels = function(x) gsub(",|、","\n",x)) +
coord_flip() +
scale_fill_manual(values = rev(get_blues(2))) +
ppt_theme + only_x -> p2
p1 + p2
result %>%
select(cluster, 亲朋好友:其他) %>%
#mutate(cluster)
group_by(cluster) %>%
pivot_longer(2:ncol(.),
names_to = "渠道") %>%
mutate(value = as.numeric(value)) %>%
group_by(cluster,渠道) %>%
summarise(渠道渗透率 = sum(value)/n()) %>% ungroup -> temp
ggplot(temp) +
aes(x = `渠道`, fill = cluster, weight = `渠道渗透率`) +
geom_bar(position = "dodge") +
scale_fill_manual(values = rev(get_blues(2))) +
coord_flip() +
percenty +
ylab("占比") +
ppt_theme + only_x
result %>%
select(cluster, contains("从")) %>%
group_by(cluster) %>%
pivot_longer(2:ncol(.),
names_to = "渠道") %>%
mutate(value = as.numeric(value)) %>%
group_by(cluster,渠道) %>%
summarise(渠道渗透率 = sum(value, na.rm=T)/n()) %>% ungroup -> temp
ggplot(temp) +
aes(x = `渠道`, fill = cluster, y = `渠道渗透率`) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = rev(get_blues(2))) +
coord_flip() +
percenty +# only_x +
ylab("占比") +
ppt_theme + only_x