Construction Safety AI

03Risk Prediction

공정표에 있는 높이·경력·교육·풍속·야간 정보로 내일 작업의 위험을 미리 알려 주는 모델을 만들어 보자. 모델이 무엇을 배우는지, 얼마나 믿어도 되는지, 어디서 속는지를 직접 학습시키며 따진다.

Classification · Regression · Features · Leakage · Overfitting · Cross-validation · Correlation vs causation

전문가 검수 전 · 실제 신고 자료와 원리 확인용 예시를 구분한다. 서술문은 개인정보 공개 조건 미충족으로 제공하지 않는다.

The question 이 자료의 질문

안전팀장이 말한다. “매일 아침 작업 계획서를 받는데, 그중 어느 작업에 안전 담당을 먼저 보내야 할지 미리 알려 주는 모델이 있으면 좋겠다.” 계획서에는 작업 높이, 작업자 경력, 안전교육 시간, 풍속 예보, 야간 여부가 적혀 있다. 이것으로 사고 위험을 예측할 수 있을까?

할 수 있다. 다만 예측 모델은 과거 기록에서 규칙을 배워 새 기록에 적용하는 도구일 뿐이고, 그 규칙이 맞는지는 보지 못한 기록으로 점검해야 알 수 있다. 이 자료에서는 모델 두 가지(로지스틱 회귀, 결정나무)를 브라우저에서 실제로 학습시키며, 정답을 맞히는 것과 믿을 만한 것은 다르다는 것을 여러 방향에서 확인한다.

Flow 순서

  1. Problem: 같은 기록으로 분류(사고가 날까)와 회귀(몇 건일까)를 풀어 보기
  2. Features: 어떤 특성이 사고를 구분하는가, 너무 좋은 특성(누수)을 의심하기
  3. Models: 로지스틱 회귀와 결정나무를 학습시키고 학습·검증 정확도 비교
  4. Generalization: 한 번 나눈 검증의 운, 교차 검증으로 나무 깊이 고르기
  5. Boundary: 모델이 평면을 어떻게 나누는가, 판정 임계값
  6. Causation: 상관을 대책의 효과로 읽으면 생기는 일
  7. Data volume: 기록 수와 특성 수가 성능에 미치는 영향

Checklist 끝나면 물을 수 있어야 할 것

Data 데이터

실제 신고 사고37,196건의 분류값을 재사용한다. 사고 발생 전의 작업 집합은 없다. 교란의 참값을 확인하는 Causation 체험만 정답 식을 아는 원본 예시(가상)를 유지한다.

Classification and regression 무엇을 예측하는가

이 장면에서 실제 자료의 관찰 단위는 신고 사고 한 건이다. 사망 포함 여부를 구분하며 사고 없는 작업의 발생 확률과 구별한다. 사후 유형 입력을 포함했는지 결과에서 확인한다. 원리를 확인하려고 정답 식을 정한 체험에는 예시(가상) 배지를 유지한다.

관찰 단위는 국토안전관리원에 신고된 사고 한 건이다. 사망자가 한 명 이상이면 분류 정답은1, 그렇지 않으면0으로 둔다. 회귀 정답은 같은 기록의 사망자 수다. 두 질문은 같은 입력을 쓰더라도 출력의 단위가 다르다. 분류는 사망 포함 여부를, 회귀는 사람 수를 설명한다. 사고가 없던 작업은 수록되지 않아 내일 작업의 사고 발생률을 계산할 수 없다. 체험에서 정답의 단위를 바꾸어 분류 혼동행렬과 회귀 RMSE를 비교한다. 사망자 수 회귀는 학습 기간의 객체별 평균을 미래 기록에 적용하며, 처음 보는 객체에는 전체 학습 평균을 쓴다. 전체 평균만 답하는 기준선과 나란히 읽는다.

사망 포함 분류와 사망자 수 회귀 실제 신고 자료

질문을 분류(사고 여부) 또는 회귀(아차사고 보고 건수)로 고르면 해당 모델이 학습되고 검증 기록으로 점검한다. 특성을 켜고 끄며 어떤 특성이 필요한지 본다. 회귀의 정답은 가상으로 정한 식에 푸아송 잡음을 더해 만들었다.

해 볼 것
  1. 정답을 사망 포함 여부와 사망자 수로 바꿔 분류 지표와 회귀 RMSE의 단위가 어떻게 달라지는지 비교한다.
  2. 사망자 수 회귀에서 객체별 학습 평균과 전체 학습 평균의 미래 평가 RMSE를 비교한다.
  3. 모형과 사후 사고 유형 포함 여부를 바꾼다. 신고 사고 안의 분류 결과를 모든 작업의 위험으로 읽을 수 없는 이유를 적는다.

