안전사고를 막아조

CIVIL capstone
이동: 둘러보기, 검색

프로젝트 개요

기술개발 과제

국문 : 건설 사고사례의 특성인자를 고려한 한국형 건설현장 안전관리 체계의 개발: 50억원 미만 건설현장에 대한 인적사고 예측
영문 : Development of a Korean Construction Site Safety Management System Considering the Characteristics of Construction Accident Cases

과제 팀명

안전사고를 막아조

지도교수

조수진 교수님

개발기간

2024년 3월 ~ 2024년 6월 (총 4개월)

구성원 소개

서울시립대학교 토목공학과 2019****** 박**(팀장)
서울시립대학교 토목공학과 2019****** 옥**
서울시립대학교 토목공학과 2019****** 이**
서울시립대학교 토목공학과 2019****** 홍**
서울시립대학교 토목공학과 2013****** 김**

서론

개발 과제의 개요

개발 과제 요약

  • CSI(건설공사 안전관리 종합정보망) 사고사례 데이터 수집
「건설기술 진흥법」 제 67조에 의하면, 건설사고 발생 시 그 사실을 발주청 및 인⦁허가기관의 장에게 통보하여 한다. 건설현장 사고사례는 전부 CSI 데이터에 등록이 되도록 의무화되므로, 수집한 사고사례 데이터는 신뢰가능하다.
  • 유효한 건설현장 특성인자 선정 및 전처리
민감도 분석을 통해 인적사고 예측에 적합한 특성인자를 선정하고 수집한 데이터를 전처리한다.
  • 머신러닝 모델을 통해 신규 건설현장에서 발생 가능한 인적 사고 예측
‘Random Forest‘, ‘CatBoost‘와 같은 머신러닝의 앙상블 기법을 통해 인적사고 예측 모델을 개발한다.
  • 사용자 친화적 인터페이스 제작
건설현장 특성인자에 대해 입력 가능한 프로그램을 개발하여 접근성과 사용성을 높인다.

개발 과제의 배경

  • 사고재해자가 가장 많이 발생하는 산업
고용노동부에서 제공한 '산업재해현황’자료의 '업종별 사고재해자' 데이터에 의하면 건설업은 사고재해자 수가 26,829명으로 사고재해자가 가장 많이 발생하는 산업 중 하나이다.
  • 중대재해처벌법의 확대 시행
2024. 1. 27부터‘중대재해처벌법'이 공사금액 50억 미만의 건설현장에 확대시행 되었다.
  • 안전관리가 취약한 소규모 건설현장
2023년 말 기준 과거 5년간 건설업의 총 중대재해자 피해자 중, 공사금액 50억원 미만인 경우가 67.3%를 차지하고 있었다. 따라서 안전관리가 취약한 소규모 건설현장의 사고 예방 필요성이 대두되었다.

개발 과제의 목표 및 내용

  • 연구 목표
건설현장 사고사례의 특성인자(공사비, 낙찰률, 작업자 수 등)에 따라 인적사고를 예측하는 인공지능 모델을 설계한다. 인공지능 모델은 현장에서 발생 가능한 위험 요소를 체계적으로 관리하고, 사전에 대처할 수 있도록 한다. 특히 안전관리가 취약한 소규모 건설현장에서 사고를 예방하고 피해 금액을 절감할 수 있도록 인공지능 모델을 개발하는 것이 목표이다.
  • 연구 내용
건설현장의 특성인자를 분류, 분석하고 데이터를 전처리한다. 이후 분류분석 알고리즘을 통해 학습한 인공지능 모델을 개발하고, 건설현장 특성인자를 기입하고 선택할 수 있는 인터페이스를 제작한다. 진행 과정에 따른 달성 목표는 아래와 같다.
Task 1. 건설현장의 안전도 평가에 대한 여러 유사 연구 사례들을 취합한 후 납득할 수 있는 위험도의 정의를 결정한다.
Task 2. 건설공사 안전관리 종합정보망 건설사고 사례를 이용하여 특성인자에 대한 민감도 분석을 시행하고, 사고 발생에 유효한 특성인자를 선정한다.
Task 3. 선정한 특성인자에 적용 가능한 분류분석 알고리즘을 선정한다.
Task 4. 선정된 알고리즘에 적합한 전처리 방법을 탐구한다.
Task 5. 머신러닝의 앙상블 기법을 통해 최적의 인적사고 예측 모델을 개발한다.
Task 6. 특성인자를 기입 및 선택할 수 있는 사용자 친화적 인터페이스를 제작한다.

관련 기술의 현황

State of art

  • 유사 연구 사례
머신러닝 기법을 활용하여 건설현장의 특성인자로부터 유의미한 값을 예측하려는 시도는 지금껏 국내외에서 여러 차례 연구되어왔으며, 그러한 내용을 담은 논문들 가운데 2022~2023년에 발행된 것들을 추려 아래와 같이 정리하였다.
Reference Machine Learning Technique Input Data Output Data Remarks
국내
Kim et al.
(2022)
1. DNN
(Deep Neural Network)
1. Progress rate(%)
2. Construction scale
3. Number of employees
4. Status of employment
5. Nationality of workers
6. Day of week
7. Accident Time
8. Occupational Classification
1. Medical day
"한국산업안전보건공단”
데이터 사용
Cho et al.
(2022)
1. LOGIT
(Logistic regression)
2. ANN
(Artificial enural networks)
3. SVM
(Support vector machine)
4. NB
(Naive Bayes)
5. DF
(Decision forest)
1. Temperature
2. Humidity
3. Season
4. Time
5. Weather
6. Type of construction
(Main category)
7. Type of construction
(Sub-category)
8. Type of facility
(Main category)
9. Type of facility
(Sub-category)
10. Workplace
11. Work object
12. Work location
(Main category)
13. Work location
(Sub-category)
14. Work process
15. Details of the accident
1. Type of accident
웹 크롤링 수집 데이터 사용
(“BeautifulSoup” 사용)
Kim
(2023)
1. DNN
(Deep Neural Network)
1. Remedy days
2. Number of worker
3. Occupation types
4. Time zone
5. Employment type
6. Accident day
7. Construction progress rate
8. Nationality of accident victim
-
"한국산업안전보건공단”
데이터 사용
해외
Gondia et al.
(2023)
1. NB
(Naive Bayes)
2. DT
(Decision tree)
3. RF
(Random forest)
4. SVM
(Support vector machine)
5. ANN
(Artificial enural networks)
+
6. Ensemble algorithm
1. Worksite environment
2. Hazard exposure
3. Human error
4. Work familiarity
5. Month
1. Injury cost
2. Body part
“OSHA”, “OIICM”
데이터 및 세분화 기준 사용
위의 4가지 자료를 종합적으로 보았을 때, 각 연구 과정은 대체로 “1. 데이터 수집 ⭢ 2. 데이터 가공 ⭢ 3. 머신러닝 기법을 통한 학습 ⭢ 4. 결과물 예측” 순을 공통으로 따르고 있으며, 입출력 데이터와 머신러닝 기법에 차이를 두고 있다.
  • 유사 연구 사례
한국건설기술연구원은 지난 2019년도 “공정기반의 건설현장 안전 위험도 평가지수 및 위험예측 시스템 개발” 연구를 통해 건설안전 위험도 평가지수 예측시스템 프로토 타입을 개발하였다.
[그림] 건설안전 위험도 평가지수 예측시스템의 개념도
위 사업은 입력데이터인 건설현장 특성인자를 위해 “건설안전정보시스템(2024년 현재는 ”건설공사 안전관리 종합정보망(CSI)“)”의 데이터베이스를 사용하였다. 그러나 최신 연구 자료들과는 다르게 머신러닝 기법 대신 각 특성인자에 대한 가중치를 전문가 설문조사를 통해 도출하였다. 또한 해외 벤치마킹, 유사 사례 비교, 통계자료 분석 등을 통해 건설현장의 안전 위험도 평가지수를 직접 개발하였다. 결과적으로 입력 데이터로부터 가중치를 통해 위험도가 도출된다. 더불어 여기에서 그치지 않고 이러한 공정기반의 건설현장 안전사고 위험예측시스템을 사용자 친화적인 웹 기반 프로그램으로 제작하였다.

특허조사

  • 유사 특허 사례
