이전 포스트
2023.01.09 - [Kaggle/타이타닉] - 타이타닉 생존자 예측 분석 (3-1) 전처리 (나이예측) - v.1.0.1
타이타닉 생존자 예측 분석 (3-1) 전처리 (나이예측) - v.1.0.1
이전 포스트 2023.01.09 - [분류 전체보기] - 타이타닉 생존자 예측 분석 (2-3) EDA(상관관계 및 기타) - v.1.0.1 타이타닉 생존자 예측 분석 (2-3) EDA(상관관계 및 기타) - v.1.0.1 이전 포스트 타이타닉 생존
drewvvv.tistory.com
1. 데이터 정리
주어진 데이터 셋을 모델링하기 이전에 테스트를 진행할 test셋 또한 데이터 정제가 필요하다.
따라 이전 포스트들에서 했던 내용들 중 코드만 모아서 train과 test 각 데이터셋을 처음부터 다시 정리하도록 한다.
|
1
2
3
4
5
6
7
8
9
10
11
12
|
train = pd.read_csv("../input/train.csv")
test = pd.read_csv("../input/test.csv")
gender = pd.read_csv("../input/gender_submission.csv")
dfs = {
'train': {
'data' : train
},
'test': {
'data' : test
}
}
|
cs |
- 우선 데이터 셋을 새로 다시 불러온다.
- 이후 dict를 생성하여 object로 관리한다.
1. 나이 범주화
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
for dfName in dfs.keys():
for index, item in enumerate(dfs[dfName]['data']['Age']):
if item < 10:
result = 0
elif item >= 10 and item < 20:
result = 1
elif item >= 20 and item < 30:
result = 2
elif item >= 30 and item < 40:
result = 3
elif item >= 40 and item < 50:
result = 4
elif item >= 50 and item < 60:
result = 5
elif item >= 60 and item < 70:
result = 6
elif item >= 70 and item <= 80:
result = 7
elif item > 80 and item < 90:
result = 8
else:
result = 99
dfs[dfName]['data'].loc[index, 'ca_Age'] = result
|
cs |
2. 성별,탑승지,존칭,성 범주화
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
for dfName in dfs.keys():
df = dfs[dfName]['data']
# 성별 범주화
df.loc[ df['Sex'] == 'male', 'ca_Sex'] = 0
df.loc[ df['Sex'] == 'female', 'ca_Sex'] = 1
# 탑승지 범주화
df.loc[ df['Embarked'] == 'C', 'ca_Embarked'] = 0
df.loc[ df['Embarked'] == 'Q', 'ca_Embarked'] = 1
df.loc[ df['Embarked'] == 'S', 'ca_Embarked'] = 2
# 존칭, 성 출력
df['designation'] = df['Name'].str.extract(' (\w*)\.')
df['lastName'] = df['Name'].str.extract('\.+ \(?([\w]*)')
encoder = LabelEncoder()
encoder.fit(df['designation'])
labels = encoder.transform(df['designation'])
df['ca_designation'] = labels
|
cs |
- 보기 쉽게 하기 위해 for문을 나눠서 사용했다.
3. 나이 대체
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
for dfName in dfs.keys():
gTrain = dfs[dfName]['data'].groupby(['designation', 'Sex', 'Pclass', 'SibSp', 'Parch'])
# gTrain.describe()[['Age','Survived']]
dfs[dfName]['gAge'] = gTrain.describe()['Age']
gAge = dfs[dfName]['gAge']
for item in dfs[dfName]['data'].iterrows():
temp = item[1]
guessAge = gAge.loc[temp['designation'],
temp['Sex'],
temp['Pclass'],
temp['SibSp'],
temp['Parch']]
if (math.isnan(guessAge['mean'])):
guessAge = gAge.loc[temp['designation'],
temp['Sex']].mean()
# 테스트셋에 예측한 카테고리별 평균이 없는 경우 트레인셋에서 카테고리의 평균을 사용 if (math.isnan(guessAge['mean'])):
guessAge = dfs['train']['gAge'].loc[temp['designation'],
temp['Sex']].mean()
dfs[dfName]['data'].loc[item[0], 'guessAgeMean'] = round(guessAge['mean'], 2)
dfs[dfName]['data'].loc[item[0], 'guessAgeMedian'] = round(guessAge['50%'], 2)
|
cs |
- 평균으로 대체하려했지만 테스트셋에 예측한 카테고리별 평균이 없는 경우 트레인셋에서의 카테고리로 평균을 대체 사용하였다.

