오늘 바다를 아래와 같이 서해중부, 서해남부, 남해서부, 남해동부, 동해남부, 동해중부로 나눈다는 것을 알고 어제 했던 데이터를 기준에 맞춰서 나눴다. 



아래는 우리 팀원(안*모씨)이 바다를 나눈 방법이다. 군대에서 레이더 근무를 한 뛰어난 팀원의 도움을 받아 쉽게 해결할 수 있었다.


======================== 구분 ========================

# 동해 서해 남해 구분.

f1(x) -> (x1, y1) : 동해/남해 구분함수 <- 부산 팔각정 좌표 (129.032664, 35.101221)


f1(x) = y1 = (cos135)x1 + b1 = -1*x1 + b1


b1 = 164.133885


f2(x) -> (x2, y2) : 서해/남해 구분함수 <- 전남 해남 땅끝탑 (126.524866, 34.2947005)


f2(x) = y2 = (cos 225)x2 + b2 = 1 * x2 + b2


b2 = -92.2301655


함수 분기점 : (128.18202525, 35.95185975)


f1(x) = y = -x +164.133885

f2(x) = y = x - 92.2301655

2y = 71.9037195 y = 35.95185975 -> x = 128.18202525



# 데이터 갯수

서해 영역 : y < x - 92.2301655 (범위 x < 128.18202525) -> x-y < 92.2301665

   2662개

동해 영역 : y < -x + 164.133885 (범위 x > 128.18202525) -> x+y > 164.133885

   1492개

남해 영역 : y < x - 92.2301655, y < -x + 164.133885

   2575개 



# 3해역을 각각 두 개로 나누는 기준

서해중부 / 서해남부 y = 35.98587


남해서부 / 남해동부 x = 127.794149


동해중부 / 동해남부 y = 37.144592



# 데이터 갯수

서해중부 (2017) / 서해남부 (645)남해서부 (1348) / 남해동부 (1227)

동해중부 (594)/ 동해남부 (898) y = 37.144592

======================== 구분 ========================


위에 구분하는 방법을 기준으로 데이터를 나눠 어제 사용했던 더미 데이터를 나눴다.

부이를 기준으로 해상 데이터가 나오고 해상 기상 상황을 기준으로 더미 사고 데이터를 만들었기 때문에 중간에 겹치는 해역이 존재한다.



======================== Python ======================== 

import pandas as pd



# 나눈 6개의 해역별로 로지스틱스 회귀분석 전처리 과정

df = pd.read_csv("D:/deep1/projectdata/dummy_data_test.csv", encoding="utf-8")


df = df.dropna()


# East-Central 동해, 울릉도, 울진

east_c1 = df.loc[df["spot"] == "동해"]

east_c2 = df.loc[df["spot"] == "울릉도"]

east_c3 = df.loc[df["spot"] == "울진"]


df1 = pd.concat([east_c1, east_c2, east_c3], ignore_index=True)

df1.to_csv("East-Central.csv")

print(df1)


# East-South 거제도, 동해, 울릉도, 울산, 울진, 포항

east_s1 = df.loc[df["spot"] == "거제도"]

east_s2 = df.loc[df["spot"] == "동해"]

east_s3 = df.loc[df["spot"] == "울릉도"]

east_s4 = df.loc[df["spot"] == "울산"]

east_s5 = df.loc[df["spot"] == "울진"]

east_s6 = df.loc[df["spot"] == "포항"]


df2 = pd.concat([east_s1, east_s2, east_s3, east_s4, east_s5, east_s6], ignore_index=True)

df2.to_csv("East-South.csv")

print(df2)


# South-East 거제도 서귀포 여수 거문도 통영

south_e1 = df.loc[df["spot"] == "거제도"]

south_e2 = df.loc[df["spot"] == "서귀포"]

south_e3 = df.loc[df["spot"] == "여수 거문도"]

south_e4 = df.loc[df["spot"] == "통영"]


df3 = pd.concat([south_e1, south_e2, south_e3, south_e4], ignore_index=True)

df3.to_csv("South-East.csv")

print(df3)