특허 사례 조사는 키프리스(http://www.kipris.or.kr/)를 통해 진행하였다. 프로젝트와 유사한 연구 사례가 많았던 것처럼, 건설현장의 데이터로부터 사고에 대해 유의미한 값을 예측하려는 특허 사례 또한 많았다. 그러한 사례 중 근로자가 직접 착용하는 장비나 영상 촬영 장비 등과 같이 부가적인 장비로 데이터를 추출하는 사례는 제외하였고, 이미지 데이터 분석을 시도하는 사례 또한 제외하였다. 즉, 본 프로젝트에서 사용하려는 데이터처럼 텍스트나 수치로 저장된 데이터로부터 사고와 관련된 값을 도출하는 사례만을 조사하였다. 그 목록은 아래와 같다.
번호 제목 및 내용 출원번호
1
안전사고 위험률 예측 시스템 및 방법
(RISK PREDICTION SYSTEM OF CONSTRUCTION ACCIDENT AND METHOD THEREOF)
1020080137390
① 건설현장 사고 데이터 입력
② 상기 입력 데이터 및 기존 데이터 분석
③ 사고정보 요소별 점수 배분 및 합산된 수치를 통한 안전사고 위험률을 예측
2
현장조건과 사고사례를 이용한 작업자의 위험도 예측 시스템 및 그 방법
(SYSTEM FOR PREDICTING RISK OF WORKER REFLECTING FIELD CONDITIONS AND PREVIOUS ACCIDENT CASES AND METHOD THEREOF)
1020190164661
① 작업 환경, 개인조건 및 사고 유형 데이터 수집
② 위험도 예측하고자 하는 작업자의 작업 환경, 개인조건 데이터 입력
③ 상기 데이터와 사고 사례의 유사도 연산
④ 현장조건, 개인조건 위험도 연산
⑤ 상기 두 위험도로부터 최종 위험도 도출
3
공정기반의 건설안전 위험 예측시스템 및 이의 운용방법
(the construction safety risk prediction system based process and the method for as the same)
1020190166337
① 과거 공종별 위험도 평가지수 결과를 데이터베이스화
② 어플리케이션을 통한 실제 현장의 상세정보 입력
③ 상기 상세정보에 대응하는 상기 과거 공종별 위험도 평가지수 결과 분석
④ 어플리케이션을 통한 상기 실제 현장의 공종별 위험도 표시
4
건설 현장 위험성 예측 방법 및 이를 실행하는 서버
(METHOD OF MEASURING CONSTRUCTION SITE SAFETY DANGER AND SERVER PERFORMING THEREOF)
1020210079028
① 공종 별 사고 위험도 평가 정보 저장 및 월 단위 사고 사례 공공 데이터가 업데이트되는 사고 위험도 평가 데이터베이스 구축
② 건설현장 상황 및 작업 내용 각각에 해당하는 키워드를 수신
③ 사고 위험도 평가 데이터베이스로부터 상기 키워드에 해당하는 위험도 평가 정보 추출
④ 상기 위험도 평가 정보에 가중치를 적용하여 공종 별 위험도 평가 등급을 산출
⑤ 공종 별 위험도 평가 등급에 해당하는 위험 요인 및 안전 대책이 저장된 위험성 평가 표준 모델로부터 상기 공종 별 위험도 평가 등급에 해당하는 위험 요인 및 안전 대책을 추출하여 평가 결과 데이터를 생성
⑥ 평가 결과 데이터를 신규 위험성 평가 데이터베이스에 저장
5
인공지능을 기반으로 한 건설 현장 안전 재해 예측 방법 및 시스템
(Construction site safety diaster predicting method and system based on artificial intelligence)
1020210180521
① 현장 정보, 작업 허가서, 부적합 보고서, 안전점검 지적 정보, 실적 공정률, 사고 조사 보고서 및 아차사고 보고서를 포함하는 데이터 구축
② 상기 데이터로부터 인공지능 모델을 학습
③ 상기 인공지능 모델을 이용하여 건설 현장별, 일자별, 재해 유형별 재해 발생 확률을 미리 예측
④ 재해 발생에 영향을 줄 수 있는 위험 요소를 미리 선정
⑤ 상기 위험 요소에 대한 사전 점검 체크 리스트를 제공
⑥ 상기 위험 요소에 대한 과거 유사 재해 정보를 제공
6
위험작업의 사고발생확률을 예측할 수 있는 웹 기반의 안전관리시스템
(A WEB-BASED SAFETY MANAGEMENT SYSTEM THAT CAN PREDICT THE PROBABILITY OF AN ACCIDENT IN HAZARDOUS WORK)
1020220003250
① 위험성평가정보와 사고발생정보를 등록할 수 있는 웹 사이트를 제공
② 상기 웹 사이트를 통해 등록된 위험성평가정보와 사고발생정보 저장
③ 상기 위험성평가정보와 사고발생정보의 단위작업을 비교분석하여 단위작업별 사고발생확률 산정
④ 상기 위험성평가정보를 등록한 공사참여자 단말기로 위험성평가정보의 대상인 단위작업의 사고발생확률 제공
7
건설 데이터를 이용한 사고 예측 시스템 및 그의 제어방법
(ACCIDENT PREDICTING SYSTEM USING CONSTRUNTION DATA AND CONTROLL METHOD THEREOF)
1020220118951
① 건설현장에서 발생되는 사고와 데이터를 전송받는 데이터 수집부 구축
② 사고 예측의 조건과 관련된 사용자 입력을 인가받는 사용자 입력부 구축
③ 상기 데이터 수집부에 의해 수집된 데이터 중 상기 조건에 대응되는 일부 데이터에 근거하여, 사고 예측치를 생성하는 사고 예측 분석부 구축
④ 상기 사고 예측치를 출력하는 출력부 구축
8
인공지능에 기반하여 빅데이터의 자동 분석을 통한 건설사고 예측방법 및 장치
(METHOD AND APPARATUS FOR PREDICTING CONSTRUCTION ACCIDENTS THROUGH AUTOMATIC ANALYSIS OF BIG DATA BASED ON ARTIFICIAL INTELLIGENCE)
1020230067741
① 현장정보, 사고객체정보, 인적사고종류정보 및 사망부상여부정보를 포함하는 학습데이터를 수집
② 상기 학습데이터를 전처리
③ 사고객체예측모델, 인적사고종류예측모델 및 사망부상예측모델을 상기 학습데이터로 학습
④ 현장데이터를 입력
⑤ 상기 입력된 현장데이터에 대응하는 사고객체데이터를 출력함으로써 사고객체 예측
⑥ 상기 입력된 현장데이터에 대응하는 인적사고종류데이터를 출력함으로써 인적사고종류 예측
⑦ 상기 입력된 현장데이터에 대응하는 사망부상여부데이터를 출력함으로써 건설사고로 인한 피해가 사망 또는 부상을 포함하는지를 예측
⑧ 상기 사고객체데이터, 상기 인적사고종류데이터 및 상기 사망부상여부데이터를 포함하는 예측결과 출력
위 8개의 특허 사례를 종합하였을 때 출력 데이터는 위험도, 사고 발생 확률 또는 사고 종류로 이루어졌으며, 위험도를 출력 데이터로 선정한 사례는 독자적인 위험도 평가 체계를 구축하여 사용했다.
5번, 8번의 특허 사례를 제외한 나머지 특허 사례는 출력 데이터나 인공지능 사용 유무 등에 따라 본 프로젝트와 분명히 다른 점이 존재하였다. 하지만 5번, 8번의 경우는 본 프로젝트와 상당 부분 유사했기 때문에, 두 특허 사례를 더욱 자세히 살펴보았다.


  • 5번 특허 사례
본 특허 사례의 세부적인 과정은 아래와 같다.
① 다수의 건설 현장들로부터 현장 정보, 작업 허가서(PTW, Permit To Work), 부적합 보고서(NCR, Non Conformance Report), 안전점검 지적 정보, 실적 공정률, 사고 조사 보고서 및 아차사고(Near Miss) 보고서를 포함하는 데이터를 수집한다.
② 수집한 데이터 중에서 상기 작업 허가서, 상기 부적합 보고서, 상기 안전점검 지적정보 및 상기 실적 공정률에 대한 데이터들을 재해 원인 데이터로 전처리하고, 상기 사고 조사 보고서 및 상기 아차사고 보고서에 대한 데이터를 재해 결과 데이터로 전처리한다.
③ 상기 재해 원인 데이터를 입력 변수로 사용하고, 상기 재해 결과 데이터를 종속 변수로 사용하여 기계학습하여, 상기 재해 원인 데이터에 포함된 변수들의 중요도와 재해 유형별 재해 발생 확률을 예측할 수 있는 인공지능 모델을 구축한다. 이때 학습단계에서 데이터에 대한 과적합(Overfitting)을 회피하기 위하여 앙상블 모델을 활용하며, 랜덤 포레스트(Random Forest)를 분석 알고리즘으로 사용한다.
④ 상기 인공지능 모델에 재해 발생 확률을 예측하여 관리하고자 하는 재해 관리 대상 현장에 대한 상기 재해 원인 데이터가 입력되면, 상기 인공지능 모델로부터 상기 작업 허가서에 포함된 변수들의 중요도와 재해 유형별 재해 발생 확률을 도출한다. 이때 재해 유형은 추락, 낙하, 비례, 전도, 붕괴, 충돌, 협착, 화재, 폭발 중 적어도 일부를 포함한다.
⑤ 도출된 상기 변수들의 중요도와 상기 재해 유형별 재해 발생 확률에 따라 상기 재해 관리 대상 현장에서 사전 점검해야 할 사전점검 체크리스트와 과거 유사 재해 정보 중 적어도 하나를 포함하는 재해 예방책을 도출한다.
위의 내용과 같이, 인공지능 모델과 관련하여 랜덤 포레스트 기법을 사용하고, 재해 유형별 재해 발생 확률 도출을 통해 가장 발생할 법한 인적사고를 도출한다.


  • 8번 특허 사례
본 특허 사례의 세부적인 과정은 아래와 같다.
① 건설공사 안전관리 종합정보망(CSI)로부터 현장정보, 사고객체정보, 인적사고종류정보 및 사망부상여부정보를 포함하는 학습데이터를 수집한다. 각 데이터가 포함하는 내용은 다음과 같이 정리할 수 있다.
현장정보(17) 사고정보(3+2) 사망/부상여부(2)
⒜ 공공/민간
⒝ 날씨
⒞ 온도
⒟ 습도
⒠ 시설물 대분류
⒡ 공종(대분류)
⒢ 공사비
⒣ 공정율
⒤ 작업자수
⒥ 작업프로세스
⒦ 설계안정성검토
⒧ 안전관리수준평가_발주
⒨ 안전관리수준평가_시공
⒩ 안전관리수준평가_감리
⒪ 공종(소분류)
⒫ 시도구분
⒬ 안전관리계획
⒜ 사고월
⒝ 사고요일
⒞ 사고시간
⒟ 사고객체(대분류)-8범주
- 가시설
- 건설자재
- 기타
- 건설공구
- 건설기계
- 부재
- 시설물
- 토사 및 암반
⒠ 인적사고종류(대분류)-8범주
- 넘어짐
- 떨어짐
- 물체에 맞음
- 끼임
- 절단/베임
- 기타
- 부딪힘
- 깔림
⒜ 부상
⒝ 사망
② 데이터 정제(결측치 및 이상치의 처리 등), 피처 엔지니어링(스케일링, 변수 구간화, 변수 변환 및 더미 변수화 등), 분석변수처리(변수 선택, 차원 축소, 파생 변수 생성 및 불균형 데이터 처리 등)을 통해 상기 학습데이터를 전처리한다.
③ 사고객체예측모델, 인적사고종류예측모델 및 사망부상예측모델을 상기 학습데이터로 학습시킨다. 이때 랜덤포레스트(random forest), 의사결정나무(desicision tree), XGBoost 및/또는 SVM(support vector machine)을 포함하는 복수의 분류알고리즘에 기반하여 예측모델을 형성하여, 분류알고리즘의 성능이 가장 높은 분류알고리즘을 선정한다.
④ 사용자로부터 현장데이터를 입력받는다.
⑤ 상기 입력된 현장데이터에 대응하는 사고객체데이터를 출력함으로써 사고객체를 예측한다.
⑥ 상기 입력된 현장데이터 및 상기 출력된 사고객체데이터에 대응하는 인적사고종류데이터를 출력함으로써 인적사고종류를 예측한다.
⑦ 상기 입력된 현장데이터, 상기 출력된 사고객체데이터 및 상기 출력된 인적사고종류데이터에 대응하는 사망부상여부데이터를 출력함으로써 건설사고로 인한 피해가 사망 또는 부상을 포함하는지를 예측한다.
⑧ 상기 출력된 사고객체데이터, 상기 출력된 인적사고종류데이터 및 상기 출력된 사망부상여부데이터를 포함하는 예측결과를 사용자에게 제공한다.
8번 특허 사례의 전체적인 흐름은 건설공사 안전관리 종합정보망(CSI) 데이터에서 수집한 현장정보, 사고정보 그리고 사망부상여부를 여러 머신러닝 기법을 통해 학습시키고, 가장 성능이 좋은 모델로부터 사고객체, 인적사고종류 그리고 사망부상여부를 예측하는 것이다. 이때 예측과정에서 3가지의 결과물이 독립적으로 예측되는 것이 아니라, 예측된 사고객체가 인적사고종류 예측의 입력값이 되고 예측된 사고객체와 예측된 인적사고종류가 사망부상여부 예측의 입력값이 되는 것을 주목해야 한다.

특허전략

  • 5번 특허 사례와의 차별점
5번 특허 사례의 전체적인 내용은 본 프로젝트와 상당 부분 유사한데, 가장 큰 차이점은 데이터 수집 출처이다. 앞서 설명했듯이 5번 특허 사례는 여러 보고서로부터 데이터를 수집하는 반면, 본 프로젝트는 건설공사 안전관리 종합정보망(CSI)에서 데이터를 수집하고자 한다. 이는 보고서 내용을 새롭게 구성하기에는 실질적인 어려움이 존재하기 때문이며, 건설기술 진흥법 제 62조와 제 67조에 관한 법률에 따라 사고사례에 대해 CSI에 등록은 의무화되어 신뢰성이 높기 때문이다.
  • 8번 특허 사례와의 차별점
8번 특허 사례는 데이터 수집부터 머신러닝 학습까지의 과정이 본 프로젝트와 거의 동일하며, 인적사고 유형 뿐만 아니라 사고객체와 사망부상여부까지 결과물로써 예측하는 모델을 제공한다. 이는 본 프로젝트에 비해 더 폭넓은 정보를 제공하는 예측 모델로 판단되었다. 3개월이라는 짧은 기간 동안 본 특허 사례와 큰 차별점을 두면서 더욱 개선된 체계를 구축하기에는 어려움이 있으므로 세부적인 면에서 차이점을 두고자 하였다.
먼저 건설현장 특성인자 선정이다. 본 특허 사례는 17개의 현장 데이터와 5개의 사고정보 그리고 2개의 사망/부상여부를 학습에 사용하는데, 어떠한 기준으로 위와 같은 특성인자들이 선정되었는지 명시되어 있지 않았다. 또한 현장 데이터의 안전관리수준평가_발주, 안전관리수준평가_시공 그리고 안전관리수준평가_감리는 CSI의 사고사례 데이터에 포함된 자료가 아니므로, 연 단위로 발표되는 안전관리 수준평가 결과로부터 사고사례 데이터와 각 업체를 연결 지어야 한다. 그러나 사고사례 데이터에는 사고명만 있을 뿐, 어떤 업체를 통해 건설이 진행되고 있는지는 명시되어 있지 않아서 연결 짓기 쉽지 않다. 따라서 본 프로젝트는 CSI의 사고사례 데이터에만 있는 특성인자를 사용하며, 인적사고와의 민감도 분석을 통해 유의미한 상관관계를 가지는 특성인자만을 고려하고자 한다. 또한 중대재해처벌법과 관련하여 상대적으로 안전사고에 대비하기 어려운 소규모 건설현장만을 고려하기 위해 공사비가 50억 미만인 데이터만을 사용한다.
다음은 결과물이다. 본 특허 사례는 사고객체, 인적사고종류 그리고 사망부상여부 순으로 예측이 진행되는데, 만약 예측된 사고객체가 잘못된 정보라면 그로 인해 인적사고종류와 사망부상여부 또한 잘못된 정보를 도출할 가능성이 높아지는 경우도 존재할 것이라 판단하였다. 따라서 연쇄적인 예측보다는 인적사고종류라는 1가지 결과물에만 집중하여, 가장 발생할 가능성이 높은 유형의 인적사고가 결과물로 도출되도록 하고자 한다.
마지막은 실행 프로그램 제작이다. 본 특허 사례는 예측과정과 이를 위한 구성요소를 구체적으로 설명하였으나, 결과적으로 어떠한 형태의 프로그램이 될지는 세부적으로 명시되어 있지 않았다. 따라서 이러한 점을 고려하여 사용자가 활용하기에 편한 인터페이스의 독립적인 실행 프로그램을 완성하고자 한다.

개발과제의 기대효과

기술적 기대효과

  • 추가 장비 불필요
추가적인 장비 없이 기존 ‘건설공사 안전관리 종합정보망(CSI)’의 사고사례 데이터만을 이용하여 새로운 사고예측 시스템의 구축이 가능하다.
  • 데이터 축적으로 모델 정확도 증가
머신러닝을 통해 결과물을 예측하므로, 시간이 지나면서 데이터가 쌓일수록 더욱 정확한 모델을 개발할 수 있다.

사회적 및 경제적 파급효과

  • 사회적 파급효과
법률 제 17907호에 의해 2022년부터 시행된 중대재해처벌법이 규정하는 중대재해는 중대산업재해와 중대시민재해를 포함한다. 그 중 산업에서 발생하는 재해와 관련한 중대산업재해는 산업재해 가운데 아래의 3가지 결과를 야기한 재해를 말한다.
① 사망자가 1명 이상 발생
② 동일한 사고로 6개월 이상 치료가 필요한 부상자가 2명 이상 발생
③ 동일한 유해요인으로 급성중독 등 직업성 질병자가 1년 이내에 3명 이상 발생
이러한 중대재해처벌법이 50인 미만 사업장에도 확대 적용됨에 따라 소규모 사업장에서의 안전관리 부담이 가중되고 있다. 소규모 작업장은 인력과 예산이 부족으로 인해 안전관리 체계의 구축과 이행을 제대로 수행하지 못하는 경우가 대다수이다. 이와 관련하여 한국산업안전보건공단은 안전보건관리체계 구축 컨설팅을 지원하지만, 모든 소규모 사업장을 지원하기는 현실적으로 어려운 상황이다. 이러한 상황에서 안전사고의 예측을 통한 예방은 중대재해를 방지하기 위한 일환이 될 수 있다. 예측된 안전사고에 대한 대비와 안전교육 그리고 경각심 고취는 소규모 사업장에서의 부족한 안전의식으로 인한 안전사고 발생 빈도를 줄일 수 있을 것이다.
  • 경제적 파급효과
중대재해처벌법이 규정하는 중대재해 발생 시 경영책임자는 10억원 이하의 벌금, 기관은 50억원 이하의 벌금을 물어낼 수 있으며, 이는 중소규모 기업의 경우 운영에 큰 타격이 될 만한 금액이다. 이러한 상황은 현재 침체가 진행 중인 건설업, 특히 대형 건설사를 제외한 나머지 건설사들의 부도를 초래할 수 있고 건설업 전체의 위기를 가속화 할 수 있을 것이다. 따라서 중대재해의 발생 자체를 예방할 수 있다는 것은 건설업 전반의 경제적인 상황에 대해서도 긍정적 영향을 발휘할 수 있을 것이다. 본 설계에서 제시하는 시스템은 기존 수집하고 있는 데이터 기반으로 작동하여 추가적인 비용이 발생하지 않아, 특히 중소규모 작업장에서 부담 없이 사용할 수 있을 것이라 예상된다.

기술개발 일정 및 추진체계

개발 일정

안전사고를막아조개발일정.png

설계

목표 달성을 위한 설계 방법

이론적 배경

  • 랜덤 포레스트(Random Forest)
랜덤 포레스트(Random Forest)는 기계 학습에서 분류, 회귀 분석 등에 사용되는 앙상블 학습 방법의 일종이며, 무작위성을 도입하여 모델의 견고함을 증가시키는 앙상블 기법이다. 즉, 훈련 과정에서 무작위 표본으로부터 구성한 다수의 결정 트리를 사용하여 예측을 시행하고 각 트리의 예측을 평균 내거나 다수결로 결합하여 최종 예측을 개선한다.
Random Forest는 크게 아래의 3가지 과정을 통해 시행된다.
① 부트스트랩 샘플링: 전체 데이터 세트에서 중복을 허용 또는 허용하지 않고 여러 개의 작은 데이터 세트를 무작위로 생성한다. 각각의 트리는 이렇게 생성된 다른 데이터 세트를 사용하여 독립적으로 훈련된다.
241.png
② 특성의 무작위 선택: 각 노드에서 최적의 분할을 결정할 때 사용할 수 있는 특성을 무작위로 선택한다. 이는 모델의 다양성을 높이고, 특정 특성에 대한 의존도를 낮춘다.
242.png
③ 결정 트리의 앙상블: 모든 개별 트리의 예측을 종합하여 최종 예측을 수행한다. 분류에서는 다수결 방식을, 회귀 분석에서는 평균을 사용한다.
243.png
244.png
랜덤 포레스트의 성능에 영향을 주는 파라미터는 다음과 같다.
① n_estimators: 포레스트를 구성하는 결정 트리의 수이다. 트리의 수가 많을수록 모델의 성능이 일반적으로 향상되지만, 계산 비용도 증가한다.
② max_features: 각 노드에서 분할을 위해 고려할 최대 특성 수이다. 이 값이 크면 트리들이 서로 비슷해지고, 작으면 트리들이 서로 다르게 되어 더 다양한 모델이 생성된다.
③ max_depth: 트리의 최대 깊이를 제한한다. 너무 깊은 트리는 훈련 데이터에 과적합될 수 있다.
④ min_samples_split: 노드를 분할하기 위해 필요한 최소 샘플 수이다.
⑤ min_samples_leaf: 리프 노드가 되기 위해 필요한 최소 샘플 수이다.
⑥ bootstrap: 부트스트랩 샘플링(샘플 중복 사용)을 사용할지 여부를 결정한다.
  • 데이터 인코딩
데이터 인코딩이란 범주형 변수의 문자열을 수치형으로 변환하는 과정이다.
이후 설명할 특성인자 선정 과정에서 여러 특성인자에 대해 가중치를 임의로 메길 수 없고, 상하관계가 명확하지 않기에 본 연구에서는 One-Hot Encoding을 사용하였다.


1) 라벨 인코딩(Label Encoding)
범주형 변수를 수치형으로 변환하는 과정에서 가중치가 부여되어 예측 성능이 떨어질 수 있다.


