기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

경기종합지수

내용

경기종합지수

경기:살림살이의 상태, 즉 경제상황을 의미
  • 전반적인 경기 동향을 쉽게 파악, 예측하고자 주요 경제지표 움직임을 종합해서 지수로 나타낸 것임.
  • CI(Composite index)라고 함
  • 생산·투자·소비·고용·금융·무역 등 결제의 각 부문 지표 중 민감하게 경기에 반영하는 주요 경제지표를 선정하고 이후 이 지표들의 전월 대비 증감률을 가중평균하여 작성함
  • 전월대비 상승은 경기상승, 감소의 경우는 경기하락
  • 지수 값은 기준시점 2005년의 숫자를 100으로 지정하여 환산
  • 1983년 3월 부터 통계청에서 매달 발표
  • 경기선행지수, 경기동행지수, 경기후행지수로 구분
  • 일반적으로 경기선행지수가 상승하면 3~10개월 정도 후에 경기동행지수가 상승하고 실제 경기도 상승

경기선행지수

  • 일반적으로 3~4 달간의 선행지수가 꾸준히 상승한 경우 몇달 후에 경기 상승 예측 가능
  • 구성요소: 재고순환지표(%p), 경제심리지수, 기계류내수출하자수(선박제외), 건설수주액, 수출입물가비율, 코스피, 장단기 금리파
  • 재고순환지표: 기업은 경기의 좋고 나쁨에 효율적으로 대응하고자 재고를 비축하거나 처분하는 과정에서 생산을 조정하기 떄문에 재고수준의 변동은 단기적인 경기 순환을 나타내는 중요한 기표로 인식됩니다. 출하(판매)증가율에서 재고증가율을 뺀 것으로 경기호황일 때는 출하증가율 > 재고증가율, 반대인 경우는 경기불황
  • 경제심리지수: 기업과 소비자 모두를 포함한 민간의 결제상황에 대한 심리를 종합적으로 파악하고 결기판단을 위한 유용한 경제정보로 활용하는 것을 목적으로 합니다. 기업경기실사지수(BSI)와 소비자동향지수(CSI)를 합성하여 작성. 장기평균 100을 중심으로 표준편차가 10이 되도록 작성, 100이상이면 경제심리가 과거보다 좋은 쪽, 반대이면 나쁜 쪽으로 해석
  • 건설수주액: 발주자와 체결한 공사계약, 국내 건설경기 동향을 파악할 수 있는 자료
  • 수출입물가비율: 개별품목의 수출입액이 모집단 거래액의 1/2000 이상의 거래비중을 가지는 품목으로서 동종산업내 상품군의 가격변동을 대표하면서 가급적 품질 규격등이 균일하게 유지되고 가격 시계열 유지가 가능한 품목을 선정
  • 코스피: 주가는 가능성에 투자하는 것으로서 경기상승으로 기업의 실적이 좋아직 가능성이 높아지면 해당 주식에도 매수게 몰릴것이고 주가는 상승합니다. 따라서 일반적으로 종합주가지수(KOSPI)는 경기선행지표라는 말을 많이 합니다. 물론 주가가 반드시 경기에 선행한다고 단정하기에는 여러가지 변수들이 존재합니다.
  • 장단기 금리차: 자금시장은 장기자금시장(국공채, 회사채 등의 채권 거래)과 단기자금시장(양도성예금증서, 콜, 환매조거부채권 등)으로 구분, 일반적으로 장기로 빌려서 단기로 대출하는 성향이 존재합니다. 그러므로 장기금리시장은 수요가, 단기금리시장은 공급이 몰리므로 일반적으로 장기금리가 단기금리보다 높게 형성됩니다. 이를 Market segmentation Theory라고 합니다. 그러나 경기하강이 예상된다면 기업은 장기로 돈을 빌려 투자하는 것이 제한될 것이므로 장기금리시장의 수요가 약화될것이므로 장·단기 금리 차이가 감소될 것입니다. 역으로 장·단기 금리 차이가 감소된다면 경기 불황이 예상할 수 있습니다.
import numpy as np
import pandas as pd
from sklearn import preprocessing 
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'nanumgothic'
rcParams['font.weight'] = 'bold'
rcParams['font.size'] = '11' 