# South-West  보령 외연도, 서귀포, 서귀포 마라도, 신안, 여수 거문도, 제주 추자도, 통영

south_w1 = df.loc[df["spot"] == "보령 외연도"]

south_w2 = df.loc[df["spot"] == "서귀포"]

south_w3 = df.loc[df["spot"] == "서귀포 마라도"]

south_w4 = df.loc[df["spot"] == "신안"]

south_w5 = df.loc[df["spot"] == "여수 거문도"]

south_w6 = df.loc[df["spot"] == "제주 추자도"]

south_w7 = df.loc[df["spot"] == "통영"]


df4 = pd.concat([south_w1, south_w2, south_w3, south_w4, south_w5, south_w6, south_w7], ignore_index=True)

df4.to_csv("South-West.csv")

print(df4)


# West-Central  보령 외연도, 부안, 인천, 인천 덕적도

west_c1 = df.loc[df["spot"] == "보령 외연도"]

west_c2 = df.loc[df["spot"] == "부안"]

west_c3 = df.loc[df["spot"] == "인천"]

west_c4 = df.loc[df["spot"] == "인천 덕적도"]


df5 = pd.concat([west_c1, west_c2, west_c3, west_c4], ignore_index=True)

df5.to_csv("West-Central.csv")

print(df5)


# West-South 보령 외연도, 부안, 서귀포 마라도, 신안, 제주 추자도

west_s1 = df.loc[df["spot"] == "보령 외연도"]

west_s2 = df.loc[df["spot"] == "부안"]

west_s3 = df.loc[df["spot"] == "서귀포 마라도"]

west_s4 = df.loc[df["spot"] == "신안"]

west_s5 = df.loc[df["spot"] == "제주 추자도"]


df6 = pd.concat([west_s1, west_s2, west_s3, west_s4, west_s5])

df6.to_csv("West-South.csv")

print(df6)


======================== Python ======================== 


이후 어제와 같이 이동평균선과, (원래데이터-이동평균선)/(원래데이터)를 추가해줬다.



======================== Python ======================== 

import pandas as pd


### 이동평균선을 만든다.

df1 = pd.read_csv("D:/deep1/projectdata/six/West-South.csv", encoding="utf-8")

df2 = pd.read_csv("D:/deep1/projectdata/six/West-Central.csv", encoding="utf-8")

df3 = pd.read_csv("D:/deep1/projectdata/six/South-West.csv", encoding="utf-8")

df4 = pd.read_csv("D:/deep1/projectdata/six/South-East.csv", encoding="utf-8")

df5 = pd.read_csv("D:/deep1/projectdata/six/East-South.csv", encoding="utf-8")

df6 = pd.read_csv("D:/deep1/projectdata/six/East-Central.csv", encoding="utf-8")


df = df6


a = df["WindFlow(m/s)"].rolling(window=3).mean()

df["ma3_WindFlow(m/s)"] = a


a = df["GUSTWindFlow(m/s)"].rolling(window=3).mean()

df["ma3_GUSTWindFlow(m/s)"] = a


a = df["Temp(Celsius)"].rolling(window=3).mean()

df["ma3_Temp(Celsius)"] = a


a = df["MaxWave(m)"].rolling(window=3).mean()

df["ma3_MaxWave(m)"] = a


a = df["SigWave(m)"].rolling(window=3).mean()

df["ma3_SigWave(m)"] = a



# (원본데이터 - 이동평균선)/(원본데이터)

a = []

b = []

c = []

d = []

e = []

for k in range(len(df.acci)):

    z=(df["WindFlow(m/s)"][k]-df["ma3_WindFlow(m/s)"][k])/(df["WindFlow(m/s)"][k]+0.00001)

    x=(df["GUSTWindFlow(m/s)"][k]-df["ma3_GUSTWindFlow(m/s)"][k])/(df["GUSTWindFlow(m/s)"][k]+0.00001)

    q=(df["Temp(Celsius)"][k] - df["ma3_Temp(Celsius)"][k]) / (df["Temp(Celsius)"][k]+0.00001)

    v=(df["MaxWave(m)"][k] - df["ma3_MaxWave(m)"][k]) / (df["MaxWave(m)"][k]+0.00001)

    n=(df["SigWave(m)"][k] - df["ma3_SigWave(m)"][k]) / (df["SigWave(m)"][k]+0.00001)

    a.append(z)

    b.append(x)

    c.append(q)

    d.append(v)

    e.append(n)