2) 원-핫 인코딩(One-Hot Encoding)
연속적인 특성이 없는 데이터를 다룰 때 사용하며 입력값으로 2차원 데이터가 필요하다. 데이터들의 종만큼 행과 열이 생기기 때문에 성능 저하가 유발될 수 있다.


3) 오버샘플링(Oversampling)
대표적인 오버샘을링 기법인 SMOTE(Synthetic Minority Over-sampling Technique)는 머신러닝에서 불균형 데이터 문제를 해결하기 위한 방법이다. 이는 불균형 데이터 셋에서 소수 클래스의 예제를 합성적으로 증가시켜 데이터의 균형을 맞추는 기법이다. 이를 통해 소수 클래스 내에서 새로운 샘플을 생성한다. SMOTE가 적용되는 과정은 다음과 같다.
① 데이터셋 내의 모든 소수 클래스 샘플에 대해 k-최근접 이웃을 찾는다. k-최근접 이웃은 주로 유클리드 거리를 통해 거리를 측정하고 각 데이터 포인트에 대해 가장 가까운 K개의 다른 데이터 이웃을 찾아 분류 혹은 회귀의 방식으로 정해진다. (분류: K개 이웃 중 가장 많이 나타나는 값을 해당 데이터 이웃의 값으로 결정 / 회귀: K개 이웃의 타겟 값의 평균을 해당 데이터 포인트의 예측값으로 사용)
② 선택된 각 소수 클래스 샘플에 대해, k개의 이웃 중 하나를 무작위로 선택하여 원본 샘플과 선택된 이웃 사이의 차이를 계산한다. 이 차이(계산식에서의 D)에 임의의 0과 1 사이의 수를 곱하여 원본 샘플에 더함으로써 새로운 합성 샘플을 생성한다.
③ 이 과정을 소수 클래스의 샘플 수가 원하는 수준에 도달할 때까지 반복한다.
예를 들면, 소수 클래스의 샘플 A가 있고, 이의 k-최근접 이웃 중 하나로 B가 있을 때 A와 B 사이의 차이를 로 나타낸다. 여기에 임의의 수 (0과 1 사이)를 곱하고, 이 결과를 A에 더하여 새로운 샘플 C를 생성한다. (이때 λ는 무작위로 선택된다) 이를 반복하여 샘플 수를 원하는 수준까지 늘린다.
  • 베이지안 최적화(Bayesian Optimization)
