หลายครั้งที่ไปสอนสร้าง 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
- Wide form & Long form table
- Why Long form table?
- Duplicate this data
- Convert Wide to Long table in Google Sheet
- Convert Wide to Long table in Excel
- Convert Wide to Long table in R
- 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 เรื่องหลักๆ
- Data Variable: Dashboard จะเก็บ data เป็น variable หรือตัวแปร โดย map ข้อมูลจาก
- Variable name: ชื่อคอลัมน์
- Data: ข้อมูลที่อยู่ในคอลัมน์นั้นๆ
- 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
- Import Library และ Import Excel file: run code นี้เพื่อ import library และ data จาก excel file (แนะนำแยก cell run ตามด้านล่าง) จะได้ data จากไฟล์ตามรูป
# install packagesinstall.packages("tidyverse")install.packages("readxl")install.packages("janitor")# import librarylibrary(tidyverse) # common library for data manipulationlibrary(readxl) # library to read excel filelibrary(readr) # library to read/write csv filelibrary(janitor) # library for data cleaning
# import excel filedf <- read_excel("Wide form Sales data.xlsx", sheet = "sales_data")# convert to dataframedf <- data.frame(df)
# display datadf

2. Convert to long form table: run code นี้ใน cell ใหม่ โดยใช้ function pivot_longer() เพื่อแปลงเป็น long form table
# Convert Wide form to Long form tabledf_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 datahead(df_long)

3. Pivot Metric column : run code นี้ใน cell ใหม่เพื่อกระจาย (pivot) Sales Amount, Quantity และ Profit แยกเป้นคอลัมน์ของตัวเอง โดยใช้ pivot_wider()
# Convert pivot Metric to each columnsdf_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 datahead(df_long2)
4. Format Date: เนื่องจากวันที่ได้ถูกเปลี่ยนเป็น format ของ text จึงต้องมีการแปลงกลับมาด้วย code ต่อไปนี้
# Correct Date formatdf_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 filewrite_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:
Be Better Together
มาเก่งขึ้นไปพร้อมกันกับเรา สมัครรับ Content ใหม่ๆ ส่งตรงถึง inbox ฟรี!

Leave a comment