Study/Data Analysis

[DACON] 중고차 가격 예측 경진대회 (1)

ChoiSenn 2022. 7. 6. 18:48

 

 

 

 

데이콘의 중고차 가격 예측 경진대회에 참가한 파이썬 코드

 

 

목표 설정 : XGBoost를 이용하여 데이터 분석 및 중고차 가격 예측을 진행한다.

- 데이콘에 기본적으로 제시된 EDA, Baseline 코드를 활용하여 결측치 제거 및 데이터 전처리를 하고, XGBoost라는 Boosting 앙상블 기법을 이용하여 모델링, 튜닝 및 데이터 예측을 한다.

- XGBoost 알고리즘을 사용해보고 하이퍼파라미터를 조정하여 정확도를 높이는 작업 경험이 목표였다.

 

 

 

 

1. 데이터 불러오기

 

우선, 데이터를 분석하기 위하여 주어진 train 데이터셋과 test 데이터셋을 읽어와 저장하고, 데이터 구조를 확인합니다.

import pandas as pd ## pandas 라이브러리를 가져오기 위하여 import를 해줍니다.

# csv 형식으로 된 데이터 파일을 읽어옵니다.
train = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/train.csv')
test = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/test.csv')

print(f'train data set은 {train.shape[1]} 개의 feature를 가진 {train.shape[0]} 개의 데이터 샘플로 이루어져 있습니다.')

# 데이터의 최상단 5 줄을 표시합니다.
train.head()
train data set은 11 개의 feature를 가진 1015 개의 데이터 샘플로 이루어져 있습니다.
idtitleodometerlocationisimportedenginetransmissionfuelpaintyeartarget01234
0 Toyota RAV 4 18277 Lagos Foreign Used 4-cylinder(I4) automatic petrol Red 2016 13665000
1 Toyota Land Cruiser 10 Lagos New 4-cylinder(I4) automatic petrol Black 2019 33015000
2 Land Rover Range Rover Evoque 83091 Lagos Foreign Used 6-cylinder(V6) automatic petrol Red 2012 9915000
3 Lexus ES 350 91524 Lagos Foreign Used 4-cylinder(I4) automatic petrol Gray 2007 3815000
4 Toyota Venza 94177 Lagos Foreign Used 6-cylinder(V6) automatic petrol Red 2010 7385000
print(train.shape, test.shape)

(1015, 11) (436, 10)

 

csv 파일을 읽어와 데이터프레임으로 저장 및 출력, 가공에 필요한 라이브러리인 pandas, numpy, matplotlib를 import하였습니다.

데이콘에서 제시한 훈련용 파일인 train.csv와 테스트용 파일인 test.csv를 read_csv()함수를 이용하여 읽어와 데이터프레임으로 변환하여, 각각 train과 test 변수에 저장하였습니다.

shape 함수를 이용하여 해당 데이터 셋의 행 및 열의 개수를 확인할 수 있습니다.

head() 함수를 이용하여 데이터의 첫 다섯 줄을 출력하여 데이터 셋의 전체적인 구성을 확인합니다.

주어진 데이터에는 중고차에 관한 id(샘플 아이디), title(제조사 모델명), odmeter(주행 거리), location(판매처), isimported(현지 사용 여부), engine(엔진 종류), transmission(트랜스미션 종류), fuel(연료 종류), paint(색상), year(제조년도), target(자동차 가격)이라는 11개의 컬럼이 존재하는 것을 알 수 있습니다.
그 중에서 title, location, isimported, engine, transmission, fuel, paint 변수는 문자열 형태인 범주형 변수인 것을 확인할 수 있습니다. 머신러닝 등의 기법을 사용하여 분석할 경우, 전처리가 필요할 것으로 예상됩니다.

train data는 총 11개의 컬럼과 1015개의 (row)데이터로 이루어져있음을 알 수 있습니다.
test data는 target 변수를 제외한 10개의 컬럼과 436개의 데이터로 이루어져있는 것을 알 수 있습니다.

 

 

 

2. 결측치 확인

 

