ปัญหาที่พบบ่อยตอนสร้าง Dashboard: Wide table

หลายครั้งที่ไปสอนสร้าง Dashboard ปัญหาส่วนใหญ่ของนักเรียนไม่ได้อยู่ที่การ Connect data หรือสร้าง Chart เลย

งานสร้าง Dashboard ให้ลูกค้าของผมเองก็ด้วย

ปัญหาที่มักจะเจอกันคือ ข้อมูลไม่ได้อยู่ในรูปแบบที่ถูกต้อง และเคสที่เจอมากที่สุดคือ ข้อมูลที่เป็นตารางแนวกว้าง หรือ Wide form table

โพสนี้เรามาเรียนวิธีการแปลง Wide table เป็น Long table กัน จัดเต็มทั้ง 3โลก Excel, Google Sheet และ Coding (R) จะไปสร้าง Dashboard บน Looker studio, PowerBI หรือ Tableau ก็ชิลลล~

ผ่านโพสนี้ลดปัญหาเรื่องการนำข้อมูลขึ้น Dashboard ได้กว่า 80% เลย แถม Report เราก็ flexible มากขึ้นด้วย ไปลุยกันคร้าบบ

Table of Contents

  1. Wide form & Long form table
  2. Why Long form table?
  3. Duplicate this data
  4. Convert Wide to Long table in Google Sheet
  5. Convert Wide to Long table in Excel
    1. Connect Excel to PowerBI
  6. Convert Wide to Long table in R
    1. Google Colab
    2. Basic Jupyter notebook
    3. Running R Code
  7. Transferable Knowledge

Wide form & Long form table

เรามารู้จัก Wide form table กันนิดนึงก่อนคร้าบ

โครงสร้างของตารางที่เราเก็บข้อมูลใน Spread Sheet (Excel, Google Sheets) มีอยู่ แบบคือ

Long form table: เป็นรูปแบบตารางที่มีการบึนทึกข้อมูลใหม่เพิ่มเข้าไปในแนวดิ่ง (Vertical) หรือแนวยาว
Long form table มักพบจาก Database ของบริษัท, ข้อมูล Transaction ต่างๆที่ export มาจาก platform online

Wide form table: เป็นอีกรูปแบบที่ตารางจะมีการลงบันทึกข้อมูลใหม่เพิ่มไปในแนวนอน (Horizontal) หรือแนวกว้าง
Wide form ในการทำงานทั่วไปเราจะพบบ่อยกว่า Long form เช่น ยอดขายรายเดือน, ยอดผลิตรายเดือน

Wide form table จะแสดงข้อมูลที่สามารถอ่านทำความเข้าใจได้ง่าย เพราะธรรมชาติเราถนัดอ่านจากซ้ายไปขวา จึงเหมาะกับงานทำ Report และ Presention

Why Long form table?

ในการพัฒนา application ขึ้นมา Developper (ผู้พัฒนา) จะต้องกำหนดโครงสร้างของ Input ที่เข้ามาให้เป็นมาตรฐานเดียวกัน (Standard structure) เพื่อให้แอพทำงานได้ถูกต้อง และเต็มประสิทธิภาพ

เหตุผลที่ Dashboard รวมถึง Pivot table ทำงานได้ดีกับ Long form table มีอยู่ 2 เรื่องหลักๆ

  1. Data Variable: Dashboard จะเก็บ data เป็น variable หรือตัวแปร โดย map ข้อมูลจาก
    • Variable name: ชื่อคอลัมน์
    • Data: ข้อมูลที่อยู่ในคอลัมน์นั้นๆ
  2. Data Filtering: การกรองข้อมูลเฉพาะ rows ที่ต้องการ
    • อันนี้ทุกคนลองนึกภาพ ตอนที่เราใส่ filter ที่ชื่อคอลัมน์เพื่อกรองข้อมูลตามที่เราเลือก เหมือนกันเลย

Q: แล้วถ้าปกติเราลงข้อมูลเป็น wide form อยู่ ต้องเปลี่ยนไปลงข้อมูลเป็น long form มั๊ยครัช?
A: ‘ไม่เสมอไป’ วิธีที่จะเรียนต่อไปนี้จะช่วยให้เราส่งข้อมูลเป็น long form โดยที่ยังลงข้อมูลเป็น wide form ได้ไปดูกันคร้าบ

Duplicate this data

