성별(sex) 인원수, 나이별(age) 인원수, 선실별(class) 인원수, 사망/생존(alive) 인원수를 구하라.
전체의 평균나이, 여성승객의 평균나이, 1등실선실/여성의 평균나이
# csv 파일 읽기
import pandas as pd
import numpy as np
import seaborn as sns
df = sns.load_dataset('titanic')
df.head()
# 성별 인원 수
print('성별\n', df['sex'].value_counts(), '\n')
성별
male 577
female 314
# 나이 별 인원 수
age_cnt = df['age'].value_counts()
print('나이 사람수')
for age, cnt in age_cnt.items():
print(f'{age:7.2f}: {cnt}')
# 선실 별 인원 수
print('선실 별 인원 수:')
pclass_cnt = df['pclass'].value_counts()
for pclass, cnt in pclass_cnt.items():
print(f'{pclass}등실: {cnt}')
선실 별 인원 수:
3등실: 491
1등실: 216
2등실: 184
# 사망/생존 인원 수
print('사망/생존 인원 수')
survived_cnt = df['survived'].value_counts()
for survived, cnt in survived_cnt.items():
print(f'{"생존" if survived else "사망"}: {cnt}')
사망/생존 인원 수
사망: 549
생존: 342
# 전체 평균 나이
avg_age = df['age'].dropna().mean()
print(f'전체 평균 나이: {avg_age:.1f} 세')
전체 평균 나이: 29.7 세
# 여성 승객의 평균 나이
female_age = df[df['sex']=='female']['age'].dropna() #dropna():NaN 행은 제거
avg_female_age = female_age.mean()
print(f'여성 승객 평균 나이: {avg_female_age:.1f} 세')
여성 승객 평균 나이: 27.9 세
# 1등석 선실 여성의 평균 나이
female1c_age = df[(df['sex']=='female') & (df['pclass']==1)]['age'].dropna()
avg_female1c_age = female1c_age.mean()
print(f'1등석 여성 승객 평균 나이: {avg_female1c_age:.1f} 세')
1등석 여성 승객 평균 나이: 34.6 세
bins = [1, 20, 30, 50, 70, 100]
labels = ['미성년자', '청년', '중년', '장년', '노년']
categories = pd.cut(df['age'], bins, labels=labels) #'age' 데이터를 그룹으로 나누기
age_categories = categories.value_counts().sort_index() #index를 기준으로 열(col) 값 정렬
sum_passengers = sum(age_categories.values) #각 그룹의 승객 수를 다 합함. = 전체 승객 수
check_calc = 0.0 #비율의 전체 합이 1인지 확인
for cate, cnt in age_categories.items():
p = cnt / sum_passengers #(해당 그룹 승객 수) / (전체 승객 수)
check_calc += p
print(f'{cate:5s}:\t{cnt}\t{p * 100:.2f} %')
print(f'합계: {check_calc * 100.0:.2f} %')
미성년자 : 165 23.57 %
청년 : 230 32.86 %
중년 : 241 34.43 %
장년 : 59 8.43 %
노년 : 5 0.71 %
합계: 100.00 %
bins2 = bins[1:] #[20, 30, 50, 70, 100]
labels2 = labels[1:] #['청년', '중년', '장년', '노년']
df['category3'] = categories #categories:'age' 데이터를 그룹으로 나눈 상태
df['category3'] = df.apply(lambda x: '' if np.isnan(x.age)
else x.category3 if x.age < 20
else f'{x.category3} 남성' if x.sex == 'male'
else f'{x.category3} 여성', axis=1)
df