빅데이터 김교수의 "AI노마드연구소" AI로 열어가는 노마드 세상!

빅데이터 김교수의 "AI노마드연구소" AI로 열어가는 노마드 세상입니다. AI 코딩작성, SNS 분석, AI업무자동화 컨설팅 0507-1419-0222

자세히보기

교육/파이썬빅데이터분석교육

[파이썬통계분석]타이타닉호 침몰의 비밀, 1등석 고객의 생존가능성은?

빅데이터 김교수 2022. 7. 11. 14:56

출처 : 하늘문화

 타이타닉호의 탑승한 승객이 1 등석과 3등석중 어떤 그룹의 생존율이 높았을까요?  

   한번쯤 생각해 보셨나요? 타이타닉 고객중 1등석 고객이 오래 생존했을까요? 아님 3등석 고객이 많이 생존했을까요? 파이썬으로 타이타닉호에 승선한 고객데이터를 기준으로 분석해 보겠습니다. 

 이 문제를 풀기위해서는 원인과 결과의 측면이 아니라 상관관계, 즉 여러 변수간의 관계를 찾아네는 것이 중요합니다. 

출처 : 위키백과

 

3. 데이터 수집

4. 데이터 준비

우선 준비물로 타이타닉호 탐승고객 정보를 활요하도록 합니다. 

 탑승 고객의 정보는 다음과 같은 열로 구성됩니다.  준비된 자료에서 상관관계는 종속변수인 생존여부(survived)와 pclass(탑승 등석)classs,  age(나이), sibsp(동석가족수), parch(부양가족수) 등 독립변수 정보로 구성되어 있다.

titanic.xlsx
0.06MB
titanic.csv
0.05MB

import seaborn as sns
import pandas as pd
titanic = sns.load_dataset("titanic")
titanic.to_csv('/content/drive/MyDrive/Colab Notebooks/titanic.csv', index = False)
# 결측치값 대체하기
titanic['age'] = titanic['age'].fillna(titanic['age'].median())    # 타이타닉(나이).중앙값로 치환)

# 결측치 채우고 확인하기
titanic.isnull().sum()
titanic['age'] = titanic['age'].fillna(titanic['age'].median()) # 나이결측값 채우기
titanic['embarked'].value_counts() 
titanic['embarked'] = titanic['embarked'].fillna('S') # 최빈값으로 채우기
titanic['embark_town'].value_counts()
titanic['embark_town'] = titanic['embark_town'].fillna('Southampton')
titanic['deck'].value_counts()
titanic['deck'] = titanic['deck'].fillna('C')

titanic.isnull().sum() # 최종 결측치 확인
데이터 수집 준비물
1. 파이썬 seaborn 라이브러리
2. 타이타닉 데이터 

데이터 준비 가공
- 격측치 치환 : 중앙값 치환, 최빈값 치환

데이터 탐색
1. 정보확인 : info()
2. 차트를 통한 데이터 탐색 : pie(), countplot()

데이터 모델링
1. 모든 변수 간 상관 계수구하기
2. 지정한 두 변수 간 상관계수 구하기(생존률 - 탑승 등석)

 

 5. 데이터 탐색

5.1 데이터의 기본 정보 탐색하기

titanic.info()  # 기본 정보 확인

titanic.survived.value_counts() # 생존자 수 확인하기

5.2 차트를 그려 데이터를 시각적으로 탐색하기

- 남여 생존률 파이차트 

f,ax = plt.subplots(1, 2, figsize = (10, 5))

titanic['survived'][titanic['sex'] == 'male'].value_counts().plot.pie(explode = [0,0.1], autopct = '%1.1f%%', ax = ax[0], shadow = True)
titanic['survived'][titanic['sex'] == 'female'].value_counts().plot.pie(explode = [0,0.1], autopct = '%1.1f%%', ax = ax[1], shadow = True)
ax[0].set_title('Survived (Male)')
ax[1].set_title('Survived (Female)')

plt.show()

pie 차트 문법 : https://www.w3schools.com/python/matplotlib_pie_charts.asp

 

Matplotlib Pie Charts

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

- 남녀생존자수 차트로 나타내기

sns.countplot('pclass', hue = 'survived', data = titanic)
plt.title('Pclass vs Survived')
plt.show()

6. 데이터 모델링

6.1 상관분석을 위한 상관계수를 구하고 저장하기

 1) 상관관계란 ?

