การใช้ Data scienceในการคัดเลือกผู้สมัครเรียน BOTNOI AI & DS classroom (HR ของบริษัทต่าง ๆ น่าจะเอาไปประยุกต์ใช้ได้นะครับ)

Dr. Winn Voravuthikunchai
botnoi-classroom
Published in
4 min readSep 21, 2019

สืบเนื่องมาจากบริษัทต้องเสริมกำลังทีม DS เพื่อทำหลายโปรเจค โดยเฉพาะโปรเจคใหญ่ที่จะทำ AI ให้กับโรงพยาบาล ลองเปิดรับสมัครเผื่อฟลุก ก็ยังไม่มีใครมาสมัคร ก็รู้ว่าหา DS ยากมาก ก็เลยลองเปิดคลาสสอนดีกว่า เผื่อว่าถ้าคนที่มาเรียนมีแวว จะได้จีบมาช่วยทำงานต่อ คุยกับน้อง DS ในทีมว่า เราลองเริ่มรับซัก 10 คนมาสอนที่ออฟฟิสบอทน้อย หลังเลิกงานนี่แหละ ผมประกาศว่ารับสมัครเมื่อวันพฤหัสเย็น คุยกับน้อง ๆ ว่าจะมีคนสมัครมั้ยนะ 10 คน

สามารถเข้าไปดูรายละเอียดของคลาส แล้วก็หัวข้อต่าง ๆ ที่สอนในลิงค์นี้ครับ https://www.facebook.com/vwinnv/posts/10156163675872030

ปรากฎว่าผลตอบรับเกินคาดหมายไปมากจริง ๆ ครับ ยังไม่ถึง 2 วันก็มีคนสมัครมา สองร้อยกว่าคนครับ แม่เจ้า ก็ขอบคุณทุกคนจริง ๆ นะครับที่สนใจ และพวกเราจะพยายามทำให้ทุกคนได้เรียนแน่นอน เพียงแต่อาจจะขอเวลาสักหน่อยนะครับ ให้เราได้สร้างทีมงานสอน ได้หาสถานที่ที่เหมาะสม

จากที่ประกาศไว้ว่าจะรับ 10 คน คิดว่าจะพยายามปรับ หาสถานที่ให้ได้ซัก 15 คน แต่ว่าเกินกว่านั้นอาจจะยังไม่ไหว เพราะเราจะเน้นสอนประกบ คนที่มาเรียนต้องทำให้ได้ เมื่อจบในแต่ละคลาส เราคาดหวังว่าคนที่เรียนรุ่นแรก น่าจะมาเป็น TA ช่วยพวกเราสอนคนที่เหลือได้ แล้วก็มาช่วยงานโปรเจคบอทน้อยด้วย เพราะฉะนั้นเราต้องคัดเลือกดี ๆ

พวกเราอ่านใบสมัครคร่าว ๆ มีคุณภาพมาก ๆ แต่มันก็ทำให้เลือกยากจริง ๆ ผมก็เลยได้ไอเดียว่า งั้นผมจะสร้าง ML model คัดเลือกดีกว่า มันน่าจะดีด้วยตรงที่ว่า ผมจะได้เขียน blog นี้ ให้ทุกคนได้เห็นขั้นตอนในการสร้าง ML model แบบง่าย ๆ ด้วย คนที่มาเรียนก็จะต้องเจอแบบนี้แหละครับ เอาล่ะมาลองดูว่าบทความนี้จะทำให้ทุกคนอยากเรียนมากขึ้น หรือว่าอยากจะหนียกเลิกสมัครเรียนกันนะ

งั้นเรามาเริ่มสร้าง model คัดเลือกกันเล้ย

  1. ตั้งโจทย์

โจทย์ของเราก็คือจะคัดผู้สมัครที่ดีที่สุดสำหรับคลาสแรก ซึ่งอย่างที่บอกเราอยากได้คนที่เรียนแล้วมาสอนรุ่นถัด ๆ ไปได้ด้วย Botnoi classroom จะได้ scale ได้ ดังนั้นเราก็อยากจะได้คนที่มี passion คนที่เรียนรู้ด้วยตัวเอง หาข้อมูลในเน็ตเก่ง คนที่มีพื้นฐานเขียนโปรแกรม คนที่มีเวลาเพื่อทุ่มเทกับ DS คนที่มีมนุษย์สัมพันธ์ดีจะได้เรียนไปด้วยกันกับเพื่อน ๆ แล้วก็เผื่อจะได้ช่วยสอนคลาสถัดไป

2. เล่นกับดาต้า

