본문 바로가기

빅데이터 분석/실전 데이터 분석 및 모델링

[Kaggle] Prosper Loan 데이터 분석1. 위험 회피형 투자자를 위한 포트폴리오(파이썬 기반 분석)

반응형

1. 데이터의 출처 및 설명

 

2. 데이터 분석의 목적 - 투자자 성향에 맞는 포트폴리오 제안 - 위험 회피형 

 

3. 데이터 분석 - 데이터의 선정 및 정제, 데이터 분석, 데이터 시각화 및 최종 제안

 

1. 데이터의 출처 - Kaggle P2P 채권 데이터 

www.kaggle.com/yousuf28/prosper-loan

 

ProsperLoan Dataset

 

www.kaggle.com

 

(1) 데이터의 설명 

 

요즘 한국에도 개인 간 금융 대출이 가능한 플랫폼이 있는데요, 이는 원래 미국에서 발전한 금융 플랫폼이죠. 그 중에 대표적인 회사 중에 하나가 Prosper Loan입니다. 여기서 거의 10년 전 데이터에 가까웟 현재 P2P 시장을 반영한다고 보기에는 다소 무리가 있으나 P2P 데이터에 대해 어떻게 실전에 가깝게 접근하면서, 다룰 수 있는지에 Point를 맞춰서 분석을 진행해보겠습니다. 

 

기본적으로 이 데이터에는 81가지 변수가 있으나, 지금 초점은 채권에 대한 심화 지식을 배우는 것이 아니라, 채권 데이터를 통해 어떠한 기본적인 데이터 분석 및 시각화 가능한지 파악하는 것입니다. 따라서 필요한 변수만 간단하게 추출해서 진행해보도록 하겠습니다.

 

 

<결과 미리보기 1 - 위험 회피형 사람들은 어떻게 해야되는데?>

손실을 회피하고 싶은 사람들은 25k 달러 미만의 정규직, 25~ 50K의 계약직/알바 등의 사람들을 조심해야 하고 그리고 무엇보다 100K 달러 이상의 자영업자들에게 채권 투자하는 것을 지양해야 한다!!

 

이제부터 밑의 데이터 분석 및 시각화는 이 단순한 한 마디를 할 수 있기 위한 여정입니다. 

 

 

2. 데이터 분석의 목적 - 투자자 성향에 맞는 포트폴리오 제안 - 위험 회피형 

 

이번 포스팅 시리즈에서는 3가지 데이터 분석을 진행해볼 거에요. 

 

첫 번째. 위험 회피형 

 

두 번째. 수익 추구형

 

세 번째. 안전 추구형

 

이 3가지 관점을 한 포스팅에 다 다루기에는 힘드니 한 번에 한개씩만 다루도록 할게요. 

 

이번에는 위험 회피형 투자자는 그럼 어떤 채권에 투자하는 것이 가장 적절할까?에 대한 질문을 풀어보도록 하겠습니다. 

 

(1) 필요 데이터의 선정

 

81가지 변수 중에서 이 질문에 답하기 위한 변수를 최대한 간단하게 3가지만 추려봤어요.

(원래 제대로 모델링하고 분석하여면 종합적으로 더 많은 변수를 고려하는 것이 올바른 방향입니다.)

 

그 변수는 소득 분위, 고용 형태, 그리고 기대 손실율입니다. 

 

향후 분석은 이 3 데이터를 어떻게 정제하고 분석하여, 최종적으로 위험 회피형 투자자에게 가장 적절한 투자 포트폴리오 제안을 하는 것을 목적으로 진행될 예정입니다. 

 

 

 

3. 데이터 분석

- 데이터 불러오기, 데이터 정제 정제, 데이터 분석, 데이터 시각화 및 최종 제안

 

3-1. 데이터 불러오기 및 기본 데이터 탐색

 

 (1) 원본 데이터의 탐색

원본 데이터의 샘플

 

