인구 데이터 및 교통/문화 데이터를 분석하여,
온누리상품권을 활성화할 수 있는 방안을 제시해보고자 한다.
이 글은 3가지 방법으로 선정한 활성화 지표를 바탕으로 온누리상품권 활성화 방안 제안에 이어지는 내용으로, 먼저 확인하면 내용 이해에 도움이 될 것이다.
이어서 온누리상품권 활성화 방안을 제안하기 위해, 시계열 분석과 클러스터링을 추가로 진행해보았다.
시계열 분석은 시간의 흐름에 따라 일정한 간격으로 사건을 관찰하고, 미래의 관측값을 예측하는 분석 기법이다. 즉, 과거의 관측값을 분석해 모델링하고 생성한 모델을 바탕으로 미래를 예측한다.
우리가 사용할 '지출 데이터'는 경제 상황에 영향을 받는 트렌드와 특정 기간에 급격히 증감하는 계절성을 가질 가능성이 높기 때문에, 비정상 시계열 분석에 사용하는 ARIMA 모델 활용이 적합하다고 판단하였다.
활성화 지표를 이야기할 때는, 온누리상품권 회수금액에 관한 데이터를 사용했다. 이때는 전국에 대한 활성화 지표를 선정하고 활성화 방안을 제안하는 것이 타당하다고 생각했기 때문이다.
하지만, 시계열 분석에서는 서울시 빅데이터 캠퍼스의 서울시민 라이프스타일 재현 데이터를 사용하여 서울시민의 지출에 맞는 방안을 제안하는 것이 타당하다고 생각했기 때문에 이 데이터를 사용하였다.
날짜에 해당하는 기준 년분기 코드 열의 데이터 타입은 object였기 때문에, 시계열분석을 위해 날짜로 변환할 필요가 있었다.
# 연도와 분기로 나누기
seoul_high['연도'] = seoul_high['기준_년분기_코드'].astype(str).str[:4].astype(int)
seoul_high['분기'] = seoul_high['기준_년분기_코드'].astype(str).str[-1].astype(int)
# 분기를 날짜로 변환 (분기별 첫 날로 설정)
seoul_high['날짜'] = pd.to_datetime(seoul_high['연도'].astype(str) + '-' + ((seoul_high['분기'] - 1) * 3 + 1).astype(str) + '-01')
앞에서 선정한 상위/하위 자치구에 대해 시계열 분석을 진행했고, 자치구마다 다른 모델을 사용해줬다.
model_jung = ARIMA(jung['지출_총금액'], order=(1,1,1))
fitted_jung = model_jung.fit()
데이터의 날짜 주기가 분기별로 정리되어있었고, 향후 1년을 예측하여 결론을 내고 싶어서 4분기를 예측하였다.
#12개월 예측(4분기)
forecast_jung = fitted_jung.forecast(steps=4)
결과 해석을 위해 시각화를 했다.
#예측 결과 시각화
plt.figure(figsize=(12,6))
plt.plot(jung['지출_총금액'], label = '실제 지출_총금액')
plt.plot(forecast_jung, label = '예측 지출_총금액', linestyle='--')
plt.title('중구 지출_총금액 예상')
plt.legend()
plt.show()

