[LightGBM활용_Kaggle-타이타닉-01] EDA 및 전처리하기
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()
==> S에서 출발한 사람들의 사망률이 높다!!!
5> 피쳐별 ('Name') 생존자 파악하기_5
ax = sns.countplot(x='Name', hue = 'Survived' , data = all_data)
plt.show()
==> 'Mr' 의 존함을 가진 사람들의 사망률이 높았다.
5-1> Name 전처리 하기
==> Name을 보면 처음 성, 존함. 이름 의 양식
all_data["Name"].str.split(",|\\.")
==> split(",|\\.")의 의미 ==> ',' 을 기준으로 나누고 , '.' 이 마지막에 나오는 것으로 나누기
all_data["Occupation"] = all_data["Name"].str.split(",|\\.").str[1].str.strip()
# 직업 정보를 출력합니다.
print(all_data["Occupation"])
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' 카테고리의 다른 글
[LightGBM활용_Kaggle-타이타닉-04] 모델 돌려보기(단독_ Descision Tree) (0) | 2023.05.23 |
---|---|
[LightGBM활용_Kaggle-타이타닉-03] 피처별 전처리하기★pd.cut (0) | 2023.05.20 |
[LightGBM활용_Kaggle-타이타닉-02] 피처별 전처리하기 (1) | 2023.05.20 |
[PYTHON - 머신러닝_LightGBM-02]랜덤 그리드 서치★L1정규화★L2정규화★LGBMClassifer()와 train()의 차이 (0) | 2023.01.27 |
[PYTHON - 머신러닝_LightGBM]★geopy.distance이용한 거리계산★groupby★agg활용한 통계계산★time 라이브러리★민감도, ROC곡선★ (0) | 2023.01.27 |