전체 사고 데이터가 전체 데이터의 2%도 안 되어 더미 데이터를 만들기로 했다.
더미 데이터를 생성하는 방법은
1. 사용하는 논문에서 사고의 요인으로 지목된 해상 기상 요소를 선정한 데이터 셋을 만들고
2. C4.5 알고리즘(의사결정나무)에서 사고 원인을 가장 잘 보여준 상위 2개의 결정과정을 선택하여
3. 전체 데이터에 2.의 결정과정을 프로그래밍하여 더미 데이터를 만든다.
========================= Python =========================
import pandas as pd
df = pd.read_csv("D:/deep1/projectdata/weather_test.csv", encoding="utf-8")
### 더미 데이터 만들기
Cause = []
# 만약 여러가지가 다 해당 된다면 우선적으로 ImproperManagement > OperationFailure > Others > BadCondition 이 되게 했다.
for a in range(len(df["spot"])):
test = df.ix[a]
# 데이터를 먼저 추가하고 나중에 바뀔 내용이 있다면 아래 if문에서 데이터를 바꾼다.
Cause.append("None")
# WindFlow(m/s) GUSTWindFlow(m/s) Temp(Celsius) MaxWave(m) SigWave(m)
if (test["SigWave(m)"] <= 2.2 and test["MaxWave(m)"] > 6.7) \
or (test["SigWave(m)"] > 2.2 and test["MaxWave(m)"] <= 5.6 and test["WindFlow(m/s)"] > 11 and test["Temp(Celsius)"] > 20.2 and test["MaxWave(m)"] > 3.5):
Cause[a] = "BadCondition"
if (test["WindFlow(m/s)"] > 11 and test["GUSTWindFlow(m/s)"] > 14.7 and test["SigWave(m)"] > 2.4 and test["MaxWave(m)"] > 4.1 and test["SigWave(m)"] <= 3.2)\
or (test["WindFlow(m/s)"] > 11 and test["Temp(Celsius)"] <= 20.2 and test["GUSTWindFlow(m/s)"] > 14.7 and test["SigWave(m)"] > 2.4 and test["MaxWave(m)"] > 4.1 and test["Temp(Celsius)"] <= 11.8 and test["SigWave(m)"] <= 3.2):
Cause[a] = "Others"
if (test["MaxWave(m)"] > 0.5 and test["Temp(Celsius)"] <= 27.4 and test["MaxWave(m)"] <= 0.6 and test["GUSTWindFlow(m/s)"] <= 4.7 and test["WindFlow(m/s)"] <= 3.7 )\
or (test["Temp(Celsius)"] <= 27.4 and test["MaxWave(m)"] > 0.6 and test["WindFlow(m/s)"] < 3.3 and test["SigWave(m)"] > 0.2 and test["WindFlow(m/s)"] <= 5.2 and test["GUSTWindFlow(m/s)"] <= 4.8):
Cause[a] = "OperationFailure"
if (test["Temp(Celsius)"] <= 5.9 and test["MaxWave(m)"] > 0.8 and test["SigWave(m)"] <= 0.6 and test["WindFlow(m/s)"] > 1.8) \
or (test["WindFlow(m/s)"] <= 4.9 and test["MaxWave(m)"] <= 2.2 and test["Temp(Celsius)"] <= 5.9 and test["SigWave(m)"] > 0.8):
Cause[a] = "ImproperManagement"
# 데이터를 확인한다.
# print(len(df.index.tolist()))
# print(len(Cause))
# 데이터를 컬럼에 저장한다.
df["dummy"] = Cause
# 데이터를 저장한다.
df.to_csv("dummy_data.csv")
========================= Python =========================
프로그래밍을 하는데 우선순위를 ImproperManagement > OperationFailure > Others > BadCondition 을 선택한 이유는 사고 발생 갯수 비가 위의 순서를 따르기 때문이다.
더 정확하게 분류를 하려면 Naive Bayes 알고리즘도 적용시키면 될 것이다.
더미 데이터에 사고가 났는지(1) 안 났는지(0)에 대한 컬럼을 추가하여 보다 단순화 시켰다.
그리고 이동평균선과 (원본데이터 - 이동평균선)/(원본데이터)의 값도 연관이 있을 것이라고 판단하여 컬럼을 추가하였다.
========================= Python =========================
import pandas as pd
### 이동평균선을 만든다.
df = pd.read_csv("test.csv", encoding='utf-8')
# 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
#
# df.to_csv("test.csv")
# (원본데이터 - 이동평균선)/(원본데이터)
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("using_data.csv")
========================= Python =========================
아래는 로지스틱스 회귀분석의 코드이다.
ref.
https://m.blog.naver.com/PostView.nhn?blogId=jy93630&logNo=220442325857&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
========================= Python =========================
import pandas as pd
import statsmodels.api as sm
import numpy as np
# 사용할 데이터를 불러오기
# df = pd.read_csv("D:/deep1/projectdata/test.csv", encoding='utf-8') # 더미 데이터
df = pd.read_csv("final_utf-8.csv", encoding='utf-8') # 원본 데이터
# df = pd.read_csv("using_data.csv", encoding='utf-8') # 퍼센트
# df = pd.read_csv("using_data.csv", encoding='utf-8') # 이동평균선
df = df.dropna() # 원본 데이터
# 로지스틱스 회귀분석
# train_cols = df.columns[:-1] # 더미데이터
train_cols = df.columns[:-2] # 원본데이터
# train_cols = df.columns[-5:] # 퍼센트
# train_cols = df.columns[7:-4] # 이동평균선
# logit = sm.Logit(df["acci"], df[train_cols]) # 더미 데이터
logit = sm.Logit(df["test"], df[train_cols]) # 원본 데이터
# logit = sm.Logit(df["acci"], df[train_cols]) # 퍼센트
# 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())
먼저, 더미 데이터가 없는 상태에서 로지스틱스 회귀분석을 실행했을 경우, 6.7%의 정답률을 보였다.
========================= Result =========================
Optimization terminated successfully.
Current function value: 0.067211
Iterations 9
Logit Regression Results
==============================================================================
Dep. Variable: test No. Observations: 486618
Model: Logit Df Residuals: 486606
Method: MLE Df Model: 11
Date: Wed, 18 Jul 2018 Pseudo R-squ.: 0.008958
Time: 17:31:50 Log-Likelihood: -32706.
converged: True LL-Null: -33002.
LLR p-value: 1.045e-119
===============================================================================
coef std err z P>|z| [0.025 0.975]
-------------------------------------------------------------------------------
풍속(m/s) 0.0261 0.009 3.050 0.002 0.009 0.043
풍향(deg) 0.0003 0.000 2.581 0.010 7.18e-05 0.001
GUST풍속(m/s) 0.0070 0.005 1.312 0.190 -0.003 0.017
현지기압(hPa) -0.0045 0.000 -45.286 0.000 -0.005 -0.004
습도(%) -0.0028 0.001 -2.746 0.006 -0.005 -0.001
기온(°C) -0.0055 0.005 -1.103 0.270 -0.015 0.004
수온(°C) 0.0298 0.006 5.238 0.000 0.019 0.041
최대파고(m) 0.0334 0.058 0.577 0.564 -0.080 0.147
유의파고(m) -1.3827 0.117 -11.857 0.000 -1.611 -1.154
평균파고(m) 1.4636 0.116 12.573 0.000 1.235 1.692
파주기(sec) 0.0068 0.007 0.926 0.355 -0.008 0.021
파향(deg) 0.0008 0.000 5.929 0.000 0.001 0.001
===============================================================================
풍속(m/s) 1.026484
풍향(deg) 1.000299
GUST풍속(m/s) 1.007034
현지기압(hPa) 0.995464
습도(%) 0.997163
기온(°C) 0.994502
수온(°C) 1.030263
최대파고(m) 1.033918
유의파고(m) 0.250898
평균파고(m) 4.321299
파주기(sec) 1.006802
파향(deg) 1.000774
dtype: float64
풍속(m/s) 풍향(deg) GUST풍속(m/s) ... acci test predict
0 2.1 304.0 4.2 ... non accident 0 0.004050
1 4.5 293.0 6.9 ... non accident 0 0.004145
2 4.6 277.0 7.2 ... non accident 0 0.004722
3 3.2 285.0 6.0 ... non accident 0 0.003980
4 2.7 276.0 4.6 ... non accident 0 0.005255
[5 rows x 15 columns]
========================= Result =========================
더미 데이터에 적용하였을 때는 35%의 정답률이 나왔다.
========================= Result =========================
Optimization terminated successfully.
Current function value: 0.358967
Iterations 7
Logit Regression Results
==============================================================================
Dep. Variable: acci No. Observations: 516338
Model: Logit Df Residuals: 516333
Method: MLE Df Model: 4
Date: Wed, 18 Jul 2018 Pseudo R-squ.: 0.2647
Time: 17:39:57 Log-Likelihood: -1.8535e+05
converged: True LL-Null: -2.5206e+05
LLR p-value: 0.000
=====================================================================================
coef std err z P>|z| [0.025 0.975]
-------------------------------------------------------------------------------------
WindFlow(m/s) -0.4124 0.006 -66.795 0.000 -0.425 -0.400
GUSTWindFlow(m/s) -0.2100 0.005 -42.696 0.000 -0.220 -0.200
Temp(Celsius) 0.0082 0.000 24.346 0.000 0.008 0.009
MaxWave(m) 0.8595 0.018 48.681 0.000 0.825 0.894
SigWave(m) 0.1403 0.028 4.964 0.000 0.085 0.196
=====================================================================================
WindFlow(m/s) 0.662036
GUSTWindFlow(m/s) 0.810586
Temp(Celsius) 1.008224
MaxWave(m) 2.361918
SigWave(m) 1.150633
dtype: float64
WindFlow(m/s) GUSTWindFlow(m/s) ... acci predict
0 2.1 4.2 ... 1 0.857100
1 4.5 6.9 ... 0 0.537088
2 4.6 7.2 ... 0 0.465284
3 3.2 6.0 ... 0 0.646656
4 2.7 4.6 ... 1 0.616929
[5 rows x 7 columns]
========================= Result =========================
3시간 이동평균선으로 회귀분석을 하였을 경우 37%의 정답률을 보였다.
========================= Result =========================
Optimization terminated successfully.
Current function value: 0.377096
Iterations 7
Logit Regression Results
==============================================================================
Dep. Variable: acci No. Observations: 516336
Model: Logit Df Residuals: 516330
Method: MLE Df Model: 5
Date: Wed, 18 Jul 2018 Pseudo R-squ.: 0.2275
Time: 17:54:35 Log-Likelihood: -1.9471e+05
converged: True LL-Null: -2.5206e+05
LLR p-value: 0.000
=========================================================================================
coef std err z P>|z| [0.025 0.975]
-----------------------------------------------------------------------------------------
ma3_WindFlow(m/s) -0.4964 0.006 -77.737 0.000 -0.509 -0.484
ma3_GUSTWindFlow(m/s) -0.1082 0.005 -21.951 0.000 -0.118 -0.099
ma3_Temp(Celsius) 0.0053 0.000 15.723 0.000 0.005 0.006
ma3_MaxWave(m) 0.8879 0.023 37.983 0.000 0.842 0.934
ma3_SigWave(m) -0.0210 0.037 -0.564 0.573 -0.094 0.052
WindFlow% -7.249e-07 3.82e-07 -1.899 0.058 -1.47e-06 2.32e-08
=========================================================================================
ma3_WindFlow(m/s) 0.608737
ma3_GUSTWindFlow(m/s) 0.897472
ma3_Temp(Celsius) 1.005289
ma3_MaxWave(m) 2.430081
ma3_SigWave(m) 0.979264
WindFlow% 0.999999
dtype: float64
Unnamed: 0 WindFlow(m/s) ... SigWave% predict
0 0 4.6 ... -0.031746 0.655159
1 1 3.2 ... -0.015873 0.568988
2 2 2.7 ... -0.070175 0.590366
3 3 2.2 ... -0.117646 0.637301
4 4 1.7 ... -0.083333 0.670363
[5 rows x 18 columns]
========================= Result =========================
(원본데이터 - 이동평균선)/(원본데이터)의 경우 68%의 정답률을 보였다.
========================= Result =========================
Optimization terminated successfully.
Current function value: 0.687029
Iterations 15
Logit Regression Results
==============================================================================
Dep. Variable: acci No. Observations: 516336
Model: Logit Df Residuals: 516331
Method: MLE Df Model: 4
Date: Wed, 18 Jul 2018 Pseudo R-squ.: -0.4074
Time: 18:06:03 Log-Likelihood: -3.5474e+05
converged: True LL-Null: -2.5206e+05
LLR p-value: 1.000
=================================================================================
coef std err z P>|z| [0.025 0.975]
---------------------------------------------------------------------------------
WindFlow% -1.25e-06 4.31e-07 -2.896 0.004 -2.1e-06 -4.04e-07
GUSTWindFlow% 9.636e-07 4.11e-07 2.342 0.019 1.57e-07 1.77e-06
Temp% 4.821e-06 1.77e-06 2.723 0.006 1.35e-06 8.29e-06
MaxWave% 0.8497 0.019 45.100 0.000 0.813 0.887
SigWave% 0.0006 2.13e-05 26.447 0.000 0.001 0.001
=================================================================================
WindFlow% 0.999999
GUSTWindFlow% 1.000001
Temp% 1.000005
MaxWave% 2.339004
SigWave% 1.000564
dtype: float64
Unnamed: 0 WindFlow(m/s) ... SigWave% predict
0 0 4.6 ... -0.031746 0.489584
1 1 3.2 ... -0.015873 0.491416
2 2 2.7 ... -0.070175 0.459229
3 3 2.2 ... -0.117646 0.467574
4 4 1.7 ... -0.083333 0.505435
[5 rows x 18 columns]
========================= Result =========================
이제 추가적으로 최적화를 하고 가장 최적화가 잘 된 로지스틱스 회귀분석 결과를 원래 사고가 난 데이터에 적용을 시켜볼 것이다.