기상청에서 주최하는 날씨 콘테스트에 참가하는데 데이터 수집이 끝나 본격적으로 전처리 작업을 시작하였다.
내가 알 수 있을만큼 보다 더 성장한 모습을 볼 수 있어 뿌듯했다.
차후 전처리를 완료하고 좋은 모델을 만들기 위해 적합한 알고리즘을 찾는 작업을 할 것이다.
=========================== Python ===========================
import pandas as pd
### 사고 데이터 일시를 분단위를 제거하여 00으로 교체
# 데이터 가져오기
accident = pd.read_csv('accident.csv', encoding='utf-8')
# 객체 생성하여 발생일시 데이터를 추출하여 뒤에 '분'을 빼고 00으로 교체
refined_data = [data[:-2]+"00" for data in accident.발생일시]
# print(refined_data[0]) # 데이터 확인
# accident에서 '발생일시'컬럼을 제거하고 date 컬럼으로 위의 refined_data를 추가
del accident['발생일시']
accident['date'] = refined_data
# print(accident.head()) # 데이터 확인
# 추가적으로 필요없는 컬럼을 제거
del_col = ['선종2', '톤수2', '선종3', '톤수3', '항목제외필요성']
for a in del_col:
del accident[a]
# print(accident.columns.values) # 컬럼 데이터 확인
# 정제한 데이터를 csv로 저장
accident.to_csv("D:/deep1/refine_accident.csv")
### weather 데이터 살펴보기
weather = pd.read_csv("D:/deep1/weather.csv", encoding='utf-8')
# print(weather.head()) # 데이터 확인
# 어느 지역의 관측 데이터가 존재하는지 확인
location = weather.지점.value_counts()
# print(location) # 데이터 확인
#########################################################
### 위의 두 데이터를 합치기
# 데이터를 합치기 위해 accident의 관할해경서와 weather의 지점이 같은 부분이 있는지 확인
police = accident.관할해경서.value_counts()
# print(police) # 데이터 확인
# 같은 데이터가 없으므로 police와 가장 가까운 지역의 location을 매칭시키기 위해 accident에 데이터 추가
#########################################################
### 기상특보에 따라 사고 유형이 얼마나 바뀌는지 확인
# 기상상황과 관계없이 분석
cause = accident.발생원인.value_counts()
# print(cause) # 건수로 확인
'''
정비불량 3897
운항부주의 3111
기타 1501
관리소홀 797
기상악화 463
화기취급부주의 248
연료고갈 223
적재불량 47
재질불량 41
'''
# print(cause/cause.sum()) # 비율로 확인
'''
정비불량 0.377324
운항부주의 0.301220
기타 0.145333
관리소홀 0.077169
기상악화 0.044830
화기취급부주의 0.024012
연료고갈 0.021592
적재불량 0.004551
재질불량 0.003970
'''
# 기상상황이 좋지 않은 경우
bad_weather = accident.loc[accident['기상특보'] != '양호']
cause_in_bad_weather = bad_weather.발생원인.value_counts()
# print(cause_in_bad_weather) # 건수로 확인
'''
정비불량 413
기상악화 385
운항부주의 344
기타 248
관리소홀 86
화기취급부주의 31
연료고갈 14
적재불량 6
재질불량 4
'''
# print(cause_in_bad_weather/cause_in_bad_weather.sum()) # 비율로 확인
'''
정비불량 0.269758
기상악화 0.251470
운항부주의 0.224690
기타 0.161986
관리소홀 0.056172
화기취급부주의 0.020248
연료고갈 0.009144
적재불량 0.003919
재질불량 0.002613
'''
# 기상상황이 좋은 경우
fine_weather = accident.loc[accident['기상특보'] == '양호']
cause_in_fine_weather = fine_weather.발생원인.value_counts()
# print(cause_in_bad_weather) # 건수로 확인
'''
정비불량 3484
운항부주의 2767
기타 1253
관리소홀 711
화기취급부주의 217
연료고갈 209
기상악화 78
적재불량 41
재질불량 37
'''
# print(cause_in_fine_weather/cause_in_fine_weather.sum()) # 비율로 확인
'''
정비불량 0.396044
운항부주의 0.314539
기타 0.142435
관리소홀 0.080823
화기취급부주의 0.024668
연료고갈 0.023758
기상악화 0.008867
적재불량 0.004661
재질불량 0.004206
'''
### 각 관할해경마다 어떤 사고가 많이 일어나는지 확인
# 저장할 데잉터 객체 선언
data = pd.DataFrame()
# 관할해경서 리스트 뽑기
police = accident.관할해경서.value_counts()
police_list = [police_list for police_list in police.index]
# print(police_list) # 데이터 확인
# 관할해경서 별로 어떤 사고가 많이 일어나는 확인
# for list in police_list:
### 경도 위도를 이용하여 두 지점사이의 거리를 구하고 가장 가까운 weather 자료를 선별하기
import math
# 두 개의 경도 위도를 알 때 두 점 사이의 거리를 구하기
def getDistance(lat1, lon1, lat2, lon2):
a = 6378137.0
b = 6356752.314245
f = 1 / 298.257223563
L = math.radians(lon2 - lon1)
U1 = math.atan((1 - f) * math.tan(math.radians(lat1)));
U2 = math.atan((1 - f) * math.tan(math.radians(lat2)));
sinU1 = math.sin(U1)
cosU1 = math.cos(U1)
sinU2 = math.sin(U2)
cosU2 = math.cos(U2)
cosSqAlpha = float()
sinSigma = float()
cos2SigmaM = float()
cosSigma = float()
sigma = float()
# l == lambda
l = L
lambdaP = float()
iterLimit = 100
while True:
sinLambda = math.sin(l)
cosLambda = math.cos(l)
sinSigma = math.sqrt((cosU2 * sinLambda) * (cosU2 * sinLambda) + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (
cosU1 * sinU2 - sinU1 * cosU2 * cosLambda))
if (sinSigma == 0):
return 0;
cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda
sigma = math.atan2(sinSigma, cosSigma)
sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma
cosSqAlpha = 1 - sinAlpha * sinAlpha
cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha
C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha))
lambdaP = l
l = L + (1 - C) * f * sinAlpha * (
sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
if (iterLimit == 0) or ((math.fabs(l - lambdaP) > 1e-12) and (iterLimit > 0)):
break
iterLimit = iterLimit - 1
# end while
if (iterLimit == 0):
return 0
uSq = cosSqAlpha * (a * a - b * b) / (b * b)
A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)))
B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)))
deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (
cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (
-3 + 4 * cos2SigmaM * cos2SigmaM)))
s = b * A * (sigma - deltaSigma)
return s
# 도분초를 경도 위도 값으로 바꾸기
def lat_lng(d, b, c):
return d + (b/60) + (c/3600)
=========================== Python ===========================
'데이터 분석 > 데이터 분석 프로젝트' 카테고리의 다른 글
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 3(에러) (0) | 2018.07.14 |
---|---|
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 2(데이터 전처리) (0) | 2018.07.13 |
[MTG 프로젝트] MTG Goldfish에서 현재 스탠다드 메타 덱 카드 자료를 수집하고 정량적으로 분석하기 - 1 (데이터 수집단계) (1) | 2018.07.08 |
[Python Scraping] 스크래핑(크롤링)을 이용하여 위키 문헌에 있는 윤동주 작가의 작품 목록 가져오기 (0) | 2018.07.02 |
[데이터 분석] 기상데이터를 이용하여 단위 면적 다양파 생산량을 예측 분석(기상청) - 1(분석 전 단계) (0) | 2018.07.01 |