df["WindFlow%"] = a

df["GUSTWindFlow%"] = b

df["Temp%"] = c

df["MaxWave%"] = d

df["SigWave%"] = e


df.to_csv("D:/deep1/projectdata/six/East-Central.csv", encoding='utf-8')


======================== Python ======================== 


코딩을 os, dir 라이브러리를 이용했으면 더 쉽게 했겠지만 일단 다 수작업으로 해결했다.

이렇게해서 만든 자료를 이용하여 각각을 로지스틱스 회귀분석을 하였다.


======================== Python ======================== 

import pandas as pd

import statsmodels.api as sm

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

import matplotlib.font_manager as fm


# 나눈 6개의 해역별로 로지스틱스 회귀분석

df1 = pd.read_csv("D:/deep1/projectdata/six/West-South.csv", encoding="utf-8")

df2 = pd.read_csv("D:/deep1/projectdata/six/West-Central.csv", encoding="utf-8")

df3 = pd.read_csv("D:/deep1/projectdata/six/South-West.csv", encoding="utf-8")

df4 = pd.read_csv("D:/deep1/projectdata/six/South-East.csv", encoding="utf-8")

df5 = pd.read_csv("D:/deep1/projectdata/six/East-South.csv", encoding="utf-8")

df6 = pd.read_csv("D:/deep1/projectdata/six/East-Central.csv", encoding="utf-8")


dataframe = [df1, df2, df3, df4, df5, df6]


for df in dataframe:

    df = df.dropna()

    # 로지스틱스 회귀분석

    train_cols = df.columns[-5:]  # 더미데이터

    logit = sm.Logit(df["acci"], df[train_cols])  # 더미 데이터


    # fit the model

    result = logit.fit()


    # 분석결과 출력

    print(result.summary())


    # 오즈비 출력

    print(np.exp(result.params))


    # predict 컬럼을 만들어서 예측한 값을 출력

    # df["predict"] = result.predict(df[train_cols])

    # print(df.head())

    print("\n\n\n")


======================== Python ======================== 


각각의 분석 결과를 살펴보자.


서해 중부의 경우 정답률이 69%가 나왔다.

서해 중부는 바람과 온도에 관한 요소보다 파고에 의한 영향이 훨씬 크다는 것을 알 수 있다.



======================== Result ======================== 

Optimization terminated successfully.

         Current function value: 0.690398

         Iterations 6

                           Logit Regression Results                           

==============================================================================

Dep. Variable:                   acci   No. Observations:               110385

Model:                          Logit   Df Residuals:                   110380

Method:                           MLE   Df Model:                            4

Date:                Thu, 19 Jul 2018   Pseudo R-squ.:                 -0.3282

Time:                        18:19:36   Log-Likelihood:                -76210.

converged:                       True   LL-Null:                       -57379.

                                        LLR p-value:                     1.000

=================================================================================

                    coef    std err          z      P>|z|      [0.025      0.975]

---------------------------------------------------------------------------------

WindFlow%      5.273e-06   7.78e-07      6.780      0.000    3.75e-06     6.8e-06

GUSTWindFlow%  2.114e-06   8.37e-07      2.526      0.012    4.73e-07    3.75e-06

Temp%          2.433e-06   3.71e-06      0.655      0.512   -4.84e-06    9.71e-06

MaxWave%          0.9388      0.046     20.472      0.000       0.849       1.029

SigWave%          0.0002   3.87e-05      4.256      0.000    8.89e-05       0.000

=================================================================================

WindFlow%        1.000005

GUSTWindFlow%    1.000002

Temp%            1.000002

MaxWave%         2.557038

SigWave%         1.000165


======================== Result ======================== 



서해 남부는 정답률이 67%가 나왔다.
서해 중부와 마찬가지로 파고에 의한 영향이 큰 것으로 나타났다.