베이지안 최적화(Bayesian Optimization)는 머신러닝 모델의 하이퍼파라미터 튜닝에 사용될 수 있으며, 하이퍼파라미터 튜닝은 머신러닝 모델의 성능을 최대화하기 위해 최적의 하이퍼파라미터 조합을 찾는 것을 말한다.
베이지안 최적화의 과정을 간략히 설명하면 다음과 같다. 알고자 하는 미지의 함수를 예측하고자 한다. 이를 위해 임의의 파라미터로부터 설정한 함수에 대한 평가 결과를 기반으로 하나의 확률 모델을 구축한다. 이 확률 모델을 사용하여 다음에 탐색할 파라미터가 함수를 최대화(또는 최소화)할 가능성이 큰 영역을 예측한다.
머신러닝에서는 알고자 하는 미지의 함수를 머신러닝 모델의 성능을 나타내는 손실 함수로 여길 수 있다. 베이지안 최적화의 좀 더 자세한 설명은 아래의 개념설명에서 알 수 있다.
베이지안 최적화는 크게 두 가지 주요 구성 요소로 나눌 수 있다.
① 확률적 서로게이트 모델(Surrogate Model): ‘Surrogate’란 단어는 ‘대리의’, ‘대용의’ 등을 의미하는 단어이다. 즉, 이 모델은 구하고자 하는 어떠한 목적 함수의 동작을 근사합니다. 가장 일반적인 서로게이트 모델은 가우시안 프로세스(Gaussian Process, GP)이다. GP는 평가된 모든 점에서의 함수의 값과 불확실성을 모델링하여, 아직 평가되지 않은 점들의 함수 값에 대한 확률 분포를 제공한다.
② 획득 함수(Acquisition Function): 이 함수는 서로게이트 모델을 기반으로 다음에 평가할 가장 유망한 점을 결정한다. 획득 함수는 서로게이트 모델의 예측 불확실성을 활용하여, 탐색(새로운 영역을 시도)과 활용(알려진 좋은 영역을 사용) 사이의 균형을 맞춘다. 대표적인 획득 함수로는 예상 개선(Expected Improvement), 최대 확률 개선(Probability of Improvement), 그리고 UCB(Upper Confidence Bound)가 있다.
245.png
베이지안 최적화의 과정은 다음과 같다.
① 초기 데이터 세트로 서로게이트 모델을 훈련한다.
②획득 함수를 최대화하는 파라미터를 찾아 목적 함수를 평가한다.
③ 새로운 평가 결과를 사용하여 서로게이트 모델을 업데이트한다.
④ 지정된 반복 횟수가 끝나거나, 개선이 더 이상 이루어지지 않을 때까지 2-3단계를 반복한다.