ก็เปิด excel เลื่อน ๆ ดูนี่แหละ จะได้ไอเดียเบื้องต้นในหัว จากนั้นก็อาจจะลองสร้าง pivot table อย่างเช่น อายุในแต่ละช่วง 10–15 15–20 … มีคนสมัครกี่คน “อ่าฮ้า” ผมเจออะไรบางอย่าง มันมีบาง record ที่ คนสมัครคนเดียวมี 2 ช่วงอายุ มันหมายความไงกัน ก็แปลว่ามีความผิดพลาดของข้อมูลแล้วเราก็ต้องกำจัดพวกนี้ทิ้งไป ซึ่งเค้าเรียกว่าการ clean data

3. clean data

สำหรับการ clean data นี้เนื่องจากมันมีแค่ 2 record ผมก็ไปดูที่ข้อมูลดิบเลย ใช้วิธีบ้าน ๆ นั่นเอง อ๋อ อาชีพนักศึกษา ผมเข้าใจแล้ว แสดงว่าน้องเค้ามีอายุอยู่ที่ขอบ อายุ 20 แน่ ๆ น้องก็เลยไม่แน่ใจว่าจะติ๊ก 15–20 หรือ 20–30 ดี ติ๊กไปเลยสองอัน สร้างงานให้พี่ โอเค๊ งั้นผมก็เลยปรับให้เป็น 20–30 ถือว่ามีความเป็นผู้ใหญ่ ส่วนดาต้าอื่น ๆ ก็แทบจะไม่มีปัญหาอะไร แต่สำหรับ data เยอะ ๆ ในองค์กรที่มีเป็นแสน เป็นล้าน record ก็สามารถ clean data หลายแบบ เช่น อาจจะใช้ค่าเฉลี่ยแทน หรือถ้ายากขึ้นก็ไปดู data ที่มีความใกล้เคียงในส่วนของ column อื่น ๆ แล้วก็เอาค่าของ data point ที่มีข้อมูล มาใส่เป็นค่าที่หายไป ตัวอย่าง ถ้าเกิดว่า ผมเป็นนักศึกษาปี 3 แต่ข้อมูลอายุผมหายไป แต่เพื่อนผมเป็นนักศึกษาปี 3 ที่มีข้อมูลอายุว่าอายุ 21 ปี แสดงว่าก็เป็นไปได้ที่ผมจะมีอายุ 21 ปีเช่นกัน ก็เอา 21 ปี มาใส่ให้ผม

4. feature extraction

ทีนี้กระบวนการถัดไปก็คือ การสร้างคุณลักษณะหรือ feature ของดาต้า เพื่อจะได้ป้อนให้กับ ML model คือ ยกตัวอย่าง data ที่ผมมีอันนึงคือ อาชีพ อาชีพนักศึกษา อาชีพวิศวกร เราเอาคำแบบนี้ป้อนไปเลยไม่ได้ คอมพิวเตอร์กินแต่ตัวเลขครับ กินคำศัพท์ไม่ได้ สำหรับดาต้าที่เป็นข้อความผมก็จะแปลงเป็นตัวเลขโดยใช้อัลกอริทึ่ม word2vec มันเป็นการแปลงคำศัพท์โดยใช้สถิติการเจอคำศัพท์ที่ปรากฏต่าง ๆ ในฐานข้อมูล เช่น ผมไปกินข้าว เธอไปกินข้าว เราไปกินข้าว ผมไปดูหนัง เธอไปดูหนัง เราไปดูหนัง คำว่า ผม เธอ เรา จะปรากฏในรูปประโยคที่คล้าย ๆ กันเสมอ เพราะฉะนั้น word2vec ก็จะแปลง ผม เธอ เรา อยู่ในรูปแบบตัวเลขที่คล้าย ๆ กัน เหมือนกัน python java sql ก็จะถูกแปลงคล้าย ๆ กันเช่นกัน เพราะจะต้องวนเวียนเจอในประโยคคล้าย ๆ กัน เขียน python ได้ป่ะ เขียน java ได้ป่ะ เป็นต้น

พอเราได้ตัวเลขของคำศัพท์เราก็เอาตัวเลขมารวมเป็นตัวแทนของประโยค เพราะงั้นผมก็คาดหวังว่า ประโยคที่เขียนดี ๆ มีแรงบันดาลใจในการมาเรียน อยากเรียนกับบอทน้อยมาก ๆ อยากเก่งจะตัวใจเรียน ประโยคเหล่านี้ ก็จะออกมาเป็นตัวเลขที่คล้าย ๆ กัน