결측치란, Missing Value 혹은 NA라고도 표현하며, 말그대로 값이 존재하지 않는 데이터를 의미합니다.

이러한 결측치가 train data에 포함되어 있다면 보다 정확한 분석을 하기 어렵습니다. 따라서, 데이터에 결측치가 포함되어있는지 확인하고 제거하거나 적절히 대체해주어야 합니다.

 

함수를 작성하여 데이터셋에 결측치가 존재하는지 확인합니다.

def check_missing_col(dataframe):
    missing_col = []
    for col in dataframe.columns:
        missing_values = sum(dataframe[col].isna())
        is_missing = True if missing_values >= 1 else False
        if is_missing:
            print(f'결측치가 있는 컬럼은: {col} 입니다')
            print(f'해당 컬럼에 총 {missing_values} 개의 결측치가 존재합니다.')
            missing_col.append([col, dataframe[col].dtype])
    if missing_col == []:
        print('결측치가 존재하지 않습니다')
    return missing_col

missing_col = check_missing_col(train)

결측치가 존재하지 않습니다

 

isna() 함수를 통해 결측치를 체크하는 check_missing_col() 함수를 작성하여 train 데이터 셋에 결측치가 포함되어있는지 확인합니다.

데이터셋에 결측치가 존재하지 않는 것을 확인하였습니다. 따라서 결측치 처리는 생략합니다.

 

 

 

3. 데이터 전처리

 

데이터 전처리란, 데이터를 분석하기에 알맞게 가공하여 처리하는 과정으로 데이터 분석 과정에서 반드시 거쳐야 하는 과정입니다.

데이터에 존재하는 결측값, 노이즈, 이상값 등을 제거/대체하고 범주형 변수를 데이터 분석에 알맞게 변환하는 작업을 진행합니다.
결측치는 존재하지 않는 것이 이전 단계에서 확인되었으므로 결측치 처리는 생략합니다.

 

오타 처리, 파생변수 생성, 데이터 정제 등의 데이터 전처리를 시행합니다.

 

3-1. 오탈자 처리

 

train[train['year'] < 1900]

idtitleodometerlocationisimportedenginetransmissionfuelpaintyeartarget415827

415 Mercedes-Benz ATEGO 403461 Lagos Locally used 4-cylinder(I4) manual diesel white 1218 6015000
827 Mercedes-Benz/52 510053 Lagos Locally used 6-cylinder(V6) manual diesel white 1217 75015000

year 칼럼에 잘못 기입된 것으로 보이는 1218, 1217년도의 데이터가 존재하는 것을 확인할 수 있습니다.

오기입된 데이터는 제거합니다.

train = train[train['year'] > 1900]
train = train.drop('id', axis = 1).reset_index().drop('index', axis = 1).reset_index().rename({'index':'id'}, axis = 'columns')
train.shape

(1013, 11)

 

오기입된 year 데이터를 포함한 2개의 데이터를 제거하여 1013개의 데이터가 남은 것을 확인할 수 있습니다.

 

 

3-2. 파생변수 생성

 

데이터에 존재하는 카테고리들을 같은 카테고리로 뭉쳐 파생변수를 만듭니다.

파생변수란, 기존의 변수들을 조합하여 만든 새로운 변수로 합계, 평균 등이 속합니다.

 

데이터에 존재하는 카테고리들을 같은 카테고리로 뭉쳐 파생변수를 만듭니다.
파생변수란, 기존의 변수들을 조합하여 만든 새로운 변수로 합계, 평균 등이 속합니다.

우선, 카테고리 개수가 많은 title 변수를 대상으로 파생변수를 만들어 고유 값을 유의하게 줄여줍니다.

train['title'].value_counts()[:20]
 
Toyota Camry            129
Toyota Corolla          108
Toyota Highlander        50
Toyota Sienna            49
Toyota RAV 4             40
Honda Accord             38
Lexus RX 350             33
Lexus ES 350             24
Toyota Venza             16
Lexus GX 460             16
Honda Pilot              15
Lexus LX 570             14
Mercedes-Benz ML 350     13
Toyota Avalon            13
Mercedes-Benz GL 450     12
Toyota Matrix            12
Toyota Tacoma            12
Ford Explorer            12
Mercedes-Benz E 350      12
Toyota 4-Runner          12
Name: title, dtype: int64

 

 

