BOTNOI RODKAIDEE car price prediction
การที่เราจะมีรถได้สักคันนึง เพื่อใช้ในชีวิตประจำวัน หรือ ประกอบอาชีพต่างๆ ได้ มีทางเลือกไม่กี่ทางคือ ถอยรถคันใหม่ หรือ หารถมือสองสภาพดี และ ถูกใจใช่ไหมครับ นี่คือ การนำข้อมูลที่มีอยู่มากมายมาใช้ประโยชน์ ในการคาดการณ์ราคารถมือสอง
จากการที่ได้ร่วมเรียนรู้จาก ผู้เชี่ยวชาญและมีประสบการณ์ทางด้าน Data Science อย่าง BOTNOI นี่คือ project เพื่อใช้งานในโลกแห่งข้อมูลของจริง
ไปดู jupyter notebook ได้ในนี้ครับ colab และ github
https://colab.research.google.com/drive/1WQoNqTvYOA1xYW_sV7boKz2rkKqQcr_z
https://github.com/TanabutT/Projects/tree/master/BOTNOI_RODKAIDEE_car_price_prediction
เริ่มต้นการทำโดยการ ใช้ python ในการ import data และ Exploratory Data Analysis(EDA) ก่อนครับ ลอง sample สุ่มมาดูก่อนสัก 5 ตัวครับตัวตารางข้อมูลจะใช้ชื่อว่า carkaidee
display(carkaidee.sample(5))
จากข้อมูลจะเห็นได้ว่าแต่ละ column มีอะไรบ้างดังนี้ครับ:
- price คือราคารถมือสอง
- desc คือรายละเอียดของรถมือสองที่ผู้ขายใส่ไว้ มากน้อยต่างกันไป
- ad_id คือ หมายเลขลำดับที่ลงโฆษณาขายรถเอาไว้ในเว็ปไซต์
- location คือ จังหวัดของผู้ขายรถ หรือ ทะเบียนรถ
- timestamp คือเวลาโพสขาย
- mileage คือ เลขไมล์ที่วิ่งไปของรถที่จะขาย
- brand คือ ยี่ห้อรถ
- model คือ ชื่อรุ่นรถ
- year คือ ปีรถ
- fuel คือ ประเภทของเชื้อเพลิงที่รถใช้
- transmission คือ ประเภทเกียร์
- color คือ สีรถ
- car_type คือ ประเภทรถ
ในการ prediction นี้ ราคาของรถคือ Label หรือ ค่า y_prediction
Data Cleaning
missing data and data type
อันดับแรกจะทำการ check missing value หรือข้อมูลที่หายไปจากข้อมูลที่เราได้มา
carkaidee.isnull().sum()
ทำการแปลง ค่าให้เป็น numeric ใน column ของ mileage แล้วทำการเช็คค่าสถิติทั่วไปของชุดข้อมูลเบื้องต้น
carkaidee[‘mileage’] = pd.to_numeric(carkaidee.mileage, errors = ‘coerce’)
carkaidee.describe().round(3)
จากค่าสถิติเบื้องต้น จึงนำมาไปสู่การเช็คให้ง่ายขึ้นด้วยการ plot chart ขึ้นมาให้ตรวจสอบได้ดีขึ้นว่ามี outlier หรือไม่ หรือเรียกว่า Visualization
จาก box plot เห็นได้ว่า timestamp และ ad_id ทำให้ข้อมูลอื่นไม่สามารถ visualize ได้ดี ดังนั้นจะทำการ drop ออกจากข้อมูลหลักก่อนเลย ตัว desc เป็นตัวหนังสืออาจมีประโยชน์ในการใช้ text analysis ซึ่งต้องใช้เรื่อง RegularExpression and NLP มาช่วย ขอตัดไปก่อน
carkaidee = carkaidee.drop([‘desc’,’ad_id’,’timestamp’], axis=1)
ต่อมาจึงนำค่าเฉพาะ price , mileage และ year มาทำ box plot อีกรอบ
จะเห็น outlier ชัดเจนใน price และ mileage ชัดเจนขึ้น จึงทำการ clean ด้วย
carkaidee = carkaidee[(carkaidee.price > carkaidee.price.quantile(0.001)) & (carkaidee.price < carkaidee.price.quantile(0.96))]’carkaidee.mileage[carkaidee.mileage>500000] = np.nan
ทำให้ price ราคารถที่ outlier เยอะเกินไปไม่กระทบกับข้อมูลโดยรวม และ mileage ที่มากกว่า 500,000 kilometers ตัดออกไปเพราะดูผิดปกติ
หลังจาก นั้นลองดู box plot อีกรอบ ดูการเปลี่ยนแปลงของ price และ mileage
ทำการ fill missing data โดยใช้ mode หรือค่าที่ซ้ำมากที่สุดของในชุด column นั้นๆ
Categorize and add a new feature column
จะทำการจัดกลุ่มข้อมูลเป็นประเภทภายใน column เพื่อลดขนาด(size) ของข้อมูลเอง
ต่อมาเป็นการเพิ่ม car_age ขึ้นมาเพื่อดูอายุรถแทนการดู year ของรถ นั่นเอง
มาดูหน้าตาข้อมูลที่ clean และเพิ่มอายุรถไปแล้วกัน
Extract Feature
โดยใช้ get_dummies เพื่อแปลง ชุดข้อมูลใน column ที่เป็น ประเภท ที่ไม่ใช่ตัวเลขคือ 'location','brand','model', 'color','fuel', 'transmission', 'car_type' ให้เป็น categorical ให้หมดจึงจะนำเข้าไปใช้ train ใน model ของเราได้
Train Model
เริ่มทำการแยก label และ feature ของข้อมูลออกก่อน
ต่อมาทำการ แบ่ง เป็น train set และ test set โดยใช้
ในครั้งนี้เลือก Random forest regression model เพื่อทำการ train ก่อน
Evaluation (Regression)
ทำการประเมินผลของ model ที่เราทำการ train เรียบร้อยแล้วโดยการใช้ .score จะบอกถึงค่า R2
วัดผลด้วยค่า MSE: Mean square error
อีกค่าที่ใช้กันคือ RMSE: Root mean square error