ในส่วนของ feature อื่น ๆ มันก็มีที่ผมคิดขึ้นมาเอง แบบง่าย ๆ เลยก็คือ ความยาวของประโยค เขียนมาเยอะก็น่าจะจริงจัง แล้วก็น่าจะเป็นคนเปิดเผย น่าจะสอนง่าย เพราะมีอะไรก็คงถามเราเยอะ แล้วก็น่าจะสอนคนอื่นได้ด้วย อันนี้เป็น hypothesis ล้วน ๆ เดี๋ยวมาเจอกันในคลาส ว่าสิ่งที่ผมคิดกับสิ่งที่เป็น จะเหมือนกันมั้ย

อีก feature นึงคือเรื่องเพศหน่ะครับ คือถ้าในกรุ๊ปเรียนมีสาว ๆ บ้าง คลาสเรียนก็น่าจะมีชีวิตชีวามากขึ้นจริงมั้ยครับ ผู้สมัครสาว ๆ ก็น้อยกว่าผู้ชาย ก็เลยต้องให้ความสำคัญกับส่วนนี้ โปรโมท gender equality เราไม่ได้เก็บข้อมูลส่วนนี้ ในฟอร์มไม่ได้ถามว่าคุณเป็นเพศอะไร แล้วจะทำยังไงดี

ในใบสมัครจะมีคำถามบางคำถาม ที่ให้ผู้สมัครเขียนบรรยาย เช่น เหตุผลที่มาสมัครเรียน หรือว่า เป้าหมายคืออะไร เราจะเอาคำเขียนบรรยาย มาช่วยให้เรารู้ได้มั้ยว่าผู้สมัครเป็นชายหรือหญิง น่าจะได้นะครับ เพราะว่าภาษาไทยจะมีคำลงท้าย ค่ะ ครับ ผม หนู เป็นคำศัพท์บ่งบอกเพศผู้สมัครได้ ดังนั้นผมก็เลยเขียนฟังก์ชั่น detect คำศัพท์ ที่บ่งบอกเพศ เช่น ค่ะ ดิฉัน หนู ก็จะสร้างตัวแปรเพศว่าผู้สมัครเป็นผู้หญิง แต่ถ้าเจอคำศัพท์ว่า ครับ ผม ก็จะสร้างตัวแปรเพศว่าผู้สมัครเป็นผู้ชาย

5. train model

เวลาเราจะสร้าง model หรือสอน AI เราก็ต้องให้ตัวอย่างเค้า อันนี้ดี อันนี้ไม่ดีนะ ซึ่งผมก็สุ่ม ๆ เอาจากใบสมัคร ใบสมัครที่ดี ใบสมัครที่ไม่ดี มาอย่างละ 5 ตัวอย่าง จากนั้นก็ train model

6. score data

พอได้ model เสร็จก็ให้ model ทำนายว่าสำหรับ 190 ใบสมัครที่เหลือ ความน่าจะเป็นที่ผมจะเลือกมีเยอะแค่ไหน

แล้วผมก็ rank result แล้วมาดูน่าผลน่าพอใจมั้ย ก็ปรากฏว่า ใช้ได้ทีเดียวครับ

จาก data ทั้งหมด ก็นำมา 15 อันดับแรกที่ model เลือกกับ 15 อันดับสุดท้ายที่ model ไม่ได้เลือก มาหาค่าเฉลี่ยของ feature ต่าง ๆ จากตารางก็จะเจอว่า

  • Gender equality ใช้ได้เลยนะ มีผู้หญิงประมาณ 40% ก็ยังน้อยกว่าผู้ชายนะ เพราะผู้ชายสมัครมาเยอะกว่า แต่ถ้าเทียบกับ 15 อันดับสุดท้าย ไม่มีสาว ๆ เลย
  • ค่าเฉลี่ยประสบการณ์การเขียน Python การเขียนโปรแกรม แรงบันดาลใจ และสิ่งที่คาดหวัง (วัดจากความยาวที่เขียน)ในสิ่งที่ model เลือกจะสูงกว่าที่ model ไม่ได้เลือกอย่างเป็นนัยยะ
  • อายุ ต้องขออภัยผู้สูงวัยสักหน่อยนะครับ ผมเองก็สูงวัยในทีนี้เหมือนกัน อย่างที่บอก เดี๋ยวผมปั้นน้อง ๆ มาสอนเยอะ ๆ นะครับ เข้าใจว่าท่านก็มีงานประจำยุ่งเหยิงมาก ไหนจะมาเรียนวิชาใหม่อีก แล้วจะมีเวลามาช่วยผมสอนได้อย่างไรจริงมั้ยครับ เพราะฉะนั้นรอผมสร้างทีมซักแป๊ปนะครับ ไม่นานเกินรอ