시각화한 결과를 통해 재밌는 현상을 관찰할 수 있었다. 상위/하위 자치구에서 모두 홀수 분기에 지출이 감소하는 것을 확인할 수 있었다.
그렇다면, 왜 그럴까? 그 이유를 찾아볼 필요가 있었다.
홀수 분기에 지출이 감소하는 원인은 다음과 같이 생각해볼 수 있다.
그렇다면 이러한 홀수분기에 지출을 이끌어낼 수 있는 방법, 특히 온누리상품권을 통한 지출을 늘릴 수 있는 방법에 관해 고민하여 활성화 방안을 도출할 수 있었다.
시계열 분석을 통해 도출할 수 있는 활성화 방안은 다음과 같다.
온누리상품권 사용액 증가를 위해 소비자에게 다양한 프로모션을 제공한다. 공주시 전통시장 및 상점가 조사의 온누리상품권 활성화 사업 중 정책 만족도 3위인 '명절 특별 할인 이벤트'를 바탕으로 서울특별시에도 이 이벤트를 진행한다면 주로 홀수분기에 있는 명절에 이익 증가 효과를 기대해볼 수 있다.
k-means clustering은 데이터를 k개의 군집으로 묶는 알고리즘이다. 알고리즘의 개요는 다음과 같다.
서울시빅데이터캠퍼스의 서울시민 라이프스타일 재현데이터를 활용하였다.
이 데이터에는 거주 자치구, 성별, 생년월일, 가구 정보, 소득/지출 정보에 대한 데이터들이 담겨있다.
이 공모전에서 원데이터 자체를 반출하여 사용할 수 없었기 때문에, 우리는 전처리를 통해 필요한 열들만 가져왔다.
특히, 소득/지출 정보에 대한 정확한 값들을 가져올 수 없었기 때문에 이를 사분위수로 나눠서 해당하는 사분위수로 value를 대체해서 반출하였다.
k-means를 위한 전처리는 크게 2가지로 실행하였다.
데이터의 '성별' 열은 남, 여로 되어있어서 이를 숫자로 변환할 필요가 있었다. 그래서 LabelEncoder를 활용하였다.
label_encoder = LabelEncoder()
df['성별'] = label_encoder.fit_transform(df['성별'])
사실 get_dummies() 함수를 사용해도 괜찮았겠지만, 우리는 '성별' 열만 바꾸면 되었기 때문에 encoder를 사용해주었다.
각 컬럼들의 range가 다르기 때문에, 대체로 큰 값을 가지는 컬럼이 더 중요하게 적용될 가능성이 있었다. 하지만, 모든 열들을 같은 레벨에서 군집화를 해주고 싶었기 때문에 scaling을 진행했다. MinMaxScaler()를 사용했다.
scaler = MinMaxScaler()
df_sp[[]] = scaler.fit_transform(df_sp[[]]) #필요한 열들 넣어주기
k-means의 단점이자 장점이라고 할 수 있는 부분은 k값을 우리가 결정하는 것이라고 생각한다. 보통 단점이라고 하는데 왜 나는 장점이라고 생각하냐면, 특정 도메인 지식이 있을 때 k값을 자유롭게 설정해줄 수 있기 때문에 사용하기 좋다고 생각한다.
하지만, 이 테스크에서는 k값을 어떻게 설정해야한다는 것이 없었기 때문에 elbow method를 통해 k값을 결정해주었다.

따라서 k=4로 결정했다.
k=4라는 것을 바탕으로 군집화를 진행했다.
kmeans = KMeans(n_cluster=4, random_state=42)
df_sp['Cluster'] = kmeans.fit_predict(X)
#각 클러스터의 평균 특성 계산
cluster_summary = df_sp.groupby('Cluster').mean()
각 클러스터별 특징들을 정리해본 것이다.

특징들을 분석해 이렇게 고객 군집을 나눠볼 수 있었다.
k-means의 결과에 의해 고객 군집 맞춤 활성화 방안도 제안해보았다.
Cluster 0: 소득/지출 중하위 40대 주부
사교육비 증가로 인한 부담 해소로 학원 등을 할인해주거나 가족과 함께 시간을 보낼 수 있는 장소 대여 및 테마파크 이용권을 할인해줄 수 있으며, 제철식품(국내산)을 할인해줄 수 있다.
Cluster 1: 소득/지출 중상위 30-40대 남성(가장)
저렴한 가격으로 회사에서 끼니를 해결할 수 있도록 도시락 구독 서비스를 제공한다. 포장이나 배달의 서비스를 제공하여 편리하게 이용할 수 있게 한다.
Cluster 2: 소득/지출 최상위 30-40대 다자녀 여성
다자녀의 사교육비 부담 해소를 하거나 외식 시 온누리상품권 결제 할인을 할 수 있도록 한다.
Cluster 3: 소득/지출 최하위 1인가구
1인가구는 소량 구매하는 경우가 많으므로 이에 대한 할인 혜택을 준다.
맞춤 방안을 제시함으로써 온누리상품권 활성화에 더욱 더 효과적인 도움이 될 수 있을 거라고 판단하였다.
활성화 지표, 시계열 분석, 그리고 k-means을 통해 여러 방면으로 온누리상품권을 활성화하기 위한 방안들을 제안해보았다. 여러 가지 방법들을 사용해서 다각도로 문제점을 보았던 점이 도움이 많이 되었다. 또한, 이 과정 속에서 어떤 방법이 적합한지 고민하며, 개념적인 공부도 함께 진행할 수 있어서 좋았다. 특히, 우리의 방법이 왜 적합한지 논리적으로 설명하며 스스로 부족했던 논리들을 채워가는 과정에서 재미를 느꼈다. 당연히 부족한 점과 아쉬운 점들도 있다. 상관관계 분석을 통해 변수들 간의 상관관계를 파악했다면, 이를 통해 feature selection도 진행했어야 더 정확한 결과를 도출할 수 있었겠지만, 그 점은 후에 알게 되었다. 그리고 도메인 지식이 더 많았더라면 더 좋은 결과가 있었을 거 같았고, 그 중요성을 깨달았다. 이러한 점들을 잘 보완하여 다음 프로젝트에 반영해야겠다.