ให้ทุกคนเข้าไปที่ Google Sheets ตามลิ้งค์ที่ให้ไว้ด้านล่างนี้ แล้วกด File > Make a copy เพื่อสร้างเป็นไฟล์ของเราเองที่แก้ไขได้ครับ

https://link.datatrippu.com/aD5LOW

เราจะใช้ dataset นี้ฝึกการแปลง wide form -> long form table กัน

Convert Wide to Long table in Google Sheet

การแปลง wide form -> long form บน Google Sheets นับเป็นวิธีที่ง่าย และ simple ที่สุดสำหรับข้อมูลที่ไม่ซับซ้อน และมีปริมาณไม่มาก ทั่วไปผมแนะนำไม่เกิน 10k rows ถือว่าโอเคเลย

ทั่วไปวิธีที่ง่ายที่สุดคือการใช้ Function TRANSPOSE() ก็สามารถแปลง wide เป็น long form table ได้เลย แต่ในงาน data เรามักจะเจอ case ที่พลิกตารางตรงไปตรงมาได้แบบนี้ไม่มากครับ

ถ้าแบบนั้นจะมีวิธีที่ flexible มากขึ้นตามที่จะสอนต่อไปนี้ โดย Function ของ Google Sheets จำเป็นต้องรู้มี 3 ตัวคือ

  • FLATTEN: ใช้สำหรับ ‘ยุบ’ ข้อมูลใน table มาอยู่ใน cell เดียว แล้วคั่นด้วยตัวเชื่อมหรือ delimiter เช่น “,” “_” “|”
  • SPLIT: ใช้ประจาย data ที่อยู่ใน cell เดียวกันออกไปโดยแบ่ง cell ตาม delimiter ที่เรากำหนดไว้ตอนแรก
  • ARRAYFORMULA: เราใช่ Arrayformula ในการข้อมูลที่เป็น range หรือ array โดยไม่ต้องเขียนสูตรซ้ำทุก cell

ทุกคนสามารถดู guideline ว่าต้องใส่ input อะไรบ้างใน Google sheets หรือถามจาก GenAI ได้เลย

ตัวอย่างการใช้งาน

# Formula
=ARRAYFORMULA(SPLIT(FLATTEN(B1:Z1&"_"&B2:Z2&"_"&B3:Z3&"_"&B4:Z4), "_"))
# ความหมาย
ARRAYFORMULA(SPLIT(FLATTEN(LtCol1&"_"&LtCol2&"_"&LtCol3&"_"&...), "_"))
LtCol: ลำดับของ Column ใน Long form table ที่ต้องการ

ถ้าแปลเป็นคำพูดคือ
” จงเอา range B1:Z1 ไปเป็น Column1, เอา range B2:Z2 ไปเป็น Column2 โดยเชื่อมแต่ละ row กันด้วย “_” ก่อนแล้วจึงกระจาย (split) ออกมาเป็น แต่ละคอลัมน์โดยแยกตาม “_”

เสร็จเราจะได้ Long form table ออกมา ให้ตั้งชื่อคอลัมน์ให้เรียบร้อย พร้อม connect ไปที่ Dashboard คร้าบ

Google Sheets จะเหมาะมากถ้า Connect data ไปแสดง dashboard ที่ Google Looker Studio เพราะเป็น ecosystem ของ Google อยู่แล้ว

ถ้าอยากเรียนเกี่ยวกับ Looker Studio เพิ่มสามารถไปอ่านได้ที่โพสนี้เลยคร้าบ
🔗link: https://datatrippu.com/2024/04/28/import-data-to-looker/

Convert Wide to Long table in Excel

มาต่อกันที่ Excel ครับ ทีนี้เราไม่ต้องใช้สูตรเหมือนกับ Google Sheets แล้วเพราะเรามีตัวช่วยคือ PowerQuery สามารถแปลง Wide เป็น Long ให้เราได้เลย

ปล.ผมข้อข้ามเรื่อง function TRANSPOSE() ไปนะครับเพราะใช้เหมือน Google Sheets เลย

อันดับแรกให้เราไปที่ Google Sheet แล้ว Download file ออกมาเป็น Excel (.xlsx)

ไปที่ File > Download > Microsoft Excel (.xlsx)

เปิดไฟล์ excel ขึ้นมาแล้วไปที่ชีท sales_data

คลิ๊กที่ data เราตรงไหนก็ได้ > Data > เลือก From Table/Range แล้วจะมี pop-up ของ PowerQuery ขึ้นมา

ให้เลือกคลุมคอลัมน์ที่ต้องการ convert ไปที่Transform > เลือก Unpivot Columns จะได้ตารางที่เป็น Long form มา