Features 어떤 특성이 사고를 구분하는가

이 장면에서 실제 자료의 관찰 단위는 신고 사고 한 건이다. 사망 포함 여부를 구분하며 사고 없는 작업의 발생 확률과 구별한다. 사후 유형 입력을 포함했는지 결과에서 확인한다. 원리를 확인하려고 정답 식을 정한 체험에는 예시(가상) 배지를 유지한다.

분류값은 숫자로 부호화돼 있어도 크기의 순서가 있는 양이 아니다. 공종·객체·작업 프로세스·공공민간·시설물은 학습 기간에 나온 범주만 one-hot 지시변수로 만든다. 미입력도 별도 범주로 남기고 평가 때 처음 본 범주는 기존 사전에 끼워 넣지 않는다. 사고 유형은 사후에 정리한 분류이므로 사전 예측 입력으로 쓰면 누설이 된다. 아래 객체별 비율은 각 객체의 사망 포함 신고 건수를 그 객체의 신고 건수로 나눈 값이다. 작업량이나 노출 시간이 없으므로 비율이 높다는 이유만으로 특정 객체가 더 위험하다고 결론내릴 수 없다. 사후 유형 선택을 바꿀 때 평가 기간을 유지하여 입력 정보의 차이가 순위 성능을 어떻게 바꾸는지 읽는다.

객체별 실제 사망 포함 비율 실제 신고 자료

특성별 AUC를 막대로 본다. 막대를 누르면 사고 기록과 무사고 기록의 분포가 겹쳐서 나온다. 누수 특성을 넣고 빼며 달라지는 것을 본다.

해 볼 것
  1. 객체별 사망 포함 비율의 가장 큰 값과 사례 수가 많은 객체를 구별한다.
  2. 사후 사고 유형을 포함하고 제외했을 때 AUC를 비교한다. 사고 전에 알 수 있는 입력인지 판단한다.
  3. 객체별 비율 차이를 원인이나 위험도의 차이라고 단정할 수 없는 이유를 설명한다.

Two models 로지스틱 회귀와 결정나무

이 장면에서 실제 자료의 관찰 단위는 신고 사고 한 건이다. 사망 포함 여부를 구분하며 사고 없는 작업의 발생 확률과 구별한다. 사후 유형 입력을 포함했는지 결과에서 확인한다. 원리를 확인하려고 정답 식을 정한 체험에는 예시(가상) 배지를 유지한다.

로지스틱 회귀는 one-hot 입력의 선형 결합을 sigmoid로 바꾸어 사망 포함 점수를 낸다. 평균 이항 손실과 L2 벌점0.002를 사용하고 학습률0.7로160회 계산한다. 결정나무는 범주 하나와 나머지를 나누어 Gini 불순도를 줄이는 분할을 선택하며 기본 깊이4, 최소 잎60건을 쓴다. 같은2019–2023년27,275건으로 학습하고2024–2025년9,921건에서 평가한다. 160회 값은 수렴해라고 표시하지 않는다. 작은 점수 범위를 읽기 쉽게 임계값 곡선의 축을 실제 최대 점수에 맞춘다. AUC는 순위를 보고 혼동행렬은 선택한 임계값에서 판정을 세므로 두 지표를 함께 읽는다. 모두 비사망이라고 답하는 전체 기록 기준선은95.8%이나 재현율은0이다.

같은 미래 평가 자료의 두 모형 실제 신고 자료

모델, 특성, 학습 비율, 나무 깊이를 바꾸면 모델이 다시 학습되고 정확도가 바뀐다. 기록 수를 작게, 나무를 깊게, 또는 로지스틱에서 ‘곱·제곱 특성 추가’를 켜 본다. 누수 특성도 넣어 볼 수 있다.

해 볼 것
  1. 로지스틱 회귀와 깊이 4인 결정나무를 바꿔 같은 미래 평가 자료의 AUC를 비교한다.
  2. 임계값을 낮춰 TP·FN·FP·TN 중 어떤 수가 늘거나 줄어드는지 확인한다.
  3. 사후 유형을 포함했을 때 성능이 높아져도 현장 투입의 근거가 되지 않는 이유를 적는다.

Generalization 한 번 나눈 검증의 운과 교차 검증

이 장면에서 실제 자료의 관찰 단위는 신고 사고 한 건이다. 사망 포함 여부를 구분하며 사고 없는 작업의 발생 확률과 구별한다. 사후 유형 입력을 포함했는지 결과에서 확인한다. 원리를 확인하려고 정답 식을 정한 체험에는 예시(가상) 배지를 유지한다.