원본 데이터의 형태

 위에서 보다 싶이 필요 없거나 정확하게 무엇인지 모르는 변수는 오히려 데이터 분석에서 방해가 되는 것을 확인할 수 있습니다. 

 

이러한 방해요소를 제거하고 데이터를 정리하기 위해서 데이터 정제 과정이 필요합니다.

 

 (2) 원하는 데이터 부분만 불러오기 

 

원하는 데이터 불러오기

 

 

3-2. 데이터의 정제

 (1) 첫 번째. Null 값의 제외

 

<Null 값의 탐색>

row 중에서 null 값이 있는 부분을 살펴 보았습니다. Pandas에서는 해당 셀이 비어있는지 아닌지 확인하기 위한 메소드로 .isnull()을 활용합니다.

 

<Null 값의 삭제> 

null 값을 삭제할 때는 .dropna( subset = [] )의 메소드를 활용하면 됩니다. 

 

1
2
3
4
5
##null 값의 탐색
t1.isnull().sum()
 
## null 값의 제거
t1 = t1.dropna().reset_index(drop = True)
cs

 

1
위의 두 공식을 활용하면 아래의 결과처럼 처리가 됩니다.
 
 

 

null 값의 탐색과 제거

 

특히나 Estimated Loss(기대 손실율)과 같이 필수적인 정보가 없는 row라면 오히려 데이터를 왜곡시킬 우려가 있기 때문에 반드시 제거해주어야 합니다.

 

 

(2) 데이터의 정제 - 두 번째. 범주형 데이터 인코딩

 

컴퓨터에서는 Employed, Full-time worker 등 이런 분류를 인식하지 못합니다. 그래서 이 데이터를 컴퓨터가 알아들을 수 있도록 데이터 형태를 변환해주어야 합니다. 

 

이런 과정을 할 때 아주 편리하게 이용할 수 있는 패키지가 바로 LabelEncoder()이라는 패키지가 있습니다. 

 

Label Encoder란 쉽게 말해 a,b,c 등의 카테고리/범주형 데이터를 0, 1, 2로 바꾸어주는 역할을 합니다. 

 

이렇게 전처리는 하는 과정은 생각보다 간단 합니다.

 

< 소득 분위의 Label Encoding >

1
2
3
4
5
6
7
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
 