국가통계포털(KOSIS)로부터 다운받은 자료를 다음과 같이 호출합니다.

x=pd.read_excel("경기종합지수.xlsx", sheet_name="데이터" )
idx=x.iloc[[0,8,16],:]
idx
지수별 2019.01 2019.02 2019.03 2022.01 p) 2022.02 p)
선행종합지수(2015=100) 112.8 113.0 113.4 128.0 128.0
동행종합지수(2015=100) 111.3 110.9 111.1 120.4 120.8
후행종합지수(2015=100) 112.4 112.7 112.9 124.3 124.9
plt.figure(dpi=100)
plt.plot(idx.columns[1:], idx.iloc[0,1:],'o-',label="경기선행지수")
plt.plot(idx.columns[1:], idx.iloc[1,1:],'o-',label="경기동행지수")
plt.plot(idx.columns[1:], idx.iloc[2,1:],'o-',label="경기후행지수")
plt.legend(bbox_to_anchor=(1,1))
plt.xticks(size='7', rotation = 90)
plt.show()

다음 자료 lead는 원시데이터에서 선행지수와 그 성분들을 분리한 것입니다.

lead=x.iloc[0:8, 1:].T
lead.columns=[str(i).split()[0] for i in x.iloc[0:8, 0]]
lead.head(2)
선행종합지수(2015=100) 재고순환지표(%p) 경제심리지수 기계류내수출하지수(선박제외)(2015=100) 건설수주액(실질)(십억원) 수출입물가비율(2015=100) 코스피(1980.1.4=100) 장단기금리차(%p)
2019.01 112.8 -6.6 93.5 97.3 12022.6 94.9 2085.1 0.26
2019.02 113.0 -5.7 94.5 95.3 11769.2 94.3 2127.4 0.12

경기선행지수의 각 성분들을 비교하기 위해 데이터를 표준화하여 그래프를 작성하였습니다. 표준화는 sklearn.preprocessing.MinMaxScaler() 클래스를 사용하였습니다.

scalerlead=preprocessing.MinMaxScaler().fit(lead)
leadN=scalerlead.transform(lead)
leadN[:3]
array([[0.        , 0.10629921, 0.68509615, 0.31538462, 0.37036842,
        0.79545455, 0.1596454 , 0.33552632],
       [0.01315789, 0.14173228, 0.70913462, 0.16153846, 0.33695509,
        0.72727273, 0.19063668, 0.24342105],
       [0.03947368, 0.23228346, 0.72596154, 0.21538462, 0.52805981,
        0.56818182, 0.2130559 , 0.23684211]])
splt.figure(figsize=(14, 10))
plt.subplot(2,2,1)
for i in [0, 1, 2]:
    plt.plot(x.columns[1:], leadN[:,i],label=lead.columns[i])
plt.legend(loc="best")
plt.xticks('')
plt.subplot(2,2,2)
for i in [0, 3,4]:
    plt.plot(x.columns[1:], leadN[:,i],label=lead.columns[i])
plt.legend(loc="best")
plt.xticks('')
plt.subplot(2,2,3)
for i in [0, 5,6]:
    plt.plot(x.columns[1:], leadN[:,i],label=lead.columns[i])
plt.legend(loc="best")
plt.xticks(size='7', rotation = 90)
plt.subplot(2,2,4)
for i in [0, 7,]:
    plt.plot(x.columns[1:], leadN[:,i],label=lead.columns[i])
plt.legend(loc="best")
plt.xticks(size='7', rotation = 90)
plt.show()

동행종합지수

