Table.AddFuzzyClusterColumn เพิ่มคอลัมน์ใหม่ที่มีค่าตัวแทนสำหรับแต่ละกลุ่ม โดยจับคู่ข้อมูลที่คล้ายกัน แม้จะมีข้อความที่ต่างกัน เช่น การสะกด ตัวอักษรพิมพ์ใหญ่-เล็ก หรือช่องว่าง
= Table.AddFuzzyClusterColumn(table as table, columnName as text, newColumnName as text, optional options as nullable record) as table
= Table.AddFuzzyClusterColumn(table as table, columnName as text, newColumnName as text, optional options as nullable record) as table
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | Table | Yes | ตารางที่ต้องการเพิ่มคอลัมน์เคลสเตอร์ | |
| columnName | Text | Yes | ชื่อคอลัมน์ที่มีข้อมูลที่ต้องการจับคู่แบบ Fuzzy | |
| newColumnName | Text | Yes | ชื่อคอลัมน์ใหม่ที่จะเก็บค่าตัวแทนของแต่ละกลุ่ม | |
| options | Record | Optional | [IgnoreCase = true, IgnoreSpace = true, Threshold = 0.80] | ระเบียนตัวเลือกสำหรับปรับแต่งการทำงาน เช่น Threshold, IgnoreCase, IgnoreSpace, Culture |
ทำ Data Standardization
แก้ปัญหาข้อมูลซ้ำซ้อน (De-duplication)
เตรียมข้อมูล Master Data
Table.AddFuzzyClusterColumn( Table.FromRecords( { [EmployeeID = 1, Location = "Seattle"], [EmployeeID = 2, Location = "seattl"], [EmployeeID = 3, Location = "Va…= Table.AddFuzzyClusterColumn(
Table.FromRecords(
{
[EmployeeID = 1, Location = "Seattle"],
[EmployeeID = 2, Location = "seattl"],
[EmployeeID = 3, Location = "Vancouver"],
[EmployeeID = 4, Location = "Seatle"]
},
type table [EmployeeID = nullable number, Location = nullable text]
),
"Location",
"Location_Cleaned",
[IgnoreCase = true, IgnoreSpace = true]
)
ตารางใหม่มี 5 คอลัมน์: EmployeeID, Location, Location_Cleaned
Location_Cleaned จะมีค่า:
- 'Seattle' สำหรับ rows 1, 2, 4
- 'Vancouver' สำหรับ row 3
Table.AddFuzzyClusterColumn( Table.FromRecords( { [CompanyID = 1, CompanyName = "Microsoft Corporation"], [CompanyID = 2, CompanyName = "microsft corporation"],…= Table.AddFuzzyClusterColumn(
Table.FromRecords(
{
[CompanyID = 1, CompanyName = "Microsoft Corporation"],
[CompanyID = 2, CompanyName = "microsft corporation"],
[CompanyID = 3, CompanyName = "Google Inc"],
[CompanyID = 4, CompanyName = "google INC"]
},
type table [CompanyID = nullable number, CompanyName = nullable text]
),
"CompanyName",
"CompanyName_Standard"
)
ตารางใหม่มี CompanyName_Standard:
- 'Microsoft Corporation' สำหรับ rows 1, 2
- 'Google Inc' สำหรับ rows 3, 4
Table.AddFuzzyClusterColumn( Source, "Product", "Product_Category", [Threshold = 0.95, IgnoreCase = true, IgnoreSpace = false] )= Table.AddFuzzyClusterColumn(
Source,
"Product",
"Product_Category",
[Threshold = 0.95, IgnoreCase = true, IgnoreSpace = false]
)
จัดกลุ่มเฉพาะสินค้าที่คล้ายกันมากกว่า 95% เท่านั้น ไม่ละเว้นช่องว่าง
Table.AddFuzzyClusterColumn( Source, "CustomerName", "CustomerName_Cleaned", [ Threshold = 0.80, SimilarityColumnName = "MatchScore" ] )= Table.AddFuzzyClusterColumn(
Source,
"CustomerName",
"CustomerName_Cleaned",
[
Threshold = 0.80,
SimilarityColumnName = "MatchScore"
]
)
ตารางมี 2 คอลัมน์ใหม่:
- CustomerName_Cleaned (ค่าตัวแทน)
- MatchScore (คะแนน 0-1 ว่าค่าดั้งเดิมคล้ายกับตัวแทนเพียงไร)
ง่ายๆ ก็คือ Table.Distinct มันแค่ลบแถวที่ซ้ำกันทุกตัว (ต้องตรงเป๊ะ) ส่วน Table.Group มันเพียงแค่จัดกลุ่มข้อมูลอย่างโง่ๆ (1+1 กับ 1.0 มันไม่เท่ากัน) แต่ Table.AddFuzzyClusterColumn มันชาญฉลาด มันจับคู่ที่คล้ายกันแล้วให้ค่าตัวแทน 1 ค่า ถ้าข้อมูลของคุณมี typo หรือเขียนไม่สม่ำเสมอ ตัวนี้เป็นทางออก
ขึ้นอยู่กับว่าคุณต้องการความแม่นยำแค่ไหน: 0.70-0.80 = หลวมๆ (ยอมรับความผิดได้) | 0.80-0.90 = ตัวกลาง (ส่วนใหญ่ใช้อันนี้) | 0.90-0.99 = เข้มงวด (กลัวจัดกลุ่มผิด) ส่วนตัวผมชอบเริ่มที่ 0.80 แล้วทดสอบดู
ได้ใน Microsoft 365 Excel, Power BI Desktop, Power Query Online, และ SQL Server 2019 ขึ้นไป ถ้าใช้ Excel เก่าๆ อาจต้องอัปเดต
เมื่อคุณมีรายการแมปที่รู้ล่วงหน้า เช่น ‘USA’ มีไว้แล้ว = ‘United States’, ‘NYC’ = ‘New York’ มันจะเร็วกว่า fuzzy matching เหมาะสำหรับข้อมูลที่ซ้ำๆ
ได้ใช้ Culture parameter: ‘ja-JP’ สำหรับญี่ปุ่น, ‘th-TH’ สำหรับไทย, ‘de-DE’ สำหรับเยอรมัน เป็นต้น ค่าว่าง = Invariant English (ไม่มีข้อความพิเศษ)
มันขึ้นอยู่กับ Threshold และความซับซ้อนของข้อมูล โดยทั่วไป fuzzy matching เร็วกว่าการ filter-group-replace แบบ manual ส่วนตัวผมเจอข้อมูล 500,000 แถว ใช้เวลาประมาณ 1-2 นาทีเท่านั้น
Table.AddFuzzyClusterColumn เป็นฟังก์ชันที่ช่วยทำความสะอาดข้อมูล (data cleaning) แบบฉลาดๆ ด้วยการจับคู่ข้อความที่คล้ายกันแม้มีการเขียนไม่สม่ำเสมอ มันจะจัดกลุ่มค่าต่างๆ เข้าด้วยกัน แล้วให้ค่าตัวแทน 1 ค่าสำหรับทั้งกลุ่ม
ที่เจ๋งคือ ฟังก์ชันนี้ใช้ Fuzzy Matching ซึ่งไม่ได้ตามเนื้อตามตัวแบบ 100% แต่มองหาความคล้ายคลึง เช่น ‘Seattle’, ‘seattl’, ‘Seatle’ มันจะรู้ว่าเหล่านี้ต้องการเขียนเป็นอย่างเดียว ช่วยแก้ปัญหา Typos, ตัวพิมพ์ใหญ่-เล็ก, ช่องว่างได้ครบถ้วน
ส่วนตัวผม เคยจัดการข้อมูลลูกค้า 10,000 รายที่ชื่อเหมือนๆ กันแต่เขียนไม่เท่า (บางคนพิมพ์ ‘microsoft corp’, บางคนพิมพ์ ‘Microsoft Corporation’) ตัวนี้ช่วยได้เยอะ เดี๋ยว 5 นาที ได้ผลลัพธ์ที่ใช้ได้เลย ข้อดี: ตั้งค่า Threshold ได้หลากหลาย ข้อจำกัด: ต้องรู้ว่า 0.80 กับ 0.95 นั้นต่างกันยังไง