t1['income_range'= le.fit_transform(t1['IncomeRange'])
income_encoding = le.classes_
for i, n in enumerate(income_encoding):
    print (i, n)
cs

 

여기서 정말 중요한 것은 어떠한 변수값이 어떻게 인코딩이 됐는지 항상 기록해두어야 하는 것입니다.

 

이 과정은 위의 코드 중에서 income_encoding = le.classes_ 가 수행하고 있습니다. 그래서 이 값을 불러오면 다음과 같은 결과를 얻을 수 있습니다. 

 

 

Label Encoding 1

0번 그룹은 소득이 없는 사람들, 1번 그룹은 1 ~ 25K 미만의 그룹 등 이런 식으로 인코딩 되는 것을 볼 수 있습니다. 

 

 

< 고용 형태의 Label Encoding >

 

고용 형태 변수 값도 위의 과정과 똑같은 작업을 수행해주어 범주형 데이터를 정제 합니다. 

 

Label Encoding 2

 

(3) 데이터 정제의 결과 

 

데이터 정제의 결과

 

범주형 데이터가 이제 모델링을 위해 깔끔한 형태로 정리된 것을 확인했습니다.

 

 

3 - 3. 데이터 분석 계획

 

(1) 연구 주제의 구체화

 

원래 연구 질문으로 돌아가보면, "위험 회피형 투자자에게 가장 적합한 채권은 무엇인가?"를 알아내는 것입니다. 

 

이때 우리는 "소득 분위"와 "고용 형태"를 기준으로 그룹을 나누어 볼 수 있습니다.

 

소득 분위는 6개의 범주가 있고, 고용 형태는 7개의 범주가 있는 것을 위에서 확인했습니다.

 

따라서 모든 채권을 42가지의 세부 그룹으로 세분화를 할 수 있습니다. 

 

채권의 세분화

 

이제 조금 더 연구 주제를 구체화 해보도록 하겠습니다. 

 

"42가지 채권 유형 중에서 위험 회피형 투자자에게 가장 알맞은 채권은 무엇일까?"로 질문이 바뀔 것입니다. 

 

그래서 이 질문을 해결하기 위해서 두 가지 단계를 거칠 것입니다. 

 

첫 번째. 소득분위와 고용 형태는 기대 손시율에 영향을 주는가?

 

두 번째.  수식이 맞다면, 과연 어떤 그룹에서 가장 높은 손시율이 나타나고, 그 값은 신뢰할 수 있는가?

 

 

(2) 가설 검증을 위한 모델 선정 - ANOVA Model with Post-Hoc Analysis

 

연구 주제를 이제 통계적 질문으로 바꾸어보겠습니다. 질문에서 말한 "위험"이란 것은 데이터 상에서 "기대 손실율"로 치환할 수 있고, "누구"에 해당하는 부분은 채권의 세부 그룹을 의미하는 것으로 볼 수 있습니다.

 

"42개의 그룹 간 비교에서 기대 손실율에 유의미한 차이가 있는가?"로 질문을 최종 확정할 수 있을 것입니다. 

 

이는 그룹간 평균 비교 방법이 필요하고, 이미 그룹이 3개 이상이고, 종속변수는 하나이기 때문에 ANOVA Analysis가 가장 적합 모델로 생각됩니다. 

 

<ANOVA 분석이란? - 한줄요약>

 

한글로 분산분석이라고도 불리는 이 모델은, 집단이 3개 이상이고 종속변수가 연속형 변수로 하나 일때, 그룹 간 평균에서 차이가 있는지 없는지 확인하는 모델입니다. 

 

1) ANOVA 모델의 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
## 집단 간 평균 분석을 위한 패키지 모음
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
 
##데이터셋 복사
test_df =t1[['income_range''employment_status''EstimatedLoss']]
 
## 공식의 확립
formula = 'EstimatedLoss ~ C(income_range) + C(employment_status) + C(income_range):C(employment_status)'
 
## 통계 모델 분석
lm = ols(formula,test_df).fit()
print(anova_lm(lm))
cs

 

 

ANOVA Analysis

분석 결과를 보니, 소득 분위, 고용형태 그리고 소득분위 x 고용형태 모두 계수 값이 유의하게 나오는 것을 확인할 수 있었습니다. 이것의 판단 기준은 사회 과학에서 흔히 사용하는 기준인 P-value <= 0.05로 판단했습니다. 

(여기서는 ANOVA의 Interaction Effect를 다루지 않고 오직 Simple Effect에 초점을 맞춰서 설명하도록 하겠습니다. )

 

여기서 얻을 수 있는 인사이트는 확실히 소득분위와 고용형태가 기대 손실율에 확실한 영향을 준다는 사실입니다. 

 

하지만 여기까지만 분석하면 어떤 그룹이 손실율이 더 높은지 낮은지 확인할 수 없다는 것이죠. 

 

<Post-Hoc 검증 / 사후 검증이란? - 한 줄 요약>

Post-Hoc 검증이란 그룹 간 평균 차이가 과연 얼마나 나는지, 통계 오차는 어떻게 되는지 사후에 검증하는 분석 방법입니다. 

 

2) Post-Hoc Analysis를 통한 그룹 간 기대 손실율 비교

 

Post-Hoc 분석을 진행하기 위해서는 각 row마다 그게 어떤 그룹에 속하는지 값을 부여하는 것입니다. 

 

위에서 보여드린 42가지 그룹 표를 구현하기 위해서는 아래의 전처리 코드를 거치면 됩니다. 

 

1
2
3
4
5
6
7
ref = pd.DataFrame(0, columns = employment_encoding, index = income_encoding)
start = 0
for i in range(ref.shape[0]):
    
    ref.iloc[i, :] = [ start + 1 +n for n in range(ref.shape[1]) ]
    start += 7