현재의 경기상화을 파악하는 데 도움되는 지표로서 기준년 2015의 값을 100으로 하여 산출

  • 광공업생산지수(2015=100):기준년 2015의 값을 100으로 하여 현재의 생산수준이 어느정도인가를 나타내는 지수로사 일반저긍로 경기가 좋을 때는 공장이 계속 돌아가고 제품의 생산량은 증가하게 됩니다. 광업, 제조업, 저기·가스업을 대상으로 매월 작성. 통계청은 주요 485개 품목을 생산하는 약 7300개의 표본사업체를 대상으로 매월 실시하는 생산실적 등을 조사
  • 서비스업생산지수(도소매업제외)(2015=100)
  • 건설기성액(실질)(십억원): 건설업은 제품 생산과 인도 시점의 차이가 있으므로 수주후 실제 돈의 흐름에 차이가 발생합니다. 건축주의 경우 건설 발주 후 각 단계마다 돈을 지불하게 되는데 이러한 지급을 건설기성액이라고 합니다. 경기선행지수로 건설수주액으로 고려하고 동행지수로 건설기성액을 사용합니다. 건설수주액의 증가에 건설기성액이 증가의 수준이 낮다면 경기의 어려우므로 건설이 진행되지 암ㅎ음을 나타냅니다.
  • 소매판매액지수(2015=100): 통계청은 백화점, 대형마트, 면세점, 슈퍼마켓, 전문소매점, 편의점 등 약 2800개의 소매판매 표본사업체의 매월 판매금액을 조사하여 작성
  • 내수 출하지수(2015=100): 재고순환지표와 관계있는 지표. 제품이 창고에 있으면 재고, 국내도매상이나 소매자에게 판매하기 위해 창고에서 방출되는 것을 출하라고 합니다. 이 출하의 누이를 측정하는 지수로 만듬. 즉, 재고에서 출하로 이어지는 상태로 재고현황은 선행지수, 출하현황은 동행지수가 됩니다. 경기상승과 할때 출하량도 늘어날 것입니다.
  • 수입액(실질)(백만불): 경기가 상승하면 당연히 수입이 증가합니다. 직접적인 완제품 수입도 증가하지만 국내에서 제푸믕ㄹ 생산하기 위한 원재료 등의 수입도 늘기 때문입니다. 경기순환에 동행하여 움직입니다.
  • 비농림어업취업자수(천명): 경기가 좋으면 소득이 증가하고 소비도 증가할 것입니다. 이에 생산, 서비스에 필요인원이 더 요구됩니다. 즉 취업자수가 증가할 것입니다. 반대로 경기가 나빠지면 취업자수는 감소할 것입니다. 이는 제조업·서비스업이 강한 우리나라의 경우 이들에 대한 추이가 경기에 보다 민감할 것입니다.

경기선행지수와 동일한 과정으로 그래프를 작성합니다.

accompany=x.iloc[8:16,1:].T
accompany.columns=[str(i).split()[0] for i in x.iloc[8:16,0]]
accompany.head(2)
동행종합지수(2015=100)광공업생산지수(2015=100)서비스업생산지수(도소매업제외)(2015=100)건설기성액(실질)(십억원)소매판매액지수(2015=100)내수출하지수(2015=100)수입액(실질)(백만불)비농림어업취업자수(천명)
2019.01 111.3 105.0 107.8 10306.2 112.5 103.7 40857.5 25516.3
2019.02 110.9 103.8 108.0 10319.6 111.6 102.9 39944.7 25532.5
scaleraccomp=preprocessing.MinMaxScaler().fit(accompany)
accompN=scaleraccomp.transform(accompany)
accompN[:3]
array([[0.08653846, 0.20555556, 0.34862385, 0.89614075, 0.36551724,
        0.93023256, 0.27106519, 0.29334116],
       [0.04807692, 0.13888889, 0.36697248, 0.90700503, 0.30344828,
        0.8372093 , 0.14549256, 0.30918158],
       [0.06730769, 0.14444444, 0.3853211 , 0.97397438, 0.36551724,
        0.87209302, 0.02437716, 0.36247189]])
plt.figure(figsize=(14, 10))
plt.subplot(2,2,1)
for i in [0, 1, 2]:
    plt.plot(x.columns[1:], accompN[:,i],label=accompany.columns[i])
plt.legend(loc="best")
plt.xticks('')
plt.subplot(2,2,2)
for i in [0, 3,4]:
    plt.plot(x.columns[1:], accompN[:,i],label=accompany.columns[i])
plt.legend(loc="best")
plt.xticks('')
plt.subplot(2,2,3)
for i in [0, 5,6]:
    plt.plot(x.columns[1:], accompN[:,i],label=accompany.columns[i])