제조사 모델명을 뜻하는 title 변수의 카테고리를 살펴보면 Toyota Camry, Toyota Corolla, Toyota Hiighlander 등 중복된 키워드가 다수 포함되어 있는 것을 확인할 수 있습니다.
중고차 가격 분석 시, 굳이 차종을 전부 따지지 않고 Toyota, Lexus 등의 브랜드명으로 묶어 분석하는 편이 시각화 및 머신러닝에 도움이 될 것 같습니다.

Title이라는 카테고리를 상위 변수로 두어 브랜드 별 카테고리 변수를 추가하여 분석을 더 용이하게 하게 해줍니다.

 

train['brand'] = train['title'].apply(lambda x : x.split(" ")[0])
train.head()

idtitleodometerlocationisimportedenginetransmissionfuelpaintyeartargetbrand01234

0 Toyota RAV 4 18277 Lagos Foreign Used 4-cylinder(I4) automatic petrol Red 2016 13665000 Toyota
1 Toyota Land Cruiser 10 Lagos New 4-cylinder(I4) automatic petrol Black 2019 33015000 Toyota
2 Land Rover Range Rover Evoque 83091 Lagos Foreign Used 6-cylinder(V6) automatic petrol Red 2012 9915000 Land
3 Lexus ES 350 91524 Lagos Foreign Used 4-cylinder(I4) automatic petrol Gray 2007 3815000 Lexus
4 Toyota Venza 94177 Lagos Foreign Used 6-cylinder(V6) automatic petrol Red 2010 7385000 Toyota

Toyota Camry의 Toyota처럼, 브랜드명은 띄어쓰기로 구분되어 첫 번째 단어로 포함되어 있으므로 title 변수 데이터를 split하여 첫 번째(0번째 리스트) 문자열을 추출합니다.
추출해낸 문자열 데이터를 'brand'라는 칼럼으로 새로 생성하여 추가합니다. 이로써 title의 첫 번째 단어를 이용한 파생 변수 칼럼이 생성되었습니다.

 

 

3-3. 데이터 정제

 

효과적인 데이터 분석을 위해서는 주어진 데이터 셋의 포맷을 통일하고, 불필요한 값을 제거하거나 통합하고, 오탈자를 수정하는 데이터 정제 과정을 거쳐야 합니다.

 

우선, paint 컬럼의 카테고리를 출력해봅니다.

train['paint'].value_counts()[:20]
Black        292
White        115
Silver       103
Grey          84
Blue          70
Red           53
Dark Grey     47
Gold          37
white         24
Green         18
Gray          17
Brown         16
Black         15
Dark Blue     14
Wine           8
Silver         5
Sliver         5
blue           5
red            5
Grey           3
Name: paint, dtype: int64

 

 

Black과 black, Red와 red 등 대소문자 표기가 일치하지 않아 다른 카테고리로 나뉘어진 경우가 눈에 띕니다. 또한, Silver의 오타인 Sliver 카테고리도 보입니다.

이들의 표기형식을 통일하고 오타 및 표기를 수정합니다.

우선, 정규표현식을 이용하여 공백 및 대소문자 표기를 통일시켜줍니다.

 

import re 

def clean_text(texts): 
    corpus = [] 
    for i in range(0, len(texts)): 
        review = re.sub(r'[@%\\*=()/~#&\+á?\xc3\xa1\-\|\.\:\;\!\-\,\_\~\$\'\"\n\]\[\>\<]', '',texts[i]) #@%*=()/+ 와 같은 문장부호 제거
        review = re.sub(r'\d+','',review)#숫자 제거
        review = review.lower() #소문자 변환
        review = re.sub(r'\s+', ' ', review) #extra space 제거
        review = re.sub(r'<[^>]+>','',review) #Html tags 제거
        review = re.sub(r'\s+', ' ', review) #spaces 제거
        review = re.sub(r"^\s+", '', review) #space from start 제거
        review = re.sub(r'\s+$', '', review) #space from the end 제거
        review = re.sub(r'_', ' ', review) #space from the end 제거
        #review = re.sub(r'l', '', review)
        corpus.append(review) 
        
    return corpus