교차 검증은 한 번 나눈 자료의 우연에 성능 판단이 좌우되는지 확인하는 방법이다. 먼저2024년과2025년 평가 기록을 따로 읽는다. 2025년은6월까지여서 연간 건수로 비교하지 않으며 AUC도 표본 구성이 다르다는 전제에서 본다. 두 번째 체험은 학습 기간에서 매10번째 기록을 취한 뒤3개 또는5개 폴드로 나누어 실제로 다시 학습한다. 이 계산은 미래 평가의 대체가 아니라 학습 기간 내부의 변동을 보는 보조 검사다. 각 폴드에서 평가 라벨은 학습에 들어가지 않고 입력 범주 사전도 학습 기록에서 만든다. 사고 유형 포함 여부를 결과에 표시하고 바꿀 수 있다. 가장 높은 폴드만 고르는 대신 모든 폴드의 차이와 미래 평가 결과를 함께 남긴다.

2024년·2025년 미래 평가 실제 신고 자료

기록을 학습 70%와 검증 30%로 30번 무작위로 나누어 매번 모델을 학습하고 검증 정확도를 쓴다. 점 하나가 나누기 한 번이다. 기록 수가 적으면 폭이 넓어진다.

학습 기간 내부 교차 검증 실제 신고 자료

k-fold로 깊이 1~10을 각각 점검한다. 학습 정확도는 계속 오르지만 교차 검증 정확도는 어느 깊이에서 멈추거나 내려간다. 고른 깊이의 폴드별 값을 표로 본다.

해 볼 것
  1. 첫째 체험에서 2024년과 2025년의 AUC를 비교한다. 2025년이 반년 자료라는 점을 함께 적는다.
  2. 둘째 체험에서 폴드를 3과 5로 바꾸고 모든 폴드의 AUC 범위를 비교한다.
  3. 두 모형과 사후 유형 포함 여부를 바꾼다. 내부 교차 검증과 미래 평가가 각각 답하는 질문을 구별한다.

Decision boundary 판정 경계와 임계값

이 장면에서 실제 자료의 관찰 단위는 신고 사고 한 건이다. 사망 포함 여부를 구분하며 사고 없는 작업의 발생 확률과 구별한다. 사후 유형 입력을 포함했는지 결과에서 확인한다. 원리를 확인하려고 정답 식을 정한 체험에는 예시(가상) 배지를 유지한다.

범주 입력의 판정 경계는 연속 좌표의 직선 그림과 다르다. 여기서는 객체와 시설물 조합마다 실제 평가 기록 하나를 골라 모델 점수로 칠한 표를 만든다. 빈 칸은 해당 평가 조합이 없다는 뜻이며 임의의 사고 기록을 만들어 채우지 않는다. 임계값을 바꾸면 같은 점수가 양성 또는 음성으로 분류되어 색이 달라진다. 셀 사이에는 공종과 작업 프로세스도 다를 수 있으므로 두 입력만 바꾼 인과 효과로 해석하지 않는다. 사후 사고 유형을 포함하면 모형이 보는 정보가 달라지는 것을 표 위에 명시한다. 희귀 범주의 한 기록이 그 범주 전체를 대표한다고 보지 말고 실제 기록 수와 함께 읽는다. 연속 입력 평면의 경계를 이해한 뒤 범주형 자료에서 무엇을 고정할 수 없는지 비교하는 체험이다.

실제 범주 조합의 점수와 판정 경계 실제 신고 자료

작업 높이와 풍속 두 특성만으로 학습한 모델이 평면을 ‘사고’와 ‘무사고’ 영역으로 나눈다. 나무 깊이, 로지스틱의 확률 임계값, 점으로 보이는 기록을 바꾼다. 그림 위를 누르면 그 자리의 새 기록을 두 모델이 판정한다.

해 볼 것
  1. 모형을 바꾸며 같은 객체·시설 조합의 점수를 비교한다. 빈 셀과 낮은 점수의 셀을 구별한다.
  2. 임계값을 0.05에서 0.02로 낮춘다. 색칠된 조합과 재현율은 어떻게 바뀌는가?
  3. 셀마다 다른 실제 기록을 사용한다는 점을 확인하고, 이를 두 입력만의 인과 효과로 읽을 수 없는 이유를 적는다.

Correlation and causation 상관은 효과가 아니다

이 장면에서 실제 자료의 관찰 단위는 신고 사고 한 건이다. 사망 포함 여부를 구분하며 사고 없는 작업의 발생 확률과 구별한다. 사후 유형 입력을 포함했는지 결과에서 확인한다. 원리를 확인하려고 정답 식을 정한 체험에는 예시(가상) 배지를 유지한다.

