• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

catplot의 kind=count사용 시, 비율 문제 관련 질문드립니다.

23.01.03 14:03 작성 23.01.03 14:15 수정 조회수 301

0

인프런질문1.png그래프를 해석하는 데 있어서, catplot의 countplot을 통해 그래프를 작성하면 한 가지 단점이 target=0과 target=1 일때 각각의 경우에 대해서 나온 그래프의 전체 값이 다르기 때문에 비율을 통해 접근을 해야 한다고 하셨습니다.

그 이유는 TARGET = 0의 비율은 전체 데이터프레임 app_train['TARGET'].value_counts() / app_train.shape[0]을 적용했을 때, 각각 92% , 8% 정도가 나오기 때문입니다.

Q: 올바르게 이해한 것이 맞을 까요?

따라서 왼쪽 subplot의 경우 전체 92%의 데이터들 가운데, 각 object칼럼에 대응하는 TARGET = 0 일때의 count 갯수를 기준으로 만들어진 것이며, 오른쪽 subplot의 경우 이러한 왼쪽 subplot을 기준으로 만들어진 그래프이기 때문에 그래프가 짜부라져 보인다는 것으로 이해하였습니다.

이와 같이 비슷하게 설명을 하셨지만, 질문 게시판에 다시 올린 이유는

CODE_GENDER를 제외한 나머지 15개의 object칼럼에 대해 큰 차이가 없어보이는 것을 확인 할 수 있다고 하셨는데,

FLAG_OWN_CAR(차 소유 여부)의 경우 (차량 소유 = yes)있을 때, 연체 비율이 no 일때 보다 훨씬 높다는 것을 확인 할 수 있었습니다. TARGET = 1일 떄의 차량 소유 NO /TARGET = 0일 떄의 차량 소유 NO (분모가 더 큼)

인프런질문2.png

마찬가지로 FLAG_OWN_REALITY(부동산 소유 여부) 의 경우에는

부동산을 소유하지 않았을 때, 연체 비율이 더 높은 것을 확인할 수 있었습니다.

그래서, 제가 올바르게 이해한 것인지 여쭤보고 싶습니다.

 

 

Q: 그래프를 Target=1/TARGET = 0 일때를 기준으로 좀 더 명확하게 보고 싶은데 어떻게 코드를 작성하는 것이 좋을까요?

먼저 제가 이렇게 그래프를 보고 싶은 이유는 다음과 같습니다. 아무래도 16개의 칼럼들에 대해서 비율로 접근하다보니, 만약 TARGET = 0일 때 object칼럼에 대한 각각의 x 값이 비슷할 경우, target = 1일 때 짜부라진 데이터에 대해서 부정확한 분석을 할 수 있을 것 같았기 때문입니다. 따라서 scale조정을 할 수 있다면, 좀 더 정확하게 분석을 할 수 있지 않을 까? 하는 생각이 들었습니다.

코드를 보면, 다음과 같습니다.

[16개의 object칼럼 데이터에 대해서 list형태로 만듦]

object_columns = app_train.dtypes[app_train.dtypes == "object"].index.tolist()

object_columns

[catplot을 사용하여 kind=count형식으로 그래프를 만듦]

def show_category_by_target(df, columns):

for column in columns:

print('column name:', column)

 

chart = sns.catplot(x=column, col = 'TARGET', data=df, kind='count')

chart.set_xticklabels(rotation=65)

show_category_by_target(app_train, object_columns)

 

x= column을 통해 loop를 돌면서 app_train[column]이 들어가기 때문에, 각 카테고리형 변수에 대해서 target 0과 target 1에 대해(col='TARGET') 두 개의 subplots 가 나오는 코드입니다.

이 부분을 하나의 plot으로, target 1일 때 / target 0일 때 각 카테고리형 변수에 대한 각 인자들 로 나눠서 보고싶은데 어떻게 해야할까요?

쉽게 생각하면, 원래 오른쪽 subplot / 왼쪽 subplot을 하여 하나의 target=1에 대한 그래프를 보고 싶다는 질문입니다.

 

 

답변 1

답변을 작성해보세요.

0

안녕하십니까,

  1. 그래프를 해석하는 데 있어서, catplot의 countplot을 통해 그래프를 작성하면 한 가지 단점이 target=0과 target=1 일때 각각의 경우에 대해서 나온 그래프의 전체 값이 다르기 때문에 비율을 통해 접근을 해야 한다고 하셨습니다.

그 이유는 TARGET = 0의 비율은 전체 데이터프레임 app_train['TARGET'].value_counts() / app_train.shape[0]을 적용했을 때, 각각 92% , 8% 정도가 나오기 때문입니다.

Q: 올바르게 이해한 것이 맞을 까요?

=> 네 맞습니다.

그리고 ,

연체나 정상납부냐에 따라 FLAG_OWN_CARD의 N과 Y의 비율차이 그리고 FLAG_OWN_REALTY의 N과 Y의 비율 차이가 심하다고 하셨는데 아래 코드로 조사해보면 큰 차이는 없다고 생각합니다.

cond_1 = (app_train['TARGET'] == 1) cond_0 = (app_train['TARGET'] == 0) print(app_train[cond_1]['FLAG_OWN_CAR'].value_counts()/app_train[cond_1].shape[0]) print(app_train[cond_0]['FLAG_OWN_CAR'].value_counts()/app_train[cond_0].shape[0]) print(app_train[cond_1]['FLAG_OWN_REALTY'].value_counts()/app_train[cond_1].shape[0]) print(app_train[cond_0]['FLAG_OWN_REALTY'].value_counts()/app_train[cond_0].shape[0])

물론 연체 시 FLAG_OWN_CAR는 N인 경우(차를 소유하지 않은 경우)가 69.4%로 정상시 FLAG_OWN_CAR의 N인 경우 65.8% 보다 높지만, 이걸 훨씬 높다고 보기는 어려울 수 있습니다. 물론 보는 시각차에 따라 의미 있는 차이는 될 수 있습니다.

그리고 FLAG_OWN_REALTY는 큰 차이가 없습니다.

  1.  

Q: 그래프를 Target=1/TARGET = 0 일때를 기준으로 좀 더 명확하게 보고 싶은데 어떻게 코드를 작성하는 것이 좋을까요?

=> 어떻게 보고자 하시는 건지 잘 이해를 하지 못했습니다.

강의의 show_count_by_target() 함수를 보시면 개별 axis 별(개별 subplot별)로 target 값이 0일때와 1일때를 서로 나누어서 seaborn의 countplot()으로 시각화 할 수 있도록 했습니다. countplot()을 이용하면 target=1일 때 그래프가 짜부러지는 경우도 없습니다.

이거 말고 다른 것을 말씀하시는 건지요?

지금 예로 들어주신 seaborn의 catplot()은 개별 axis를 사용하지 않고 col='TARGET' 값에 따라 스스로 Plot을 분할합니다. catplot()은 countplot()과 다르게 개별 axis(subplot)를 적용하지 않기 때문에 왼쪽, 오른쪽 sublplot을 지정해서 작업하기가 어렵습니다.

 

원하시는 답변이 아니면 원하시는 시각화를 그림으로라도 간단하게 캡처해서 올려주셨으면 합니다.

감사합니다.