정규표현식을 다루는 re 모듈의 sub 메소드를 이용하여 데이터들을 수정합니다.

입력받은 값의 숫자를 제거하고, 대소문자 통일을 위하여 모든 알파벳을 소문자로 변환하고, 공백 및 띄어쓰기를 제거하는 clear_text 함수를 작성하였습니다.

print('정제 전 brand의 unique 카테고리 개수 : ', len(train['paint'].unique()))

temp = clean_text(train['paint']) #메소드 적용
train['paint'] = temp

print('정제 후 brand의 unique 카테고리 개수 : ', len(train['paint'].unique()))

정제 전 brand의 unique 카테고리 개수 : 76 정제 후 brand의 unique 카테고리 개수 : 51

 

작성한 clean_text 함수를 train 데이터 셋의 paint 칼럼에 적용합니다.
이로써 대소문자 구분이나 공백 문자열 때문에 다른 데이터로 나뉘어졌던 데이터들을 하나로 합쳐주었습니다.

76개의 카테고리가 존재했던 paint 변수의 카테고리가 51개로 줄어든 모습입니다.

train['paint'].value_counts()[:20]
black        310
white        142
silver       109
grey          87
blue          78
red           58
dark grey     48
gold          41
green         20
gray          18
dark blue     17
brown         16
wine           9
sliver         5
dark ash       4
cream          4
ash            3
purple         3
yellow         3
whiteblue      2
Name: paint, dtype: int64

띄어쓰기와 대소문자 문제는 해결하였으나, 오탈자와 색상의 세세한 구분은 여전히 존재합니다.

오타를 수정하고 색상의 명도/채도 등 적은 차이의 색상 표현(dark grey와 grey 등)은 해당 색상을 대표할 수 있는 한 카테고리로 통합해주면 카테고리를 더욱 줄일 수 있을 것 같습니다.

train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'blue' if x.find('blue') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'red' if x.find('red') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'green' if x.find('green') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'white' if x.find('white') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'grey' if x.find('grey') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'grey' if x.find('gery') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'grey' if x.find('gray') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'ash' if x.find('ash') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'brown' if x.find('brown') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'silver' if x.find('silver') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'silver' if x.find('sliver') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'black' if x.find('black') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'gold' if x.find('gold') >= 0 else x)
train['paint'] = train['paint'] = train['paint'].apply(lambda x : 'wine' if x.find('whine') >= 0 else x)

sliver라는 오타 문자열이 확인되면 silver로 변환하여 주고, grey라는 문자열이 포함된 dark grey가 확인되면 grey로 변환하여 대표 색상으로 통일해주었습니다.

train['paint'].value_counts()
 
black     312
grey      159
white     146
silver    117
blue      105
red        60
gold       42
green      21
brown      17
wine       10
ash         8
cream       4
purple      3
yellow      3
milk        2
maroon      2
beige       1
orange      1
Name: paint, dtype: int64
print('paint의 unique 카테고리 개수 : ', len(train['paint'].value_counts()))

paint의 unique 카테고리 개수 : 18

 

데이터 정제 처리를 통해, 처음에는 76개였던 paint 변수의 카테고리를 데이터 분석에 용이하도록 18개까지 줄여주었습니다.

 

 

3-4. 라벨 인코딩

 

데이터셋의 id, odometer, year, target 칼럼만이 int형이고, 나머지 칼럼들은 object 데이터형입니다.

데이터 분석에 사용하고자 하는 XGBoost 머신러닝 기법은 범주형 데이터를 이용할 수 없으므로, 범주형 변수의 경우 전처리를 통해 정수 값으로 변환해주어야 합니다.

Label Encoding 기법을 이용하여 범주형 변수의 문자열을 수치형, 즉 숫자 값으로 변환해주도록 합니다.

