cyc1am3n.github.io/2018/10/09/my-first-kaggle-competition_titanic.html
(※ 타이타닉 예제를 공부하면서 위 깃허브에서 공유한 코드를 사용했습니다.)
이번 포스팅은 def() 를 활용해 파이차트를 보여주는 위 깃허브의 코드를 분석해보고자 한다.
이번에 사용할 데이터는 캐글의 튜토리얼 데이터인 titanic 예제 데이터이다.
먼저, titanic 데이터를 받아 train 데이터를 train으로 불러왔다.
# import train data
train = pd.read_csv('../train.csv')
오늘 공부할 코드
# 명목변수의 분포를 보기 위해 Pie chart 함수 정의하기
# 블로그 참고: https://cyc1am3n.github.io/2018/10/09/my-first-kaggle-competition_titanic.html
def pie_chart(feature):
feature_ratio = train[feature].value_counts(sort = False)
feature_size = feature_ratio.size
feature_index = feature_ratio.index
survived = train[train['Survived'] == 1][feature].value_counts()
dead = train[train['Survived'] == 0][feature].value_counts()
plt.plot()
plt.pie(feature_ratio, labels = feature_index, autopct = '%1.1f%%')
plt.title(feature + '\'s ratio in total')
plt.show()
for i, index in enumerate(feature_index):
plt.subplot(1, feature_size, i + 1)
plt.pie([survived[index], dead[index]], labels = ['Survived', 'Dead'], autopct = '%1.1f%%')
plt.title(str(index) + '\'s ratio')
plt.show()
1. 함수 정의하기
def 함수명(변수):
사용할 함수를 직접 정의하는 방법이다.
def 함수를 사용해 함수를 직접 정의한다.
함수명은 자신이 사용할 이름을 적용하고 변수는 뒤에 나올 코드에서 활용할 변수를 가지고 오면 된다.
여러 변수를 활용할 때는 콤마를 찍고 사용하면 된다.
def pie_chart(feature):
def pie_chart(feature):
"우리는 pie_chart라는 이름의 함수를 만들 것이고, 지금은 feature라고 우리가 명명했지만 그에 해당하는 변수를 나중에 '내가 직접 입력'할 것이다"라는 뜻이다.
그래서 만약 나중에 방금 우리가 정의한 pie_chart() 함수의 괄호 안에 특정 변수를 입력하면, 그 변수에 대한 것을 출력하라는 의미가 된다.
2. 함수에 사용할 변수 정의하기
2-1. value_counts() 함수로 명목변수 칼럼의 빈도수 확인하고 feature_ratio라는 변수로 정의하기
feature_ratio = train[feature].value_counts(sort=False)
feature라는 변수에 대한 value_counts를 feature_ratio라는 변수명으로 저장한다.
.value_counts()는 명목변수의 빈도수를 출력하는 함수다.
일반적으로는 아래처럼 입력해 간단히 빈도수를 확인할 수 있다.
#.value_counts() 쓰임
train['Sex'].value_counts()
sort = False 옵션을 사용하면 빈도수 순서대로 정렬하지 않는다.
#빈도수 순서대로 정렬하지 않는 옵션 .value_counts(sort = False)
train['Sex'].value_counts(sort = False)
특별히 sort = False로 적용했을 때의 장점은 index순대로 출력한다는 점이다.
그래서 위의 pie_chart()를 정의할 때는 index순서대로 보기 위해서 굳이 sort = False 옵션을 사용한 것 같다.
2-2. .size 함수로 변수 크기를 의미하는 feature_size 변수 정의
# .size 함수로 총 빈도수 정의
feature_size = feature_ratio.size
Pclass_size = train['Pclass'].value_counts(sort = False).size
Pclass_size
굳이 feature_size 변수를 정의한 것은, 해당 변수의 각 클래스에 해당하는 여러 원 그래프를 만들때 활용하고자 함이다.
2-3. .index 함수로 index 정의하는 feature_index 변수 정의
# .index 함수로 인덱스 정의
feature_index = feature_ratio.index
Pclass_index = train['Pclass'].value_counts(sort = False).index
Pclass_index
아까 굳이 sort = False를 해준 이유가 바로 위의 사진처럼 빈도 순대로 출력할 경우 발생할 수 있는 불편함을 방지하기 위해서다.
2-4. 생존자, 사망자 집단 사이에서 각 명목변수의 빈도수 살펴보기 (survived, dead 변수 정의)
# 생존자집단 내에서 명목변수 각 클래스의 빈도수 알아보기
survived = train[train['Survived'] == 1][feature].value_counts() # 생존자
dead = train[train['Survived'] == 0][feature].value_counts() # 사망자
titanic 데이터의 'Survived' 변수는 0이면 사망, 1이면 생존을 뜻한다.
따라서 생존자 집단에 대해서 알아보기 위해 train['Survived'] ==1 이라고 지정을 해주고
feature라는 명목변수에 대한 각 클래스의 빈도 수를 알아보기 위해 train[feature].value_counts() 함수를 사용한다.
survived = train[train['Survived'] == 1]['Sex'].value_counts()
survived
반대로 사망자를 집계해서 각 클래스의 빈도 수를 확인하려면
dead = train[train['Survived'] == 0]['Sex'].value_counts()
dead
survived와 dead의 결과를 비교해보면 생존자 집단에서 여성의 비율이 높고, 사망자 집단에는 남성의 비율이 매우 높음을 확인할 수 있다.
즉, 성별에 따라 생존 여부가 크게 차이난다는 점을 확인했고, 성별을 중요한 변수로 고려할 수 있다.
이렇게 간단한 방법으로 데이터 인사이트를 얻었다.
3. 메인 원 그래프 작성 과정
matplotlib 패키지의 pyplot함수를 plt라고 별칭을 정해주고 진행한다.
import matplotlib.pyplot as plt
3-1. plt의 plot 함수로 평면 지정
# plt.plot() 함수 활용
plt.plot()
plt.plot()을 사용하면 그래프를 그린다.
그래프를 그릴 평면을 지정해주는 함수라고 생각해주면 쉽다.
3-2. plt의 pie 함수로 원 그래프를 그려주기
# plt.pie() 함수로 원 그래프 그리기
plt.plot()
plt.pie(feature_ratio, labels = feature_index, autopct = '%1.1f%%')
plt.title(feature + '\'s ratio in total')
plt.show()
plt.plot()
-> 그래프를 그려라. 근데 그게 어떤 그래프냐면,,
plt.pie(feature_ratio, labels = feature_index, autopct = '%1.1f%%')
-> 아까 지정한 feature_ratio 변수에서 확인한 각 클래스의 빈도수를 바탕으로 원 그래프를 그리고,
각 빈도수의 label(이름)은 아까 지정한 feature_index의 index명을 참고해라.
각 클래스의 백분율은 소수 첫째자리까지 표시하라. 는 뜻이다.
---------------- labels 옵션으로 각 클래스의 이름을 지정해준다.
---------------- autopct 옵션은 각 클래스의 백분율을 표시해준다. (%1.1f%%는 소수 첫째자리까지 표시하라는 뜻이다.)
plt.title(feature + '\'s ratio in total')
->원 그래프의 타이틀은 feature's ratio in total로 하라는 뜻이다.
plt.show()
-> 내가 시킨대로 그린 원 그래프를 보여다오.
Pclass_ratio = train['Pclass'].value_counts(sort = False)
Pclass_size = Pclass_ratio.size
Pclass_index = Pclass_ratio.index
plt.plot()
plt.pie(Pclass_ratio, labels = Pclass_index, autopct = '%1.1f%%')
plt.title('Pclass\'s ratio in total')
plt.show()
※ 참고로 특수문자 '(아퍼스트로피)는 보통 문자열을 감싸서 문자 변수를 입력할 때 쓰이는데, 만약 아퍼스트로피를 문자열에 입력하고자 한다면 아퍼스트로피 앞에 \를 붙이면 된다.
예를 들어, 'she\'s pretty.' 라고 하면 오류없이 문자열 입력이 가능해지고 she's pretty. 가 정상적으로 출력된다.
4. 보조 원 그래프 출력
4-1. for문을 활용해 각 인덱스마다 보조 그래프 그릴 준비
# for문을 활용해 각 인덱스마다 보조그래프 그려주기
for i, index in enumerate(feature_index):
for문에서 여러 변수를 동시에 반복시킬 경우-> for a, b in c: 형태로 a, b를 동시에 반복시킬 수 있다.
enumerate 함수는 여러 자료형을 입력 받으면 인덱스 값과 인덱스명을 포함하는 enumerate 객체를 돌려준다.
# enumerate() 함수 살펴보기
print(enumerate(Sex_index))
print(list(enumerate(Sex_index)))
list로 표현했을 때, 인덱스 값과 인덱스명이 한 객체에 동시에 출력된다.
따라서 for i, index in enumerate(Sex_index): 반복문은 enumerate 객체를 순서대로 하나씩 출력한다.
첫번째 enumerate 객체는 (0, 'female') 이므로 for 반복문에서 첫번째 시행으로 i=0, index = 'female'이 출력되는 것!
두번째 시행에서는 i=1, index = 'male'이 출력된다.
4-2. plt.subplot() 함수로 여러 그래프 동시에 출력
# plt.subplot()으로 하위 그래프 출력
plt.subplot(1, feature_size, i + 1)
plt.pie([survived[index], dead[index]], labels = ['Survived', 'Dead'], autopct = '%1.1f%%')
plt.title(str(index) + '\'s ratio')
plt.show()
subplot(nrows, ncols, index) 함수는 nrows, ncols의 행과 열을 가지는 레이아웃에 index에 해당하는 그래프를 출력한다.
여기서의 index는 1부터 시작한다. (고로, 우리가 지정해준 반복문의 i=0부터 시작하므로 +1을 해줘서 시작값인 1로 맞춰준다.)
plt.subplot(1, feature_size, i + 1)
------------------------->
드디어 위에서 아까 전에 지정해준 feature_size 변수를 사용한다.
1행 feature_size값에 해당하는 수만큼의 열을 가진 레이아웃을 만들어주고 각 열마다 인덱스 값에 해당하는 그래프를 그려준다.
예를 들어, subplot(1, Pclass_size, i + 1)의 경우 -> Pclass_size = 3이므로 1행 3열의 레이아웃에 각각 index = 1부터 3까지 해당하는 그래프를 출력한다.
다음은 plt.pie() 함수로 각 레이아웃에 맞는 원 그래프를 그려준다.
plt.pie([survived[index], dead[index]], labels = ['Survived', 'Dead'], autopct = '%1.1f%%')
(위의 survived, dead 변수는 우리가 만들어준 변수다.)
------------------------->
Embarked 변수를 예로 들자면, 첫번째 인덱스(i = 0일 때) index = 'C'에 해당하는 사람들부터 생존자와 사망자 빈도수로 원 그래프를 그리고, 라벨명은 각각 Survived와 Dead로 지정해준다.
각 도수에 백분율을 소수점 첫째자리까지 표현해준다.
plt.title(str(index) + '\'s ratio') -> 각 원 그래프의 제목을 index명's ratio로 지정해준다.
index변수는 숫자형이거나 object형이므로 str변환을 해줘야한다.
plt.show() -> 그렇게 그린 그래프를 보여다오.
5. 직접 정의한 pie_chart 함수를 사용해보자!
# 직접 정의한 pie_chart() 사용하기
pie_chart('Sex')
pie_chart('Pclass')
pie_chart('Embarked')
각 명목변수의 생존비율을 비교해보자면, 타이타닉 탑승자 중에서
[성별]
남성의 비율이 여성보다 2배에 못 미치게 많았으나, 여성은 생존자 비율이 74.2%로 매우 높고, 남성은 사망자 비율이 80%를 넘으며 여성보다 훨씬 높은 사망자 비율을 보였다.
[등급]
3등석 비중이 절반을 넘고 1, 2등석은 각각 24.2, 20.7%였다.
1등석의 생존률은 63%로 높았고, 2등석은 생존률이 47.3%로 사망자 비율 52.7% 비슷한 편이었다.
3등석의 경우, 사망률이 75.8%로 매우 높았다.
[승선장]
S에 해당하는 Southampton에서 전체 탑승자의 72.4%가 승선했으며, 18.9%가 C에 해당하는 Cherbourg, 8.7%가 Queenstown에서 승선했다.
Southampton과 Queenstown 승선자의 60% 정도가 사망한 반면, Cherbourg 승선자는 55.4%가 생존해, 승선지 별로도 차이가 있는 것으로 보였다.
여기까지 깃허브를 참고하여 파이차트 만드는 코드를 분석하고, 약간의 인사이트를 얻는 법을 알아보았다.
다음은 같은 깃허브에 나온 명목변수에 대한 barplot 만드는 코드를 공부해보려 한다.
'연습장' 카테고리의 다른 글
[Kaggle] 타이타닉 예제 전처리 (0) | 2020.11.09 |
---|---|
[Kaggle] 타이타닉 예제에서 막대그래프로 범주 살펴보기 (0) | 2020.11.07 |
[예제] Python 조건문 심화 예제 4 (세 정수 중 가장 큰 정수 출력) (0) | 2020.08.24 |
[예제] Python 조건문 심화 예제 3 (백화점 이벤트 예제) (0) | 2020.08.24 |
[예제] Python 조건문 심화 예제 2 (if ~ elif ~ else 조건문) (0) | 2020.08.23 |