[프로젝트] 식중독 발생 예측 및 대시보드 제작 - (5) 대시보드 제작

전도운·2024년 11월 5일
0
post-thumbnail
  • 구상 및 구현 방법 선정

    • 앞서 모델링한 모형을 이용하여 대시보드를 구현하기로 하였다. 대시보드에서는 크게 독립변수 변화에 따른 식중독 발생확률 예측 시뮬레이션과 향후 식중독 발생 양상을 시계열로 예측하는 기능을 구현하는 데 초점을 맞췄다.

    • 당초에는 태블로를 이용하여 대시보드를 만들고자 하였다. 그러나 태블로는 머신러닝 모델을 대시보드에 안정적으로 반영하는 데 한계가 있었기 때문에 파이썬 기반 대시보드 라이브러리인 streamlit을 이용하여 대시보드를 만들기로 결정하였다.

  • 구현 결과 주요 화면

    • 현황 모니터링 - 조회 조건 기준의 식중독 발생 현황을 확인할 수 있다.

    • 시뮬레이션 분석 - 독립변수 조건에 따른 식중독 발생 확률 예측 결과를 확인할 수 있다.

    • 향후 12개월 예측 - 시점 변화에 따른 식중독 발생 확률 예측 결과를 확인할 수 있다.

  • 시각화 주요 내용

    • 시도한 부문은 총 네 가지로 ① 식중독 지도 시각화, ② 원인물질별 식중독 정보 시각화, ③ 지역별 식중독 요인 시각화, ④ 식중독 추이 및 예측 전후 시각화였다.

    ① 식중독 지도 시각화

    • 지역별 식중독 현황 및 예측 결과를 시각적으로 표현하였다. 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를 이용하여 반응형 그래프로 표현하였다.

profile
의미 있는 한걸음을 추구합니다.
post-custom-banner

0개의 댓글