네이버 블로그로 이전했습니다.
https://blog.naver.com/moongda0404/222729501198
*본 글은 Python3을 이용한 데이터 분석(Data Analysis)을 위한 글입니다.
상관관계 분석을 하는 이유는 데이터가 다른 데이터에 미치는 영향도를 알고, 분석 모델을 위한 데이터를 확정짓기 위함입니다.
이번 글에서는 '타이타닉 승객 정보'를 가지고 상관관계 분석을 해보겠습니다. (자료 출처 : www.kaggle.com/)
우선 타이타닉 승객 정보 csv파일을 다운받아 DataFrame으로 불러내 보겠습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
file_path = './documentum/data/titanic_train.csv'
train_df = pd.read_csv(file_path, sep=',')
train_df
총 916명의 승객에 대한 정보가 나와있습니다.
1. pclass : 티켓 등급
2. survived : 생존 유무(생존=1, 죽음=0)
3. name : 승객 이름
4. sex : 성별
5. age : 나이
6. sibsp : 동승자 수(형제 또는 배우자)
7. parch : 동승자 수(부모 또는 자녀)
8. ticket : 티켓 번호
9. far : 티켓 요금
10. cabin : 선실 번호
11. embarked : 탑승 장소(선착장)
우선 데이터를 정제하기 위해, 결측 값을 측정하겠습니다.
train_df.isnull().sum()
결측 값인 'NaN'이 age, cabin, body, home.dest에서 많이 발생하네요. age는 잠시 보류하고, cabin과 body, home.dest는 이번 분석에서 제외하겠습니다. (생존과 연관이 별로 없다고 여겨지기 때문입니다.)
train_df=train_df.drop(['cabin','body','home.dest'], axis=1)
train_df
그럼 이제 age 중 결측 값을 채워야합니다.
여기서 생각해볼 수 있는 방법은 크게 2가지가 있습니다.
1. 전체 나이의 평균
2. 성별, 이름(Mr, Miss, Mrs)으로 구분하여 평균
여기선 연습을 위해 간단히 전체의 평균으로 진행하겠습니다.
mean=train_df['age'].mean()
num=0
for i in train_df['age'] :
if np.isnan(i) :
train_df['age'][num]=mean
num+=1
train_df['age']
2개의 결측 값을 가진 'embarked'는 연속(continous)성의 값이 아닌, 구분값이기에 가장 큰 값으로 채우겠습니다.
train_df['embarked'].value_counts()
S클래스가 제일 많으니, 2개의 결측값을 S로 채워도 전체에서 비율이 크게 변하지 않을 것입니다.
num=0
for i in train_df['embarked'] :
if type(i)==float :
train_df['embarked'][num]='S'
num+=1
train_df.isnull().sum()
그럼 정제한 데이터를 다시 확인해보니 결측 값은 없어졌네요.
전체 데이터를 다시 확인해봅니다.
간단히 차트로 생존과 각 데이터의 연관관계를 추측해보겠습니다.
lt.rcParams["figure.figsize"] = (20,10)
plt.rcParams['axes.grid'] = True
def bar_chart(feature):
survived = train_df[train_df['survived']==1][feature].value_counts()
dead = train_df[train_df['survived']==0][feature].value_counts()
df = pd.DataFrame([survived,dead])
df.index = ['survived','dead']
df.plot(kind='bar',stacked=True)
'feature' 부분에 각 데이터를 넣으면 'survived'와 'feature'의 관계 차트가 나옵니다.
*등급(pclass)와의 관계
1등석이 다른 등급에 비해 살아남은 비중이 높습니다.
1등석의 위치가 생존에 유리한 곳에 위치함을 추측해볼 수 있습니다.
*성별(sex)와의 관계
남성에 비해 여성이 많이 살아남았습니다.
구조 시, 여성을 우선적으로 구조했을 것이라고 추측할 수 있습니다.
*연령대(age)와의 관계
연령대는 구간별로 측정해야 하기에, 묶어서 그래프를 보겠습니다.
train_df.loc[train_df['age']<=20, 'age']=0
train_df.loc[(train_df['age']<=40)&(train_df['age']>20), 'age']=1
train_df.loc[(train_df['age']<=60)&(train_df['age']>40), 'age']=2
train_df.loc[(train_df['age']<=80)&(train_df['age']>60), 'age']=3
train_df.loc[train_df['age']>80, 'age']=4
0 = 0~20살
1 = 21~40살
2 = 41~60살
3 = 60~80살
4 = 80살 이상
연령대의 경우는 막대그래프로 봤을 때 확연한 차이가 나오지 않습니다.
다만 0~20살의 경우, 생존율이 다른 연령대에 비해 높음을 확인할 수 있습니다.
그럼 각 데이터 간의 상관관계 표를 살펴보겠습니다.
상관관계 중 'pearson'의 상관관계 함수를 사용합니다.
(-1 : 음의 상관관계 / 0 : 상관없음 / 1 : 양의 상관관계)
주의해야 할 점은 모든 데이터가 'continous'해야 한다는 점입니다.
즉 A가 증가, 혹은 감소함에 따라 B도 증가하거나 감소해야 합니다.
그래서 특정 구분 값의 경우, ('a','b','c')와 같은 데이터가 있다면 숫자로 변환하여 값을 비교해야 합니다.
(비록 비교하더라도 의미가 없을 수 있습니다)
우선 데이터를 숫자로 변환합니다.
#문자 데이터의 숫자 변환
train_df.loc[train_df['embarked']=='S', 'embarked']=1
train_df.loc[train_df['embarked']=='C', 'embarked']=2
train_df.loc[train_df['embarked']=='Q', 'embarked']=3
#동승자 데이터 2열을 합함
train_df['family']=train_df['sibsp']+train_df['parch']
train_df=train_df.drop(['sibsp','parch'], axis=1)
pandas의 corr()은 상관관계 측정 함수입니다.
train_df.corr(method='pearson')
*heatmap으로 표시
#heatmap으로 상관관계를 표시
import seaborn as sb
plt.rcParams["figure.figsize"] = (5,5)
sb.heatmap(train_df.corr(),
annot = True, #실제 값 화면에 나타내기
cmap = 'Greens', #색상
vmin = -1, vmax=1 , #컬러차트 영역 -1 ~ +1
)
heatmap을 봤을 때, survived와 pclass의 상관도가 가장 높음을 확인할 수 있습니다.
타이타닉 데이터로는 하기에 어려움이 있지만, 굳이 적용하자면 survived와 pclass의 분석 모델을 진행할 수 있겠습니다.
다음 시간에는 다른 예제를 통해 연관 분석을 진행해보겠습니다.
'데이터 분석 기초 > 분석 기법' 카테고리의 다른 글
[Python Data Analysis 분석 6] 데이터 분석 - 파이썬 선형 회귀분석(1/2) (6) | 2020.06.16 |
---|---|
[Python Data Analysis 분석 5] 데이터 분석 - 파이썬 연관관계 분석(음식 메뉴) (4) | 2020.06.11 |
[Python Data Analysis 분석 3] 데이터 분석 - 식당 데이터 분석해보기(3/3) (2) | 2020.06.08 |
[Python Data Analysis 분석 2] 데이터 분석 - 식당 데이터 분석해보기(2/3) (3) | 2020.06.07 |
[Python Data Analysis 분석 1] 데이터 분석 - 식당 데이터 분석해보기(1/3) (0) | 2020.06.06 |
댓글