오늘 바다를 아래와 같이 서해중부, 서해남부, 남해서부, 남해동부, 동해남부, 동해중부로 나눈다는 것을 알고 어제 했던 데이터를 기준에 맞춰서 나눴다.
아래는 우리 팀원(안*모씨)이 바다를 나눈 방법이다. 군대에서 레이더 근무를 한 뛰어난 팀원의 도움을 받아 쉽게 해결할 수 있었다.
======================== 구분 ========================
# 동해 서해 남해 구분.
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%만 사용하더라도 확률이 다소 오르거나 혹은 거의 변동이 없다. 이는 논문과 다른 결과라서 어떻게 해석을 해야 할지 난감하다.
내일은 다시 신경망 모델에 넣어보는 것과 더미 데이터에서 얻은 자료가 실제 사고에 얼마나 잘 적용되는지 비교를 해봐야겠다.