แพลตฟอร์ม Business Intelligence: บทช่วยสอนโดยใช้ MongoDB Aggregation Pipeline
เผยแพร่แล้ว: 2022-03-11การใช้ข้อมูลเพื่อตอบคำถามที่น่าสนใจคือสิ่งที่นักวิจัยกำลังทำอยู่ในโลกที่ขับเคลื่อนด้วยข้อมูลในปัจจุบัน ด้วยข้อมูลปริมาณมหาศาล ความท้าทายในการประมวลผลและวิเคราะห์ข้อมูลจึงเป็นเรื่องใหญ่ โดยเฉพาะอย่างยิ่งสำหรับนักสถิติหรือนักวิเคราะห์ข้อมูลที่ไม่มีเวลาลงทุนในการเรียนรู้แพลตฟอร์มหรือเทคโนโลยีข่าวกรองธุรกิจที่จัดทำโดยฐานข้อมูลระบบนิเวศ Hadoop, Spark หรือ NoSQL ที่จะช่วยให้พวกเขาวิเคราะห์ข้อมูลเทราไบต์ในไม่กี่นาที
บรรทัดฐานในวันนี้มีไว้สำหรับนักวิจัยหรือนักสถิติในการสร้างแบบจำลองของพวกเขาบนชุดย่อยของข้อมูลในแพ็คเกจการวิเคราะห์ เช่น R, MATLAB หรือ Octave จากนั้นให้สูตรและขั้นตอนการประมวลผลข้อมูลแก่ทีมไอทีที่สร้างโซลูชันการวิเคราะห์การผลิต
ปัญหาหนึ่งของแนวทางนี้คือ หากผู้วิจัยค้นพบสิ่งใหม่หลังจากเรียกใช้แบบจำลองของเขากับข้อมูลทั้งหมดในการผลิต กระบวนการจะต้องทำซ้ำอีกครั้ง
จะเกิดอะไรขึ้นหากผู้วิจัยสามารถทำงานร่วมกับนักพัฒนา MongoDB และทำการวิเคราะห์ข้อมูลการผลิตทั้งหมดและใช้เป็นชุดข้อมูลเชิงสำรวจ โดยไม่ต้องเรียนรู้เทคโนโลยีใหม่หรือภาษาโปรแกรมที่ซับซ้อน หรือแม้แต่ SQL
หากเราใช้ Aggregation Pipeline ของ MongoDB และ MEAN อย่างมีประสิทธิภาพ เราก็สามารถทำได้ในเวลาอันสั้น จากบทความนี้และโค้ดที่มีให้ที่นี่ในที่เก็บ GitHub นี้ เราต้องการแสดงให้เห็นว่าการบรรลุเป้าหมายนี้ง่ายเพียงใด
เครื่องมือ Business Intelligence ส่วนใหญ่ที่มีอยู่ในตลาดกำลังจัดเตรียมวิธีให้นักวิจัยนำเข้าชุดข้อมูลจาก NoSQL และเทคโนโลยี Big Data อื่นๆ ลงในเครื่องมือ จากนั้นจึงทำการแปลงและวิเคราะห์ภายในเครื่องมือ แต่ในบทช่วยสอนธุรกิจอัจฉริยะนี้ เราใช้พลังของ MongoDB Aggregation Pipeline โดยไม่ต้องดึงข้อมูลออกจาก MongoDB และผู้วิจัยกำลังใช้อินเทอร์เฟซที่เรียบง่ายเพื่อทำการเปลี่ยนแปลงทุกประเภทในระบบข้อมูลขนาดใหญ่ที่ใช้งานจริง
MongoDB Aggregation Pipeline สำหรับธุรกิจอัจฉริยะ
พูดง่ายๆ ไปป์ไลน์การรวมของ MongoDB เป็นเฟรมเวิร์กในการดำเนินการแปลงข้อมูลในชุดข้อมูล ขั้นตอนแรกใช้การรวบรวมเอกสารทั้งหมดเป็นข้อมูลเข้า จากนั้นในแต่ละขั้นตอนต่อมาจะใช้ชุดผลลัพธ์ของการแปลงก่อนหน้าเป็นอินพุต และสร้างเอาต์พุตที่แปลงแล้วบางส่วน
การแปลงมี 10 ประเภทที่สามารถใช้ในไปป์ไลน์การรวม:
$geoNear: ส่งออกเอกสารในลำดับใกล้สุดจากจุดที่กำหนด
$match: กรองเร็กคอร์ดอินพุตที่กำหนดโดยนิพจน์ที่กำหนด
$project: สร้างชุดผลลัพธ์ที่มีชุดย่อยของฟิลด์อินพุตหรือฟิลด์ที่คำนวณแล้ว
$redact: จำกัดเนื้อหาของเอกสารตามข้อมูลจากเอกสาร
$unwind: นำฟิลด์อาร์เรย์ที่มี n องค์ประกอบจากเอกสารและส่งกลับ n เอกสารโดยแต่ละองค์ประกอบที่เพิ่มในแต่ละเอกสารเป็นฟิลด์แทนที่อาร์เรย์นั้น
$group: จัดกลุ่มตามหนึ่งคอลัมน์ขึ้นไปและทำการรวมในคอลัมน์อื่น
$limit: เลือก n เอกสารแรกจากชุดอินพุต (มีประโยชน์สำหรับการคำนวณเปอร์เซ็นไทล์ ฯลฯ )
$skip: ละเว้น n เอกสารแรกจากชุดอินพุต
$sort: จัดเรียงเอกสารอินพุตทั้งหมดตามวัตถุที่กำหนด
$out: นำเอกสารทั้งหมดที่ส่งคืนจากสเตจก่อนหน้าและเขียนไปยังคอลเลกชัน
ยกเว้นรายการแรกและรายการสุดท้ายในรายการด้านบน ไม่มีกฎเกี่ยวกับลำดับที่อาจใช้การแปลงเหล่านี้ ควรใช้ $out เพียงครั้งเดียว และในตอนท้าย หากเราต้องการเขียนผลลัพธ์ของไพพ์ไลน์การรวมไปยังคอลเล็กชันใหม่หรือที่มีอยู่ $geoNear สามารถใช้เป็นขั้นตอนแรกของไปป์ไลน์เท่านั้น
เพื่อให้เข้าใจง่ายขึ้น ให้เราอธิบายชุดข้อมูลสองชุดและคำถามสองข้อที่เกี่ยวข้องกับชุดข้อมูลเหล่านี้
ความแตกต่างในเงินเดือนตามการกำหนด
เพื่ออธิบายพลังของกระบวนการรวมของ MongoDB เราได้ดาวน์โหลดชุดข้อมูลซึ่งมีข้อมูลเงินเดือนของเจ้าหน้าที่การสอนของมหาวิทยาลัยทั่วทั้งสหรัฐอเมริกา ข้อมูลนี้มีอยู่ที่ nces.ed.gov เรามีข้อมูลจากสถาบัน 7598 ที่มีฟิลด์ต่อไปนี้:
var FacultySchema = mongoose.Schema({ InstitutionName : String, AvgSalaryAll : Number, AVGSalaryProfessors : Number, AVGSalaryAssociateProfessors : Number, AVGSalaryAssistantProfessors : Number, AVGSalaryLecturers : Number, AVGSalaryInstructors : Number, StreetAddress : String, City : String, State : String, ZIPCode : String, MenStaffCount : Number, WomenStaffCount : Number }
ด้วยข้อมูลนี้ เราต้องการทราบ (โดยเฉลี่ย) ว่าเงินเดือนของรองศาสตราจารย์และอาจารย์แตกต่างกันอย่างไรตามรัฐ จากนั้นรองศาสตราจารย์สามารถรู้ได้ว่าสถานะใดที่เขามีค่าใกล้เคียงกับศาสตราจารย์ในแง่ของเงินเดือน
ในการตอบคำถามนี้ อันดับแรก นักวิจัยต้องคัดแยกข้อมูลที่ไม่ดีออกจากคอลเลกชัน เนื่องจากมีแถว/เอกสารสองสามแถวในชุดข้อมูลของเราที่เงินเดือนเฉลี่ยเป็นค่าว่างหรือสตริงว่าง ในการทำความสะอาดชุดข้อมูลนี้ให้สำเร็จ เราจะเพิ่มขั้นตอนต่อไปนี้:
{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}
การดำเนินการนี้จะกรองเอนทิตีทั้งหมดที่มีค่าสตริงในสองฟิลด์ดังกล่าว ใน MongoDB แต่ละประเภทจะแสดงด้วยตัวเลขเฉพาะ - สำหรับสตริง หมายเลขประเภทคือ 2
ชุดข้อมูลนี้เป็นตัวอย่างที่ดี เนื่องจากในการวิเคราะห์ข้อมูลในโลกแห่งความเป็นจริง วิศวกรมักต้องจัดการกับการล้างข้อมูลด้วย
ตอนนี้เรามีข้อมูลที่เสถียรแล้ว เราสามารถไปยังขั้นตอนต่อไปที่เราจะหาค่าเฉลี่ยเงินเดือนตามรัฐ:
{$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}
เราเพียงแค่ต้องเรียกใช้การคาดการณ์ของชุดผลลัพธ์ข้างต้นและรับความแตกต่างในเงินเดือนเฉลี่ยของรัฐดังที่แสดงด้านล่างในขั้นตอนที่ 3 ของไปป์ไลน์ของเรา:
{$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}
สิ่งนี้ควรให้ความแตกต่างของเงินเดือนโดยเฉลี่ยในระดับรัฐระหว่างอาจารย์และรองศาสตราจารย์จากชุดข้อมูลของสถาบันการศึกษา 7519 แห่งทั่วสหรัฐอเมริกา เพื่อให้สะดวกยิ่งขึ้นในการตีความข้อมูลนี้ ให้เราทำการเรียงลำดับอย่างง่ายเพื่อให้เรารู้ว่าสถานะใดมีความแตกต่างน้อยที่สุดโดยการเพิ่ม $sort stage:

{$sort: { SalaryDifference: 1}}
จากชุดข้อมูลนี้ เห็นได้ชัดว่าไอดาโฮ แคนซัส และเวสต์เวอร์จิเนียเป็นสามรัฐที่ความแตกต่างในเงินเดือนของรองศาสตราจารย์และอาจารย์มีน้อยที่สุดเมื่อเทียบกับรัฐอื่นๆ ทั้งหมด
ไปป์ไลน์การรวมทั้งหมดที่สร้างขึ้นสำหรับสิ่งนี้แสดงอยู่ด้านล่าง:
[ {$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}, {$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}, {$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}, {$sort: { SalaryDifference: 1}} ]
ชุดข้อมูลผลลัพธ์ที่แสดงขึ้นมีลักษณะดังนี้ นักวิจัยยังสามารถส่งออกผลลัพธ์เหล่านี้ไปยัง CSV เพื่อรายงานโดยใช้แพ็คเกจการแสดงภาพ เช่น Tableau หรือผ่านแผนภูมิ Microsoft Excel อย่างง่าย
ค่าจ้างเฉลี่ยตามประเภทการจ้างงาน
อีกตัวอย่างหนึ่งที่เราจะสำรวจในบทความนี้เกี่ยวข้องกับชุดข้อมูลที่ได้รับจาก www.data.gov จากข้อมูลเงินเดือนของรัฐและองค์กรปกครองส่วนท้องถิ่นทั้งหมดในสหรัฐอเมริกา เราต้องการคำนวณค่าจ้างเฉลี่ยของพนักงาน "การบริหารการเงิน" แบบเต็มเวลาและนอกเวลาในแต่ละรัฐ
มีการนำเข้าชุดข้อมูล ส่งผลให้ในปี 1975 เอกสารแต่ละฉบับเป็นไปตามสคีมานี้:
mongoose.Schema({ State : String, GovernmentFunction : String, FullTimeEmployees : Number, VariationPCT : Number, FullTimePay : Number, PartTimeEmployees : Number, PartTimePay : Number, PartTimeHours : Number, FullTimeEquivalentEmployment : Number, TotalEmployees : Number, TotalMarchPay : Number }, {collection: 'payroll'});
คำตอบสำหรับคำถามนี้อาจช่วยให้พนักงานฝ่ายบริหารการเงินเลือกรัฐที่ดีที่สุดที่จะย้ายไป ด้วยเครื่องมือที่ใช้ไปป์ไลน์ MongoDB ของเรา สิ่งนี้สามารถทำได้ค่อนข้างง่าย:
ในระยะแรก กรองในคอลัมน์ GovernmentFunction เพื่อละทิ้งเอนทิตีที่ไม่ใช่ "Financial Administration" ทั้งหมด:
{$match:{GovernmentFunction:'Financial Administration'}}
ในขั้นตอนต่อไปของบทช่วยสอน เราจะจัดกลุ่มเอนทิตีตามรัฐ และคำนวณเงินเดือนเต็มเวลาและนอกเวลาโดยเฉลี่ยในแต่ละรัฐ:
{$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}
สุดท้าย เราจะจัดเรียงผลลัพธ์จากสถานะการจ่ายเงินที่สูงขึ้นไปยังสถานะการจ่ายเงินที่ต่ำกว่า:
{$sort: {FTP_AVG: -1, PTM_AVG: -1}}
สิ่งนี้ควรอนุญาตให้เครื่องมือสร้างไปป์ไลน์การรวมต่อไปนี้:
[ {$match:{GovernmentFunction:'Financial Administration'}}, {$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}, {$sort: {FTP_AVG: -1, PTM_AVG: -1}} ]
การรันไปป์ไลน์การรวมควรให้ผลลัพธ์ดังนี้:
การก่อสร้างตึก
ในการสร้างแอปพลิเคชันข่าวกรองธุรกิจนี้ เราใช้ MEAN ซึ่งเป็นการรวมกันของ MongoDB, ExpressJS, AngularJS และ NodeJS
อย่างที่คุณอาจทราบแล้ว MongoDB เป็นฐานข้อมูลเอกสารแบบไม่มีสคีมา แม้ว่าเอกสารแต่ละฉบับที่จัดเก็บจะมีขนาดจำกัดที่ 16MB แต่ความยืดหยุ่นและประสิทธิภาพการทำงานควบคู่ไปกับเฟรมเวิร์กไปป์ไลน์การรวมที่มีให้ MongoDB เหมาะอย่างยิ่งสำหรับเครื่องมือนี้ การเริ่มต้นใช้งาน MongoDB นั้นง่ายมาก ต้องขอบคุณเอกสารประกอบที่ครอบคลุม
Node.js ซึ่งเป็นส่วนประกอบที่สำคัญอีกอย่างหนึ่งของ MEAN จัดเตรียมสภาพแวดล้อม Javascript ฝั่งเซิร์ฟเวอร์ที่ขับเคลื่อนด้วยเหตุการณ์ Node.js เรียกใช้ Javascript โดยใช้เครื่องยนต์ V8 ของ Google Chrome ความสามารถในการปรับขนาดของ Node.js คือสิ่งที่ขับเคลื่อนองค์กรต่างๆ
Express.js เป็นเฟรมเวิร์กเว็บแอปพลิเคชันยอดนิยมสำหรับ Node.js ทำให้ง่ายต่อการสร้าง API หรือเลเยอร์ธุรกิจฝั่งเซิร์ฟเวอร์ประเภทอื่นๆ สำหรับเว็บแอปพลิเคชัน มันเร็วมากเพราะมีลักษณะเรียบง่าย แต่ก็ค่อนข้างยืดหยุ่นเช่นกัน
AngularJS ซึ่งสร้างและดูแลโดยวิศวกรของ Google จำนวนหนึ่ง กำลังกลายเป็นเฟรมเวิร์ก Javascript ส่วนหน้าที่เป็นที่นิยมที่สุดอย่างรวดเร็ว
มีเหตุผลสองประการที่ MEAN ได้รับความนิยมและทางเลือกของเราสำหรับการพัฒนาแอปพลิเคชันที่ techXplorers:
ชุดทักษะนั้นเรียบง่าย วิศวกรที่เข้าใจ JavaScript ได้ดีในทุกเลเยอร์
การสื่อสารระหว่างฟรอนต์เอนด์กับชั้นธุรกิจไปยังชั้นฐานข้อมูลทั้งหมดเกิดขึ้นผ่านออบเจ็กต์ JSON ซึ่งช่วยประหยัดเวลาในการออกแบบและพัฒนาในเลเยอร์ต่างๆ ได้อย่างมาก
บทสรุป
ในบทช่วยสอนไปป์ไลน์การรวม MongoDB นี้ เราได้สาธิตวิธีที่ประหยัดต้นทุนในการมอบเครื่องมือแก่นักวิจัยที่สามารถใช้ข้อมูลการผลิตเป็นชุดข้อมูลเชิงสำรวจ และเรียกใช้ชุดการแปลงต่างๆ เพื่อวิเคราะห์และสร้างแบบจำลองได้
เราสามารถพัฒนาและปรับใช้แอปพลิเคชันนี้แบบ end-to-end ได้ในเวลาเพียง 3 วัน แอปพลิเคชันนี้ได้รับการพัฒนาโดยทีมวิศวกรที่มีประสบการณ์ 4 คน (2 คนในสหรัฐอเมริกาและ 2 คนในอินเดีย) และนักออกแบบและผู้เชี่ยวชาญด้าน UX อิสระที่ช่วยเราคิดเกี่ยวกับการออกแบบส่วนต่อประสาน ในอนาคต ฉันจะใช้เวลาในการอธิบายว่าการทำงานร่วมกันในระดับนี้ทำงานอย่างไรเพื่อสร้างผลิตภัณฑ์ที่ยอดเยี่ยมในเวลาอันสั้นอย่างไม่น่าเชื่อ
เราหวังว่าคุณจะใช้ประโยชน์จาก Aggregation Pipeline ของ MongoDB และมอบอำนาจให้นักวิจัยของคุณที่สามารถเปลี่ยนโลกได้ด้วยการวิเคราะห์และข้อมูลเชิงลึกที่ชาญฉลาด
แอปพลิเคชั่นนี้เล่นสดได้ที่นี่