Project/Ship Waiting Time Prediction
PORT MIS 대기시간 예측 - 3. 결측치 처리(시계열 데이터, 중앙값)
skwkiix
2023. 11. 30. 01:01
728x90
이 포스팅은 2차 전처리(입출항 기준 데이터셋 재구성)에 이은, 결측치 처리(3차 전처리)에 관한 내용을 담고 있다.
개요
결측치 처리 방법은 다음과 같다.
1. 선박제원정보 : 선박용도별 중앙값 대체
2. 기상데이터 결측치 : 선형보간법 사용
1. 선박제원정보 결측치 처리
- 선박제원정보 데이터 타입 변경(숫자)
# 쉽표 제거
columns_to_fix = ['총톤수', '재화중량톤수', '선박제원(총길이, m)', '선박제원(너비, m)', '만재흘수(m)', '깊이(m)', '길이1(m)']
df[columns_to_fix] = df[columns_to_fix].replace({',': ''}, regex=True)
# 숫자로 변환
df[columns_to_fix] = df[columns_to_fix].apply(pd.to_numeric, errors='coerce')
- '선박용도' 별 그룹화
grouped_by_usage = df.groupby('선박용도')[columns_to_fix]
- 분포 확인
fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(16, 8))
for i, column in enumerate(columns_to_fix):
ax = axes[i // 4, i % 4]
ax.hist(df[column].dropna(), bins=30)
ax.set_title(f'Distribution of {column}')
ax.set_xlabel(column)
ax.set_ylabel('Frequency')
plt.tight_layout()
plt.show()
- 선박용도별 중앙값으로 대체
분포가 치우쳐져있어, 평균 대신 중앙값으로 대체한다.
for column in columns_fo_fix:
df[column] = df.groupby('선박용도')[column].transform(lambda x: x.fillna(x.median()))
2. 날씨 데이터 결측치 처리
columns_to_interpolate = ['풍속(m/s)', '풍향(deg)', 'GUST풍속(m/s)', '현지기압(hPa)', '습도(%)', '기온(°C)',
'수온(°C)', '최대파고(m)', '유의파고(m)', '평균파고(m)', '파주기(sec)', '파향(deg)']
- Date + Time 및 인덱스 생성
df['Datetime'] = pd.to_datetime(df['ETA_Year'].astype(str) + '-' + df['ETA_Month'].astype(str) + '-' + df['ETA_Day'].astype(str) + ' ' + df['ETA_Hour'].astype(str) + ':00:00')
df.set_index('Datetime', inplace=True)
- 선형보간
# 선형 보간
df[columns_to_interpolate] = df[columns_to_interpolate].interpolate(method = 'time', limit_direction = 'both', limit_area = 'inside')
time method -> 이전 날짜가 겹칠 경우, 제외하고 보간
both -> 양방향 보간
limit_area='inside' -> 결측치가 있는 구간 내에서만 보간
728x90