มาเขียนเรื่อง Power BI กันบ้าง 555 เพื่อ Recap กันลืมมม 😹
(จริงๆ นี่คืองานหลักของพลอยเลยแหละ แล้วค่อนข้างใช้เวลากับ Power BI เยอะมากก ก.ไก่ล้านตัว)
ซึ่งวันนี้จะขอเลือกเรื่องนี่เห็นภาพค่อนข้างสนุกที่เล่น Interaction กับ Map มาให้ดูกันค่ะ
ใน Power BI มี Map Visuals ซึ่งเราคุ้ยเคยกันดี ในการทำภาพ visuals ที่ข้อมูลอ้างอิงถึงภูมิภาค หรือพื้นที่ใดๆ ใช่ไหมคะ ซึ่งการทำเป็นภาพ จะช่วยให้เราสามารถ เห็นความแตกต่างได้อย่างชัดเจน
ทำไมถึงต้องแสดงผลแบบนี้นะ ?
พลอยมีโอกาสได้ทำโปรเจค เกี่ยวกับการพล็อตจุดลูกค้า ว่าลูกค้าที่บริษัทถืออยู่
อยู่ส่วนไหนบ้างในภูมิภาคของประเทศ และจุดประสงค์หลักคือ ต้องการให้ User ที่เป็นเซลล์แมนของเราได้เข้าไปพบลูกค้า และไม่สูญเสียโอกาสในการเดินทาง จึงจะแสดงลูกค้าที่อยู่ใกล้เคียงให้ด้วยในระยะทาง 5 กิโลเมตร
แต่ปกติ เจ้า Visuals Map ของเราเนี่ย จะใส่ Latitude และ Longitude และแสดงเป็นจุด Bubble กลมๆ และถ้าเราเลือกแบบตรงไปตรงมา มันจะแสดงแค่จุดๆเดียวแบบนี้ … 👇

แต่เราต้องการให้ สามารถเลือกและแสดงจุดที่ใกล้เคียงกัน ภายในรัศมี 5 กิโลเมตร และต้องการให้ User รู้ว่า ลูกค้าที่ใกล้เคียงกันเนี่ยเป็นลูกค้าปัจจุบัน หรือ ลูกค้า Lead และลูกค้าที่เราเลือกเป็นจุดไหน อันนี้คือโจทย์ที่ต้องการ Visuals ที่เราต้องการ
ในภาพพลอยให้จุดสีเขียว เป็นจุดลูกค้าที่เราเลือก จุดสีชมพูเป็นจุดของลูกค้าปัจจุบันที่ใกล้เคียง และจุดสีเหลืองคือจุดของลูกค้า Lead ที่ใกล้เคียง

วิธีการทำอย่างไร ?
วิธีการทำ เราจะเริ่มดังนี้ค่ะ ✍️
1 เราจะเขียน table cross join เพื่อ join ลูกค้าที่เป็นชุดข้อมูลเดียวกันของแต่ละ
เซลล์แมนเข้าด้วยกัน เพื่อหาระยะห่างระหว่างจุดของลูกค้า ว่าระยะห่าง ระหว่างจุดเป็นเท่าไร ซึ่งพลอยจะตั้งชื่อ ให้แตกต่างกัน (แต่ชุดข้อมูลเดียวกันนั่นแหละ) เพื่อแบ่งว่าเป็นแหล่งลูกค้าที่เซลล์ต้องเข้าพบ ‘SourceCustomer’ และ ลูกค้าเป้าหมายใกล้เคียง ‘TargetCustomer’ ซึ่ง DAX เราเขียนประมาณนี้ค่ะ
CustomerDistance =
CALCULATETABLE(
FILTER(
CROSSJOIN(
SELECTCOLUMNS(
'YourTable',
"Salesman", 'YourTable'[Salesman],
"SourceCustomer", 'YourTable'[Customer],
"SourceLat", 'YourTable'[Latitude],
"SourceLon", 'YourTable'[Longitude]
),
SELECTCOLUMNS(
'YourTable',
"SalesmanTarget", 'YourTable'[Salesman],
"TargetCustomer", 'YourTable'[Customer],
"customer_target_name", 'YourTable'[customer_name],
"TargetLat", 'YourTable'[Latitude],
"TargetLon", 'YourTable'[Longitude]
)
),
[Salesman] = [SalesmanTarget]
),
'YourTable'[Latitude] <> BLANK(),
'YourTable'[Latitude] <> -180
)
** อธิบายเพิ่มเติมในส่วนของ cross join คือ การรวมข้อมูลแบบไขว้ โดยการนำแต่ละแถวจากตารางแรก ไปจับคู่กับแต่ละแถวของตารางที่สอง เพื่อให้ได้ผลลัพธ์ของข้อมูลที่ต้องการซึ่งมันจะรวมทุกความเป็นไปได้ในตารางเดียว เพื่อให้เห็นภาพ รูปแบบของมันจะเป็นจังซี่ 👇ขอขอบคุณรูปภาพจาก WIX


