Machine learning ในการประเมินราคาคอนโด
แม้ว่า ประเทศไทยประสบปัญหาโรคระบาด แต่ปัจจัยที่อยู่อาศัย ไม่ได้ซบเซาอย่างที่คิด ดูได้จาก จำนวน คอนโดในกรุงเทพ มีให้เลือก ช็อป เต็มไปหมด ขนาดห้องก็มีหลายหลาก ราคาก็มีหลากหลาย ความสูงก็มีทั้ง high rise และ low rise ทั้งโครงการขึ้นใหม่ และโครงการเก่า แล้วจะรู้ได้อย่างไรว่า ราคาควรเป็นเท่าไร
วันนี้ลองมาใช้ความรู้ทาง machine learning มาช่วยให้คุณสามารถตัดสินใจในเรื่องของการประเมินราคาคอนโด เริ่มจาก หากเราต้องการประมาณราคาว่าราคาประมาณไหนสมเหตุสมผล โดยเรียนรู้จาก ข้อมูลในอดีตที่เกิดขึ้นจริง เช่น ที่ตั้งของคอนโด, ปีที่สร้างเสร็จ, พื้นที่โครงการ (ตารางเมตร),จำนวนตึก, การเปลี่ยนแปลงราคาเสนอขายจากไตรมาสที่แล้ว ฯลฯ
1. เริ่มจาก ตั้งการตั้งความคาดหวัง
ถ้าความคาดหวังคือ ประมาณราคาว่าราคาประมาณไหนสมเหตุสมผล เรามาตั้งโจทย์ในการสร้างโมเดลคือ ซื้อราคาถูก แม้ว่าเศรษฐกิจจะไม่ดี สมมุติว่าเราอยากได้ห้องเล็กหรือห้องใหญ่ อยู่ติดรถไฟฟ้ารึเปล่า Area ไหน อยู่เองหรือปล่อยเช่า หลังจากที่รู้สิ่งที่ต้องการชัดเจนแล้ว เรื่องราคานั้น ไม่ต้องห่วง เรามีตัวช่วยให้ เพื่อให้คุณได้คอนโดที่ต้องการในราคาที่เหมาะสมที่สุด ไม่ว่าจะเป็นราคาซื้อ (ควรต่อรองเท่าไหร่ดี) การตั้งราคาขายที่เหมาะสม(ถ้าขายปีหน้าจะได้ราคาดีกว่านี้) เพื่อให้คุณไม่ต้องซื้อคอนโดในราคาที่แพงเกินไป หรือติดดอยในอนาคต
เราจะเริ่มต้นจากการพัฒนาโมเดล machine learning สำหรับทำนายราคาคอนโด โดยการใช้ภาษา python เมื่อป้อนเข้าโมเดลของเรา ก็จะได้ออกมา เป็นราคาคอนโดที่โมเดลทำนายออกมา ข้อมูลที่จะนำมาใช้ในการพัฒนาในครั้งนี้ ได้มาจาก https://www.baania.com ด้วยวิธี web data extraction ของปี 2019
โครงสร้างข้อมูล โดยใช้คำสั่ง info
โดยมีแหล่งข้อมูลมาจาก Dataset หรือชุดข้อมูลประกอบด้วยข้อมูลดังต่อไปนี้
1. Condo_NAME_EN ชื่อโครงการ (ภาษาอังกฤษ)
2. Condo_NAME_TH ชื่อโครงการ (ภาษาไทย)
3. Condo_area เขตที่อยู่อาศัย
4. Condo_link URL ของข้อมูล
5. Address_TH ที่ตั้งของคอนโด
6. Year_built ปีที่สร้างเสร็จ
7. Area_m2 พื้นที่โครงการ (ตารางเมตร)
8. #_Tower จำนวนตึก
9. #_Floor จำนวนชั้น
10. Sale_Price_Sqm ราคาขายต่อตารางเมตร
11. Sale_Price_Increment[Quarter] การเปลี่ยนแปลงราคาเสนอขายจากไตรมาสที่แล้ว
12. Sale_Price_Inc[Year] การเปลี่ยนแปลงราคาเสนอขายจากปีที่แล้ว
13. Rental_Yield ผลตอบแทนค่าเช่า
14. Rental_Yield_Inc[Year] การเปลี่ยนแปลงผลตอบแทนจากค่าเช่าจากปีที่แล้ว
15. Latitude พิกัดละติจูด
16. Longtitude พิกัดลองจิจูด
17. All_Data (TRUE) ตรวจสอบคุณภาพข้อมูลว่าไม่เป็นค่าว่าง ปีที่สร้างเสร็จ ราคาขายต่อตารางเมตร ผลตอบแทนค่าเช่า
18. MinDist_Station ระยะห่างจากสถานีรถไฟฟ้า
19. Condo_Area_corr เขตที่อยู่อาศัย และ จังหวัด
พบว่ามีข้อมูล 2329 ตัวอย่างจริงจาก web siteโดยมีค่า null เยอะพอสมคาร ซึ่งต้องทำการ clean data ก่อนจะสร้างโมเดล
2. ทำความสะอาด (clean) ข้อมูล
ก่อนจะนำข้อมูลเข้าไปเทรนโมเดลต่างๆ เราก็ต้องจัดการ clean ข้อมูลให้เหมาะสม เพื่อให้โมเดลสามารถทำความเข้าใจข้อมูลเหล่านั้นได้อย่างมีประสิทธิภาพ
เราเริ่มจากการพิจารณาดูว่ามีคอลัมน์ไหนที่ไม่มีความหมาย หรือไม่มีความสำคัญบ้าง พบว่า
· ID เป็นการรันตัวเลข ID เฉยๆ
· Condo_NAME_EN , Condo_NAME_TH เป็นชื่อคอนโด มีความแตกต่างกันอย่างมากในแต่ละ example และไม่น่ามีความสำคัญต่อราคา
· Condo_link เป็นเพียง link ไปยังหน้าเพจข้อมูลของคอนโดนั้นๆ
· All_Data เป็นแค่การเช็คว่าเก็บข้อมูลมาครบไหม
· Condo_Area_corr ก็เก็บข้อมูลเขต ซ้ำซ้อนกับ Condo_area
Drop คอลัมน์เหล่านี้ออกไป
จากนั้นเราจะลองหาดูว่ามีข้อมูลส่วนไหนที่เป็นค่าว่าง (Null) บ้าง
พบว่า Area_m2 , #_Floor, Sale_Price_Inc[Year], Rental_Yield_Inc[Year] มี ค่าว่าง (null) และ มี outlier โดยเริ่มจากการ plot กราฟ boxplot
จะเห็นได้ว่า Area_m2 (พื้นที่คอนโดทั้งหมด) เป็น outlier จำนวนมาก และเป็น คอนโดที่สร้างในปี 2010 มีพื้นที่โครงการที่อยู่ในช่วง outlier มากที่สุด (เป็นข้อมูลจริง ไม่ใช่ error จากการ กรอก ข้อมูลผิด) และ หากทำการลบออก ก็จะเสียข้อมูลจำนวนมากเกินไป จึงจะยังไม่เอา outlier ในส่วนนี้ออกไป
2.1. แทนค่า ค่าว่าง (null)ดูการกระจายตัวของข้อมูล ด้วย histogram ของ Area_m2 กับ Sale_Price_INC[year] พบว่า เบ้ซ้ายมาก (skew) หากแทนที่ข้อมูลที่มีค่าว่าง น่าจะลดการเบ้ (skew) ลงได้ เห็นว่าข้อมูลของทั้ง 2 คอลัมน์จะกระจุกตัวอยู่ในช่วงแคบๆ เราจึงจะแทนค่า missing data ของ 2 คอลัมน์นี้ด้วยค่า median น่าจะให้ผลลัพธ์ที่ถูกต้องกว่าการใช้ค่า mean
ผลลัพธ์ที่ได้
จากรูปที่ 3 จะเห็นไว้ว่า เบ้ซ้ายน้อยลง กลับมากระจายตัวแบบโค้งปกติ ส่วนคอลัมน์ Rental_Yield_Inc[Year] มี ค่าว่าง (null) จำนวนมาก และได้แทนค่าว่างด้วย means แต่การกระจายตัวเหมือนเดิม เพราะ ไม่ได้เบ้ซ้าย (skew) มากมาย มาตั้งแต่แรก จึงไม่ค่อยมีผลเท่าไร
2.2. หาความสัมพันธ์
ตรวจสอบ correlation ระหว่าง feature ต่างๆ กับ ราคาคอนโดต่อตร.ม. ว่ามี feature ใดบ้างที่น่าจะมีความสำคัญในการทำนายราคา
พบว่า ปีที่สร้าง (Year_bulit) กับ ระยะห่างจากสถานีรถไฟฟ้า (MinDist_Station) มี correlation ที่สูง น่าจะเป็น feature ที่ช่วยให้โมเดลทำนายได้ดี ส่วน Sale_Price_Inc[Year] กับ Sale_Price_Increment[Quarter] ไม่ค่อยมี correlation กับราคา จึงจะดรอป 2 คอลัมน์นี้ออก
ลอง plot graph ดูการกระจายตัวของ ปีที่สร้างคอนโด กับราคาขาย
พบว่า ปีที่สร้าง Year_bulit กับ ราคาเสนอขายต่อตารางเมตร Sale_Price_Sqm มีความสัมพันธ์กันในรูปแบบเชิงเส้น จึงน่าจะเป็น feature ที่ช่วยให้โมเดลทำนายได้ดี
สุดท้าย ลองทดสอบหาค่าว่าง อีกที
จะเห็นได้ว่า ไม่เหลือค่าว่างแล้ว จากนั้นเราสามารถ สร้าง โมเดล ด้วย LinearRegression
เราสามารถ เรียกดูค่าสัมประสิทธิ์ เพื่อ ผูกสูตร
Y= -4640017+ 2.363(Year_built)+ (-5.314)Area_m2+(1.289)#_Tower+ (1.447)#_Floor+(-3.183)Rental_Yield + (-3.79)Rental_Yield_Inc[Year] + (-7.265)MinDist_Station
และสามารถเรียกดูค่าที่ทำนาย เปรียบเทียบค่าจริง