ทีนี้มาดูคำตอบที่เป็นข้อความกันครับ

คำตอบของคนที่ model ให้คะแนนมากที่สุดเป็นอันดับที่ 1 (ยาวมาก มีประสบการณ์ start up สนใจธุรกิจ หาความรู้ด้วยตัวเอง)

คำตอบของคนที่ model ให้คะแนนมากที่สุดเป็นอันดับที่ 2 (ความสนุก อยากเก่งขึ้น)

คำตอบของคนที่ model ให้คะแนนมากที่สุดเป็นอันดับที่ 3 (ถึงกับออกจากงานเลยทีเดียว passion อยู่ที่นี่)

คำตอบของคนที่ model ให้คะแนนเป็นอันดับท้าย ๆ ก็จะสั้น ๆ หน่อย

คร่าว ๆ ก็จะประมาณนี้นะครับ จริง ๆ ก็มีรายละเอียดอีก เช่น การ normalize data การสร้าง dummy variable การเลือก ML model แต่ว่าไม่อยากจะให้ยาวเกินไป เดี๋ยวจะไม่อ่านกัน เอาไว้จะเขียนเสริมในบทความถัด ๆ ไป หวังว่าบทความนี้จะเป็นไอเดียให้ทุกคนเห็นว่า เราสามารถสร้างระบบคัดกรองที่รู้ใจเรา จากการสุ่มเลือกสิ่งที่เราชอบกับไม่ชอบ มาเป็น training set จากนั้นก็สร้าง model แล้วก็รัน model กับดาต้าที่เหลือ ผลลัพธ์ที่ผมได้ก็น่าจะเป็นเครื่องพิสูจน์ว่านำมาใช้ได้จริง ทุกท่านก็อาจจะลองไปประยุกต์ใช้กับงานอื่น ๆ อาทิ HR อาจจะใช้คัดกรองผู้มาสมัครงาน หรือว่า Marketing ก็อาจจะใช้คัดเลือกลูกค้าที่จะส่งโปรโมชั่นไปให้ และอีกมากมาย ถ้าอย่างไร ก็มาแลกเปลี่ยนไอเดียกันนะครับ

ส่วนบทความที่อยากจะเขียนในตอนหน้า ก็คือเรื่องของการจัดกลุ่มเรียน โดยเราจะใช้ unsupervised clustering คือผมคงต้องจัดกรุ๊ปสอน คนที่มีพื้นฐานพอ ๆ กันอยู่ด้วยกัน คนที่ไม่มีพื้นฐานอยู่ด้วยกัน สปีดในการสอนจะได้ตามกลุ่ม มีคำถามเหมือนกันเรื่องราคาสอน ที่ตั้งใน google sheet คือถ้าต้องสอนเต็ม ๆ ในแต่ละบท แต่ถ้ากรุ๊ปไหนเรียนได้ไว ระยะเวลาการสอนการสั้นลง ค่าเรียนก็จะถูกลงเยอะครับ

เดี๋ยวผมจะ release source code ที่ใช้สร้าง model คัดเลือก ใน github ด้วยครับ คิดว่าน่าจะเป็นประโยคกับทุก ๆ คน แล้วก็เดี๋ยวพรุ่งนี้ผมจะประกาศผลผู้ที่ได้รับคัดเลือกในเพจ https://www.facebook.com/botnoigroup/

ก็ยินดีกับน้อง ๆ ที่ model เลือกนะครับ เดี๋ยวเรามาลุยกัน อาจจะมีบางคนที่สงสัยว่า ตัวเองก็มีพื้นฐาน Python สูงทำไมไม่ถูกเลือก เป็นเพราะว่า ผมใส่ factor ของเวลาด้วย บางคนมีงานประจำอยู่ ก็อาจจะมีเวลาไม่เท่าพวกนักศึกษา อย่างที่บอกในรุ่นแรกผมอยากขยายทีมงานช่วยผมสอน ซึ่งนักศึกษาน่าจะเหมาะจะได้รับ job เป็น part-time เสริมการเรียน แต่คนที่ไม่ถูกเลือกไม่เป็นไรจริง ๆ นะครับ รออีกแป๊ป ขอเวลาหาสถานที่กับสร้างทีมสอน พวกเราตั้งใจจะสอนทุกคนครับ

--

--

Dr. Winn Voravuthikunchai
botnoi-classroom

obtained his PhD in AI from Caen University, France. He was Chief Data Scientist at Telenor. Currently, he is Founder & CEO of Botnoi Group, and LINE API Expert