설계 방법

  • 데이터 수집
건설공사 안전관리종합 정보망(이하 CSI)에서 데이터를 수집한다.
건설기술진흥법 제 67조(건설공사 현장의 사고조사 등)에 관한 법률에 의해 사고사례의 CSI등록은 의무화되므로, 수집한 사고사례는 한국형 건설현장에서 발생 가능한 사고의 특성을 다수 포함하고 있다고 신뢰 가능하다.
246.png
총 공사금액 50억원 미만에 대한 건설사고사례 원본 데이터를 총 4834개 수집하였다. 이는 여러 가지 현장특성 인자를 포함하고 있으므로 이후 전처리 과정을 통해 머신러닝 모델에 사용할 수 있는 형태로 데이터를 가공하였다.
  • 데이터 전처리
1) 특성인자의 신뢰성 판단
CSI의 건설현장 사고사례 데이터에서 얻을 수 있는 현장에 대한 특성인자는 다음과 같다.
선행연구 O 선행연구 X
총 공사일, 기온, 습도, 계절, 날씨, 시설물 종류 – 대분류, 중분류,

사고객체 – 대분류, 중분류, 작업 프로세스, 사고 장소, 사고 부위, 공사비, 공정률

작업자 수, 낙찰률
건설현장의 데이터를 바탕으로 안전도를 분석한 선행연구에서 사용된 14가지 인자를 제외한 2가지 인자에 대해 신뢰성 확보가 필요하다. 이를 위해 랜덤 포레스트의 MDA 방식을 통해 특성인자의 중요도를 계산하였다.
MDA방식: 기존 정확도와 변형된 정확도 비교 방법으로, 각 특징에 대해 해당 특징의 값을 무작위로 섞어 모델의 예측 정확도에 미치는 영향을 평가하는 방법.
248.png
선행 연구에서 사용되었던 다른 인자와의 중요도가 비슷한 것을 확인하였다. 따라서 나머지 2가지 인자도 결과에 비슷한 영향을 주기에 특성인자로 사용하기 적합하다고 판단하였다.
2) 데이터 정제
249.png
수집한 데이터에 대하여 결측치(Missing Value)가 존재할 때, 결측치를 고려하지 않으면 아래와 같은 문제들이 발생할 수 있다.
가. 모델 성능 저하의 문제: 결측값이 있는 데이터를 그대로 사용하게 된다면, 모델 학습에 실패하거나, 부정확한 예측 결과를 생겅할 수 있다.
나. 신뢰성 저하의 문제: 평균, 중간값, 표준편차 등의 통계량이 왜곡되어 잘못된 분석 결과를 생성할 수 있다.
다. 정확성 저하의 문제: 부정확한 데이터로 학습된 모델은 실제 데이터에 대해 낮은 예측 정확성을 보인다.
따라서 초기 데이터에 결측치 처리를 실시하였고, 위 그림처럼 하나의 사고사례에 대하여 비어있는 열이 존재하는 데이터 셋은 제거하였다.
또한 수치형 데이터에 대하여 데이터 이상치는 기온(°C) 열에 대해서만 존재하는 것으로 확인하였으며 이에 한국 역대 최대기온은 41.0°C, 역대 최저기온은 –32.6°C로 –32.6°C~41.0°C를 벗어나는 값을 이상치라고 정의할 것이고, 해당 사고사례 데이터를 제거하였다.
마지막으로 너무 적은량의 데이터는 학습에 부정적인 영향을 미치므로 각 인적사고 종류에 해당하는 사고사례가 30개 이하인 사고 종류를 삭제하였다. 이는 화상,질병,교통사고,감전이다.
이후 인적사고 종류 중 유사한 유형을 지니는 사고데이터를 결합하였다. 결과적으로 아래와 같이 데이터 정제를 완료하였다.
2410.png
3) 데이터 인코딩
2411.png
현장특성 데이터 중 수치형 데이터인 총 공사일, 기온, 습도는 그대로 사용하였고 나머지 범주형 데이터에 대해서는 모두 원-핫 인코딩을 적용하였다.
4) 데이터 불균형 처리
불균형 데이터셋에서는 소수 클래스에 속하는 샘플이 상대적으로 적어, 머신러닝 모델이 다수 클래스에 편향되기 쉬워 성능이 저하될 수 있다. 이를 해결하기 위해 소수 클래스 샘플을 합성하여 데이터셋을 균형있게 만드는 SMOTE 방법을 사용하였다.
5) 하이퍼 파라미터 결정
랜덤 포레스트의 학습에 있어서는 하이퍼 파라미터(특성인자, 레이어 수, 학습률 등)가 포함되어 있고, 하이퍼 파라미터의 최적값을 찾기 위해서는 많은 시도가 필요하다. 이를 효율적으로 탐색하여 최적의 조합을 찾기 위해 베이지안 최적화를 사용하였다

머신러닝 모델 코딩

  • 머신러닝 모델 코드
