앞서 모델링한 모형을 이용하여 대시보드를 구현하기로 하였다. 대시보드에서는 크게 독립변수 변화에 따른 식중독 발생확률 예측 시뮬레이션과 향후 식중독 발생 양상을 시계열로 예측하는 기능을 구현하는 데 초점을 맞췄다.
당초에는 태블로를 이용하여 대시보드를 만들고자 하였다. 그러나 태블로는 머신러닝 모델을 대시보드에 안정적으로 반영하는 데 한계가 있었기 때문에 파이썬 기반 대시보드 라이브러리인 streamlit을 이용하여 대시보드를 만들기로 결정하였다.
지역별 식중독 현황 및 예측 결과를 시각적으로 표현하였다. Folium 라이브러리를 이용했으며 전국 시도의 행정구역 정보를 담은 json 파일을 구하고 Choropleth 메소드를 이용하여 지도에 경계선 및 구역을 표현하였다.
해당 지역의 식중독 발생건수와 환자수는 Tooltip을 이용하여 지역명 외 해당 지역의 식중독 발생건수와 환자수를 한 눈에 볼 수 있게 하였다.
특히, 지도 시각화를 하면서 json파일에 누락되어있던 독도의 위치를 표현하기 위해 json 파일의 위치정보에 독도의 경계면 위경도를 추가해 반영해주었고 향후 이러한 지도 시각화를 커스터마이징할 수 있는 가능성을 확인할 수 있었다.
식중독의 원인물질별 발생 현황과 요인 및 시점 변화에 따른 원인물질별 발생 확률의 변화를 막대그래프로 표현하였다.
대시보드의 특성상 반응형 그래프로 구현하는 것이 사용자와의 상호작용을 확대하고 심미적으로도 유리하였기때문에 plotly 라이브러리를 이용하여 구현하였다.
지역별 식중독 증가 또는 감소 주요 요인을 SHAP Force Plot을 이용해 시각화하였다. 예측에 영향을 준 주요 독립변수(요인)별 영향도 및 최종 발생확률을 표시하였다.
Force Plot을 구현하기 위해서는 SHAP에서 Explainer를 호출하고 Explainer가 주어진 데이터에서 계산하는 shap value를 실제 데이터 값과 함께 표현해주어야 한다.
여기서 첫 번째 주의할 점은 분류모형은 Force Plot에서 제시하는 최종값이 확률(위 그림의 빨간색 박스)이 아닌 로짓(Logit)을 반환하므로 연결 함수를 'logit'으로 설정해주어야 한다는 것이다.
또 하나는 shap value를 부스팅계열 모델은 2차원 배열로 반환하고 랜덤포레스트모델은 3차원 배열로 반환하여 인덱싱을 서로 다르게 해주어야 한다는 것이다.
def shap_summary_plot(model, X):
explainer = shap.Explainer(model, X)
shap_values = explainer(X, check_additivity=False)
plot = shap.force_plot(explainer.expected_value, shap_values.values[-1, :], X.iloc[-1, :], link="logit")
return st_shap(plot)
def shap_rf_summary_plot(model, X):
explainer = shap.TreeExplainer(model, X)
shap_values = explainer(X, check_additivity=False)
plot = shap.force_plot(explainer.expected_value[1], shap_values.values[-1,:,1], X.iloc[-1, :], link="logit")
return st_shap(plot)
설정한 기간 중 식중독 발생 추이를 표현하고 시뮬레이션과 향후 예측 시 지역별 기존과 예측결과를 비교할 수 있도록 하였다.
원인물질별 식중독 정보 시각화와 마찬가지로 plotly를 이용하여 반응형 그래프로 표현하였다.