728x90
반응형

1. EDA(탐색적 분석을 진행하자!)

 

우선 타이타닉 데이터에 대해 살펴보자!

 

1> 생존자 파악하기

def write_percent(ax , total_size):
    '''도형 객체를 순회하며 막대 상단에 타깃값 비율 표시'''
    for patch in ax.patches:
        height = patch.get_height() # 도형 높이(데이터 개수)
        width = patch.get_width() # 도형 너비
        left_coord = patch.get_x() # 도형 왼쪽 테두리의 x축 위치
        percent = height/total_size*100 # 타깃값 비율


        # (x, y) 좌표에 텍스트 입력
        ax.text(x= left_coord + width/2.0 ,   # x축 위치
                y = height + total_size*0.001, #y축 위치
                s = f'{percent : 1.1f}%', # 입력 텍스트
                ha = 'center') #가운데 정렬



plt.figure(figsize=(7,6))
train_bin['Survival'] = train['Survived'].map({0: '사망', 1: '생존'})
ax = sns.countplot(x='Survival' , data = train_bin)
write_percent(ax , len(train)) # 비율 표시
ax.set_title('타이타닉 호 생존자')

생존자 비율

==> 사망자의 비율이 61.6% , 생존자의 비율이 38.4% 이다.

 

 

2> 피쳐별 _ 생존자 파악하기_2

# 3행 2열
mpl.rc('font' , size = 12)
grid = gridspec.GridSpec(3,2) # 그래프(서브플롯)을 3행 2열로 배치
plt.figure(figsize=(15,16)) # 전체 Figure 크기 설정
plt.subplots_adjust(wspace= 0.4 , hspace= 0.3) # 서브플롯 간 좌우/상하 여백 설정

# 서브플롯 그리기# 피처 목록

for idx, feature in enumerate(train_bin2.columns.tolist()) :

    ax = plt.subplot(grid[idx])

    # ax 축에 타깃값 분포 카운트플롯 그리기
    sns.countplot(x=feature , data = train_bin2 , hue = 'Survival' , palette = 'pastel' , ax= ax)
    # hue는 세부적으로 나눠 그릴 기준 피처, 여기서는 타깃값(target)을 전달했다.
    ax.set_title(f'{feature} 타이타닉호 생존자') # 그래프 제목 설정
    write_percent(ax, len(train_bin2))



# binary_col은 2진 피처가 아니다. 명목형 피처라 해도 될거 같다.

피쳐별 생존자 비율 확인

 

1> Pclass : 3등급에 해당하는 인원의 사망율이 높다! ==> MinMaxScaler() 활용해도 좋을듯 싶다.

 

2> SibSp : 함께 탑승한 형제 또는 배우자 수 ==> 0 일수록 사망률 높다!

 

3> parch : 함께 탑승한 부모 또는 자녀 수 ==> 0 일수록 사망률 높다!

 

4> Fare_binned  : Fare에 대해 Log화 한 후 범위화 ==> Fare의 값이 적을 수록 사망률이 높다! 

 

5> Age_Categorical : Age에 대해 10단위로 쪼개기 ==> 20대의 사망률이 높다!

 

3> 피쳐별 ('Cabin') 생존자 파악하기_3

all_data['Cabin'] = all_data['Cabin'].fillna('X')

all_data['Cabin'] = all_data['Cabin'].apply(lambda x: x[0])

all_data['Cabin'] = all_data['Cabin'].replace({'G':'X', 'T':'X'})

ax = sns.countplot(x='Cabin',  hue = 'Survived' , data = all_data)
plt.show()

==> NaN 값에 대해 'X' 로 처리

 

==> Cabin의 맨 앞 글자만 처리 하기

 

==> Cabin의 X 의경우 사망률이 높다!!!!

 

4> 피쳐별 ('Embarked') 생존자 파악하기_4

ax = sns.countplot(x='Embarked',  hue = 'Survived' , data = all_data)
plt.show()

embarked(출발지)

==> S에서 출발한 사람들의 사망률이 높다!!!

 

5> 피쳐별 ('Name') 생존자 파악하기_5

ax = sns.countplot(x='Name',  hue = 'Survived' , data = all_data)
plt.show()

Name

==> 'Mr' 의 존함을 가진 사람들의 사망률이 높았다.

 

 

5-1> Name 전처리 하기

Name 열

==> Name을 보면 처음 성, 존함. 이름 의 양식

 

 

all_data["Name"].str.split(",|\\.")

==> split(",|\\.")의 의미 ==> ',' 을 기준으로 나누고 , '.' 이 마지막에 나오는 것으로 나누기

all_data["Occupation"] = all_data["Name"].str.split(",|\\.").str[1].str.strip()

# 직업 정보를 출력합니다.
print(all_data["Occupation"])

Name 양식

occupation_counts = all_data["Occupation"].value_counts()

a = pd.concat([occupation_counts] , axis = 1)
a = a.reset_index()
a

존함별 숫자

t = a["index"].to_numpy().tolist()[:6]
t

all_data['Name'] = all_data['Name'].apply(lambda x: 'baby' if x not in t else x)
all_data

t= ['Mr', 'Miss', 'Mrs', 'Master', 'Dr', 'Rev']

 

t값에 없는 나머지 것들 그냥 'baby' 로 퉁친다! ==> 'others' 로 해도 괜찮다!

 

 

6> 피쳐별 ('Fare' , 'Embarked') 생존자 파악하기_6

all_data['Embarked'] = all_data['Embarked'].fillna(all_data['Embarked'].mode().iloc[0])

fare_medians = all_data[all_data['Fare'] != 0].groupby('Pclass')['Fare'].median()
# fare_medians
# Fare 값이 0인 데이터를 PClass 등급에 따라 중앙값으로 채우기
for i, row in all_data.iterrows():
    if row['Fare'] == 0 or row['Fare'] == 'NaN':
        all_data.at[i, 'Fare'] = fare_medians[row['Pclass']]
all_data['Fare'] = all_data['Fare'].fillna(all_data['Fare'].mode().iloc[0])
# 결과 확인
all_data.loc[816:824]
all_data.drop('Occupation', axis=1, inplace=True)

all_data

==> 'Embarked' 의 NaN 값에 대해 최빈값으로 처리를 해준다!

 

==> 'Fare' 가 0인 값에 대해 Pclass로 Grouping 해주고, 그에대한 중앙값으로 채워준다!(평균값 보다 중앙값으로 해주는것이 이상값에 영향을 덜 받기 때문!)

 

all_data.info()

==> 이제 'AGE' 열에 대한 NULL 값 전처리를 해주면 될거 같다! ==> 300여개가 Null값이라 최빈값, 중앙값으로 처리하면 성능이 떨어질것이다! ==> 이를 선형회귀로 AGE값을 전처리 해주자!

 

 

 

-1 편 끝-

 

다음 편은 'Age' 전처리!!!

 

https://knowallworld.tistory.com/442

 

[LightGBM활용_Kaggle-타이타닉-02] 피처별 전처리하기

1. 피처별 전처리하기! 1. 'AGE' 열의 Null 값에 대한 전처리 하기 binary_col = [] object_col = [] for i in all_data.columns.tolist(): if all_data[i].dtype in ['int64' , 'float64']: binary_col.append(i) else: object_col.append(i) ==> 우선

knowallworld.tistory.com

 

728x90
반응형

+ Recent posts