예측 모델이 찾은 관계는 상관이다. “교육 시간이 많은 현장에서 사고가 더 많다”는 결과가 나왔다고 해서 교육을 줄이면 사고가 줄어든다는 뜻은 아니다. 그 사이에 둘 다에 영향을 주는 제3의 요인(교란 요인)이 있을 수 있다. 예를 들어 대형 현장일수록 안전교육을 더 많이 하면서 위험한 공종도 더 많이 맡는다면, 교육 시간과 사고율이 함께 높게 나올 수 있다.

아래 체험은 가상의 현장 여러 곳을 이렇게 만든다. 현장 규모가 클수록 교육 시간도 길고 사고율도 높게 정한 것은 설명을 위한 설정이며 실제 규모와 사고율의 관계가 아니다(01). 그리고 같은 규모끼리 비교하면 교육이 늘 때 사고율이 줄도록(가상의 진짜 효과) 만들었다. 규모를 구분하지 않고 보면 교육과 사고율이 양의 관계로 나오고, 규모별로 나누어 보면 음의 관계가 나온다. 이것은 01에서 본 구성 효과, 심프슨의 역설과 같은 뿌리다.

그러니 모델이 학습한 계수를 정책 효과로 읽을 때는 조심해야 한다. 교육을 2시간 늘려 사고율이 얼마나 변할지를 묻는 것은 개입의 효과를 묻는 일이고, 관측된 상관만으로는 답할 수 없다. 교란 요인을 통제하거나, 무작위 배정 같은 설계가 필요하다. 06에서 설명 가능한 AI를 다룰 때도 “모델의 설명은 인과가 아니다”를 다시 만난다.

교육 시간과 사고율: 규모를 나누어 보면 예시(가상)

현장마다 교육 시간(가로)과 사고율(세로)을 점으로 찍는다. 규모와 교육의 연관 세기(교란 세기)를 바꾸고, 규모별로 나누어 보는 것을 켠다. 아래 숫자가 전체 기울기와 규모를 통제한 기울기를 비교한다.

해 볼 것
  1. 교란 세기를 1.0으로 두고 전체 보기와 규모별 보기를 바꾼다. 선의 기울기 부호가 어떻게 달라지는가?
  2. 교란 세기를 0으로 낮춘다. 전체 기울기와 통제한 기울기가 비슷해지는가? 이유는?
  3. “교육을 2시간 늘리면 사고율이 이만큼 변한다”는 예측이 두 기울기에서 각각 얼마인가? 어느 쪽을 믿고 대책을 세우겠는가?

Data volume 기록 수와 특성 수

이 장면에서 실제 자료의 관찰 단위는 신고 사고 한 건이다. 사망 포함 여부를 구분하며 사고 없는 작업의 발생 확률과 구별한다. 사후 유형 입력을 포함했는지 결과에서 확인한다. 원리를 확인하려고 정답 식을 정한 체험에는 예시(가상) 배지를 유지한다.

학습 곡선은 학습 자료가 늘어날 때 같은 평가 집합의 성능이 어떻게 달라지는지 보여 준다. 여기서는 학습 기간 기록을 정해진 간격으로 취하여25%,50%,100%를 비교하고 미래 평가9,921건을 고정한다. 각 비율마다 범주 사전과 계수를 다시 만든다. 자료가 많아지면 희귀 범주가 더 관측되지만 정확도가 반드시 단조롭게 오르는 것은 아니다. 사고 유형 포함 여부와 모형을 고정한 상태에서 곡선을 읽어야 데이터 양과 모델 변경 효과를 혼동하지 않는다. 점들이 비슷하다는 사실만으로 자료가 충분하다고 판단할 수 없다. 미래 시기의 변화, 신고 방식의 편향, 미입력과 사고 없는 작업의 부재는 학습량을 늘려도 자동으로 해결되지 않는다. 각 점의 AUC를 기준선0.5와 함께 비교한다.

학습 비율에 따른 미래 평가 실제 신고 자료

기록 수에 따른 테스트 정확도를 로지스틱 회귀와 깊이 6 나무로 그린다. 점선은 나무의 학습 정확도다. 무관한 특성의 수와 반복 횟수를 바꾼다.

해 볼 것
  1. 학습 비율 25%, 50%, 100%의 AUC를 같은 미래 평가 자료에서 비교한다.
  2. 로지스틱 회귀와 결정나무의 학습 곡선이 같은 방향으로 변하는지 확인한다.
  3. 사후 유형을 포함했을 때 곡선의 차이를 본다. 더 많은 자료로도 해결되지 않는 누설 문제를 설명한다.

Summary 정리

Notation · 기호

N: 기록 수 · p: 비율 또는 모델 점수 · τ: 판정 임계값 · TP/FP/FN/TN: 참양성/거짓양성/거짓음성/참음성. 각 그림의 축과 단위가 해당 체험의 정의다.