======================== Result ======================== 

Optimization terminated successfully.

         Current function value: 0.672893

         Iterations 15

                           Logit Regression Results                           

==============================================================================

Dep. Variable:                   acci   No. Observations:               151506

Model:                          Logit   Df Residuals:                   151501

Method:                           MLE   Df Model:                            4

Date:                Thu, 19 Jul 2018   Pseudo R-squ.:                 -0.5290

Time:                        18:19:35   Log-Likelihood:            -1.0195e+05

converged:                       True   LL-Null:                       -66674.

                                        LLR p-value:                     1.000

=================================================================================

                    coef    std err          z      P>|z|      [0.025      0.975]

---------------------------------------------------------------------------------

WindFlow%      1.556e-06   8.77e-07      1.774      0.076   -1.63e-07    3.27e-06

GUSTWindFlow%  7.658e-07   7.62e-07      1.005      0.315   -7.27e-07    2.26e-06

Temp%         -4.428e-06   5.11e-06     -0.867      0.386   -1.44e-05    5.59e-06

MaxWave%          0.9713      0.026     37.019      0.000       0.920       1.023

SigWave%          0.0009   4.14e-05     21.915      0.000       0.001       0.001

=================================================================================

WindFlow%        1.000002

GUSTWindFlow%    1.000001

Temp%            0.999996

MaxWave%         2.641444

SigWave%         1.000907

======================== Result ======================== 



남해 서부의 경우 정답률이 67%로 나왔다.
남해 서부도 파고에 의한 영향이 크다는 것을 알 수 있다.



======================== Result ======================== 

Optimization terminated successfully.

         Current function value: 0.678255

         Iterations 15

                           Logit Regression Results                           

==============================================================================

Dep. Variable:                   acci   No. Observations:               208087

Model:                          Logit   Df Residuals:                   208082

Method:                           MLE   Df Model:                            4

Date:                Thu, 19 Jul 2018   Pseudo R-squ.:                 -0.4836

Time:                        18:19:38   Log-Likelihood:            -1.4114e+05

converged:                       True   LL-Null:                       -95129.

                                        LLR p-value:                     1.000

=================================================================================

                    coef    std err          z      P>|z|      [0.025      0.975]

---------------------------------------------------------------------------------

WindFlow%     -3.235e-06   8.06e-07     -4.012      0.000   -4.82e-06   -1.65e-06

GUSTWindFlow% -2.146e-07   9.29e-07     -0.231      0.817   -2.03e-06    1.61e-06

Temp%          4.277e-06   3.06e-06      1.399      0.162   -1.71e-06    1.03e-05

MaxWave%          0.9396      0.025     38.036      0.000       0.891       0.988

SigWave%          0.0009   4.14e-05     21.992      0.000       0.001       0.001

=================================================================================

WindFlow%        0.999997

GUSTWindFlow%    1.000000

Temp%            1.000004

MaxWave%         2.559080

SigWave%         1.000910

======================== Result ======================== 



남해 동부의 경우 정답률이 69%로 나왔다.
위의 3곳에 비해 파고의 영향이 다소 적어진 것을 확인할 수 있었다.



======================== Result ======================== 

Optimization terminated successfully.

         Current function value: 0.691483

         Iterations 12

                           Logit Regression Results                           

==============================================================================

Dep. Variable:                   acci   No. Observations:               114895

Model:                          Logit   Df Residuals:                   114890

Method:                           MLE   Df Model:                            4

Date:                Thu, 19 Jul 2018   Pseudo R-squ.:                 -0.4278

Time:                        18:19:38   Log-Likelihood:                -79448.

converged:                       True   LL-Null:                       -55645.

                                        LLR p-value:                     1.000

=================================================================================

                    coef    std err          z      P>|z|      [0.025      0.975]

---------------------------------------------------------------------------------

WindFlow%     -1.301e-05   1.42e-06     -9.181      0.000   -1.58e-05   -1.02e-05

GUSTWindFlow%  5.273e-07   1.39e-06      0.379      0.705    -2.2e-06    3.26e-06

