Dataset: https://www.kaggle.com/datasets/jeetahirwar/northwind-traders/data
Data ชุดเริ่มต้น มีทั้งหมด 7 ตาราง ได้แก่
- orders
- order_details
- customers
- employees
- products
- categories
- shippers
- เป็น snowflake schema และเป็น normalization
Fact Table | Dimension Table |
---|---|
- orders | - order_details |
- customers | |
- employees | |
- products | |
- categories | |
- shippers |
การ Clean and Transform Data
- Use First Row as Header มีบางตารางที่ชื่อ header ไม่ถูต้อง
- Merge Queries รวมตาราง employee เข้าด้วยกันเอง เพื่อสร้างคอลัมน์ managerName
- Sorting Row เรียงข้อมูลเป็นลำดับตามมิติที่เราต้องการ เช่น เรียงตามลำดับ emloyeeID
- Renaming Columns ปรับเปลี่ยนชื่อคอลัมน์ให้เป็นแบบที่เข้าใจง่าย
- Data Type Conversion เปลี่ยนประเภทข้อมูลในคอลัมน์ให้ถูกต้องและเหมาะสม เช่น number to text
- Handling Null Values ค้นหาคอลัมน์ที่มี Null Values และจัดการกับค่าเหล่านั้น
- Handling Date and Time จัดการกับข้อมูลวันที่และเวลาให้มีความถูกต้องและเป็นรูปแบบเดียวกัน
- Handling Currencies แปลงค่าตัวเลขในคอลัมน์ให้เป็นค่าเงิน เช่น เปลี่ยนเป็นค่าเงินดอลลาร์
- Genarate Date Table เป็นตารางที่ถูกสร้างขึ้นมาเฉพาะเพื่อเก็บข้อมูลวันที่ โดยใช้ฟังก์ชัน Power Query
- Change Data Category ระบุว่าคอลัมน์ "Country" และ "City" เป็นข้อมูลประเภทที่อยู่
การตั้งคำถามจาก Dataset แบ่งออกเป็นแต่ละหมวด
Overview;
- What is the net sales?
- How many orders have been processed?
- How many products have been sold?
- What is the total amount of discounts?
- What is the sales trend over the months?
Products;
- How many products are in the catalog?
- What are the top 10 selling products?
- Which category has the most purchases?
- How many products have been discontinued?
- Which category has the most discounted products?
Customers;
- How many customers have been attended to?
- In which countries are these customers located?
- Who are the top 5 customers by net sales?
- Who are the top 5 customers by products bought and orders?
- Which country has the most sales?
Shipping;
- Which shipping company is used the most?
- How many orders have been shipped and unshipped?
- How much freight was paid to the shippers?
- What is the on-time delivery rate?
- How many products were delivered on time, late, and not shipped?
Employees;
- How many employees work in the offices?
- How many managers?
- Who is the most active employee in terms of sales made?
- Which employee has handled the most orders?
- What are the offices’ order and sales performance?
คำสั่ง DAX Measures
- Net Sales = CALCULATE(SUM(order_details[net sales]), USERELATIONSHIP(orders[orderDate], 'date_table'[Date]) )
- Gross Sales = CALCULATE(SUM(order_details[gross sales]), USERELATIONSHIP(orders[orderDate], 'date_table'[Date]))
- Discounts = [Gross Sales] - [Net Sales]
- Freight Paid = CALCULATE(SUM(orders[freight]), USERELATIONSHIP(orders[orderDate], 'date_table'[Date]) )
- Products Sold = CALCULATE(COUNT(order_details[orderID]), ISBLANK(order_details[orderID]) = FALSE(), USERELATIONSHIP('date_table'[Date], orders[orderDate]) )
- Shipped Orders = CALCULATE(COUNT(orders[shippedDate]), USERELATIONSHIP('date_table'[Date], orders[shippedDate]) )
- Total Orders = CALCULATE(COUNT(orders[orderDate]), USERELATIONSHIP('date_table'[Date], orders[orderDate]) )
- On-time = CALCULATE(COUNT(orders[deliveryStatus]), orders[deliveryStatus] = "On-time")
- Not Shipped = VAR NotShippedCount = CALCULATE( COUNT(orders[orderID]), ISBLANK(orders[shippedDate]), USERELATIONSHIP(orders[shippedDate], 'date_table'[Date]) ) RETURN IF(NotShippedCount = 0, 0, NotShippedCount)
- On-time Delivery Rate = CALCULATE(DIVIDE([On-time], [Total Orders]) , USERELATIONSHIP(orders[shippedDate], 'date_table'[Date]))
- Discontinued Products = VAR DiscontinuedCount = CALCULATE( COUNT(products[discontinued]), products[discontinued] = 1, USERELATIONSHIP('date_table'[Date], orders[orderDate]) ) RETURN IF(DiscontinuedCount = 0, 0, DiscontinuedCount)
คำสั่ง DAX Column
- Month_EN = FORMAT(date_table[Date],"MMMM")
- Day of WeekMonth_EN = FORMAT(date_table[Date],"dddd")
- Net Sales = [UnitPrice] * [Quantity] * (1-[Discount])
- Gross Sales = [UnitPrice] * [Quantity]
- deliveryStatus = SWITCH(TRUE(), ISBLANK(orders[shippedDate]), "Not Shipped", orders[shippedDate] <= orders[requiredDate], "On-time", orders[shippedDate] > orders[requiredDate], "Late")
Data Visualization
- Overview
- Products
- Customers
- Shipping
- Employees