먼저 큰 틀이 되는 머신러닝 기법으로 랜덤 포레스트(Random Forest)를 사용하였다. bootstrap은 기본적으로 실시상태이므로 그대로 사용하였지만, 모델의 성능에 크게 영향을 미치는 각 파라미터의 값은 직접 지정하지 않고 후에 서술할 베이지안 최적화를 통해 선정하였다.
Python을 이용하여 코드를 작성하였으며, 사용된 코드와 각 과정에 대한 설명은 아래와 같다.
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, 
cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, 
classification_report
from imblearn.over_sampling import SMOTE
from skopt import BayesSearchCV
from skopt.space import Real, Categorical, Integer
import seaborn as sns
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False
데이터 불러오기
data = 
pd.read_excel('Updated_ASDF_final_cleaned_final_filtered.xlsx')
# 필요한 특성 선택
features = ['총공사일', '기온', '습도', '계절', '날씨', '시설물  
종류 대분류', '시설물 종류 중분류','사고객체 대분류', '사고객체 
중분류', '작업프로세스', '사고 장소', '사고 부위', '공사비', '낙
찰률', '작업자수', '공정률']
target = '인적사고'
# 범주형 데이터를 수치형으로 변환
data_encoded = pd.get_dummies(data[features])
# 타겟 변수와 특성 데이터 분리
X = data_encoded
y = data[target]
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, 
test_size=0.2, random_state=42)
# SMOTE 적용
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train, 
y_train) 
# 모델 생성
model = RandomForestClassifier(random_state=42)
# 베이지안 최적화를 사용한 하이퍼파라미터 튜닝
search_space = {'n_estimators': Integer(100, 300),'max_features': 
Integer(4, 20),'max_depth': Integer(5, 15),'min_samples_split': 
Integer(5, 20),'min_samples_leaf': Integer(2, 10)}
opt = BayesSearchCV(model, search_space, n_iter=10, 
scoring='accuracy', n_jobs=-1, cv=5, verbose=3, random_state=42)
opt.fit(X_train_smote, y_train_smote)
# 최적의 모델을 사용하여 테스트 데이터 예측
best_model = opt.best_estimator_
y_pred = best_model.predict(X_test)
# 테스트 데이터 혼동행렬 출력 및 시각화
conf_mat = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_mat, annot=True, fmt='d', cmap='Blues', 
xticklabels=best_model.classes_, yticklabels=best_model.classes_)
plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()
# 테스트 데이터 분류 보고서 출력
print("\nClassification Report for Test Data:")
print(classification_report(y_test, y_pred)) 
# 최적의 모델을 사용하여 훈련 데이터 예측
y_train_pred = best_model.predict(X_train_smote)
# 훈련 데이터 혼동행렬 출력 및 시각화
train_conf_mat = confusion_matrix(y_train_smote, y_train_pred)
sns.heatmap(train_conf_mat, annot=True, fmt='d', cmap='Blues', 
xticklabels=best_model.classes_, yticklabels=best_model.classes_)
plt.title('Confusion Matrix for Training Data')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show() 
# 훈련 데이터 분류 보고서 출력
print("\nClassification Report for Training Data:")
print(classification_report(y_train_smote, y_train_pred)) 
# 최적 하이퍼파라미터 출력
print("\nOptimal Hyperparameters:")
print(opt.best_params_) 
# 특성 중요도 평가 및 시각화
feature_importances = pd.Series(best_model.feature_importances_, 
index=X_train_smote.columns)
# 원본 특성 이름으로 그룹화
original_feature_importances = 
feature_importances.groupby([name.split('_')[0] for name in 
feature_importances.index]).sum()

original_feature_importances.sort_values(ascending=False).plot(kin d='bar', figsize=(12, 8))
plt.title('Aggregated Feature Importances')
plt.ylabel('Importance')
plt.show()

결과 및 평가

개발 과제 핵심 결과

머신러닝 모델 성능 평가
  • 머신러닝 결과


2412.png
2413.png
머신러닝 결과 Training Data에 대해서는 0.84의 f1-score avg로 주어진 데이터에 대하여 잘 들어맞는 경향을 보이나, 이 모델을 Test Data에 적용했을 시 최대 f1-score avg가 0.63으로 Training Data에 대하여 다소 과적합된 양상을 띔을 확인할 수 있다.
하지만 떨어짐, 넘어짐이나 절단, 베임, 찔림과 같은 인적사고에 대해서는 예측을 다소 성공적으로 하는 모습을 보아, 다른 인적사고 유형에 대해서 데이터를 더 확보하게 된다면 모델의 개선 여지가 있음을 기대할 수 있다.
  • 실행파일 제작
학습이 완료된 머신러닝 모델을 *.pkl 형태로 추출하여 아래와 같은 코드를 통해 실행 가능한 *.exe 파일을 제작하였다.
import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image, ImageTk
import joblib
import pandas as pd
import sys
import os
# 모델 및 인코딩 정보 로드
def resource_path(relative_path):
   """ Get absolute path to resource, works for dev and for 
PyInstaller """
   try:
       base_path = sys._MEIPASS
   except Exception:
       base_path = os.path.abspath(".")
   return os.path.join(base_path, relative_path)
