2025.06.27 본_캠프 91일차

민동·2025년 6월 27일
2

본캠프

목록 보기
71/74

2차 프로토 타입을 만들어보자

1차 프로토 타입은 서울의 송파구,강남구,서초구 3개의 자치구만 시행했었다.
2차 프로토 타입은 총 3가지의 모델을 만드는게 목표!

  1. 서울 전역 데이터를 활용한 분류 모델 : x값의 날짜 데이터는 완전 랜덤
  2. 서울 전여 데이터를 활용하 분류 모델 : x값의 날짜 데이터는 계절을 균등 분배
  3. 서울 전역 데이터를 활용한 이상치 탐지 모델 : 임의의 x값 3만개를 추가로 만들어야 함..ㅠ

2차 프로토 타입 데이터

  • 싱크홀 발생(0·1) : 1 = 해당 시점·위치에서 싱크홀 발생, 0 = 미발생.
  • : 사고가 일어난 달(1 ~ 12)
  • 기상 정보 : 기상청 날씨누리 웹 크롤링으로 수집 완료(김수연)
    • 강수량 3일 합계(mm) : 사고 전 3일 동안 내린 비의 총량.
    • 사고 당일 일교차(℃) : 사고 당일 최고기온 − 최저기온.
    • 사고 전 3일간 일교차 평균(℃) : 사고 전 3 일 동안의 일교차 평균.
  • 지층 정보 : 사고 지점의 암석·퇴적층 종류.
  • 지하수
    • 측정소와거리(m) : 사고발생지점과 측정소의 거리
    • 수위_최대차 : 최근 ± 6 개월 사이 지하수 최고-최저 차이.
    • 수위_변동 : 같은 기간 수위의 흔들림 정도(표준편차).
    • 수온_최대차 : 최근 ± 6 개월 사이 지하수 최고-최저 차이.
    • 수온_변동 : 같은 기간 수위의 흔들림 정도(표준편차).
    • EC_최대차 : ± 6 개월 사이 EC 최고-최저 차이.
    • EC_변동성 : 같은 기간 EC의 흔들림 정도.
  • 지하철 정보
    • 노선_거리 : 사고 지점과의 지하철과의 노선 거리.
    • 노선50m이내_개수 : 동일 반경 내 지하철 노선(또는 환기구 등) 숫자.
    • 최단거리역 : 사고 지점과 최단거리의 지하철 역. ****
    • 최단거리(m) : 사고 지점과 지하철역간의 거리(m).
  • 시설물
    • 전체시설물반경내개수_250m
    • 전체시설물_최단거리(m)

t-test 결과 먼저 맛보기

1. 분류모델_랜덤

#데이터 불러오기
df = pd.read_excel("2차_prototype_지도학습(분류)_랜덤_06271930.xlsx")

# 결측치 채워 넣기
df['지하수_수온_최대차'] = df['지하수_수온_최대차'].fillna(df['지하수_수온_최대차'].mean())
df['지하수_수온_변동성'] = df['지하수_수온_변동성'].fillna(df['지하수_수온_변동성'].mean())
df['지하수_EC_최대차'] = df['지하수_EC_최대차'].fillna(df['지하수_EC_최대차'].mean())
df['지하수_EC_변동성'] = df['지하수_EC_변동성'].fillna(df['지하수_EC_변동성'].mean())


# 범주형변수 One-hot Encoding
df1=pd.get_dummies(df,columns=['지층'])

import pandas as pd
import numpy as np
from scipy.stats import ttest_ind

# 가정: df는 전처리된 DataFrame
group_col = '싱크홀_발생'  # 0=미발생, 1=발생

# 수치형 컬럼 자동 탐색
num_cols = df.select_dtypes(include=[np.number]).columns.tolist()
if group_col in num_cols:
    num_cols.remove(group_col)

# 두 그룹 분리
group_1 = df[df[group_col] == 1]
group_0 = df[df[group_col] == 0]

# Welch's t-test 수행
results = []
for col in num_cols:
    val1 = group_1[col]
    val0 = group_0[col]
    t_stat, p_val = ttest_ind(val1, val0, equal_var=False)
    
    results.append({
        '변수': col,
        '발생_mean': round(val1.mean(), 4),
        '미발생_mean': round(val0.mean(), 4),
        '차이': round(abs(val1.mean() - val0.mean()), 4),
        't-stat': round(t_stat, 4),
        'p-value': round(p_val, 4),
        '유의': '*' if p_val < 0.05 else ''
    })

# 결과 정리
t_df = pd.DataFrame(results)
t_df = t_df.sort_values(by='p-value')

# 유의한 변수만 리스트로 추출
significant_cols = t_df[t_df['p-value'] < 0.05]['변수'].tolist()

# 결과 출력
print("\n=== Welch’s t-test 결과 (싱크홀 발생 vs 미발생) ===")
print(t_df.to_string(index=False))
print(f"\n✅ 유의한 변수 목록 ({len(significant_cols)}개):\n{significant_cols}")
profile
아자아자

0개의 댓글