unpivot table = การ convert wide form > long form table

ถ้าจะให้แยก value ตามแต่ละ metric (Sales, Quantity, Profit) เหมือนในข้อ Google Sheets ให้ เลือกคอลัมน์ Metric แล้วไปที่ Transform > เลือก Pivot Columns

เลือก Values Column เป็นคอลัมน์ชื่อ Value เพื่อเอาค่ากระจาย (Pivot) ใส่คอลัมน์ที่เรากระจายออกมา

ทีนี้ข้อมูลเราก็จะเป็น Long form พร้อมสำหรับส่งขึ้น Dashboard ด้วย file excel ได้แล้ว

Connect Excel to PowerBI

แถมนิดนึงครับ ถ้าเราตั้งใจไว้แล้วว่าจะสร้าง Dashboard บน PowerBI เราสามารถ Connect data จาก PowerBI ได้เลยคร้าบ

ไปที่ Data > เลือก Excel workbook แล้วเลือกไฟล์ excel ที่ต้องการ

เลือก sheet ที่มี data ที่ต้องการ connect แล้วเลือก Transform Data
จากนั้นให้ convert table ด้วย PowerQuery เหมือนด้านบน

เสร็จแล้วให้กด Close & Apply เท่านี้ก็เริ่มสร้าง Dashboard ได้เลย

ทั้ง 2 วิธีที่เรียนมา ถ้าจำนวน rows ไม่มาก และต้องการตารางที่ไม่ซับซ้อนมาก เท่านี้ก็สบายๆแล้ว

Q: ถ้าข้อมูลมีเป็น แสน เป็นล้าน rows จะทำยังไงดี?
A: วิธีที่ตอบโจทย์ที่สุดคือการเขียน code เลยครับ

Convert Wide to Long table in R

สำหรับใครที่ไม่เคยเขียน code มาก่อน ไม่ต้องกังวลครับ เรามาทำตามไปพร้อมกันได้เลย ถ้าใครลองแล้วรู้ว่า “นี่แหละทางของเรา” ก็ค่อยไปศึกษาเพิ่มเติมนะครับ 555+

สายงาน Data ถ้าเขียน code ภาษาที่นิยมกันมาสุดคือ R และ Python ที่ผมเลือก R เพราะเป็นภาษาอ่านเข้าใจง่าย และเหมาะกับงานวิเคราะห์ข้อมูลมากกว่า

แต่ๆๆๆๆๆๆ…. อย่ายึดติดกับภาษาเลยครับผมแนะนำ อ้าววว 555+

Python เดี๋ยวนี้มี Library ที่เร็วไม่แพ้ R เหมือนกัน ในบางงาน Python จะเหมาะกว่าเพราะมี Library กับ ecosystem ที่ support งานเราได้ดีกว่า R ดังนั้น

“ใช้เครื่องมือให้เหมาะกับงานก็พอ คร้าบ~”

Google Colab

Google Colab เป็น Jupyter notebook ใช้เขียน code ของ Google ข้อดีคือ ใช้งานได้ฟรีบน web browser ขอแค่มีเน็ต กับ Google account ก็พอ

🔗ให้เข้าไปที่ลิ้งนี้เลยคร้าบ https://colab.google/

เข้ามาแล้วกดที่ Open Colab ได้เลย

เมื่อเข้ามาที่หน้า Jupyter notebook แล้ว ให้ไปที่ File > New notebook in Drive ระบบจะให้เรา Sign-in ด้วย google account ของเราก่อน

เสร็จให้เราตั้งชื่อไฟล์ก่อน (เหมือน Google sheet เลยไหมล่ะ) แล้วไปที่ Runtime > Change runtime type แล้วเปลี่ยน Runtime type จาก Python ไปเป็น R แล้วกด Save

ไปที่ไอคอน folder ด้านซ้าย กด upload ไฟล์ excel (.xlsx) ที่โหลดมาจาก Google Sheets ก่อนหน้านี้

Basic Jupyter notebook

ขอแทรกพื้นฐานการใช้ Jupyter notebook นิดนึงคร้าบ

  • กด +Code เพื่อเพิ่ม cell หรือ block ที่ใช้สำหรับเขียน code
  • กด +Text เพื่อเพิ่ม cell หรือ block ที่ใช้สำหรับเขียน comment
  • กด ▶️หรือ Ctrl+Enter เพื่อ run code ใน cell นั้น
  • ใช้ “#” เพื่อ เปลี่ยน code ในบรรทัดนั้นเป็น comment (text) จะไม่มีผลต่อการ run code