어떤 한 통계적 변인[1]과 다른 여러 통계적 변인들이 공변(共變)하는 함수관계를 말한다.
쉽게 말해서, 변인 x 가 갑자기 확 증가하자 변인 y 도 동시에 확 증가하고, 이후에 변인 x 가 감소하자 변인 y 도 동시에 감소한다면, x 와 y 사이에는 상관관계가 존재한다고 말할 수 있다. 반대로, 변인 x 와 y 가 정반대 방향으로 움직인다 해도, 즉 x 가 증가하면 y 는 감소하고 x 가 감소하면 y 는 증가하는 방식이라도, 이것 역시 상관관계라고 말할 수 있게 된다. 입문자용 통계학 책에서 흔히 예로 드는 것이 '키'와 '발바닥의 넓이'의 관계다.(나무위키)

 둘 이상의 변인들이 "같은 방향으로"[2] 움직이는 것을 양(+)의 상관이라고 하고, "반대 방향으로" 움직이는 것을 음(-)의 상관이라고 한다. 임의로 갖다 붙인 게 아니라 실제로 상관을 그래프로 그리면 같은 방향은 양의 기울기를, 다른 방향이면 음의 기울기를 갖는다. 만일 두 변인이 제멋대로 움직이면서 따로 놀고 있다면 이는 상관관계가 존재하지 않는다는 의미이다. 선형의 상관관계는 주로 일차함수의 식으로 나타내어질 수 있다.

 

 본 예제에서는 상관관계는 2개 변수(객실등급-생존율)가 선형적 관계가 있는지(상수 비율에서 함께 변경됨을 의미함) 분석한다. 원인과 결과에 관한 표현 없이 간단한 관계를 설명하는 일반적인 도구입니다.

2) 피어슨 상관계수

  • 칼 피어슨(Karl Pearson)이 개발한 상관계수
  • 적률상관계수(product-moment correlation coefficient)라고도 함
  • 일반적으로 상관계수라고 하면 피어슨 상관계수를 말함
titanic_corr = titanic.corr(method = 'pearson')

titanic_corr

 

3) 상관관계 종류 ?

 

 - 단순상관

 두 변수가 어는 정도 강한 관계에 있는지 측정(객실등급 - 생존율)

 - 다중상관

  세 개 이상의 변수 간 관계의 강도를 측정한다. 이때 다른 변수와의 관계를 고정하고 두 변수 간 관계의 강도를 나타내는 것을 편상관분석이라 한다.

 

6.2 상관계수 확인하기

 상관관계의 정도... 계수 ρ(로) -1에서 +1사이 값을 가진다. 양의 상관, 음의 상관

 적용)  스피어만 상관계수(Spearman correlation coefficient), 크론바흐의 알파(Cronbach's alpha) 같은 것들이 있지만 압도적으로 많이 쓰이는 것은 단연 피어슨 상관 계수(Pearson correlation coefficient, Pearson r)라고 할 수 있다.

  •  0.0 ~ 0.2 : 상관성이 거의 없다. 
  • 0.4 ~ 0.6 : 상관관계가 있다. 
  • 0.8 ~1.0 : 매우 강한 상관관계가 있다.  

참고(그리스문자) : https://ko.wikipedia.org/wiki/%CE%A1

 

 
상관계수는 모집단의 상관계수를 구하는 방법이 있고, 표본을 통해서 모집단을 추정하는 방법 2가지가 있다 .

 

모집단 상관계수

 

표본 상관계수 (sample correlation coefficient)

 

 

- 판다스 데이터프레임의 corr함수로 상관계수(correlation-coefficient) 구하기 

titanic_corr.to_csv('/content/drive/MyDrive/Colab Notebooks/titanic_corr.csv', index = False)

6.3 특정 변수 사이의 상관계수 구하기

titanic['survived'].corr(titanic['adult_male'])

titanic['survived'].corr(titanic['fare'])

6.3 특정 변수 사이의 상관계수 구하기

titanic['survived'].corr(titanic['adult_male'])
titanic['survived'].corr(titanic['fare'])

7. 상관관계 결과 시각화

  - 산점도나 히트맵을 주로 사용

 참고 : 산점도(https://ko.wikipedia.org/wiki/%EC%82%B0%EC%A0%90%EB%8F%84)

 

산점도 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

참고 : 히트맵(https://ko.wikipedia.org/wiki/%ED%9E%88%ED%8A%B8_%EB%A7%B5)

 

 

7.1 산점도로 상관 분석 시각화하기

sns.pairplot(titanic, hue = 'survived')

plt.show()

7.2 두 변수의 상관관계 시각화하기

 

객실 등급과 생존의 상관관계를 seaborn 패키지의 catplot으로 시각화

문법 참고 : https://www.w3schools.com/python/numpy/numpy_random_seaborn.asp

sns.catplot(x = 'pclass', y = 'survived', hue = 'sex', data = titanic, kind = 'point')

plt.show()

7.3 변수 사이의 상관 계수를 히트맵으로 시각화하기

def category_age(x):
    if x < 10:
        return 0
    elif x < 20:
        return 1
    elif x < 30:
        return 2
    elif x < 40:
        return 3
    elif x < 50:
        return 4
    elif x < 60:
        return 5
    elif x < 70:
        return 6
    else:
        return 7