- 파생변수의 결측치가 없음을 확인하고
- 기존 나이와 요금을 결측치 처리할 예정이다.
|
1
2
3
4
5
6
|
for dfName in dfs.keys():
df = dfs[dfName]['data']
for index, item in enumerate(df['Age']):
if(math.isnan(item)):
df.loc[index, 'Age'] = df.loc[index, 'guessAgeMean']
|
cs |
- 나이 중 결측치 대체
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
for dfName in dfs.keys():
df = dfs[dfName]['data']
for index, item in enumerate(df['ca_Age']):
if(item == 99):
age = df.loc[index, 'Age']
if age < 10:
result = 0
elif age >= 10 and age < 20:
result = 1
elif age >= 20 and age < 30:
result = 2
elif age >= 30 and age < 40:
result = 3
elif age >= 40 and age < 50:
result = 4
elif age >= 50 and age < 60:
result = 5
elif age >= 60 and age < 70:
result = 6
elif age >= 70 and age <= 80:
result = 7
elif age > 80 and age < 90:
result = 8
df.loc[index, 'ca_Age'] = result
|
cs |
- 범주화한 나이에 결측치를 99로 처리했던 값들을 다시 새로 범주화한다.
4. 다른 컬럼의 결측치 처리
|
1
2
3
4
|
dfs['train']['data']['Embarked'].fillna("S", inplace=True)
dfs['train']['data']['ca_Embarked'].fillna("2", inplace=True)
test.loc[test['Fare'].isna(), 'Fare'] = test['Fare'].median()
|
cs |
- train 데이터셋과 test 데이터셋에 있는 각각의 결측치를 최빈값과 중앙값으로 대체한다.

- 결측치를 다시 한번 확인한 후
5. 내보내기

- Cabin 컬럼을 drop하고 noNa_train.csv, noNa_test.csv로 저장한다.
다음 포스트
2023.01.18 - [Kaggle/타이타닉] - 타이타닉 생존자 예측 분석 (3-3) 데이터 인코딩 - v.1.0.1
타이타닉 생존자 예측 분석 (3-3) 데이터 인코딩 - v.1.0.1
이전 포스트 2023.01.12 - [분류 전체보기] - 타이타닉 생존자 예측 분석 (3-2) 데이터 정리 - v.1.0.1 타이타닉 생존자 예측 분석 (3-2) 데이터 정리 - v.1.0.1 이전 포스트 2023.01.09 - [Kaggle/타이타닉] - 타이
drewvvv.tistory.com
'Kaggle > 타이타닉' 카테고리의 다른 글
| 타이타닉 생존자 예측 분석 (3-3) 데이터 인코딩 - v.1.0.1 (4) | 2023.01.18 |
|---|---|
| 타이타닉 생존자 예측 분석 (3-1) 전처리 (나이예측) - v.1.0.1 (0) | 2023.01.09 |
| 타이타닉 생존자 예측 분석 (2-3) EDA(상관관계 및 기타) - v.1.0.1 (0) | 2023.01.09 |
| 타이타닉 생존자 예측 분석 (2-2) EDA(연령대별) - v.1.0.1 (0) | 2023.01.05 |
| 타이타닉 생존자 예측 분석 (2-1) EDA(성별) v.1.0.1 (0) | 2023.01.04 |
| 타이타닉 생존자 예측 분석 (1) 개요 (0) | 2023.01.04 |