ref
cs

 

 

Group Reference 1 

 

하지만 이렇게만 하면 컴퓨터가 못 알아 듣는다는 문제가 있겠죠?? 그래서 Label Encoding한 자료를 기반으로 그룹을 나누면 아래와 같이 표현할 수 있습니다. 

 

 

Group Reference 2

네 이제 전처리된 값을 기반으로 위의 그룹 표를 기반으로 각 row 마다 어느 Group 에 속하는 지 값을 부여하면 될 것 같습니다. 

 

그 과정은 아래의 코드로 진행할 수 있습니다. 

 

 

각 row마다 이제 그룹이 지정되었으니 실제로 Post-Hoc 검증을 진행해보도록 하겠습니다. 

 

1
2
3
4
5
6
from statsmodels.stats.multicomp import pairwise_tukeyhsd
 
posthoc = pairwise_tukeyhsd(t1['EstimatedLoss'], t1['treatment'], alpha=0.05)
posthoc_df = pd.DataFrame(data=posthoc._results_table.data[1:], columns=posthoc._results_table.data[0])
approved_results = posthoc_df.query('reject == True').reset_index(drop = True)
approved_results.sample(10)
cs

Post Hoc 결과 값 도출

위의 코드는 귀무가설을 기각하고, 대립 가설을 채택할 수 있는 결과만을 저장한 것입니다.

 

모든 그룹 간 비교의 경우의 수는 361번 수행하였고, 그 중 오직 69개의 그룹 간 비교에서 유의미한 차이를 보여주었습니다. 

 

3-3. 데이터 분석의 일반적인 해석 및 시각화

 

자 이제 Post-Hoc Analysis까지 하였습니다. 이제 최종적인 질문에 답을 해보는 시간을 가져보도록 하겠습니다. 

 

"그래서 누가 가장 위험한 그룹인데?"

 

 1) 전체 기대 손실율 비교

전체 그룹의 기대손실율 계산

전체 그룹에서 기대 손실율을 한 눈에 비교할 수 있습니다. 그렇지만 이 데이터도 한 번에 알아 듣기 쉽지는 않죠. 

 

 

2) 위험율이 가장 높은 5개 그룹 비교 

 

 

상위 5개

 

결론1. 그룹 7번과 21번은 단순 평균치로 봤을 때 가장 높은 기대 손실율을 산출하였다. 

  -> 단 Post-Hoc의 검증된 그룹에서 7번과 21번 그룹이 없었다. 따라서 이 두 집단이 무조건적으로 다른 집단보다 위험하다고 일반화할 수 없으니 투자에 반드시 참고해야 한다. 

 

결론2. 그룹 2번, 19번 그리고 5번은 기대손실율에서 상위권을 차지하였고, Post-Hoc 검증에서 이 결과를 뒷받침하는 결과를 보인다. 

 

그룹 2번을 예시로 들었을 때, 19번(연봉 25k~50K 달러 미만의 계약직/알바) 그룹에서 여타 그룹에 비해 기대 손실율이 확연히 높다는 것이 검증된 자료가 있습니다. 

 

 

그래서 결론은 P2P 채권 투자에서 위험을 회피하고 싶다면, 7, 21, 2, 19, 그리고 5번 그룹에 해당하는 개인들에게 투자하지 말라는 투자 가이드를 제안할 수 있다는 것입니다 .

 

 

단순한 사실일 수 있겠으나, 데이터를 다루는 사람이라면 돌다리도 두드려 보고 건너란 말을 실천해야 한다고 생각합니다. 

 

남들에게 있어서 단순한 문장일 수 있고, 말 한 마디 일 수 있지만, 우리의 가치는 확실한 통계적 팩트를 전달하는데 있다고 생각합니다.

 

 

이러한 방식으로 동일한 데이터를 다양한 방식으로 분석해보는 포스팅 시리즈를 이어나가도록 하겠습니다. 

반응형