#라벨인코딩을 하기 위함 dictionary map 생성 함수
def make_label_map(dataframe):
    label_maps = {}
    for col in dataframe.columns:
        if dataframe[col].dtype=='object':
            label_map = {'unknown':0}
            for i, key in enumerate(dataframe[col].unique()):
                label_map[key] = i+1  #새로 등장하는 유니크 값들에 대해 1부터 1씩 증가시켜 키값을 부여해줍니다.
            label_maps[col] = label_map
    print(label_maps)
    return label_maps

# 각 범주형 변수에 인코딩 값을 부여하는 함수
def label_encoder(dataframe, label_map):
    for col in dataframe.columns:
        if dataframe[col].dtype=='object':
            dataframe[col] = dataframe[col].map(label_map[col])
            dataframe[col] = dataframe[col].fillna(label_map[col]['unknown']) #혹시 모를 결측값은 unknown의 값(0)으로 채워줍니다.
    return dataframe

le = make_label_map(train)
train = label_encoder(train, le)
train.head()
'title': {'unknown': 0, 'Toyota RAV 4': 1, 'Toyota Land Cruiser': 2, 'Land Rover Range Rover Evoque': 3, 'Lexus ES 350': 4, 'Toyota Venza': 5, 'Toyota Corolla': 6, 'Land Rover Range Rover Sport': 7, 'Pontiac Vibe': 8, 'Toyota Tacoma': 9, 'Lexus RX 350': 10, 'Ford Escape': 11, 'Honda Civic': 12, 'Volvo XC90': 13, 'BMW 750': 14, 'Infiniti JX': 15, 'Honda Accord': 16, 'Mercedes-Benz ML 350': 17, 'Toyota Camry': 18, 'Hyundai Azera': 19, 'Lexus GX 460': 20, 'BMW 325': 21, 'Toyota Sienna': 22, 'Honda Fit': 23, 'Honda CR-V': 24, 'Hyundai Tucson': 25, 'Ford Transit': 26, 'Jaguar XJ8': 27, 'BMW X6': 28, 'Mercedes-Benz C 300': 29, 'Mitsubishi Galant': 30, 'Mercedes-Benz GL 450': 31, 'Lexus RX 300': 32, 'Toyota Highlander': 33, 'Mitsubishi CANTER PICK UP': 34, 'Nissan Titan': 35, 'Lexus IS 250': 36, 'Mercedes-Benz 200': 37, 'Toyota Sequoia': 38, 'Ford Explorer': 39, 'Hyundai ix35': 40, 'Mack CH613 CONVENTIONAL CAB': 41, 'Lexus CT 200h': 42, 'Lexus LX 570': 43, 'Toyota Avensis': 44, 'Toyota 4-Runner': 45, 'Mercedes-Benz GLE 350': 46, 'Mercedes-Benz E 300': 47, 'Toyota Avalon': 48, 'Chevrolet Camaro': 49, 'Mack CXN613 CAB BEHIND ENGINE': 50, 'Land Rover Range Rover': 51, 'Mazda CX-9': 52, 'Lexus RX 330': 53, 'Lincoln Mark': 54, 'Kia Optima': 55, 'Volkswagen LT': 56, 'Lexus GS 300': 57, 'Jaguar X-Type': 58, 'Mercedes-Benz 709 DB': 59, 'Nissan Altima': 60, 'Acura MDX': 61, 'DAF 95XF TRACTOR HEAD': 62, 'Man TGA 18.360': 63, 'Nissan Pathfinder': 64, 'Mercedes-Benz E 350': 65, 'Honda Crosstour': 66, 'Honda Pilot': 67, 'Lexus LS 460': 68, 'Nissan Cabstar': 69, 'Kia Sorento': 70, 'Mercedes-Benz CLA 250': 71, 'Mitsubishi Pajero': 72, 'Mercedes-Benz C 350': 73, 'Lexus GS 350': 74, 'Mercedes-Benz E 320': 75, 'Toyota Yaris': 76, 'Toyota Matrix': 77, 'Isuzu NQR': 78, 'IVM LT35': 79, 'Hyundai Elantra': 80, 'Porsche Cayenne': 81, 'Toyota Prado': 82, 'Hyundai Sonata': 83, 'MINI Cooper': 84, 'Toyota Hiace': 85, 'Mercedes-Benz 350': 86, 'Honda Odyssey': 87, 'Mercedes-Benz E 550': 88, 'Dodge Charger': 89, 'GMC Terrain': 90, 'Mercedes-Benz GLK 350': 91, 'Mercedes-Benz C 250': 92, 'Mercedes-Benz ML 430': 93, 'Mack CH613': 94, 'Honda Element': 95, 'Mercedes-Benz GLC 300': 96, 'Hyundai Santa Fe': 97, 'Kia Cerato': 98, 'Chevrolet Evanda': 99, 'Iveco TRUCK': 100, 'Acura ZDX': 101, 'Mercedes-Benz 450': 102, 'Mercedes-Benz GLA 250': 103, 'Mercedes-Benz CLS 500': 104, 'Scania P94 FLATBED': 105, 'Nissan Versa': 106, 'Ford F 150': 107, 'Mercedes-Benz GLE 43 AMG': 108, 'Volkswagen Golf': 109, 'Mercedes-Benz 320': 110, 'Honda Ridgeline': 111, 'Mercedes-Benz S 450': 112, 'Mercedes-Benz 300': 113, 'Kia Rio': 114, 'BMW 740': 115, 'Ford Edge': 116, 'Toyota Dyna': 117, 'Volvo FL6': 118, 'Toyota Coaster': 119, 'GAC Gonow Other': 120, 'IVECO EUROTECH 7.50E-16': 121, 'DAF FA 55. 180': 122, 'Scania TRACTOR HEAD': 123, 'Nissan Xterra': 124, 'Mercedes-Benz ML 320': 125, 'Ford Focus': 126, 'Mercedes-Benz 220': 127, 'Man Truck 18.44': 128, 'BMW 730': 129, 'Peugeot 607': 130, 'BMW 528': 131, 'Volvo XC60': 132, 'Mercedes-Benz E 200': 133, 'Volkswagen Passat': 134, 'Volkswagen Sharan': 135, 'Lexus GX 470': 136, 'Nissan Quest': 137, 'Nissan Maxima': 138, 'Lexus ES 300': 139, 'Mazda Tribute': 140, 'Ford Fusion': 141, 'Acura RDX': 142, 'Peugeot 206': 143, 'Mercedes-Benz G 63 AMG': 144, 'Toyota Hilux': 145, 'Kia Stinger': 146, 'Volkswagen Tiguan': 147, 'Acura TL': 148, 'Porsche Panamera': 149, 'Rolls-Royce Ghost': 150, 'BMW 745': 151, 'BMW 335': 152, 'Volkswagen Jetta': 153, 'Mack R-686ST': 154, 'Man Diesel 19.314 FILT-N': 155, 'Toyota Solara': 156, 'Kia Soul': 157, 'Mercedes-Benz C 450 AMG': 158, 'Mack CXN613': 159, 'Nissan Murano': 160, 'Chevrolet Traverse': 161, 'Volkswagen T4 Caravelle': 162, 'MAN-VOLKSWAGEN FLATBED': 163, 'Nissan Frontier': 164, 'Nissan X-Trail': 165, 'Mercedes-Benz C 180': 166, 'Infiniti M35': 167, 'Nissan Sentra': 168, 'Jeep Cherokee': 169, 'Toyota DYNA 200': 170, 'Nissan Rogue': 171, 'Land Rover Range Rover Velar': 172, 'ALPINA B3': 173, 'DAF 45': 174, 'Mazda 323': 175, 'Volkswagen T6 other': 176, 'Bentley Arnage': 177, 'Mazda 6': 178, 'Infiniti FX': 179, 'Ford Expedition': 180, 'Mercedes-Benz 814': 181, 'Kia Picanto': 182, 'Toyota Tundra': 183, 'JMC Vigus': 184, 'Infiniti QX80': 185, 'Volvo FH12': 186, 'Volkswagen Touareg': 187, 'Porsche Macan': 188, 'Peugeot 308': 189, 'Nissan INFINITI M90.150/2': 190, 'MINI Cooper Countryman': 191, 'Lexus ES 330': 192, 'Honda Insight': 193, 'Toyota Vitz': 194, 'Audi S6': 195, 'Isuzu CABSTER': 196, 'Mercedes-Benz C 63 AMG': 197, 'Mercedes-Benz SL 400': 198, 'Volkswagen 17.22': 199, 'Man BOCKMANN': 200, 'DAF CF': 201}, 'location': {'unknown': 0, 'Lagos ': 1, 'Lagos': 2, 'Abuja': 3, 'Lagos State': 4, 'Ogun': 5, 'FCT': 6, 'Accra': 7, 'other': 8, 'Abuja ': 9, 'Abia State': 10, 'Adamawa ': 11, 'Abia': 12, 'Ogun State': 13}, 'isimported': {'unknown': 0, 'Foreign Used': 1, 'New ': 2, 'Locally used': 3}, 'engine': {'unknown': 0, '4-cylinder(I4)': 1, '6-cylinder(V6)': 2, '8-cylinder(V8)': 3, '6-cylinder(I6)': 4, '4-cylinder(H4)': 5, '5-cylinder(I5)': 6, '3-cylinder(I3)': 7, '2-cylinder(I2)': 8}, 'transmission': {'unknown': 0, 'automatic': 1, 'manual': 2}, 'fuel': {'unknown': 0, 'petrol': 1, 'diesel': 2}, 'paint': {'unknown': 0, 'red': 1, 'black': 2, 'grey': 3, 'white': 4, 'blue': 5, 'silver': 6, 'brown': 7, 'green': 8, 'purple': 9, 'gold': 10, 'milk': 11, 'beige': 12, 'ash': 13, 'orange': 14, 'cream': 15, 'yellow': 16, 'wine': 17, 'maroon': 18}, 'brand': {'unknown': 0, 'Toyota': 1, 'Land': 2, 'Lexus': 3, 'Pontiac': 4, 'Ford': 5, 'Honda': 6, 'Volvo': 7, 'BMW': 8, 'Infiniti': 9, 'Mercedes-Benz': 10, 'Hyundai': 11, 'Jaguar': 12, 'Mitsubishi': 13, 'Nissan': 14, 'Mack': 15, 'Chevrolet': 16, 'Mazda': 17, 'Lincoln': 18, 'Kia': 19, 'Volkswagen': 20, 'Acura': 21, 'DAF': 22, 'Man': 23, 'Isuzu': 24, 'IVM': 25, 'Porsche': 26, 'MINI': 27, 'Dodge': 28, 'GMC': 29, 'Iveco': 30, 'Scania': 31, 'GAC': 32, 'IVECO': 33, 'Peugeot': 34, 'Rolls-Royce': 35, 'MAN-VOLKSWAGEN': 36, 'Jeep': 37, 'ALPINA': 38, 'Bentley': 39, 'JMC': 40, 'Audi': 41}}
idtitleodometerlocationisimportedenginetransmissionfuelpaintyeartargetbrand01234
0 1 18277 1 1 1 1 1 1 2016 13665000 1
1 2 10 2 2 1 1 1 2 2019 33015000 1
2 3 83091 2 1 2 1 1 1 2012 9915000 2
3 4 91524 2 1 1 1 1 3 2007 3815000 3
4 5 94177 2 1 2 1 1 1 2010 7385000 1

우선, 라벨 인코딩을 하기 위해 dictionary map을 생성하는 함수 make_label_map 함수와, make_label_map에서 반환한 유니크 값을 이용하여 범주형 변수에 인코딩 값을 부여하는 label_encoder 함수를 작성하고 적용하였습니다.

범주형 변수들을 문자열이 아닌 숫자 형태로 변환해준 모습입니다.

각 범주 값에 1에서 N(총 카테고리)까지의 숫자가 부여되었습니다.
예를 들어 paint에서 Red는 1로, Black은 2로, Gray는 3으로 변환되었습니다.

 

 

 

다음 포스팅에서는 XGBoost를 이용한 모델링 및 예측을 진행해보도록 하겠습니다.