기상청에서 주최하는 날씨 콘테스트에 참가하는데 데이터 수집이 끝나 본격적으로 전처리 작업을 시작하였다.

내가 알 수 있을만큼 보다 더 성장한 모습을 볼 수 있어 뿌듯했다.

차후 전처리를 완료하고 좋은 모델을 만들기 위해 적합한 알고리즘을 찾는 작업을 할 것이다.




=========================== 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 ===========================



+ Recent posts