ทีนี้เราจะได้ Table: CustomerDistance ที่ รวมลูกค้าทุกความเป็นไปได้ ทั้งหมด ของแต่ละเซลล์แมนเเล้ว
2 เราจะหาระยะห่างของลูกค้า ในแต่ละลูกค้าแต่ละจุด ทุกความเป็นไปได้ มีระยะห่างกันเท่าไรบ้าง จาก Latitude และ Longitude ของ SourceCustomer และ TargetCustomer โดยการ Add New Column และ เขียน DAX เพื่อ Calulate ดังนี้
DistanceKM =
VAR Lat1 = RADIANS(CustomerDistance[SourceLat])
VAR Lon1 = RADIANS(CustomerDistance[SourceLon])
VAR Lat2 = RADIANS(CustomerDistance[TargetLat])
VAR Lon2 = RADIANS(CustomerDistance[TargetLon])
VAR DLat = Lat2 - Lat1
VAR DLon = Lon2 - Lon1
VAR A = POWER(SIN(DLat / 2), 2) + COS(Lat1) * COS(Lat2) * POWER(SIN(DLon / 2), 2)
VAR C = 2 * ATAN(SQRT(A) / SQRT(1 - A))
RETURN 6371 * C // 6371 km = radius of Earth
ซึ่งสูตรนี้ บอกตามตรงว่าค่อนข้างลึกและพลอยถามน้อง ChatGPT มา 555 (ค่อนข้างช่วยได้เยอะเลย) ขออธิบายตามความเข้าใจดังนี้ค่ะ
คือเราต้องการหาระยะห่างระว่างจุด 2 จุด บนโลก ซึ่งสูตรที่ใช้แทนในตัวแปร A และ C เป็นส่วนหนึ่งของสูตร “Haversine”
– ซึ่งใช้ในการคำนวณระยะทางเชิงมุมระหว่างจุดสองจุดบนทรงกลม ซึ่งหน่วยที่ได้จากการ ลบระหว่าง Lat และ Lon มีหน่วยเป็นเรเดียน
– และเมื่อคำนวณความโค้งระหว่างจุด 2 จุด ด้วยสูตรของตัวแปร A ซึ่งเป็นสูตรคำนวณความโค้งระหว่างจุดสองจุด โดยใช้ตรีโกณมิติ
– C คือการคำนวณมุมเชิงกลาง (angular distance) บนทรงกลมระหว่างจุดสองจุด
– ส่วนค่าที่คืนออกมา จะต้องนำไปคูณกับ 6,371 ซึ่งเป็นค่ารัศมีของโลกนั่นเองงง 🌎

อ่ะทีนี้.. เราจะเอาส่วนนี้แหละมาแสดงบน Visuals หลาวว
โอ้วตื่นเต้นไหม 🤣
แต่ … ก่อนไปลาก Visuals เราต้องการอีก 1 Step ก่อน คือ ….
3. เขียน Measure ShowNearby คือ เราจะใช้ Measure นี้กรองว่าลูกค้าใกล้กันภายในรัศมี 5 กิโลเมตรหรือเปล่า โดยกำหนดค่าว่า ถ้าใกล้ภายในรัศมี น้อยกว่าหรือเท่ากับ 5 ให้เป็น 1 และถ้าไม่ใช่ให้เป็น 0 โดย DAX ที่ใช้เขียนคือดังนี้
ShowNearby =
VAR SelectedSourceID = SELECTEDVALUE(CustomerDistance[SourceCustomer])
RETURN
IF (
ISBLANK(SelectedSourceID),
1,
IF (
CALCULATE(
COUNTROWS(CustomerDistance),
FILTER(
CustomerDistance,
CustomerDistance[SourceCustomer] = SelectedSourceID &&
CustomerDistance[DistanceKM] <= 5
)
) > 0,
1,
0
)
)
4. ลากลง Visuals Map กัน
ในที่นี้พลอยใช้ Azure Map และใช้ Column TargetLat กับ TargetLon มาเป็นตัวแสดงผลบน Visuals จากนั้นเราจะลาก Measure ShowNearby มาไว้ตรง Filter และกำหนดให้เท่ากับ 1