model_file_path = resource_path('best_model.pkl')
encoding_info_file_path = resource_path('encoding_info.pkl')
best_model = joblib.load(model_file_path)
encoding_info = joblib.load(encoding_info_file_path)
# 선택 가능한 옵션들
seasons = ['봄', '여름', '가을', '겨울']
weathers = ['맑음', '흐림', '강우', '강설', '강풍', '안개']
facility_major_types = ['건축', '산업환경설비', '조경', '토목']
facility_minor_types = [
    '건축물', '공동구', '공원', '교량', '댐', '도로', '발전시설', 
'산업생산시설', 
   '상하수도', '생태공원', '숲', '옹벽 및 절토사면', '정원', '철 
 도', '터널', 
   '하천', '항만', '환경시설'
]
accident_major_types = ['가시설', '건설공구', '건설기계', '건설 
자재', '부재', '시설물', '질병', '토사 및 암반']
accident_minor_types = [
   '가물막이', '가설계단', '가설도로', '강관동바리', '개구부', 
'거더', '거푸집', '건물', 
   '경사면', '고소작업차(고소작업대 등)', '공구류', '교량 바닥 
판', '굴착기', '굴착사면', '기성말뚝', 
   '기중기(이동식크레인 등)', '기타 가시설', '낙하물방지망', '담
장', '덕트', '덤프트럭', '데크플레이트', 
   '돌담', '띠장', '레일', '롤러', '모터그레이더', '몰탈혼합기', 
'방호선반', '배관', '버팀대', 
   '버팀보', '벽돌', '벽체', '보강토 옹벽', '복공판', '볼트', '부 
석', '브라켓', '비계', '사다리', 
   '석축', '선라이트', '성토사면', '쇄석기', '수평연결재', '슬래
브', '시스템동바리', '안전시설물', '안전핀', 
   '암사면', '어스오거', '엄지말뚝', '옹벽', '와이어로프', '위험
물저장탱크', '자재', '작업발판', '잭서포트', 
   '전도방지재', '절토사면', '조적벽체', '주탑', '지게차', '지
반', '지주가설재', '지지대', '지하벽체', 
   '질병', '창호', '천공기', '천정패널', '철골부재', '철근', '철
망', '체인블럭', '콘크리트믹서트럭', 
   '콘크리트펌프', '타워크레인', '터널 막장면', '특수거푸집(갱폼 
등)', '특수건설기계', '파이프서포트', '파형강판', 
   '핀', '항타 및 항발기', '흙막이가시설'
]
processes = [
   '거치작업', '고소작업', '굴착작업', '도장작업', '마감작업', 
'매설작업', '반출작업', '벌목작업', 
   '보수 및 교체작업', '부설 및 다짐작업', '상차 및 하역작업', 
'설비작업', '설치작업', '쌓기작업', 
   '양생작업', '양중작업', '연결작업', '용접작업', '운반작업', 
'이동', '인양작업', '장약 및 발파작업', 
   '적재작업', '전기작업', '절단작업', '절취작업', '정리작업', 
'정비작업', '조립작업', '준비작업', 
   '천공작업', '청소작업', '측량작업', '타설작업', '항타 및 항발 
작업', '해체작업', '형틀 및 목공', 
   '확인 및 점검작업'
] 
accident_locations = ['내부', '외벽', '외부', '인접주변', '지붕']
accident_parts = ['고소', '뒤', '바닥', '상부(위)', '앞', '옆', 
'지하', '하부(아래)']
construction_costs = [
   '1,000만원 미만', '1,000만 ~ 2,000만원 미만', '2,000만 ~ 4,000 
만원 미만', '4,000만 ~ 1억원 미만',
   '1억 ~ 2억원 미만', '2억 ~ 3억원 미만', '3억 ~ 5억원 미만', '5
억 ~ 10억원 미만',
   '10억 ~ 20억원 미만', '20억 ~ 50억원 미만'
]
bidding_rates = ['60% 미만', '60~64%', '65~69%', '70~74%', 
'75~79%', '80~84%', '85~89%', '90% 이상']
worker_counts = ['19인 이하', '20~49인', '50~99인', '100~299인', 
'300~499인', '500인 이상']
progress_rates = ['10% 미만', '10~19%', '20~29%', '30~39%', 
'40~49%', '50~59%', '60~69%', '70~79%', '80~89%', '90% 이상']
def show_result_image(prediction):
   result_window = tk.Toplevel()
   result_window.title("SOC 5 사고예측 모델: 사고예측 결과")
   # 스타일 설정
   style = ttk.Style(result_window)
   style.configure('TLabel', font=('Helvetica', 20, 'bold'))
   # 제목 추가
   title_label = ttk.Label(result_window, text="사고예측 결과", 
font=('Helvetica', 25, 'bold'))
   title_label.grid(row=0, column=0, columnspan=2, pady=10)
   
   # 예측 결과에 따른 이미지 경로 설정
   if prediction == '끼임, 깔림':
       image_path = resource_path("끼임, 깔림.jpg")
   elif prediction == '떨어짐, 넘어짐':
       image_path = resource_path("떨어짐, 넘어짐.jpg")
   elif prediction == '물체에 맞음, 부딪힘':
       image_path = resource_path("물체에 맞음, 부딪힘.jpg")
   elif prediction == '절단, 베임, 찔림':
       image_path = resource_path("절단, 베임, 찔림.jpg")
   image = Image.open(image_path)
   image = image.resize((700, 700), Image.LANCZOS)
   photo = ImageTk.PhotoImage(image)
   image_label = ttk.Label(result_window, image=photo)
   image_label.image = photo  # To keep a reference of the image
   image_label.grid(row=1, column=0, padx=10, pady=10)
   result_label = ttk.Label(result_window, text=f"'{prediction}' 
주의 필요!")
   result_label.grid(row=2, column=0, padx=10, pady=10)
def open_input_window():
   global root  # root 변수를 전역 변수로 선언
   root.destroy()
   root = tk.Tk()  # 새로운 Tk 인스턴스 생성
   root.title("SOC 5 사고예측 모델: 사고 특성인자 입력")
   frame = ttk.Frame(root, padding="10")
   frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
   # 스타일 설정
   style = ttk.Style()
   style.configure('TLabel', font=('Helvetica', 12, 'bold'))
   style.configure('TButton', font=('Helvetica', 20, 'bold'))
   style.configure('TEntry', font=('Helvetica', 20, 'bold'))
   style.configure('TCombobox', font=('Helvetica', 20, 'bold'))
   # 제목 추가
   title_label = ttk.Label(frame, text="사고 특성인자 입력", 
font=('Helvetica', 25, 'bold'))
   title_label.grid(row=0, column=0, columnspan=2, pady=10)
   # 입력 필드
   ttk.Label(frame, text="총공사일").grid(row=1, column=0, 
sticky=tk.W)
   entry_총공사일 = ttk.Entry(frame)
   entry_총공사일.grid(row=1, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="기온").grid(row=2, column=0, 
sticky=tk.W)
   entry_기온 = ttk.Entry(frame)
   entry_기온.grid(row=2, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="습도").grid(row=3, column=0, 
sticky=tk.W)
   entry_습도 = ttk.Entry(frame)
   entry_습도.grid(row=3, column=1, sticky=(tk.W, tk.E))
   # 드롭다운 메뉴
   ttk.Label(frame, text="계절").grid(row=4, column=0, 
sticky=tk.W)
   combo_계절 = ttk.Combobox(frame, values=seasons)
   combo_계절.grid(row=4, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="날씨").grid(row=5, column=0, 
sticky=tk.W)
   combo_날씨 = ttk.Combobox(frame, values=weathers)
   combo_날씨.grid(row=5, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="시설물 종류 대분류").grid(row=6, 
column=0, sticky=tk.W)
   combo_시설물_종류_대분류 = ttk.Combobox(frame, 
values=facility_major_types)
   combo_시설물_종류_대분류.grid(row=6, column=1, sticky=(tk.W, 
tk.E))
   ttk.Label(frame, text="시설물 종류 중분류").grid(row=7, 
column=0, sticky=tk.W)
   combo_시설물_종류_중분류 = ttk.Combobox(frame, 
values=facility_minor_types)
   combo_시설물_종류_중분류.grid(row=7, column=1, sticky=(tk.W, 
tk.E))
   ttk.Label(frame, text="사고객체 대분류").grid(row=8, column=0, 
sticky=tk.W)
   combo_사고객체_대분류 = ttk.Combobox(frame, 
values=accident_major_types)
   combo_사고객체_대분류.grid(row=8, column=1, sticky=(tk.W, 
tk.E))
   ttk.Label(frame, text="사고객체 중분류").grid(row=9, column=0, 
sticky=tk.W)
   combo_사고객체_중분류 = ttk.Combobox(frame, 
values=accident_minor_types)
   combo_사고객체_중분류.grid(row=9, column=1, sticky=(tk.W, 
tk.E))
   ttk.Label(frame, text="작업프로세스").grid(row=10, column=0, 
sticky=tk.W)
   combo_작업프로세스 = ttk.Combobox(frame, values=processes)
   combo_작업프로세스.grid(row=10, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="사고 장소").grid(row=11, column=0, 
sticky=tk.W)
   combo_사고_장소 = ttk.Combobox(frame, 
values=accident_locations)
   combo_사고_장소.grid(row=11, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="사고 부위").grid(row=12, column=0, 
sticky=tk.W)
   combo_사고_부위 = ttk.Combobox(frame, values=accident_parts)
   combo_사고_부위.grid(row=12, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="공사비").grid(row=13, column=0, 
sticky=tk.W)
   combo_공사비 = ttk.Combobox(frame, values=construction_costs)
   combo_공사비.grid(row=13, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="낙찰률").grid(row=14, column=0, 
sticky=tk.W)
   combo_낙찰률 = ttk.Combobox(frame, values=bidding_rates)
   combo_낙찰률.grid(row=14, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="작업자수").grid(row=15, column=0, 
sticky=tk.W)
   combo_작업자수 = ttk.Combobox(frame, values=worker_counts)
   combo_작업자수.grid(row=15, column=1, sticky=(tk.W, tk.E))
   ttk.Label(frame, text="공정률").grid(row=16, column=0, 
sticky=tk.W)
   combo_공정률 = ttk.Combobox(frame, values=progress_rates)
   combo_공정률.grid(row=16, column=1, sticky=(tk.W, tk.E))
   # 예측 버튼
   def inner_predict():
       user_input = {
           '총공사일': int(entry_총공사일.get()),
           '기온': float(entry_기온.get()),
           '습도': float(entry_습도.get()),
           '계절': combo_계절.get(),
           '날씨': combo_날씨.get(),
           '시설물 종류 대분류': combo_시설물_종류_대분류.get(),
           '시설물 종류 중분류': combo_시설물_종류_중분류.get(),
           '사고객체 대분류': combo_사고객체_대분류.get(),
           '사고객체 중분류': combo_사고객체_중분류.get(),
           '작업프로세스': combo_작업프로세스.get(),
           '사고 장소': combo_사고_장소.get(),
           '사고 부위': combo_사고_부위.get(),
           '공사비': combo_공사비.get(),
           '낙찰률': combo_낙찰률.get(),
           '작업자수': combo_작업자수.get(),
           '공정률': combo_공정률.get()
       }
       input_df = pd.DataFrame([user_input])
       input_encoded = pd.get_dummies(input_df)
       for col in encoding_info['encoded_columns']:
           if col not in input_encoded.columns:
               input_encoded[col] = 0
       input_encoded = 
input_encoded[encoding_info['encoded_columns']]
       prediction = best_model.predict(input_encoded)
       show_result_image(prediction[0])  # 예측 결과에 따라 이미 
지를 표시합니다.
       
   predict_button = ttk.Button(frame, text="예측", 
command=inner_predict)
   predict_button.grid(row=17, column=0, columnspan=2, pady=10)
# 첫 번째 팝업 창
root = tk.Tk()
root.title("SOC 5 사고예측 모델")
frame = ttk.Frame(root, padding="10")
frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 스타일 설정
style = ttk.Style()
style.configure('TLabel', font=('Helvetica', 20, 'bold'))
style.configure('TButton', font=('Helvetica', 20, 'bold'))
style.configure('TEntry', font=('Helvetica', 20, 'bold'))
style.configure('TCombobox', font=('Helvetica', 20, 'bold'))
frame = ttk.Frame(root, padding="10")
frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 제목 추가
title_label = ttk.Label(frame, text="SOC 5 사고예측 모델", font= 
('Helvetica', 25, 'bold'))
title_label.grid(row=0, column=0, columnspan=2, pady=10)
# 이미지 로드 및 표시
image_path = resource_path("표지.jpg")
image = Image.open(image_path)
image = image.resize((700, 700), Image.LANCZOS)
photo = ImageTk.PhotoImage(image)
image_label = ttk.Label(frame, image=photo)
image_label.image = photo  # To keep a reference of the image
image_label.grid(row=1, column=0, columnspan=2) 
# 실행 버튼
start_button = ttk.Button(frame, text="실행", 
command=open_input_window)
start_button.grid(row=2, column=0, columnspan=2, pady=10)
# GUI 루프 시작
root.mainloop()
2414.png

개발 과제 평가

2415.png
  • 예측 모델의 정확도
현재 예측 모델은 Total Accuracy가 0.63으로 목표하였던 0.7에는 못미치는 수준이다. 이는 하나의 사고유형만 예측하도록 설계된 예측 프로그램의 출력방식의 한계로, 다음과 같은 접근방법을 사용했을 시 보다 나은 성능을 보임을 확인하였다.
기존에 사고유형을 통합하기 전 11개의 사고유형이 존재하는 데이터에 대하여, 랜덤 포레스트의 결과를 각 인적사고에 대한 확률로 표현하였을 때, 한번의 예측에 대하여 사고 발생 가능성이 높다고 판단되는 상위 4가지의 사고유형을 출력하였다. 이때 Test Data에 대하여 예측된 4가지 사고유형에 실제 사고유형이 존재하는 Total Accuracy 값은 0.85로 꽤나 높은 예측률을 보이는 것을 알 수 있다. 따라서 하나의 인적사고 유형에 대한 정확한 예측 및 관리가 아닌, 상위 3~4개의 인적사고 유형에 대하여 집중적인 관리를 하는 방식으로 머신러닝 모델의 사용 방법에 대해 접근 가능할 것이다.
  • 프로그램의 사용 편의성
실행파일을 제작한 이후 여러번의 성능평가를 하는 도중에 있어 오류가 발생한 적이 없으며, 예상대로 잘 동작하였다.

개발 과제 관련 향후 전망

  • 건설공사 안전관리 종합정보망(CSI)의 사고사례 데이터를 활용하여 새로운 사고예측 시스템을 구축할 수 있었다. 머신러닝을 통해 사고예측 결과를 도출할 수 있었으며 추가적인 조정을 통하여 위험순위가 높은 사고 유형을 순서대로 제시해 주거나 혹은 점수로 수치화하여 발전된 모습을 보여줄 수 있을 것이다.
  • 완성된 프로그램은 정교함에 있어서 이상적이지 않은 모습을 보였는데, 시간이 지남에 따라 누적된 데이터의 증가는 예측 모델이 더욱 정교하고 신뢰할 수 있는 사고예측 시스템이 되게 할 것이다. 실제로 데이터 수집은 2019년부터 이루어졌으며, 데이터 수집 건수는 2019년 2400건, 2020년 4556건, 2021년 5015건, 2022년 5162건, 2023년 6067건으로 매년 수집된 데이터가 꾸준히 증가함을 알 수 있다. 그리고 참고한 논문에서 사용된 ‘한국산업안전 보건공단’과 같은 다른 기관이 소유한 데이터도 사용한다면 더욱 발전할 수 있을 것이다.
  • 적절한 보완 이후 프로그램의 배급이 이루어진다면, 건설현장에 추가적인 장비없이 새로운 사고예측 시스템을 추가하여 건설현장의 안전관리 체계의 구축과 이행에 기여할 수 있을 것이다. 특히 추가적인 비용없이 이런 효과를 얻을 수 있다는 것은 중소규모의 작업장에서 적극적으로 이것을 이용하는 이유가 될 것이다.

포스터

안전사고를막아조포스터.png

참고자료

  • Kim, Ji-Myong, Kwang-KyunLim, Sang-Guk Yum, and Seunghyun Son. "A Deep Learning Model Development to Predict Safety Accidents for Sustainable Construction: A Case Study of Fall Accidents in South Korea" Sustainability 14, no. 3 (2022): 1583. https://doi.org/10.3390/su14031583
  • Cho, Mingeon, DonghwanLee, JooyoungPark, and SeungheePark. “Development of Machine Learning-Based Construction Accident Prediction Model Using Structured and Unstructured Data of Construction Sites.” KSCE Journal of Civil and Environmental Engineering Research 42, no. 1 (February 1, 2022): 127–34. https://doi.org/10.12652/Ksce.2022.42.1.0127.
  • Kim, Ji-Myong. “Proposal of a Prediction Framework Based on Deep Learning Algorithm to Predict Safety Accidents at Small-Scale Construction Sites.” Journal of the Korea Institute of Building Construction 23, no. 6 (December 20, 2023): 831–39. https://doi.org/10.5345/JKIBC.2023.23.6.831.
  • Ahmed Gondia, Ahmed Moussa, Mohamed Ezzeldinand Wael El-Dakhakhni. "Machine learning-based construction site dynamic risk models." Technological Forecasting and Social Change, Volume 189, (April ,2023): 122347. https://doi.org/10.1016/j.techfore.2023.122347.
  • 박환표, 한재구, 공정기반의 건설현장 안전 위험도 평가지수 및 위험예측 시스템 개발(Ⅰ), 한국건설기술연구원, 2019.12
  • 건설기술 진흥법 제 62조.
  • 건설기술 진흥법 제 67조.
  • 중대재해 처벌 등에 관한 법률 제 6조.
  • 중대재해 처벌 등에 관한 법률 제 7조.
  • [네이버 지식백과] 중대재해 처벌 등에 관한 법률 [重大災害 處罰 等―關―法律] (두산백과 두피디아, 두산백과)
  • 한국도로공사. 안전사고 위험률 예측 시스템 및 방법. 특허 출원번호 1020080137390, 출원일 2008년 12월 30일, 등록일 2010년 7월 8일.
  • 인하대학교 산학협력단. 현장조건과 사고사례를 이용한 작업자의 위험도 예측 시스템 및 그 방법. 특허 출원번호 1020190164661, 출원일 2019년 12월 11일, 등록일 2021년 11월 11일.
  • 한국건설기술연구원. 공정기반의 건설안전 위험 예측시스템 및 이의 운용방법. 특허 출원번호 1020190166337, 출원일 2019년 12월 13일, 등록일 2021년 12월 1일.
  • 에스케이에코플랜트(주). 건설 현장 위험성 예측 방법 및 이를 실행하는 서버. 특허 출원번호 1020210079028, 출원일 2021년 6월 17일, 등록일 2022년 2월 11일.
  • 현대건설(주). 인공지능을 기반으로 한 건설 현장 안전 재해 예측 방법 및 시스템. 특허 출원번호 1020210180521, 출원일 2021년 12월 16일, 등록일 2024년 2월 28일.
  • 주식회사 세이프티마스터 성미애. 위험작업의 사고발생확률을 예측할 수 있는 웹 기반의 안전관리시스템. 특허 출원번호 1020220003250, 출원일 2022년 1월 10일, 등록일 2023년 7월 18일.
  • 주식회사 산군. 건설 데이터를 이용한 사고 예측 시스템 및 그의 제어방법. 특허 출원번호 1020220118951, 출원일 2022년 9월 20일, 등록일 2024년 3월 27일.
  • 국토안전관리원. 인공지능에 기반하여 빅데이터의 자동 분석을 통한 건설사고 예측방법 및 장치. 특허 출원번호 1020230067741, 출원일 2023년 5월 25일, 등록일 2024년 2월 27일.