자동차의 등장과 보급은 인류에게 커다란 은혜였습니다. 그러나 현대에 들어, 마냥 좋은 것만은 아니었다는 사실이 속속 드러났습니다. 탄소 에너지는 점점 고갈되고 있으며, 환경파괴는 수많은 문제를 낳고 있습니다. 이미 자동차를 포기할 수 없게 되어버린 인류는 다른 해결책을 찾아야만 했습니다. 저공해의 새로운 에너지원은 인류의 해결책 중 하나였고, 그 중에서도 수소 에너지 또한 거기 해당됩니다. 인류는 다시 해답을 찾아냈고 마침내 수소연료 자동차를 만드는데 성공했습니다. 그 중에서도 수소전기차(수소를 이용해 전기를 생산하여 작동하는 방식의 자동차, FCEV)가 우선적으로 개발되었으며, 한국에서 현대자동차에 의해 세계 최초로 상용화 되었습니다.
이렇게 가장 앞선 수소전기차 기술을 보유한 한국은 ‘수소 공화국’이 되어 4차 산업혁명을 선도할 수 있는 위치에 올랐습니다. 그러나 사람들에게 수소전기차는 아직 생소합니다. 그 실상은 수소를 충전할 수 있는 시설이 한국에는 아직 30개 남짓이며, 서울시 내에 설치된 숫자는 3개에 불과합니다(2020.05 기준). 수소차를 운용할 인프라가 구축되지 못한 것입니다. 이에 서울시는 2022년까지 15곳의 수소충전소를 운영하기로 계획했습니다. 수소충전소의 설치는 수소 사회가 다가오면서 점점 늘어날 것입니다. 그에 따라 충전소의 적정 입지에 대한 분석이 필요한 상황입니다. 수소 공급 문제의 해결 과정에서 한국은 미래 에너지 시장에서 더욱 확고한 위치를 점할 수 있을 것입니다.
우선 서울시 내 각 동별 수소전기차 소유 대수와 수소충전소 위치의 좌표 데이터를 사용했습니다. 안타깝게도 현재 표본이라 할 수 있는 수소 충전소가 충분하지 않기 때문에 일반 주유소의 입지조건을 변수로 하여, (주유소수, 등록차량수, 대비 주유소수, 유입교통량, 유출교통량, 공시지가, 대학수, 사업체수, 유통업체수, 주차장면적, 학교수, 도로면적, 총생활인구수, 주간인구수, 야간인구수)의 14가지 변수를 통해 충전소 입지 선정의 요인과 그 중요도를 분석했습니다. 변수 선정은 ‘AHP를 활용한 주유소 입지 연구(한주옥 외 1, 부동산연구: 제26집 제4호 2016. 12)’를 참고했습니다. 대부분의 자료는 서울시 열린 데이터광장에서 구할 수 있었으며, 자치구 별 각 수소충전소들과의 거리는 자치구 좌표를 서울시 제공 자료에서, 수소충전소 좌표를 구글 어스에서 얻어 직선거리로 표시했습니다. 강북구는 유입ㆍ유출교통량이 제공되지 않아 결측치인 상태로 처리했습니다.
범주 | 변수 | 출처 |
---|---|---|
‘경제적 요인’ | ‘주유소수’ | ‘서울시 열린데이터광장’ |
‘경제적 요인’ | ‘차량등록대수’ | ‘서울시 열린데이터광장’ |
‘경제적 요인’ | ‘수소전기차 등록대수’ | ‘서울시 열린데이터광장’ |
‘경제적 요인’ | ‘사업체수’ | ‘서울시 열린데이터광장’ |
‘경제적 요인’ | ‘유통업체수’ | ‘서울시 열린데이터광장’ |
‘경제적 요인’ | ‘등록차량수 대비 주유소수’ | ‘파생변수’ |
‘인구학적 요인’ | ‘주간인구수’ | ‘서울시 열린데이터광장’ |
‘인구학적 요인’ | ‘총생활인구수’ | ‘서울시 열린데이터광장’ |
‘인구학적 요인’ | ‘야간인구수’ | ‘서울시 열린데이터광장’ |
‘교통요인’ | ‘주차장면적’ | ‘서울시 열린데이터광장’ |
‘교통요인’ | ‘유입교통량’ | ‘서울시 열린데이터광장’ |
‘교통요인’ | ‘유출교통량’ | ‘서울시 열린데이터광장’ |
‘교통요인’ | ‘도로면적’ | ‘서울시 열린데이터광장’ |
‘교통요인’ | ‘각 수소충전소와의 거리’ | ‘서울시 열린데이터광장, 구글 어스’ |
‘토지이용 요인’ | ‘공시지가’ | ‘서울시 열린데이터광장’ |
‘토지이용 요인’ | ‘대학수’ | ‘서울시 열린데이터광장’ |
‘토지이용 요인’ | ‘학교수’ | ‘서울시 열린데이터광장’ |
표 1 - 분석에 사용된 변수
서울시를 자치구 기준으로 나누어 수소 충전소 설치의 우선순위를 연구했습니다. 전처리 과정에서 충전소 관련 변수와 차량 관련 변수로 나누어 진행했습니다. 충전소 관련 변수 중 결측치인 강북구의 교통량은 데이터가 있는 자치구들을 분석한 결과, 도로면적과 교통량 간 상관관계가 높은 것으로 파악되어 유일변수로 회귀분석을 실시해 결측치를 채워넣었습니다. 동 기준으로 차량 관련 변수 자료 수집 중에 동의 구분 형태가 행정동과 법정동 두 가지인 것을 확인하고, 이후 데이터를 차량 대수 데이터에 맞추어 자치구 기준으로 변환했습니다. 그 결과 법정동을 기준으로 한 변수가 적고 표본이 많은 데이터와 자치구를 기준으로 한 변수가 많고 표본이 적은 데이터 두 가지가 산출되었습니다. 입지 우선순위를 선정하기 위해 Random Forest, Decision Tree, Bagging, GLM(Generalized Linear Model)를 이용해 변수들과 표본의 상관관계를 분석했습니다. 우선 변수들 각각의 중요도를 분석해 의미 있는 변수들을 파악했습니다. 이것을 바탕으로 수소충전소의 존재가 해당 자치구의 수소자동차 보유량에 미치는 영향을 분석하여 그 중 예측력과 해석력이 나은 모델을 선택했습니다.
수소전기차에 대한 한국의 법적 정의는 다음과 같습니다. ‘연료전지 자동차(Fuel Cell Electric Vehicle: FCEV; 약칭 수소전기차)’란 수소를 사용하여 발생시킨 전기에너지를 동력원으로 사용하는 자동차로 정의된다(「환경친화적 자동차의 개발 및 보급 촉진에 관한 법률」(이하 친환경자동차법) 제2조). 사실 수소전기차 이전에 수소를 엔진에서 직접 연소하는 방식의 수소연료 자동차(Hydrogen Fueled Car)가 먼저 연구되었지만, 상대적으로 낮은 효율로 인해 사장되고 말았습니다. 그에 비해 수소연료전지를 통해 구동에너지를 활용할 경우 동급 내연기관 자동차의 2배 정도의 에너지 효율을 보여 수소차의 초점이 수소전기차로 옮겨지게 되었습니다.전기를 이용하는 전기차와 비교해도 긴 주행거리, 짧은 충전시간, 친환경성, 대형차 적용가능성 등으로 인해 많은 관심을 받고 있습니다. 그래서 최근에는 사실상 수소연료전지차가 ‘수소차’의 동의어로 인식되고 있으며, 친환경에너지차량 시장에서 전기차와 함께 각광받는 존재가 되었습니다.
inflow.lm <- lm(inflow~road_area, data=gas_tbl_lm)
outflow.lm <- lm(outflow~road_area, data=gas_tbl_lm)
gas_tbl$inflow[3] <- predict(inflow.lm, newdata = gas_tbl %>% filter(gu == '강북구') %>% select(-gu))
gas_tbl$outflow[3] <- predict(outflow.lm, newdata = gas_tbl %>% filter(gu == '강북구') %>% select(-gu))
가깝든 멀든 전부 유의미한 상관관계(정도의 차이는 있음)
R파일: modeling2_glm.R
cv를 이용한 glm 모델 사용
새로운 충전소가 추가되었을 때, 가까운 충전소 거리가 최신화 됨을 이용하여 test set 형성
변화된 test set에 따라서 자치구 별 차량 대수 예측
결과 비교 : before/ before_pred / after_pred -> 원래 차량수 / 차량수 예측(현재 기준) / 차량수 예측(충전소가 설치됨을 반영)
#라이브러리 가져오기
library(tidyverse)
library(dplyr)
library(caret)
library(kernlab)
library(tidyverse)
#데이터 가져오기
car_gu <- read.csv('data/cleansing/car_gu.csv')
car <- read.csv('data/cleansing/car_v2.csv')
pop <- read.csv('data/cleansing/population.csv')
gas <- read.csv('data/cleansing/gasstation_imputation.csv')
#전처리
pop <- pop %>%
janitor::clean_names()
total_pop <- pop %>%
group_by(jachigu) %>%
summarise(total_pop = sum(gye)) #구별 인구수 계산
car_gu <- cbind(car_gu, total_pop[,2]) #데이터 합치기
gas <- gas %>%
select(-car)
data <- merge(car_gu, gas, by = 'gu')
data <- data %>%
select(-c('gu','r1_from','r2_from','r3_from','r4_from', 'lat','lng'))
data <- data %>%
select(c("Hyd_car","r1", "r2", "outflow", "land_value", "enterprise", "distributor") )
data
#CV
a <- order(runif(dim(data)[1]))
folds <- createFolds(a, k = 10)
ctrl <- trainControl(method="repeatedcv", number=10, repeats=5)
modFit_repeatedcv <- train(Hyd_car ~., data=data, method="glm", trControl = ctrl)
#simulation from glm model
col_model <- colnames(data)
data_new <- car_gu %>%
full_join(gas, by ="gu") %>%
select(all_of(col_model), lat, lng) %>%
mutate(d1 = r1, d2 = r2, before_car = Hyd_car) %>%
select(-c(r1,r2, Hyd_car))
loc_data <- car %>%
mutate(idx = row_number()) %>%
select(idx, gu, dong ,lat, lng)
#Edit here idx number
new_gas <- loc_data[loc_data$idx ==150,]
new_gas
data_dist <- data_new %>%
mutate(d3 = sqrt((lat - new_gas$lat)^2+
(lng - new_gas$lng)^2)) %>%
select(d1,d2,d3)
r1 <- apply(data_dist, 1, min)
r2 <- apply(data_dist, 1, median)
#generate simulation data
data_simul <- data_new %>%
select(-c(d1,d2, lat, lng)) %>%
data.frame( r1, r2)
# simulating by glm
# cross_validation_glm.R 돌리기
simul_result <- data.frame(gu =car_gu$gu,
before = data_simul$before_car,
before_pred = predict(modFit_repeatedcv, data),
after_pred = predict(modFit_repeatedcv, data_simul))
#compare before, after
apply(simul_result[,2:4],2, sum)
#Top5 산출
a <- 0:4 #87번째줄 /Top N 까지 산출하고 싶으면 0:(N-1)로 수정하기
idx <- data.frame(sapply(sort(pred_zip, index.return=TRUE), `[`, length(pred_zip)-a))$ix
loc_data[idx,] %>% select(gu, dong) #쌍문동, 길음동, 창동, 미아동, 하월곡동
Rhino github page에서 당신도 Rhino에 참여하실 수 있습니다.
Rhino shiny dashbord에서 Rhino의 분석결과를 확인할 수 있습니다.
Rhino blog에서 한눈에 보기