Author: Shinin Varongchayakul

  • R Foundation: ทำความรู้จักกับภาษา R สำหรับผู้เริ่มต้น – ภาษา R คืออะไร, ต่างกับ Python ยังไง, และเขียนยังไง?

    R Foundation: ทำความรู้จักกับภาษา R สำหรับผู้เริ่มต้น – ภาษา R คืออะไร, ต่างกับ Python ยังไง, และเขียนยังไง?

    ในบทความนี้ เราจะมาทำความรู้จักภาษา R กัน:

    • ภาษา R คืออะไร?
    • R แตกต่างกับ Python ยังไง?
    • พื้นฐานการเขียนภาษา R

    ถ้าพร้อมแล้วมาเริ่มกันเลย


    1. 😆 ภาษา R คืออะไร?
    2. 🐍 R vs Python: แตกต่างกันยังไง?
    3. 🌏 Objects & Functions: โลกทั้งใบของ R
    4. 🧘 Objects: Existing in R
      1. 📦 (1) Variables: การประกาศตัวแปรใน R
      2. 🍱 (2) Data Types & Classes: ประเภทข้อมูลใน R
      3. 🏠 (3) Data Structures: โครงสร้างข้อมูลใน R
    5. 👟 Functions: Happening in R
      1. 🧮 (1) Operators: เครื่องหมายใน R
      2. 🔨 (2) Functions: Action ใน R
    6. 💪 Summary
    7. ⏭️ Learn More About R
      1. 🧑‍💻 GitHub
      2. 🔨 Free Tool
      3. 📗 Free e-Books
      4. 🏫 Free Courses
    8. 📄 References
    9. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    😆 ภาษา R คืออะไร?

    R เป็นภาษาคอมพิวเตอร์ที่ถูกพัฒนาขึ้นในช่วง ค.ศ. 1990 โดยนักสถิติ 2 ท่านจาก University of Auckland ในนิวซีแลนด์:

    • Ross Ihaka
    • Robert Gentleman

    โดยทั้งคู่พัฒนา R เพื่อทำงานกับข้อมูลในห้องแล็บโดยเฉพาะ

    และด้วยเหตุที่ R ถูกออกแบบมาเพื่อทำงานกับข้อมูล จึงได้ชื่อว่าเป็น “statistical programming language”

    Note: ตัวอักษรแรกของนักพัฒนาเป็นที่มาของชื่อภาษา

    “Logo for R” by The R Foundation (from https://www.r-project.org/logo/ under the CC-BY-SA 4.0)

    .

    เพราะ R เป็นภาษาสำหรับ data จึงเป็นที่นิยมในสายอาชีพ data อย่าง:

    • Data analyst
    • Data scientist
    • Business intelligence analyst
    • Statistician
    • Researcher

    .

    ในปัจจุบัน (Jan 2025) R ได้รับความนิยมเป็นอันดับ 18 ของโลก (อ้างอิง TIOBE index):

    TIOBE index

    นอกจากเป็นภาษา data แล้ว R ยังได้รับความนิยม เพราะ:

    • เป็นภาษา open source
    • ผู้ใช้งานสามารถสร้าง package (library) ในการวิเคราะห์ข้อมูลเองได้
    • ผู้ใช้สามารถใช้ package ที่คนอื่นเขียนไว้แล้ว มาวิเคราะห์ข้อมูลได้ (ในปัจจุบัย R มี package ให้เลือกใช้งานมากกว่า 17,000 packages)
    • ใช้งานได้กับหลากหลาย OS เช่น Windows, MacOS, และ Linux

    🐍 R vs Python: แตกต่างกันยังไง?

    ทั้ง R และ Python ต่างได้เป็นที่นิยมในสายงาน data science และมีลักษณะที่คล้ายกัน คือ:

    • เป็นภาษา open source
    • มี community ผู้ใช้งานขนาดใหญ่
    • มี packages ให้เลือกใช้จำนวนมาก

    แต่ R และ Python จุดที่แตกต่างกัน คือ:

    RPython
    เหมาะกับการทำงาน data โดยเฉพาะการวิเคราะห์สถิติเชิงลึกเป็นภาษาสำหรับงานทั่วไป (general-purpose) รองรับการใช้งานหลายประเภทกว่า R

    ดังนั้น แม้ว่า R อาจจะสามารถทำงานนอกเหนือจากงาน data ได้ (เช่น web scrapping) แต่อาจจะไม่ดีเท่ากับ Python ที่ถูกออกแบบมาให้ใช้งานทั่วไป

    .

    Note:

    สำหรับคนที่สนใจสายงาน data ควรเลือกศึกษาทั้ง 2 ภาษา

    แต่การจะหยิบมาใช้งาน ขึ้นอยู่กับงานตรงหน้า:

    RPython
    งานวิจัยและการวิเคราะห์ข้อมูลเชิงลึก เช่น สร้างโมเดลทางสถิติ รวมทั้งการสร้างกราฟจากข้อมูลอย่างง่ายงานที่ต้องมีความยืดหยุ่น เช่น machine learning และ AI

    หรืองานที่ต้อง integrate กับเครื่องมืออื่น ๆ เช่น web scrapping และ software development

    🌏 Objects & Functions: โลกทั้งใบของ R

    หลังจากทำความรู้จักความรู้จักกับ R เบื้องต้นแล้ว เรามาดูหลักการทำงานของ R กัน

    ในการทำงานกับ R เราต้องเข้าใจก่อนว่า ทุกสิ่งที่อยู่ใน R ประกอบด้วย 2 อย่าง ได้แก่:

    ObjectFunction
    สิ่งที่เก็บใน Rสิ่งที่เกิดขึ้นใน R

    นั่นคือ:

    • ทุกสิ่งที่เราสร้างขึ้นใน R จะถูกเก็บอยู่ใน objects (เช่น ตัวแปร, ข้อมูล)
    • Functions เป็นสิ่งที่เรากระทำกับ objects (เช่น การคำนวณ การสร้างกราฟ)

    เมื่อเราเข้าใจแล้ว เราสามารถทำความเข้าใจ concepts อื่น ๆ ของ โดยการต่อยอดจาก 2 องค์ประกอบนี้


    🧘 Objects: Existing in R

    ในส่วน objects เรามี 3 สิ่งที่ต้องความเข้าใจ เพื่อทำงานกับ R:

    1. Variables
    2. Data types and classes
    3. Data structures

    .

    📦 (1) Variables: การประกาศตัวแปรใน R

    Variable หรือตัวแปร เป็นเหมือนกล่องเก็บของที่เก็บข้อมูลไว้ให้เรา

    เราสามารถสร้างตัวแปรด้วยการใช้ <- เช่น:

    x <- 10
    

    อย่างในตัวอย่าง เป็นการสร้างตัวแปร x ที่เก็บค่าตัวเลข 10 เอาไว้

    Note: เราสามารถใช้ = แทน <- ได้ แต่ไม่เป็นที่นิยมกัน

    .

    🍱 (2) Data Types & Classes: ประเภทข้อมูลใน R

    ตัวแปรใน R สามารถเก็บข้อมูลได้หลายประเภท (เช่น ตัวเลข ข้อความ)

    เราต้องทำความเข้าใจประเภทของข้อมูล เพราะเป็นตัวกำหนด functions ที่เราสามารถใช้ทำงานกับ variable นั้นได้

    ยกตัวอย่างเช่น x เก็บตัวแปรประเภทตัวเลข เราจะไม่สามารถใช้ functions ที่ทำงานกับตัวอักษรได้

    .

    ทั้งนี้ ประเภทข้อมูลใน R มีอยู่ 5 ประเภทที่มักใช้บ่อย ได้แก่:

    No.Data TypeExample
    1Numeric100
    2Character"One hundred"
    3LogicalTRUE, FALSE
    4Date2025-01-15
    5Factor"male", "female", "other"

    .

    ตัวอย่าง 👇

    Numeric:

    age <- 10
    

    Character:

    name <- "Ben Tennyson"
    

    Logical:

    is_hero <- TRUE
    

    Date:

    date_of_birth <- as.Date("1995-12-27")
    

    Factor:

    gender <- as.factor("Male")
    

    .

    Note: เราสามารถเช็กประเภทข้อมูลของตัวแปร ได้ด้วย class() เช่น:

    class(age)
    

    ผลลัพธ์:

    class()

    .

    🏠 (3) Data Structures: โครงสร้างข้อมูลใน R

    Data structure เป็นการนำข้อมูลมาจัดเรียงเป็นโครงสร้างที่ใหญ่ขึ้น

    Data structures เป็นเหมือนอิฐที่ประกอบกันเป็นบ้านหรือตึกใน R

    .

    โครงสร้างข้อมูลใน R มีอยู่ 5 ประเภท ซึ่งแบ่งได้เป็น 2 กลุ่มตามมิติในการเก็บข้อมูล ดังนี้:

    .

    กลุ่มที่ 1: เก็บข้อมูลได้ 1 ประเภทเท่านั้น

    No.Data Structureการเก็บข้อมูล
    1Vector1 มิติ
    2Matrix2 มิติ
    3Arrayn มิติ

    .

    ตัวอย่าง 👇

    Vector:

    v <- c(1, 3, 5, 7, 9)
    

    ผลลัพธ์:

    Vector

    Matrix:

    m <- matrix(1:9, ncol = 3)
    

    ผลลัพธ์:

    Matrix

    Array:

    เช่น array แบบ 3 มิติ:

    • 4 rows
    • 3 columns
    • 2 ชั้น
    a <- array(1:24, dim = c(4, 3, 2))
    

    ผลลัพธ์:

    Array

    .

    กลุ่มที่ 2: เก็บข้อมูลได้มากกว่า 1 ประเภท

    No.Data Structureการเก็บข้อมูล
    1List1 มิติ
    2Data frame2 มิติ

    .

    ตัวอย่าง 👇

    List:

    เพราะ list สามารถเก็บข้อมูลได้หลายประเภท เราสามารถใส่อะไรลงใน list ก็ได้ (แม้แต่ data structure อื่น ๆ):

    grocery_list = list("apple",
                        "milk",
                        TRUE,
                        250,
                        c(1, 3, 5, 7, 9),
                        list("Walmart", "Target"))
    

    ผลลัพธ์:

    List

    Data frame:

    สำหรับ data frame เราสามารถสร้างได้จากเชื่อม vectors เข้าด้วยกัน:

    groceries <- data.frame(
      Item = c("Apples", "Carrots", "Milk"),
      Category = c("Fruit", "Vegetable", "Dairy"),
      Quantity = c(5, 2, 1),
      Price = c(1.50, 0.75, 2.50)
    )
    

    ผลลัพธ์:

    Data frame

    .

    Note: สำหรับใครที่นึกภาพโครงสร้างข้อมูลไม่ออก สามารถดู Figure 5.6 ในหนังสือ Hands-On R Programming เพื่อช่วยไขข้อสงสัยได้


    👟 Functions: Happening in R

    สำหรับ functions เรามี 2 สิ่งที่ต้องทำความเข้าใจ ได้แก่:

    1. Operators
    2. Functions

    .

    🧮 (1) Operators: เครื่องหมายใน R

    Operators เป็นเครื่องหมาย เพื่อบอก R ว่าเราต้องการทำงานหรือการคำนวณอะไร

    .

    Operators แบ่งออกเป็น 4 ประเภท ได้แก่:

    No.OperatorForSymbols
    1Assignmentสร้าง variable<-
    =
    2Arithmeticคิดเลข+
    -
    *
    /
    3Logicalคิดตรรกะ&
    |
    !
    4Relationalเปรียบเทียบค่า==
    !=
    >
    <
    >=
    <=

    .

    ตัวอย่าง 👇

    Assignment

    เช่น สร้างตัวแปรเก็บชื่อ “John”:

    my_name <- "John"
    

    Arithmetic

    เช่น คิดเลข 3 + 4:

    3 + 4
    

    Logical

    เช่น not TRUE:

    !TRUE
    

    Relational

    เช่น เช็กว่า 15 มากกว่า 11 ไหม:

    15 > 11
    

    .

    🔨 (2) Functions: Action ใน R

    Functions คือ code ที่เราสามารถนำกลับมาใช้ใหม่ได้ (reusable)

    .

    Functions แบ่งออกเป็น 2 ประเภท ได้แก่:

    No.FunctionDescriptionExample
    1Built-inFunctions ที่มาพร้อม R หรือ packages ที่เราโหลดมาใช้งานprint()
    sum()
    str()
    2User-definedFunctions ที่เราสร้างเองสร้าง function ชื่อ hello() เพื่อทักทาย user

    .

    Note:

    สำหรับ user-defined functions เราสามารถสร้างได้โดยใช้ function() เช่น:

    greeting <- function(name) {
      print(paste("Hello", name))
    }
    

    ถ้าเราเรียกใช้งาน greeting() โดยใส่ "John" ใน ():

    greeting("John")
    

    เราจะได้ผลลัพธ์แบบนี้:

    User-defined function

    💪 Summary

    ในบทความนี้ เราได้ทำความรู้กับภาษา R กัน:

    • R เป็นภาษาสำหรับงาน data
    • ทั้ง R และ Python ใช้กับงาน data ได้
      • R เหมาะกับการวิเคราะห์เชิงลึก
      • Python เหมาะกับงานทั่วไป
      • คนที่สนใจงานสาย data ควรเรียนทั้ง 2 ภาษา
    • ทุกอย่างใน R แบ่งเป็น objects และ functions
    • Objects: สิ่งที่เก็บใน R
      • Variables: เก็บข้อมูล
      • Data types and classes: กำหนด functions
      • Data structures: ประกอบร่างข้อมูล
    • Functions: สิ่งที่เกิดขึ้นใน R
      • Operators: เครื่องหมายในการทำงาน
      • Functions: code ที่นำกลับมาใช้ใหม่ได้

    ⏭️ Learn More About R

    .

    🧑‍💻 GitHub

    สำหรับผู้ที่สนใจ สามารถดู code ตัวอย่างในบทความนี้ได้ที่ GitHub

    .

    🔨 Free Tool

    เริ่มทดลองเขียน R ด้วยตัวเอง ผ่าน RStudio

    ดาวน์โหลด R

    RStudio desktop

    Note: ใช้งานฟรีทั้งแบบ desktop และ online

    .

    📗 Free e-Books

    ใครที่สนใจเรียนรู้เกี่ยวกับ R เพิ่มเติม สามารถอ่านหนังสือ e-book เหล่านี้ได้ฟรี:

    .

    🏫 Free Courses

    สำหรับคนที่สนใจเรียนการเขียน R สามารถศึกษาคอร์สเรียนเหล่านี้ได้:


    📄 References


    ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    📕 ขอฝากหนังสือเล่มแรกในชีวิตด้วยนะครับ 😆

    🙋 ใครที่กำลังเรียนจิตวิทยาหรือทำงานสายจิตวิทยา และเบื่อที่ต้องใช้ software ราคาแพงอย่าง SPSS และ Excel เพื่อทำข้อมูล

    💪 ผมขอแนะนำ R Book for Psychologists หนังสือสอนใช้ภาษา R เพื่อการวิเคราะห์ข้อมูลทางจิตวิทยา ที่เขียนมาเพื่อนักจิตวิทยาที่ไม่เคยมีประสบการณ์เขียน code มาก่อน

    ในหนังสือ เราจะปูพื้นฐานภาษา R และพาไปดูวิธีวิเคราะห์สถิติที่ใช้บ่อยกัน เช่น:

    • Correlation
    • t-tests
    • ANOVA
    • Reliability
    • Factor analysis

    🚀 เมื่ออ่านและทำตามตัวอย่างใน R Book for Psychologists ทุกคนจะไม่ต้องพึง SPSS และ Excel ในการทำงานอีกต่อไป และสามารถวิเคราะห์ข้อมูลด้วยตัวเองได้ด้วยความมั่นใจ

    แล้วทุกคนจะแปลกใจว่า ทำไมภาษา R ง่ายขนาดนี้ 🙂‍↕️

    👉 สนใจดูรายละเอียดหนังสือได้ที่ meb:

  • Seven SQL: 7 คำสั่ง SQL พื้นฐานในการทำงานกับ Database สำหรับผู้เริ่มต้น พร้อมตัวอย่างจาก Chinook Database

    Seven SQL: 7 คำสั่ง SQL พื้นฐานในการทำงานกับ Database สำหรับผู้เริ่มต้น พร้อมตัวอย่างจาก Chinook Database

    SQL ย่อมาจาก Structured Query Language เป็นภาษาที่ใช้ทำงานกับ database และถูกพัฒนาโดย IBM ในช่วง ค.ศ. 1970s

    แม้ SQL จะมีมานานแล้ว แต่ SQL ยังเป็นทักษะที่สำคัญในยุคนี้ที่ data เป็น resource ที่สำคัญ ทั้งในการใช้ชีวิตและการทำงาน

    .

    ถ้าเราใช้ SQL เป็น เราจะสามารถ:

    • สร้างและจัดการ database
    • เรียกดูข้อมูลจาก database
    • จัดการข้อมูลบน database
    • วิเคราะห์ข้อมูลบน database

    .

    ในบทความนี้ เราจะทำความรู้จักกับ 7 คำสั่ง SQL ที่สำคัญ ผ่านตัวอย่างของ Chinook database กัน:

    1. SELECT
    2. WHERE
    3. ORDER BY
    4. GROUP BY
    5. Aggregate functions
    6. JOIN
    7. LIMIT

    (พร้อม best practices แนะนำ resources ในการพัฒนา SQL ต่อ)

    ถ้าพร้อมแล้วไปเริ่มกันเลย


    1. 💽 Example Database: Chinook
    2. 1️⃣ Statement #1: SELECT
    3. 2️⃣ Statement #2: WHERE
    4. 3️⃣ Statement #3: ORDER BY
    5. 4️⃣ Statement #4: GROUP BY
    6. 5️⃣ Statement #5: Aggregate Functions
    7. 6️⃣ Statement #6: JOIN
    8. 7️⃣ Statement #7: LIMIT
    9. 💪Put It All Together
    10. 🍩 Bonus: SQL Best Practice
    11. ⏭️Next: Sharpen Your SQL
      1. 😺 GitHub
      2. 🔨 Free Tool
      3. 🎒 Free Course
      4. 📖 Free Tutorial
    12. 📃 References

    💽 Example Database: Chinook

    สำหรับบทความนี้ เราจะใช้ Chinook database ซึ่งเป็น database ที่มักใช้ฝึก SQL เป็นตัวอย่างกัน

    Chinook database เป็นข้อมูลร้านขายมีเดียออนไลน์ และแบ่งออกเป็น 11 ชุดข้อมูล (tables):

    No.Table NameDescription
    1Albumข้อมูลอัลบัม
    2Artistข้อมูลศิลปิน
    3Customerข้อมูลลูกค้า
    4Employeeข้อมูลพนักงาน
    5Genreข้อมูลแนวเพลง
    6Invoiceข้อมูลใบเสร็จขายของ
    7InvoiceLineข้อมูลรายการซื้อในใบเสร็จ
    8MediaTypeข้อมูลประเภทมีเดีย
    9Playlistข้อมูลเพลย์ลิสต์
    10PlaylistTrackข้อมูลสำหรับจับคู่เพลย์ลิสต์กับเพลง
    11Trackข้อมูลเพลง

    เรามาดูวิธีเขียน 7 คำสั่ง SQL กันด้วย Chinook database กัน


    1️⃣ Statement #1: SELECT

    Usage:

    คำสั่งพื้นฐาน สำหรับเลือกข้อมูลจาก database

    .

    Syntax:

    SELECT columns
    FROM table
    • columns ให้ระบุชื่อ columns ที่เราต้องการ (ระบุได้มากกว่า 1 โดยใช้ , คั่น)
    • table ให้ระบุ ชื่อ table ที่มีข้อมูลที่เราต้องการ

    .

    Example:

    เลือกดูชื่อเพลง (Name) และรหัสอัลบัม (AlbumID) จาก Track:

    SELECT Name, AlbumId
    FROM Track;
    

    ผลลัพธ์:

    Note:

    เราสามารถเลือกข้อมูลทั้งหมดจาก table ได้ โดยใช้ * เช่น:

    SELECT *
    FROM Tracks;
    

    โดยผลลัพธ์จะแสดงข้อมูลทุก columns และ rows ใน Track

    นอกจากนี้ เราสามารถตั้งชื่อ column ได้ โดยใช้ AS เช่น:

    SELECT Name AS Song, AlbumId AS Album
    FROM Track;
    

    ผลลัพธ์:

    จะเห็นว่า ข้อมูลจะเหมือนเดิม แต่ชื่อ column จะเปลี่ยนไป


    2️⃣ Statement #2: WHERE

    Usage:

    ใช้กรองข้อมูลที่เรียกมาแสดง

    .

    Syntax:

    WHERE conditions
    • conditions ให้ระบุเงื่อนไขในการกรอง

    .

    Example:

    หาเพลงที่มีราคา (UnitPrice) สูงกว่า $0.99:

    SELECT Name, UnitPrice
    FROM Track
    WHERE UnitPrice > 0.99;
    

    ผลลัพธ์:

    .

    WHERE operators:

    ในการกรอง เราสามารถใช้ operators เหล่านี้ในการกำหนดเงื่อนไขได้:

    OperatorMeaningExample
    =เท่ากับUnitPrice = 0.99
    <> หรือ !=ไม่เท่ากับUnitPrice <> 0.99
    >มากกว่าUnitPrice > 0.99
    <น้อยกว่าUnitPrice < 0.99
    >=มากกว่า/เท่ากับUnitPrice >= 0.99
    <=น้อยกว่า/เท่ากับUnitPrice <= 0.99
    BETWEENกรองข้อมูลตามช่วงUnitPrice BETWEEN 0.99 and 1.99
    INกรองข้อมูลตามเซตข้อมูลUnitPrice IN (0.99, 1.99, 2.99)

    นอกจากนี้ เรายังสามารถใช้ LIKE กับ WHERE เพื่อกรอง text ได้อีกด้วย

    โดย LIKE ใช้คู่กับ 2 อย่าง:

    OperatorMeaning
    _แทน 1 characters
    %แทน 0, 1, หรือมากกว่า 1 characters

    เช่น:

    SELECT FirstName, LastName
    FROM Customer
    WHERE FirstName LIKE '_ohn';
    

    ผลลัพธ์:

    ผลลัพธ์: เราจะได้ข้อมูลทั้งหมดที่มี FirstName ขึ้นต้นด้วยตัวอักษรใด ๆ 1 ตัว + “ohn”

    เช่น:

    • John
    • Gohn
    • Wohn

    อย่างในตัวอย่าง เราจะได้ “John Gordon” ขึ้นมา:

    หรือ:

    SELECT FirstName, LastName
    FROM Customer
    WHERE FirstName LIKE 'J%';
    

    ผลลัพธ์:

    เราจะได้ข้อมูลที่ FirstName เริ่มด้วย J และตามด้วยตัวอักษรใด ๆ + กี่ตัวก็ได้

    เช่น:

    • John
    • Jo
    • Jane
    • James

    อย่างในตัวอย่าง เราจะได้ชื่อเหล่านี้มา:


    3️⃣ Statement #3: ORDER BY

    Usage:

    จัดลำดับข้อมูล

    .

    Syntax:

    ORDER BY columns
    • columns ให้ระบุชื่อ column ที่ใช้ในการจัดลำดับ (ใส่ได้มากกว่า 1)

    .

    Example:

    ดึงรายชื่อลูกค้า ให้แสดงตามชื่อจริง (FirstName):

    SELECT FirstName, LastName
    FROM Customer
    ORDER BY FirstName;
    

    ผลลัพธ์:

    Note:

    Default ของ ORDER BY จะเป็นการเรียงแบบ ascending (A-Z)

    ถ้าเราอยากเรียงแบบ descending (Z-A) ให้ใส่ DESC ต่อท้าย เช่น:

    SELECT FirstName, LastName
    FROM Customer
    ORDER BY FirstName DESC;
    

    ผลลัพธ์:


    4️⃣ Statement #4: GROUP BY

    Usage:

    จับกลุ่มข้อมูล

    .

    Syntax:

    GROUP BY columns
    • columns ระบุชื่อ column ที่ใช้จับกลุ่ม (ระบุได้มากกว่า 1)

    .

    Example:

    นับจำนวนเพลงในแต่ละอัลบัม:

    SELECT AlbumId, COUNT(*) AS TrackCount
    FROM Track
    GROUP BY AlbumId;
    

    ผลลัพธ์:

    จากตัวอย่าง เราจะเห็นว่า album ที่ 1 มี 10 เพลง, album ที่ 2 มี 1 เพลง, ไปเรื่อย ๆ


    5️⃣ Statement #5: Aggregate Functions

    Usage:

    สรุป (aggregate) ข้อมูล

    .

    Syntax:

    SELECT agg(column)
    • agg ให้ระบุ aggregate function ที่ต้องการใช้งาน
    • column ให้ระบุชื่อ column ที่เป็น input ของ aggregate function

    .

    Common aggregate functions:

    ใน SQL, เรามี 5 aggregate functions ที่มักใช้บ่อย ได้แก่:

    No.AggregateDescription
    1COUNT()นับจำนวนข้อมูล
    2SUM()หาผลรวม (sum)
    3AVG()หาค่าเฉลี่ย (mean)
    4MIN()หาค่าต่ำสุด
    5MAX()หาค่าสูงสุด

    .

    Example:

    เราต้องการรู้ข้อมูลการใช้จ่ายของลูกค้าแต่ละคน

    โดยเราต้องการรู้:

    • จำนวนครั้งในการซื้อ (count)
    • เงินที่เคยใช้จ่ายทั้งหมด (sum)
    • ค่าใช้จ่ายโดยเฉลี่ย (mean)
    SELECT CustomerId, COUNT(*), SUM(Total) AS TotalSpent, AVG(Total) AS AverageSpent
    FROM Invoice
    GROUP BY CustomerId;
    

    ผลลัพธ์:

    Note:

    เพื่อให้ข้อมูลอ่านง่าย เราสามารถใช้ ROUND() เพื่อกำหนดจุดทศนิยมได้ เช่น:

    SELECT CustomerId, COUNT(*), ROUND(SUM(Total), 2) AS TotalSpent, ROUND(AVG(Total), 2) AS AverageSpent
    FROM Invoice
    GROUP BY CustomerId;
    

    ผลลัพธ์:

    สังเกตว่า ข้อมูลใน TotalSpent และ AverageSpent จะแสดงทศนิยมแค่ 2 ตำแหน่ง


    6️⃣ Statement #6: JOIN

    Usage:

    เชื่อม tables เข้าด้วยกัน

    .

    Syntax:

    SELECT columns
    FROM table1
    JOIN table2
    ON table1.key1 on table2.key2
    • table1, table2 คือ tables ที่เราต้องการเชื่อมกัน
    • key1, key2 คือ column ที่ใช้ระบุว่า ข้อมูลไหนจะเชื่อมกับข้อมูลไหน (primary key, foreign key)

    .

    Example:

    เราอยากรู้ว่าเพลงไหนอยู่ในอัลบัลอะไร ให้เชื่อม Track เข้ากับ Album เพื่อหาคำตอบ:

    SELECT Track.Name AS TrackName, Album.Title AS AlbumName
    FROM Track
    JOIN Album
    ON Track.AlbumId = Album.AlbumId;
    

    ผลลัพธ์:


    7️⃣ Statement #7: LIMIT

    Usage:

    จำกัดจำนวนข้อมูลที่จะแสดง

    .

    Syntax:

    LIMIT x
    • x ให้ใส่จำนวนที่ต้องการ

    .

    Example:

    SELECT FirstName, LastName
    FROM Customer
    LIMIT 10;
    

    ผลลัพธ์:


    💪Put It All Together

    เราสามารถใช้คำสั่ง SQL ทั้งหมดร่วมกัน เพื่อตอบโจทย์ data ที่ซับซ้อนได้

    ตัวอย่างเช่น หา 5 อัลบัมที่ขายดีที่สุด ซึ่งมีเพลงราคาตั้งแต่ $0.99 ขึ้นไป:

    SELECT Album.Title AS AlbumName, SUM(Track.UnitPrice) AS TotalRevenue
    FROM Album
    JOIN Track
    ON Album.AlbumId = Track.AlbumId
    WHERE Track.UnitPrice > 0.99
    GROUP BY Album.AlbumId
    ORDER BY TotalRevenue DESC
    LIMIT 5;
    
    • เราใช้ SELECT เพื่อเลือกชื่ออัลบัมและหาผลรวมยอดขาย (SUM)
    • เชื่อม tables (JOIN) เพื่อดึงข้อมูลราคาเพลง จาก Track
    • กรองข้อมูลเฉพาะเพลงที่มีราคาตั้งแต่ $0.99 (WHERE)
    • จับกลุ่มข้อมูล (GROUP BY) เพื่อหาผลรวมของแต่ละอัลบัม
    • จัดเรียงข้อมูล (ORDER BY) ตามผลรวมยอดขาย จากมากไปน้อย (DESC)
    • เลือกแสดงข้อมูล 5 อันดับแรก (LIMIT)

    ผลลัพธ์:


    🍩 Bonus: SQL Best Practice

    เพื่อเป็นความรู้เพิ่มเติม มาดู 3 best practices ในการเขียน SQL กัน:

    1. ใช้ UPPERCASE ในเขียนคำสั่ง เช่น:
      1. ✅ Do: SELECT, WHERE, GROUP BY
      2. ❌ Don’t: select, where, group by
    2. ใช้ snake_case ในการตั้งชื่อ tables และ columns เช่น:
      1. user_id
      2. order_date
      3. duration_ms
    3. ใช้ indentation (เคาะย่อหน้า) และแบ่งบรรทัด เพื่อความอ่านง่าย เช่น:
    -- เขียนแบบนี้:
    
    SELECT
    	FirstName,
    	LastName
    FROM Customer
    ORDER BY LastName;
    
    -- แทนแบบนี้:
    SELECT FirstName, LastName
    FROM Customer
    ORDER BY LastName;
    

    Note:

    • จะเห็นว่า ตัวอย่างในบทความ ยังไม่ได้ทำตาม ข้อ 2 และ 3 😅
    • อ่าน best practices อื่น ๆ เพิ่มเติมได้ที่ SQL Style Guide

    ⏭️Next: Sharpen Your SQL

    .

    😺 GitHub

    ดู database และตัวอย่าง SQL ทั้งหมดในบทความ ได้ที่ GitHub

    .

    🔨 Free Tool

    สำหรับใครที่อยากเริ่มฝึก SQL สามารถใช้ SQL ได้ฟรี ผ่าน https://sqliteonline.com/

    .

    🎒 Free Course

    สำหรับคนที่สนใจเรียน SQL แนะนำคอร์สเรียน SQL Crash Course จาก DataRockie

    • ง่าย
    • ฟรี
    • ใช้เวลาเรียนเพียง 30 นาที
    • ได้ certificate หลังเรียนจบ

    .

    📖 Free Tutorial

    สำหรับใครที่อยากศึกษาคำสั่ง SQL นอกเหนือจากนี้ สามารถอ่านเพิ่มได้ที่ SQL Tutorial จาก W3Schools

    • ฟรี
    • เข้าใจง่าย

    📃 References

  • Google Sheets Essentials: วิธีเขียน 7 กลุ่มสูตรสำคัญใน Google Sheets สำหรับงาน Data พร้อมตัวอย่างการทำงานกับข้อมูลการเงิน

    Google Sheets Essentials: วิธีเขียน 7 กลุ่มสูตรสำคัญใน Google Sheets สำหรับงาน Data พร้อมตัวอย่างการทำงานกับข้อมูลการเงิน

    Google Sheets (หรือบางครั้งเรียกสั้น ๆ ว่า Sheets) เป็นเครื่องมือ spreadsheet ออนไลน์ สำหรับทำงานกับข้อมูลในรูปแบบตาราง (tabular data)

    Google Sheets มีการทำงานเหมือนกับ Excel แต่มีจุดเด่น คือ:

    • ใช้งานฟรี
    • เข้าถึงจากที่ได้ก็ได้
    • ใช้ทำงานร่วมกับคนอื่นแบบ real-time ได้
    • รองรับข้อมูลจำนวนมากได้ (แม้อาจจะ lag บ้างก็ตาม)

    ด้วยเหตุนี้ Google Sheets จึงได้รับความนิยมในกลุ่มคนทำงาน โดยเฉพะาะกับคนที่ใช้ Google Workspace ในการทำงาน

    .

    ในบทความนี้ เราจะมาทำความรู้จักกับ 7 กลุ่มสูตร Google Sheets ที่มักใช้ในการทำงาน data:

    1. Filtering and sorting: กรองและจัดเรียงข้อมูล
    2. Aggregating: สรุปข้อมูล
    3. Searching: เรียกดูข้อมูล
    4. Conditions: สร้างข้อมูลใหม่ด้วยเงื่อนไข
    5. Working with dates: สูตรทำงานกับวันที่ (date)
    6. Working with text: สูตรทำงานกับข้อความ (text)
    7. Google: สูตรเฉพาะของ Google

    .

    ถ้าพร้อมแล้ว มาเริ่มกันเลย


    1. 💳 Dataset ตัวอย่าง: Financial Transactions Dataset
    2. 🏷️ Named Ranges
    3. 🤔 Syntax Help
    4. 🧑‍💼 Group #1 – Filtering & Sorting
      1. (1) FILTER()
      2. (2) SORT()
    5. 🧑‍💼 Group #2 – Aggregating
    6. 🧑‍💼 Group #3 – Searching
      1. (1) VLOOKUP()
      2. (2) INDEX()
      3. (3) MATCH()
      4. (4) QUERY()
    7. 🧑‍💼 Group #4 – Conditions
      1. (1) IF()
      2. (2) IFS
      3. (3) IFERROR()
    8. 🧑‍💼 Group #5 – Working With Date
      1. (1) TODAY()
      2. (2) DATEDIF()
      3. (3) NETWORKDAYS()
    9. 🧑‍💼 Group #6 – Working With Text
      1. (1) Splitting Text
      2. (2) Joining Text
      3. (3) Extracting Text
      4. (3) Regular Expression
    10. 🧑‍💼 Group #7 – Google
      1. (1) GOOGLEFINANCE()
      2. (2) GOOGLETRANSLATE()
    11. 💪 Recap

    💳 Dataset ตัวอย่าง: Financial Transactions Dataset

    มาดู dataset ที่เราจะใช้เป็นตัวอย่างกัน: Financial Transactions Dataset

    Financial Transactions Dataset เป็นข้อมูลสังเคราะห์ เลียนแบบข้อมูลทางธุรกรรมของสถาบันทางการเงิน

    Dataset ประกอบด้วย 6 columns ได้แก่:

    No.ColumnDescription
    1transaction_idรหัสการทำธุรกรรม
    2dateวันที่
    3customer_idรหัสลูกค้า
    4amountจำนวนเงิน
    5typeประเภททางธุรกิจ เช่น credit, debit, transfer
    6descriptionคำอธิบายการทำธุรกรรม

    สำหรับบทความนี้ เราจะใช้ข้อมูลแค่ 1,000 rows แรก เพื่อลดโหลดของ Google Sheets

    โดยเราจะเก็บข้อมูลนี้ไว้ใน Sheet ชื่อ Data:

    Note: สำหรับคนที่สนใจ สามารถดูตัวอย่างข้อมูลและสูตรได้ที่ Google Sheets


    🏷️ Named Ranges

    ก่อนไปดูการใช้งานสูตร Google Sheets เรามาทำความรู้จักกับ Named Ranges กันก่อน

    Named Ranges เป็น function ใน Google Sheets ที่ใช้ตั้งชื่อ (ติด tag) ข้อมูล เพื่อให้ง่ายต่อการทำงาน

    อย่างในกรณีของ Financial Transactions Dataset เราจะตั้งชื่อข้อมูลว่า transactions:

    ข้อดีของการใช้ Named Ranges คือ:

    เมื่อเราเรียกใช้สูตร เราสามารถใช้ชื่อที่เราตั้ง แทนช่วงข้อมูลได้เลย

    เช่น:

    • แทนที่จะเขียนว่า A1:F1001 หรือ Data!A1:F1001 ทุกครั้ง
    • เราสามารถเขียน transactions แทนได้

    วิธีใช้งาน:

    1. เลือกชุดข้อมูลที่ต้องการ (ไม่รวม column headers)

    2. ไปที่เมนู “Data” และ “Named Ranges”

    3. ในแถบเมนูด้านขวามือ ตั้งชื่อชุดข้อมูล (เช่น transactions)

    4. กด “Done” เพื่อบันทึก


    🤔 Syntax Help

    Google Sheets มีตัวช่วยในการเขียนสูตร

    ทุกครั้งที่เราพิมพ์สูตร Google Sheets จะแสดงคู่มือการใช้งานขึ้นมา

    เช่น:

    เราสามารถเรียนวิธีการเขียนสูตรได้ จากเอกสารนี้ โดยไม่ต้องออกจาก Google Sheets เลย


    🧑‍💼 Group #1 – Filtering & Sorting

    เรามาเริ่มดูกลุ่มแรกของสูตร Google Sheets กัน

    ในกลุ่มนี้ เราจะมาดู 2 สูตรสำหรับกรองและจัดเรียงข้อมูล:

    1. FILTER()
    2. SORT()

    .

    (1) FILTER()

    Usage:

    กรองข้อมูล

    Syntax:

    =FILTER(range, condition)
    • range คือ ชุดข้อมูลต้นทาง
    • condition คือ เงื่อนไขในการกรอง ซึ่งเราสามารถใส่ได้มากกว่า 1 เงื่อนไข

    Example:

    แสดงข้อมูลที่จำนวนเงินทางธุรกรรม มากกว่า 3,000:

    =FILTER(transactions, Data!D2:D > 3000)

    ผลลัพธ์:

    เราจะได้ข้อมูลทั้งหมดที่มี amount มากกว่า 3,000 สังเกตได้จาก column D (highlight สีเขียว):

    FILTER()

    .

    (2) SORT()

    Usage:

    เรียงลำดับข้อมูล

    Syntax:

    =SORT(range, sort_column, is_ascending)
    • range คือ ชุดข้อมูลต้นทาง
    • sort_column คือ column ที่ใช้ในการ sort
    • is_ascending คือ ระบุว่า จัดเรียงแบบ ascending (A-Z) หรือ descending (Z-A):
      • เติม TRUE เพื่อ sort แบบ ascending
      • เติม FALSE เพื่อ sort แบบ descending

    Example:

    เรียงข้อมูลตามจำนวนเงิน จากมากไปน้อย:

    =SORT(transactions, 4, FALSE)

    ผลลัพธ์:

    เราจะได้ข้อมูลทั้งหมดโดยเรียงตาม amount จากมากไปน้อย (column D, highlight สีเขียว):

    SORT()

    Note:

    เราสามารถใช้ FILTER() คู่กับ SORT() ได้

    เช่น แสดงข้อมูลที่มีจำนวนเงินมากกว่า 5,000 โดยเรียงจากน้อยไปมาก:

    =SORT(FILTER(transactions, Data!D2:D > 3000), 4, TRUE)

    ผลลัพธ์:

    เราจะได้ข้อมูลที่ amount มากกว่า 3,000 จัดเรียงจากน้อยที่สุดไปมากที่สุด (column D, highlight สีเขียว):

    FILTER() + SORT()

    🧑‍💼 Group #2 – Aggregating

    ในกลุ่มนี้ที่ 2 เรามาดูสูตรในการสรุปข้อมูล (aggregate) ที่มักใช้กัน:

    FormulaDescription
    COUNTA()นับจำนวนข้อมูล
    SUM()หาผลรวม
    AVERAGE()หาค่าเฉลี่ย (mean)
    MEDIAN()หาค่ากลาง
    MODE()หา value ที่ซ้ำเยอะที่สุด
    MIN()หา value ที่น้อยที่สุด
    MAX()หา value ที่มากที่สุด
    QUARTILE()หา quantile
    STDEV()หา standard deviation (SD)
    VAR()หา variance

    ตัวอย่าง:

    หาค่าสถิติของจำนวนเงินทางธุรกรรมทั้งหมด:

    Aggregate functions in Google Sheets

    Note:

    • เราจะเห็นว่า MODE() (row 9) แสดง error เนื่องจากไม่มีข้อมูลซ้ำมากกว่า 1 ครั้ง
    • เดี๋ยวเราจะดูวิธีจัดการค่า error ในกลุ่มที่ 7 กัน

    🧑‍💼 Group #3 – Searching

    ในกลุ่มที่ 3 เรามาดู 4 สูตรสำหรับค้นหาข้อมูลกัน:

    1. VLOOKUP()
    2. INDEX()
    3. MATCH()
    4. QUERY()

    .

    (1) VLOOKUP()

    Usage:

    VLOOKUP ย่อมาจาก:

    Vertical Lookup

    ใช้ดึงข้อมูลที่อยู่ row เดียวกับ search key (คำค้นหา)

    Syntax:

    =VLOOKUP(search_key, range, index)
    • search_key คือ value ที่เราใช้ค้นหา
    • range คือ ชุดข้อมูลที่เราต้องการเข้าไปดึงข้อมูลมา
    • index คือ column ใน range ที่เราต้องการไปดึงข้อมูลมา

    Example:

    สมมุติว่า เรามีรหัสการทำธุรกรรม 10 ตัว และเราอยากรู้ว่า:

    • แต่ละรหัสเป็นธุรกรรมประเภทไหน
    • มีจำนวนเงินเท่าไร

    เราสามารถเขียนสูตรได้แบบนี้:

    =ArrayFormula(VLOOKUP(A3:A12, transactions, 5))

    เพื่อดึงข้อมูลประเภทธุรกรรมที่อยู่ใน column ที่ 5 จากรหัสการทำธุรกรรม

    และ:

    =ArrayFormula(VLOOKUP(A3:A12, transactions, 4))

    เพื่อดึงข้อมูลจำนวนเงินที่อยู่ใน column ที่ 4 จากรหัสการทำธุรกรรม

    ผลลัพธ์:

    VLOOKUP()

    Note:

    จากตัวอย่าง จะสังเกตเห็นว่า เราใช้ ArrayFormula ช่วยในการดึงข้อมูลทั้งชุดมาแสดง ด้วยการเขียนสูตรเพียงครั้งเดียว

    การใช้ ArrayFormula มีข้อดี 2 อย่าง:

    1. ประหยัดเวลาในการทำงาน
    2. ช่วยในลดโหลดการทำงาน ทำให้ Google Sheets ทำงานได้เร็วขึ้น เนื่องจากลดการประมวลผลจากหลายสูตร เหลือสูตรเดียว

    ทั้งนี้ เราสามารถเขียนสูตรให้ Google Sheets ทำงานเร็วขึ้นอีก ด้วยการดึงข้อมูลจาก 2 columns มาแสดงในสูตรเดียว:

    =ArrayFormula(VLOOKUP(F3:F12, transactions, {5, 4}))

    จะเห็นว่า เราใส่ {5, 4} แทน 5 หรือ 4 อย่างเดียว

    ผลลัพธ์:

    VLOOKUP()

    จะเห็นว่า ผลลัพธ์ของสูตรนี้เหมือนกับผลลัพธ์ของสูตรก่อนหน้า

    .

    (2) INDEX()

    Usage:

    แสดงข้อมูลจาก cell ที่ตรงกับ index ที่เรากำหนด

    Syntax:

    =INDEX(reference, row, column)
    • reference คือ ชุดข้อมูลที่เราต้องการเข้าไปดึงข้อมูล
    • row คือ เลข index ของ row
    • column คือ เลข index ของ column

    Example:

    เราต้องการแสดงข้อมูลที่อยู่ใน:

    • row ที่ 10 (transaction_id ที่ 10)
    • column ที่ 6 (description)
    INDEX()

    เราสามารถเขียนสูตรได้ดังนี้:

    =INDEX(transactions, 10, 6)

    ผลลัพธ์:

    Google Sheets จะแสดงคำว่า “Old see watch no.” ขึ้นมา

    .

    (3) MATCH()

    Usage:

    ระบุตำแหน่งของ value ที่เราต้องการค้นหา

    Syntax:

    =MATCH(search_key, range, search_type)
    • search_key คือ value ที่เราใช้ค้นหา
    • range คือ ชุดข้อมูลที่เราต้องการเข้าไปดึงข้อมูลมา
    • search_type (optional) คือ กำหนดว่า เราต้องการค้นหาแบบตรงตัว หรือใกล้เคียง:
      • 0 คือ ตรงตัว
      • 1 คือ ใกล้เคียง

    Example:

    MATCH()

    จากตัวอย่างของ INDEX() แทนที่จะดูว่า มีข้อมูลอะไรอยู่ใน row ที่ 10 และ column ที่ 6

    เราถามคำถามกลับกัน คือ:

    “Old see watch no.” อยู่ในตำแหน่งไหนของ column F

    =MATCH("Old see watch no.", Data!F2:F, 0)

    ผลลัพธ์:

    Google Sheets จะแสดงเลข 10

    ซึ่งหมายถึง “Old see watch no.” อยู่ในลำดับที่ 10 ของ column

    Note:

    เราสามารถใช้ INDEX() และ MATCH() เพื่อทำงานคล้ายกับ VLOOKUP() ได้

    เช่น เราต้องการว่า จำนวนเงินของธุรกรรมที่เขียนว่า “Old see watch no.” มีจำนวนเท่าไร:

    =INDEX(Data!D2:D, MATCH("Old see watch no.", Data!F2:F, 0))

    ผลลัพธ์:

    เราจะได้คำตอบที่ต้องการ: 1,008.62

    .

    (4) QUERY()

    Usage:

    QUERY() เป็นสูตรเพื่อดึงข้อมูลมาแสดงได้ในรูปแบบที่ต้องการ

    Syntax:

    =QUERY(data, query)
    • data คือ ชุดข้อมูลต้นทางที่เราต้องการดึงข้อมูลมา
    • query คือ การเขียนเงื่อนไขในการดึงข้อมูล ตาม syntax ของ SQL

    Example #1:

    เราต้องการดึงข้อมูลทั้งหมด จาก transactions มาแสดง:

    =QUERY(transactions, "SELECT *")

    ผลลัพธ์:

    เราจะได้ข้อมูลทั้ง 1,000 rows และ 6 columns มาแสดง

    .

    Example #2:

    เราสามารถตีกรอบข้อมูลลง โดย:

    • ระบุเฉพาะ column ที่ต้องการ
    • จำกัดจำนวน rows ที่ดึงมาแสดง

    เช่น เลือกเฉพาะ รหัสลูกค้า และ จำนวนเงิน 10 ชุดแรกมาแสดง:

    =QUERY(transactions, "SELECT C, D LIMIT 10")

    ผลลัพธ์:

    QUERY()

    .

    Example #3:

    เราสามารถเขียน query เพื่อตอบโจทย์ที่ซับซ้อนขึ้นได้

    เช่น แสดงรหัสลูกค้า 10 คนแรกที่มีจำนวนเงินทางธุรกรรมมากกว่า 5,000 ขึ้นไป พร้อมวันที่:

    =QUERY(transactions, "SELECT C, D, B WHERE D >= 5000 ORDER BY D DESC LIMIT 10")

    ผลลัพธ์:

    QUERY()

    Note: สำหรับใครที่สนใจวิธีเขียน query สามารถเรียนรู้เกี่ยวกับ SQL เบื้องต้นได้ที่ SQL Crash Course จาก DataRockie


    🧑‍💼 Group #4 – Conditions

    ในกลุ่มที่ 4 เรามาดู 4 สูตรสำหรับสร้างข้อมูลใหม่ตามเงื่อนไขกัน:

    1. IF()
    2. IFS()
    3. IFERROR()

    .

    (1) IF()

    Usage:

    แสดงข้อมูลตามเงื่อนไขที่กำหนด (1 เงื่อนไข)

    Syntax:

    =IF(logical_expression, value_if_true, value_if_false)
    • logical_expression คือ เงื่อนไขที่เรากำหนด
    • value_if_true คือ สิ่งที่จะแสดง ถ้าข้อมูลตรงเงื่อนไข
    • value_if_false คือ สิ่งที่จะแสดง ถ้าข้อมูลไม่ตรงเงื่อนไข

    Example #1:

    ต้องการจัดกลุ่มจำนวนเงิน โดย:

    กลุ่มจำนวนเงิน
    Largeตั้งแต่ 5,000 ขึ้นไป
    Smallน้อยกว่า 5,000
    =ArrayFormula(IF(A3:A>=5000, "Large", "Small"))

    ผลลัพธ์:

    IF()

    .

    Example #2:

    เราสามารถเขียน IF() ซ้อนกันไปเรื่อย ๆ (nested IFs) เพื่อเพิ่มจำนวนเงื่อนไขได้

    เช่น แบ่งจำนวนเงินเป็น 3 กลุ่ม แทน 2 กลุ่ม:

    กลุ่มจำนวนเงิน
    Largeตั้งแต่ 5,000 ขึ้นไป
    Midตั้งแต่ 2,500 แต่น้อยกว่า 5,000
    Smallน้อยกว่า 2,500
    =ArrayFormula(IF(A3:A>=5000, "Large", IF(A3:A>=2500, "Mid", "Low")))

    ผลลัพธ์:

    Nested IF()s

    .

    (2) IFS

    Usage:

    • แสดงข้อมูลตามเงื่อนไขที่กำหนด (มากกว่า 1 เงื่อนไข)
    • มีค่าในการใช้งานเท่ากับการเขียน IF() แบบซ้อนกัน
    • แต่มีข้อแตกต่างที่เขียนเงื่อนไขได้ง่ายกว่า

    Example:

    ต้องการแบ่งจำนวนเงินเป็น 3 กลุ่ม ดังนี้:

    กลุ่มจำนวนเงิน
    Largeตั้งแต่ 5,000 ขึ้นไป
    Midตั้งแต่ 2,500 แต่น้อยกว่า 5,000
    Smallน้อยกว่า 2,500

    แทนที่จะเขียน IF() ซ้อน ๆ กัน เราสามารถใช้ IFS() ได้แบบนี้:

    =ArrayFormula(IFS(A3:A>=5000, "Large", A3:A>=2500, "Mid", A3:A<2500, "Low"))

    ผลลัพธ์:

    IFS()

    จะสังเกตได้ว่า ผลลัพธ์ที่ได้เป็นอันเดียวกับ IF() ที่เขียนซ้อนกัน

    .

    (3) IFERROR()

    Usage:

    แสดงข้อมูลในกรณีที่สูตรเกิด error

    Syntax:

    =IFERROR(value, value_if_error)
    • value คือ สูตรที่เราใช้ทำงาน และอาจจะเกิด error ได้
    • value_if_error คือ ค่าที่จะแสดงในกรณีที่เกิด error

    Example:

    สมมุติเราใช้ IFS() เพื่อจัดกลุ่มจำนวนเงิน

    แต่เราระบุแค่เงื่อนไขเดียว ทำให้ข้อมูลบางส่วนเกิด error เช่น:

    • เราระบุว่า จำนวนเงินตั้งแต่ 5,000 จัดอยู่ในกลุ่ม “Wealthy”
    • แต่เพราะเราไม่ได้กำหนดจำนวนที่น้อยกว่า 5,000 จะแสดงค่าอะไร
    Without IFERROR()

    เราสามารถใช้ IFERROR() เพื่อแสดงค่าบางอย่างแทน ซึ่งจะช่วยให้ข้อมูลดูมีระเบียบขึ้นได้ เช่น “-”:

    =ArrayFormula(IFERROR(IFS(A3:A>=5000, "Wealthy"), "-"))

    ผลลัพธ์:

    With IFERROR()

    🧑‍💼 Group #5 – Working With Date

    ในกลุ่มที่ 5 เรามาดู 3 สูตรที่ใช้ทำงานกับวันที่กัน:

    1. TODAY()
    2. DATEDIF()
    3. NETWORKDAYS()

    .

    (1) TODAY()

    Usage:

    แสดงวันที่ของวันนี้

    Example:

    สมมุติว่า วันนี้เป็นที่ 10 ม.ค. 2025:

    =TODAY()

    ผลลัพธ์:

    Google Sheets จะแสดง 01/10/2025

    .

    (2) DATEDIF()

    Usage:

    แสดงจำนวนวัน ระหว่าง 2 วันที่

    Example:

    หาจำนวนวัน ตั้งแต่วันที่ 1 ของปี 2025 จนถึง วันนี้:

    =DATEDIF("01/01/2025", TODAY(), "D")

    ผลลัพธ์:

    Google Sheets จะแสดงจำนวนวันระหว่างวันนี้ และ วันที่ 1 ม.ค. 2025 เช่น 9

    .

    (3) NETWORKDAYS()

    Usage:

    แสดงจำนวนวันทำการ ระหว่าง 2 วันที่

    Example:

    หาจำนวนวันทำการ ตั้งแต่วันที่ 1 ของปี 2025 จนถึง วันนี้:

    =NETWORKDAYS("01/01/2025", TODAY())

    ผลลัพธ์:

    Google Sheets จะแสดงจำนวนวันทำการระหว่างวันนี้ และ วันที่ 1 ม.ค. 2025 เช่น 8


    🧑‍💼 Group #6 – Working With Text

    ในกลุ่มที่ 6 เรามาดูสูตรที่ใช้ทำงานกับ text กัน:

    1. Splitting text
      1. SPLIT()
    2. Joining text
      1. &
      2. TEXTJOIN()
    3. Extracting text
      1. LEFT()
      2. RIGHT()
      3. MID()
    4. Regular expression
      1. REGEXMATCH()
      2. REGEXEXTRACT()

    .

    (1) Splitting Text

    เราสามารถใช้ SPLIT() เพื่อแยก text ออกเป็นคำ ๆ ได้

    Syntax:

    =SPLIT(text, delimiter)
    • text คือ ข้อความที่เราต้องการจะแยก
    • delimiter คือ เครื่องหมายที่ใช้คั่นข้อความ เช่น:
      • Comma (,)
      • Dot (.)
      • Semi-colon (;)
      • Blank space
      • Tab

    Example:

    แยก description ออกเป็นคำ ๆ (โดยใช้ blank space เป็น delimiter):

    =ArrayFormula(SPLIT(F3:F, " "))

    Note: เราใช้ ArrayFormula ช่วยให้สูตรใช้งานได้กับทั้ง range

    ผลลัพธ์:

    SPLIT()

    .

    (2) Joining Text

    สูตร:

    การเชื่อม text เข้าด้วยกัน ทำได้ 2 วิธี:

    FormulaDescription
    &เชื่อม text อย่างง่าย หรือไม่มีรูปแบบตายตัว
    TEXTJOIN()เชื่อม text อย่างมีรูปแบบ เชื่อม text อย่างมีรูปแบบ (เช่น เชื่อมโดยมี , คั่น)

    Example:

    เราต้องการเชื่อมข้อมูลให้กลายเป็นประโยคว่า:

    ลูกค้าใช้เงินจำนวนเท่าไร + ประเภทอะไร + ไปกับอะไร

    =TEXTJOIN(" ", TRUE, A2&" spent "&B2, "("&C2&")", "on", "'"&D2&"'")

    ผลลัพธ์:

    & + TEXTJOIN()

    จะเห็นว่า ในตัวอย่าง เราใช้ & และ TEXTJOIN() คู่กัน:

    • ใช้ & ที่เกิดขึ้นครั้งเดียว เช่น customer_id + “spent” + amount
    • ใช้ TEXTJOIN() เพื่อใส่ blank space ระหว่าง text แต่ละชุด

    Note: เราต้องเขียน TEXTJOIN() ทีละ row เอง เพราะเราไม่สามารถใช้ ArrayFormula กับ TEXTJOIN() ได้

    .

    (3) Extracting Text

    สูตร:

    เราสามารถดึง text ออกมา ได้ด้วย 3 วิธี:

    FormulaDescription
    LEFT()ดึง text โดยนับจากทางซ้าย
    RIGHT()ดึง text โดยนับจากทางขวา
    MID()ดึง text โดยเริ่มจากตรงกลาง

    Syntax:

    สำหรับ LEFT() และ RIGHT() เขียนเหมือนกัน:

    =LR(string, characters)
    • LR คือ เลือกสูตร LEFT หรือ RIGHT
    • string คือ text ต้นฉบับที่เราต้องการดึงข้อมูลออกมา
    • characters คือ จำนวนตัวอักษรที่ต้องการดึงออกมา โดยนับจากซ้ายหรือขวา ตามสูตรที่เลือก

    ส่วน MID() มีการเขียนที่ต่างออกไป:

    =MID(string, starts, characters)
    • string คือ text ต้นฉบับที่เราต้องการดึงข้อมูลออกมา
    • starts คือ ลำดับของตัวอักษรที่จะเริ่มดึง
    • characters คือ จำนวนตัวอักษรที่ต้องการดึงออกมา

    Example:

    ใช้ 3 สูตรแยก วัน เดือน ปี ออกจาก date:

    DataFormula
    Day=ArrayFormula(LEFT(A3:A7, 2))
    Month=ArrayFormula(MID(A3:A7, 4, 2))
    Year=ArrayFormula(RIGHT(A3:A7, 4))

    ผลลัพธ์:

    LEFT() vs MID() vs RIGHT()

    .

    (3) Regular Expression

    สูตร:

    Google Sheets รองรับการใช้งาน regular expression หรือ การเขียนเพื่อจับคู่รูปแบบ text

    โดย มี 2 สูตรหลักที่มักใช้งาน คือ:

    FormulaDescription
    REGEXMATCH()เช็กว่า ในชุดข้อมูลไหม มี text ที่ต้องการ
    REGEXEXTRACT()ดึง text ออกจากชุดข้อมูล

    Syntax:

    =regex(text, regular_expression)
    • regex คือ สูตร REGEXMATCH หรือ REGEXEXTRACT
    • text คือ ชุดข้อมูลที่เราต้องการเข้าไปค้นหา
    • regular_expression คือ รูปแบบ text ที่เราต้องการค้นหา

    Example:

    เราต้องการทำ 2 อย่าง:

    1. เช็กว่า แต่ละ description มีคำว่า “she” ไหม (REGEXMATCH)
    2. ดึงคำว่า “she” ออกจาก description (REGEXEXTRACT)

    เราสามารถเขียนสูตรได้ดังนี้:

    ProblemFormula
    เช็กว่า แต่ละ description มีคำว่า “she” ไหม=ArrayFormula(REGEXMATCH(A2:A, "(?i)\\bshe\\b"))
    ดึงคำว่า “she” ออกจาก description=ArrayFormula(IFERROR(REGEXEXTRACT(A2:A, "(?i)\\bshe\\b"), "NA"))

    Note: สำหรับ REGEXEXTRACT() เราใช้ IFERROR() มาชวนแทนค่าในกรณีที่ข้อมูลต้นทางไม่มีคำว่า “she”

    ผลลัพธ์:

    REGEXMATCH() vs REGEXEXTRACT()

    จากผลลัพธ์ จะเห็นได้ว่า regular expression ที่เราใช้ จะทำให้สูตรของเราสามารถใช้ได้กับ “she” ที่เป็นพิมพ์เล็กและพิมพ์ใหญ่

    Note: เราสามารถศึกษาการเขียน regular expression ทั้งหมดได้ที่ Syntax for Regular Expressions จาก Google


    🧑‍💼 Group #7 – Google

    ในกลุ่มสุดท้าย เรามาดู 2 สูตรเฉพาะของ Google กัน:

    1. GOOGLEFINANCE()
    2. GOOGLETRANSLATE()

    .

    (1) GOOGLEFINANCE()

    Usage:

    GOOGLEFINANCE() สามารถทำได้หลายอย่าง เช่น:

    • แสดงราคาหุ้น
    • แปลงสกุลเงิน
    • วิเคราะห์เงินปันผล

    Syntax:

    การเขียน GOOGLEFINANCE() แตกต่างกันไปในแต่ละการใช้งาน

    เราสามารถศึกษาการเขียน GOOGLEFINANCE() ได้ที่ GOOGLEFINANCE จาก Google

    .

    (2) GOOGLETRANSLATE()

    Usage:

    แปลภาษา

    Syntax:

    =GOOGLETRANSLATE(text, source_lang, target_lang)
    • text คือ ข้อความที่เราต้องการแปลภาษา
    • source_lang คือ ภาษาของข้อความต้นทาง
    • target_lang คือ ภาษาของข้อความปลายทาง

    Example:

    เราสามารถใช้ทั้ง GOOGLEFINANCE() และ GOOGLETRANSLATE() เพื่อแปลข้อมูลจากอังกฤษเป็นไทยได้:

    FormulaDescription
    =ArrayFormula(A3:A12 * GOOGLEFINANCE("CURRENCY:USDTHB"))แปลงค่าเงินจากดอลล่าร์สหรัฐเป็นเงินบาท
    =GOOGLETRANSLATE(B3:B12, "en", "th")แปล text จากอังกฤษเป็นไทย

    Note: ArrayFormula ไม่สามารถใช้คู่กับ GOOGLETRANSLATE() ได้

    ผลลัพธ์:

    GOOGLEFINANCE() vs GOOGLETRANSLATE()

    💪 Recap

    ในบทความนี้ เราทำความรู้จักกับ 7 กลุ่มสูตร Google Sheets สำหรับทำงานกับ data กัน:

    กลุ่มที่ 1 – Filtering and sorting:

    FormulaFor
    FILTER()กรองข้อมูล
    SORT()จัดเรียงข้อมูล

    กลุ่มที่ 2 – Aggregating:

    FormulaDescription
    COUNTA()นับข้อมูล
    SUM()หาผลรวม
    AVERAGE()หาค่าเฉลี่ย
    MEDIAN()หาค่ากลาง
    MODE()หา value ที่ซ้ำเยอะที่สุด
    MIN()หา value ที่น้อยที่สุด
    MAX()หา value ที่มากที่สุด
    QUARTILE()หา quantile
    STDEV()หา SD
    VAR()หา variance

    กลุ่มที่ 3 – Searching:

    FormulaFor
    VLOOKUP()ดึงข้อมูลที่ตรงกับ index
    INDEX()ดึงข้อมูลที่ตรงกับ index
    MATCH()ระบุตัวแหน่งข้อมูล
    QUERY()ดึงข้อมูลตามเงื่อนไข

    กลุ่มที่ 4 – Conditions:

    FormulaFor
    IF()สร้างข้อมูลใหม่ ตาม 1 เงื่อนไข
    IFS()สร้างข้อมูลใหม่ ตามมากกว่า 1 เงื่อนไข
    IFERROR()สร้างข้อมูลใหม่ ถ้าเกิด error

    กลุ่มที่ 5 – Working with dates:

    FormulaFor
    TODAY()แสดงวันที่ของวันนี้
    DATEFID()แสดงจำนวนวันระหว่าง 2 วันที่
    NETWORKDAYS()แสดงจำนวนวันทำการระหว่าง 2 วันที่

    กลุ่มที่ 6 – Working with text:

    FormulaFor
    SPLIT()แยก text
    &
    TEXTJOIN()
    เชื่อม text
    LEFT()
    RIGHT()
    MID()
    ดึง text
    REGEXMATCH()
    REGEXEXTRACT()
    ทำงานกับ text โดยใช้ regular expression

    กลุ่มที่ 7 – Google:

    FormulaFor
    GOOGLEFINANCE()แปลงสกุลเงิน
    GOOGLETRANSLATE()แปลภาษา
  • Seaborn 101: มาดูวิธีสร้างกราฟ 5 แบบ + 3 วิธีตกแต่งกราฟอย่างง่ายใน Seaborn กัน

    Seaborn 101: มาดูวิธีสร้างกราฟ 5 แบบ + 3 วิธีตกแต่งกราฟอย่างง่ายใน Seaborn กัน

    ในบทความนี้ เราจะมาทำความรู้จักกับ seaborn และวิธีการใช้ seaborn เพื่อสร้างและตกแต่งกราฟเบื้องต้นกัน

    ถ้าพร้อมแล้วมาเริ่มกันเลย


    1. ⚓ Intro to Seaborn
    2. 🍔 Dataset ตัวอย่าง
    3. 🤔 ก่อนเริ่มสร้างกราฟ
    4. 💻 Syntax ของ Seaborn
    5. 👉 การสร้างกราฟพื้นฐาน
      1. 📊 1. Histograms
      2. 📊 2. Box Plots
      3. 📊 3. Scatter Plots
      4. 📊 4. Line Plots
      5. 📊 5. Bar Plots
    6. 🔵 การใช้สีเพื่อเพิ่มตัวแปรในกราฟ
    7. 🖼️ การตกแต่งกราฟ
      1. 🎨 1. สี
      2. 🎨 2. Style
      3. 🎨 3. ข้อความ
    8. 💪 สรุป Seaborn 101
    9. ⏭️ Next
      1. 🧑‍💻 Example Code on GitHub
      2. 📚 Further Reading

    ⚓ Intro to Seaborn

    seaborn เป็น library สำหรับ visualise data ใน Python ซึ่งต่อยอดมาจาก:

    • pandas: library สำหรับ data transformation
    • matplotlib: library สำหรับสร้างกราฟ

    เพราะ seaborn ต่อยอดจาก pandas และ matplotlib จึงทำให้เราสามารถใช้ 3 libraries นี้ร่วมกันได้อย่างลงตัว

    จุดเด่นหลักของ seaborn คือ ความสามารถในการสร้างกราฟที่สวยงามได้อย่างง่าย

    มาดูกันว่า การสร้างกราฟด้วย seaborn ง่ายแค่ไหน


    🍔 Dataset ตัวอย่าง

    ในบทความนี้ เราจะใช้ tips ซึ่งเป็น built-in datasets ของ seaborn เพื่อดูวิธีใช้ seaborn กัน

    tips เป็น dataset เกี่ยวกับ tip ที่พนักงานในร้านอาหารได้รับ โดยมี columns ดังนี้:

    No.ColumnDescription
    1total_billจำนวนเงินค่าอาหาร
    2tipจำนวนเงินค่า tip
    3sexเพศของคนจ่ายบิล
    4smokerสถานะการสูบบุหรี่ของคนจ่ายบิล (สูบ vs ไม่สูบ)
    5dayวันของสัปดาห์
    6timeช่วงเวลาของวัน (lunch vs dinner)
    7sizeจำนวนแขกที่มาด้วยกัน

    🤔 ก่อนเริ่มสร้างกราฟ

    ก่อนเริ่มสร้างกราฟ ให้เราทำ 2 อย่างก่อน:

    .

    (1) import seaborn ก่อน พร้อมกับ libraries อื่น ๆ ที่มักใช้ร่วมกัน:

    # Import libraries
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    

    Note: seaborn ใช้ตัวย่อว่า sns ตามชื่อตัวละคร Samuel Norman Seaborn จากทีวีซีรี่ย์ The West Wing

    .

    (2) ต่อจากนั้นให้ load dataset tips ที่จะใช้งาน:

    # Load the dataset
    tips = sns.load_dataset("tips")
    

    Note: ถ้าเรา preview ด้วย .head() เราจะเห็นข้อมูลแบบนี้:

    Dataset: tips

    ในกรณีที่เราต้องการ import dataset จากข้างนอก เราสามารถใช้ pandas ช่วยได้ เช่น pd.read_csv() เพื่อโหลดไฟล์ CSV


    💻 Syntax ของ Seaborn

    Syntax ในการสร้างกราฟด้วย seaborn มีดังนี้:

    sns.plot(data, x, y, customisation)
    plt.show()
    • sns.plot = เรียกชื่อกราฟที่ต้องการสร้าง
    • data = ชุดข้อมูลที่ใช้สร้างกราฟ
    • x = ข้อมูลแกน x
    • y = ข้อมูลแกน y
    • customisation = การตั้งค่าเพื่อตกแต่งกราฟ
    • plt.show() = แสดงกราฟบนหน้าจอ

    👉 การสร้างกราฟพื้นฐาน

    มาดูวิธีการสร้าง 5 กราฟพื้นฐานกัน:

    1. Histogram
    2. Box plot
    3. Scatter plot
    4. Line plot
    5. Bar plot

    .

    📊 1. Histograms

    Histogram เป็นกราฟเพื่อสำรวจการกระจายตัว (distribution) ของข้อมูล

    ตัวอย่าง:

    ดูการกระจายตัวของ tip ที่พนักงานได้รับ:

    # Create a histogram of tips
    sns.histplot(data = tips,
                 x = "tip")
    
    # Show the plot
    plt.show()
    

    Note: สำหรับ histogram เราจะละแกน y ไว้ เพราะ y จะแสดงความถี่ของข้อมูลบนแกน x

    ผลลัพธ์:

    Histogram

    Note: จะเห็นว่า tip ที่พนักงานได้รับ อยู่ในช่วง 0.5 ถึง 10 ดอลล่าร์ โดยอยู่ในช่วง 2 ถึง 4 ดอลล่าร์มากที่สุด

    .

    📊 2. Box Plots

    Box plot ทำหน้าที่คล้ายกับ histogram คือ ช่วยในการสำรวจการกระจายตัวของข้อมูล

    ข้อแตกต่างของ box plot จาก histogram ก็คือ เราสามารถดู distribution หลาย ๆ อันได้บน box plot

    ตัวอย่าง:

    ดูการกระจายตัวของ tip ที่ได้ แบ่งตามมื้ออาหาร

    # Create a box plot of tips by time
    sns.boxplot(data = tips,
                x = "time",
                y = "tip")
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Box plot

    Note: จะเห็นว่า การกระจายตัวของ tip ในแต่ละมื้อมีความใกล้เคียงกันมาก

    .

    📊 3. Scatter Plots

    Scatter plot ใช้สำรวจความสัมพันธ์ระหว่างตัวแปร 2 ตัว

    ตัวอย่าง:

    ความสัมพันธ์ระหว่างจำนวนเงินค่าอาหาร และ tip

    # Create a scatter plot of tips vs total bill
    sns.scatterplot(data = tips,
                    x = "total_bill",
                    y = "tip")
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Scatter plot

    Note: จากกราฟ เราจะเห็นได้ว่า จำนวน tip ดูเหมือนจะเพิ่มขึ้นตามจำนวนเงินค่าอาหาร

    .

    📊 4. Line Plots

    Line plot ใช้สำรวจการเปลี่ยนแปลงของตัวแปรตามช่วงเวลา หรือตามตัวแปรอีกตัว

    ตัวอย่าง:

    ดูการเปลี่ยนแปลงของ tip ตามจำนวนแขก

    # Create a line plot of tips vs party size
    sns.lineplot(data = tips,
                 x = "size",
                 y = "tip")
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Line plot

    Note: กราฟแสดงให้เห็นว่า tip เพิ่มขึ้นตามจำนวนแขก

    .

    📊 5. Bar Plots

    Bar plot ใช้สำรวจตัวแปรตามการจัดกลุ่มของตัวแปรอีกตัว

    ตัวอย่าง:

    ดูจำนวน tip ในแต่ละวันของสัปดาห์

    # Create a bar plot of tips vs day of week
    sns.barplot(data = tips,
                x = "day",
                y = "tip")
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Bar plot

    Note: เราจะเห็นว่า ในแต่ละวัน พนักงานได้ tip ใกล้เคียงกัน แต่ในวันเสาร์และอาทิตย์จะได้เยอะกว่าวันพฤหัสฯ และวันศุกร์


    🔵 การใช้สีเพื่อเพิ่มตัวแปรในกราฟ

    จนถึงตอนนี้ เราจะเห็นว่า กราฟที่เราสร้างได้มีตัวแปร 1-2 ตัวเท่านั้น

    ถ้าเราต้องการเพิ่มตัวแปรที่สามเข้าไป (โดยไม่เปลี่ยนประเภทกราฟ) เราสามารถทำได้ง่าย ๆ ด้วยการใช้สี ผ่านการเพิ่ม parametre ชื่อ hue

    ยกตัวอย่างเช่น:

    ใน scatter plot ที่แสดงความสัมพันธ์ระหว่าง tip และจำนวนเงินค่าอาหาร เราต้องการเพิ่มตัวแปรการสูบบุหรี่เข้าไปด้วย

    • ตัวแปร 1: tip
    • ตัวแปร 2: ค่าอาหาร
    • ตัวแปร 3: การสูบบุหรี่ของลูกค้า

    เราสามารถทำได้ตามนี้:

    # Create a scatter plot: tips vs total bill vs smoker types
    sns.scatterplot(data = tips,
                    x = "total_bill",
                    y = "tip",
                    hue = "smoker")
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Third variable added as hue

    จากกราฟ เราจะเห็นได้ว่า seaborn จัดการเปลี่ยนสีข้อมูลให้เองโดยอัตโนมัติ

    ทั้งนี้ ถ้าเราต้องการเปลี่ยนกราฟเป็นสีอื่น เราต้องปรับ code ของเราเพิ่มเติม


    🖼️ การตกแต่งกราฟ

    มาดู 3 วิธีในการตกแต่งกราฟใน seaborn กัน:

    1. สี
    2. Style
    3. ข้อความ

    .

    🎨 1. สี

    ใน seaborn เราสามารถปรับสีของกราฟได้ด้วย 2 วิธี:

    1. ใช้ palette
    2. ใช้ sns.set_palette()

    .

    วิธีที่ 1: กำหนด parametre ที่เรียกว่า palette

    เช่น สำหรับ scatter plot ก่อนหน้านี้ ถ้าเราอยากเปลี่ยนข้อมูลเป็นสีดำและแดง เราสามารถเขียน code ได้ดังนี้:

    • เราสร้าง dictionary ชื่อ colours เพื่อระบุว่า สีไหนจะใช้กับการสูบบุหรี่ประเภทไหน:
    # Specify colours
    colours = {"Yes": "red",
               "No": "black"}
    
    • จากนั้น เราก็ใช้ colours เป็น argument ของ palette:
    # Create a scatter plot
    sns.scatterplot(data = tips,
                    x = "total_bill",
                    y = "tip",
                    hue = "smoker",
                    palette = colours)
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Customise colour with palette

    .

    วิธีที่ 2: เรียกใช้ sns.set_palette()

    ในกรณีที่เราไม่อยากกำหนด palette เอง เราสามารถเรียก sns.set_palette() แทนได้

    sns.set_palette() จะเรียกใช้และ apply ชุดสีที่เราต้องการให้กับกราฟของเราโดยอัตโนมัติ

    สำหรับ sns.set_palette() เราสามารถใส่ argument ได้ดังนี้:

    No.Argumentค่าสี
    1"deep"ค่า default ที่ seaborn ใช้
    2"muted"เป็น "deep" เวอร์ชันสีอ่อนกว่า
    3"pastel"สีพาสเทล
    4"dark"สีเข้ม
    5"colorblind"สีสำหรับคนตาบอดสี

    เช่น:

    สร้าง scatter plot โดยใช้ "colorblind":

    • เราเรียกใช้ sns.set_palette() โดยใส่ argument เป็นชื่อ palette ที่ต้องการใช้ (ในกรณีนี้ คือ "colorblind" ซึ่งเหมาะกับคนตาบอดสี):
    # Set the palette
    sns.set_palette("colorblind")
    
    • จากนั้น สร้าง scatter plot เหมือนเดิม (3 ตัวแปร แต่ไม่มี palette):
    # Create a scatter plot
    sns.scatterplot(data = tips,
                    x = "total_bill",
                    y = "tip",
                    hue = "smoker")
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Customise colour with sns.set_palette()

    .

    🎨 2. Style

    นอกจากการเปลี่ยนสีกราฟแล้ว เรายังสามารถปรับ style ของกราฟได้ ผ่าน sns.set_style()

    โดยสำหรับ sns.set_style() เราสามารถใส่ argument ได้ดังนี้:

    No.Argumentสีพื้นหลังสีเส้นกราฟ
    1"white"ขาว ⚪ขาว ⚪
    2"dark"ดำ ⚫ดำ ⚫
    3"whitegrid"ขาว ⚪ดำ ⚫
    4"darkgrid"ดำ ⚫ขาว ⚪
    5"ticks"ขาว ⚪ไม่มี ✖️

    Note:

    • "white" เป็นค่า default ของ seaborn
    • "tick" เหมาะสำหรับกราฟที่เราต้องการเน้นแกน x และ y

    ยกตัวอย่างเช่น:

    เราต้องการปรับกราฟของเราเป็น dark theme ที่มี grid:

    • กำหนด argument ของ sns.set_style() เป็น "darkgrid":
    # Set the style
    sns.set_style("darkgrid")
    
    • สร้างกราฟที่ต้องการ:
    # Create a scatter plot
    sns.scatterplot(data = tips,
                    x = "total_bill",
                    y = "tip",
                    hue = "smoker")
    
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Customise style with sns.set_style()

    .

    🎨 3. ข้อความ

    นอกจากสีและ style แล้ว เรายังสามารถตกแต่งกราฟเพิ่มเติม ด้วยการเพิ่มข้อความกำกับกราฟ อย่าง title และ labels (ชื่อแกน x และ y) ได้ด้วย

    เราสามารถทำสิ่งนี้ได้โดยใช้ functions ของ matplotlib (plt) แบบนี้:

    • สร้างกราฟ:
    # Create a scatter plot
    sns.scatterplot(data = tips,
                    x = "total_bill",
                    y = "tip",
                    hue = "smoker")
    
    • เพิ่ม title:
    # Add a title
    plt.title("Total Bill vs Tip", fontsize = 16)
    
    • เพิ่ม labels:
    # Add labels
    plt.xlabel("Total Bill ($)", fontsize = 12)
    plt.ylabel("Tip ($)", fontsize = 12)
    
    • แสดงกราฟ
    # Show the plot
    plt.show()
    

    ผลลัพธ์:

    Adding title and labels with plt.title(), and plt.xlabel() and plt.label()

    Note: จะเห็นแล้วว่า ตอนนี้กราฟของเรามีข้อความกำกับหัวข้อกราฟ (title) รวมทั้งแกน x และ y (labels)


    💪 สรุป Seaborn 101

    ในบทความนี้ เราเรียนรู้วิธีการสร้างกราฟง่าย ๆ ใน seaborn กัน

    โดยเราเริ่มจากการสร้างกราฟพื้นฐาน 5 อย่าง:

    กราฟSeaborn
    Histogramsns.histplot()
    Box plotsns.boxplot()
    Scatter plotsns.scatterplot()
    Line plotsns.lineplot()
    Bar plotsns.barplot()

    พร้อมการเพิ่มตัวแปรที่สาม:

    เพิ่มตัวแปรที่สามSeaborn
    เพิ่มผ่านสีhue

    และจบด้วยการปรับแต่งกราฟ:

    ปรับแต่งSeaborn
    สีpalette
    sns.set_palette()
    Stylesns.set_style()
    ข้อความplt.title()
    plt.xlabel()
    plt.ylabel()

    ⏭️ Next

    หวังว่า บทความนี้จะเป็นประโยชน์สำหรับคนที่ต้องการเรียนรู้เบื้องต้นเกี่ยวกับ seaborn

    .

    🧑‍💻 Example Code on GitHub

    สำหรับใครที่ต้องการลงมือทำเอง สามารถดูตัวอย่าง code ของบทความนี้ได้ที่ GitHub

    .

    📚 Further Reading

    สำหรับคนที่ต้องการเรียนรู้เพิ่มเติม สามารถอ่านเกี่ยวกับ seaborn ได้ตาม link ด้านล่าง:

  • สรุป 7 กลุ่ม Shell Commands (31 Commands) พื้นฐานสำหรับผู้เริ่มต้น พร้อมตัวอย่าง: Orienting, Preparing, Inspecting, Analysing, Chaining, Automating, และ Getting Unstuck

    สรุป 7 กลุ่ม Shell Commands (31 Commands) พื้นฐานสำหรับผู้เริ่มต้น พร้อมตัวอย่าง: Orienting, Preparing, Inspecting, Analysing, Chaining, Automating, และ Getting Unstuck

    Shell commands เป็นคำสั่งสำหรับทำงานกับคอมพิวเตอร์ โดยแทนที่เราจะใช้ mouse สั่งการ (graphic user interface; GUI) เราจะสั่งการด้วย text แทน

    เช่น copy ภาพ แทนที่จะคลิกขวาและกด “Copy” เราจะใช้คำสั่งแบบนี้แทน:

    cp image.jpg copy_of_image.jpg

    แม้ว่า shell commands จะดูใช้งานยาก แต่ก็ทรงพลังเพราะช่วยให้เราทำงานกับคอมพิวเตอร์ได้อย่างมีประสิทธิภาพใน 3 มุม ได้แก่:

    1. Automation: ช่วย set ให้คอมพิวเตอร์ทำ task อัตโนมัติได้
    2. Speed: ช่วยให้เราทำงานได้เร็วกว่า GUI (เราพิมพ์เร็วกว่าใช้ mouse)
    3. Control: ช่วยในการตั้งค่าคอมพิวเตอร์ได้มากกว่าใช้ GUI

    Shell commands เหมาะกับสายอาชีพที่ต้องทำงานกับคอมพิวเตอร์บ่อย ๆ อย่าง:

    • System engineer ที่ต้อง set up ระบบที่ไม่มี GUI
    • Data engineer ที่ต้องการ automate การทำงานของ data pipeline
    • Data analyst สำหรับทำงานกับ file ข้อมูล
    • Software developer สำหรับจัดการ source code
    • Cybersecurity analyst ใช้วิเคราะห์และตรวจสอบความปลอดภัยของระบบ
    • ตำแหน่งงานอื่น ๆ เช่น web developer, cloud specialists, data scientists

    ในบทความนี้ ผมจะพาไปดูวิธีใช้ 7 กลุ่ม shell commands (31 commands) พื้นฐานสำหรับคนที่ไม่เคยใช้ shell commands มาก่อน กัน:

    1. Orienting: ดู directory ที่ใช้ทำงาน
    2. Preparing: จัดการ files และ folders
    3. Inspecting: ดูข้อมูลใน files
    4. Analysing: วิเคราะห์ข้อมูลใน files
    5. Chaining: เชื่อมต่อ commands เข้าด้วยกัน
    6. Automating: automate การทำงานของคอมพิวเตอร์
    7. Getting unstuck: ดูวิธีใช้ commands

    เมื่ออ่านบทความนี้แล้ว ผมหวังว่าทุกคนสามารถใช้ shell commands ในเบื้องต้นได้

    ถ้าพร้อมแล้ว ไปเริ่มกันเลย


    1. 🧭 Group #1. Orienting
      1. 📍 Command #1. pwd
      2. 📝 Command #2. ls
      3. ⏭️ Command #3. cd
    2. ⏹️ Group #2. Preparing
      1. 📂 Command #4. mkdir
      2. 🚮 Command #5. rmdir
      3. ✋ Command #6. touch
      4. 📋 Command #7. cp
      5. 📤 Command #8. mv
      6. 🗑️ Command #9. rm
    3. 👀 Group #3. Inspecting
      1. 🐈 Command #10. cat
      2. ⬇️ Command #11. less
      3. 🗿 Command #12. head
      4. 🐒 Command #13. tail
    4. 🆕 Group #4. Analysing
      1. 🪝 Command #14. wc
      2. ✂️ Command #15. grep
      3. 📎 Command #16. cut
      4. 🗂️ Command #17. paste
      5. ☘️ Command #18. sort
      6. ☝️ Command #19. uniq
      7. ♣️ Command #20. Wildcards
    5. 🔗 Group #5. Chaining
      1. ⛓️ Command #21. |
      2. ⚡ Command #22. >
      3. 🃏 Command #23. >>
    6. 🤖 Group #6. Automating
      1. 🔉 Command #24. =
      2. 🥠 Command #25. echo
      3. ➰ Command #26. for
      4. 📃 Command #27. bash
      5. 🗒️ Command #28. nano
    7. 💡 Group #7. Getting Unstuck
      1. 🏛️ Command #29. history
      2. 🕯️ Command #30. !
      3. ❓ Command #31. man
    8. 💪 Summary
    9. 😺 GitHub
    10. 📖 Further Reading
    11. 📄 References

    🧭 Group #1. Orienting

    Commands ในกลุ่มแรกช่วยให้เรารู้ว่า เรากำลังทำงานอยู่ใน directory ไหนของคอมพิวเตอร์ และประกอบด้วย 3 commands ได้แก่:

    1. pwd
    2. ls
    3. cd

    .

    📍 Command #1. pwd

    pwd (print working directory) ใช้ดูว่า เราอยู่ใน directory ไหน:

    pwd

    ผลลัพธ์:

    /home/user/Downloads

    .

    📝 Command #2. ls

    ls ใช้ “list” files และ folders ใน directory ที่ต้องการ

    เช่น ดู files และ folders ใน working directory (สมมุติว่าเป็น ”Downloads”):

    ls

    ผลลัพธ์:

    invoice.pdf
    data.csv
    photo.png
    setup.dmg

    หรือดู files และ folders ใน folder อื่น เช่น “Documents”:

    ls Documents

    ผลลัพธ์:

    resume.docx
    thesis.pdf
    notes.txt
    projects/

    สังเกตว่า เมื่อเราต้องการดู files และ folders ใน directory อื่น เราจะต้องระบุ file path ซึ่งเราทำได้ 2 วิธี:

    1. Relative: แบบอ้างอิงกับ working directory เช่น Downloads
    2. Absolute: แบบเต็ม เช่น /home/user/Downloads

    Note:

    เรามักใช้ 3 flags เหล่านี้ร่วมกับ ls:

    1. -R เพื่อดู files และ folders (ไม่ว่า folder นั้นจะมี folder ซ้อนกันกี่ชั้น)
    2. -l เพื่อดูรายละเอียดของ files
    3. -a เพื่อแสดง hidden files

    .

    ⏭️ Command #3. cd

    cd (change directory) ใช้เปลี่ยน working directory

    เช่น เราอยู่ใน folder ชื่อ “Downloads” และต้องเปลี่ยนไปที่ “Documents”:

    cd /home/user/Documents

    Note:

    เรามี shortcut สำหรับใช้ cd ดังนี้:

    1. / ไปที่ root directory
    2. ~ ไปที่ home directory ที่เรากำหนดไว้
    3. .. ไปที่ folder ต้นทาง 1 ขั้น (เช่น เราอยู่ใน /home/user/Downloads, cd .. จะพาเราไปที่ /home/user)

    ⏹️ Group #2. Preparing

    Commands ในกลุ่มที่ 2 ช่วยในการจัดการ files และ folders และมี 6 commands ได้แก่:

    1. mkdir
    2. rmdir
    3. touch
    4. cp
    5. mv
    6. rm

    Note:

    • mkdir และ rmdir ใช้กับ folder เท่านั้น
    • touch (ยกเว้นสร้าง folder), cp, mv, และ rm ใช้ได้ทั้งกับ file และ folder

    .

    📂 Command #4. mkdir

    mkdir (make directory) ใช้สร้าง folder

    เช่น สร้าง folder ใหม่ชื่อ new_folder:

    mkdir new_folder

    .

    🚮 Command #5. rmdir

    rmdir (remove directory) ใช้ลบ folder

    เช่น ลบ folder “new_folder”:

    rmdir new_folder

    Note:

    rmdir ใช้กับ folder ที่มี files อยู่ไม่ได้

    ถ้าต้องการลบ folder ที่มีข้อมูล เราทำได้ 2 ทาง คือ:

    1. ลบข้อมูลออกจาก folder ก่อนใช้ rmdir
    2. ใช้ rm -r แทน

    ทั้งนี้ folder ที่ลบแล้วจะกู้คืนไม่ได้ ดังนั้น เราควรเช็กให้แน่ใจว่า เราต้องการลบ folder จริง ๆ ก่อนจะใช้ rmdir

    .

    ✋ Command #6. touch

    touch มี 2 การใช้งาน:

    1. สร้าง file ใหม่ เมื่อยังไม่มี file
    2. อัปเดต timestamp ของ file เมื่อมี file อยู่แล้ว

    เช่น สร้าง file ใหม่ ชื่อ “new_file.txt”:

    touch new_file.txt

    เราสามารถสร้างได้มากกว่า 1 file แบบนี้:

    touch new_file_1.txt new_file_2.txt new_file_3.txt

    ในกรณีที่เรามี file “new_file.txt” อยู่แล้ว เราสามารถใช้ touch เพื่ออัปเดต timestamp ของ file ให้เป็นปัจจุบันได้:

    touch new_file.txt

    โดย timestamp จะถูกอัปเดตให้เป็นเวลาที่ command รันสำเร็จ

    .

    📋 Command #7. cp

    cp (copy) ใช้ copy file หรือ folder

    เช่น copy file “new_file.txt” ไว้ใน folder เดิม:

    cp new_file.txt copy_of_new_file.txt

    ถ้าเราต้องการ copy ไปยัง folder อื่น (เช่น “Documents”) ให้เราใส่ file path ต่อท้ายแบบนี้:

    cp new_file.txt /home/user/Documents/copy_of_new_file.txt

    ถ้าเราไม่ต้องการเปลี่ยนชื่อ file เราจะไม่กำหนดชื่อ file ใหม่ (เช่น “copy_of_new_file.txt”) แบบนี้:

    cp new_file.txt /home/user/Documents

    Note:

    • เราจะใช้ cp กับ -r เมื่อทำงานกับ folder
    • ในกรณีที่ folder ปลายทางมี file ชื่อเดียวกัน file เก่าจะถูกแทนที่ด้วย file ใหม่ทันที
    • เพื่อป้องกันการแทนที่ ให้ใช้ -i เพื่อให้ shell command ถามเราก่อนว่าต้องการแทนที่ file ไหม

    .

    📤 Command #8. mv

    mv (move) ใช้งานได้ 2 แบบ:

    1. เปลี่ยนชื่อ file หรือ folder
    2. ย้าย file หรือ folder

    เช่น เปลี่ยนชื่อ file จาก “new_file.txt” เป็น “my_file.txt”:

    mv new_file.txt my_file.txt

    ถ้าเราต้องการย้าย file ให้เราใส่ file path แทนชื่อ file ใหม่:

    mv new_file.txt /home/user/Documents

    Note:

    • เช่นเดียวกับ cp ถ้า folder ปลายทางมี file ชื่อเดียวกันกับ file ที่เรากำลังย้ายไป file เก่าจะถูกแทนที่ในทันที
    • เราสามารถใช้ -i เพื่อให้ shell command ถามยืนยันการแทนที่ file ก่อนย้ายได้

    .

    🗑️ Command #9. rm

    rm (remove) ใช้ลบ file หรือ folder

    เช่น ลบ “my_file.txt”:

    rm my_file.txt

    Note:

    • เราจะใช้ rm คู่กับ -r เมื่อทำงานกับ folder
    • File ที่ลบแล้วจะกู้คืนได้ยาก ดังนั้น เราควรเช็ก file ก่อนลบทุกครั้ง
    • เราใช้ -i เพื่อให้ shell command ถามยืนยันการลบได้

    👀 Group #3. Inspecting

    Commands ในกลุ่มที่ 3 ช่วยเราดูข้อมูลใน file โดยไม่ต้องใช้ programme อื่น และประกอบด้วย 4 commands ได้แก่:

    1. cat
    2. less
    3. head
    4. tail

    .

    🐈 Command #10. cat

    cat (concatenate) ใช้เปิดดูข้อมูลใน file (เหมาะสำหรับ file ที่มีข้อมูลไม่เยอะ)

    เช่น เปิดดู “small_file.txt” ที่มีข้อความ 5 บรรทัด:

    cat small_file.txt

    ผลลัพธ์:

    .

    ⬇️ Command #11. less

    less ทำงานเหมือนกับ cat คือ เปิดดู file แต่เหมาะกับ file ที่ข้อมูลจำนวนมาก (เช่น คู่มือ)

    เช่น เปิดดู “large_file.txt”:

    less large_file.txt

    ผลลัพธ์:

    Shell command จะแสดงข้อมูลเท่าที่จะแสดงได้ในหน้าต่างแบบนี้:

    เราสามารถเลือกเลื่อนดูข้อมูลได้ด้วย 5 commands นี้:

    1. space bar: เลื่อนลง
    2. b: เลื่อนขึ้น
    3. q: ออกจาก file

    .

    🗿 Command #12. head

    head ใช้ดูข้อมูล 10 บรรทัดแรกของ file

    เช่น ดู 10 บรรทัดแรกของ “large_file.txt”:

    head large_file.txt

    ผลลัพธ์:

    Note:

    • เราจะใช้ -n เพื่อกำหนดจำนวนบรรทัดที่ต้องการดู เช่น head -n 2 จะแสดง 2 บรรทัดแรก

    .

    🐒 Command #13. tail

    tail ใช้ดูข้อมูล 10 บรรทัดสุดท้ายของ file

    เช่น ดู 10 บรรทัดสุดท้ายของ “large_file.txt”:

    tail large_file.txt

    ผลลัพธ์:

    Note:

    • เราจะใช้ -n เพื่อกำหนดจำนวนบรรทัดที่ต้องการดู เช่น tail -n 2 จะแสดง 2 บรรทัดสุดท้าย

    🆕 Group #4. Analysing

    Commands ในกลุ่มที่ 4 ช่วยเราวิเคราะห์ข้อมูลใน file และมีอยู่ 7 commands ด้วยกัน ได้แก่:

    1. wc
    2. grep
    3. cut
    4. paste
    5. sort
    6. uniq
    7. Wildcards

    .

    🪝 Command #14. wc

    wc (word count) ใช้นับจำนวน:

    1. บรรทัด เมื่อใช้คู่กับ -l
    2. คำ เมื่อใช้คู่กับ -w
    3. ตัวอักษร เมื่อใช้คู่กับ -c

    ถ้าไม่ระบุ -l, -w, -c, wc จะแสดงทั้ง 3 ค่าพร้อมกัน

    เช่น แสดงจำนวนบรรทัด คำ และตัวอักษรใน “large_file.txt”:

    wc large_file.txt

    ผลลัพธ์:

    178 523 3703 large_file.txt

    หรือแสดงแค่จำนวนคำ:

    wc -w large_file.txt

    ผลลัพธ์:

    523 large_file.txt

    .

    ✂️ Command #15. grep

    grep (global regular expression print) ใช้ค้นหา file หรือ folder ที่ตรงกับ pattern คำที่เราต้องการ

    เช่น เรามี file “emails.txt” ที่มีรายชื่ออีเมลอยู่ 10 รายการ:

    alice@gmail.com
    bob@gmail.com
    charlie@outlook.com
    diana@outlook.com
    eric@support.com
    frank@support.com
    grace@gmail.com
    henry@company.org
    irene@support.com
    jack@outlook.com

    เราสามารถค้นหา email ที่ลงท้ายด้วย “@support.com” ได้แบบนี้:

    grep "@support.com" emails.txt

    ผลลัพธ์:

    eric@support.com
    frank@support.com
    irene@support.com

    Note:

    เรามักใช้ grep ร่วมกับ 6 flags ดังนี้:

    1. -c แสดงจำนวนคำที่ตรงกับคำค้นหา
    2. -h ซ่อนชื่อ file ที่ตรงกับคำค้นหา
    3. -i ค้นหาแบบ case-insensitive
    4. -l แสดงชื่อ file ที่มีข้อมูลตรงกับคำค้นหา
    5. -n แสดงเลขบรรทัดของข้อมูลที่ตรงกับคำค้นหา
    6. -v แสดงทุกอย่าง ยกเว้นข้อมูลที่ตรงกับคำค้นหา

    .

    📎 Command #16. cut

    cut ใช้ดูข้อมูลตาม columns ใน file โดยเรามักใช้ cut คู่กับ 2 flags นี้:

    1. -d กำหนด delimiter หรือตัวอักษรที่คั่น column (เช่น ,)
    2. -f เลือก column ที่ต้องการ (เช่น column ที่ 1, 2, 3, …)

    เช่น มี file “people.csv” ที่เก็บข้อมูลพนักงานเอาไว้:

    id,name,age,city,email
    1,Alice,29,Bangkok,alice@gmail.com
    2,Bob,34,Chiang Mai,bob@outlook.com
    3,Charlie,41,Bangkok,charlie@support.com
    4,Diana,25,Phuket,diana@gmail.com
    5,Ethan,38,Bangkok,ethan@outlook.com

    เราสามารถเลือกดู column “email” (column ที่ 5) ได้แบบนี้:

    cut -d , -f 5 people.csv

    ผลลัพธ์:

    alice@gmail.com
    bob@outlook.com
    charlie@support.com
    diana@gmail.com
    ethan@outlook.com

    .

    🗂️ Command #17. paste

    paste ใช้เชื่อมต่อข้อมูลใน file โดยเชื่อมแบบบรรทัดต่อบรรทัด

    เช่น เรามี file “job_levels.txt” ที่มีข้อมูลระดับตำแหน่งงาน:

    ,level
    ,Junior
    ,Mid
    ,Senior
    ,Junior
    ,Lead

    ซึ่งเราสามารถเชื่อมกับ “people.csv” ได้แบบนี้:

    paste people.csv job_levels.txt

    ผลลัพธ์:

    id,name,age,city,email ,level
    1,Alice,29,Bangkok,alice@gmail.com ,Junior
    2,Bob,34,Chiang Mai,bob@outlook.com ,Mid
    3,Charlie,41,Bangkok,charlie@support.com ,Senior
    4,Diana,25,Phuket,diana@gmail.com ,Junior
    5,Ethan,38,Bangkok,ethan@outlook.com ,Lead

    .

    ☘️ Command #18. sort

    sort ใช้เรียงข้อมูล:

    • Default จะเรียงจากน้อยไปมาก (ascending)
    • ใช้ -r เพื่อเรียงจากมากไปน้อย (descending)

    เช่น เรียงอีเมลใน “emails.txt” จากมากไปน้อย:

    sort -r emails.txt

    ผลลัพธ์:

    jack@outlook.com
    irene@support.com
    henry@company.org
    grace@gmail.com
    frank@support.com
    eric@support.com
    diana@outlook.com
    charlie@outlook.com
    bob@gmail.com
    alice@gmail.com

    .

    ☝️ Command #19. uniq

    uniq ใช้แสดงข้อมูลที่ไม่ซ้ำกัน แต่ใช้ได้เฉพาะข้อมูลซ้ำกันที่อยู่ติดกันเท่านั้น

    เช่น มี “fruits.txt” ที่มีชื่อผลไม้:

    apple 🍎
    apple 🍎
    banana 🍌
    banana 🍌
    banana 🍌
    orange 🍊
    apple 🍎
    orange 🍊
    orange 🍊
    grape 🍇
    grape 🍇

    เราสามารถใช้ uniq เมื่อดึงผลไม้ที่ไม่ซ้ำกันออกมาได้แบบนี้:

    uniq fruits.txt

    ผลลัพธ์:

    apple 🍎
    banana 🍌
    orange 🍊
    apple 🍎
    orange 🍊
    grape 🍇

    สังเกตว่า เราจะได้ “apple 🍎” และ “orange 🍊” มา 2 ครั้ง เพราะว่า “apple 🍎” และ “orange 🍊” นี้ไม่ได้อยู่บรรทัดติดกัน ทำให้ uniq ไม่มองว่าเป็นค่าซ้ำ

    .

    ♣️ Command #20. Wildcards

    Wildcards เป็นตัวอักษรที่ใช้ค้นหาแบบ pattern matching และมีอยู่ 4 ตัวหลัก ได้แก่:

    1. ? แทนตัวอักษรใด ๆ 1 ตัว
    2. * แทนตัวอักษรใด ๆ ตั้งแต่ 0 ตัวขึ้นไป
    3. [] ใช้จับคู่ 1 ตัวอักษร ใน set ที่กำหนด
    4. {} ใช้จับคู่ 1 คำ ใน set ที่กำหนด

    ตัวอย่าง การใช้ ? เช่น ค้นหา file ที่มีชื่อ เช่น “file1.txt”, “file2.txt”, “file3.txt”:

    ls file?.txt

    Note: shell command จะไม่แสดง “file10.txt” เพราะ ? ใช้ได้แค่เลขตัวเดียว

    ตัวอย่างการใช้ * เช่น แสดง file ที่ลงท้ายด้วย “.txt”:

    ls *.txt

    ตัวอย่างการใช้ [] เพื่อค้นหา file ของปี 2024 และ 2025:

    ls 202[45].txt

    ผลลัพธ์: เราจะได้ file “2024.txt” และ “2025.txt” แต่จะไม่ได้ file เช่น “2023.txt”

    ตัวอย่างการใช้ {} เพื่อค้นหา file ชื่อ “backup” ที่ลงท้ายด้วย “csv” หรือ “txt”:

    ls backup.{csv,txt}

    🔗 Group #5. Chaining

    Commands ในกลุ่มที่ 5 ใช้เชื่อม commands เข้าด้วยกัน และมีอยู่ 3 commands ได้แก่:

    1. |
    2. >
    3. >>

    .

    ⛓️ Command #21. |

    | (pipe) ใช้เชื่อม shell commands เข้าด้วยกัน แบบนี้:

    A | B

    Output จาก A เป็น input ให้กับ B

    เช่น หาค่า unique ใน “fruits.txt”:

    cat fruits.txt | sort | uniq
    • cat เปิด file “fruits.txt”
    • sort จัดเรียงข้อมูลจากน้อยไปมาก
    • uniq แสดงค่าเฉพาะ

    ผลลัพธ์:

    apple 🍎
    banana 🍌
    grape 🍇
    orange 🍊

    สังเกตว่า ตอนนี้ เราจะได้ชื่อผลไม้ที่ไม่ซ้ำกันแล้ว เพราะ sort ช่วยจัดให้ข้อมูลที่ซ้ำกันอยู่ในบรรทัดติดกัน ทำให้ uniq ส่งค่าเฉพาะที่ไม่ซ้ำกันได้

    .

    ⚡ Command #22. >

    > (output redirection operator) ใช้เก็บผลลัพธ์ไว้ใน file (แทนที่จะแสดงบน shell command)

    เช่น เก็บรายการ files ไว้ใน “file_list.txt”:

    ls > file_list.txt

    ผลลัพธ์:

    people.csv
    job_levels.txt
    fruits.txt
    large_file.txt
    notes.txt
    small_file.txt
    README.md

    Note:

    • ถ้า file มีข้อมูลอยู่ ข้อมูลเดิมจะถูกแทนที่
    • ถ้าต้องการเพิ่มข้อมูลต่อจากข้อมูลเก่า เราจะต้องใช้ >> แทน

    .

    🃏 Command #23. >>

    >> ใช้เพิ่มข้อมูลผลลัพธ์จาก shell command ลงใน file เช่น:

    ls >> file_list.txt

    ถ้า “file_list.txt” มีข้อมูลอยู่แล้ว ผลลัพธ์จาก ls จะต่อท้ายข้อมูลเดิม เช่น:

    people.csv
    job_levels.txt
    fruits.txt
    large_file.txt
    notes.txt
    small_file.txt
    README.md
    people.csv
    job_levels.txt
    file_list.txt
    fruits.txt
    large_file.txt
    notes.txt
    small_file.txt
    README.md

    🤖 Group #6. Automating

    Commands ในกลุ่มที่ 6 ช่วยให้คอมพิวเตอร์ทำงานให้เราโดยอัตโนมัติ และประกอบด้วย 5 commands ได้แก่:

    1. =
    2. echo
    3. for
    4. bash
    5. nano

    .

    🔉 Command #24. =

    = (equals sign) ใช้ประกาศตัวแปร (variable)

    เช่น ตัวแปรเก็บชื่อ “name”:

    name="Gojo"

    .

    🥠 Command #25. echo

    echo ใช้แสดงข้อมูล เช่น ชื่อ file หรือข้อมูลใน folder และมีวิธีใช้ 2 แบบ:

    1. แสดงค่าที่ต้องการตรง ๆ
    2. แสดงค่าที่เก็บในตัวแปร

    ตัวอย่างการแสดงค่าตรง ๆ เช่น แสดงคำว่า “name”:

    echo name

    ผลลัพธ์:

    name

    ตัวอย่างการแสดงค่าในตัวแปร เช่น ค่าที่เก็บในตัวแปร “name”:

    echo $name

    ผลลัพธ์:

    Gojo

    .

    ➰ Command #26. for

    for ใช้สร้าง loop เพื่อทำงานซ้ำ ๆ โดยอัตโนมัติ โดยมีวิธีการเขียนแบบนี้:

    for x in y; do actions; done
    • x = คำแทนสิ่งที่อยู่ใน y
    • y = ตัวแปร, ข้อมูล, หรือ file ที่ต้องใช้ทำงาน
    • actions = สิ่งที่เราต้องการให้เกิดขึ้น
    • done = คำลงท้าย loop

    เช่น แสดงข้อมูลใน file ที่ลงท้ายด้วย “.txt”:

    for i in *.txt; do cat $i; done

    .

    📃 Command #27. bash

    bash (Bourne Again SHell) ใช้เรียกใช้งาน shell commands ที่เก็บไว้ใน file

    เช่น เราสร้าง file “script.sh” ซึ่งเก็บ shell command นี้เอาไว้:

    ls

    เมื่อเราเรียกใช้งาน “script.sh”:

    bash script.sh

    เราจะได้ผลลัพธ์ของ ls เช่น:

    people.csv
    job_levels.txt
    fruits.txt
    large_file.txt
    notes.txt
    small_file.txt
    README.md

    .

    🗒️ Command #28. nano

    nano ใช้สร้างหรือแก้ไข text file ด้วย text editor ที่ชื่อ nano

    เช่น เราต้องการแก้ไข “script.sh” เราสามารถเปิด nano ได้แบบนี้:

    nano script.sh

    ผลลัพธ์:

    Note:

    เมื่ออยู่ใน nano ให้เรากด:

    • Ctrl + O เพื่อ save
    • Ctrl + X เพื่อ quit

    💡 Group #7. Getting Unstuck

    Commands ในกลุ่มสุดท้ายช่วยให้เราทำงานกับ shell commands ได้ดีขึ้น และประกอบด้วย 3 commands ได้แก่:

    1. history
    2. !
    3. man

    .

    🏛️ Command #29. history

    history ใช้เรียกดูประวัติการใช้ commands ที่ผ่านมา เช่น:

    history

    ผลลัพธ์:

    .

    🕯️ Command #30. !

    ! (bang) ใช้เรียกใช้ command ที่เคยใช้ก่อนหน้านี้

    เช่น เรียกใช้ command ที่ 71 จาก history (cat fruits.txt | sort | uniq):

    !71

    ผลลัพธ์:

    apple 🍎
    banana 🍌
    grape 🍇
    orange 🍊

    .

    ❓ Command #31. man

    man (manual) ใช้ดูคู่มือการใช้งาน command ที่ต้องการ

    เช่น ดูการใช้งาน ls:

    man ls

    ผลลัพธ์:


    💪 Summary

    ในบทความนี้ ผมพาทุกคนไปดู 7 กลุ่ม shell commands (31 commands) เบื้องต้นสำหรับคนที่ไม่เคยใช้ shell commands มาก่อน

    Group #1. Orienting — ดูว่า เราอยู่ directory ไหน:

    1. pwd
    2. ls
    3. cd

    Group #2. Preparing — จัดการ files และ folders:

    1. mkdir
    2. rmdir
    3. touch
    4. cp
    5. mv
    6. rm

    Group #3. Inspecting — ดูข้อมูลใน files:

    1. cat
    2. less
    3. head
    4. tail

    Group #4. Analysing — วิเคราะห์ข้อมูล:

    1. wc
    2. grep
    3. cut
    4. paste
    5. sort
    6. uniq
    7. Wildcards

    Group #5. Chaining — เชื่อมต่อ shell commands:

    1. |
    2. >
    3. >>

    Group #6. Automating — automate การทำงานของคอมพิวเตอร์:

    1. =
    2. echo
    3. for
    4. bash
    5. nano

    Group #7. Getting unstuck — ดูวิธีการใช้ shell commands:

    1. history
    2. !
    3. man

    หลังจากอ่านบทความกันแล้ว อย่าลืมลองใช้ shell commands ในการทำงานกันดูนะครับ


    😺 GitHub

    ดูตัวอย่าง files ในบทความนี้ได้ที่ GitHub


    📖 Further Reading

    สำหรับคนที่สนใจอ่านเพิ่มเติมเกี่ยวกับ shell commands ผมขอแนะนำ links ตามนี้:


    📄 References

  • Data Visualisation Basics: วิธีการเลือกใช้กราฟอย่างง่าย พร้อมประเภทกราฟ กรณีการใช้งาน และตัวอย่าง

    Data Visualisation Basics: วิธีการเลือกใช้กราฟอย่างง่าย พร้อมประเภทกราฟ กรณีการใช้งาน และตัวอย่าง

    ในบทความนี้ เราจะมาทำความรู้จักกับการใช้ data visualisation หรือเรียกสั้น ๆ ว่า data viz เบื้องต้นกัน:

    • Data viz คืออะไร?
    • วิธีเลือกและประเภท data viz

    ถ้าพร้อมแล้วไปเริ่มกันเลย


    1. Data Viz & Its Values
      1. Anscombe’s Quartet
    2. วิธีเลือกใช้ Data Viz
    3. Data Viz สำหรับ 1 ตัวแปร
      1. (1) Histogram
      2. (2) Box Plot
    4. Data Viz สำหรับ 2 ตัวแปร
      1. (1) Scatter Plot
      2. (2) Line Plot
      3. (3) Bar Plot
      4. (4) Dot Plot
    5. Data Viz สำหรับมากกว่า 2 ตัวแปร
      1. (1) Pair Plot
      2. (2) Heatmap
      3. (3) Parallel Coordinates Plot
    6. Caution: Pie Chart
    7. สรุป
    8. Bonus: เพิ่มตัวแปรใน Data Viz อย่างง่าย ๆ

    Data Viz & Its Values

    Data viz เป็นการนำเสนอข้อมูล (data หรือ information) ในรูปแบบของ …

    • กราฟ/ชาร์ต (graph/chart)
    • แผนภาพ (diagram)
    • รูปภาพ (picture)

    การแปลข้อมูลมาอยู่ในรูปของ data viz มีประโยชน์หลัก ๆ คือ

    1. ช่วยให้เห็น pattern ที่อยู่ในข้อมูลได้ง่ายขึ้น
    2. (ในกรณีที่ใช้ในการนำเสนอข้อมูล) ช่วยให้คนอื่นเข้าใจและจดจำข้อมูลของเราได้ดีขึ้น

    Anscombe’s Quartet

    ประโยชน์ของ data viz เห็นได้ชัดที่สุด ในตัวอย่างของ Anscombe’s Quartet

    ชุดข้อมูล Anscombe’s Quartet

    Anscombe’s Quartet เป็นข้อมูล 4 ชุด (แต่ละชุดประกอบด้วยคะแนน x และ y) ที่แตกต่างกัน แต่มีค่าสถิติที่เกือบจะเหมือนกัน เช่น

    • ค่าเฉลี่ย (mean) ของ x และ y
    • ค่าความแปรปวน (variance) ของ x และ y
    • correlation ระหว่าง x และ y

    แต่ถ้าเรานำ Anscombe’s Quartet มาทำเป็น data viz ก็จะเห็นว่า ข้อมูลทั้งสี่ชุดแตกต่างกันอย่างชัดเจน

    Data viz ของ Anscombe’s Quartet

    Anscombe’s Quartet เป็นตัวอย่างที่แสดงให้เห็นว่า data viz สามารถช่วยให้เราทำความเข้าใจข้อมูลได้อย่างง่ายและรวดเร็ว

    (ใครที่สนใจข้อมูลชุดนี้ สามารถเข้าดูเพิ่มได้ที่ Google Sheets)


    วิธีเลือกใช้ Data Viz

    เพื่อใช้งาน data viz ให้เกิดประสิทธิภาพสูงสุด เราควรเลือกใช้งาน data viz ให้ถูกประเภท

    โดยปัจจัยที่เราใช้เพื่อเลือก data viz มีอยู่ 2 อย่าง คือ

    1. จำนวนตัวแปร (variable) ที่เราใช้สร้าง data viz
    2. ประเภทของตัวแปร ซึ่งแยกได้เป็น 2 ประเภท ได้แก่
      1. Categorical variable หรือตัวแปรเชิงคุณภาพ เช่น เพศ จังหวัด สกุลเงิน
      2. Continuous variable หรือตัวแปรเชิงปริมาณ เช่น ความสูง น้ำหนัก จำนวนเงิน

    เมื่อเราใช้ 2 ปัจจัยนี้ เราจะจัดกลุ่ม data viz ได้ต่อไปดังนี้


    Data Viz สำหรับ 1 ตัวแปร

    .

    (1) Histogram

    ประเภทตัวแปร:

    Categorical variable

    กรณีการใช้งาน:

    สำรวจการกระจายตัว (distribution) ของตัวแปร

    ตัวอย่าง:

    การกระจายตัวของอายุประชาชน

    .

    (2) Box Plot

    ประเภทตัวแปร:

    Categorical variable

    กรณีการใช้งาน:

    • สำรวจ distribution ของตัวแปร
    • เปรียบเทียบ distribution กับตัวแปรอื่น ๆ

    ตัวอย่าง:

    ค่าใช้จ่ายรายเดือนของ 5 เมืองใหญ่ในอเมริกา


    Data Viz สำหรับ 2 ตัวแปร

    .

    (1) Scatter Plot

    ประเภทตัวแปร:

    1 continuous x 1 continuous variable

    กรณีการใช้งาน:

    สำรวจความสัมพันธ์ระหว่าง 2 ตัวแปร

    ตัวอย่าง:

    ความสัมพันธ์ระหว่างชั่วโมงเรียนและคะแนนสอบ

    .

    (2) Line Plot

    ประเภทตัวแปร:

    1 continuous x 1 continuous variable

    กรณีการใช้งาน:

    • สำรวจความสัมพันธ์ระหว่าง 2 ตัวแปร
    • ดู trend การเปลี่ยนแปลงตามเวลา

    ตัวอย่าง:

    ระดับอุณหภูมิในช่วงเวลา 1 ปี

    .

    (3) Bar Plot

    ประเภทตัวแปร:

    1 categorical x 1 continuous variable

    กรณีการใช้งาน:

    • นับจำนวนครั้งของ categorical variable
    • ดู percent ของ continuous variable เมื่อแบ่งตาม categorical variable

    ตัวอย่าง:

    จำนวนกาแฟที่ขายได้ในแต่ละวันของสัปดาห์

    .

    (4) Dot Plot

    ประเภทตัวแปร:

    1 categorical x 1 continuous variable

    กรณีการใช้งาน:

    ดูจำนวน continuous variable เมื่อแบ่งตาม categorical variable

    ตัวอย่าง:

    จำนวนพนักงานในแต่ละแผนก


    Data Viz สำหรับมากกว่า 2 ตัวแปร

    .

    (1) Pair Plot

    จำนวนตัวแปร:

    สูงสุด 10 ตัวแปร

    ประเภทตัวแปร:

    Categorical, continuous variables, หรือผสมก็ได้

    กรณีการใช้งาน:

    • ดู distribution ของตัวแปร
    • หาความสัมพันธ์ระหว่างตัวแปร

    ตัวอย่าง:

    ดูความสัมพันธ์ระหว่างลักษณะต่าง ๆ ของรถยนต์ เช่น แรงม้า น้ำหนัก การกินน้ำมัน

    .

    (2) Heatmap

    ประเภทตัวแปร:

    Continuous variables

    กรณีการใช้งาน:

    หาความสัมพันธ์ระหว่างตัวแปร

    ตัวอย่าง:

    อุณหภูมิของแต่ละเมืองในแต่ละเดือน

    .

    (3) Parallel Coordinates Plot

    ประเภทตัวแปร:

    Continuous variables เท่านั้น

    กรณีการใช้งาน:

    • หา pattern ในข้อมูล
    • จับกลุ่ม pattern ในข้อมูล

    ตัวอย่าง:

    คะแนนสอบนักเรียนในแต่ละวิชา


    Caution: Pie Chart

    Pie chart เป็น data viz ที่ควรหลีกเลี่ยง เพราะเป็นกราฟที่ตีความได้ยาก

    ตัวอย่างเช่น pie chart ที่แสดงสัดส่วนเวลาที่ programmer ใช้ในแต่ละวัน เราจะรู้ได้ยังไงว่า programmer ใช้เวลาไปกับอะไรมากกว่ากัน ระหว่าง Research และ Documentation

    จากตัวอย่าง ถ้าเราใช้ bar plot แทน จะเห็นได้ว่า เราทำความเข้าใจข้อมูลได้เร็วกว่า และตอบได้ทันทีว่า programmer ใช้เวลาไปกับ Research และ Documentation เท่า ๆ กัน:

    กรณีหลัก ๆ ที่เราจะใช้ pie chart คือ สำรวจสัดส่วนของข้อมูล เช่น ตัวอย่างด้านบน หรือจากยอดขายทั้งหมด สินค้าแต่ละตัวขายได้เป็นกี่เปอร์เซ็นต์

    นอกจากนี้ เราไม่ควรใช้ pie chart กับข้อมูลที่มี category มากกว่า 7 เพราะจะทำให้ pie chart อ่านยาก


    สรุป

    Data viz เป็นเครื่องมือช่วยในการทำความเข้าใจและสื่อสารข้อมูล

    โดยการเลือกใช้ data viz ขึ้นอยู่กับ 2 ปัจจัย คือ

    1. จำนวนตัวแปร
    2. ประเภทตัวแปร

    เราสามารถใช้ 2 ปัจจัยนี้ สรุปการเลือกใช้ data viz 10 ประเภทได้ดังนี้:

    No.Data Vizจำนวนประเภท
    1Histogram1Categorical
    2Box plot1Categorical
    3Scatter plot2All continuous
    4Line plot2All continuous
    5Bar plot2Categorical x Continuous
    6Dot plot2Categorical x Continuous
    7Pair plot>2Any
    8Heatmap>2Continuous
    9Parallel coordinates>2Continuous
    10Pie chart1Categorical

    Bonus: เพิ่มตัวแปรใน Data Viz อย่างง่าย ๆ

    เราสามารถใช้ 4 สิ่งเหล่านี้ เพื่อเพิ่มตัวแปรที่ 3 เข้าไปใน data viz สำหรับ 2 ตัวแปรได้:

    1. สี (colour)
    2. ขนาด (size)
    3. ความโปร่งใส (transparency)
    4. รูปทรง (shape)

    มาดูตัวอย่างกัน:

    ความสัมพันธ์ระหว่างความพึงพอใจและประสิทธิภาพในการทำงาน โดยแบ่งตามแผนก

    1. แบ่งแผนกด้วยสี

    2. แบ่งแผนกด้วยขนาด

    3. แบ่งแผนกด้วยความโปร่งใส

    4. แบ่งแผนกด้วยรูปทรง

    Note: จากตัวอย่างเราจะเห็นว่า การใช้สีเป็นวิธีนำเสนอตัวแปรที่สามได้ดีที่สุด ในขณะที่ขนาด ความโปร่งใส และรูปทรง

  • Microcopy: 4 หลักการ + 7 รูปแบบการเขียนคำบนเว็บให้ Users อยากใช้งาน

    Microcopy: 4 หลักการ + 7 รูปแบบการเขียนคำบนเว็บให้ Users อยากใช้งาน

    1. Microcopy: จิ๋ว แต่แจ๋วยังไง?
    2. Microcopy: How-to
    3. UX Writing Principles
      1. Principle #1: Clear
      2. Principle #2: Concise
      3. Principle #3: Useful
      4. Principle #4: On Brand
      5. Principle #4: On Brand
      6. สรุปหลักการ UX Writing
    4. Microcopy Patterns
    5. Pattern #1: Title
    6. Pattern #2: Button
    7. Pattern #3: Error Message
    8. Pattern #4: Confirmation Message
    9. Pattern #5: Text-Input Field
    10. Pattern #6: Empty State
    11. Pattern #7: Waiting Time
    12. Recap
    13. Tips ส่งท้าย
    14. Further Reading

    การที่เราจะออกแบบเว็บไซต์ที่น่าสนใจและน่าดึงดูด ต้องพึ่งองค์ประกอบต่าง ๆ ที่เราใส่ลงบนหน้าเว็บ ทั้ง …

    • รูปภาพ
    • ไอคอน
    • โทนสี
    • ฟอนต์ (font)

    รวมไปถึง microcopy หรือคำที่เราใส่ลงบนเว็บด้วย


    Microcopy: จิ๋ว แต่แจ๋วยังไง?

    ลองจินตนาการว่า เราสร้างเว็บขึ้นมาหน้าหนึ่ง โดยในหน้าเว็บมีรูปและไอคอนที่สื่อสารการใช้เว็บ แต่ไม่มีคำหรือข้อความใด ๆ user ของเราอาจจะยังใช้งานได้ …

    … แต่ไม่ง่ายนัก โดยเฉพาะถ้าเทียบกับเวอชันที่มาพร้อม microcopy ที่ user เข้ามาถึงแล้ว สามารถใช้งานได้ทันที:

    Microcopy เป็นองค์ประกอบที่ช่วยให้ user ทำความเข้าใจและใช้งานเว็บของเราได้ง่ายและมีประสิทธิภาพ

    ประโยชน์ของ microcopy ไม่หยุดเพียงช่วยให้เว็บของเราใช้งานได้และใช้งานง่าย แต่ยังช่วยเพิ่ม engagement ให้กับเว็บของเราอีกด้วย

    ยกตัวอย่าง Google ที่เปลี่ยนคำบนหน้าค้นหาที่พัก จากคำว่า …

    Book a room

    เป็น …

    Check availability

    ก็ทำให้ยอด engagement เพิ่มขึ้น 17%

    ตัวอย่างของ Google แสดงให้เห็นว่า แม้ microcopy อาจจะเป็นเพียงคำเล็ก ๆ บนเว็บ แต่ก็ส่งผลที่สร้างความแตกต่างอย่างเห็นได้ชัด

    ดังนั้น ถ้าเราอยากจะสร้างเว็บไซต์ที่อยากให้คนเข้ามาใช้ เราก็ควรมี microcopy ที่ดีบนเว็บบนเว็บไซต์


    Microcopy: How-to

    การจะเขียน microcopy ที่ดีไม่ใช่เรื่องยาก และใคร ๆ ก็สามารถทำได้ โดยเริ่มจากการทำความเข้าใจ …

    1. หลักการ UX writing
    2. Patterns ของ microcopy

    UX Writing Principles

    UX (user experience) writing เป็นศาสตร์ในการเขียนเพื่อประสบการณ์ของ user

    หลักของ UX writing ในการเขียน microcopy มีอยู่ 4 ข้อ ได้แก่

    1. Clear
    2. Concise
    3. Useful
    4. On Brand

    .

    Principle #1: Clear

    Clear หมายถึง ความชัดเจนของคำที่ใช้ ซึ่งเราสามารถทำได้โดย …

    1. หลีกเลี่ยงศัพท์เทคนิค
    2. ให้ข้อมูลบริบท (context) กับ user

    ยกตัวอย่าง microcopy ที่แจ้งเตือน error ในการเข้าสู่ระบบจาก Google I/O:

    จะเห็นได้ว่า microcopy นี้ขาดความชัดเจน เพราะ …

    1. มีศัพท์เทคนิคที่ user บางคนอาจจะไม่รู้จัก คือ authentication
    2. ไม่มีข้อมูลให้ user ว่า ทำไม error นี้ถึงเกิดขึ้น

    ถ้าเราปรับ microcopy ตามหลัก Clear แล้ว เราจะได้ microcopy ใหม่แบบนี้:

    จะเห็นได้ว่า microcopy ใหม่ (ขวามือ) มีความชัดเจนมากขึ้น เพราะตอนนี้ user รู้แล้ว ผ่านการสื่อสารด้วยคำง่าย ๆ (sign-in error แทน authentication error) ว่า error นี้เกิดจากการใช้รหัสผ่านผิด

    .

    Principle #2: Concise

    Concise ไม่ใช่การเขียนคำให้สั้นที่สุด แต่หมายถึง การเขียนคำให้กระชับ โดย …

    1. ใช้คำอย่างประหยัด แต่ชาญฉลาด
    2. Frontloaded: ใส่ใจความสำคัญไว้ต้นประโยค เพื่อให้ user รู้ในทันว่า สารที่ต้องการสื่อคืออะไร

    จากตัวอย่างของ Google I/O เราจะเห็นว่า microcopy ที่ปรับแก้แล้ว ยังไม่ concise เพราะ …

    1. มีการสื่อสารที่ซ้ำซ้อน โดยวลี “Sign-in error” และ “You entered an incorrect password” สื่อความหมายเดียวกัน คือ เกิดขึ้นผิดพลาดในการเข้าสู่ระบบ
    2. ใจความสำคัญ (incorrect password) อยู่หลังสุด ทำให้ user ต้องเสียเวลาอ่านก่อนจะเข้าใจสารที่ต้องสื่อ

    ถ้าแก้ไขทั้ง 2 ข้อนี้แล้ว เราจะได้ microcopy ที่ตรงกับหลัก Concise มากขึ้น:

    ตอนนี้ user แค่กวาดตาอ่าน microcopy ของเรา ก็สามารถทำความเข้าใจสิ่งที่เกิดขึ้นได้ในทันที

    .

    Principle #3: Useful

    Useful หมายถึง microcopy บอก next action ให้กับ user

    จากตัวอย่างของ Google I/O เราสามารถปรับ microcopy ข้างต้นให้ useful มากขึ้นได้ ดดยการปรับปุ่ม “OK” ให้เป็นปุ่มอื่นที่ช่วยให้ user แก้ error ที่กำลังเจอได้:

    • “TRY AGAIN”
    • “RECOVER PASSWORD”

    ตอนนี้ microcopy ไม่เพียงแค่ให้ข้อมูล แต่ยังช่วยให้ user แก้ปัญหา และใช้งานเว็บต่อไปได้

    .

    Principle #4: On Brand

    Principle #4: On Brand

    On Brand หมายถึง การใช้คำที่สอดคล้องกับ brand identity หรือความเป็นตัวตนของเรา

    จากตัวอย่างของ Google I/O ถ้าทุกคนใช้แค่ 3 หลักการแรก microcopy ของทุกเว็บก็อาจจะออกมาเหมือน ๆ กัน แต่ถ้าเราใส่ความเอกลักษณ์ของเราเข้าไป เราก็จะช่วยให้เว็บไซต์ของเราแตกต่าง ซึ่งอาจช่วยเพิ่ม engagement ให้กับ user ที่เราต้องการได้

    มาลองดูตัวอย่าง On Brand กัน สมมุติว่า brand identity ของเราเป็นคนชิล ๆ เราอาจจะปรับ microcopy เป็น …

    Whoops! Looks like that password’s playing hard to get.

    [Give it another shot!]

    [Lost your password pal?]

    หรือถ้าเราอยากให้ดูทางการ เราอาจจะปรับเป็นแบบนี้ …

    Incorrect password. Please verify your entry.

    [Retry]

    [Recover password]

    .

    สรุปหลักการ UX Writing

    หลักการ UX writing มี 4 ข้อ คือ

    1. Clear: ชัดเจน มีบริบท
    2. Concise: กระชับ ไม่ซ้ำซ้อน
    3. Useful: มีประโยชน์ รู้วิธีใช้
    4. On Brand: โดดเด่น เป็นตัวของตัวเอง

    Microcopy Patterns

    นอกจากหลักการ UX writing แล้ว เรายังควรทำความเข้าใจ patterns เพื่อจะสามารถเขียน microcopy ได้อย่างมีประสิทธิภาพอีกด้วย

    Microcopy patterns เป็นการจัดประเภท microcopy ที่อยู่บนเว็บ โดยหลัก ๆ microcopy สามารถจัดได้เป็น 7 รูปแบบ ได้แก่

    1. Title
    2. Button
    3. Error message
    4. Confirmation message
    5. Text-input field
    6. Empty state
    7. Waiting time

    แต่ละรูปแบบมีจุดประสงค์และการเขียนที่แตกต่างกันไป เราไม่จำเป็นต้องจำรูปแบบการเขียนให้ได้ทั้งหมด เพียงแต่ต้องเข้าใจจุดประสงค์ของแต่ละรูปแบบเท่านั้น ว่าแต่รูปแบบให้อะไรกับ user บ้าง


    Pattern #1: Title

    Pattern แรก คือ title หรือคำที่ทำหน้าที่เหมือนป้ายบอกทาง คอยบอก user ว่ากำลังอยู่ส่วนไหนของเว็บ และ/หรือทำ action อะไรได้บ้าง

    .

    Title แบ่งออกเป็น 4 ประเภท ซึ่งมีการเขียนไม่เหมือนกัน ได้แก่

    .

    ประเภทที่ 1. Single task หรือ title ของหน้าเว็บที่ user สามารถทำได้แค่ 1 action:

    การเขียน: ใช้คำกริยาที่สื่อถึง action ดังกล่าว

    ตัวอย่าง: คำว่า “Save to board” ของ Pinterest ในหน้า save pin ซึ่ง user สามารถทำได้ 1 action คือ บันทึก pin ไปยัง board ที่ต้องการ

    .

    ประเภทที่ 2. Ambiguous task หรือ title ในหน้าเว็บที่ user สามารถทำได้มากกว่า 1 action:

    การเขียน: ใช้คำที่ครอบคลุม action หรือ content ของหน้านั้น

    ตัวอย่าง: คำว่า “Settings” ในหน้าตั้งค่าของ Duolingo เพราะหน้านี้ user สามารถทำได้อย่างน้อย 2 อย่าง คือ จัดการโปรไฟล์ และตั้งค่าแอป

    .

    ประเภทที่ 3. Content name หรือ title ในหน้าเว็บที่มี content ให้อ่าน:

    การเขียน: ใช้ชื่อหัวของ content นั้น

    ตัวอย่าง: “Here’s every Samsung phone, …” ของหน้าบทความในแอป Pocket

    .

    ประเภทที่ 4. Brand name หรือ title ในหน้าเว็บของเราที่เชื่อมมาจากเว็บอื่น:

    การเขียน: ในกรณีที่ user เข้ามาหาเว็บเราจากเว็บอื่น เราก็อยากให้ user รู้ว่าหน้าที่เพิ่งมาถึงเป็น domain ของเรา ดังนั้น เราควรใช้คำที่แสดงถึง brand ของเรา เช่น ชื่อเว็บ หรือชื่อ brand

    ตัวอย่าง: Instagram ที่เขียนชื่อ brand ไว้ในหน้า feed เพื่อให้ user รู้ว่ากำลังใช้แอป Instagram อยู่


    Pattern #2: Button

    Button เป็น microcopy ที่อยู่ตามปุ่มต่าง ๆ บนระบบ

    Button แตกต่างจาก microcopy ประเภทอื่น เพราะเป็นประเภทเดียวที่ช่วยให้ user บอกเว็บไซต์ได้ว่า ต้องทำ action อะไร (ในขณะที่ประเภทอื่นเป็นเว็บไซต์บอก user ว่าต้องทำอะไร)

    จุดประสงค์ของ button คือ ช่วยให้ user ได้ทำ action ที่ต้องการ เพื่อไปถึงเป้าหมาย (เช่น ไปหน้าอ่านบทความ)

    .

    การเขียน button แบ่งได้เป็น 2 ประเภท:

    .

    ประเภทที่ 1. Conversion หรือปุ่มที่มีจุดประสงค์เพื่อเปลี่ยน user มาเป็น customer:

    การเขียน: ใช้สูตร value + relevance

    • Value คือ สื่อสารสิ่งที่ user จะได้รับเมื่อกดปุ่ม
    • Relevance คือ สื่อสารว่าสิ่งที่จะได้รับมีความเกี่ยวข้องกับ user

    ตัวอย่าง: ปุ่ม “Save more on App!” ของ Agoda ที่ชวนให้ user โหลดแอป โดยชี้ให้เห็นว่าถ้าโหลดแล้วจะช่วยประหยัดเงินได้

    .

    ประเภทที่ 2. Function หรือปุ่มที่เน้นการใช้งานมากกว่าสร้าง engagement จาก user:

    การเขียน: สำหรับปุ่มที่ไม่ต้องการให้ user กดบ่อย ๆ และเน้นการใช้งานเป็นหลัก เราสามารถใช้คำกริยาที่สื่อถึง action ที่ user จะทำได้

    ตัวอย่าง: คำว่า “Send” ในหน้า Gmail


    Pattern #3: Error Message

    Error message เป็น microcopy ที่ user จะเห็นเมื่อเกิดข้อผิดพลาดบางอย่าง ไม่ว่าจะเป็นจาก user หรือจากตัวเว็บเอง

    .

    จุดประสงค์หลักของ error message มีอยู่ 2 อย่าง คือ

    1. ช่วยให้ user จัดการกับ error ที่เกิดขึ้น
    2. ช่วยลดความรู้สึกที่ไม่ดีลง เพราะบางครั้ง error ทำให้ user รู้สึกตกใจหรืออารมณ์เสียได้

    .

    Error message มีอยู่ 2 ประเภท คือ

    1. Error ที่ user แก้ด้วยตัวเองได้ เช่น กรอกข้อมูลผิด
    2. Error ที่ user ไม่สามารถแก้เองได้ เช่น server ล่ม

    .

    ทั้งสองประเภทมีสูตรการเขียนเหมือนกัน คือ What + Why + How

    • What: บอก user ว่า error ที่เกิดขึ้นคืออะไร เช่น “Sign-in error”
    • Why: บอก user ว่า ทำไมถึงเกิด error นี้ขึ้น เช่น “You entered an incorrect password”
    • How: เสนอแนะทางการแก้ไข error ให้กับ user เช่น “Try again”

    .

    แต่การใช้สูตรมีความแตกต่างกัน ตรงที่ …

    .

    ถ้าเป็น error ที่ user แก้ไขได้เอง ให้เขียน What, Why, How ให้ชัดเจนและมีความเจาะจง (specific) เพื่อให้ user สามารถแก้ไข error ที่เกิดขึ้นได้

    เช่น error message ของ Slack ที่แจ้งเตือนเมื่อ user อัปโหลดรูปไม่ตรงกับเงื่อนไขที่กำหนด

    รูปจาก https://uxwritinghub.com/error-message-examples/

    จะเห็นได้ว่า microcopy บอก user อย่างละเอียดว่า จะต้องเลือกรูปที่จะอัปโหลดยังไง พร้อมปุ่มให้ทำ action ต่อ เพื่อให้การอัปโหลดสำเร็จ

    .

    ถ้าเป็น error ที่ user ไม่สามารถแก้ไขได้เอง สามารถเขียน What และ How แบบกว้าง ๆ (generic) ได้ (เช่น “Server error”) และไม่ต้องบอก Why ก็ได้ เพราะ user ไม่ต้องแก้ไข error นี้ด้วยตัวเอง

    เช่น error message ของ Instagram

    รูปจาก https://uxwritinghub.com/error-message-examples/

    จะเห็นว่า microcopy นี้ ไม่ได้บอกอะไรมากนัก (เช่น บอกให้รอ แต่ไม่ได้บอกว่า รอนานขนาดไหน)

    .

    เพื่อให้เข้าใจง่าย เราสามารถสรุปการใช้สูตร error message ได้ตามตาราง

    ErrorWhatWhyHow
    User แก้ได้เองSpecificRequireSpecific
    User แก้ไขเองไม่ได้GenericOptionalGeneric

    .

    Pro tips:

    เพราะ error message เป็น microcopy จะเจอกับ user ในช่วงเวลาที่อาจจะไม่ดีนัก เราจึงควรเขียน error message ให้มีความเป็นคนมากที่สุด เพื่อให้ user รู้สึกสบายใจมากขึ้น

    เราเพิ่มความเป็นมนุษย์ลงไปใน error message โดยหลีกเลี่ยง …

    1. ประโยคคำสั่ง เช่น “ต้องกรอกข้อมูลนี้” vs “โปรดกรอกข้อมูลนี้”
    2. ศัพท์เทคนิค เช่น “Authentication error” vs “Wrong password”
    3. คำที่สื่อถึงความผิดพลาด เช่น “เกิดข้อผิดพลาดในระบบ” vs “ระบบไม่สามารถตอบสนองได้ในขณะนี้ กรุณาลองใหม่อีกครั้ง”

    Pattern #4: Confirmation Message

    Confirmation message เป็น microcopy ที่เกิดขึ้นหลังจาก user ทำ action บางอย่างแล้ว และทำให้ user รู้ว่า action ที่ทำไปสำเร็จไปได้ด้วยดี

    .

    การเขียน confirmation message ทำได้ง่าย ๆ ด้วยสูตร object + V3 เช่น

    “Song removed” หรือ “ย้ายเพลงออกจากเพลย์ลิสต์”

    “Message sent” หรือ “ส่งข้อความสำเร็จ”

    “File moved to trash” หรือ “ไฟล์ถูกย้ายไปถังขยะ”

    ตัวอย่าง confirmation message เมื่อลบไฟล์ใน Google Drive

    .

    ในบางกรณีที่เราต้องให้ข้อมูลเพิ่มเติมกับ user เช่น บอกว่า หลังจากทำ action นี้แล้ว จะเกิดอะไรขึ้นต่อ เราสามารถเขียนข้อความต่อท้ายได้ เช่น

    • “ส่งข้อความสำเร็จ ทีมงานจะติดต่อกลับภายใน 7 วัน”
    • “ไฟล์ถูกย้ายไปถังขยะ คุณสามารถกู้ไฟล์คืนได้ภายใน 30 วัน”
    • “ย้ายเพลงออกจากเพลย์ลิสต์ คุณสามารถเพิ่มเพลงใหม่ตลอดเวลา”

    Pattern #5: Text-Input Field

    Text-input field เป็น microcopy ที่อยู่กับกล่องกรอกข้อมูล และมีหน้าที่ช่วยให้ user กรอกข้อมูลได้สะดวก ถูกต้อง และครบถ้วน

    .

    Text-input field ประกอบด้วย 4 ส่วน ได้แก่

    .

    ส่วนที่ 1. Title หรือ ชื่อข้อมูลที่ต้องกรอก:

    • การเขียน: บอก user ว่าข้อมูลที่ต้องกรอกในช่องนี้คืออะไร
    • ตัวอย่าง: “อีเมล” หรือ “เบอร์โทรศัพท์”

    .

    ส่วนที่ 2. Instruction หรือ คำชี้แจงในการกรอก:

    • การเขียน: บอก user ว่าต้องกรอกอะไร
    • ตัวอย่าง: “กรอกอีเมลที่ต้องการรับข่าวสาร” หรือ “กรอกเบอร์โทรศัพท์ที่ต้องการใช้ลงทะเบียนบัญชี”

    .

    ส่วนที่ 3. Hint หรือ ตัวช่วยในการกรอก:

    • การเขียน: เขียนตัวอย่าง หรือรูปแบบการกรอก เพื่อให้ user รู้ว่าต้องกรอกข้อมูลที่ถูกต้องยังไง
    • ตัวอย่าง: “example@domain.com” หรือ “09-xxxx-xxxx”

    .

    ส่วนที่ 4. Guidance หรือ เงื่อนไขในการกรอก:

    • การเขียน: เขียนระบุเงื่อนไขการกรอกให้ชัดเจน
    • ตัวอย่าง: “กรอกอีเมลส่วนตัวเท่านั้น” หรือ “กรอกเบอร์โทรศัพท์ 10 หลัก”

    .

    เราสามารถใช้องค์ประกอบทั้งสี่ส่วนในการสร้าง text-input field ที่ทำให้ user อยากกรอก form และ engage กับเว็บไซต์ของเราได้


    Pattern #6: Empty State

    Empty state หมายถึง microcopy ในหน้าเว็บที่ว่างเพราะยังไม่มีข้อมูล หรือโหลดข้อมูลไม่สำเร็จ

    .

    จุดประสงค์ของ empty state คือ เพื่อให้ user รู้ว่าในหน้านี้ควรจะมีข้อมูลอะไร

    .

    Empty state มี 4 ประเภท คือ

    1. First use หรือ หน้าว่าง เพราะเป็นการใช้งานครั้งแรก
    2. Clear หรือ หน้าว่างจากการลบข้อมูล
    3. No results หรือ หน้าว่าง เพราะไม่พบข้อมูลค้นหา
    4. 404 error หรือ หน้าว่าง เพราะหาหน้าที่ต้องการไม่เจอ

    .

    การเขียนของ first use, no results, 404 error มีองค์ประกอบเหมือนกัน คือ

    1. Title แจ้งว่า หน้านี้ควรมีข้อมูลอะไร
    2. Description แจ้งว่า ทำไมหน้าถึงว่างเปล่า
    3. Call to action ชวนให้ user ทำ action บางอย่าง
    4. Button เพื่อให้ user ทำ action ได้

    .

    ตัวอย่าง pattern นี้ ที่เห็นได้ทั่วไป คือ Google Search เวลาที่ไม่พบสิ่งที่เราต้องการค้นหา

    Note: Google Search ไม่มี button เพราะ user สามารถใช้ search bar ด้านบนได้

    .

    ส่วน clear ให้เขียนแค่ …

    1. Title
    2. Description

    เพราะ clear เป็นหน้าว่างที่เกิดจากความตั้งใจของ user เอง เช่น user ลบอีเมลทั้งหมดจาก inbox เราไม่จำเป็นต้องมี call to action กับ button เพื่อชวนให้ user หาอีเมลมาเติม inbox ให้เต็มอีกครั้ง

    ตัวอย่างเช่น หน้า inbox ของ Outlook เมื่อเราเคลียร์อีเมลจนหมด:

    รูปจาก https://amrabed.medium.com/enjoy-your-empty-inbox-191307c6b0a7

    Pattern #7: Waiting Time

    Waiting time เป็น microcopy ที่แสดงระหว่างการเปลี่ยนหน้าหรือรอเว็บประมวลผลข้อมูล และเอื้อให้ user รู้ว่า ระบบกำลังทำงานอยู่

    .

    การเขียน: ใช้ V-ing เช่น

    • “Submitting” หรือ “กำลังส่ง”
    • “Removing …” หรือ “กำลังลบ …”

    .

    Pro tips

    ในระหว่างรอ เราสามารถเพิ่มคุณค่าให้กับ waiting time ได้โดย …

    • บอกว่า เว็บกำลังทำอะไรอยู่ เพื่อให้ user มีส่วนร่วมในการระหว่างรอ โดยการบอกว่า เช่น Gmail ที่เขียนว่า “กำลังโหลดข้อความของคุณ …” แทนการเขียนว่า “กำลังโหลด …” เพื่อให้ user รู้สึกว่า สิ่งที่รอเกี่ยวข้องกับตนเอง
    • เราสามารถนำเสนอข่าวสารหรือข้อมูล เช่น fun fact, product ตัวใหม่, หรือการใช้งาน feature ต่าง ๆ ให้กับ user ได้ ตัวอย่างเช่น Duolingo ที่ให้ fun fact ระหว่างรอโหลดบทเรียน

    Recap

    Microcopy เป็นคำเล็ก ๆ ที่อยู่บนหน้าเว็บของเรา ซึ่งไม่เพียงแต่ช่วยให้ user ใช้งานได้ แต่ยังสร้าง engagement ให้กับ user ได้ด้วย

    การจะสร้าง microcopy ที่ดี จะต้องมีความเข้าใจ 2 อย่าง คือ

    1. หลักการ UX writing (4 ข้อ)
      1. Clear
      2. Concise
      3. Useful
      4. On Brand
    2. Microcopy patterns (7 รูปแบบ)
      1. Title
      2. Button
      3. Error message
      4. Confirmation message
      5. Text-input field
      6. Empty state
      7. Waiting time

    Tips ส่งท้าย

    Tip #1 – Start microcopy early: การเขียน microcopy ควรเริ่มพร้อม ๆ กับตอนออกแบบเว็บไซต์ เพื่อที่เราจะได้จัดวาง element และคำให้เข้ากัน และหลีกเลี่ยงความไม่ลงตัว เช่น ปุ่มสั้นกว่าคำ หรือคำยาวกกว่ากล่อง

    .

    Tip #2 – Conversational writing: เวลาร่าง microcopy ให้ลองคิดว่า ถ้าเราคุยกับ user เราจะพูดว่ายังไง และ user จะตอบว่าอะไร แล้วนำการสนทนามาแปลงเป็น microcopy

    เช่น …

    เรา: สวัสดีครับ ยินดีต้อนรับ

    user: สวัสดีค่ะ

    เรา: วันนี้มีอะไรให้ช่วยบ้างครับ?

    user: อยากรู้ว่า เคยทำ project อะไรมาบ้าง

    เรา: อ่อ ลองมาดูทางนี้เลย ครับ project ของผมเป็นการออกแบบเว็บไซต์ เพื่อให้คนที่สนใจเรื่อง UX design เข้ามาอ่าน

    user: แล้วประสบการณ์การทำงานละ

    เรา: จะเป็นทางนี้เลยครับ ผมเคยทำงาน …

    จาก role-play นี้ เราอาจแปลงบทสนทนาให้เป็นหน้าเว็บและ microcopy ในเว็บได้แบบนี้:

    Note: ถ้าจะให้ดี การ role-play ควรใช้ persona ของเราและ user ที่เราอยากจะดึงดูดเข้ามาในเว็บของเรา เพื่อให้ microcopy ที่ได้สะท้อน brand ของเรา และดึงดูด user มากที่สุด


    Further Reading

    สำหรับคนที่สนใจอ่านเพิ่มเติมเกี่ยวกับ microcopy หรืออยากศึกษาในเชิงลึก สามารถอ่านหนังสือ 2 เล่มนี้ได้:

    1. Microcopy: The Complete Guide โดย Kinneret Yifrah และ Jacqui Licht
    2. Strategic Writing for UX: Drive Engagement, Conversion, and Retention with Every Word โดย Torrey Podmajersky
  • เล่นกับข้อมูลง่าย ๆ ด้วย 5 functions จาก dplyr: วิธีใช้งาน dplyr เบื้องต้น พร้อมตัวอย่างการทำงานกับข้อมูล HR

    เล่นกับข้อมูลง่าย ๆ ด้วย 5 functions จาก dplyr: วิธีใช้งาน dplyr เบื้องต้น พร้อมตัวอย่างการทำงานกับข้อมูล HR

    1. 💻 ภาษา R
    2. 🔢 dplyr: Library สำหรับหมุนข้อมูล
    3. 🧑‍💼 ตัวอย่างข้อมูล HR
    4. ✍️ Pattern การเขียน Function
    5. 1️⃣ Function #1: select()
    6. 2️⃣ Function #2: filter()
    7. 3️⃣ Function #3: arrange()
    8. 4️⃣ Function #4: summarise()
    9. 5️⃣ Function #5: mutate()
    10. 🫂 Put Everything Together: Pipe Operator
    11. 🔥 สรุป 5 Functions จาก dplyr
    12. 💪 Try It Yourself
    13. 📚 อ่านเพิ่มเติมเกี่ยวกับ dplyr
    14. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    💻 ภาษา R

    R เป็นภาษาคอมพิวเตอร์ที่ออกแบบมาเพื่อทำงานกับ data เหมาะกับสายงานที่ต้องทำงานกับ data เช่น

    • Researcher ที่ต้องการวิเคราะห์ลักษณะกลุ่มตัวอย่าง เช่น จำนวนตัวอย่างแบ่งตามเพศ หรือช่วงอายุ
    • Data analyst ที่ต้องการหา insight จากข้อมูลขององค์กร เช่น วิเคราะห์แนวโน้มทางธุรกิจ
    • Sale ที่ต้องการวิเคราะห์ข้อมูลการขาย เช่น จำนวนลูกค้า ยอดขาย และกำไร
    • หรือแม้แต่ HR ที่ต้องการทำข้อมูลพนักงาน เช่น วิเคราะห์ performance, engagement, และ job satisfaction

    🔢 dplyr: Library สำหรับหมุนข้อมูล

    R มี built-in functions และ libraries หลากหลายที่รองรับการทำงานกับ data ในรูปแบบต่าง ๆ ซึ่งหนึ่งใน libraries ที่นิยมใช้กัน ได้แก่ dplyr

    dplyr เป็น library ที่ออกแบบมาเพื่อ data transformation หรือการแปลงข้อมูล ช่วยให้การทำงานกับ data ง่ายขึ้น เมื่อเทียบกับ built-in functions

    Use case ของ dplyr เช่น:

    • สำรวจข้อมูล (data exploration)
    • ทำความสะอาดข้อมูล (data cleaning)
    • วิเคราะห์ข้อมูล (data analysis)

    .

    ในบทความนี้ เราจะไปทำความรู้จักกับ 5 functions พื้นฐานของ dplyr ที่ใช้ทำงานกับข้อมูลกัน ซึ่งได้แก่:

    1. select()
    2. filter()
    3. arrange()
    4. summarise() หรือ summarize() (เขียนได้ทั้งสองแบบ)
    5. mutate()

    🧑‍💼 ตัวอย่างข้อมูล HR

    ในบทความนี้ เราจะใช้ชุดข้อมูลจำลอง hr_data เพื่อช่วยอธิบายการใช้งาน 5 functions ของ dplyr

    hr_data ช่วยจำลองสถานการณ์ของ HR ที่ต้องวิเคราะห์ข้อมูลพนักงาน เพื่อหาวิธีแก้ปัญหาพนักงานลาออก (attrition)

    โดย hr_data ประกอบด้วย 8 ตัวแปร:

    No.ColumnData
    1IDรหัสพนักงาน
    2Nameชื่อพนักงาน
    3Departmentแผนก
    4Ageอายุ
    5Engagementคะแนนการมีส่วนร่วม (1 ถึง 100)
    6YearsAtCompanyอายุงาน
    7AttritionRiskความเสี่ยงที่จะลาออก (Low, Medium, High)
    8Salaryเงินเดือน

    Code ในการสร้างและเรียกดู hr_data:

    # Create the dataset
    hr_data <- data.frame(
      ID = 1:15,
      Name = c("Alice", "Bob", "Carol", "David", "Eve", "Frank", "Grace", 
               "Henry", "Ivy", "Jack", "Karen", "Liam", "Mona", "Nate", "Olivia"),
      Department = c("HR", "IT", "Finance", "HR", "Sales", "IT", "Finance", 
                     "Sales", "IT", "HR", "Finance", "Sales", "IT", "HR", "Sales"),
      Age = c(34, 29, 45, 50, 27, 30, 42, 35, 31, 40, 38, 28, 33, 55, 26),
      Engagement = c(85, 70, 65, 55, 90, 75, 60, 88, 80, 50, 68, 72, 78, 40, 95),
      YearsAtCompany = c(5, 2, 15, 25, 1, 3, 10, 7, 4, 20, 12, 1, 6, 30, 0),
      AttritionRisk = c("Low", "Medium", "High", "High", "Low", "Medium", "High", 
                        "Low", "Medium", "High", "High", "Low", "Medium", "High", "Low"),
      Salary = c(55000, 60000, 70000, 75000, 50000, 62000, 68000, 58000, 
                 61000, 77000, 72000, 51000, 64000, 80000, 49000)
    )
    
    # View the dataset
    hr_data
    

    ผลลัพธ์:


    ✍️ Pattern การเขียน Function

    แม้ว่าทั้ง 5 functions จะมีหน้าที่แตกต่างกัน แต่มีการเรียกใช้งานที่เหมือนกัน:

    func(dataset,
    condition)
    • func = ชื่อ function เช่น select, filter, arrange
    • dataset = ชุดข้อมูลที่เป็น input
    • condition = เงื่อนไขในการใช้งานทำงานของ function

    1️⃣ Function #1: select()

    select() ใช้เลือก column ข้อมูลที่ต้องการ

    ตัวอย่าง:

    ผู้บริหารต้องการข้อมูลที่มีแค่รายชื่อพนักงาน แผนก และคะแนนการมีส่วนร่วม

    เราสามารถใช้ select() เลือกเฉพาะ column ที่ต้องการได้:

    # Select only desired columns
    select(hr_data,
           Name,
           Department,
           Engagement)
    

    ผลลัพธ์:

    .

    Note:

    เวลาเลือก column ด้วย select() เราสามารถกำหนดลำดับของ column ที่จะมาแสดงได้ เช่น ต้องการแสดง Department ก่อน Name ก็ให้เขียน Department, Name

    .

    dplyr มี helper function ที่ช่วยในการเลือก column ให้ง่ายขึ้น เช่น:

    FunctionMeaning
    starts_with()เลือก column ที่เริ่มด้วย x
    ends_with()เลือก column ที่ลงท้ายด้วย x
    contains()เลือก column ที่มีคำว่า x
    matches()เลือก column ที่ตรงกับ regular expression
    last_col()เลือก column สุดท้ายในชุดข้อมูล
    ~เลือกทุก column ยกเว้น column ที่ระบุ

    .

    เราสามารถตั้งชื่อ column ใหม่ได้ ด้วยใช้ = เช่น FullName = Name เพื่อให้หัว column แสดงคำว่า Fullname แทน Name


    2️⃣ Function #2: filter()

    filter() ใช้เลือก row ที่ตรงกับเงื่อนไขที่กำหนดมาแสดง

    ตัวอย่าง:

    ผู้บริหารต้องการข้อมูลพนักงานที่ความเสี่ยงที่จะลาออกสูง

    เราสามารถใช้ filter() เพื่อกำหนดเงื่อนไขเพื่อกรองข้อมูลออกมาได้:

    # Filter for high attrition risk
    filter(hr_data,
           AttritionRisk == "High")
    

    ผลลัพธ์:

    .

    Note:

    เราสามารถใช้ boolean operator และ comparison operator ร่วมได้:

    OperatorMeaning
    ==เท่ากับ
    !=ไม่เท่ากับ
    >มากกว่า
    <น้อยกว่า
    &and
    |or
    !not

    เช่น:

    ผู้บริหารต้องการข้อมูลพนักงานที่ความเสี่ยงที่จะลาออกสูง ในแผนกการเงิน (Finance)

    # Filter for high attrition risk in Finance
    filter(hr_data,
           AttritionRisk == "High" & Department == "Finance")
    

    ผลลัพธ์:


    3️⃣ Function #3: arrange()

    arrange() ใช้เรียงข้อมูลตามเงื่อนไข

    ตัวอย่าง:

    ผู้บริหารอยากได้ข้อมูลพนักงานเรียงจากคะแนนการมีส่วนร่วม

    เราสามารถใช้ arrange() จัดลำดับตาม column ที่ต้องการได้:

    # Sort employees by engagement
    arrange(hr_data,
            Engagement)
    

    ผลลัพธ์:

    .

    Note:

    Default ของ arrange() เป็นเรียงจากน้อยไปมาก (A-Z)

    ถ้าต้องการเรียงจากน้อยไปมาก (Z-A) ให้ใช้ desc() เช่น:

    # Sort employees by engagement, from high to low
    arrange(hr_data,
            desc(Engagement))
    

    ผลลัพธ์:


    4️⃣ Function #4: summarise()

    summarise() ใช้ย่อยข้อมูลให้น้อยลง ช่วยให้เข้าใจข้อมูลได้ง่ายขึ้น

    ตัวอย่าง:

    ผู้บริการต้องการรู้ค่าเฉลี่ยคะแนนการมีส่วนร่วม

    เราสามารถใช้ summarise() เพื่อหาค่าเฉลี่ยได้:

    # Calculate mean engagement
    summarise(hr_data,
              mean(Engagement))
    

    ผลลัพธ์:

    .

    Note:

    Functions ที่มักใช้กับ summarise() ได้แก่:

    FunctionMeaning
    mean()หาค่าเฉลี่ย
    min()หาค่าต่ำสุด
    max()หาค่าสูงสุด
    sd()หาค่าเบี่ยงเบนมาตรฐาน (standard deviation)
    n()นับจำนวนข้อมูล

    .

    summarise() มักใช้กับ group_by() เพื่อหาค่าสถิติตามกลุ่มข้อมูล เช่น หาค่าเฉลี่ยคะแนนการทำงานตามระดับความเสี่ยงในการลาออก:

    # Calculate mean engagement by attrition risk
    summarise(group_by(hr_data, AttritionRisk),
              mean(Engagement))
    

    ผลลัพธ์:

    .

    นอกจากนี้ เราสามารถตั้งชื่อ column ของค่าสถิติได้โดยใช้ = ได้ เช่น:

    # Naming the output
    summarise(group_by(hr_data, AttritionRisk),
              AvgEng = mean(Engagement))
    

    ผลลัพธ์:


    5️⃣ Function #5: mutate()

    mutate() ใช้สำหรับสร้างข้อมูลใหม่จากข้อมูลที่มีอยู่แล้ว

    ตัวอย่าง:

    ผู้บริหารอยากรู้ว่า พนักงานแต่ละคนเหลือเวลาก่อนเกษียณอายุเท่าไร

    เราสามารถใช้ mutate() เพื่อสร้าง column ใหม่ที่แสดงจำนวนปีก่อนเกษียณได้:

    # Add a new column
    mutate(hr_data,
           YearsUntilRetirement = 60 - Age)
    

    ผลลัพธ์:

    จากผลลัพธ์ จะเห็นได้ว่า column ใหม่จะต่อท้ายสุด (ด้านขวาสุด)

    .

    Note:

    ถ้าต้องการเห็นแค่ข้อมูลใหม่ เราสามารถเปลี่ยน mutate() เป็น transmute() ได้

    โดยหลังจากได้ข้อมูลใหม่แล้ว transmute() จะทิ้งข้อมูลตั้งต้น และเก็บเฉพาะข้อมูลใหม่ไว้


    🫂 Put Everything Together: Pipe Operator

    เราจะเห็นความสามารถที่แท้จริงของ dplyr ได้เมื่อใช้งานทั้ง 5 functions ร่วมกัน โดยใช้ pipe operator: %>% หรือ |>

    Pipe operator เป็นสิ่งที่ช่วยส่ง output จาก function หนึ่งไปเป็น input ของ function ต่อไป

    เช่น จาก code หาค่าเฉลี่ยคะแนนการทำงานตามระดับความเสี่ยงในการลาออก ก่อนหน้านี้:

    # Calculate mean engagement by attrition risk
    summarise(group_by(hr_data, AttritionRisk),
              AvgEng = mean(Engagement))
    

    ถ้าใช้ pipe operator แล้ว จะเขียนได้แบบนี้:

    # Calculate mean engagement by attrition risk
    hr_data |>
      
      # Group by AttritionRisk
      group_by(AttritionRisk) |>
      
      # Calculate mean
      summarise(AvgEng = mean(Engagement))
    

    ซึ่ง code ทั้งสองชุดให้ผลลัพธ์ที่เหมือนกัน:

    แต่จะเห็นได้ว่า code ที่ใช้ pipe operator มีความชัดเจนและอ่านง่ายกว่า เพราะไม่จำเป็นต้องเขียน code ที่ซ้อนกันเป็นชั้น ๆ

    .

    ทีนี้ ถ้าเราใช้ pipe operator เพื่อรวมทั้ง 5 functions เข้าด้วยกันแล้ว จะทำให้เราใช้ข้อมูลเพื่อตอบคำถามที่ซับซ้อนขึ้นได้

    ตัวอย่าง:

    ผู้บริหารอยากได้รายชื่อพนักงานในกลุ่มเสี่ยงลาออกสูง โดยเรียงตามอายุงานและเงินเดือน จากมากไปน้อย

    เราสามารถใช้ pipe operator ร่วมกัน group_by() + summarise() + arrange() เพื่อตอบโจทย์ได้:

    # Find employees with high attrition risk
    # and sort by tenure and salary
    hr_data |>
      
      # Filter for high attrition risk
      filter(AttritionRisk == "High") |>
      
      # Sort descending by tenure and salary
      arrange(desc(YearsAtCompany),
              desc(Salary))
    

    ผลลัพธ์:

    .

    หรือ

    ผู้บริหารต้องการรู้ว่า จำนวนพนักงานและค่าเฉลี่ยคะแนนการมีส่วนร่วมของแต่ละแผนก โดยเรียงแผนกจากค่าเฉลี่ยมากไปน้อย

    hr_data |> 
      
      # Group by department
      group_by(Department) |>
      
      # Calculate mean and count the number of employees
      summarise(AvgEng = mean(Engagement),
                EmpCount = n()) |>
      
      # Sort descending by average engagement
      arrange(desc(AvgEng))
    

    ผลลัพธ์:

    .

    หรือ

    ผู้บริหารต้องการรู้สัดส่วนพนักงานในกลุ่มความเสี่ยงสูงในแต่ละแผนก โดยเรียงจากมากไปน้อย และขอให้เรียงข้อมูลดังนี้: แผนก สัดส่วนเสี่ยงสูง จำนวนพนักงานทั้งหมด จำนวนพนักงานในกลุ่มเสี่ยงสูง

    hr_data |>
      
      # Group by department
      group_by(Department) |>
      
      # Count high attrition risk and find attrition risk ratio
      summarise(HighRiskCount = sum(AttritionRisk == "High"),
                TotalEmp = n(),
                HighRiskRatio = (HighRiskCount / TotalEmp) * 100) |>
      
      # Select desired columns
      select(Department, HighRiskRatio, TotalEmp, HighRiskCount) |>
      
      # Sort descending by high rish ratio
      arrange(desc(HighRiskRatio))
    

    ผลลัพธ์:


    🔥 สรุป 5 Functions จาก dplyr

    5 functions พื้นฐาน ของ dplyr เป็น functions ที่สามารถใช้ร่วมกันเพื่อทำงานกับข้อมูลต่าง ๆ เช่น ข้อมูลพนักงาน ได้อย่างมีประสิทธิภาพ

    No.FunctionExplain
    1select()เลือก column ที่ต้องการ
    2filter()เลือก row ที่ต้องการ
    3arrange()จัดลำดับข้อมูล
    4sumamrise()สรุปข้อมูล
    5mutate()แปลงข้อมูล

    Note: ใช้ %>% หรือ |> เพื่อเชื่อม functions เข้าด้วยกัน


    💪 Try It Yourself

    สำหรับใครที่อยากลองเล่นใช้ R เล่นกับข้อมูล HR สามารถดาวน์โหลด code ตัวอย่างในบทความได้ที่ GitHub


    📚 อ่านเพิ่มเติมเกี่ยวกับ dplyr


    ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    📕 ขอฝากหนังสือเล่มแรกในชีวิตด้วยนะครับ 😆

    🙋 ใครที่กำลังเรียนจิตวิทยาหรือทำงานสายจิตวิทยา และเบื่อที่ต้องใช้ software ราคาแพงอย่าง SPSS และ Excel เพื่อทำข้อมูล

    💪 ผมขอแนะนำ R Book for Psychologists หนังสือสอนใช้ภาษา R เพื่อการวิเคราะห์ข้อมูลทางจิตวิทยา ที่เขียนมาเพื่อนักจิตวิทยาที่ไม่เคยมีประสบการณ์เขียน code มาก่อน

    ในหนังสือ เราจะปูพื้นฐานภาษา R และพาไปดูวิธีวิเคราะห์สถิติที่ใช้บ่อยกัน เช่น:

    • Correlation
    • t-tests
    • ANOVA
    • Reliability
    • Factor analysis

    🚀 เมื่ออ่านและทำตามตัวอย่างใน R Book for Psychologists ทุกคนจะไม่ต้องพึง SPSS และ Excel ในการทำงานอีกต่อไป และสามารถวิเคราะห์ข้อมูลด้วยตัวเองได้ด้วยความมั่นใจ

    แล้วทุกคนจะแปลกใจว่า ทำไมภาษา R ง่ายขนาดนี้ 🙂‍↕️

    👉 สนใจดูรายละเอียดหนังสือได้ที่ meb:

  • อะไรที่เรียกว่า Happiness? คำตอบจาก 2 แนวคิดทางจิตวิทยา—อารมณ์และสุขภาวะ

    อะไรที่เรียกว่า Happiness? คำตอบจาก 2 แนวคิดทางจิตวิทยา—อารมณ์และสุขภาวะ

    1. Happiness = อารมณ์เชิงบวก
    2. Happiness = สุขภาวะ
      1. Subjective Well-Being
      2. Psychological Well-Being
      3. อะไรคือ Happiness ที่แท้จริง?
    3. บทสรุป Happiness
    4. อ้างอิง
    5. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    👉 Happiness หรือความสุข เป็นสิ่งที่น่าค้นหา ทั้งสำหรับคนทั่วไปในการชีวิตและนักจิตวิทยาที่ต้องการศึกษาจิตใจของมนุษย์ แต่อะไรคือ happiness?

    Happiness เป็นสิ่งที่มีความคลุมเคลือในนิยาม ซึ่งความหมายอาจแตกต่างกันไปตามแต่ละบุคคลและยุคสมัย (Disabato et al., 2016)

    ทั้งนี้ ในเชิงจิตวิทยา happiness อาจหมายความได้ 2 อย่าง คือ

    1. อารมณ์เชิงบวก (positive emotion)
    2. สุขภาวะ (well-being)

    Happiness = อารมณ์เชิงบวก

    ในมุมของอารมณ์เชิงบวก happiness สามารถมองได้ 2 ทาง คือ

    1. เป็นอารมณ์ขั้นพื้นฐาน (basic emotion; เช่น Ekman & Cordaro, 2011; Oatley & Johnson-Laird, 1987) หรืออารมณ์ที่อาจทำหน้าที่เป็นส่วนประกอบของอารมณ์ที่ซับซ้อนมากกว่า (Ekman & Cordaro, 2011; Ortony & Turner, 1990) เช่น ความประหลาดใจ
    2. เป็นคำเรียกรวมอารมณ์เชิงบวกต่าง ๆ เช่น joy (ความปิติยินดี), gladness (ความดีใจ; American Psychology Association, 2023)

    Happiness = สุขภาวะ

    บ่อยครั้งที่นักจิตวิทยาใช้คำว่า happiness เพื่อพูดถึงทฤษฎีสุขภาวะต่าง ๆ (Kaczmarek, 2017) ซึ่งแต่ละทฤษฎีมีมุมมองต่อ “ความสุข” ที่ไม่เหมือนกัน

    Subjective Well-Being

    A man smiling
    Photo by abdullah ali on Unsplash

    ทฤษฎีที่มักถูกใช้เรียกแทน happiness บ่อย ๆ คือ subjective well-being (SWB; Deci & Ryan, 2008; Diener, 1984) ซึ่งเป็นทฤษฎีที่ตั้งอยู่บนแนวปรัชญา hedonia ซึ่งระบุว่า ความสุขของมนุษย์ คือ การเพิ่ม pleasure (ความพึงพอใจ) และลด displeasure (ความไม่พึงพอใจ; Ryan & Deci, 2001)

    ในการประเมิน SWB นักจิตวิทยามักใช้ตัวบ่งชี้ 3 อย่าง ได้แก่

    1. อารมณ์เชิงบวก
    2. อารมณ์เชิงลบ (negative emotion)
    3. ความพึงพอใจในชีวิต (life satisfaction; Magyar & Keyes, 2019)

    ซึ่งจากตัวบ่งชี้ทั้งสาม จะเห็นได้ว่า happiness ในมุมมองของ SWB ประกอบด้วย 3 อย่าง คือ

    1. การมีอารมณ์เชิงบวก (เช่น ความรัก) ในระดับสูง
    2. การมีอารมณ์เชิงลบ (เช่น ความโกรธ ความกังวล) ในระดับต่ำ
    3. มีความพึงพอใจในชีวิตในระดับสูง

    Psychological Well-Being

    Photo by Priscilla Du Preez 🇨🇦 on Unsplash

    อีกทฤษฎีที่พยายามอธิบาย happiness คือ psychological well-being (PBW; Ryff & Singer, 1998) ซึ่งตั้งอยู่บนแนวปรัชญา eudaimonia ที่เน้นศักยภาพและความเติมเต็มในชีวิตมนุษย์ (Ryan & Deci, 2001)

    PWB บอกว่า สุขภาวะที่ดีเป็นมากกว่าการมีความสุข แต่รวมไปถึงการได้ปลดล็อกศักยภาพของตัวเอง (Ryff, 1995)

    จากการศึกษา PWB นิยาม happiness ไว้ 6 ด้าน ได้แก่

    1. Self-acceptance: ยอมรับและมองตัวเองในเชิงบวก
    2. Positive relations with others: มีความสัมพันธ์ที่ดีกับคนอื่น
    3. Autonomy: รู้สึกมีอิสระในการตัดสินใจได้ด้วยตัวเอง
    4. Environmental mastery: รู้สึกมีความสามารถในการจัดการสิ่งแวดล้อมของตัวเอง
    5. Purpose in life: รู้สึกว่า ชีวิตมีความหมายและเป้าหมาย
    6. Personal growth: มีการเติบโตส่วนบุคคลอย่างต่อเนื่อง (Ryff, 1989; Ryff & Keyes, 1995)

    อะไรคือ Happiness ที่แท้จริง?

    จะเห็นได้ว่า ทั้ง SWB และ PWB มีมุมมองต่อ happiness ที่แตกต่างกัน

    ในมุมมองของ SWB, happiness คือ การเพิ่มอารมณ์เชิงบวกและความพึงพอใจในชีวิต พร้อมลดอารมณ์เชิงลบ

    ในขณะที่ PWB มองเห็นว่า happiness ไม่ได้เกิดขึ้นจากการมีความสุขอย่างเดียว แต่จากการที่คนได้ใช้ชีวิตอย่างเต็มศักยภาพ

    แล้ว happiness ที่แท้จริงคืออะไร? การมีความสุข หรือการใช้ชีวิตอย่างเต็มที่?

    คำตอบอาจจะเป็นถูกทุกข้อ

    แม้ว่า มีหลายงานวิจัยที่เปรียบเทียบ SWB และ PWB แต่ผลลัพธ์ที่ได้มักพบว่า happiness ทั้งสองประเภทมีความสัมพันธ์ทางสิถิติในระดับปานกลางถึงสูง (Lent, 2004) ซึ่งแสดงให้เห็นว่า ทั้งสองมีความเกี่ยวข้องอย่างใกล้ชิดกันมาก

    นอกจากนี้ เมื่อวิเคราะห์เพิ่มเติมแล้ว ทั้ง SWB และ PWB จับกลุ่มอยู่ภายใต้ปัจจัยตัวเดียวกัน (Disabato et al., 2016) ชี้ให้เห็นว่า ทั้งสองมีอิทธิพลต่อสุขภาวะด้วยกันทั้งคู่

    ดังนั้น แม้ว่า SWB และ PWB จะให้นิยามความสุขที่แตกต่างกัน แต่ทั้งสองก็ส่งผลต่อ happiness เหมือนกัน และการจะใช้ชีวิตให้เกิด happiness ต้องมีทั้งความรู้สึกสุขใจและพึงพอใจกับชีวิต พร้อมทั้งใช้ชีวิตอย่างมีคุณค่าตามศักยภาพของตัวเองอีกด้วย


    บทสรุป Happiness

    Happiness เป็นสิ่งที่มีความหมายหลากหลาย ซึ่งในทางจิตวิทยา สามารถมองได้ 2 ทาง

    1. Happiness ที่เป็นอารมณ์เชิงบวกในตัวเอง หรือประเภทของอารมณ์เชิงบวก
    2. Happiness ในเชิงสุขภาวะ ซึ่งสามารถจำแนกได้เป็น 2 ประเภทหลักที่มีความสำคัญพอ ๆ กัน คือ
      • Happiness ในเชิงความรู้สึกสุข (SWB) และ
      • Happiness ในการใช้ชีวิตอย่างเต็มศักยภาพของตัวเอง (PWB)

    อ้างอิง

    American Psychology Association. (2023). Happiness. APA Dictionary of Psychology. https://dictionary.apa.org/happiness

    Deci, E. L., & Ryan, R. M. (2008). Hedonia, eudaimonia, and well-being: An introduction. Journal of Happiness Studies: An Interdisciplinary Forum on Subjective Well-Being, 9(1), 1–11. https://doi.org/10.1007/s10902-006-9018-1

    Diener, E. (1984). Subjective well-being. Psychological Bulletin, 95(3), 542–575. https://doi.org/10.1037/0033-2909.95.3.542

    Disabato, D. J., Goodman, F. R., Kashdan, T. B., Short, J. L., & Jarden, A. (2016). Different types of well-being? A cross-cultural examination of hedonic and eudaimonic well-being. Psychological Assessment, 28(5), 471–482. https://doi.org/10.1037/pas0000209

    Ekman, P., & Cordaro, D. (2011). What is meant by calling emotions basic. Emotion Review, 3(4), 364–370. https://doi.org/10.1177/1754073911410740

    Kaczmarek, L. D. (2017). Happiness. In V. Zeigler-Hill & T. K. Shackelford (Eds.), Encyclopedia of personality and individual differences (pp. 1875–1879). Springer Cham. https://doi.org/10.1007/978-3-319-28099-8_522-1

    Lent, R. W. (2004). Toward a Unifying Theoretical and Practical Perspective on Well-Being and Psychosocial Adjustment. Journal of Counseling Psychology, 51(4), 482–509. https://doi.org/10.1037/0022-0167.51.4.482

    Magyar, J. L., & Keyes, C. L. M. (2019). Defining, measuring, and applying subjective well-being. In S. J. Lopez & C. R. Snyder (Eds.), Positive psychological assessment: A handbook of models and measures (2nd ed.). (pp. 389–415). American Psychological Association. https://doi.org/10.1037/0000138-025

    Oatley, K., & Johnson-Laird, P. N. (1987). Towards a cognitive theory of emotions. Cognition and Emotion, 1(1), 29–50. https://doi.org/10.1080/02699938708408362

    Ortony, A., & Turner, T. J. (1990). What’s basic about basic emotions? Psychological Review, 97(3), 315–331. https://doi.org/10.1037/0033-295X.97.3.315

    Ryan, R. M., & Deci, E. L. (2001). On happiness and human potentials: A review of research on hedonic and eudaimonic well-being. Annual Review of Psychology, 52, 141–166. https://doi.org/10.1146/annurev.psych.52.1.141

    Ryff, C. D. (1989). Happiness is everything, or is it? Explorations on the meaning of psychological well-being. Journal of Personality and Social Psychology, 57(6), 1069–1081. https://doi.org/10.1037/0022-3514.57.6.1069

    Ryff, C. D. (1995). Psychological well-being in adult life. Current Directions in Psychological Science, 4(4), 99–104. https://doi.org/10.1111/1467-8721.ep10772395

    Ryff, C. D., & Keyes, C. L. M. (1995). The structure of psychological well-being revisited. Journal of Personality and Social Psychology, 69(4), 719–727. https://doi.org/10.1037/0022-3514.69.4.719

    Ryff, C. D., & Singer, B. (1998). The contours of positive human health. Psychological Inquiry, 9(1), 1–28. https://doi.org/10.1207/s15327965pli0901_1


    บทความต้นฉบับจาก https://www.blockdit.com/posts/64daef3c3849cb31020eb205


    ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    📕 ขอฝากหนังสือเล่มแรกในชีวิตด้วยนะครับ 😆

    🙋 ใครที่กำลังเรียนจิตวิทยาหรือทำงานสายจิตวิทยา และเบื่อที่ต้องใช้ software ราคาแพงอย่าง SPSS และ Excel เพื่อทำข้อมูล

    💪 ผมขอแนะนำ R Book for Psychologists หนังสือสอนใช้ภาษา R เพื่อการวิเคราะห์ข้อมูลทางจิตวิทยา ที่เขียนมาเพื่อนักจิตวิทยาที่ไม่เคยมีประสบการณ์เขียน code มาก่อน

    ในหนังสือ เราจะปูพื้นฐานภาษา R และพาไปดูวิธีวิเคราะห์สถิติที่ใช้บ่อยกัน เช่น:

    • Correlation
    • t-tests
    • ANOVA
    • Reliability
    • Factor analysis

    🚀 เมื่ออ่านและทำตามตัวอย่างใน R Book for Psychologists ทุกคนจะไม่ต้องพึง SPSS และ Excel ในการทำงานอีกต่อไป และสามารถวิเคราะห์ข้อมูลด้วยตัวเองได้ด้วยความมั่นใจ

    แล้วทุกคนจะแปลกใจว่า ทำไมภาษา R ง่ายขนาดนี้ 🙂‍↕️

    👉 สนใจดูรายละเอียดหนังสือได้ที่ meb:

  • ตัวแทนแห่งแสง: สามเหลี่ยมด้านสว่าง

    ตัวแทนแห่งแสง: สามเหลี่ยมด้านสว่าง

    1. Light Triad
    2. ด้านสว่าง? หรือแค่ไม่ดาร์ก?
    3. อนาคตของแสงสว่าง
    4. อ้างอิง
    5. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    👉 ในตอนที่แล้ว (Eps. 2–4) เราดำดิ่งไปกับบุคลิกภาพด้านมืด (dark personality) โดยโฟกัสไปที่ลักษณะด้านมืด 3 ตัว ที่เรียกรวมกันว่า Dark Triad (Machiavellianism หรือ Mach, narcissism, psychology; Paulhus & Williams, 2002) ซึ่งสะท้อนให้เห็นด้านมืดของมนุษย์ที่มีจุดเด่น คือ จอมบงการ (manipulativeness) และไร้ความเห็นอกเห็นใจคนอื่น (callousness; Jones & Figueredo, 2013; Paulhus, 2014)

    ในบทความนี้ เราจะมาดูบุคลิกภาพอีกปลายสุดของอุโมงค์ ซึ่งจะตอบคำถามว่า ถ้า Dark Triad เป็นตัวแทนความมืดแล้ว อะไรคือตัวแทนแห่งแสงของมนุษย์?


    Light Triad

    คำถามนี้เป็นคำถามที่ตั้งขึ้นโดย Kaufman และคณะ (2019) ซึ่งมองว่า การเข้าใจจิตใจมนุษย์ ควรทำบนฐานของการมององค์รวมที่ให้น้ำหนักทั้งด้านมืดละด้านสว่างของมนุษย์

    เพื่อค้นหาขั้วตรงข้ามของด้านมืด Kaufman และคณะทำการพัฒนาแบบวัดทางจิตวิทยา (psychological measure) เพื่อตรวจจับลักษณะด้านสว่างของมนุษย์

    ในการพัฒนาแบบวัด กลุ่มนักวิจัยใช้แบบวัด Dark Triad ต่าง ๆ ที่มีเป็นจุดอ้างอิงในการสร้างข้อคำถาม (item) โดยออกแบบข้อคำถามให้มีเนื้อหาตรงข้ามกับแบบวัด Dark Triad

    เช่น ถ้าข้อคำถามในแบบวัดเขียนว่า “ฉันไม่สนใจคนอื่น” กลุ่มนักวิจัยจะสร้างข้อคำถามว่า “ฉันใส่ใจคนอื่น”

    หลังจากนั้น Kaufman และคณะใช้ข้อคำถามเหล่านี้เก็บข้อมูลจากกลุ่มตัวอย่างและนำมาวิเคราะห์เพื่อระบุตัวแปร (factor analysis) ซึ่งผลการวิเคราะห์ชี้ให้เห็นว่า ลักษณะด้านสว่างของมนุษย์ที่แสดงออกผ่านข้อคำถามเหล่านี้ มี 3 ด้าน ได้แก่

    1. Faith in Humanity: ความเชื่อในความดีของมนุษย์
      • ตัวอย่างข้อคำถาม เช่น “ฉันมักเห็นข้อดีของคนอื่น (I tend to see the best in people)”
    2. Humanity: การเคารพในเกียรติและคุณค่าของแต่ละปัจเจกบุคคล
      • ตัวอย่างข้อคำถาม เช่น “ฉันมักชื่นชมคนอื่น (I tend to admire others)”
    3. Kantianism: ความโน้มเอียงที่จะช่วยเหลือเพื่อมนุษย์เพื่อการกระทำนั้น ๆ เอง และไม่ใช่เพื่อผลประโยชน์อื่นใด
      • ตัวอย่างข้อคำถาม เช่น “ฉันพยายามจะทำตัวจริงใจ แม้ว่าการทำอย่างนั้นอาจสร้างความเสียหายให้กับภาพลักษณ์ของฉันก็ตาม (I would like to be authentic even if it may damage my reputation)”

    ด้านสว่าง? หรือแค่ไม่ดาร์ก?

    นอกจากระบุบุคลิกภาพทั้งสามตัวแล้ว Kaufman และคณะ (2019) ยังได้เก็บข้อมูลลักษณะความแตกต่างระหว่างบุคคลอื่น ๆ เช่น บุคลิกภาพ คติ (attitude) ความต้องการ (need) และแรงจูงใจ (motive) เพื่อแยกด้านสว่างออกจากด้านมืดอย่างชัดเจน

    นั่นคือ Kaufman และคณะต้องการข้อมูลที่จะสนับสนุนว่า Light Triad ไม่ได้เป็นเพียงด้านกลับของ Dark Triad เพราะหาก Light Triad เป็นเพียงขั้วตรงข้ามของ Dark Triad นักจิตวิทยาอาจไม่จำเป็นต้องใช้ Light Triad ในการเข้าใจพฤติกรรมมนุษย์ เพราะสามารถใช้การกลับด้านคะแนน (reversed-scoring) ของ Dark Triad แทนได้

    (เช่น สามารถเข้าใจได้ว่า คนไม่ทำชั่ว เพราะมี Dark Triad ต่ำ โดยไม่ต้องรู้ว่ามี Light Triad หรือไม่)

    ผลการวิเคราะห์ของ Kaufman และคณะชี้ให้เห็นว่า แม้ Light Triad จะเกิดมาจากการอ้างอิงข้อคำถามของ Dark Triad แต่ Light Triad เป็นมากกว่าขั้วตรงข้ามของ Dark Triad ด้วย 2 เหตุผล

    1. Light Triad และ Dark Triad มีความสัมพันธ์กันทางสถิติในระดับปานกลาง ซึ่งถ้าบุคลิกภาพทั้งสองกลุ่มเป็นลักษณะเดียวกัน ก็ควรจะมีความสัมพันธ์ทางสถิติในระดับสูง
    2. Light Triad มีความสัมพันธ์กับลักษณะความแตกต่างระหว่างบุคคลที่ไม่เหมือนกับ Dark Triad

    ยกตัวอย่างเช่น Dark Triad มีความสัมพันธ์เชิงบวกกับแรงจูงใจที่เกี่ยวกับอำนาจ (power) และการมีความสัมพันธ์กับคนอื่น (affiliation) แต่ไม่มีความสัมพันธ์กับความใกล้ชิด (intimacy) ซึ่งแสดงให้เห็นว่า Dark Triad มักมีแรงจูงใจที่จะเข้าหาคนอื่นเพื่อเข้าใช้อิทธิพลเหนือคนอื่น และไม่สนใจความใกล้ชิดกับคนอื่น

    ในตรงกันข้าม Light Triad ไม่มีความสัมพันธ์กับแรงจูงใจเกี่ยวกับอำนาจ แต่มีความสัมพันธ์เชิงบวกกับการมีความสัมพันธ์กับคนอื่นและความใกล้ชิด ชี้ให้เห็นว่า Light Triad มักมีแรงจูงใจการเข้าหาคนอื่นเพื่อสร้างความผูกพันมากกว่าเพื่อใช้อำนาจ ซึ่งแตกต่างจากพฤติกรรมของ Dark Triad

    นอกจากนี้ งานวิจัยของ Kaufman และคณะ ยังได้รับการสนับสนุนจากงานวิจัยอื่นที่ให้ผลไปในทิศทางเดียว

    เช่น Lukić และ Živanović (2021) แสดงให้เห็นว่า Dark Tetrad (Dark Triad + sadism; Paulhus, 2014) สามารถอธิบายความแปรปรวน (variance) ของ Light Triad ได้ไม่เกิน 1 ใน 4

    ซึ่งทั้งหมดนี้ชี้ให้เห็นว่า Light Triad เป็นด้านสว่างที่ไม่ใช่เพียงความไม่ดาร์ก


    อนาคตของแสงสว่าง

    จะเห็นได้ว่า Light Triad เป็นบุคลิกภาพด้านสว่างที่ตรงข้ามกับ Dark Triad

    1. Faith in Humanity ที่เชื่อในความดีของมนุษย์ ตรงข้ามกับ Mach ที่มองโลกว่า มนุษย์ทุกคนเป็นคนเลว (Monaghan et al., 2020)
    2. Humanity ที่เคารพในเอกลักษณ์ของแต่ละบุคคล ตรงข้ามกับ narcissism ที่มักแสดงตัวเองดีกว่าคนอื่น (Hart et al., 2019)
    3. Kantianism ที่ช่วยเหลือคนอื่นโดยไม่หวังผลตอบแทน ตรงข้ามกับ psychopathy ที่การช่วยเหลือคนอื่นอาจเป็นเพียงเครื่องมือเพื่อหลอกใช้คนอื่น และไม่ได้สะท้อนถึงความจริงใจที่จะช่วย

    แม้ว่า จะมีงานวิจัยที่ชี้ว่า Light Triad เป็นมากกว่าด้านตรงข้ามกับ Dark Triad แต่เพราะเป็นบุคลิกภาพที่เพิ่งถูกค้นพบเมื่อไม่นานมานี้ นักจิตวิทยาจึงยังต้องทำการวิจัยอีกมาก เพื่อจะเข้าใจ Light Triad ได้อย่างถ่องแท้

    Lukić และ Živanović (2021) เสนอแนวทางที่น่าสนใจสำหรับงานวิจัยในอนาคต 2 ทาง ได้แก่

    1. ค้นหาลักษณะด้านสว่างอื่น ๆ: เพราะ Light Triad ถูกสร้างขึ้นมาโดยไม่มีทฤษฎีรองรับ และยังถูกสร้างขึ้นมาโดยอ้างอิงจากบุคลิกภาพด้านมืดเพียง 3 ตัว (Dark Triad) ซึ่งทำให้ลักษณะที่ได้มาไม่ครอบคลุมด้านสว่างทั้งหมดของมนุษย์ งานวิจัยในอนาคตจึงอาจค้นหาบุคลิกภาพด้านสว่างอื่น ๆ ที่จะช่วยเสริม Light Triad ในการทำความเข้าใจพฤติกรรมมนุษย์
    2. ค้นหาความสัมพันธ์ระหว่าง Light Triad และลักษณะเชิงบวกอื่น ๆ: อย่างที่กล่าวมาข้างต้นว่า Light Triad ถูกสร้างขึ้นมาโดยไม่มีทฤษฎีใด ๆ รองรับ ความสัมพันธ์ระหว่าง Light Triad และลักษณะเชิงบวกอื่น ๆ เช่น ความเห็นแก่ผู้อื่น (altruism) จึงไม่มีความชัดเจน และมีความเป็นไปได้ว่า Light Triad อาจจะแตกต่างหรือเหมือนกับลักษณะเชิงบวกต่าง ๆ ที่นักจิตวิทยาเคยค้นพบมาแล้วก็ได้ ดังนั้น งานวิจัยในอนาคตอาจศึกษา Light Triad พร้อมกับลักษณะเชิงบวกอื่น ๆ เพื่อหาความสัมพันธ์ระหว่างปัจจัยเหล่านี้

    อ้างอิง

    Hart, W., Breeden, C. J., & Richardson, K. (2019). Differentiating dark personalities on impression management. Personality and Individual Differences, 147, 58–62. https://doi.org/10.1016/j.paid.2019.04.030

    Jones, D. N., & Figueredo, A. J. (2013). The core of darkness: Uncovering the heart of the Dark Triad. European Journal of Personality, 27(6), 521–531.

    Kaufman, S. B., Yaden, D. B., Hyde, E., & Tsukayama, E. (2019). The light vs. Dark Triad of personality: Contrasting two very different profiles of human nature. Frontiers in Psychology, 10, Article 467. https://doi.org/10.3389/fpsyg.2019.00467

    Lukić, P., & Živanović, M. (2021). Shedding light on the Light Triad: Further evidence on structural, construct, and predictive validity of the Light Triad. Personality and Individual Differences, 178, 110876.

    Monaghan, C., Bizumic, B., Williams, T., & Sellbom, M. (2020). Two-dimensional Machiavellianism: Conceptualization, theory, and measurement of the views and tactics dimensions. Psychological Assessment, 32(3), 277–293. https://doi.org/10.1037/pas0000784

    Paulhus, D. L. (2014). Toward a taxonomy of dark personalities. Current Directions in Psychological Science, 23(6), 421–426.

    Paulhus, D. L., & Williams, K. M. (2002). The Dark Triad of personality: Narcissism, Machiavellianism and psychopathy. Journal of Research in Personality, 36(6), 556–563.

    Smith, M. B., Hill, A. D., Wallace, J. C., Recendes, T., & Judge, T. A. (2018). Upsides to dark and downsides to bright personality: A multidomain review and future research agenda. Journal of Management, 44(1), 191–217.


    บทความต้นฉบับจาก https://www.blockdit.com/posts/64daed4b93a06db3f2d2b61b


    ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    📕 ขอฝากหนังสือเล่มแรกในชีวิตด้วยนะครับ 😆

    🙋 ใครที่กำลังเรียนจิตวิทยาหรือทำงานสายจิตวิทยา และเบื่อที่ต้องใช้ software ราคาแพงอย่าง SPSS และ Excel เพื่อทำข้อมูล

    💪 ผมขอแนะนำ R Book for Psychologists หนังสือสอนใช้ภาษา R เพื่อการวิเคราะห์ข้อมูลทางจิตวิทยา ที่เขียนมาเพื่อนักจิตวิทยาที่ไม่เคยมีประสบการณ์เขียน code มาก่อน

    ในหนังสือ เราจะปูพื้นฐานภาษา R และพาไปดูวิธีวิเคราะห์สถิติที่ใช้บ่อยกัน เช่น:

    • Correlation
    • t-tests
    • ANOVA
    • Reliability
    • Factor analysis

    🚀 เมื่ออ่านและทำตามตัวอย่างใน R Book for Psychologists ทุกคนจะไม่ต้องพึง SPSS และ Excel ในการทำงานอีกต่อไป และสามารถวิเคราะห์ข้อมูลด้วยตัวเองได้ด้วยความมั่นใจ

    แล้วทุกคนจะแปลกใจว่า ทำไมภาษา R ง่ายขนาดนี้ 🙂‍↕️

    👉 สนใจดูรายละเอียดหนังสือได้ที่ meb:

  • 11 บุคลิกภาพมืดของผู้นำ

    11 บุคลิกภาพมืดของผู้นำ

    1. Axis II Approach
    2. กลุ่มที่ 1: Move Away
      1. Excitable
      2. Skeptical
      3. Cautious
      4. Reserved
      5. Leisurely
    3. กลุ่มที่ 2: Move Against
      1. Arrogant
    4. กลุ่มที่ 3: Move Toward
      1. Diligent
      2. Dutiful
    5. สรุป 11 ด้านมืดของผู้นำ
    6. อ้างอิง
    7. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    👉 ในบทความก่อนหน้า (Eps. 3, 4) เราได้พูดถึงบุคลิกภาพด้านมืด (dark personality) หรือบุคลิกภาพที่ไม่น่าพึงประสงค์ทางสังคม และอิทธิพลของลักษณะเหล่านี้ในบริบทต่าง ๆ โดยยกตัวอย่างจากที่ Dark Triad (Machiavellianism หรือ Mach, narcissism, และ psychopathy; Paulhus & Williams, 2002) ซึ่งเป็นบุคลิกภาพด้านมืด 3 อย่างที่ได้รับความสนใจเป็นพิเศษจากนักจิตวิทยา

    แต่ในการศึกษาบุคลิกภาพด้านมืด ยังมีอีกกรอบแนวคิดที่ได้รับความสนใจทั้งในงานวิจัยและการพัฒนาศักยภาพผู้นำในองค์กร

    กรอบแนวคิดนี้ คือ Axis II approach


    Axis II Approach

    Axis II approach มีความน่าสนใจ เพราะเป็นการศึกษาบุคลิกภาพด้านมืดที่อ้างอิงกรอบแนวคิดของความผิดปกติทางบุคลิกภาพ (personality disorder) ตาม Diagnostic and Statistical Manual of Mental Disorders (DSM) ซึ่งเป็นคู่มือการวินิจฉัยความผิดปกติทางจิตของนักจิตวิทยา

    นักจิตวิทยาที่มักได้รับการกล่าวถึงเมื่อพูดถึง Axis II approach คือ Robert Hogan และ Joyce Hogan ผู้เชี่ยวชาญบุคลิกภาพในที่ทำงาน เจ้าของบริษัท Hogan Assessments (www.hoganassessments.com) และผู้พัฒนา Hogan Development Survey (HDS) ซึ่งเป็นแบบประเมินบุคลิกภาพด้านมืด 11 ด้านของ Axis II approach ซึ่งใช้การคัดเลือกและพัฒนาบุคลากรและผู้นำ

    Hogan และ Hogan (2001, 2009; Hogan et al., 2011) ให้ความสนใจบุคลิกภาพด้านมืดจากการศึกษาเพื่อค้นหาสาเหตุของความล้มเหลวของการเป็นผู้นำ (leadership failure หรือ leadership derailment) ซึ่งเป็นปรากฏการณ์ที่เกิดขึ้นกับ 50 ถึง 75% ของผู้นำทั้งหมด (Hogan et al., 2011)

    Hogan และ Hogan เชื่อว่า ผู้นำที่ขาดประสิทธิภาพเกิดจากการมีลักษณะที่ไม่ดี (บุคลิกภาพด้านมืด) มากกว่าขาดลักษณะที่ดี (บุคลิกภาพด้านสว่าง) ซึ่งจากการทบทวนวรรณกรรม พบว่า บุคลิกภาพด้านมืดที่เกี่ยวข้องกับการขาดประสิทธิภาพของผู้นำมีความคล้ายคลึงกับความผิดปกติทางบุคลิกภาพของ DSM*

    จากความคล้ายคลึงนี้ Hogan และ Hogan จึงใช้ความผิดปกติทางบุคลิกภาพของ DSM (ซึ่งจัดอยู่ใน Axis II ของคู่มือ) ในการนิยามบุคลิกภาพด้านมืด 11 ด้าน โดย

    1. เน้นไปที่ลักษณะเฉพาะของความผิดปกติทางบุคลิกภาพแต่ละตัว และตัดลักษณะที่ซ้ำซ้อนกันออก เช่น ในการนิยามบุคลิกภาพด้านมืดจาก narcissistic personality disorder หรือความหลงตัวเอง ก็เลือกเฉพาะความหลงตัวเองมา และตัดความไม่ใส่ใจคนอื่น (lack of empathy) ซึ่งเป็นลักษณะร่วมกับความผิดปกติทางบุคลิกภาพอื่น ๆ ออก
    2. ปรับนิยามให้เข้ากับบริบทของการทำงาน (ระบุลักษณะที่ไม่ดีของผู้นำ) แทนบริบทของจิตวิทยาคลินิก (การวินิจฉัยความผิดปกติทางจิต)
    3. ปรับนิยามให้เข้ากับประชากรทั่วไป (พฤติกรรมด้านลบของคนทั่วไป) แทนคนที่มีความผิดปกติทางจิต (พฤติกรรมที่ส่งผลต่อการใช้ชีวิต สังคม และการทำงานในระดับที่เข้าข่ายความผิดปกติทางจิต)
    4. ปรับให้เป็นนิยามแบบมิติ (dimension) แทนกลุ่ม (category) ซึ่งหมายถึง ทุกคนหนึ่งสามารถมีบุคลิกภาพด้านมืดได้มากกว่า 1 ด้าน (ตรงข้ามกับการวินิจฉัยความผิดปกติทางบุคลิกภาพที่ 1 คนจะมีได้ 1 ลักษณะหลัก)

    ตามมุมมของ Hogan และ Hogan บุคลิกภาพด้านมืดมีในตัวทุกคน และคนส่วนใหญ่สามารถควบคุมด้านมืดของตัวเองไว้ได้ แต่บางครั้ง ในสถานการณ์ที่เหนื่อย เบื่อ เครียด หรือมีความคลุมเครือไม่ชัดเจน (เช่น มี process การทำงานที่ไม่ชัดเจน หรือการทำงานมี visibility ต่ำ) บุคลิกภาพด้านมืดเหล่านี้มีโอกาสที่จะแสดงตัวออกมาและสร้างความเสียหายได้ (ซึ่งอาจอธิบายได้ว่า ทำไม CEO หลายคนถึงหลุดจากตำแหน่งเวลาเจอกับวิกฤตต่าง ๆ)

    บุคลิกภาพด้านมืดทั้ง 11 ด้าน จับกันได้เป็น 3 กลุ่ม ซึ่งคล้ายกับแนวคิดความโน้มเอียงทางสังคมที่ไม่มีประสิทธิภาพ (flawed interpersonal tendencies) ของนักจิตวิเคราะห์ (psychoanalyst) ชาวเยอรมัน Horney (1950) ซึ่งทั้ง 3 กลุ่ม 11 บุคลิกภาพมีลักษณะดังนี้ (Hogan & Hogan, 2001, 2009; Hogan et al., 2011)


    กลุ่มที่ 1: Move Away

    ลักษณะของบุคลิกภาพในกลุ่มนี้ คือ พฤติกรรมที่ตีตัวออกห่างจากคนอื่น (move away) ซึ่งประกอบด้วย 5 บุคลิกภาพ

    Excitable

    (เทียบได้กับ borderline personality disorder ของ DSM ซึ่งเป็นบุคลิกภาพที่ไม่มีความมั่นคงทางอารมณ์และพฤติกรรม เวลาหนึ่งรักใคร่คนอื่นดี อีกเวลาด้อยค่า ขับไล่ไสส่งคนอื่น)

    บุคลิกภาพนี้มีความเชื่อลึก ๆ ที่ว่า ตัวเองจะต้องผิดหวังในความสัมพันธ์กับคนอื่น จึงมักตีความพฤติกรรมของคนอื่นไปในทางลบ (เช่น เชื่อว่าคนอื่นปฏิเสธหรือปฏิบัติกับตัวเองไม่ดี) และเมื่อ “คิด” ว่าถูกปฏิเสธ ก็มักจะตอบสนองอย่างรุนแรง (เช่น ตะโกนขับไล่)

    ข้อดีของบุคลิกภาพนี้ คือ เข้าใจคนอื่นเพราะเป็นคนที่รู้ว่าโลกนี้ไม่ยุติธรรม แต่ข้อเสีย คือ เป็นคนเอาใจยาก อารมณ์เสียง่าย อ่อนไหวต่อคำวิจารณ์ และสนใจใครหรืองานไม่ได้นาน

    (ถ้านึกภาพบุคลิกภาพนี้ ก็คงเป็นหัวหน้าที่ชอบใช้อารมณ์และด่าทอลูกน้องบ่อย ๆ)

    Skeptical

    (เทียบได้กับ paranoid personality disorder ของ DSM ซึ่งมีลักษณะเด่น คือ ความหวาดระแวงที่ไม่สอดคล้องกับความเป็นจริง)

    บุคลิกภาพนี้คิดว่า ตัวเองจะถูกทรยศหลอกหรือทรยศหักหลังได้ตลอดเวลา จึงมักไว้ใจคนอื่นยาก แต่เมื่อไว้ใจแล้วก็มักจะมีความซื่อสัตย์สูง

    คนเหล่านี้มักอ่านคนเก่งและรู้ลึกในเรื่องการเมืองขององค์กร แต่ข้อเสีย คือ อ่อนไหวต่อการถูกหักหลัง แค่เมื่อ “รู้สึก” ว่ากำลังโดนคนอื่นทรยศ ก็จะตีตัวออกห่างและโจมตีคนอื่น (เช่น ต่อว่าหรือกล่าวหาคนอื่น)

    (เทียบแล้วก็คือ หัวหน้าที่มักระแวงตลอดเวลาว่า ลูกน้องจะเลื่อยขาเก้าอี้ หัวหน้าฝ่ายอื่นจะกลั่นแกล้ง และผู้บริหารจะบีบให้ลาออก)

    Cautious

    (เทียบได้กับ avoidant personality disorder ของ DSM ที่มีลักษณะเด่น คือ พฤติกรรมหลีกเลี่ยงสังคม เพราะกลัวว่าจะทำอะไรผิดและทำให้ตัวเองขายหน้าหรือถูกต่อว่า)

    บุคลิกภาพนี้มีความกลัวที่จะถูกคนอื่นวิจารณ์หรือต่อว่า จึงมักเลี่ยงความเสี่ยงต่าง ๆ และทำงานอย่างละเอียดและรอบคอบตามกฎเกณฑ์หรือขั้นตอนที่เคยเห็นมาแล้วว่าดี จนทำให้เสียโอกาสในการสร้างนวัตกรรมหรือการทำสิ่งใหม่ ๆ

    (เทียบได้กับหัวหน้าที่ไม่กล้าทำอะไรใหม่ ๆ ยึดแต่วิธีการทำงานเดิม ๆ แม้ว่าจะเห็นอยู่ว่า การทำงานจะต้องมีการเปลี่ยนแปลงปรับปรุงก็ตาม)

    Reserved

    (เทียบได้กับ schizoid personality disorder ของ DSM ซึ่งจุดเด่น คือ ความไร้อารมณ์)

    บุคลิกภาพนี้เป็นคนที่มีโลกส่วนตัวสูง และไม่ไวต่อความคิด ความรู้สึก หรือกระแสสังคมรอบข้าง

    ข้อดี คือ ทนต่อการเมืองในองค์กร สามารถรับคำวิจารณ์ คำด่าทอจากคนอื่นได้โดยไม่หวั่นไหว แต่ข้อเสีย คือ ไม่ไวต่อความต้องการของคนอื่น ซึ่งเป็นลักษณะที่สำคัญของผู้นำ โดยเฉพาะในสถานการณ์ที่ผู้ตามต้องการที่พึงทางจิตใจ

    (หัวหน้าที่มีบุคลิกภาพนี้น่าจะเป็นคนที่ไม่รู้ร้อนรู้หนาวกับสภาพการณ์รอบข้าง ไม่ว่าลูกน้องจะเครียดจากงานขนาดไหน ไม่ว่าการเมืองในองค์กรจะเป็นยังไง ไม่ว่าใครจะไม่ถูกกับใคร หัวหน้าคนนี้ก็ไม่รับรู้ หรือรับรู้แต่ไม่สนใจ)

    Leisurely

    (เทียบได้กับ passive-aggressive personality disorder ของ DSM ซึ่งจุดเด่น คือ การต่อต้านในทางอ้อม)

    ลักษณะเด่นของบุคลิกภาพนี้ คือ เป็นคนที่มองดูเหมือนคนที่ให้ความร่วมมือกับคนอื่นดี แต่แท้จริงแล้วมักมองว่าคนอื่นมีหวังร้าย และเชื่อว่าตัวเองกำลังถูกคนอื่นกำลังเอาเปรียบอยู่

    บุคลิกภาพนี้มักเป็นคนดื้อดัน ไม่ยอมทำตามคนอื่น ถ้าถูกขอหรือถูกกดดันให้ทำงานเพิ่มจากที่ทำอยู่ ก็มักจะเอาเท้าราน้ำ เช่น แกล้งทำงานช้าลง แกล้งทำงานพลาด หรือแกล้งทำเป็นลืม

    (เทียบได้กับหัวหน้าที่เชื่อมั่นในแนวทางของตัวเอง และถ้าใครมองให้ทำอะไรหรือช่วยอะไร ก็จะไม่ทำ แกล้งทำเป็นลืม แกล้งให้อย่างช้า ๆ หรือแกล้งทำให้งานถอยหลังมากกว่าเดินหน้า)


    กลุ่มที่ 2: Move Against

    บุคลิกภาพในกลุ่มนี้มีลักษณะร่วมกัน คือ พฤติกรรมต่อต้านคนอื่น (move against) ประกอบด้วย 4 บุคลิกภาพ

    Arrogant

    (เทียบได้กับ narcissistic personality disorder ของ DSM หรือบุคลิกภาพหลงตัวเอง)

    บุคลิกภาพนี้คาดหวังว่า ตัวเองจะเป็นที่ชื่นชอบและจะได้รับการปฏิบัติจากคนอื่นเป็นพิเศษ รวมทั้งมีความมั่นใจเกินตัว

    ข้อดีของบุคลิกภาพนี้ คือ ดูมีความมั่นใจ ดูเป็นผู้นำ กล้าที่จะเสนอตัวเพื่อทำให้งานเดินหน้า แต่ข้อเสีย คือ เป็นคนหยิ่ง เห็นแก่ตัว และเรียกร้องความสนใจ

    (เปรียบได้กับหัวหน้าที่ดีแต่พูด แต่ทำไม่ได้จริง และมักเรียกร้องความเคารพและการปฏิบัติที่ดีจากลูกน้องและคนรอบข้าง)

    Mischievous

    (เทียบได้กับ antisocial personality disorder ของ DSM ซึ่งลักษณะเด่น คือ พฤติกรรมต่อต้านสังคม)

    บุคลิกภาพนี้เชื่อว่า ตัวเองอยู่เหนือกฎระเบียบ และสนุกกับการหลอกใช้หรือเอาผลประโยชน์จากคนอื่น

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

    (บุคลิกภาพนี้อาจะเป็นหัวหน้าที่มีพูดจาดีน่าฟัง แต่เป็นคนที่รับมากกว่าให้ และมักทำอะไรตามอารมณ์)

    Colorful

    (เทียบได้กับ histrionic personality disorder ของ DSM ซึ่งลักษณะเด่น คือ พฤติกรรมเรียกร้องความสนใจ)

    บุคลิกภาพนี้คาดหวังว่า ตัวเองจะเป็นจุดสนใจของคนอื่น จึงมีพฤติกรรมที่หวือหวาเฮฮา ชอบดราม่า เล่นใหญ่ ชวนให้คนอื่นสนใจ

    ข้อดี คือ เป็นคนที่สนุกสนาน เป็นสีสันให้กับที่ทำงาน แต่ข้อเสีย คือ มักพูดหรือทำอะไรเกินจริงและหยิบจับอะไรไม่ได้นาน

    (อาจจะเทียบได้กับหัวหน้าที่เอาแต่เล่นใหญ่ เล่นตลก หรือทำเหมือนกำลังอยู่ในปาร์ตี้ทั้งวันจนไม่ได้งาน)

    Imaginative

    (เทียบได้กับ schizotypal personality disorder ของ DSM ซึ่งจุดเด่น คือ การมีพฤติกรรมและความเชื่อแปลก ๆ เช่น เชื่อว่าคลื่นทีวีล้างสมองคนได้)

    บุคลิกภาพนี้มีความคิดความอ่านที่แปลกและไม่เหมือนใคร ซึ่งทำให้เป็นคนที่ดูมีความคิดสร้างสรรค์ มีนวัตกรรม มองการณ์ไกล แต่ข้อเสีย คือ มักจบอยู่กับความคิดของตัวเองจนลืมคนและสภาพความเป็นจริงรอบข้าง

    (เทียบได้กับหัวหน้าที่ใช้เวลาส่วนใหญ่คิดเพ้อฝัน มีความคิดยิ่งใหญ่มากมายที่ทำไม่ได้จริง)


    กลุ่มที่ 3: Move Toward

    กลุ่มสุดท้ายเป็นบุคลิกภาพที่เข้าหาคนอื่น (move toward) ซึ่งถ้าดูผิวเผินอาจจะดูไม่เหมือนบุคลิกภาพด้านมืด แต่ทั้ง 2 บุคลิกภาพนี้ในกลุ่มนี้สามารถส่งผลด้านลบต่อการทำงานและคนรอบข้างได้เช่นเดียวกับ 2 กลุ่มที่ผ่านมา

    Diligent

    (เทียบได้กับ obsessive-compulsive personality disorder ของ DSM หรือบุคลิกภาพย้ำคิดย้ำทำ)

    บุคลิกภาพนี้คาดหวังว่า คนอื่นจะประเมินงานของตัวเองอย่างละเอียดทุกซอกมุม จึงเป็นคนที่มีวิธีการทำงานที่เคร่งคัดและมาตรฐานการทำงานที่สูงลิบ รวมทั้งคาดหวังให้คนอื่นมีวิธีการและมาตรฐานเดียวกับตัวเอง ซึ่งอาจทำให้คนอื่นอึดอัดและทำงานด้วยยาก

    ข้อดี คือ ขยัน ละเอียด ทำงานถูกต้องเรียบร้อย แต่ข้อเสีย คือ มัก micro-manage คือ ติดตามการทำงานของคนอื่นทุกฝีก้าว ไม่ปล่อยให้ทำงานอย่างอิสระ จนอาจทำให้เสียความสัมพันธ์ที่ดีกับลูกน้องได้

    (เทียบได้กับหัวหน้าที่เป็น perfectionist ยึดมั่นในกฎระเบียบหรือวิธีจนเกินไป และคอยจี้ คอยเพ่งเล็งการทำงานของลูกน้องทุกลมหายใจ)

    Dutiful

    (เทียบได้กับ dependent personality disorder ของ DSM ซึ่งเป็นบุคลิกภาพที่เชื่อว่า ตัวเองไม่สามารถเชื่อเหลือตัวเองได้ และจะอยู่ไม่ได้ถ้าไม่พึงพาคนอื่น)

    บุคลิกภาพนี้มีความคาดหวังสูงกับการเป็นที่ยอมรับและเข้ากับคนอื่นได้ จึงมักมีพฤติกรรมที่คอยทำให้คนอื่นพอใจและหลีกเลี่ยงความขัดแย้ง การเผชิญหน้า หรือตอบปฏิเสธคนอื่น

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

    (อาจเทียบได้กับหัวหน้าที่เป็นห่วงความรู้สึกของทุกคนไปหมด จนตัดสินใจหรือทำงานต่อไม่ได้ เพราะในความเป็นจริง ไม่มีทางที่ใครจะทำให้ทุกคนพอใจได้พร้อม ๆ กันหมด)


    สรุป 11 ด้านมืดของผู้นำ

    บุคลิกภาพด้านมืดของ Axis II approach เป็น 11 ลักษณะด้านมืด (3 กลุ่ม) ที่อ้างอิงมาจากความผิดปกติทางบุคลิกภาพที่ระบุใน DSM เพื่อใช้อธิบายพฤติกรรมด้านลบในที่ทำงาน โดยเฉพาะลักษณะของผู้นำที่ขาดประสิทธิภาพ

    1. Move away: กลุ่มตีตัวออกห่าง
      • Excitable: หัวร้อน หงุดหงิดง่าย ชอบโวยวาย
      • Skeptical: ขี้ระแวง ไม่เชื่อใจคนอื่น
      • Cautious: กลัวผิดกลัวพลาด ขี้ระมัดระวัง
      • Reserved: เงียบขรึม มีโลกส่วนตัวสูง
      • Leisurely: ดื้อ ปากพูดดีแต่ตัวทำอีกอย่าง
    2. Move against: กลุ่มต่อต้านคนอื่น
      • Bold: หลงตัวเอง เรียกร้องการปรนนิบัติจากคนอื่น
      • Mischievous: ชอบเสี่ยง หลอกลวง เล่นกับกฎระเบียบ
      • Colorful: หวือหวา เล่นใหญ่ ชอบดราม่า
      • Imaginative: เพ้อฝัน คิดใหญ่
    3. Move toward: กลุ่มเข้าหาคนอื่น
      • Diligent: perfectionist, micro-manager
      • Dutiful: ใจดี ปฏิเสธไม่เป็น

    หมายเหตุ

    * DSM ในปัจจุบัน (ค.ศ. 2023) คือ DSM-V และฉบับที่ Hogan และ Hogan อ้างอิง คือ DSM-IV-TR ทั้งนี้ DSM-V และ DSM-IV-TR ระบุความผิดปกติทางบุคลิกภาพไว้ 10 ด้าน แต่ Hogan และ Hogan เลือกให้มีบุคลิกภาพด้านมืด 11 ด้าน โดยที่ด้านที่เพิ่มเข้ามายังมีความสำคัญในการที่ทำงาน (Leisurely) และเป็นบุคลิกภาพด้านมืดที่คล้ายคลึงกับความผิดปกติทางบุคลิกภาพที่มีในฉบับก่อน ๆ แต่ไม่มีใน DSM-IV-TR และ DSM-V


    อ้างอิง

    Hogan, J., Hogan, R., & Kaiser, R. B. (2011). Management derailment. In S. Zedeck (Ed.), APA handbook of industrial and organizational psychology, Vol. 3. Maintaining, expanding, and contracting the organization (pp. 555–575). American Psychological Association.

    Hogan, R., & Hogan, J. (2001). Assessing leadership: A view from the dark side. International Journal of Selection and Assessment, 9(1-2), 40–51.

    Hogan, R., & Hogan, J. (2009). Hogan Development Survey manual (2nd ed.). Hogan Assessment Systems.

    Horney, K. (1950). Neurosis and human growth: The struggle toward self-realization. Norton.


    บทความต้นฉบับจาก https://www.blockdit.com/posts/64cea71c5c4cf6bdec64e570


    ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    📕 ขอฝากหนังสือเล่มแรกในชีวิตด้วยนะครับ 😆

    🙋 ใครที่กำลังเรียนจิตวิทยาหรือทำงานสายจิตวิทยา และเบื่อที่ต้องใช้ software ราคาแพงอย่าง SPSS และ Excel เพื่อทำข้อมูล

    💪 ผมขอแนะนำ R Book for Psychologists หนังสือสอนใช้ภาษา R เพื่อการวิเคราะห์ข้อมูลทางจิตวิทยา ที่เขียนมาเพื่อนักจิตวิทยาที่ไม่เคยมีประสบการณ์เขียน code มาก่อน

    ในหนังสือ เราจะปูพื้นฐานภาษา R และพาไปดูวิธีวิเคราะห์สถิติที่ใช้บ่อยกัน เช่น:

    • Correlation
    • t-tests
    • ANOVA
    • Reliability
    • Factor analysis

    🚀 เมื่ออ่านและทำตามตัวอย่างใน R Book for Psychologists ทุกคนจะไม่ต้องพึง SPSS และ Excel ในการทำงานอีกต่อไป และสามารถวิเคราะห์ข้อมูลด้วยตัวเองได้ด้วยความมั่นใจ

    แล้วทุกคนจะแปลกใจว่า ทำไมภาษา R ง่ายขนาดนี้ 🙂‍↕️

    👉 สนใจดูรายละเอียดหนังสือได้ที่ meb:

  • บุคลิกภาพด้านมืด: สังคม การเรียน และการทำงาน

    บุคลิกภาพด้านมืด: สังคม การเรียน และการทำงาน

    1. พฤติกรรมทางสังคม
    2. การเรียน
    3. การทำงาน
    4. ความล้มเหลวของการเป็นผู้นำ
    5. บทสรุปด้านมืด
    6. อ้างอิง
    7. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    👉 ในตอนที่แล้ว (Eps. 2, 3) เราพูดถึงความแตกต่างระหว่างบุคลิกภาพด้านมืดและด้านสว่าง และ Dark Triad ซึ่งประกอบด้วย Machiavellianism (Mach), narcissism, และ psychopathy ซึ่งเป็นบุคลิกภาพด้านมืด 3 อย่างที่นักจิตวิทยาให้ความสนใจ

    ครั้งนี้ เราจะมาพูดถึงพฤติกรรมที่เกี่ยวข้องกับบุคลิกภาพด้านมืดกัน


    พฤติกรรมทางสังคม

    อย่างที่เล่าไปในตอนที่แล้ว (Ep. 3) ลักษณะที่เป็นแก่นหลักหนึ่งของ Dark Triad คือ ความไร้ความเห็นอกเห็นใจคนอื่น (callousness; Jones & Figueredo, 2013; Paulhus, 2014)

    ความเห็นอกเห็นใจ (empathy) เป็นความสามารถในการรับรู้อารมณ์ความรู้สึกของคนอื่น (เช่น ถ้าเพื่อนเศร้า เราสามารถตีความว่าเพื่อนเศร้า และรู้สึกเศร้าไปกับเพื่อนได้) ซึ่งเป็นสิ่งที่ช่วยให้คนมีความรู้สึกเชื่อมโยง (connected) กับคนอื่น (Hoffman, 2001)

    การที่ Dark Triad ขาดความเห็นอกเห็นใจ อาจทำให้คนที่มี Dark Triad สูงรู้สึกเชื่อมโยงกับคนอื่นได้ยาก แต่ทำให้คนเหล่านี้สามารถทำพฤติกรรมที่ส่งผลเสียต่อคนอื่นได้ง่ายขึ้น เพราะคนที่มี Dark Triad มักจะไม่สามารถรับรู้ได้ถึงความทุกข์หรือผลกระทบที่เกิดขึ้นกับผู้ที่ต้องรับเคราะห์จากผลการกระทำของพวกเขา

    จึงไม่น่าแปลกใจที่ Dark Triad มีความเกี่ยวข้องกับพฤติกรรมต่าง ๆ ที่ส่งผลด้านลบต่อสังคม เช่น

    • ความก้าวร้าว (aggression; Jones & Neria, 2015)
    • การกลั่นแกล้ง (bullying; van Geel et al., 2017)
    • การหลอกลวง (Jones & Paulhus, 2017)
    • การโกงข้อสอบ (cheating; Williams et al., 2010)

    สมกับที่ Dark Triad ถูกจัดว่าเป็นบุคลิกภาพด้านมืด หรือบุคลิกภาพที่ไม่น่าพึงประสงค์ทางสังคม


    การเรียน

    แม้จะเป็นบุคลิกภาพที่ไม่น่าพึงประสงค์ แต่ Dark Triad สามารถทำนายพฤติกรรมอื่น ๆ นอกเหนือจากพฤติกรรมด้านมืดได้

    ตัวอย่างที่สนใจมาจากงานวิจัยของ Vedel และ Thomsen (2017) ซึ่งพบว่า คะแนน Dark Triad ของนักศึกษาธุรกิจ/เศรษฐศาสตร์ (business/economics) มักสูงกว่านักศึกษาจิตวิทยา (psychology)

    การค้นพบนี้สามารถตีความได้หลายแบบ

    การตีความแบบที่ 1: การเรียนหรือสภาพแวดล้อมของสาขาธุรกิจ/เศรษฐศาสตร์ปลูกฝังให้คนมีบุคลิกภาพด้านมืดมากขึ้น (รูปที่ 1)

    รูปที่ 1 การตีความว่า การเรียนธุรกิจ/เศรษฐศาสตร์ (Business/economics) ทำให้เกิดบุคลิกภาพด้านมืด (High dark)

    การตีความแบบที่ 2: นักวิจัยเชื่อว่า การตีความที่เป็นไปได้มากกว่า คือ สาขาธุรกิจ/เศรษฐศาสตร์ดึงดูดคนที่มีบุคลิกภาพด้านมืดให้เลือกเรียนมากกว่าจิตวิทยา (รูปที่ 2)

    รูปที่ 2 การตีความว่า บุคลิกภาพด้านมืดสูง (High dark) มักเลือกเรียนธุรกิจ/เศรษฐศาสตร์ (Business/economics) มากกว่าจิตวิทยา (Psychology)

    การตีความนี้สอดคล้องกับงานวิจัยที่แสดงให้เห็นถึงความสอดคล้องระหว่าง Dark Triad และการให้ความสำคัญต่ออำนาจและเงิน (Lee et al. 2013) นั่นคือ คนที่มี Dark Triad สูงมักมองเห็นอำนาจและเงินเป็นสิ่งสำคัญในชีวิต และเพราะการเรียนธุรกิจ/เศรษฐศาสตร์สามารถพาไปสู่เส้นทางอาชีพที่เกี่ยวข้องกับอำนาจและเงินได้ (เช่น ผู้บริหาร เจ้าของบริษัท) มากกว่าจิตวิทยา (นักจิตวิทยา) คนที่มี Dark Triad สูงจึงมักเลือกเรียนธุรกิจ/เศรษฐศาสตร์มากกว่าจิตวิทยา

    เป็นเหตุให้นักศึกษาธุรกิจ/เศรษฐศาสตร์มีคะแนน Dark Triad สูงกว่านักศึกษาจิตวิทยานั่นเอง


    การทำงาน

    ในบริบทการทำงาน ผลลัพธ์ที่หาย ๆ งานวิจัยเห็นตรงกัน 2 อย่าง คือ

    1. Dark Triad มีความเชื่อมโยงกับ counterproductive work behaviour (CWB) หรือพฤติกรรมที่ส่งผลเสียต่อการทำงานหรือสมาชิกขององค์กร เช่น การขโมยของในที่ทำงาน การกลั่นแกล้งเพื่อนร่วมงาน
    2. Dark Triad มีความเชื่อมโยงกับประสิทธิภาพในการทำงาน (job performance) ที่ลดลง (O’Boyle et al., 2012)

    แม้ว่า Dark Triad จะส่งกระทบเชิงลบต่อผลลัพธ์ในการทำงาน แต่ก็ไม่เสมอไป

    งานวิจัยบางส่วนชี้ให้เห็นว่า อิทธิพลเชิงบวกของ Dark Triad ในที่ทำงาน เช่น คนที่มี Dark Triad สูงมักมี

    • เงินเดือนที่สูงกว่า 
    • ระดับตำแหน่งงานที่สูงกว่า เช่น ระดับผู้จัดการ ผู้บริหาร (Paleczek et al., 2018; Spurk et al., 2016)

    ถ้าคนที่มี Dark Triad มักมีพฤติกรรมในการทำงานที่ไม่ดี แต่ทำไมถึงได้รับค่าตอบแทนและอยู่ในระดับงานที่ดีกว่า?

    คำตอบมี 2 ส่วน คือ

    1. คนที่มี Dark Triad มักให้ความสำคัญกับอำนาจและการประสบความสำเร็จ (Kajonius et al., 2015; Lee et al. 2013) ซึ่งอาจทำให้คนที่มีลักษณะมืดเหล่านี้มีแรงผลักดันที่จะได้ตำแหน่งหน้าที่การงานที่สูง ๆ ซึ่งจะสะท้อนให้เห็นทั้งอำนาจและความสำเร็จ
    2. นอกจากนี้ คนที่มี Dark Triad ยังความโน้มเอียงและทักษะในการบงการ (manipulation)  ที่ช่วยให้คนเหล่านี้ปรับเปลี่ยนพฤติกรรมตามสถานการณ์เพื่อได้ในสิ่งที่ต้องการอีกด้วย

    เช่น คนที่มี narcissism สูง ซึ่งมักประเมินตัวเองเกินความเป็นจริง (Grijalva et al., 2016) และสามารถนำเสนอตัวเองให้ดูดีได้ (Campbell et al., 2011) อาจทำให้คนเหล่านี้ดูเหมือนคนที่มีทั้งความสามารถและความมั่นใจในตัวเองที่คู่ควรกับตำแหน่งงานในระดับสูง

    คนที่มี Mach สูง ที่สามารถใช้การบงการได้ทั้งลูกหนัก (hard tactic เช่น การข่มขู่) และลูกเบา (soft tactic เช่น การเยินยอ; Jonason et al., 2012) พร้อมที่จะรับมือกับสถานการณ์ได้หลายรูปแบบ

    และคนที่มี psychopathy สูง ที่มีเสน่ห์ (charm) แต่ไม่มีความรู้สึกผิดชอบชั่วดีในการกระทำของตัวเอง (Hare & Neumann, 2008) ซึ่งทำให้คนเหล่านี้พร้อมจะใช้เสน่ห์เพื่อประโยชน์ส่วนตัวเสมอ


    ความล้มเหลวของการเป็นผู้นำ

    จะเห็นได้ว่า อิทธิพลของบุคลิกภาพด้านมืดในที่ทำงานไม่ได้ตรงไปตรงมาอย่างที่ “ทำดีได้ดี ทำชั่วได้ชั่ว” เสมอไป แต่กลับเป็นว่า คนที่มีลักษณะมืดมีโอกาสที่จะขึ้นมาอยู่ในตำแหน่งงานที่จะส่งผลกระทบกับคนได้ในวงกว้างอย่างตำแหน่งบริหาร

    ผลการวิจัยที่ประกอบรวมกันนี้อาจช่วยอธิบายการมีอยู่ของความล้มเหลวของการเป็นผู้นำ (leadership failure หรือ leadership derailment) ซึ่งจากการประเมินอาจสูงถึง 67% ของผู้นำทั้งหมด (Hogan et al., 2011) 

    ความล้มเหลวของผู้นำไม่ได้ส่งผลต่อการทำงานของอค์กรเท่านั้น (เช่น องค์กรที่มี CEO ที่มี narcissism สูงมักมีความเสี่ยงต่อการถูกฟ้องมากขึ้น; O’Reilly et al., 2018) แต่ยังส่งผลต่อความสำเร็จทางอาชีพและสุขภาวะของพนักงานอีกด้วย (Volmer et al., 2016)

    ถ้าคนที่มี Dark Triad มักขึ้นมาเป็นผู้นำ แต่กลับเป็นผู้นำที่ไม่ดี เราจะทำยังไงได้บ้าง?

    อย่างแรก เราสามารถที่จะลดโอกาสที่คนเหล่านี้จะขึ้นมาเป็นผู้นำผ่านกระบวนกันคัดเลือกบุคลากร

    แต่ถ้าคนที่มีลักษณะด้านมืดสามารถปรับตัวตามสถานการณ์ ซึ่งจะทำให้พวกเขามีพฤติกรรมที่แยกได้ยากจากคนที่มีความสามารถจริง ๆ เราจะทำยังไง?

    Hogan และคณะ (2011) ผู้เชี่ยวชาญด้านบุคลิกภาพในองค์กร เสนอว่า ให้ตรวจสอบลักษณะที่มักจะปรากฎในคนที่มีความสามารถ แต่ไม่มีในคนที่มีบุคลิกภาพด้านมืด เช่น

    • ความตระหนักรู้ในตัวเอง (self-awareness)
    • ความสามารถในการเรียนรู้จากความผิดพลาด และ
    • สามารถควบคุมตัวเองได้ดี

    นอกจากนี้ Hogan และคณะยังเสนอให้มีการประเมินบุคลิกภาพด้านมืดของผู้ที่จะขึ้นมาเป็นผู้นำด้วย เพราะแม้ว่าในหลาย ๆ องค์กรจะมีการประเมินบุคลิกภาพ แต่เป็นการประเมินบุคลิกภาพด้านสว่าง ซึ่งไม่สามารถสะท้อนให้เห็นถึงความเสี่ยงของความล้มเหลวของผู้นำได้

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

    ลักษณะอย่างหนึ่งสภาพแวดล้อมที่สามารถช่วยลดอิทธิพลด้านลบของบุคลิกภาพด้านมืดได้ คือ ความชัดเจน (unambiguity) ทั้งนี้ เพราะผลกระทบด้านลบส่วนหนึ่งมาจากการบงการของคนที่มีบุคลิกภาพด้านมืด ซึ่งเมื่อสภาพแวดล้อมขาดความชัดเจน การบงการ (เช่น การบิดเบือนความจริง) สามารถทำได้ง่ายขึ้น

    มีงานวิจัยที่สนับสนุนแนวคิดนี้ โดยแสดงให้เห็นว่า พนักงานที่มี Mach สูง มียอดขายที่น้อยในองค์กรที่มีโครงสร้างการทำงานที่ชัดเจน เมื่อเทียบกับองค์กรที่มีโครงสร้างการทำงานที่ไม่ชัดเจน เพราะเป็นไปได้ว่า พนักงานขายในองค์กรที่มีโครงสร้างชัดเจนไม่สามารถใช้ทักษะการบงการได้อย่างเต็มที่ (Gable et al., 1992; Shultz, 1993)

    ในขณะเดียวกัน เราสามารถออกแบบสภาพแวดล้อม หรือมอบหมายให้ผู้นำอยู่ในสภาพแวดล้อมที่บุคลิกภาพด้านมืดจะส่งผลบวกต่อองค์กรได้

    ตัวอย่างสภาพแวดล้อมที่บุคลิกภาพด้านมืดจะสามารถทำประโยชน์ให้ได้ คือ สภาพแวดล้อมที่มีการแข่งขันสูง ซึ่งการทำงานในสภาพแวดล้อมนี้ต้องการการตัดสินใจจากผู้นำที่เด็ดขาด สามารถรับมือกับความกดดัน และปรับตัวเข้ากับสถานการณ์ได้ดี (Haar & de Jong, 2023) ซึ่งการให้ความสำคัญต่ออำนาจ (การได้มีอำนาจตัดสินใจเหนือคนอื่น) และทักษะการบงการทำให้คนที่มีบุคลิกภาพด้านมืดเหมาะกับการเป็นผู้นำในบริบทนี้

    งานวิจัยของ Haar และ de Jong (2023) ให้การสนับสนุนแนวคิดนี้ โดยแสดงให้เห็นว่า ในองค์กรที่มีการแข่งขันสูง CEO ที่มี Dark Triad สูง สามารถผลักดันให้ทีมสร้างคุณค่าให้กับองค์กรได้ดีกว่า CEO ที่อยู่ในองค์กรที่มีการแข่งขันต่ำ

    ดังนั้น เพื่อทำใช้ประโยชน์จากบุคลิกภาพด้านมืด เราอาจปรับสภาพแวดล้อมให้มีการแข่งขันสูงขึ้น หรือจัดวางผู้นำที่มีบุคลิภาพด้านมืดให้อยู่ในฝ่ายงานที่มีการแข่งขันสูงได้


    บทสรุปด้านมืด

    บุคลิกภาพด้านมืดเป็นลักษณะทางบุคคลที่แยกออกจากบุคลิกภาพด้านสว่าง และสามารถช่วยเพิ่มความเข้าใจในพฤติกรรมมนุษย์ได้

    Dark Triad เป็นบุคลิกภาพด้านมืดที่นักจิตวิทยาให้ความสนใจเป็นอย่างมาก

    งานวิจัยต่าง ๆ ได้แสดงให้เห็นว่า Dark Triad ไม่ได้มีอิทธิพลต่อพฤติกรรมด้านลบของมนุษย์ แต่ยังพฤติกรรมในด้านอื่น ๆ เช่น การเลือกสาขาการศึกษา และการขึ้นมาเป็นผู้นำ ด้วยเช่นกัน ซึ่งแสดงให้เห็นว่า ผลกระทบของบุคลิกภาพด้านมืดต่อพฤติกรรมมีความซับซ้อนและน่าค้นหา และการทำความเข้าใจบุคลิกภาพด้านมืดสามารถช่วยให้เราเข้าใจและปรับเปลี่ยนวิถีชีวิตของเราให้ดีขึ้นได้


    อ้างอิง

    Campbell, W. K., Hoffman, B. J., Campbell, S. M., & Marchisio, G. (2011). Narcissism in organizational contexts. Human Resource Management Review, 21(4), 268–284.

    Gable, M., Hollon, C., & Dangello, F. (1992). Managerial structuring of work as a moderator of the Machiavellianism and job performance relationship. The Journal of Psychology: Interdisciplinary and Applied, 126(3), 317–325.

    Grijalva, E., & Zhang, L. (2016). Narcissism and self-insight: A review and meta-analysis of narcissists’ self-enhancement tendencies. Personality and Social Psychology Bulletin, 42(1), 3–24.

    Haar, J., & de Jong, K. (2023). Is the dark triad always detrimental to firm performance? Testing different performance outcomes and the moderating effects of competitive rivalry. Frontiers in Psychology, 14, 1061698. https://doi.org/10.3389/fpsyg.2023.1061698

    Hare, R. D., & Neumann, C. S. (2008). Psychopathy as a clinical and empirical construct. Annual Review of Clinical Psychology, 4, 217–246.

    Harms, P. D., Spain, S. M., & Wood, D. (2014). Mapping personality in dark places. Industrial and Organizational Psychology: Perspectives on Science and Practice, 7(1), 114–117.

    Hoffman, M. L. (2001). Empathy and moral development: Implications for caring and justice. Cambridge University Press.

    Hogan, J., Hogan, R., & Kaiser, R. B. (2011). Management derailment. In S. Zedeck (Ed.), APA handbook of industrial and organizational psychology, Vol. 3. Maintaining, expanding, and contracting the organization (pp. 555–575). American Psychological Association.

    Jonason, P. K., & Sherman, R. A. (2020). Personality and the perception of situations: The Big Five and Dark Triad traits. Personality and Individual Differences, 163, 110081. 

    Jonason, P. K., Slomski, S., & Partyka, J. (2012). The Dark Triad at work: How toxic employees get their way. Personality and Individual Differences, 52(3), 449–453.

    Jones, D. N., & Figueredo, A. J. (2013). The core of darkness: Uncovering the heart of the Dark Triad. European Journal of Personality, 27(6), 521–531.

    Jones, D. N., & Neria, A. L. (2015). The Dark Triad and dispositional aggression. Personality and Individual Differences, 86, 360–364.

    Jones, D. N., & Paulhus, D. L. (2017). Duplicity among the dark triad: Three faces of deceit. Journal of Personality and Social Psychology, 113(2), 329–342.

    Kajonius, P. J., Persson, B. N., & Jonason, P. K. (2015). Hedonism, Achievement, and Power: Universal values that characterize the Dark Triad. Personality and Individual Differences, 77, 173–178.

    Lee, K., Ashton, M. C., Wiltshire, J., Bourdage, J. S., Visser, B. A., & Gallucci, A. (2013). Sex, power, and money: Prediction from the Dark Triad and Honesty–Humility. European Journal of Personality, 27(2), 169–184.

    O’Boyle, E. H., Jr., Forsyth, D. R., Banks, G. C., & McDaniel, M. A. (2012). A meta-analysis of the Dark Triad and work behavior: A social exchange perspective. Journal of Applied Psychology, 97(3), 557–579.

    O’Reilly, C. A. III, Doerr, B., & Chatman, J. A. (2018). “See you in court”: How CEO narcissism increases firms’ vulnerability to lawsuits. The Leadership Quarterly, 29(3), 365–378.

    Paleczek, D., Bergner, S., & Rybnicek, R. (2018). Predicting career success: Is the dark side of personality worth considering? Journal of Managerial Psychology, 33(6), 437–456.

    Paulhus, D. L. (2014). Toward a taxonomy of dark personalities. Current Directions in Psychological Science, 23(6), 421–426.

    Spurk, D., Keller, A. C., & Hirschi, A. (2016). Do bad guys get ahead or fall behind? Relationships of the Dark Triad of personality with objective and subjective career success. Social Psychological and Personality Science, 7(2), 113–121.

    Shultz, C. J. (1993). Situational and dispositional predictors of performance: A test of the hypothesized Machiavellianism × structure interaction among sales persons. Journal of Applied Social Psychology, 23(6), 478–498.

    van Geel, M., Goemans, A., Toprak, F., & Vedder, P. (2017). Which personality traits are related to traditional bullying and cyberbullying? A study with the Big Five, Dark Triad and sadism. Personality and Individual Differences, 106, 231–235.

    Vedel, A., & Thomsen, D. K. (2017). The Dark Triad across academic majors. Personality and Individual Differences, 116, 86–91.

    Volmer, J., Koch, I. K., & Göritz, A. S. (2016). The bright and dark sides of leaders’ dark triad traits: Effects on subordinates’ career success and well-being. Personality and Individual Differences, 101, 413–418.

    Williams, K. M., Nathanson, C., & Paulhus, D. L. (2010). Identifying and profiling scholastic cheaters: Their personality, cognitive ability, and motivation. Journal of Experimental Psychology: Applied, 16(3), 293–307.


    บทความต้นฉบับจาก https://www.blockdit.com/posts/64c52abba111aa9db16ca5ea


    ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    📕 ขอฝากหนังสือเล่มแรกในชีวิตด้วยนะครับ 😆

    🙋 ใครที่กำลังเรียนจิตวิทยาหรือทำงานสายจิตวิทยา และเบื่อที่ต้องใช้ software ราคาแพงอย่าง SPSS และ Excel เพื่อทำข้อมูล

    💪 ผมขอแนะนำ R Book for Psychologists หนังสือสอนใช้ภาษา R เพื่อการวิเคราะห์ข้อมูลทางจิตวิทยา ที่เขียนมาเพื่อนักจิตวิทยาที่ไม่เคยมีประสบการณ์เขียน code มาก่อน

    ในหนังสือ เราจะปูพื้นฐานภาษา R และพาไปดูวิธีวิเคราะห์สถิติที่ใช้บ่อยกัน เช่น:

    • Correlation
    • t-tests
    • ANOVA
    • Reliability
    • Factor analysis

    🚀 เมื่ออ่านและทำตามตัวอย่างใน R Book for Psychologists ทุกคนจะไม่ต้องพึง SPSS และ Excel ในการทำงานอีกต่อไป และสามารถวิเคราะห์ข้อมูลด้วยตัวเองได้ด้วยความมั่นใจ

    แล้วทุกคนจะแปลกใจว่า ทำไมภาษา R ง่ายขนาดนี้ 🙂‍↕️

    👉 สนใจดูรายละเอียดหนังสือได้ที่ meb: