이전 포스트

 

 


 

 

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

 
 
 
 
 
 
 
 
 
 
 

+ Recent posts