Pandas 정복기 [2]
데이터 핸들링을 위한 필수 라이브러리 Pandas
!kaggle competitions download -c titanic
age=df['Age']
age.describe()
describe() 함수를 이용해서 간단하게 보면 타이타닉 나이대에 대한 통계를 확인할 수 있습니다. 직접 확인해 보겠습니다
print('중앙값: ',age.median())
print('최빈수값: ',age.mode())
print('최솟값: ',age.min())
print('최댓값: ',age.max())
print('분산: ',age.var())
print('표준편차: ',age.std())
print('합계: ',age.sum())
print('백분위수 중 0.5: ',age.quantile(0.5))
위의 describe()함수를 사용했던 결과값과 동일한 것을 확인할 수 있습니다.
누적 통계(Cumulative statistics)
-
.cummax() .cummin().cumprod()
df.head()
Pclass에 대해서 한 번 실습을 진행해보겠습니다.
df['Pclass'].value_counts()
df['Pclass'].value_counts(sort=True)
df['Pclass'].value_counts(normalize=True)
결과를 보다시피 기본적으로 정렬이 되어있으며 normalize 옵션을 True로 해줄 경우 개수가 아닌 0~1 사이의 값으로 변환된 것을 확인할 수 있습니다.
Pclass ==3 은 전체 중 55.1%를 차지하고 있습니다
gb_class=df.groupby('Pclass')
그룹만 만들었다고 바로 볼 수 없습니다.
for key, group in gb_class:
print("* key", key)
print("* count", len(group))
print(group.head())
print('\n')
여기서 각 그룹의 정보를 가져올려면 get_group() 함수를 사용하면 됩니다
gb_class.get_group(1).head()
위에서 말씀드린 것처럼 그룹화 이후 통계함수를 사용할 수 있다고 했는데 바로 사용해보도록 하겠습니다
gb_class.mean()
df.groupby('Pclass')['SibSp'].agg([min, max, sum])
위 코드는 Pclass를 기준으로 형제자매 수에 대해 min, max, sum 함수를 사용한 것입니다.
3가지 클래스 모두 최솟값은 0이며 Plcass 3의 최댓값이 8인 것을 확인할 수 있습니다. 또한 sum 함수의 결과로 클래스 3에 가장 많은 사람이 몰려 있는 것을 확인할 수 있습니다.
추가로 groupby를 할 때 기준 열을 두 개로도 지정이 가능합니다.
df.groupby(['Pclass','Sex']).mean()
이렇게 두 가지 기준열을 넣음으로써 클래스별 남녀에 따른 값을 확인할 수 있습니다.
생존에 대해 봤을 때 클래스 1, 2의 여자 생존률은 매우 높은 반면 남자는 매우 낮은 것을 확인할 수 있습니다. 그리고 아까 클래스 3에 사람이 많다고 했었죠? 클래스 3의 여자 생존률은 왜 1, 2에 비해 낮은지도 확인해 볼 필요가 있습니다
df.groupby('Pclass').mean()
df.pivot_table(index='Pclass', aggfunc=np.mean)
열의 순서가 좀 다르긴 하지만 내용은 두 가지 모두 같습니다.
Group by 함수 결과와 똑같이 만드는 것을 연습해 보신다면 도움이 많이 될 것 같습니다
df.groupby(['Pclass','Sex']).mean()
df.pivot_table(index=['Pclass','Sex'], aggfunc=np.mean)
여기서 조금 더 추가해서 나이에 대해 깊게 파보겠습니다
df.pivot_table(index=['Pclass','Sex'], values='Age',aggfunc=[np.mean, np.max, np.min])
df.pivot_table(index='Sex', columns='Pclass', values='Survived', aggfunc=np.mean)
추가 옵션이 두 가지 있습니다
-
fill_value margins=True
fill_value는 결측값을 대체해주는 역할을 합니다 fill_value=0으로 두신 다면 결측값들은 0으로 대체 됩니다.
margins는 마지막에 전체 집계결과를 보여줍니다.
df.pivot_table(index='Sex', columns='Pclass', values='Survived', aggfunc=np.mean, margins=True)