plt.legend(loc="best")
plt.xticks(size='7', rotation = 90)
plt.subplot(2,2,4)
for i in [0, 7,]:
    plt.plot(x.columns[1:], accompN[:,i],label=accompany.columns[i])
plt.legend(loc="best")
plt.xticks(size='7', rotation = 90)
plt.show()

후행종합지수

현재의 경기 변동을 사후에 확인하기 위해 작성하는 지표로 기준년 2015의 값을 100으로 합니다. 기계류수입액, 생산자제품 재고지수, 도시가계 소비지출, 회사채 유통수익률, 비농가 실업률, 근로자수 등의 지표들로 구성하며 통계청에서 매월 작성하여 보고합니다.

  • 생산자제품재고지수(2015=100): 광업 및 제조업체가 보유하고 있는 제품재고 (원재료, 반제품, 재공품은 제외)의 변동을 파악하고 재고수준을 나타내는 경기후행지표. 통계청은 광공업생산지수의 대표품목 613개중 주문생산등을 제외한 534개의 품목을 조사하여 발표. 재고율은 재고/출하의 비율을 의미. 재고율이 상승한다면 그 만큼 재고가 많다는 것으로 경기가 나빠짐을 의미
  • 소비자물가지수변화율(서비스)
    • 소비자물가지수: 도시가계가 일상생활을 영위하기 위해 구입하는 상품가격과 서비스 요금의 변동을 종합적으로 측정하기 위해 작성하는 지수로 2015년을 기준(100)으로 가계소비지출에서 차지하는 비중으로 460개 품목을 대상으로 작성
    • 근원물가지수: 소비자물가지수 품폭 중 곡물이외의 농산물과 석유류(도시가스 포함) 같은 외부충격 등에 취약한 품목들이 제외되어 물가변동으 기조를 분석하는데 유용한 지표
    • 생활물가: 소득증감에 관계없이 소비지출이 필요한 기본 생필품(141 개 품목)을 대상으로 작성
lagging=x.iloc[16:, 1:].T
lagging.columns=[str(i).split()[0] for i in x.iloc[16:, 0]]
lagging.head(3)
후행종합지수(2015=100) 생산자제품재고지수(2015=100) 소비자물가지수변화율(서비스) 소비재수입액(실질)(백만불) 취업자수(천명) CP유통수익률(%p) 2019.01 112.4 112.2 1.5 7143.7 26921.7 1.9 2019.02 112.7 111.8 1.4 7041.9 26941.6 2.0 2019.03 112.9 110.3 1.3 7102.3 26983.3 2.0
scalerlag=preprocessing.MinMaxScaler().fit(lagging)
lagN=scalerlag.transform(lagging)
lagN[:3]
array([[0.        , 0.14482759, 0.51851852, 0.11716644, 0.24269643,
        0.9       ],
       [0.024     , 0.11724138, 0.48148148, 0.07557807, 0.26075122,
        1.        ],
       [0.04      , 0.0137931 , 0.44444444, 0.10025329, 0.29858465,
        1.        ]])
plt.figure(figsize=(14, 10))
plt.subplot(2,2,1)
for i in [0, 1, 2]:
    plt.plot(x.columns[1:], lagN[:,i],label=lagging.columns[i])
plt.legend(loc="best")
plt.xticks('')
plt.subplot(2,2,2)
for i in [0, 3,4]:
    plt.plot(x.columns[1:], lagN[:,i],label=lagging.columns[i])
plt.legend(loc="best")
plt.xticks(size='7', rotation = 90)
plt.subplot(2,2,3)
for i in [0, 5]:
    plt.plot(x.columns[1:], lagN[:,i],label=lagging.columns[i])
plt.legend(loc="best")
plt.xticks(size='7', rotation = 90)
plt.show()

전년동월비

전년 동월의 지수에 비해 현재의 지수 변화율을 나타냅니다. 그러나 전년 동월지수는 그 월을 기준으로 이전 5개월과 이후 6개월의 값듣ㄹ에 대한 편균을 사용합니다. 직전년의 월만을 비교시 비교군의 경제적, 사회적등 여러 상황의 차이로 인한 편차를 최소화하기 위함입니다.

