이전 포스트(matplotlib)에 이어 이번에는 seaborn을 사용하여 막대그래프를 그린다.
seaborn은 카테고리형 (값의 종류가 한정적)일 때 활용하기 좋다.
ⓛ SibSp (동승자 수(형제, 자매, 배우자))와 Survived의 관계
import seaborn as sns
import matplotlib.pyplot as plt
sns.countplot(x='SibSp', hue='Survived', data=train)
plt.legend(loc='upper right', title='survived')
-seaborn 라이브러리를 sns라는 이름으로 import한다.
- matplotlib.pyplot 라이브러리를 plt라는 이름으로 import한다.
-sns.countplot()함수
여기서 사용한 파라미터는 3가지이다.
x : x축 변수 (독립변수)
hue : y축 변수 (목적변수)
data : 대상 데이터프레임
- plt.legend() : 범례
(loc : 범례 위치, title : 범례 이름)
결과값:
hist함수와 비슷해보이지만 다르게 표현된다.
두개의 막대가 겹쳐지지 않고, 값의 범위에 따라 count되지 않고 각 값 마다 count된다.
이번 특성은 동승자 수(형제, 자매, 배우자)이다.
특성이름을 보고 떠오르는 가설이 있다.
"혼자 행동하는 것보다는 느릴 가능성이 높기 때문에 동승자 수가 많으면 생존할 가능성이 적다. "
이제 이 가설의 근거를 그래프를 보고 찾아보자.
생존자(1)의 경향(증감 추세)을 보면 0,1,2,3,4로 갈수록 점점 줄어든다.
사망자(0)의 경우 2,3,4에서 거의 동일하거나 4에서 오히려 약간 증가한다.
이를 보면 어느정도 위의 가설의 신빙성을 확인 할 수 있으나 강력하지 않다.
(사망자가 2,3,4에서 증가하는 추세였다면 강력했겠지만...^^)
심지어 증감 추세가 아니라 각 값마다의 대소를 비교했을 때는
동승자 0명일 때 : 사망 > 생존
동승자 1명일 때 : 사망<생존
동승자 2명일 때 : 사망 > 생존
동승자 3명일 때 : 사망 > 생존
동승자 4명일 때 : 사망 > 생존
동승자가 1명일 때 오히려 생존자가 많아지는 현상이 보인다.
마치 동승자가 많아지면 생존률이 감소한다는 가설에 반대되는 증거처럼 보인다.
하지만 생각해보자...
1명일 때만 생존자가 오히려 증가한다고 해서 "동승자수가 많으면 생존할 가능성이 적다"는 가설이 무의미한가?
만약 동승자가 1명일때 같이 살아서 나가야겠다는 집념이 오히려 강해졌고
2명 이상일 때는 포기하는 심정이 커졌다면?
기존 가설에 반대되는 증거가 아닌새로운 유의미한 현상으로 볼 수 있다.
최종 가설을 보자면
"동승자 수가 많을 수록 생존할 가능성이 적다. 하지만 동승자 수가 한명일 때는 오히려 증가한다."
이 특성을 모델이 학습할 때 기대되는 효과는 이러하다. 다른 특성들... 동승자수 1명 -> (생존률+5%) -> 다른특성들.... = 예측값 다른 특성들... 동승자수 2명 -> (생존률 -5%) -> 다른 특성들.... = 예측값 다른 특성들... 동승자수 3명 -> (생존률 -10%) -> 다른 특성들.... = 예측값
코드를 간단하게 설명하자면 동승자가 한명이라도 있는 경우 : IsAlone=0 동승자가 없을 경우 : IsAlone=1
경향을 보자. 혼자있을 경우 사망자(파란색)가 더 많다. 하지만 원래 사망자수가 생존자수보다 많아서 그런 것일 수도 있다. 그럼 이번에는 생존자(주황색)을 보자. 생존률(주황색)은 혼자있을 때나, 함께있을 때나 비슷하다. 결론적으로 변별력이 매우 떨어진다는 소리다...
그래프를 수치로 해석하면 더 명확하게 판단할 수 있다. 총 4가지의 조합이 있다 그래프의 순서대로 가족, 사망 : 170 가족, 생존: 170 혼자, 생존 : 170 혼자, 사망 : 350
억지로라도 혼자 생존하는 경우를 강조하고 싶었다면 가중치를 부여해야하지 않았을까...싶다.. 아니다 어차피 원핫인코딩하면 해결될 문제아닌가? 0명일때,1명일때,2명일때... 전부 다른 경우로 학습할 것이고 0명일 경우 생존한 사람이 많았다면 0명이라는 특성을 생존과 가까운 컬럼이라고 인식했을 것이니 말이다.
컴퓨터에서는 이 특성이 '혼자생존하는 경우'라고 인식하지 않는다. 내가 특성이름을 'IsAlone'이 아니라 'A'라고 넣어도 결과는 동일하다. 컴퓨터는 그저 경향을 학습할 뿐이니까..
특성이름만 들으면 그럴듯해보인다. 가설도 "동승자가 많을수록 생존할 가능성이 적다"이니 맥락도 어느정도 일맥상통한다. 하지만 실상은? 변별력없는 특성같다...ㅎㅎ
=> FamilySize라는 동승자 수를 의미하는 컬럼 생성, Parch와 SibSp는 제거