* 본 포스트는 개인연구/학습 기록 용도로 작성되고 있습니다.


[Python] 산업 전이행렬 만들기


글로벌 변동성이 커지고 각종 경기지표가 악화됨에 따라 신용리스크가 가중되고 있다. 산업 및 기업의 신용리스크 확인시 등급전이행렬을 확인하는 것은 매우 유용하다.
전이행렬을 통해 우상향할수록 위험이 악화되고, 좌하향할수록 위험이 개선되는 것을 확인할 수 있다.
보통의 신용등급 전이행렬에서는 현재 등급에서 1년후 특정 등급으로 이동할 확률을 나타내는데 쓰인다.

img_area
위의 표에 따르면 BBB등급의 차주가 1년 후 A등급으로 전환할 확률은 4%이다.

다른 예로 직전(주로 1년 전) 등급과 현재 등급의 변화를 나타낼때도 유용하게 사용될 수 있다.

후자의 개념을 적용하여 산출한 산업별 위험이 전년 대비해서 어떻게 변화하는지확인해보고자 한다.
개념만을 차용해 등급 대신 위험 확률 값을 넣고 그래프로 표현할 예정이다.

1. 데이터 가져오기


data = pd.read_csv("./datas/industry_matrix.csv", encoding='euc-kr')

아래와 같은 포맷이다.

industry id count 2013 2014 2015 2016 2017 2018Q3
총합계 total 1923 31.62105 30.61511 32.4839 30.36369 33.21931 34.33319
제조업 C 1252 30.42722 30.00786 32.02782 30.03699 32.91973 34.20605
출판 영상 방송통신 및 정보서비스업 J 212 33.89064 30.78209 32.52728 30.3001 34.74163 35.58819
전문 과학 및 기술 서비스업 M 158 27.30578 26.60527 28.37879 26.98155 28.1938 29.53939
도매 및 소매업 G 134 35.71608 34.36381 36.09455 34.3897 36.81342 36.87577
건설업 F 64 43.71257 41.87939 43.20357 36.2027 39.01434 41.14245
운수업 H 27 38.27187 31.83501 35.3135 32.19269 33.86897 34.55875
기타 X 23 34.41969 34.41969 34.41969 34.41969 34.41969 34.41969
사업시설관리 및 사업지원 서비스업 N 17 30.5455 27.7833 29.05953 30.96413 37.81404 34.66609
예술 스포츠 및 여가관련 서비스업 R 12 39.50355 35.40623 35.20804 36.09189 36.28727 37.88297
교육 서비스업 P 11 30.2441 26.0048 30.97068 30.01419 30.82166 31.08653
전기 가스 증기 및 수도사업 D 10 24.21352 24.14289 24.66476 24.2788 24.44411 23.91144

실제 데이터는 2개년만 선택하여 사용하게 된다.



2. 그래프 축 만들기


max = 50
min = 20
x1 = list(range(min,max+1))
y1 = list(range(max-min,-1,-1))
len(x1), len(y1)

plot_data = pd.DataFrame()
plot_data['x1'] = x1
plot_data['y1'] = y1

min, max는 위험값의 최대 최소 범위를 나타낼 수 있는 구간이다. 결과는 아래와 같이 생성된다.

  x1 y1
0 20 30
1 19 31
2 18 32
3 17 33
4 16 34
5 15 35
6 14 36
7 13 37
8 12 38
9 11 39
10 10 40
11 9 41
12 8 42
13 7 43
14 6 44
15 5 45
16 4 46
17 3 47
18 2 48
19 1 49
20 0 50



3. 그래프 생성하기


data와 plot_data 설정이 완료됐으면 그래프를 그릴 차례이다.

import matplotlib.pyplot as plt
import numpy as np

max_value = max
min_value = 0
error = 3# % 밴드(안전마진) 설정

# create data
x = data['2018Q3']
tmp_y = data['2017']
y = max_value-tmp_y

# 랜덤 컬러 지정
colors = np.random.rand(len(data))

plt.scatter(x, y,c=colors, alpha=0.5)
plt.plot(plot_data.x1,plot_data.y1)

# 라벨 만들기
def label_point(x, y, val, ax):
    a = pd.concat({'x': x, 'y': y, 'val': val}, axis=1)
    for i, point in a.iterrows():
        ax.text(point['x']+.02, point['y'], str(point['val']))

label_point(x, y, data.id, plt.gca())

plt.xlim(min,max)
plt.ylim(0,max-min)

x1 = plot_data['x1'].map(lambda x: float(x))
y1 = plot_data['y1'].map(lambda x: float(x))
plt.fill_between(x1, y1-error, y1+error,alpha=0.5, edgecolor='#66aee3', facecolor='#66aee3')

fig = plt.gcf() #현재 figure에 불러오기
fig.set_size_inches(7,7) #크기 바꾸기(inch 단위)

plt.show()

안전마진은 error 값을 임의로 3% 셋팅하고 edgecolor='#66aee3'로 밴드 색상을 푸른색으로 지정하였다.

아래와 같은 그래프를 얻을 수 있다.
img_area
가로축이 현재의 위험확률 세로축이 과거의 위험확률이므로 우상향할수록 악화되며 좌하향할수록 개선됨을 의미한다.

확률값 해석시에 세로축을 유의해야 한다. 그래프 가독성을 쉽게 하기 위해 세로축은 반전시킨 확률이다. 즉 아래와 같이 변경해서 해석해야 한다.
img_area

Tags:


Back to blog