Temp%          1.583e-05   6.93e-06      2.284      0.022    2.25e-06    2.94e-05

MaxWave%          0.7220      0.055     13.240      0.000       0.615       0.829

SigWave%          0.0007      0.001      0.662      0.508      -0.001       0.003

=================================================================================

WindFlow%        0.999987

GUSTWindFlow%    1.000001

Temp%            1.000016

MaxWave%         2.058610

SigWave%         1.000683

======================== Result ======================== 



동해 남부의 경우 정답률이 69%가 나왔다.
동해는 남해, 서해와는 다르게 파고의 영향이 확연하게 줄어든 것을 확인할 수 있었다.



======================== Result ======================== 

Optimization terminated successfully.

         Current function value: 0.692411

         Iterations 13

                           Logit Regression Results                           

==============================================================================

Dep. Variable:                   acci   No. Observations:               200959

Model:                          Logit   Df Residuals:                   200954

Method:                           MLE   Df Model:                            4

Date:                Thu, 19 Jul 2018   Pseudo R-squ.:                 -0.4333

Time:                        18:19:41   Log-Likelihood:            -1.3915e+05

converged:                       True   LL-Null:                       -97078.

                                        LLR p-value:                     1.000

=================================================================================

                    coef    std err          z      P>|z|      [0.025      0.975]

---------------------------------------------------------------------------------

WindFlow%     -9.912e-06   1.21e-06     -8.186      0.000   -1.23e-05   -7.54e-06

GUSTWindFlow%  1.218e-06   1.25e-06      0.973      0.331   -1.24e-06    3.67e-06

Temp%          1.068e-05   3.89e-06      2.745      0.006    3.05e-06    1.83e-05

MaxWave%          0.4758      0.041     11.705      0.000       0.396       0.555

SigWave%          0.0014      0.001      1.057      0.291      -0.001       0.004

=================================================================================

WindFlow%        0.999990

GUSTWindFlow%    1.000001

Temp%            1.000011

MaxWave%         1.609249

SigWave%         1.001386


======================== Result ======================== 



동해 중부의 경우 정답률이 69%가 나왔다.
동해 중부는 파고의 영향이 가장 작은 곳이었다.



======================== Result ======================== 

Optimization terminated successfully.

         Current function value: 0.692753

         Iterations 14

                           Logit Regression Results                           

==============================================================================

Dep. Variable:                   acci   No. Observations:                97330

Model:                          Logit   Df Residuals:                    97325

Method:                           MLE   Df Model:                            4

Date:                Thu, 19 Jul 2018   Pseudo R-squ.:                 -0.3804

Time:                        18:19:41   Log-Likelihood:                -67426.

converged:                       True   LL-Null:                       -48844.

                                        LLR p-value:                     1.000

=================================================================================

                    coef    std err          z      P>|z|      [0.025      0.975]

---------------------------------------------------------------------------------

WindFlow%     -1.095e-05    2.2e-06     -4.979      0.000   -1.53e-05   -6.64e-06

GUSTWindFlow%  1.971e-06   2.09e-06      0.943      0.346   -2.13e-06    6.07e-06

Temp%           1.01e-05   4.83e-06      2.091      0.036    6.35e-07    1.96e-05

MaxWave%          0.2322      0.058      4.023      0.000       0.119       0.345

SigWave%          0.0011      0.002      0.634      0.526      -0.002       0.004

=================================================================================

WindFlow%        0.999989

GUSTWindFlow%    1.000002

Temp%            1.000010

MaxWave%         1.261414

SigWave%         1.001073

======================== Result ======================== 



사실 P>|z|(p-value) 값을 보면 MaxWave%를 제외한 나머지 값은 사용되어서는 안 되는 값으로 보인다. 실제로 MaxWave%만 사용하더라도 확률이 다소 오르거나 혹은 거의 변동이 없다. 이는 논문과 다른 결과라서 어떻게 해석을 해야 할지 난감하다.

내일은 다시 신경망 모델에 넣어보는 것과 더미 데이터에서 얻은 자료가 실제 사고에 얼마나 잘 적용되는지 비교를 해봐야겠다.







+ Recent posts