$$\text{전년동월비} =\left(\frac{\text{선행종합지수}-\text{전년동월의 선행종합지수 전후 12개월 평균치}}{\text{전년동월의 선행종합지수 전후 12개월 평균치}}\times100 \right)$$

python을 사용하여 이 지표를 계산하는 프로그램을 작성하기 위해 pandas, numpy 패키지와 dateutil.relativedelta()함수를 사용합니다.

다운받은 객체 x에서 선형종합지수만을 추출합니다.

lead=x.iloc[0,1:].T

객체 x의 각 열이름에서 "연.월" 만을 추출하여 위 자료의 인덱스로 사용합니다. 다음과 같이 열이름은 문자형이므로 .split() 메소드를 사용할 수 있습니다.

x.columns
Index(['지수별', '2019.01', '2019.02', '2019.03', '2019.04', '2019.05', '2019.06',
       …,
       '2021.07', '2021.08', '2021.09', '2021.10', '2021.11', '2021.12 p)',
       '2022.01 p)', '2022.02 p)'],
      dtype='object')
yr=[i.split()[0] for i in x.columns[1:]]
print(yr)
['2019.01', '2019.02', '2019.03', …, '2021.11', '2021.12', '2022.01', '2022.02']
lead.index=yr
lead[:3]
2019.01    112.8
2019.02    113.0
2019.03    113.4
Name: 0, dtype: object

위 데이터의 전년동월비는 다음 함수로 계산합니다.

def yyRatio(data):
    period={}
    n=1
    for i in range(len(data)):
        if (i-5 in range(len(data))) and (i+6 in range(len(data))):
            period[n]=i-5, i, i+6, data.index[i]
            n += 1
    yy_ratio=pd.DataFrame([])
    for j, k in period.items():
        tar=pd.to_datetime(k[3])+relativedelta(years=1)
        if tar <= pd.to_datetime(lead.index[-1]):
            if tar.month<10:
                tarIdx=np.where(lead.index==str(tar.year)+'.0'+str(tar.month))[0]
            else:
                tarIdx=np.where(lead.index==str(tar.year)+'.'+str(tar.month))[0]
            present=lead[tarIdx]
            before=(lead[k[0]:k[2]+1]).mean()
            yy_ratio=pd.concat([yy_ratio, (present-before)/before*100])
    return(yy_ratio)
ratio=yyRatio(lead)
ratio
0
2020.063.190014
2020.073.49345
2022.01 3.483123
2022.02 2.928366
plt.figure(dpi=100)
plt.plot(ratio.index, ratio[0])
plt.xticks(rotation=90, size=7)
plt.show()

동행지수 순환변동치

추세·순환계열인 선행·동행종합지수에서 추세요인을 제거한 순환요인으로 현재 결기의 국면 및 전화점을 파악하는데 활용됩니다.

일반적으로 경기지표는 계절, 불규칙, 추세, 순환요인 4가지 요소들을 포함하는데 이들 요인 중 비경기적요인인 계절 및 불규칙 요인을 제거한 추세·순환요인 또는 순환요인이 경기분석에 이용됩니다.

순환변동치는 추세를 제거한 수치로 100은 추세선을 의미합니다. 종합지수의 증가 속도가 추세치 증가 속도보다 빠르면 지수 순환변동치는 기준치를 상회하게 되고 반대로 종합지수의 증가속도가 추세치의 증가 속도보다 느리면 순환변동치의 기준치를 하회하게 됩니다.

y=pd.read_excel("~순환변동치.xlsx", sheet_name="data")
y.iloc[:,80:]
201608월 201609월202201월 202202월
0 101.0 100.8 102.4 102.6
1 99.5 99.7 100.1 99.8
plt.figure(figsize=(17,7))
nme=['동행지수순환변동','선행지수순환변동']
plt.plot(y.columns[80:], y.iloc[0,80:],label=nme[0])
plt.plot(y.columns[80:], y.iloc[1,80:],label=nme[1])
plt.axhline(y=100, color="green")
plt.legend(bbox_to_anchor=(1,1))
plt.xticks(size=10, rotation = 90)
plt.show()

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b