Running R Code

  1. Import Library และ Import Excel file: run code นี้เพื่อ import library และ data จาก excel file (แนะนำแยก cell run ตามด้านล่าง) จะได้ data จากไฟล์ตามรูป
# install packages
install.packages("tidyverse")
install.packages("readxl")
install.packages("janitor")
# import library
library(tidyverse) # common library for data manipulation
library(readxl) # library to read excel file
library(readr) # library to read/write csv file
library(janitor) # library for data cleaning
# import excel file
df <- read_excel("Wide form Sales data.xlsx", sheet = "sales_data")
# convert to dataframe
df <- data.frame(df)
# display data
df

2. Convert to long form table: run code นี้ใน cell ใหม่ โดยใช้ function pivot_longer() เพื่อแปลงเป็น long form table

# Convert Wide form to Long form table
df_long <- df %>%
pivot_longer(
cols = -Metric, # Exclude the 'Metric' column from pivoting
names_to = "Date", # Name for the new column of Date
values_to = "Value" # Name for the new column storing the values
)
# Preview data
head(df_long)

3. Pivot Metric column : run code นี้ใน cell ใหม่เพื่อกระจาย (pivot) Sales Amount, Quantity และ Profit แยกเป้นคอลัมน์ของตัวเอง โดยใช้ pivot_wider()

# Convert pivot Metric to each columns
df_long2 <- df_long %>%
pivot_wider(
names_from = Metric, # pivot column Metric to each columns
values_from = Value # Value from column to fill in new columns
) %>%
# clean columns name
clean_names()
# Preview data
head(df_long2)

4. Format Date: เนื่องจากวันที่ได้ถูกเปลี่ยนเป็น format ของ text จึงต้องมีการแปลงกลับมาด้วย code ต่อไปนี้

# Correct Date format
df_final <- df_long2 %>%
mutate(
# convert Date to date format, Cleaned_Date to format 'Month-Year'
date = as.Date(as.numeric(str_remove_all(date, "X|\\.0")), origin = "1899-12-30"),
# convert Date to date format, Cleaned_Date to format 'Month-Year'
cleaned_date = format(date, "%b-%Y")
)
head(df_final)

5. Export to CSV file: ผมเลือก export เป็น .csv file เพราะมีขนาดเล็กและสามารถเปิดด้วย Google Sheets, Excel หรือ import ไปที่ Dashboard ได้ปกติ

# Export to excel file
write_csv(df_final, "long_sales_data.csv")

ไฟล์ที่ export จะอยู่ในไอคอน folder ด้านซ้ายมือให้คลิ๊กขวา แล้วกด Download มาที่เครื่องของเราเพื่อไปใช้งานต่อได้เลยคร้าบ

Transferable Knowledge

ใครเรียนตามมาถึงตรงนี้น่าจะเห็นภาพแล้วว่า การแปลง Wide เป็น Long table ไม่ว่าจะทำใน platform ไหน วิธีคิดไม่ได้แตกต่างกันเลย

เราต้องรู้ก่อนว่าเราต้องการ‘อะไร’ (What) แล้วจึงหาวิธีว่าต้องทำ‘อย่างไร’(How) เพื่อให้ได้ผลลัพธ์ที่ต้องการ

Concept ที่เราได้รู้จากโพสนี้อีกอย่างคือ Transferable knowledge คือความรู้ “ไม่ยึดติด” กับ platform

เหมือนกับบรูซ ลี (Bruce Lee)นักแสดง นักศิลปะการต่อสู้ และยังเป็นนักปรัชญา “ทำตัวให้เป็นน้ำ” ที่เข้าได้กับทุกภาชนะ เหมือนชีวิตที่ปรับตัวได้ไปตามสถานการณ์

Be Water, My Friend.” – Bruce Lee (1940-1973)

ใครเรียนมาถึงตรงนี้ เป็นยังไงบ้างยังไหวกันอยู่มั๊ย 555+ ใครทำทั้ง 3 วิธี หรือลองแค่บางวิธี ชอบโพสนี้ตรงไหน comment บอกกันได้เลยย~

แล้วเจอกันใหม่โพสหน้าคร้าบบ

Share this:

More contents:

Leave a comment

Be Better Together

มาเก่งขึ้นไปพร้อมกันกับเรา สมัครรับ Content ใหม่ๆ ส่งตรงถึง inbox ฟรี!