จะเห็นว่าสี ยังเป็น โมโนโทนอยู่ 555 การกำหนดสีของจุดก็สำคัญ แต่ทีนี้ เราอยากได้ตั้ง 3 สี ในจุดๆเดียว หรือมากกว่านั้นด้วย เราควรทำจังได๋ล่ะ 🧐
5. เขียน Measure PointType เพื่อกำหนดสี ของจุดแต่ละจุด เนื่องจาก Bubble ของเราเป็นจุด Lat log และไม่รู้เลยว่าจุดไหน คือลูกค้าปัจจุบัน ลูกค้า Lead และลูกค้าที่เราเลือก การกำหนดสีเพื่อแบ่งแยกเลยสำคัญ
ขั้นตอนการแบ่งแยกว่าเป็นลูกค้ากลุ่มไหน ต้องเขียน Measure ขึ้นมาเพื่อแบ่งแยกลูกค้าก่อน โดย DAX ในรายละเอียดด้านล่าง
ซึ่งพลอยแบ่งเป็น 2 กรณีด้วยกันคือ กรณีที่เรายังไม่ได้เลือกลูกค้า และกรณีที่เลือกลูกค้าแล้ว โดยจำแนกลูกค้า Lead จากชื่อ
PointType =
VAR SelectedSource = SELECTEDVALUE(CustomerDistance[SourceCustomer])
VAR ThisTarget = SELECTEDVALUE(CustomerDistance[TargetCustomer])
VAR ThisName = SELECTEDVALUE(CustomerDistance[TargetCustomer])
VAR IsLead = CONTAINSSTRING(ThisName, "LEAD")
-- กรณียังไม่เลือกใครเลย ให้แยกสีตามคำว่า LEAD
VAR NoSelectionLogic =
SWITCH(
TRUE(),
IsLead, "ลูกค้า LEAD",
NOT IsLead, "ลูกค้าปัจจุบัน"
)
-- กรณีมีการเลือกลูกค้า
VAR IsSelected = ThisTarget = SelectedSource
VAR IsNearby =
CALCULATE(
COUNTROWS(CustomerDistance),
FILTER(
CustomerDistance,
CustomerDistance[SourceCustomer] = SelectedSource &&
CustomerDistance[TargetCustomer] = ThisTarget &&
CustomerDistance[DistanceKM] <= 5
)
) > 0
RETURN
IF (
ISBLANK(SelectedSource),
NoSelectionLogic,
SWITCH(
TRUE(),
IsSelected, "ลูกค้าที่เลือก",
IsNearby && IsLead, "ลูกค้า LEAD",
IsNearby, "ลูกค้าปัจจุบัน",
BLANK()
)
)
จากนั้นเราจะไปกำหนดสีใน Format Visual ดังนี้


เท่านี้เราก็จะได้สีแต่ละจุดเรียบร้อย
จากนั้นเราลาก Visual ที่ชื่อว่า Table แล้ว ใช้ Column ‘SourceCustomer’ เป็นตัวเลือก ในส่วนของพลอยนำไป Join อีก Table โดยใช้ ‘SourceCustomer’ และ Column ‘Salesman’ เป็น Key ในการ Join ค่ามา จากนั้นทดสอบการ Interaction ได้เลยยยย 🤗
ผลลัพธ์
เท่านี้เราก็จะได้ Power BI Visual Map ที่เห็นภาพชัดเจนมากขึ้นในหน้าเดียวค่ะ

ขอบคุณที่เข้ามาอ่านบันทึกกันลืมของพลอยกันจนถึงตรงนี้ค่า
แล้วพบกันใหม่ในบทความหน้าน้าค้า 🤗
👩🏻💻

ใส่ความเห็น