데이콘에서 진행한 포스트 코로나 데이터 시각화 경진대회에 참여했던 내용입니다.
코로나가 확산됨에 따라 소비 패턴이 변화하는 것을 월별 매출의 증감을 통해 파악해보자는 취지에 의해
분석을 진행하였고 20년도에 분석한 내용이니 그냥 재미삼아 읽어주세요 :D
https://dacon.io/codeshare/1400
신종 코로나 바이러스 감염증(코로나19)이 지속적으로 확산하면서 일상을 바꿔놓았습니다.
세계보건기구(WHO)의 발표에 따르면 전 세계적으로 코로나 유행이 계속 증가(확산)하고 있고, 신규 확진자 수도 20만명을 넘어 최다 기록을 계속 바꾸고 있는 상황 이라며, 현재 상황으로는 코로나19를 종식시키기는 어렵다고 언급 하고 있습니다.
이제 우리는 코로나와 함께 하는 '위드(with) 코로나' 사회 속에서 장기화 되는 포스트 코로나 시대에 대비 해야 할 것입니다.
코로나 전, 후의 사람들의 소비패턴의 변화를 살펴보고, 코로나가 지속됨에 따라 어떤 변화가 있었는지를 살펴봄으로써
코로나가 장기화되는 상황속에서 사람들의 소비가 어떻게 변화 할지 알아보려 합니다.
이러한 소비 패턴의 변화를 살펴보기 위해서는, 코로나19가 우리 생활에 영향을 주기 이전에 사람들의 소비 패턴이 어떠했는지에 대한 정보가 필요합니다. 그러므로 코로나 사태가 우리나라에 직접적인 영향을 주기 전인 1월을 기준으로 월별 매출의 증감을 살펴보았습니다.
data 소개
사용 데이터 셋
- card.csv
- PatientInfo.csv
변수
- year_month: 카드회사가 카드사용 내역을 접수한 년도와 월에 해당하는 변수
- day: 카드회사가 카드사용 내역을 접수한 일에 해당하는 변수
- adstrd_code: 가맹점 위치 기준 행정동 코드
- adstrd_nm: 가맹점 위치 기준 행정동명
- shop_code: 기존 card데이터의 mrhst_induty_cl_code변수. 가맹점 업종코드에 해당.
- category_l: 가맹점 업종코드에 첫 번째 자리에 해당하는 숫자로(ex 7041이면 7에 해당) 카테고리 대분류에 해당
- category_m: 기존 card데이터의 mrhst_induty_cl_nm변수로 가맹점 업종명을 의미하며 카테고리 소분류에 해당
- salary_count: 기존 card데이터의 selng_cascnt 변수. 매출발생 건수에 해당.
- salary_amount: 기존 card데이터의 salamt 변수. 매출 발생금액에 해당
업종 카테고리 분류
mrhst_induty_cl_code 변수에 해당하는 업종코드는 카드사가 부여한 것으로, 4자리 숫자를 가지고 있습니다.
그리고 코드의 첫번째 숫자를 기준으로 그룹을 묶어보면 대체로 비슷한 업종임을 확인할 수 있었습니다.
예를 들어, 코드의 숫자가 7인 업종코드는 7041 : 약국, 7022 : 치과의원, 7021 : 한의원 등이 있습니다. 이들은 비슷한 업종이므로 '의료'로 분류하였습니다.
이렇게 정의한 대분류는 다음과 같습니다.
대분류
1.관광 2. 취미 3. 생활 4. 쇼핑 5. 교육 6. 차량관련 7. 의료 8. 음식 9. 기타 (부록참고)
소분류
맨 아래 부록에 각 대분류에 속하는 업종코드명을 적어두었습니다.
카테고리별 매출액의 분포 확인
정의한 9개의 카테고리 업종의 월별 평균을 이용해 매출의 증감 비율을 확인해 보기 위해
먼저 매출액의 데이터가 어떻게 분포되어있는지 확인해 보았습니다.
options(warn = -1)
library(tidyverse, warn.conflicts = FALSE)
library(ggplot2, warn.conflicts = FALSE)
library(data.table, warn.conflicts = FALSE)
library(gridExtra, warn.conflicts = FALSE)
library(ggplotify, warn.conflicts = FALSE)
library(lubridate, warn.conflicts = FALSE)
library(repr, warn.conflicts=FALSE)
library(IRdisplay, warn.conflicts=FALSE)
options(repr.plot.width=5, repr.plot.height=4)
############################################# 데이터 불러오기 #############################################################
card <- fread(file.choose(), encoding = "UTF-8") #card 데이터셋 사용
colnames(card) <- c("date", "adstrd_code", "adstrd_nm", "shop_code", "category_m", "salary_count", "salary_amount")
############################################## 변수 타입 지정 ##############################################################
card$date <- ymd(card$date)
card$category_m <- as.factor(card$category_m)
card <- card %>%
filter(!str_detect(salary_count, regex("[가-힣]")))
card$salary_amount <- as.numeric(card$salary_amount)
card$salary_count <- as.numeric(card$salary_count)
card2 <- card %>%
separate(col = date, into = c("year", "month", "day"), sep = "-") %>% # date 변수를 "-"를 기준으로 year, month, day로 나누고
unite(year, month, col = "year_month", sep = "-") %>% # year와 month를 다시 "-"로 결합해서 year_month라는 변수로 만듦.
mutate(category_l = str_sub(shop_code, start = 1, end = 1)) %>% # 그리고 shop_code에서 첫번째 숫자만 뽑아서 category_l라는 변수 생성함.
select(year_month:shop_code, category_l, category_m:salary_amount) # 변수 보기 좋게 재배열
#card2$category_l <- as.charicter(card2$category_l)
card2$category_l[card2$category_l=="1"]='관광'
card2$category_l[card2$category_l=="2"]='취미'
card2$category_l[card2$category_l=="3"]='생활'
card2$category_l[card2$category_l=="4"]='쇼핑'
card2$category_l[card2$category_l=="5"]='교육'
card2$category_l[card2$category_l=="6"]='차량관련'
card2$category_l[card2$category_l=="7"]='의료'
card2$category_l[card2$category_l=="8"]='음식'
card2$category_l[card2$category_l=="9"]='기타'
#card2$category_l <- as.factor(card2$category_l)
head(card2)
# 히스토그램 그리기
salary_amount_0.05 <- quantile(card2$salary_amount, probs = 0.05)
salary_amount_0.95 <- quantile(card2$salary_amount, probs = 0.95)
# 전체적으로 분포가 심하게 치우친 모습을 보여서 시각적으로 잘 나타내기 위해,
# prods 옵션을 통해 상위 5%와 하위 5%의 데이터를 절삭해서 분포를 그림
card2_trim <- card2 %>%
filter((salary_amount_0.05 < salary_amount) < salary_amount_0.95))
options(repr.plot.width=7, repr.plot.height=5)
ggplot(card2_trim, aes(x = salary_amount)) +
geom_histogram() +
xlab("매출금액") +
ylab("빈도") +
ggtitle("매출금액의 분포") +
theme(plot.title = element_text(size = 20))
plot_hist <- function(x){
g <- ggplot(filter(card2_trim, category_l == x), aes(x = salary_amount)) +
geom_histogram() +
ggtitle(paste("대분류: ",x )) +
ylab("빈도")
if(x == "의료" | x == "음식" | x == "기타"){
g <- g + xlab("매출금액")
} else{
g <- g + theme(axis.title.x = element_blank())
}
return(as.grob(g))
}
options(repr.plot.width=8, repr.plot.height=6)
hists <- lapply(c("관광","취미","생활","쇼핑","교육","차량관련","의료","음식","기타"), plot_hist)
grid.arrange(grobs = hists, nrow = 3)
모든 카테고리의 매출이 한쪽으로 치우친 모습을 확인 할 수 있었습니다.
이런 점을 보완하기 위해 이상치의 영향을 받는 '평균'보다는 '중앙값'을 이용하는게 더 낫겠다는 판단을 했고,
'평균'이 아닌 '중앙값'을 이용해 매출액 증감 분석을 시행 했습니다.
코로나 확진자 추이
코로나19에 따른 소비 패턴의 변화를 알아보고자 하였으므로, 코로나 확진자 추이를 살펴보았습니다.
이때 우리나라에 첫 확진자가 발생한 2020년 1월 20일 부터 6월 30일까지의 정보가 있는 PatientInfo.csv 데이터를 사용하였습니다.
patient <- fread(file.choose(), encoding = "UTF-8") #PatientInfo 데이터셋 사용
patient$confirmed_date <- ymd(patient$confirmed_date)
patient <- patient %>%
arrange(confirmed_date)
patient_sum <- patient %>%
count(confirmed_date) %>%
filter(!is.na(confirmed_date)) %>%
mutate(month = month(confirmed_date))
options(repr.plot.width=10, repr.plot.height=6)
ggplot(patient_sum, aes(x = confirmed_date, y = n)) +
geom_point() +
geom_line(size = 1, color = "#FF9900") +
xlab("확진 날짜") +
ylab("확진자 수") +
ggtitle("코로나 확진자 수 추이") +
scale_x_date(breaks = seq(as.Date("2020-01-20"), as.Date("2020-06-30"), by = "1 week")) +
theme(axis.text.x = element_text(angle = 90),plot.title = element_text(size = 20))
위의 그래프를 통해 2월 말부터 급격하게 확진자가 늘어가는 모습을 확인 할 수 있었습니다.
그래서 1월을 일상 생활에서 코로나의 영향을 받기 '전'이라고 가정했고, 모든 매출 분석을 1월과 비교해서 시행했습니다.
월별 매출비 변화
'1월'을 기준으로 2,3,4,5,6월달의 매출비를 계산 했습니다.
# 월별, 대분류 업종별 매출건수의 합과 평균, 매출금액의 합과 평균, 1월 대비 증감비율
# month_l : 대분류 업종별 매출건수의 합, 평균, 중앙값, 매출금액의 합, 평균, 중앙값
month_l <- card2 %>%
group_by(year_month, category_l) %>%
summarize(count_sum = sum(salary_count), count_mean = mean(salary_count), count_median = median(salary_count),
amount_sum = sum(salary_amount), amount_mean = mean(salary_amount), amount_median = median(salary_amount))
get_ratio <- function(var){
per <- length(var) / 6
out <- c()
for(i in 0:5){
out <- c(out, var[(1+i*per):(per+i*per)] / var[1:per])
}
return(out)
}
ratio <- ungroup(month_l) %>%
mutate_at(vars(count_sum:amount_median), get_ratio) %>%
rename(count_sum_ratio = count_sum, count_mean_ratio = count_mean, count_median_ratio = count_median,
amount_sum_ratio = amount_sum, amount_mean_ratio = amount_mean, amount_median_ratio = amount_median)
month_l_ratio <- month_l %>%
inner_join(ratio, by = c("year_month", "category_l"))
options(repr.plot.width=10, repr.plot.height=6)
ggplot(month_l_ratio, aes(x = year_month, y = amount_median_ratio, group = category_l, color = category_l, shape = category_l)) +
geom_point(size = 4) +
geom_line(size = 1.5) +
scale_shape_manual(values = 10:18) +
ggtitle("1월 대비 월 중앙값 매출금액의 변화") +
xlab("월") +
ylab("매출액 비율") +
labs(color = "대분류", shape = "대분류")+
theme(plot.title = element_text(size = 20))
############################################################################################################################
예상대로 9개의 모든 업종이 1월달 대비 매출 비율이 하강한 것을 확인 할 수 있었습니다.
코로나19 확진자가 가장 많이 발생했던 2월,3월에 특히 많은 감소가 눈에 띕니다.
가장 타격을 많이 받은 두 업종은 4번(쇼핑),1번(관광) 업종이었고,
비교적 코로나19의 영향을 덜 받은 업종은 3번(생활),8번(음식) 으로 나타났습니다.
코로나19가 5개월 이상 지속 되면서 모든 업종이 조금씩 매출을 회복하고 있는것 같으나 여전히 코로나19 전 상황(1월)과 비교 해 봤을때 위축된 모습 입니다.
여기서 9번-기타의 경우는 공통점이 없는 업종들의 집합이라 생각하여 분석에서 제외했습니다.
카테고리별 세부 분석
코로나19로 인해 가장 타격을 많이 받은 쇼핑, 관광 업종과 비교적 영향을 덜 받은 생활, 음식 업종을 더 세부적으로 분석해보았습니다.
* 1월대비 매출 비율이 크게 감소한 하위 2개의 업종
관광(1번)
# 관광 소분류(14종)
card2$category_m<-as.character(card2$category_m)
category_1<-subset(card2,card2$category_l=="관광")
unique(category_1$category_m)
'기타숙박업' , '관광여행', '특급 호텔', '택 시', '항 공 사', '1급 호텔', '2급 호텔', '렌 트 카'' '여 객 선'' '기타교통수단', '고속 버스', '철 도', '콘 도', '택시회사'
위의 14개의 소분류 업종 중 1월 대비 매출의 증감을 계산해서 월별로 그 값이 가장 낮은 하위 3개의 업종을 뽑아봤습니다.
# 대분류 1 : 운송, 여행 관련 산업?
# travel_month_m : 여행 관련 산업의 월별, 업종별 매출건수의 합, 평균, 중앙값, 매출금액의 합, 평균, 중앙값
travel_month_m <- card2 %>%
filter(category_l == "관광") %>%
group_by(year_month, category_m) %>%
summarize(count_sum = sum(salary_count), count_mean = mean(salary_count), count_median = median(salary_count),
amount_sum = sum(salary_amount), amount_mean = mean(salary_amount), amount_median = median(salary_amount))
travel_month_m <- travel_month_m %>%
filter(category_m != "택시회사")
travel_ratio <- ungroup(travel_month_m) %>%
mutate_at(vars(count_sum:amount_median), get_ratio) %>%
rename(count_sum_ratio = count_sum, count_mean_ratio = count_mean, count_median_ratio = count_median,
amount_sum_ratio = amount_sum, amount_mean_ratio = amount_mean, amount_median_ratio = amount_median)
# travel_month_m_ratio : travel_month_m에 1월 대비 증감비율 추가
travel_month_m_ratio <- travel_month_m %>%
inner_join(travel_ratio, by = c("year_month", "category_m"))
#매출금액의 중앙값 1월 대비 증감비율이 가장 낮은 3개의 업종
x <- travel_month_m_ratio %>%
group_by(year_month) %>%
top_n(n = -3, amount_median_ratio)
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(x, year_month != "2020-01"), aes(x = year_month, y = amount_median_ratio, fill = category_m)) +
geom_col(position = "dodge") +
ylim(c(0, 1)) +
ggtitle("1월 대비 매출금액의 비율이 크게 감소한 하위 3개 업종") +
xlab("월") +
ylab("매출금액의 중앙값 비율") +
labs(fill = "중분류")+
theme(plot.title = element_text(size = 20))
하위 업종 3개씩을 살펴보니, 여객선, 택시, 항공사, 관광여행이 가장 매출이 크게 감소하였습니다.
특히 월별로 살펴보면 다음과 같습니다.
- 2월 : 여객선, 택시, 항공사
- 3월 : 여객선, 택시, 항공사
- 4월 : 여객선, 택시, 항공사
- 5월 : 관광여행, 택시, 항공사
- 6월 : 관광여행, 택시, 항공사
택시와 항공사는 2,3,4,5,6 꾸준히 타격을 많이 받은 업종으로 랭크되고 있었습니다.
그리고 2,3월에는 여객선이 있었는데, 이는 크루즈선 '다이아몬드 프린세스호'의 영향을 받은 것 같습니다.
또한, 5,6월에는 관광여행이 새롭게 랭크 된 모습을 보입니다.
5월에 황금연휴가 있었지만 단체로 이용하는 관광여행 상품은 많이 이용하지 않았을 것으로 추측됩니다.
그리고 2,3,4,5,6월 각각이 아닌 전체적으로 '관광' 카테고리에서 가장 타격을 많이 받은 top5를 선정해 봤습니다
travel_top_5 <- travel_month_m_ratio %>%
group_by(category_m) %>%
summarize(sum = sum(amount_median_ratio)) %>%
top_n(n = -5, sum)%>%
arrange(sum)
# sum 변수의 계산의 경우 각각의 소분류 별로 1월 대비 증감 비율을 합한 것입니다.(1월 포함)
travel_top_5
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(travel_month_m_ratio, category_m %in% travel_top_5$category_m), aes(x = year_month, y = amount_median_ratio, group = category_m, color = category_m, shape = category_m)) +
geom_point(size = 4) +
geom_line(size = 1.5) +
ggtitle("1월 대비 매출금액의 비율이 크게 감소한 하위 5개 업종") +
xlab("월") +
ylab("매출액 비율") +
labs(color = "중분류", shape = "중분류")+
theme(plot.title = element_text(size = 20))
###########################################################################################################
그래프를 보면
1.택시
2.항공사
3.여객선
4.관광여행
5.특급호텔
순으로 타격을 많이 받은(가장 매출이 크게 감소한) 모습을 확인 할 수 있었습니다.
이 그래프에서 흥미롭게 보이는 점은,
다른 업종은 1월 이후 매출이 감소한 후 아직까지 크게 회복하지 못했지만 특급 호텔의 경우 매출이 점차 회복을 하고 있는 추세입니다. 5월은 연휴의 영향이 있을 수 있으나, 6월에도 지속적인 회복세가 보이는 것으로 보입니다.
특히, 여객선의 경우 크루즈 선인 '다이아몬드 프린세스호'의 영향과, 특정한 공간에 여러 사람들이 모여있다는 공간적인 부분에서 주는 불안감 때문에 이용객이 줄은것으로 추측됩니다.
반면, 특급호텔의 경우 5,6월에 매출이 다시 올라가는 형태를 확인할수 있습니다. 이는 여행의 차선책으로써 분리된 공간에서 휴가를 보낼수 있는 방법이기 때문으로 보여집니다.
여기서 택시 같은 경우 관광 분야에서 가장 많은 매출 건수를 보이는 업종인데, 분석을 하다보니 코로나와 관련해서 재밌는 인사이트가 나타나 밑에서 자세히 다루도록 하겠습니다 :)
쇼핑(4번)
#쇼핑 소분류(46개)
category_4<-subset(card2,card2$category_l=="쇼핑")
unique(category_4$category_m)
'정장', '슈퍼 마켓', '편 의 점', '악세 사리', '기타잡화', '인터넷종합Mall', '대형할인점', '자사카드발행백화점', '신 발', '내의판매점', '기타유통업', '농축수산가공품', '인터넷Mall', '인터넷P/G', '기타의류', '상품권', '스포츠의류', '귀 금 속', '맞춤복 점', '가 방', 'CATV홈쇼핑', '침구수예점', '구내매점(국가기관등)', '아동의류', '제 화 점', '기타직물', '옷감 직물', '기념품 점', '상품권 전문판매', '전자상거래 상품권 전문판매', '시 계', '성인용품점', 'PG 상품권', '면 세 점', '양 품 점', '전자상거래 상품권', '통신판매1', '단체복', '연 쇄 점', '일반백화점', '공무원연금매점', '기타비영리유통', '와이셔츠/타이', '캐쥬얼의류', '통신판매2', '혼수전문점'
위의 쇼핑 카테고리에 속한 46개의 소분류 업종 중, 1월 대비 매출의 증감을 계산해서 월별로 그 값이 가장 낮은 하위 3개의 업종을 뽑아봤습니다.
# 대분류 4 : 쇼핑
shopping_month_m <- card2 %>%
filter(category_l == "쇼핑") %>%
group_by(year_month, category_m) %>%
summarize(count_sum = sum(salary_count), count_mean = mean(salary_count), count_median = median(salary_count),
amount_sum = sum(salary_amount), amount_mean = mean(salary_amount), amount_median = median(salary_amount))
shopping_ratio <- ungroup(shopping_month_m) %>%
mutate_at(vars(count_sum:amount_median), get_ratio) %>%
rename(count_sum_ratio = count_sum, count_mean_ratio = count_mean, count_median_ratio = count_median,
amount_sum_ratio = amount_sum, amount_mean_ratio = amount_mean, amount_median_ratio = amount_median)
shopping_month_m_ratio <- shopping_month_m %>%
inner_join(shopping_ratio, by = c("year_month", "category_m"))
x <- shopping_month_m_ratio %>%
group_by(year_month) %>%
top_n(n = -3, count_median_ratio)
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(x, year_month != "2020-01"), aes(x = year_month, y = count_median_ratio, fill = category_m)) +
geom_col(position = "dodge") +
ylim(c(0, 1)) +
ggtitle("1월 대비 매출금액의 비율이 크게 감소한 하위 3개 업종") +
xlab("월") +
ylab("매출금액의 중앙값 비율") +
labs(fill = "중분류")+
theme(plot.title = element_text(size = 20))
쇼핑 카테고리 하위 업종 3개씩을 살펴보니, 면세점, 인터넷Mall, 인터넷종합Mall, 전자상거래 상품권 전문판매 업종의 가장 매출이 크게 감소하였습니다.
특히 월별로 살펴보면 다음과 같습니다.
- 2월 : 면세점, 인터넷Mall, 전자상거래 상품권 전문판매
- 3월 : 면세점, 인터넷Mall, 인터넷종합Mall
- 4월 : 면세점, 인터넷Mall, 인터넷종합Mall
- 5월 : 면세점, 인터넷Mall, 인터넷종합Mall
- 6월 : 면세점, 인터넷Mall, 인터넷종합Mall
면세점은 2,3,4,5,6월 꾸준히 타격을 많이받은 업종으로 랭크 되고 있습니다.
이는 관광 카테고리에서 항공사 역시 매출 감소 top3에 꾸준히 랭크 되었던것과 연관이 있어 보입니다.
그런데 언택트시대에 접어들면서 온라인몰의 매출이 크게 증가하였을 것으로 예상했으나,
인터넷Mall과 인터넷종합Mall은 예상과 다르게 3월 부터 매출이 크게 감소하였습니다.
카드사에서 분류한 업종코드에서는 온라인쇼핑이 '인터넷 P/G'와 '인터넷Mall', '인터넷종합Mall'으로 나누어 구분되는데, 이 중 '인터넷Mall'과 '인터넷종합Mall'의 매출은 감소하는 경향을 보였습니다.
이는 코로나19에도 인터넷쇼핑 금액은 크게 늘어나지는 않았다고 해석할 수 있습니다.
전반적인 소비가 위축되어 꼭 필요하지 않은 소비는 지양했을 수 있고, '쇼핑' 전체의 소비가 줄어들어 인터넷쇼핑에도 영향을 주었을 것으로 추측됩니다. 이 부분은 조금 더 살펴보아야 할 것 같습니다.
▶ '인터넷쇼핑'에 대한 추가적인 분석
인터넷쇼핑 금액이 줄어들었다는 것은 예상과 너무 다른 부분이라 쇼핑 카테고리에서 인터넷쇼핑에 대한 매출금액 합계와 평균도 살펴보았습니다. 흥미로운 점은, '인터넷 P/G' 와 '인터넷Mall', '인터넷종합Mall' 이 매출금액 합계와 평균 모두 상위 5개 그룹에 포함되었다는 것입니다.
internet_sum_top5 <- shopping_month_m_ratio %>%
group_by(year_month) %>%
top_n(n = 5, amount_sum)
options(repr.plot.width=12, repr.plot.height=4)
g1 <- ggplot(internet_sum_top5, aes(x = year_month, y = amount_sum, fill = category_m)) +
geom_col(position = "dodge") +
ggtitle("쇼핑 카테고리의 상위 5개 업종의 월별 매출금액 합계") +
labs(x = "월", y = "매출금액", fill = "중분류")+
theme(plot.title = element_text(size = 20))
internet_mean_top5 <- shopping_month_m_ratio %>%
group_by(year_month) %>%
top_n(n = 5, amount_mean)
g2 <- ggplot(internet_mean_top5, aes(x = year_month, y = amount_mean, fill = category_m)) +
geom_col(position = "dodge") +
ggtitle("쇼핑 카테고리의 상위 5개 업종의 월별 매출금액 평균") +
labs(x = "월", y = "매출금액", fill = "중분류")+
theme(plot.title = element_text(size = 20))
grid.arrange(g1, g2, ncol = 2)
그래프를 통해 매출금액 합계와 평균의 상위 5개를 보면,
1월에 인터넷쇼핑 매출이 쇼핑 카테고리 내에서도 가장 높았던 모습을 볼 수 있습니다.
즉, 저희가 기준으로 설정했던(생활에서 코로나19의 영향을 받기 전) 1월에 매출이 이미 높았기 때문에, 2~6월의 매출은 그에 비해 줄어든 것으로 계산이 되었습니다.
또한, 1월에는 인터넷쇼핑의 건수 당 금액이 크게 나타났습니다. 따라서 1월 대비 월별 매출의 비율을 계산할 때, 월별 매출의 중앙값을 사용했더니 이 특징이 더 두드러지게 나타난 것으로 보이기도 했습니다. 이는 1월에 있던 명절의 영향이 있지 않을까 추측해 보았습니다.
→ 인터넷쇼핑에 대한 추가적인 분석을 통해 알 수 있는 부분은
- 1월 대비 월별 매출의 비율을 계산할 때, 월별 매출금액의 중앙값 / 합계 / 평균 중 어느 것을 사용하느냐에 따라 결과가 달라지는 업종이 있었습니다.
- 치우친 분포 특성을 고려하여, '중앙값'을 선택하였고, 이에 따른 변화가 다른 카테고리에서는 '쇼핑' 카테고리만큼 크게 나타나지는 않았습니다.
- 1월은 일상 생활에서 코로나19의 영향을 받기 전이라고 가정했는데, 1월만을 기준으로 코로나19의 전과 후를 나누기에는 한계가 있었습니다.
- 2020년 1월 ~ 2020년 6월 중순까지의 주어진 데이터를 최대한 활용하려고 했으나 코로나 전과 후로 정확하게 비교하기에는 부족한 면이 있었던 것 같습니다. 명절과 같은 1월만의 특수성을 제외하지 못하기 때문입니다.
위에서 각 월별로 가장 타격을 많이 받은 업종을 살펴보았고,
이번에는 2,3,4,5,6월 전체적으로 쇼핑 카테고리에서 가장 타격을 많이 받은 top5를 선정해 봤습니다
shopping_top_5 <- shopping_month_m_ratio %>%
group_by(category_m) %>%
summarize(sum = sum(amount_median_ratio)) %>%
top_n(n = -5, sum)%>%
arrange(sum)
shopping_top_5
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(shopping_month_m_ratio, category_m %in% shopping_top_5$category_m), aes(x = year_month, y = amount_median_ratio, group = category_m, color = category_m, shape = category_m)) +
geom_point(size = 4) +
geom_line(size = 1.5) +
ggtitle("1월 대비 매출금액의 비율이 크게 감소한 하위 5개 업종") +
xlab("월") +
ylab("매출액 비율") +
labs(color = "중분류", shape = "중분류")+
theme(plot.title = element_text(size = 20))
그래프를 보면,
1.면세점
2.인터넷 Mall
3.농축수산 가공품
4.인터넷 종합Mall
5.상품권
순으로 매출 타격이 심했던 것으로 나타 났습니다.
* 1월대비 코로나19의 영향을 덜 받은 상위 2개의 업종
이번엔 코로나19에 영향을 비교적 덜 받은(매출이 비교적 적게 감소한) 상위 2개의 업종인 생활과 음식을 자세히 살펴보려 합니다.
생활(3번)
#생활 소분류(18개)
category_3<-subset(card2,card2$category_l=="생활")
unique(category_3$category_m)
'사진관', '가전 제품', '기타가구', '주 유 소', '유류 판매', '기타전기제품', '일반 가구', '주방 용구'', '주방용식기', '카 메 라',
'L P G', '냉열 기기', '기타광학품', '정 수 기', '철제 가구', '전기차충전소', '기타주방용구', '기타연료'
생활 카테고리에 속하는 18개의 소분류 업종 중, 1월 대비 매출의 증감을 계산해서 월별로 그 값이 가장 높은 상위 3개의 업종을 뽑아봤습니다.
###########################################################################################################
# 대분류 3 : 생활
life_month_m <- card2 %>%
filter(category_l == "생활") %>%
group_by(year_month, category_m) %>%
summarize(count_sum = sum(salary_count), count_mean = mean(salary_count), count_median = median(salary_count),
amount_sum = sum(salary_amount), amount_mean = mean(salary_amount), amount_median = median(salary_amount))
life_ratio <- ungroup(life_month_m) %>%
mutate_at(vars(count_sum:amount_median), get_ratio) %>%
rename(count_sum_ratio = count_sum, count_mean_ratio = count_mean, count_median_ratio = count_median,
amount_sum_ratio = amount_sum, amount_mean_ratio = amount_mean, amount_median_ratio = amount_median)
life_month_m_ratio <- life_month_m %>%
inner_join(life_ratio, by = c("year_month", "category_m"))
x <- life_month_m_ratio %>%
group_by(year_month) %>%
top_n(n = 3, amount_median_ratio)
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(x, year_month != "2020-01"), aes(x = year_month, y = amount_median_ratio, fill = category_m)) +
geom_col(position = "dodge") +
ggtitle("1월 대비 매출금액의 비율이 크게 증가한 상위 3개 업종") +
xlab("월") +
ylab("매출금액의 중앙값 비율") +
labs(fill = "중분류")+
theme(plot.title = element_text(size = 20))
생활 카테고리 상위 업종 3개씩을 살펴보니, 기타광학품, 냉열기기, 전기차충전소, 정수기, 철제가구 업종으로 나타났습니다. 특히 월별로 살펴보면 다음과 같습니다.
- 2월 : 기타광학품, 냉열기기, 전기차충전소
- 3월 : 기타광학품, 전기차충전소, 정수기
- 4월 : 기타광학품, 정수기, 철제가구
- 5월 : 냉열기기, 정수기, 철제가구
- 6월 : 기타광학품, 냉열기기, 정수기
특히 3월달에 기타 광학품 소비가 크게 증가한것이 보여집니다.
이번엔 2,3,4,5,6월 전체적으로 생활 카테고리에서 코로나19의 영향을 적게받은 업종 5개를 선정해 보았습니다.
life_top_5 <- life_month_m_ratio %>%
group_by(category_m) %>%
summarize(sum = sum(amount_median_ratio)) %>%
top_n(n = 5, sum)%>%
arrange(sum)
life_top_5
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(life_month_m_ratio, category_m %in% life_top_5$category_m), aes(x = year_month, y = amount_median_ratio, group = category_m, color = category_m, shape = category_m)) +
geom_point(size = 4) +
geom_line(size = 1.5) +
ggtitle("1월 대비 매출금액의 비율이 크게 증가한 상위 5개 업종") +
xlab("월") +
ylab("매출액 비율") +
labs(color = "중분류", shape = "중분류")+
theme(plot.title = element_text(size = 20))
코로나의 영향을 덜받은 업종(품목)은 순서대로 다음과 같습니다.
1.기타광학품
2.냉열기기
3.전기차충전소
4.정수기
5.철제가구
냉열기기,정수기,철제가구 등은 코로나와 상관없이도 기본 생활에 필요한 물품이기 때문에 영향을 적게 받은것 같습니다.
기타광학품은 확대경, 쌍안경 등의 광학 기기로 추측되는데 특히 3월달에 매출비가 증가한것으로 보아 코로나 바이러스 연구를 위한 기업측의 소비가 아닐까 추측됩니다.
음식(8번)
#음식 소분류(21개)
category_8<-subset(card2,card2$category_l=="음식")
unique(category_8$category_m)
'기타음료식품', '농축수산품', '정 육 점', '제과점', '스넥', '주점', '서양음식', '중국음식','일식회집', '일반한식', '단란주점', '유흥주점', '칵테일바', '기타건강식', '주류판매점', '위탁급식업','홍삼 제품', '미곡상', '인삼 제품', '갈비전문점', '한정식'
21개의 소분류 업종 중 1월 대비 매출의 증감을 계산해서 월별로 그 값이 가장 높은 상위 3개의 업종을 뽑아봤습니다.
# 대분류 8 : 음식
food_month_m <- card2 %>%
filter(category_l == "음식") %>%
group_by(year_month, category_m) %>%
summarize(count_sum = sum(salary_count), count_mean = mean(salary_count), count_median = median(salary_count),
amount_sum = sum(salary_amount), amount_mean = mean(salary_amount), amount_median = median(salary_amount))
food_ratio <- ungroup(food_month_m) %>%
mutate_at(vars(count_sum:amount_median), get_ratio) %>%
rename(count_sum_ratio = count_sum, count_mean_ratio = count_mean, count_median_ratio = count_median,
amount_sum_ratio = amount_sum, amount_mean_ratio = amount_mean, amount_median_ratio = amount_median)
food_month_m_ratio <- food_month_m %>%
inner_join(food_ratio, by = c("year_month", "category_m"))
x <- food_month_m_ratio %>%
group_by(year_month) %>%
top_n(n = 3, amount_median_ratio)
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(x, year_month != "2020-01"), aes(x = year_month, y = amount_median_ratio, fill = category_m)) +
geom_col(position = "dodge") +
ggtitle("1월 대비 매출금액의 비율이 크게 증가한 상위 3개 업종") +
xlab("월") +
ylab("매출금액의 중앙값 비율") +
labs(fill = "중분류")+
theme(plot.title = element_text(size = 20))
음식 카테고리 상위 업종 3개씩을 살펴보니, 갈비전문점, 서양음식, 스낵, 제과점, 미곡상 업종으로 나타났습니다.
특히 월별로 살펴보면 다음과 같습니다.
- 2월 : 갈비전문점, 서양음식, 스낵
- 3월 : 서양음식, 스낵, 제과점
- 4월 : 갈비전문점, 서양음식, 스낵
- 5월 : 미곡상, 서양음식, 스낵
- 6월 : 갈비전문점, 서양음식, 스낵
스낵과 서양음식은 2,3,4,5,6월 꾸준히 랭크 되고 있는 모습입니다.
아무래도 실내에 머무는 시간이 길어지면서 스낵과 같은 간단하게 소비 가능한 음식의 수요가 느는것 같습니다.
이번엔 2,3,4,5,6월 전체적으로 음식 카테고리에서 코로나19의 영향을 적게받은 업종 5개를 선정해 보았습니다.
food_top_5 <- food_month_m_ratio %>%
group_by(category_m) %>%
summarize(sum = sum(amount_median_ratio)) %>%
top_n(n = 5, sum)%>%
arrange(sum)
food_top_5
options(repr.plot.width=8, repr.plot.height=5)
ggplot(filter(food_month_m_ratio, category_m %in% food_top_5$category_m), aes(x = year_month, y = amount_median_ratio, group = category_m, color = category_m, shape = category_m)) +
geom_point(size = 4) +
geom_line(size = 1.5) +
ggtitle("1월 대비 매출금액의 비율이 크게 증가한 상위 5개 업종") +
xlab("월") +
ylab("매출액 비율") +
labs(color = "중분류", shape = "중분류")+
theme(plot.title = element_text(size = 20))
음식 카테고리에서 코로나19의 영향을 덜받은 업종(품목)은 순서대로 다음과 같습니다.
1.스낵
2.서양음식
3.갈비전문점
4.미곡상
5.일반한식
확진자수가 급증한 2~3월에 외식 소비가 많이 하락한것이 전체 '음식' 카테고리의 매출에 영향을 준 것 같습니다.
그리고 한식은 월별 top3에 없었는데 전체적으로 봤을때 새롭게 랭크되었습니다.
결론
요약
- 코로나19가 생활에 미친 영향을 알아보기 위하여 코로나19가 우리나라에 직접적인 영향을 주기 전인 1월을 기준으로 월별 업종별 매출 증감액을 살펴보았습니다. 업종을 비슷한 업종끼리 분류하여 분석을 진행하였고, 카테고리별 매출액 분포를 통하여 매출액의 통계량으로는 중앙값을 이용하였습니다.
- 포스트 코로나 시대에 대비하기 위해서는 코로나19와 같은 전염병에 큰 타격을 받는 업종과 상대적으로 그렇지 않은 업종을 알아야 한다고 판단하였습니다. 따라서 코로나로 인해 매출액에 타격을 받은 업종인 쇼핑과 관광에 대해 살펴보고 영향을 덜 받은 업종인 생활과 음식에 대해 살펴보았습니다.
- 그 결과, 전반적으로 소비가 줄어들고 소비 패턴에 변화가 나타났습니다. 당분간 이러한 위드 코로나 시대의 소비 패턴은 이어질 것으로 보입니다.
시사점
- 관광과 쇼핑이 코로나의 영향을 가장 많이 받은 업종이라고 판단됩니다. 그러나 특급 호텔과 같이 사람이 많이 모이지 않는 장소나 지역에서는 매출이 큰 회복세를 보이고 있습니다. 특히 특급호텔 같은 경우는 3월 이후로 매출액이 증가하는 경향을 보이고 있는데 이는 코로나 이후로 호캉스가 유행하기 시작한 결과로 보여집니다. 따라서 국외여행보다는 국내여행과 관련한 산업의 매출상승을 기대할 수 있으며, 사람들이 밀집하지않는 장소의 매출상승 또한 기대할 수 있음을 보여줍니다.
- 쇼핑 분야의 경우, 언택트시대에 접어들면서 인터넷거래 매출이 증가할것으로 예상했으나 예상과는 다르게 감소했음을 확인하였습니다. 그러나 코로나19 이전에도, 이후에도 다른 업종에 비해 강세를 보였기 때문에 앞으로 지속적인 관찰이 필요할 것입니다. 그리고 인터넷결제 내부에서도 구체적으로 어떠한 업종의 결제가 많았는지를 알 수 있다면 정확한 파악이 가능할 것입니다.
- 생활/음식은 다른 업종에 비해서 코로나의 타격을 덜 받은 업종으로 보입니다. 이는 2,3월에 매출액의 비율이 줄어들지만 그 이후로는 증가하는 추세를 통해서 확인할 수 있습니다. 음식이나 생활과 관련된 생활에서 필수불가결한 업종이 비교적 영향을 덜 받기 때문에, 생활에서 가장 필요한 것을 위주로 기존 산업을 확장해나갈 수 있을 것입니다.
한계점
- 코로나19가 우리 생활에 직접적인 영향을 주기 전이라고 판단한 '1월'을 기준으로 하여 최근 소비 패턴의 변화를 볼 수 있었다는 점이 흥미로웠습니다.
- 다만, card data set의 경우 2020.01.04 부터 2020.06.14에 수집된 데이터로 한정되어 있기 때문에 코로나 발생 전과 후에 전체적인 소비 패턴을 비교하기 어렵다는 한계점이 있습니다.
- 또한, card data set의 경우 서울지역에 한하여 데이터가 제공된다는 한계가 존재합니다.
- 마지막으로 1월을 기준으로 소비 패턴의 변화를 살펴보다 보니, 1월만이 가지고 있는 특수성(이벤트, 계절성 등)을 고려하지 못했다는 점입니다. 이는 전년 동월을 기준으로 변화를 더 자세히 살펴보아야 할 것 같습니다.(index 데이터의 경우 특정 업종만 데이터가 있어 반영하기에 어려움이 있었습니다.)
마무리
- 이번 분석을 통해, 인구밀집도가 높은 산업은 영향을 크게 받지만 밀집도가 낮은 산업이나 살아가는데 필요한 업종은 영향을 크게 받지 않음을 확인하였습니다.
- 소비 패턴을 확인해봤을 때, 정부적 차원에서 '사회적 거리두기'를 권고했던 것이 국민들의 소비와 생활에 반영이 되었음을 알 수 있었습니다. 나 혼자만 거리두기를 실천하고 있는것 같지만 그렇지만은 않은 것 같습니다ㅎㅎ 불편하고 힘들겠지만 다같이 노력하면 이겨낼 수 있지 않을까요?! 모두 건강하시기를 바랍니다! 대한민국 화이팅!!!!
'데이터 분석 > 프로젝트' 카테고리의 다른 글
[Python] 유통 데이터를 활용한 리텐션과 RFM 분석(1) (0) | 2024.07.21 |
---|---|
[마케팅 데이터 분석] AARRR 실습(1) - Acquisition (2) | 2023.09.09 |
[논문] Encoder Decoder 알고리즘을 이용한 시계열 자료 예측 (0) | 2022.08.11 |
[생존분석] R을 이용한 백혈병 환자 데이터 분석 (0) | 2022.08.10 |
위드(with)코로나 시대 소비 변화 - 번외 (0) | 2022.08.09 |