전체 사고 데이터가 전체 데이터의 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())

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



먼저, 더미 데이터가 없는 상태에서 로지스틱스 회귀분석을 실행했을 경우, 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 =========================


이제 추가적으로 최적화를 하고 가장 최적화가 잘 된 로지스틱스 회귀분석 결과를 원래 사고가 난 데이터에 적용을 시켜볼 것이다.




+ Recent posts