본문 바로가기
데이터 분석/컴퓨터응용확률

Data transform

by 세희홍 2022. 6. 22.

1. Define a model to fit the oil production data. You should choose a model and select model parameters, manually or automatically. Visualize your model together with the scattered points in a plot chart.

 

2차 함수를 만들기 위해 계수들을 조정하여서 가장 근접한 이차함수인 4.225*x**2 – 16123*x + 15382000 함수를 정의하였다.

하지만 이렇게 근사한 2차 함수는 x축이 1900보다 클 때는 오차가 어느정도 존재하지 어느정도 유사하다고 말할 수 있지만 x축이 1900보다 작을 때는 x가 작을 때는 0으로 수렴하는 것이 아니라 오히려 값이 커지고 있기 때문에 오차가 크다고 할 수 있다. 2차 함수는 Oil Production 데이터에 적합하지 않다고 판단하여 다른 그래프를 만들어 보았다.

 

 

 

 

 

지수함수로 그래프를 그려본 결과 exp(-115)*exp(0.063*x)가 가장 유사하게 나왔다.

2차 함수, 지수함수, Oil Production을 모두 그래프화 하면 다음과 같이 나온다. 1920년대 이전에는 지수함수와 유사하게 나오지만 x축이 증가할수록 지수함수와 2차 함수 사이 값에 가깝게 나오는 것으로 보인다.

 

 

 

 

 

 

2. In order to understand the data better, write a code to transform the data as the way you need (possibly exponential transform with your estimated parameter) using a programming language (C/C++, JAVA, Matlab, etc.) at your convenience.

 

import numpy as np
import math

x_data = np.array([1880, 1890, 1900, 1905, 1910, 1915, 1920, 1925, 1930, 1935, 1940,
                   1945, 1950, 1955, 1960, 1962, 1964, 1966, 1968, 1970, 1972, 1974,
                   1976, 1978, 1980, 1982, 1984])
y_data = np.array([30, 77, 149, 215, 328, 432, 689, 1069, 1412, 1655, 2150, 2595,
                   3803, 5626, 7674, 8882, 10310, 12016, 14104, 16690, 18584, 20389,
                   20188, 21922, 21732, 19403, 19608])
n = len(x_data)

Array 두 개를 만들어서 x_data x축의 정보인 Year, y_datay축의 정보인 mbbl를 넣었다.

 

 

def myrange(start, end, step):
    r = start
    while (r < end):
        yield r
        r += step

log_y_data = np.log(y_data)

- 작은 간격으로 미지수의 값을 조정하기 위해 myrange라는 함수를 만들어주었다.

- y = e^(a + b * x), log(y) = a + b * x이므로 값을 편하게 변환하기 위해 y_data를 로그화하였다.

 

 

smallest = 100
for i in myrange(-200, -100, 0.1):
    for j in myrange(0, 1, 0.001):
        error_sum = 0
        for k in range(n):#y = exp(-115) * exp(0.063*x)
            y = i + (j * x_data[k])
            error = (log_y_data[k] - y)**2
            error_sum += error

        if error_sum < smallest:
            smallest = error_sum
            min_i = i
            min_j = j
print(smallest, min_i, min_j)

 

-  y = e^(a + b * x)에서 ai로 놓고 값의 범위를 -200에서 -100까지, 0.1씩 증가, bj로 놓고 0에서 1까지 0.001씩 증가하도록 for문을 사용하였다. 또한 내부에 k for문을 만들어 총 3for문인데 k x_data의 값을 하나씩 가져오는 역할을 한다.

 

-  y = e^(i + j * x), log(y) = i + j * x 이므로, i + j * x_data[k]를 임의로 y로 지정하였다. 실제의 데이터인 log_y_data에서 i j의 값을 순서대로 대입해서 계산한 값인 log(y) = i + j * x를 빼고 제곱을 해서 부호를 제거하였다. 이를 error이라고 하였다. 그리고 kx_data의 값을 모두 구하고 모두 더한 후 이를 error_sum이라 한다. 예를 들어 x_data[1]error_sumx_dataindex1인 경우의 모든 error 제곱의 합이다. 이를 for문 내에서의 i, j에서 모두 시행하여 x_data[k]에 대해 error 값이 가장 작은 i j를 찾는다.

 

 

결과값으로 1.0550667078185738 -114.60000000000485 0.06300000000000004 이 나왔는데 i = -114.60000000000485, j = 0.06300000000000004로 추정할 수 있고 오차율을 고려하여 값을 대입해보면 y = e^(-114.6 + 0.063 * x)이다.

 

 

 

3.  Draw a scatterplot graph of the transformed data using GNU plot

댓글