본문 바로가기

카테고리 없음

타이타닉 CSV 파일 데이터 분석

python의 판다스 데이터 프레임(pandas DataFrame)을 이용해 타이타닉.csv 파일의 데이터를 분석해보려고 한다.

 

해당 데이터는 Kaggle에서 다운 받을 수 있으며 Jupyter Notebook 을 이용하였다.

 


 

import padans as pd

titanic = pd.read_csv('titanic_dataset.csv')
print(titanic)

위 사진처럼 다운 받은 csv를 출력해준 결과는 다음과 같다.

 

 


총 1308개의 데이터가 담겨있으며,

 

데이터 속성으로는

pclass, survived, name, sex, age, sibsp, parch, ticket, fare, cabin, embarked, boat, body ,home.dest 가 있음을 알 수 있다.

 

Kaggle에 나와있는 정보를 참고해 데이터 속성과 값을 정리해보자면 다음과 같다.


 

Data Dictionary

  • Survived: 0 = No, 1 = Yes
  • pclass: Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd
  • name: Name
  • sex: {'male', 'female'}
  • age: Age
  • sibsp: # of siblings / spouses aboard the Titanic
  • parch: # of parents / children aboard the Titanic
  • ticket: Ticket number
  • cabin: Cabin number
  • embarked: Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton

해당 데이터를 활용해서 타이타닉 CSV 파일 데이터를 분석해보려고 한다.

 

 

 

1. 배에탄 승객들을 title로 구분해보자

 

titanic['title'] = titanic['name'].str.extract(' ([A-Za-z]+)\.', expand=False)
print(titanic['title'].value_counts())

 

# 남자승객이 여자승객보다 약 1.5배 많다 ( Mr > Miss + Mrs )

2. 승객들의 생존자 수와 사망자 수를 pclass 별로 구분해보자

class_1_survived = np.array(list(class_1["survived"].value_counts()))
class_2_survived = np.array(list(class_2["survived"].value_counts()))[::-1]
class_3_survived = np.array(list(class_3["survived"].value_counts()))[::-1]

survival = ["survived","dead"]

plt.bar(range(len(class_1_survived)), class_1_survived, width = 0.5)
plt.bar(range(len(class_2_survived)), class_2_survived, bottom=class_1_survived, width = 0.5)
plt.bar(range(len(class_3_survived)), class_3_survived, bottom=class_1_survived + class_2_survived,width = 0.5)
plt.xticks([i for i, _ in enumerate(survival)], survival)
plt.xticks(rotation=90)
plt.legend([1,2,3], loc = "upper left")
plt.show()

# 생존자는 1등석에 탄 사람이 제일 많고 사망자는 3등석에 탄 사람이 제일 많다.
# 생존자는 2등석보다 3등석이 더 많기에 3등석이 생존률이 높다고 착각할 수도 있지만 3등석의 사망자가 압도적으로 많기에 생존률은 1등석 > 2등석 > 3등석이 된다.
# 즉 , 좋은 좌석에 탄 사람일수록 생존률이 높다.

# 사망자수와 생존자수를 합한 수치는 탑승자 수를 의미한다.
# 따라서, 탑승자 수는 3등석이 제일 많으며 2등석과 1등석은 비슷하다.

 


3. 승객들의 생존자수와 사망자 수를 연령대로 구별해보자

  • 0: 0  age << 20
  • 20: 20  age << 40
  • 40: 40  age << 60
  • 60: 60  age << 80
  • 80: 80  age
age_20 = titanic[titanic["age"]<20]["survived"].value_counts()[::-1]
age_40 = titanic[titanic["age"]<40]["survived"].value_counts()[::-1]
age_60 = titanic[titanic["age"]<60]["survived"].value_counts()[::-1]
age_80 = titanic[titanic["age"]<80]["survived"].value_counts()[::-1]
age_over_80 = titanic[titanic["age"]>=80]["survived"].value_counts()[::-1]

survival = ["survived","dead"]

plt.bar(range(len(age_20)), age_20, width = 0.5)
plt.bar(range(len(age_40-age_20)), age_40-age_20, bottom=age_20, width = 0.5)
plt.bar(range(len(age_60-age_40)), age_60-age_40, bottom=age_20 + age_40-age_20 , width = 0.5)
plt.bar(range(len(age_80-age_60)), age_80-age_60, bottom=age_20 + age_40-age_20 + age_60-age_40 , width = 0.5)
plt.bar(range(len(age_over_80)), age_over_80, bottom=age_20 + age_40-age_20 + age_60-age_40 + age_80-age_60 , width = 0.5)
plt.xticks([i for i, _ in enumerate(survival)], survival)
plt.xticks(rotation=90)
plt.legend([0.0,20.0,40.0,60.0,80.0], loc = "lower center")
plt.show()

 

# 생존자 수와 사망자 수를 합한 값은 탑승자 수를 의미한다.
# 20~40 연령대가 가장 많이 탑승했으며 40~60 연령대와 0~20 연령대의 탑승자수는 비슷하며 80대 이상의 탑승자수는 거의 없다.
# 탑승자 수 : 20~40 > 40~60 = 0~20 > 60~80 > 80~

위의 예시처럼 pandas의 DataFrame을 이용하면 CSV 데이터 내의 다양한 데이터들을 추출해 낼 수 있다.