Author: Shinin Varongchayakul

  • if, for, while ใน Python: วิธีใช้ conditional statements, control flow, และ loop control ใน Python พร้อมตัวอย่าง

    if, for, while ใน Python: วิธีใช้ conditional statements, control flow, และ loop control ใน Python พร้อมตัวอย่าง

    ในบทความนี้ เราจะมาดูวิธีใช้ code 3 ประเภท ที่จะช่วยให้ Python code สามารถตัดสินใจแทนเราได้:

    1. Conditional statements: if, elif, else
    2. Control flow statements: for, while
    3. Loop control statements: continue, break, pass

    ก่อนไปดูวิธีใช้ทั้ง 3 ประเภท เราจะไปทำความรู้จักกับ comparison และ logical statement ซึ่งเราจะใช้ร่วมกับ code 3 ประเภทนี้กัน

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


    1. 🧮 1. Comparison & Logical Operators
      1. #️⃣ (1) Comparison Operators
      2. ♟️ (2) Logical Operators
    2. 🚦 2. Conditional Statements
    3. 🌊 3. Control Flow Statements
      1. 📦 (1) for Loop
      2. 🔁 (2) while Loop
    4. 🚄 4. Loop Control Statements
    5. 💪 5. Summary
    6. 😺 GitHub
    7. 📃 References

    🧮 1. Comparison & Logical Operators

    #️⃣ (1) Comparison Operators

    Comparison operators เป็นเครื่องหมายใช้เปรียบเทียบข้อมูล:

    OperatorDescription
    ==เท่ากับ
    !=ไม่เท่ากับ
    >มากกว่า
    >=มากกว่า/เท่ากับ
    <น้อยกว่า
    <=น้อยกว่า/เท่ากับ

    โดย comparison operators จะให้ผลลัพธ์เป็น Boolean (True, False) กลับมา เช่น:

    # True statement
    10 > 5
    

    ผลลัพธ์:

    True
    

    และ:

    # False statement
    10 < 5
    

    ผลลัพธ์:

    False
    

    ♟️ (2) Logical Operators

    Logical operators เป็น keywords เชื่อมเงื่อนไข ช่วยให้เราประเมินหลายเงื่อนไขพร้อมกันได้:

    OperatorDescription
    andLogical AND
    orLogical OR
    notLogical NOT

    โดยผลลัพธ์เป็นไปตาม truth table:

    Condition 1OperatorCondition 2Result
    TrueandTrueTrue
    TrueandFalseFalse
    FalseandFalseFalse
    TrueorTrueTrue
    TrueorFalseTrue
    FalseorFalseFalse
    notTrueFalse
    notFalseTrue

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

    # True and True
    1 == 1 and 2 < 4
    

    ผลลัพธ์:

    True
    

    🚦 2. Conditional Statements

    Conditional statements ใช้กำหนดเงื่อนไขว่า code จะรันได้เมื่อไร และมีอยู่ 3 แบบ ได้แก่:

    • if: กำหนดเงื่อนไขแรก
    • elif: กำหนดเงื่อนไขเพิ่มเติม
    • else: รันเมื่อตรงกับเงื่อนไขอื่น ๆ ที่ไม่ใช่ if และ elif

    ยกตัวอย่างเช่น เราต้องการ print ข้อความแจ้งเตือนตามสภาพอากาศ:

    # Weather today
    weather = "snowy"
    

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

    # Print when sunny
    if weather == "sunny":
        print("It's a sunny day. Don't forget your sunscreen!")
    
    # Print when rainy
    elif weather == "rainy":
        print("It's raining. Remember to bring an umbrella!")
    
    # Print when other conditions
    else:
        print("Likely chilly. Wear a jacket!")
    

    ผลลัพธ์:

    Likely chilly. Wear a jacket!
    

    อธิบาย code:

    • if block: ประเมินว่า weather เป็น "sunny" ไหม ถ้าใช่ จะ print "It's a sunny day. Don't forget your sunscreen!"
    • elif block: weather เป็น "rainy" ไหม ถ้าใช่ จะ print "It's raining. Remember to bring an umbrella!"
    • else block: ถ้า weather เป็นค่าอื่น ๆ (เช่น "snowy") จะ print "Likely chilly. Wear a jacket!"

    เพราะ weather มีค่าตรงกับ else block เราจึงได้ผลลัพธ์เป็น "Likely chilly. Wear a jacket!"


    🌊 3. Control Flow Statements

    Control flow statements ใช้ควบคุมลำดับการทำงานของ code และมีอยู่ 2 แบบ ได้แก่:

    1. for: รัน code ตามจำนวนข้อมูลที่มี
    2. while: รัน code จนกว่าเงื่อนไขจะไม่เป็นจริง

    📦 (1) for Loop

    ตัวอย่าง for loop เช่น print ชื่อแขกในงาน:

    # Guest list
    guests = ["James Bond", "John Wick", "Jack Reacher", "Jason Bourne", "Jack Ryan"]
    
    # Print guest names
    for name in guests:
        
        # Print name
        print(name)
    

    ผลลัพธ์:

    James Bond
    John Wick
    Jack Reacher
    Jason Bourne
    Jack Ryan
    

    อธิบาย code:

    • guest = ...: สร้าง list เก็บรายชื่อแขก
    • for ...: นำชื่อแขกใน list มา print จนกว่าจะครบทุกคน

    🔁 (2) while Loop

    ตัวอย่าง while loop เช่น นับเลข 1 ถึง 10:

    # Starting number
    number = 1
    
    # Count to 10
    while number <= 10:
        
        # Print number
        print(number)
        
        # Add 1 to number
        number += 1
    

    ผลลัพธ์:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    

    อธิบาย code:

    • number = 1: กำหนดเลขเริ่มต้น
    • while ...: print number และปรับ number ให้สูงขึ้น 1 ค่า ทำอย่างนี้วนไปจนกว่า number จะมากกว่า 10 (number <= 10 ไม่เป็นจริง)

    🚄 4. Loop Control Statements

    Loop control statements ใช้ควบคุมการทำงานของ control flow และมีอยู่ 3 แบบ ได้แก่:

    1. continue: skip ไป item ถัดไป
    2. break: หยุดการทำงานของ control flow
    3. pass: placeholder สำหรับใส่ code ในอนาคต

    ยกตัวอย่างเช่น เรามีรายการของที่ต้องซื้อ และแต่ละอย่างมี action ไม่เหมือนกัน:

    # A shopping list program
    shopping_list = ["milk", "bread", "chips", "apple", "toothpaste", "chocolate"]
    
    # Loop through the list
    for item in shopping_list:
    
        # Skip item if chip
        if item == "chips":
            print("Chips are unhealthy. Skipping ...")
            continue
        
        # Stop the loop if toothpaste
        if item == "toothpaste":
            print("Found toothpaste, done shopping early!")
            break
        
        # Do nothing if milk
        if item == "milk" or item == "bread":
            pass
        
        # Print item
        print("Putting", item, "into the cart.")
    

    ผลลัพธ์:

    Putting milk into the cart.
    Putting bread into the cart.
    Chips are unhealthy. Skipping ...
    Putting apple into the cart.
    Found toothpaste, done shopping early!
    

    อธิบาย code:

    • shopping_list = ...: สร้าง list เก็บรายการซื้อของ
    • if item == "chips" block: ประเมินว่า item ใช่ "chip" ไหม ถ้าใช่ ให้ print "Chips are unhealthy. Skipping ..." และข้ามไป item ถัดไป (continue)
    • if item == "toothpaste" block: ประเมินว่า item ใช่ "toothpaste" ไหม ถ้าใช่ ให้ print "Found toothpaste, done shopping early!" และจบ loop ทันที (break)
    • if item == "milk" … block: ประเมินว่า item ใช่ "milk" หรือ "bread" ไหม ถ้าใช่ ไม่ต้องทำอะไร (pass)
    • print ...: print ว่า กำลังเอา item ใส่ตระกร้า

    สังเกตว่า:

    • มีแค่ milk, bread, apple ที่ “กำลังใส่ตระกร้า” เพราะ milk และ bread อยู่ใน pass block และ apple ไม่ได้อยู่ใน block ไหนเลย
    • Chip ถูกข้ามไป เพราะอยู่ใน continue block
    • Toothpaste อยู่ใน break block และมาก่อน chocolate ทำให้เราไม่เห็น chocolate เพราะ toothpaste

    💪 5. Summary

    ในบทความนี้ เราได้ไปดูวิธีการเขียน code ใน Python เพื่อให้ code ตัดสินใจได้:

    Comparison operators:

    OperatorDescription
    ==เท่ากับ
    !=ไม่เท่ากับ
    >มากกว่า
    >=มากกว่า/เท่ากับ
    <น้อยกว่า
    <=น้อยกว่า/เท่ากับ

    Logical operators:

    OperatorDescription
    andLogical AND
    orLogical OR
    notLogical NOT

    Conditional statements:

    StatementDescription
    ifกำหนดเงื่อนไขแรก
    elifกำหนดเงื่อนไขเพิ่มเติม
    elseทำ action เมื่อเข้าเงื่อนไขอื่น ๆ

    Control flow statements:

    StatementDescription
    forวนจนครบทุก item
    whileวนจนกว่าเงื่อนไขจะเป็น False

    Loop control statements:

    StatementDescription
    continueSkip
    breakStop
    passDo nothing

    😺 GitHub

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


    📃 References

  • Building Judgment: สรุป 3 แนวทางในการพัฒนาความคิดให้เฉียบคม จากหนังสือ The Almanack of Naval Ravikant โดย Eric Jorgenson — Think Clearly, Mental Models, และ Read

    Building Judgment: สรุป 3 แนวทางในการพัฒนาความคิดให้เฉียบคม จากหนังสือ The Almanack of Naval Ravikant โดย Eric Jorgenson — Think Clearly, Mental Models, และ Read

    The Almanack of Naval Ravikant เป็นหนังสือของ Eric Jorgenson นักเขียนเกี่ยวกับ startups ซึ่งรวบรวมปรัชญาการใช้ชีวิตและความมั่งคั่ง (wealth) ของ Naval Ravikant นักลงทุนที่ประสบความสำเร็จจากการลงทุนในบริษัทอย่าง Uber, Foursquare, และ Twitter (X) และเป็น CEO ของ AngelList บริษัทที่ช่วยให้ startups ได้พบกับ angel investors เอาไว้

    ในบทความนี้ เราจะสรุปบทเรียน Building Judgment ซึ่งเป็นบทที่ 2 จาก 5 ในหนังสือ

    บทสรุปแบ่งออกเป็น 4 กลุ่ม ได้แก่:

    1. What and why of judgment: นิยามและความสำคัญของ judgment
    2. Think clearly: วิธีคิดให้ทะลุปรุโปร่ง
    3. Mental models: หลักการคิดที่ควรมี
    4. Read: แนวคิดเกี่ยวกับการอ่าน

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


    หน้าปกหนังสือ The Almanack of Naval Ravikant บน Amazon

    1. ⚖️ What & Why of Judgment
    2. 😎 Think Clearly
      1. 🌱 Basic Knowledge: Start from the Ground Up
      2. 🥠 Reality: See Past the Identity
      3. 🙂 Additional Tips: Honesty & Criticism
    3. 🧠 Mental Models
    4. 📖 Read
      1. 🔖 What & How to Read
    5. 🌻 Summary
    6. 🔥 Get The Almanack of Naval Ravikant

    ⚖️ What & Why of Judgment

    The direction you’re heading in matters more than how fast you move, especially with leverage.

    — Naval Ravikant

    Judgment ในนิยามของ Naval คือ การประยุกต์ใช้ wisdom กับปัญหาภายนอก

    Wisdom หมายถึง ความสามารถในการมองเห็นผลลัพธ์ในระยะยาวของการกระทำ

    ดังนั้น judgment คือ ความสามารถในการมองเห็นผลลัพธ์ในระยะยาวของการกระทำ ซึ่งทำให้เราสามารถหาประโยชน์จากการตัดสินใจต่าง ๆ ในชีวิตได้

    Judgment = wisdom(external problems)
    

    ในยุคที่เทคโนโลยีพัฒนาอย่างรวดเร็ว judgment มีความสำคัญ เพราะเทคโนโลยีสามารถขยาย impact ของการตัดสินใจของเราได้หลายเท่าตัว

    ยกตัวอย่าง เรามีไอเดียและโพสต์ไอเดียลง social media เราสามารถเข้าถึงคนที่เราต้องการได้ภายในเวลาอันสั้น และถ้าไอเดียนี้ดี เราก็จะได้ผลตอบรับที่ดีจำนวนมากกลับมา แต่ถ้าเป็นไอเดียไม่เป็นที่ยอมรับของสังคม เราก็จะได้รับแรงต้านมหาศาลเช่นกัน

    ถ้าเรามี judgment ที่ดีกว่าคนอื่นเพียงนิดเดียว เราก็สามารถเห็นผลลัพธ์ที่แตกต่างกันได้อย่างสิ้นเชิง

    In an age of leverage, one correct decision can win everything.

    — Naval Ravikant

    ทั้งนี้ เรามี 3 วิธีในการพัฒนา judgment ของเรา ได้แก่:

    1. Think clearly
    2. Mental models
    3. Read

    ไปดูรายละเอียดของแต่ละวิธีกัน


    😎 Think Clearly

    “Clear thinker” is a better compliment than “smart.”

    — Naval Ravikant

    Think clearly คือ การคิดที่ตั้งอยู่บนพื้นฐานของความเป็นจริง (reality) และประกอบด้วย 2 ส่วน ได้แก่:

    1. ความรู้ขั้นพื้นฐาน
    2. การมองเห็นความเป็นจริง

    .

    🌱 Basic Knowledge: Start from the Ground Up

    Real knowledge is intrinsic, and it’s built from the ground up.

    — Naval Ravikant

    คนที่มี judgment ที่ดีมักมีความรู้ขั้นพื้นฐานที่ดี เพราะเมื่อเรามีความรู้พื้นฐานแล้ว เราสามารถต่อยอดเป็นความรู้ที่ซับซ้อนมากขึ้นได้

    ในมุมมองของ Naval คนที่ฉลาดมักจะเป็นคนที่เข้าใจความรู้พื้นฐานอย่างท่องแท้ ยกตัวอย่างเช่น Richard Feynman นักฟิสิกส์ที่ได้ Nobel Prize ในปี 1965 ซึ่งสามารถอธิบายคณิตศาสตร์ได้โดยเริ่มจากการนับเลขและต่อยอดไปเรื่อย ๆ ไปจนถึงพีชคณิตและตรีโกณมิติ (precalculus) โดยไม่ใช้นิยามใด ๆ แต่ใช้ chain of logic อย่างเดียว

    ถ้าเราสามารถอธิบาย concept ที่ซับซ้อนให้เด็กเข้าใจได้ แสดงว่า เรามีความรู้พื้นฐานที่แท้จริง แต่ถ้าเราทำไม่ได้ แสดงว่าเรากำลังจำ concept โดยไม่ได้เข้าใจความรู้พื้นฐานจริง ๆ

    .

    🥠 Reality: See Past the Identity

    The hard thing is seeing the truth.

    — Naval Ravikant

    คนที่มี judgment ที่ดี คือ คนที่เข้าใกล้ reality ได้มากที่สุด

    การเข้าใกล้ reality ไม่ใช่เรื่องง่าย เพราะมีปัจจัยหลายอย่างที่ขัดขวางไม่ให้เราเห็น reality เช่น:

    • Desires: สิ่งที่เราต้องการให้เป็น
    • Expectations: ความคาดหวัง
    • Beliefs: ความเชื่อ
    • Habits: ความเคยชิน

    Naval เรียกปัจจัยเหล่านี้รวมกันว่า identity หรือ ego ที่ก่อรูปเป็นตัวเราและคอยกำกับการกระทำของเรา

    What we wish to be true clouds our perception of what is true.

    — Naval Ravikant

    ถ้าเราอยากจะเข้าใกล้ reality ให้ได้มากที่สุด เราจะต้องตัดสินใจโดยไม่ใช้ identity/ego เพราะการใช้ identity/ego หมายถึง การใช้ความเชื่อหรือความเคยชินที่มีมาแต่เดิม และอาจไม่ใช่สิ่งที่สอดคล้องกับความเป็นจริงในปัจจุบัน

    ยกตัวอย่างเช่น เราเชื่อว่าธุรกิจกำลังไปได้ดี ทำให้เราตัดสินใจลงทุนเพิ่ม ทั้ง ๆ ที่เศรษฐกิจกำลังซบเซา ทำให้การตัดสินใจของเราส่งผลเสีย (แทนที่จะเป็นผลดี) ต่อธุรกิจ

    ยิ่งเราเข้าใกล้ reality ได้มากเท่าไร เราก็ยิ่งมี judgment ที่ดีขึ้นเท่านั้น

    .

    🙂 Additional Tips: Honesty & Criticism

    You should never, ever fool anybody, and you are the easiest person to fool.

    — Richard Feynman

    Naval แนะนำอีก 2 เคล็ดลับที่จะช่วยให้เราคิดได้ดีขึ้น ได้แก่:

    1. Radical honesty
    2. Praise specifically, criticise generally

    Radical honesty หมายถึง เราควรซื่อสัตย์ต่อทั้งตัวเองและคนอื่น เพราะคนที่ถูกหลอกง่ายที่สุดคือตัวเอง

    ถ้าเราโกหกคนอื่น เราจะเชื่อคำโกหกของตัวเอง ทำให้เราไม่สามารถเป็นตัวของตัวเองได้ รวมทั้งทำให้เราหลุดจากความเป็นจริง

    Praise specifically, criticise generally เป็นแนวคิดที่ Naval ได้มาจาก Warren Buffet ซึ่งหมายถึง:

    • เวลาที่เราวิพากวิจารณ์ใคร เราควรวิจารณ์แนวทางมากกว่าตัวบุคคล
    • เวลาที่เราชื่นชมใคร ให้เราชมตัวบุคคล

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

    • ถ้าเราเห็นพนักงานทำงานไม่ดี ให้เราวิจารณ์แนวทางในการทำงานที่พนักงานใช้
    • ถ้าเราเห็นพนักงานทำงานได้ดี เราควรชื่นชมพนักงาน เพราะเป็นตัวอย่างคนทำงานที่ดี

    การทำอย่างนี้จะช่วยทำให้คนอื่นอยากทำงานกับเรา มากกว่าต่อต้านเรา เพราะเราไม่ได้โจมตี identity/ego ของคนอื่น


    🧠 Mental Models

    What you want is principles. You want mental models.

    — Naval Ravikant

    Mental model เป็นเหมือนแผนที่ที่บอกว่า สิ่งต่าง ๆ ทำงานยังไง เช่น ถ้า X เกิดขึ้น Y จะตามมา

    ถ้าเราอยากจะมี judgment ที่ดี เราควรมี mental models ที่จะช่วยให้เราตัดสินใจได้ถูกต้องและแม่นยำ

    Naval แนะนำ 12 mental models ที่น่าสนใจ:

    1. Evolution: ทุกอย่างที่เกิดขึ้นในอารยธรรมสามารถอธิบายได้ด้วยหลัก evolution ที่ว่า ใครจะอยู่รอดและได้สืบพันธุ์ต่อไป
    2. Inversion: แนวคิดในการตัดตัวเลือกที่ไม่ใช่ แทนการมองหาตัวเลือกที่ใช่
    3. Complexity theory: Naval เชื่อว่า คนเราใสซื่อจนเกินไปและมีความสามารถในการทำนายอนาคตที่แย่มาก
    4. Economics: ความรู้เชิงเศรษฐศาสตร์ต่าง ๆ เช่น demand-supply, game theory
    5. Principal-agent problem: แนวคิดที่ว่า ความไม่สอดคล้องอาจเกิดขึ้นได้เมื่อเรา (principal) ให้คนอื่น (agent) ทำงานให้กับเรา เพราะ agent ไม่สามารถรู้ความต้องการของ principal ได้ตลอดเวลา เช่น เราฝากเพื่อนซื้อข้าว เพื่อนอาจซื้อข้าวผัดมาให้เพราะเห็นเรากินข้าวผัดในอดีต แต่วันนี้ เราอยากกินก๋วยเตี๋ยว ทำให้ข้าวที่ซื้อมาไม่ตรงโจทย์
    6. Compound interest: แนวคิดที่ว่า ดอกเบี้ยทบต้นไม่ได้ใช้ได้กับการเงินเท่านั้น แต่ยังใช้ได้กับด้านอื่น ๆ ของชีวิต เช่น การหาลูกค้า ถ้าบริษัทมีผู้ใช้ 100 คนในเดือนแรก และมียอดการเติบโตของผู้ใช้ 20% ต่อเดือน ภายใน 1 ปี บริษัทจะมีผู้ใช้งานถึงเกือบ 900 คน
    7. Basic math: ความรู้ทางคณิตศาสตร์ เช่น การคิดบวกลบเลข ความน่าจะเป็น และสถิติ
    8. Black swans: แนวคิดของ Nassim Nicholas Taleb นักวิทยาศาสตร์และนักปรัชญา ซึ่งหมายถึง เหตุการณ์ที่มีโอกาสเกิดขึ้นน้อยมาก แต่มีผลกระทบในวงกว้าง Naval แนะนำให้ศึกษางานของ Nassim ถ้าต้องการศึกษาเพิ่มเติม
    9. Calculus: การคำนวณ output โดยใช้ input และ functions
    10. Falsifiability: falsifiable หมายถึง สามารถพิสูจน์ว่าเป็น/ไม่เป็นจริงได้ และแนวคิดเป็นแก่นหลักของวิทยาศาสตร์ ทฤษฎีใดที่ไม่สามารถ falsify ได้เป็นทฤษฎีที่ไม่ควรยึดถือ เพราะเราพิสูจน์ไม่ได้ว่าเป็นจริง/ไม่เป็นจริง
    11. If you can’t decide, then the answer is no: ถ้าเราตัดสินใจไม่ได้ (เช่น จะไปเรียนต่อไหม) คำตอบคือไม่ เพราะในปัจจุบัน เรามีตัวเลือกมากมาย และเราควร say “yes” ก็ต่อเมื่อเรามั่นใจในตัวเลือกจริง ๆ แล้วเท่านั้น
    12. Run uphill: ถ้าเรารู้สึก 50-50 กับการตัดสินใจยาก ๆ ให้เราเลือกทางที่ยากกว่า เพราะทางที่ยากในระยะสั้นมักให้ผลดีในระยะยาว เหมือนกับการวิ่ง เราจะเหนื่อยในระหว่างวิ่ง แต่สุดท้ายเราจะมีสุขภาพที่ดีในระยะยาว

    📖 Read

    Read a lot—just read.

    — Naval Ravikant

    แนวทางสุดท้ายในการพัฒนา judgment คือ การอ่าน

    การอ่านคือ superpower ซึ่งเราสามารถพัฒนาได้

    สำหรับคนที่ต้องการฝึกทักษะการอ่าน Naval แนะนำให้เริ่มจากการอ่านสิ่งที่ชอบจนกว่าเราจะรักในการอ่าน

    Read what you love until you love to read.

    — Naval Ravikant

    ในช่วงแรก เราไม่ต้องสนใจว่า หนังสือที่เราอ่านเกี่ยวกับเรื่องอะไร ขอให้เป็นสิ่งที่เราชอบก็พอ และอ่านให้เยอะ ไม่ว่าจะเป็นอะไรก็ตาม

    .

    🔖 What & How to Read

    The problem with saying “just read” is there is so much junk out there.

    — Naval Ravikant

    Naval มีเทคนิคในการอ่านเพื่อสร้างความรู้ 5 ข้อ ได้แก่:

    1. Basic knowledge: อ่านหนังสือที่มีความรู้พื้นฐาน เช่น คณิตศาสตร์ วิทยาศาสตร์ และปรัชญา
    2. Classic work: อ่านหนังสือต้นฉบับหรือหนังสือ classic เช่น ถ้าเราต้องการอ่านเกี่ยวกับ evolution เราควรอ่านงานของ Charles Darwin ก่อน แล้วค่อยอ่านหนังสือของคนอื่นที่เขียนต่อยอดจาก Charles Darwin เป็นต้น
    3. No obligation to finish a book: เราอ่านเพื่อทำความเข้าใจไอเดียพื้นฐานของหนังสือ เราไม่จำเป็นต้องอ่านหนังสือให้จบทั้งเล่ม ถ้าเรารู้สึกว่าเข้าใจไอเดียพื้นฐานในหนังสือแล้ว เราสามารถข้ามไปเล่มถัดไปได้ และกลับมาดูหนังสือเล่มเก่าอีกครั้งเมื่อต้องการทบทวนความรู้
    4. You are what you read: เลือกหนังสือที่อ่านให้ดี เพราะหนังสือจะเหมือนเนื้อเพลงที่เล่นวนอยู่ในหัวเรา เราจะกลายเป็นสิ่งที่เราอ่าน
    5. Read to teach: อ่านโดยมีความตั้งใจว่าจะอธิบายให้คนอื่นฟัง การทำเช่นนี้จะทำให้เราเข้าใจสิ่งที่อ่านมากขึ้น

    🌻 Summary

    Judgment เป็นสิ่งที่สำคัญ เพราะผลของการตัดสินใจเราสามารถถูกขยายด้วยเทคโนโลยีและส่งผลเป็นวงกว้างได้

    แนวทางในการพัฒนา judgment มีอยู่ 3 แนวทาง ได้แก่:

    1. Think clearly: คิดโดยตั้งอยู่บนพื้นฐานของความเป็นจริง โดยเราต้องมี (1) ความรู้พื้นฐาน และ (2) การตัดสินใจโดยไม่ใช้ identity/ego
    2. Mental models: สะสมแนวคิดในการตัดสินใจ เช่น evolution, inversion, complexity theory
    3. Read: อ่านให้เยอะเพื่อสะสมความรู้พื้นฐานและหลีกเลี่ยงหนังสือที่ไม่ดี

    🔥 Get The Almanack of Naval Ravikant

    สำหรับคนที่สนใจเนื้อหาของหนังสือและอยากอ่านเพิ่มเติม สามารถซื้อหนังสือได้ตาม link ด้านล่าง:

    Note: ใครที่สนใจอ่านต้นฉบับภาษาอังกฤษแบบ e-book หรือ PDF สามารถดาวน์โหลดฟรีได้ที่ navalmanack.com

  • 4 วิธีการใช้ getSymbols() เพื่อโหลดข้อมูลการเงินในภาษา R — ตัวอย่างการโหลดข้อมูลหุ้น Apple

    4 วิธีการใช้ getSymbols() เพื่อโหลดข้อมูลการเงินในภาษา R — ตัวอย่างการโหลดข้อมูลหุ้น Apple

    ในบทความนี้ เราจะมาทำความรู้จักกับ getSymbols() จาก quantmod package ซึ่งใช้โหลดข้อมูลทางการเงิน เช่น ข้อมูลหุ้น และข้อมูลทางเศรษฐกิจ กัน

    โดยเราจะไปดู 4 วิธีการใช้งาน ได้แก่:

    1. Basics: การใช้งาน getSymbols() เบื้องต้น
    2. Advanced: การใช้งานขั้นสูง
    3. View columns: การดู column ข้อมูล
    4. Visualise data: การสร้างกราฟข้อมูล

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


    1. 💻 Install & Import
    2. 1️⃣ Basics: 5 Parametres to Know
      1. 💲 Symbols
      2. 🏦 src
      3. 🏧 auto.assign
      4. 🌲 env
      5. 📆 from, to
    3. 2️⃣ Advanced: Set Defaults
      1. 🌍 getDefaults(), setDefaults()
      2. 💹 setSymbolLookup(), getSymbolLookup()
      3. 💾 saveSymbolLookup(), loadSymbolLookup()
    4. 3️⃣ View Columns
    5. 4️⃣ Visualise Data
    6. 💪 Summary
    7. 😺 GitHub
    8. 📃 References
    9. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    💻 Install & Import

    ในการใช้งาน getSymbols() เราจะต้องเริ่มจากการติดตั้งและโหลด quantmod package ก่อน แบบนี้:

    # Install the packages
    install.packages("quantmod")
    
    # Load the packages
    library(quantmod)
    

    1️⃣ Basics: 5 Parametres to Know

    ในการใช้งานพื้นฐาน getSymbols() มี 5 parametres หลักที่เราควรรู้ ได้แก่:

    1. Symbols: ตัวย่อชื่อข้อมูล
    2. src: แหล่งข้อมูล
    3. auto.assign: ให้โหลด (TRUE) หรือแสดงข้อมูล (FALSE)
    4. env: environment สำหรับโหลดข้อมูล
    5. from และ to: ช่วงเวลาของข้อมูล

    เราไปดูวิธีใช้งานแต่ละ parametre กัน

    .

    💲 Symbols

    ในขั้นแรกของการโหลดข้อมูลการเงินด้วย getSymbols() ให้เราระบุชื่อข้อมูลที่เราต้องการ เช่น:

    ข้อมูลชื่อข้อมูล
    AppleAAPL
    GoogleGOOG
    MicrosoftMSFT
    NVIDIANVDA

    ในบทความนี้ เราจะลองโหลดข้อมูลหุ้น Apple กัน ซึ่งเราสามารถกำหนด Symbols ได้แบบนี้:

    # Import Apple data
    getSymbols("AAPL")
    

    เมื่อรันแล้ว เราจะได้ตัวแปรประเภท xts (time series object) ชื่อ AAPL มา ซึ่งเราดูข้อมูลในตัวแปรนี้ได้ด้วย head():

    # Print result
    head(AAPL)
    

    ผลลัพธ์:

               AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
    2007-01-03  3.081786  3.092143 2.925000   2.992857  1238319600      2.518541
    2007-01-04  3.001786  3.069643 2.993571   3.059286   847260400      2.574443
    2007-01-05  3.063214  3.078571 3.014286   3.037500   834741600      2.556108
    2007-01-08  3.070000  3.090357 3.045714   3.052500   797106800      2.568732
    2007-01-09  3.087500  3.320714 3.041071   3.306071  3349298400      2.782115
    2007-01-10  3.383929  3.492857 3.337500   3.464286  2952880000      2.915257
    

    จะเห็นได้ว่า นอกจากวันที่แล้ว ข้อมูลเรายังประกอบไปด้วย 6 columns ดังนี้:

    1. Open: ราคาเปิด
    2. High: ราคาสูงสุด
    3. Low: ราคาต่ำสุด
    4. Close: ราคาปิด
    5. Volume: ปริมาณการซื้อขาย
    6. Adjusted: ราคาปรับปรุง

    ในกรณีที่เราต้องการโหลดข้อมูลหุ้นหลายตัวพร้อมกัน เราสามารถใช้ character vector ช่วยได้แบบนี้:

    # Load multiple instruments
    getSymbols(c("AAPL", "GOOGL", "MSFT", "NVDA"))
    

    .

    🏦 src

    src ใช้กำหนดแหล่งข้อมูลที่ getSymbols() จะไปดึงข้อมูลมา

    โดย default, src ถูกตั้งไว้ให้ดึงข้อมูลจาก Yahoo! Finance ("yahoo")

    แสดงว่า เราสามารถเขียน code เพื่อดึงข้อมูล Apple จาก Yahoo! Finance ได้ทั้งแบบนี้:

    # Import Apple data
    getSymbols("AAPL")
    

    และแบบนี้:

    # Import Apple data
    getSymbols("AAPL", src = "yahoo")
    

    ทั้งนี้ getSymbols() มีแหล่งข้อมูลอื่น ๆ ให้เราเลือกใช้งานได้ เช่น:

    • Federal Reserve Economic Data ("FRED")
    • Oanda ("oanda")

    นอกจากแหล่งข้อมูลออนไลน์แล้ว เรายังสามารถโหลดข้อมูลแบบออฟไลน์ได้ เช่น:

    • CSV ("csv")
    • RData ("RData")

    ยกตัวอย่างเช่น โหลดข้อมูล Apple จาก CSV:

    # Load csv data
    getSymbols("AAPL", src = "csv")
    

    Note: การโหลดข้อมูล CSV ด้วย getSymbols() มีเงื่อนไข 4 อย่าง ได้แก่:

    1. มีชื่อไฟล์เป็นชื่อหุ้น (เช่น AAPL.csv)
    2. มี header
    3. Column แรกจะต้องเป็น datetime (เช่น 2025-05-25)
    4. Column ที่เหลือควรมีชื่อและข้อมูลดังนี้:
      1. Open: ข้อมูลราคาเปิด
      2. High: ข้อมูลราคาสูงสุด
      3. Low: ข้อมูลราคาต่ำสุด
      4. Close: ข้อมูลราคาปิด
      5. Volume: ข้อมูลปริมาณการซื้อขาย
      6. Adjusted: ข้อมูลราคาปรับปรุง

    .

    🏧 auto.assign

    auto.assign ใช้กำหนดว่า getSymbols() จะโหลดข้อมูลมาไว้ใน global environment หรือแสดงข้อมูลที่โหลดมาได้

    โดย default, auto.assign เป็น TRUE ซึ่งทำให้เราได้ตัวแปรที่เก็บข้อมูลการเงินมาไว้ใน global environment ของเรา โดยไม่ต้องกำหนดตัวแปรเอง

    ทั้งนี้ ในกรณีที่เราต้องการกำหนดตัวแปรเอง ให้เราเปลี่ยน auto.assign เป็น FALSE แบบนี้:

    # Set auto.assign to FALSE to assign to custom variable
    apple_data <- getSymbols("AAPL", auto.assign = FALSE)
    

    ถ้าเรากำหนดให้ auto.assign = FALSE โดยไม่จัดเก็บไว้ในตัวแปร getSymbols() จะแสดงข้อมูลใน console ของเรา:

    # Set auto.assign to FALSE without variable assignment
    getSymbols("AAPL", auto.assign = FALSE)
    

    ผลลัพธ์:

                AAPL.Open  AAPL.High   AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
    2007-01-03   3.081786   3.092143   2.925000   2.992857  1238319600      2.518541
    2007-01-04   3.001786   3.069643   2.993571   3.059286   847260400      2.574442
    2007-01-05   3.063214   3.078571   3.014286   3.037500   834741600      2.556108
    2007-01-08   3.070000   3.090357   3.045714   3.052500   797106800      2.568732
    2007-01-09   3.087500   3.320714   3.041071   3.306071  3349298400      2.782115
    2007-01-10   3.383929   3.492857   3.337500   3.464286  2952880000      2.915257
    2007-01-11   3.426429   3.456429   3.396429   3.421429  1440252800      2.879192
    2007-01-12   3.378214   3.395000   3.329643   3.379286  1312690400      2.843727
    2007-01-16   3.417143   3.473214   3.408929   3.467857  1244076400      2.918262
    2007-01-17   3.484286   3.485714   3.386429   3.391071  1646260000      2.853645
           ...                                                                      
    2025-06-05 203.500000 204.750000 200.149994 200.630005    55126100    200.630005
    2025-06-06 203.000000 205.699997 202.050003 203.919998    46607700    203.919998
    2025-06-09 204.389999 206.000000 200.020004 201.449997    72862600    201.449997
    2025-06-10 200.600006 204.350006 200.570007 202.669998    54672600    202.669998
    2025-06-11 203.500000 204.500000 198.410004 198.779999    60989900    198.779999
    2025-06-12 199.080002 199.679993 197.360001 199.199997    43904600    199.199997
    2025-06-13 199.729996 200.369995 195.699997 196.449997    51447300    196.449997
    2025-06-16 197.300003 198.690002 196.559998 198.419998    43020700    198.419998
    2025-06-17 197.199997 198.389999 195.210007 195.639999    38856200    195.639999
    2025-06-18 195.940002 197.570007 195.070007 196.580002    45350400    196.580002
    

    .

    🌲 env

    env ใช้กำหนด environment ที่ใช้เก็บข้อมูล ซึ่งโดย default, getSymbols() จะโหลดข้อมูลไว้ใน global environment

    ในการใช้ env กำหนด environment ที่ต้องการ เราจะต้องเริ่มจากสร้าง environment ขึ้นมาก่อนด้วย new.env():

    # Create a new environment
    my_env <- new.env()
    

    จากนั้น โหลดข้อมูลเข้าไปใน environment ใหม่:

    # Load data into the environment
    getSymbols("AAPL", env = my_env)
    

    เราสามารถดูตัวแปรที่เก็บไว้ใน environment ได้ด้วย ls():

    # List all variables in environment
    ls(envir = my_env)
    

    และดูข้อมูลได้ด้วย $ เช่น:

    # Show Apple data
    head(my_env$AAPL)
    

    ผลลัพธ์:

               AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
    2007-01-03  3.081786  3.092143 2.925000   2.992857  1238319600      2.518541
    2007-01-04  3.001786  3.069643 2.993571   3.059286   847260400      2.574442
    2007-01-05  3.063214  3.078571 3.014286   3.037500   834741600      2.556109
    2007-01-08  3.070000  3.090357 3.045714   3.052500   797106800      2.568732
    2007-01-09  3.087500  3.320714 3.041071   3.306071  3349298400      2.782115
    2007-01-10  3.383929  3.492857 3.337500   3.464286  2952880000      2.915256
    

    .

    📆 from, to

    from ใช้กำหนดวันแรกของข้อมูล และ to กำหนดวันสุดท้ายของข้อมูล

    ยกตัวอย่างเช่น เราต้องการโหลดข้อมูล Apple ในเดือนพฤษภาคม 2025:

    # Load data for May 2025
    apple_data_2025_05 = getSymbols("AAPL",
                                    auto.assign = FALSE,
                                    from = "2025-05-01",
                                    to = "2025-05-31")
    
    # Print results
    print("First three records:")
    head(apple_data_2025_05, n = 3)
    print("------------------------------------------------------------------------------")
    print("Last three records:")
    tail(apple_data_2025_05, n = 3)
    

    ผลลัพธ์:

    First three records:
               AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
    2025-05-01    209.08    214.56   208.90     213.32    57365700      213.0406
    2025-05-02    206.09    206.99   202.16     205.35   101010600      205.0811
    2025-05-05    203.10    204.10   198.21     198.89    69018500      198.6295
    ------------------------------------------------------------------------------
    Last three records:
               AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
    2025-05-28    200.59    202.73   199.90     200.42    45339700        200.42
    2025-05-29    203.58    203.81   198.51     199.95    51396800        199.95
    2025-05-30    199.37    201.96   196.78     200.85    70819900        200.85
    

    Note: ตลาดหุ้นวันสุดท้ายของเดือนพฤษภาคม 2025 คือ 30 พฤษภาคม ทำให้ข้อมูลสิ้นสุด ณ วันที่ 30


    2️⃣ Advanced: Set Defaults

    จะเห็นว่า getSymbols() การตั้งค่าที่หลากหลาย

    ทั้งนี้ quantmod มี 6 functions ที่ใช้ร่วมกับ getSymbols() เพื่อช่วยลดขั้นตอนในการตั้งค่าต่าง ๆ ได้แก่:

    1. getDefaults() และ setDefaults()
    2. getSymbolLookup() และ setSymbolLookup()
    3. saveSymbolLookup() และ loadSymbolLookup()

    เราไปดูวิธีการใช้งานทั้ง 6 functions กัน

    .

    🌍 getDefaults(), setDefaults()

    getDefaults() ใช้สำหรับดูค่า default ของ getSymbols()

    ส่วน setDefaults() ใช้สำหรับกำหนดค่า default

    ยกตัวอย่างเช่น เราต้องการกำหนด:

    • src จาก "yahoo" เป็น "FRED"
    • auto.assign จาก TRUE เป็น FALSE

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

    # Get defaults before changing
    print("Defaults (before):")
    getDefaults(getSymbols)
    
    # Set defaults
    setDefaults(getSymbols,
                src = "FRED",
                auto.assign = FALSE)
     
    # Get defaults after changing
    print("Defaults (after):")
    getDefaults(getSymbols)
    

    ผลลัพธ์:

    Defaults (before):
    NULL
    
    Defaults (after):
    $src
    [1] "'FRED'"
    
    $auto.assign
    [1] FALSE
    

    ตอนนี้ ถ้าเราเรียกใช้ getSymbols() โดยไม่กำหนด src และ auto.assign ทั้งสอง arguments นี้จะเป็น "FRED" และ FALSE ตามลำดับ

    ถ้าเราต้องการ reset ค่า default ให้เราใส่ NULL ใน setDefaults():

    # Reset defaults
    setDefaults(getSymbols,
                src = NULL,
                auto.assign = NULL)
    
    # Check defaults after resetting
    print("Defaults (reset):")
    getDefaults(getSymbols)
    

    ผลลัพธ์:

    Defaults (reset):
    NULL
    

    .

    💹 setSymbolLookup(), getSymbolLookup()

    getSymbolLookup() และ setSymbolLookup() ทำงานเหมือนกับ getDefaults() และ setDefaults() แต่เป็นการตั้งค่า default สำหรับข้อมูลแต่ละตัว (แทนระดับ global) ภายใน session เท่านั้น

    ยกตัวอย่างเช่น เราต้องการกำหนดให้ดึงข้อมูลหุ้น Google มาจาก Google Finance:

    # Set default for Google
    setSymbolLookup(GOOG = list(src = "google"))
    
    # Get new defaults
    getSymbolLookup()
    

    ผลลัพธ์:

    $GOOG
    $GOOG$src
    [1] "google"
    

    Note: Google Finance หยุดให้ข้อมูลกับ quantmod เมื่อปี 2018 ทำให้ตอนนี้ เราไม่สามารถใช้ src = "google" ได้อีก

    เราสามารถ reset ค่า default ได้โดยใส่ NULL เหมือนเดิม:

    # Reset defaults
    setSymbolLookup(NULL)
    
    # Get defaults after resetting
    getSymbolLookup()
    

    ผลลัพธ์:

    named list()
    

    .

    💾 saveSymbolLookup(), loadSymbolLookup()

    ค่าที่เราใช้ setSymbolLookup() กำหนดจะถูก reset ทุกครั้งที่เราปิด session ไป

    ถ้าเราต้องการเก็บค่าเพื่อไปใช้ใน session อื่น เราสามารถใช้ saveSymbolLookup() และ loadSymbolLookup() ช่วยได้:

    • saveSymbolLookup() บันทึกค่าเก็บไว้ในไฟล์ RDS
    • loadSymbolLookup() โหลดค่าที่เก็บไว้ใน RDS

    ตัวอย่าง code:

    # Save defaults
    saveSymbolLookup(file = "symbols.rds")
    
    # Load defaults
    loadSymbolLookup(file = "symbols.rds")
    

    3️⃣ View Columns

    หลังจากเราโหลดข้อมูลมาแล้ว เราสามารถดูข้อมูลแต่ละ column ได้ด้วย 7 functions หลัก ดังนี้:

    No.FunctionFor
    1Op()ราคาเปิด
    2Hi()ราคาสูงสุด
    3Lo()ราคาต่ำสุด
    4Cl()ราคาปิด
    5Ad()ราคาปรับปรุง
    6Vo()ปริมาณการซื้อขาย
    7OHLC()ราคาเปิด, สูงสุด, ต่ำสุด, และราคาปิด

    ตัวอย่างเช่น ดูราคาเปิด:

    # Get opening price
    Op(AAPL)
    

    ผลลัพธ์:

                AAPL.Open
    2007-01-03   3.081786
    2007-01-04   3.001786
    2007-01-05   3.063214
    2007-01-08   3.070000
    2007-01-09   3.087500
    2007-01-10   3.383929
    2007-01-11   3.426429
    2007-01-12   3.378214
    2007-01-16   3.417143
    2007-01-17   3.484286
           ...           
    2025-06-05 203.500000
    2025-06-06 203.000000
    2025-06-09 204.389999
    2025-06-10 200.600006
    2025-06-11 203.500000
    2025-06-12 199.080002
    2025-06-13 199.729996
    2025-06-16 197.300003
    2025-06-17 197.199997
    2025-06-18 195.940002
    

    ดูราคาสูงสุด:

    # Get highest price
    Hi(AAPL)
    

    ผลลัพธ์:

                AAPL.High
    2007-01-03   3.092143
    2007-01-04   3.069643
    2007-01-05   3.078571
    2007-01-08   3.090357
    2007-01-09   3.320714
    2007-01-10   3.492857
    2007-01-11   3.456429
    2007-01-12   3.395000
    2007-01-16   3.473214
    2007-01-17   3.485714
           ...           
    2025-06-05 204.750000
    2025-06-06 205.699997
    2025-06-09 206.000000
    2025-06-10 204.350006
    2025-06-11 204.500000
    2025-06-12 199.679993
    2025-06-13 200.369995
    2025-06-16 198.690002
    2025-06-17 198.389999
    2025-06-18 197.570007
    

    ดูราคาต่ำสุด:

    # Get lowest price
    Lo(AAPL)
    

    ผลลัพธ์:

                 AAPL.Low
    2007-01-03   2.925000
    2007-01-04   2.993571
    2007-01-05   3.014286
    2007-01-08   3.045714
    2007-01-09   3.041071
    2007-01-10   3.337500
    2007-01-11   3.396429
    2007-01-12   3.329643
    2007-01-16   3.408929
    2007-01-17   3.386429
           ...           
    2025-06-05 200.149994
    2025-06-06 202.050003
    2025-06-09 200.020004
    2025-06-10 200.570007
    2025-06-11 198.410004
    2025-06-12 197.360001
    2025-06-13 195.699997
    2025-06-16 196.559998
    2025-06-17 195.210007
    2025-06-18 195.070007
    

    ดูราคาปิด:

    # Get closing price
    Cl(AAPL)
    

    ผลลัพธ์:

               AAPL.Close
    2007-01-03   2.992857
    2007-01-04   3.059286
    2007-01-05   3.037500
    2007-01-08   3.052500
    2007-01-09   3.306071
    2007-01-10   3.464286
    2007-01-11   3.421429
    2007-01-12   3.379286
    2007-01-16   3.467857
    2007-01-17   3.391071
           ...           
    2025-06-05 200.630005
    2025-06-06 203.919998
    2025-06-09 201.449997
    2025-06-10 202.669998
    2025-06-11 198.779999
    2025-06-12 199.199997
    2025-06-13 196.449997
    2025-06-16 198.419998
    2025-06-17 195.639999
    2025-06-18 196.580002
    

    ดูราคาปรับปรุง:

    # Get adjusted price
    Ad(AAPL)
    

    ผลลัพธ์:

               AAPL.Adjusted
    2007-01-03      2.518541
    2007-01-04      2.574442
    2007-01-05      2.556109
    2007-01-08      2.568732
    2007-01-09      2.782116
    2007-01-10      2.915256
    2007-01-11      2.879192
    2007-01-12      2.843727
    2007-01-16      2.918261
    2007-01-17      2.853645
           ...              
    2025-06-05    200.630005
    2025-06-06    203.919998
    2025-06-09    201.449997
    2025-06-10    202.669998
    2025-06-11    198.779999
    2025-06-12    199.199997
    2025-06-13    196.449997
    2025-06-16    198.419998
    2025-06-17    195.639999
    2025-06-18    196.580002
    

    ดูปริมาณการซื้อขาย:

    # Get volume
    Vo(AAPL)
    

    ผลลัพธ์:

               AAPL.Volume
    2007-01-03  1238319600
    2007-01-04   847260400
    2007-01-05   834741600
    2007-01-08   797106800
    2007-01-09  3349298400
    2007-01-10  2952880000
    2007-01-11  1440252800
    2007-01-12  1312690400
    2007-01-16  1244076400
    2007-01-17  1646260000
           ...            
    2025-06-05    55126100
    2025-06-06    46607700
    2025-06-09    72862600
    2025-06-10    54672600
    2025-06-11    60989900
    2025-06-12    43904600
    2025-06-13    51447300
    2025-06-16    43020700
    2025-06-17    38856200
    2025-06-18    45350400
    

    ดูราคาเปิด, สูงสุด, ต่ำสุด, และราคาปิด:

    # Get all price
    OHLC(AAPL)
    

    ผลลัพธ์:

                AAPL.Open  AAPL.High   AAPL.Low AAPL.Close
    2007-01-03   3.081786   3.092143   2.925000   2.992857
    2007-01-04   3.001786   3.069643   2.993571   3.059286
    2007-01-05   3.063214   3.078571   3.014286   3.037500
    2007-01-08   3.070000   3.090357   3.045714   3.052500
    2007-01-09   3.087500   3.320714   3.041071   3.306071
    2007-01-10   3.383929   3.492857   3.337500   3.464286
    2007-01-11   3.426429   3.456429   3.396429   3.421429
    2007-01-12   3.378214   3.395000   3.329643   3.379286
    2007-01-16   3.417143   3.473214   3.408929   3.467857
    2007-01-17   3.484286   3.485714   3.386429   3.391071
           ...                                            
    2025-06-05 203.500000 204.750000 200.149994 200.630005
    2025-06-06 203.000000 205.699997 202.050003 203.919998
    2025-06-09 204.389999 206.000000 200.020004 201.449997
    2025-06-10 200.600006 204.350006 200.570007 202.669998
    2025-06-11 203.500000 204.500000 198.410004 198.779999
    2025-06-12 199.080002 199.679993 197.360001 199.199997
    2025-06-13 199.729996 200.369995 195.699997 196.449997
    2025-06-16 197.300003 198.690002 196.559998 198.419998
    2025-06-17 197.199997 198.389999 195.210007 195.639999
    2025-06-18 195.940002 197.570007 195.070007 196.580002
    

    4️⃣ Visualise Data

    สุดท้าย เราสามารถสร้างกราฟเพื่อสำรวจข้อมูล โดยใช้ 2 functions ได้แก่:

    1. autoplot() จาก ggplot2 package
    2. chartSeries() จาก quantmod package

    ยกตัวอย่างเช่น สำรวจราคาปิดของ Apple:

    # Import ggplots
    library(ggplot2)
    
    # Visualise with autoplot()
    autoplot(Cl(AAPL),
             ts.colour = "darkgreen") +
    
      # Add text
      labs(title = "AAPL Closing Price (Jan 2007 – Jun 2025)",
           x = "Time",
           y = "Price (USD)")
    

    ผลลัพธ์:

    # Visualise with chartSeries()
    chartSeries(Cl(AAPL))
    

    ผลลัพธ์:


    💪 Summary

    ในบทความนี้ เราได้ดูวิธีการทำงานกับ getSymbols() เพื่อโหลดข้อมูลจากการเงินจากแหล่งต่าง ๆ กัน

    ตอนนี้ เรารู้จักกับ 5 parametres หลักของ getSymbols():

    1. Symbols
    2. src
    3. auto.assign
    4. env
    5. from และ to

    วิธีตั้งค่า default ด้วย 3 คู่ functions:

    1. getDefaults() และ setDefaults()
    2. getSymbolLookup() และ setSymbolLookup()
    3. saveSymbolLookup() และ loadSymbolLookup()

    วิธีดูข้อมูลด้วย 7 functions:

    1. Op()
    2. Hi()
    3. Lo()
    4. Cl()
    5. Ad()
    6. Vo()
    7. OHLC()

    และสุดท้าย วิธีสร้างกราฟด้วย 2 functions:

    1. autoplot()
    2. chartSeries()

    😺 GitHub

    ดู code ทั้งหมดในบทความนี้ได้ที่ GitHub


    📃 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:

  • Building Wealth: สรุป 5 กลุ่มแนวคิดในการสร้างความมั่งคั่ง (Wealth) อย่างยั่งยืน จากหนังสือ The Almanack of Naval Ravikant โดย Eric Jorgenson — What Is Wealth, How to Build Wealth, What to Build Wealth With, Why Seek Wealth, และข้อคิดอื่น ๆ

    Building Wealth: สรุป 5 กลุ่มแนวคิดในการสร้างความมั่งคั่ง (Wealth) อย่างยั่งยืน จากหนังสือ The Almanack of Naval Ravikant โดย Eric Jorgenson — What Is Wealth, How to Build Wealth, What to Build Wealth With, Why Seek Wealth, และข้อคิดอื่น ๆ

    Naval Ravikant เป็นนักลงทุนชาวอเมริกันที่ประสบความสำเร็จจากการลงทุนในบริษัทอย่าง Uber, Foursquare, และ Twitter (X) และเป็น CEO ของ AngelList บริษัทที่เชื่อม startup กับ angel investor

    หนังสือ The Almanack of Naval Ravikant โดย Eric Jorgenson รวบรวมข้อคิดเกี่ยวกับความมั่งคั่ง (wealth) และความสุข (happiness) ผ่านการสัมภาษณ์และ tweet ของ Naval

    ในบทความนี้ เราจะมาสรุปเนื้อหา Building Wealth ซึ่งเป็นบทแรกจาก 5 บทในหนังสือ และพูดถึงเรื่องการสร้างความมั่งคั่งอย่างยั่งยืน

    บทความนี้แบ่งออกเป็น 5 ส่วน ได้แก่:

    1. Intro to wealth
    2. How to build wealth right
    3. What to build wealth with
    4. Why seek wealth?
    5. Additional tips on life of wealth

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


    หน้าปกหนังสือ The Almanack of Naval Ravikant บน Amazon

    1. 🏦 1. Intro to Wealth
    2. 😎 2. How to Build Wealth Right
      1. 🎁 2.1 Productise Yourself
      2. 🧠 2.2 Earn With Mind, Not Time
      3. 🎲 2.3 Luck
    3. 🏗️ 3. What to Build Wealth With
      1. ⚡ 3.1 Specific Knowledge
      2. 🧰 3.2 Leverage
      3. 🫡 3.3 Accountability
      4. 🏪 3.4 Equity
      5. 🪙 3.5 Compound Interest
    4. 🕊️ 4. Why Seek Wealth?
    5. 💡 5. Additional Tips on Life of Wealth
      1. ⌚ 5.1 Value Your Time
      2. 🚨 5.2 Avoid Ruin
      3. 🏆 5.3 Early Success
    6. 💰 Summary
    7. 🔥 Get The Almanack of Naval Ravikant

    🏦 1. Intro to Wealth

    Seek wealth, not money or status.

    — Naval Ravikant

    เราควรมองหา wealth ไม่ใช่ money หรือ status

    • Wealth = asset ที่สร้างรายได้ให้เราในขณะที่กำลังหลับ
    • Money = สื่อที่เราใช้เคลื่อนย้าย wealth
    • Status = สถานะทางสังคมที่บอกว่า เราอยู่สูงหรือต่ำขนาดไหน

    Why not money?

    Money สร้างความสุขให้เราไม่ได้ สิ่งเดียวที่ money แก้ได้ คือ ช่วยจัดการอุปสรรคที่ขัดขวางเส้นทางสู่ความสุขของเรา

    Money ทำให้เรามีกินมีใช้และสามารถใช้จ่ายในสิ่งที่เราต้องการได้ แต่สิ่งเหล่านี้ไม่ได้ใช่ความสุขที่เราตามหา

    Why not status?

    การต่อสู้เพื่อ status (อย่างการเล่นการเมือง) เป็น zero-sum game นั่นคือ ต้องมีฝ่ายแพ้และฝ่ายชนะ (-1, +1) ทำให้ในภาพรวม ไม่มีอะไรที่เปลี่ยนแปลงไปในทางที่ดีขึ้น

    ความสัมพันธ์ที่ดีควรเป็น win-win ที่ทุกฝ่ายได้ผลประโยชน์ร่วมกันในระยะยาว

    Why wealth?

    Wealth สามารถสร้างรายได้ให้เราได้ในระยะยาว เพราะ wealth สามารถทำรายได้ให้กับเราแม้ในขณะที่เรากำลังหลับ

    เราควรมองหา wealth เช่น โรงงาน ธุรกิจ หนังสือ โค้ด มากกว่า money และ status


    😎 2. How to Build Wealth Right

    แนวทางการสร้าง wealth อย่างยั่งยืนมีอยู่ 3 ข้อ ได้แก่:

    1. Productise yourself
    2. Earn with mind, not time
    3. Luck

    .

    🎁 2.1 Productise Yourself

    Productize Yourself

    — Naval Ravikant

    Productise yourself หมายถึง การพัฒนาตัวให้เป็น product ที่เป็นที่ต้องการของสังคม

    เราจะ productise ตัวเองได้สำเร็จเมื่อเราสามารถสร้างสิ่งที่:

    1. มีเอกลักษณ์เฉพาะตัว (unique/authentic)
    2. เป็นสิ่งที่สังคมต้องการ แต่ไม่รู้จะหามาได้ยังไง (เพราะถ้าหาได้ สังคมจะไม่ต้องการเรา)

    เมื่อเราสามารถทำ 2 อย่างนี้ได้ สังคมก็จะตอบแทนเรา (ด้วยเงิน)

    .

    🧠 2.2 Earn With Mind, Not Time

    Earn with your mind, not your time.

    — Naval Ravikant

    เราควรหารายได้ด้วยความคิด (mind) ไม่ใช่เวลา (time)

    เวลาเป็น resource ที่มีอยู่อย่างจำกัดและไม่สามารถหาเพิ่มได้ ถ้าเราผูกติดรายได้กับเวลา เราจะไม่มีทางมีอิสระทางการเงิน

    การผูกรายได้กับเวลา หมายถึง เราจะต้องใช้เวลาแลกกับรายได้ และเราจะไม่มีรายได้ถ้าเราไม่มีเวลา

    เช่น เราจะได้เงินเดือนก็ต่อเมื่อเราทำงานครบ 1 เดือน และถ้าเดือนนั้นเราขาดงาน รายได้ของเราก็จะหายไป 1 เดือน

    Time -> Money
    Time -> Money

    หนทางในการสร้างความมั่นคง คือ เราจะต้องแยกรายได้ออกจากเวลา และหารายได้จากความคิด ไม่ใช่เวลา

    Time Mind -> Money

    ในขณะที่เวลามีอยู่อย่างจำกัด ความคิดของเราไม่มีที่สิ้นสุด และเราสามารถพัฒนาความคิดของเราให้ดีขึ้นเรื่อย ๆ ได้ ซึ่งทำให้เราสามารถหารายได้มากขึ้นเรื่อย ๆ ได้

    เมื่อเราหารายได้ด้วยความคิด ไม่ใช่เวลา รายได้ของเราจะไม่ถูกจำกัดอีกต่อไป

    Earn with your mind, not your time (source: The Almanack of Naval Ravikant)

    .

    🎲 2.3 Luck

    You put yourself in a position to capitalize on luck or to attract luck when nobody else created the opportunity for themselves.

    — Naval Ravikant

    Luck เป็นสิ่งที่เราควบคุมไม่ได้ และถ้าเราอยากสร้าง wealth อย่างมั่นคง เราควรตัด luck ออกจากสมการของเรา

    Naval มองว่า luck มีอยู่ 4 ประเภท:

    1. Blind luck: luck ที่เกิดขึ้นโดยความบังเอิญ เช่น ถูกหวย
    2. Luck from persistence: luck ที่เกิดจากความเพียร เราจะพบ luck ประเภทนี้ได้เมื่อเราทำงานหนักหรือใส่ความพยายามไปกับสิ่งใดสิ่งหนึ่งเป็นเวลานาน
    3. Luck from spotting: luck ที่เกิดจากการที่เราพัฒนาทักษะในการสังเกตเห็นโอกาสต่าง ๆ ในชีวิต ทำให้เราพบเจอ luck ได้มากกว่าคนอื่น
    4. Luck that finds you: luck ที่เข้ามาหาเราเองเพราะเราพัฒนาตัวเองให้เป็นที่ต้องการของสังคม (productise yourself)

    Luck ประเภทสุดท้ายเป็น luck ที่คาดเดาได้มากที่สุด เพราะเป็น luck ที่เกิดจากตัวเองเรา

    ถ้าเราอยากสร้าง wealth เราควรตัด luck ออกจากสมการโดยการพัฒนาตัวเองจน luck วิ่งเข้ามาหาเราเอง


    🏗️ 3. What to Build Wealth With

    สิ่งที่เราควรมีเพื่อสร้าง wealth อย่างยั่งยืนมีอยู่ 5 อย่าง ได้แก่:

    1. Specific knowledge
    2. Leverage
    3. Accountability
    4. Equity
    5. Compound interest

    .

    ⚡ 3.1 Specific Knowledge

    No one can compete with you on being you.

    — Naval Ravikant

    Specific knowledge คือ ความรู้/ความสามารถเฉพาะตัว

    Specific knowledge เป็นสิ่งที่ทำให้เราแตกต่างจากคนอื่น และทำให้เราสามารถสร้างสิ่งที่สังคมต้องการแต่ยังไม่รู้ว่าจะหามาได้ยังไง เพราะสิ่งนั้นมีแต่เราที่รู้/ทำได้

    Specific knowledge เกิดมาจาก 3 ส่วน ได้แก่:

    1. Innate trait: ลักษณะที่ติดตัวเรามาตั้งแต่เกิด
    2. Passion: ความชอบ/ความหลงใหล
    3. Experience: ประสบการณ์ชีวิต

    What’s your specific knowledge?

    แต่ละคนมี specific knowledge ที่ไม่เหมือนใคร เราสามารถสังเกต specific knowledge ของเราได้โดยมองหาสิ่งที่:

    • เราทำสำเร็จได้ง่าย ๆ โดยแทบไม่ต้องใช้ความพยายาม
    • ดูเหมือนไม่ใช่ทักษะ แต่คนอื่นมองว่าเป็นความสามารถเฉพาะตัว
    • เรามองว่าเป็นงานอดิเรก เป็นการพักผ่อน แต่คนอื่นมองว่าเป็นงาน

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

    • ทักษะการขาย
    • ชอบเล่นเกม
    • ชอบอ่านหนังสือนิยายวิทยาศาสตร์
    • ทักษะนักสืบชีวิตที่ทำให้เรารู้เรื่องราวของคนรอบข้างได้หมด แม้จะไม่เคยมีใครบอกอะไรกับเราเลย

    How to develop your specific knowledge?

    เราสามารถพัฒนา specific knowledge ได้โดยทำตาม passion มากกว่าการทำตาม trend

    ยกตัวอย่างเช่น ถ้าเราชอบเล่นดนตรี เราควรฝึกเล่นดนตรี แทนที่จะเรียน machine learning ในยุคของ AI (เว้นว่า เราจะชอบ machine learning จริง ๆ)

    การทำตาม passion จะทำให้เราพัฒนา specific knowledge ได้ยั่งยืนกว่า เพราะในขณะที่คนอื่นล้มเลิกความพยายามไปตาม trend เราจะยังคงทำในสิ่งที่เรารักอยู่ ทำให้เราสั่งสมประสบการณ์การและความรู้ได้มากกว่าคนอื่น ๆ

    .

    🧰 3.2 Leverage

    Give me a lever long enough and a place to stand, and I will move the earth.

    — Archimedes

    Leverage คือ สิ่งที่จะขยาย impact ของเรา

    ยกตัวอย่างเช่น ถ้าสัดส่วนระหว่างความพยายามและผลลัพธ์อยู่ที่ 1:1, leverage สามารถทำให้สัดส่วนนี้กลายเป็น 1:2, 1:5, 1:10, 1:1,000, 1:10,000 ได้

    Leverage มีอยู่ 3 ประเภท ได้แก่:

    1. Labour
    2. Capital
    3. Product with no marginal cost of replication

    Labour หรือแรงงานเป็น leverage ที่เก่าแก่ที่สุด แต่ใช้งานยาก เพราะเราต้องมี leadership skill ที่ดี

    Capital หรือเงินทุน เป็น leverage ที่ scale ได้ดี แต่จัดการได้ยาก แต่ใครที่ทำได้จะได้แต้มต่อจากคนอื่นมาก

    Leverage ประเภทสุดท้าย คือ product with no marginal cost of replication

    ในขณะที่ labour และ capital เป็น permission-based leverage เพราะเราจะใช้ได้ก็ต่อเมื่อได้รับความยินยอมจากคนอื่น product with no marginal cost of replication เป็น permissionless leverage เพราะเราสามารถใช้ได้โดยไม่ต้องขอความยินยอมจากใคร

    Product with no marginal cost of replication คือ สิ่งที่เราสามารถสร้างเพิ่มได้โดยใช้ต้นทุนแทบเป็น 0 เช่น:

    • หนังสือ
    • เพลง
    • โค้ด
    • YouTube video

    ในยุคที่เทคโนโลยีพัฒนาอย่างรวดเร็ว ทุกคนสามารถเข้าถึง product with no marginal cost of replication ทุกคนสามารถสร้าง video และ copy ไปโพสต์ตาม platform ต่าง ๆ โดยไม่เสียค่าใช้จ่ายสักบาท และทำให้ตัวเองให้เป็นที่รู้จักไปทั่วโลกได้ในชั่วข้ามคืนได้

    ถ้าอยากจะสร้างความมั่งคั่ง เราควรจะมี leverage ซึ่ง leverage ที่เข้าถึงได้ง่ายที่สุด คือ product with no marginal cost of replication

    .

    🫡 3.3 Accountability

    Clear accountability is important. Without accountability, you don’t have incentives.

    — Naval Ravikant

    Accountability หมายถึง ความรับผิดชอบในงานที่ทำ

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

    แม้จะมีความเสี่ยง แต่เราควรมี accountability ถ้าเราอยากสร้าง wealth เพราะเมื่อเรามี accountability เราก็จะมี credibility ซึ่งทำให้เราสามารถหา leverage อย่าง labour และ capital ได้ขึ้น

    นอกจากนี้ Naval มองว่า accountability ไม่ได้น่ากลัวอย่างที่คิด เพราะคนส่วนใหญ่จะให้อภัยเราถ้าเราทำผิดพลาด แต่แสดงความรับผิดชอบอย่างจริงใจพร้อมความพยายามที่จะแก้ไขให้ดีขึ้น

    ถ้าเราต้องการสร้าง wealth เราควรมี accountability ในสิ่งที่เราทำ

    .

    🏪 3.4 Equity

    You must own equity—a piece of a business—to gain your financial freedom.

    — Naval Ravikant

    นอกจาก specific knowledge, leverage, และ accountability แล้ว ถ้าเราต้องการจะสร้างความมั่งคั่งอย่างยั่งยืน เราจะควรมี equity ด้วย

    Equity เป็นการแสดงความเป็นเจ้าของ (ownership) ใน asset ที่สามารถสร้างรายได้ได้ เช่น:

    • product ต่าง ๆ
    • สินทรัพย์ทางปัญญา
    • ธุรกิจ

    ถ้าเราไม่มี ownership, ความพยายามและผลลัพธ์ที่เราได้จะอยู่ในสัดส่วนที่ 1:1 แต่ถ้ามี equity แล้ว เราจะสามารถเปลี่ยนสัดส่วนให้มากขึ้นได้

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

    ในทางกลับกัน ถ้าคุณหมอเปิดคลินิกเป็นของตัวเอง คุณหมอสามารถมีรายได้เท่าเดิมหรือมากขึ้นในเวลาที่น้อยลง เพราะคลินิกที่มีทั้งบุคลากร เงินทุน และ software (leverage ทั้ง 3 ประเภท) จะสร้างรายได้ให้กับคุณหมอ แม้ในขณะที่คุณหมอกำลังหลับ

    .

    🪙 3.5 Compound Interest

    The combination of those over a long period of time with the magic of compound interest will make you wealthy.

    — Naval Ravikant

    สุดท้าย สิ่งที่เราต้องการเพื่อสร้างความมั่งคั่ง คือ เวลา

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

    เวลาอยู่ข้างเรา ถ้าเราโฟกัสได้ถูกจุด

    99% vs 1%

    99% ของสิ่งที่เราทำเป็นความพยายามที่เสียเปล่า

    ยกตัวอย่างเช่น เราใช้เวลาเกือบครึ่งชีวิตไปกับการเรียน การอ่านหนังสือ การสอบที่ทำให้เราได้ความรู้ที่สุดท้ายเราไม่ได้นำมาใช้จริง

    มีเพียง 1% ของความพยายามทั้งหมดของเราที่จะให้ผลลัพธ์ที่เราต้องการ

    เราจะต้องใช้ความพยายาม 99% เพื่อหา 1% นี้ให้เจอ และเมื่อเจอแล้วให้เราทุ่มสุดตัวไปกับ 1% ที่ว่า เพราะ 1% นี้เป็นสิ่งที่ตอบโจทย์ในชีวิตของเรา

    เมื่อเราลงทุนไปกับสิ่งที่ใช่แล้ว เราเพียงแต่ต้องอดทนและปล่อยให้เวลาทำงาน

    Compound interest in life

    Compound interest เป็นแนวคิดทางการเงินที่ไม่ได้ใช้ได้กับการเงิน แต่ใช้กับด้านอื่น ๆ ของชีวิตอีกด้วย

    Compound interest คือ การที่เราได้ดอกเบี้ยเงินฝากเพิ่มขึ้นทุกปี เพราะในแต่ละปี เงินต้นของเราจะเท่ากับเงินต้น + ดอกเบี้ย ทำให้ดอกเบี้ยในแต่ละปีจะคิดต่อยอดจากดอกเบี้ยปีก่อน ๆ ด้วย

    Compound interest สามารถปรับใช้กับด้านต่าง ๆ ของชีวิตได้ เช่น ความสัมพันธ์

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

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


    🕊️ 4. Why Seek Wealth?

    When you’re finally wealthy, you’ll realize it wasn’t what you were seeking in the first place.

    — Naval Ravikant

    ถึงตอนนี้ เราได้เห็นแนวคิดและวิธีการสร้าง wealth แล้ว แต่เรายังไม่ได้ตอบคำถามที่ว่า ทำไมเราต้องการ wealth?

    แต่ละคนอาจมีเป้าหมายในการมองหา wealth ไม่เหมือนกัน แต่ Naval เชื่อว่า เราตามหา wealth เพื่อ freedom

    Freedom ในมุมมองของ Naval คือ อิสระในทุก ๆ ด้าน เช่น:

    • อิสระในการเลือก: สามารถเลือกทำในสิ่งที่ต้องการ และไม่ทำในสิ่งที่ไม่ต้องการได้
    • อิสระในทางการเงิน: สามารถใช้จ่ายในสิ่งที่ต้องการได้
    • อิสระทางอารมณ์: ไม่ต้องมีความรู้สึกที่ทำลายความสงบทางจิตใจ

    Freedom เป็นเป้าหมายปลายทาง และ wealth เป็นเพียงทางที่จะนำเราไปสู่ freedom

    ตราบใดที่ wealth ยังสร้าง freedom ให้เรา wealth คือทางออก

    แต่เมื่อไรที่ wealth ขัดขวาง freedom ของเรา wealth คือปัญหา


    💡 5. Additional Tips on Life of Wealth

    3 คำแนะนำเพิ่มเติมจาก Naval เกี่ยวกับการใช้ชีวิตอย่างมั่งคั่ง:

    1. Value your time
    2. Avoid ruin
    3. Early success

    .

    ⌚ 5.1 Value Your Time

    Value your time at an hourly rate, and ruthlessly spend to save time at that rate.

    — Naval Ravikant

    เวลาเป็นสิ่งที่มีค่ามากที่สุดของเรา และเราควรจะใช้เวลาอย่างคุ้มค่าที่สุด

    เทคนิคหนึ่งในการจัดการเวลา คือ กำหนด hourly rate

    Hourly rate คือ ราคาค่าตัวต่อชั่วโมงของเรา เราควรตั้ง hourly rate ให้สูงจนน่าตกใจเพื่อที่:

    1. เราจะมีแรงผลักที่จะมุ่งไปข้างหน้า
    2. เราจะรู้จักใช้เวลาอย่างคุ้มค่า

    ยกตัวอย่างเช่น เราตั้ง hourly rate ไว้ที่ 5,000 บาท และถ้าเรากำลังจะใช้เวลา 1 ชั่วโมงไปกับการดู Netflix แสดงว่า เรากำลังจะเสียเงิน 5,000 บาทไปฟรี ๆ เพราะในเวลา 1 ชั่วโมง เราสามารถทำกิจกรรมอื่นที่อาจสร้างรายได้ 5,000 บาทได้

    การตั้ง hourly rate จะช่วยให้เราคำนึงถึงเวลาในการตัดสินใจต่าง ๆ ของเรา และทำให้เราใช้เวลาอย่างคุ้มค่าที่สุด

    .

    🚨 5.2 Avoid Ruin

    The one thing you have to avoid is the risk of ruin.

    — Naval Ravikant

    เราควรหลีกเลี่ยง ruin หรือสิ่งที่จะทำลายชีวิตของเรา เช่น:

    1. Jail: ไม่ทำอะไรที่ผิดกฎหมาย ไม่มีอะไรที่คุ้มค่าพอจะให้เราเข้าไปนอนในคุก
    2. Catastrophic loss: หลีกเลี่ยงการสูญเสียแบบหมดตัว เช่น การเล่นพนัน
    3. Physical danger: อันตรายต่อร่างกายและสุขภาพ

    .

    🏆 5.3 Early Success

    Some of the most successful people I’ve seen in Silicon Valley had breakouts very early in their career.

    — Naval Ravikant

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

    สำหรับคนที่เพิ่งเริ่มต้นชีวิต Naval แนะนำให้ตัดสินใจ 3 อย่างนี้ให้ดี:

    1. Where: เราจะใช้ชีวิตอยู่ที่ไหน สถานที่ที่เราอยู่จะส่งผลต่อแนวทางและเส้นทางชีวิตของเรา
    2. Who: เราจะใช้เวลาไปกับใคร หรือใครที่เราจะมีความสัมพันธ์ด้วย
    3. What: เราจะทำอะไร เช่น จะทำงานอะไร

    เราควรคิดถึง 3 เรื่องนี้ให้ถี่ถ้วนและใน timeframe ระยะยาว เช่น:

    1. Where: จะใช้ชีวิตในเมืองไหน 10 ปี?
    2. Who: จะคบกับใครไปทั้งชีวิต?
    3. What: จะทำงานเดิมกี่ปี 3 ปี? 5 ปี?

    เราควรวางแผนทั้ง 3 สิ่งนี้ให้ดี เพราะการตัดสินใจนี้จะกำหนดเส้นทางชีวิตที่เหลือของเรา


    💰 Summary

    ในบทความนี้ เราสรุปแนวคิดในการสร้าง wealth ในหนังสือ The Almanack of Naval Ravikant

    Intro to wealth: wealth คืออะไร?

    1. Seek wealth, not money or status: ตามมา wealth ไม่ใช่ money หรือ status. Wealth คือ asset ที่สร้างรายได้ให้เราในขณะที่เราหลับ ในขณะที่ money คือ สื่อในการเคลื่อนย้าย wealth และ status คือ สถานะทางสังคมของเรา

    How to build wealth right: แนวทางในการสร้าง wealth อย่างยั่งยืน

    1. Productise yourself: สร้างสิ่งที่สังคมต้องการ แต่ยังไม่รู้ว่าจะหามาได้ยังไง
    2. Earn with mind, not time: สร้างรายได้ผ่านความคิด ไม่ใช่เวลา
    3. Luck: ตัด luck ออกจากสมการสร้าง wealth ด้วยการพัฒนาตัวเองจน luck เข้ามาหาเอง

    What to build wealth with: สิ่งที่เราควรมีเพื่อสร้าง wealth อย่างยั่งยืน

    1. Specific knowledge: ความรู้/ความสามารถเฉพาะตัว
    2. Leverage: สิ่งที่จะขยาย impact ของสิ่งที่เราทำ
    3. Accountability: ความรับผิดชอบในสิ่งที่เราทำ
    4. Equity: ownership ใน asset ที่ช่วยสร้างรายได้ในขณะที่เราหลับ
    5. Compound interest: เวลา

    Why seek wealth?

    1. Freedom: เราตามหา wealth เพื่อ freedom ในชีวิต

    Additional tips: ข้อคิดเพิ่มเติมในการสร้าง wealth

    1. Value your time: กำหนด hourly rate เพื่อรู้จักใช้เวลาอย่างคุ้มค่า
    2. Avoid ruin: หลีกเลี่ยงสิ่งที่จะทำลายชีวิต เช่น jail, catastrophic loss, และ physical danger
    3. Early success: เริ่มตามหาความสำเร็จแต่เนิ่น ๆ และตัดสินใจในเรื่องที่อยู่ ความสัมพันธ์ และสิ่งที่เราจะทำให้ดี

    🔥 Get The Almanack of Naval Ravikant

    สำหรับคนที่สนใจเนื้อหาของหนังสือและอยากอ่านเพิ่มเติม สามารถซื้อหนังสือได้ตาม link ด้านล่าง:

    Note: ใครที่สนใจอ่านต้นฉบับภาษาอังกฤษแบบ e-book หรือ PDF สามารถดาวน์โหลดฟรีได้ที่ navalmanack.com

  • Regular Expressions: เครื่องมือถอดรหัส เพื่อทำงานกับ Text ใน Google Sheets — แนะนำวิธีใช้สูตร REGEXMATCH, REGEXEXTRACT, REGEXREPLACE

    Regular Expressions: เครื่องมือถอดรหัส เพื่อทำงานกับ Text ใน Google Sheets — แนะนำวิธีใช้สูตร REGEXMATCH, REGEXEXTRACT, REGEXREPLACE

    Regular expression หรือ การเขียน pattern เพื่อทำงานกับ text เป็นเหมือนกับเครื่องถอดรหัสที่ช่วยถอดรูปแบบของข้อความ และช่วยให้เราทำงานกับข้อมูลได้ง่ายขึ้น

    ยกตัวอย่างเช่น เรามีข้อมูลลูกค้าที่เก็บค่าไว้ใน cell เดียวกัน:

    แต่เราต้องการแยกข้อมูลเป็น columns เพื่อความสะดวกในการใช้งานต่อ เช่น:

    • ID
    • Name
    • Address

    แทนที่เรา copy-paste ข้อมูลลงทีละ column ด้วยตัวเอง เราสามารถใช้สูตร regular expression ของ Google Sheets ช่วยได้:

    .

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

    1. 3 สูตร Google Sheets ที่ใช้ทำงานกับ regular expression
    2. การเขียน regular expression เพื่อใช้งาน 3 สูตรนี้

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


    1. 👨‍🔬 Intro to REGEX Formulas
    2. ⌨️ Regular Expression Basics
      1. 🔣 (1) Special Characters
      2. 🔣 (2) Character Classes
      3. 🔣 (3) Quantifiers
      4. 🔣 (4) Others
      5. 📃 Learn More
    3. 💪 Put It All Together
      1. 🗝️ (1) REGEXMATCH
      2. 🗝️ (2) REGEXEXTRACT
      3. 🗝️ (3) REGEXREPLACE
    4. 📚 References

    👨‍🔬 Intro to REGEX Formulas

    Google Sheets มี 3 สูตรสำหรับใช้ regular expression ซึ่งได้แก่:

    No.FormulaFor
    1REGEXMATCH()เช็กหาคำที่ตรงกับ regular expression
    2REGEXEXTRACT()ดึงคำที่ตรงกับ regular expression ออกมา
    3REGEXREPLACE()แทนที่คำที่ตรงกับ regular expression

    โดยมีการเขียนดังนี้:

    No.FormulaSyntax
    1REGEXMATCH()REGEXMATCH(text, regular_expression)
    2REGEXEXTRACT()REGEXEXTRACT(text, regular_expression)
    3REGEXREPLACE()REGEXREPLACE(text, regular_expression, replacement)
    • text คือ ข้อมูล text ที่เราจะใช้ทำงาน
    • regular_expression คือ regular expression ที่เราใช้กำหนดเงื่อนไข
    • replacement คือ คำที่จะแทนที่คำที่ตรงกับ regular expression

    .

    ก่อนไปดูการใช้งานจริง เรามาดูหลักการเขียน regular expression เพื่อให้สูตรเหล่านี้ทำงานได้กัน


    ⌨️ Regular Expression Basics

    การเขียน regular expression แบ่งออกได้เป็น 4 กลุ่มหลัก ได้แก่:

    1. Special characters
    2. Character classes
    3. Quantifiers
    4. Others

    .

    🔣 (1) Special Characters

    Regular expression ในกลุ่มนี้ เป็นอักขระพิเศษ โดยมี usage ต่างกันดังนี้:

    No.CharacterForExample
    1^…เริ่มต้นด้วย …^J หมายถึง คำที่ขึ้นต้นด้วย J
    2…$ลงท้ายด้วย …s$ หมายถึง คำที่ลงท้ายด้วย s
    3.แทนอักขระใด ๆ 1 ตัว (ยกเว้นการขึ้นบรรทัดใหม่)c.t ใช้หาคำเช่น cat, cmt, cPt, c7t
    5\\…ใช้บอกว่า … ไม่ใช่ regular expression\\. หมายถึง ให้หาคำที่มี . แทนคำที่มีอักขระใด ๆ

    .

    🔣 (2) Character Classes

    Regular expression ในกลุ่มนี้ ใช้แทนตัวอักษรและตัวเลข:

    No.CharacterForExample
    1[…]จับคู่ตัวอักษร ใน [][ABC] หมายถึง จับคู่คำที่มี A, B, หรือ C
    2[A-Z]จับคู่ตัวอักษร A-Z พิมพ์ใหญ่จะได้คำ เช่น ANT, FGH, QPD, …
    3[a-z]จับคู่ตัวอักษร a-z พิมพ์เล็กจะได้คำ เช่น ant, fgh, qpd, …
    4[A-Za-z]จับคู่ตัวอักษร A-Z พิมพ์เล็กหรือใหญ่ก็ได้จะได้คำ เช่น aNt, Fgh, qpD, …
    5[A-z]จับคู่ตัวอักษร a-z พิมพ์เล็กหรือใหญ่ก็ได้จะได้คำ เช่น aNt, Fgh, qpD, …
    6[0-9]จับคู่ตัวตัวเลข 0-9จะได้คำ เช่น 012, 438, 507, …

    .

    🔣 (3) Quantifiers

    Regular expression ในกลุ่มนี้ ใช้แทนจำนวนตัวอักขระที่ต้องการค้นหา:

    No.CharacterForExample
    1…*จับคู่อักขระ … จำนวนตั้งแต่ 0 ขึ้นไปA* จับคู่คำ เช่น A, An, Ant, ANts, …
    2…+จับคู่อักขระ … จำนวนตั้งแต่ 1 ขึ้นไปA+ จับคู่คำ เช่น An, Ant, ANts, …
    3…?จับคู่อักขระ … จำนวน 0 หรือ 1A? จับคู่คำ เช่น A, An, AT, …
    5…{…}จับคู่อักขระ … ตามจำนวนใน {}.{5} หมายถึง จับคู่อักขระใด ๆ ที่มีความยาว 5 ตัว
    4…{…, …}จับคู่อักขระ … ตามช่วงใน {}.{3, 5} หมายถึง จับคู่อักขระใด ๆ ที่มีความยาว 3 ถึง 5 ตัว

    .

    🔣 (4) Others

    Regular expression อื่น ๆ นอกเหนือ 3 กลุ่มแรก:

    No.CharacterForExample
    1\\wจับคู่ A-Z ทั้งพิมพ์เล็กและใหญ่ หรือตัวเลขก็ได้
    2\\dจับคู่ตัวตัวเลข 0-9
    3\\bจับคู่ word boundary
    4\\nจับคู่ new line
    5\\sจับคู่ blank space
    6(…)จับกลุ่ม regular expression

    .

    📃 Learn More

    เราสามารถ regular expression อื่น ๆ ได้ที่ Syntax for Regular Expressions จาก Google


    💪 Put It All Together

    ตอนนี้ เรารู้จัก 3 สูตร REGEX และการเขียน regular expression แล้ว

    เรามาดูตัวอย่างการใช้งานสูตร REGEX ในการทำงานกัน

    .

    ในตัวอย่าง เรามีข้อมูลพนักงาน 3 columns ได้แก่:

    1. Name
    2. Email
    3. Comment

    Note: สามารถดูต้นฉบับได้ที่ Google Sheets

    .

    🗝️ (1) REGEXMATCH

    สมมุติว่า เราต้องการเช็กว่า ใน comment มีคำว่า “comment” ไหม

    เราสามารถใช้ REGEXMATCH ได้ดังนี้:

    =REGEXMATCH(C3, "[Cc]omment")

    ผลลัพธ์:

    จะเห็นว่า เราได้ค่า TRUE และ FALSE กลับมา:

    • TRUE แสดงว่า text มีคำว่า “comment”
    • FALSE แสดงว่า text ไม่มีคำว่า “comment”

    .

    🗝️ (2) REGEXEXTRACT

    เราต้องการดึงนามสกุลออกจากชื่อ

    เราสามารถใช้ REGEXEXTRACT ช่วยได้:

    =REGEXEXTRACT(A3, "\s([A-z]*)")

    ผลลัพธ์:

    .

    🗝️ (3) REGEXREPLACE

    เราต้องการเปลี่ยนอีเมลของทุกคนให้มี domain (เช่น @example.com และ @adams-mail.net) เป็น @email.com

    เราสามารถใช้ REGEXREPLACE ช่วยได้:

    =REGEXREPLACE(B3, "@[A-z.-]+\.[A-z]{2,}", "@email.com")

    ผลลัพธ์:


    📚 References

  • The Brain Audit Recap: สรุป 3 กลุ่มประเด็น จากงาน The Brain Audit โดย DataRockie ft. Sean D’Souza: วิธีเอาตัวรอดในยุคใหม่ เคล็ดลับ marketing ที่จะทำให้ลูกค้าตัดสินใจซื้อ และ Q&A

    The Brain Audit Recap: สรุป 3 กลุ่มประเด็น จากงาน The Brain Audit โดย DataRockie ft. Sean D’Souza: วิธีเอาตัวรอดในยุคใหม่ เคล็ดลับ marketing ที่จะทำให้ลูกค้าตัดสินใจซื้อ และ Q&A

    ในบทความนี้ เราจะมาสรุปเนื้อหาจาก The Brain Audit ซึ่งเป็น event พิเศษที่พี่ทอย DataRockie จัดขึ้นร่วมกับ Sean D’Souza เจ้าของ one person business “Psychotactics” ซึ่งสอนทักษะทางธุรกิจ เช่น marketing และ copywriting

    Event นี้ประกอบด้วย 3 sessions:

    1. Survive: แนวคิดในการเอาตัวรอดของคนทำงานในยุคนี้ โดย พี่ทอย
    2. Brain Audit: เคล็ดลับการทำ marketing ให้ลูกค้าซื้อ ซึ่งเป็นเนื้อหาบางส่วนจากหนังสือ The Brain Audit โดย Sean
    3. Q&A: session ถามตอบระหว่าง Sean พี่ทอย และผู้เข้าร่วม

    เราไปดูสรุปเนื้อหาในแต่ละ session กัน


    1. ⚔️ Part 1. Survive (P’Toy)
      1. 🎁 1. Productise Yourself
      2. 🦆 2. Be a Generalist
    2. 🧠 Part 2. Brain Audit (Sean D’Souza)
      1. 🧳 1. The Seven Bags Framework
      2. 🔫 2. Trigger
      3. 🎢 3. Keep the Attention
      4. 💬 4. Language
    3. 🤚 Part 3. Q&A (Sean, P’Toy, & the Audience)
    4. 🍩 Bonus
    5. 🤞 Additional Reading
    6. 📖 Expand Your Knowledge

    ⚔️ Part 1. Survive (P’Toy)

    P’Toy (left): ลงบทความทุกสัปดาห์จนพี่ทอยจำชื่อได้ 😆

    ในส่วนนี้ มีเนื้อหา 2 ประเด็นที่น่าสนใจ:

    1. Productise yourself
    2. Be a generalist

    .

    🎁 1. Productise Yourself

    เป้าหมาย คือ การพัฒนาตัวเอง, ไม่ใช่การหาเงิน

    Productise yourself เป็นแนวคิดในการประสบความสำเร็จของ Naval Ravikant ซึ่งหมายถึง การมองและทำตัวเองให้เป็น product ที่โลกต้องการ

    เช่นเดียวกับ product อย่างมือถือและ AI เราจะต้องมีการปรับปรุงและพัฒนาตัวเองอย่างต่อเนื่อง เพื่อตอบโจทย์ความต้องการของสังคม

    ถ้าเราอยากจะอยู่รอด เราควรจะยึดสิ่งนี้เป็นเป้าหมายหลักของเรา มากกว่าการหาเงินให้มากขึ้น

    แม้ในตอนแรกจะฟังดูขัดแย้งกัน แต่จริง ๆ แล้วแนวคิดนี้สอดคล้องกับการเอาตัวรอดในยุคของ AI

    ตัวเรา (หรือจริง ๆ แล้ว คือ สมอง หรือ mind ของเรา) เป็น asset ที่มีค่ามากที่สุด ในการทำงานประจำ (หรืองานออฟฟิศ) เรากำลัง “ขาย” ความรู้และความสามารถที่เรามี ให้กับบริษัทหรือคนที่จ้างงานเรา สิ่งที่เราส่งมอบทำให้ลูกค้าของเราเติบโต และเราก็ได้เงินเป็นค่าตอบแทนกลับมา

    การทำงานแบบนี้ไม่ใช่โมเดลที่ยั่งยืน เพราะ:

    1. คนที่จ้างเราจะเลิกจ้างเราเมื่อไรก็ได้ โดยเฉพาะในยุค AI มีความสามารถมากขึ้นเรื่อย ๆ
    2. และที่สำคัญกว่านั้น นอกจากความรู้และความสามารถแล้ว รายได้ของเรายังผูกอยู่กับเวลาที่เราใส่เข้าไป เราจะได้เงินเดือนก็ต่อเมื่อทำงานเต็ม 1 เดือน และถ้าเราหยุดงานในเดือนนั้นไป เราก็จะไม่ได้เงินเดือนมา

    โมเดลรายได้แบบงานประจำ:

    ✅ We + ✅ Time → ✅ Money

    ✅ We + ❌ Time → ❌ Money

    โมเดลทางรอดที่ดีกว่า คือ การใช้สมองของเราสร้าง creative artefact เช่น หนังสือ, โค้ด, วิดีโอ และ asset อื่น ๆ ที่สามารถส่งมอบคุณค่าให้กับโลกและสร้างรายได้ให้เราในระหว่างที่เราหลับ ซึ่งจะช่วยตัดเวลาออกจากสมการรายได้ของเรา:

    We → Creative artefact → Value → Money

    ในโมเดลนี้ ตัวเราเป็นต้นทางของทุกอย่าง ถ้าเราอยากจะได้สร้างรายได้ (money) มากขึ้น เราจะต้องส่งมอบคุณค่า (value) ที่ดีขึ้น ซึ่งหมายถึงการสร้าง creative artefact ที่ดีขึ้น และตัวเราจะมีความรู้ความสามารถที่มากขึ้น

    เมื่อเรามีความรู้ความสามารถที่มากขึ้นแล้ว creative artefact ก็จะมีคุณภาพมากขึ้น สามารถส่งต่อคุณค่าได้ดีขึ้น และรายได้ก็จะมากขึ้นตามไปด้วย

    ดังนั้น ถ้าเราอยากจะอยู่รอดในยุคนี้ เราควรจะโฟกัสกับการพัฒนาตัวเอง มากกว่าการหาเงินให้มากขึ้น เพราะเมื่อเราพัฒนาตัวเองให้เก่งขึ้น เงินก็จะตามมาเอง

    Better yourself, not money

    .

    🦆 2. Be a Generalist

    หนทาง คือ การเป็น "เป็ด"

    (Note: ในสรุปส่วนนี้ ผมได้ใส่ข้อมูลและความคิดเห็นเพิ่มเติมลงไปด้วย)

    Generalist คือ การทำตัวเองเป็น “เป็ด” หรือสามารถทำได้หลายอย่าง แต่อาจทำได้ไม่สุดสักอย่าง ซึ่งตรงข้ามกับ specialist หรือผู้เชี่ยวชาญที่มีความสามารถเฉพาะด้าน

    ก่อนวันงาน The Brain Audit ไม่กี่วัน CK Cheong ซึ่งเป็น CEO ของ Fastwork ออกมาแสดงความเห็นว่า ความต้องการคนที่เป็นเป็ดกำลังลดลง โดยเฉพาะตอนนี้ที่ทุกคนมี AI ซึ่งเป็นเป็ดที่เก่งทุกด้านอยู่ในกระเป๋าอยู่แล้ว

    มุมมองของ CK Cheong ต่อการเป็น generalist (source: TNN Tech)

    ในมุมนี้ CK Cheong อาจมีส่วนที่สอดคล้องกับความเป็นจริงอยู่บ้าง เพราะถ้าเราดูรายละเอียดประกาศรับสมัครงานต่าง ๆ เราจะเห็นได้ว่า บริษัทต้องการคนที่มีความรู้ความสามารถอยู่ไม่กี่ด้าน

    ยกตัวอย่างเช่น ประกาศงานตำแหน่ง Data Analyst ของ AIS ที่ต้องการคนที่ทักษะดังนี้:

    • ความรู้เลขและสถิติ
    • การเขียนโค้ดอย่าง SQL
    • เครื่องมือ analytics อย่าง Tableau
    • ความรู้เรื่อง big data
    • ความรู้เรื่อง cloud

    จะเห็นได้ว่า ทักษะที่ AIS ต้องการจำกัดวงอยู่แค่ data analyst คนที่มีความสามารถอื่น ๆ เช่น ตัดต่อวิดีโอ เล่นกีต้าร์ หรือวาดรูป อาจไม่ได้รับการพิจารณาเป็นพิเศษ เพราะไม่ใช่ทักษะที่จะช่วยบริษัทแก้ปัญหาได้ คนเหล่านี้จะยังถูกประเมินตามความสามารถในประกาศงาน และถ้าคนเหล่านี้เป็น “เป็ด” ตามนิยามของ CK Cheong คือ รู้กว้างแต่ไม่รู้ลึก ก็จะสู้คนที่เป็น specialist ที่รู้ลึกรู้จริงไม่ได้ และมีโอกาสได้งานน้อยกว่า specialist

    อย่างไรก็ตาม ผมเห็นด้วยกับพี่ทอยที่เป็น “pro generalist” ว่า การเป็น generalist ยังเป็นทางรอดสำหรับคนทำงานในยุคนี้

    จริงอยู่ว่า ผู้จ้างงานจะมองหา specialist เวลารับสมัครพนักงาน แต่ในมุมมองคนหางานแล้ว เราควรเป็น generalist ด้วยเหตุผล 3 ข้อ:

    ข้อที่ 1. Generalist มีตัวเลือกมากกว่า specialist

    ถ้าเราเก่งด้านใดด้านหนึ่งอย่างเดียว หมายความว่า เราจะรับงานได้เฉพาะงานที่ตรงกับทักษะเดียวของเรา

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

    ข้อ 2. Generalist ชนะใน long run

    แม้ว่า generalist มักจะแพ้ specialist ใน domain ของ specialist เอง (เช่น เขียนโค้ดสู้กับ programmer ไม่ได้) แต่ generalist จะชนะในอีกหลาย ๆ ด้าน เพราะแม้จะรู้ไม่สุด แต่ก็มีความรู้เพียงพอที่จะทำงานให้สำเร็จได้ (เช่น ตัดต่อวิดีโอได้ ทำให้สามารถสร้างเปิดช่อง YouTube ของตัวเองได้)

    ข้อที่ 3. Generalist is a niche

    ที่สำคัญที่สุด การเป็น generalist หมายถึง การสร้างแตกต่างให้กับตัวเอง เพราะเราสามารถ “stack” หรือผสมทักษะต่าง ๆ ที่เรามีอยู่หลากหลาย ให้เกิดเป็นผลงานที่ไม่มีใครเหมือน สร้างความแตกต่างให้กับตัวเรา ทำให้เราไม่ต้องแข่งขันกับใคร

    ยกตัวอย่างเช่น บุคคลที่ประสบความสำเร็จจาก skill stacking:

    • Scott Adams ที่ประสบความสำเร็จจากการ์ตูนตลกเสียดสีสังคมเรื่อง Dilbert ซึ่งเกิดการผสมทักษะการวาดรูป + ความรู้ธุรกิจ + อารมณ์ขัน
    • Dan Koe เจ้าของ one-person business ที่ประสบความสำเร็จจากการสร้าง content โดยผสมทักษะการเขียน + ปรัชญา + ความรู้ธุรกิจ
    • พี่ทอย เจ้าของ DataRockie School ที่เป็นที่รู้จักในฐานะนักธุรกิจและ generalist (ของแทร่ 555+) ซึ่งสร้างความสำเร็จด้วยการผสมทักษะ data + การเขียน + marketing + และอีกมากมาย
    • Sean D’Souza เจ้าของ Psychotactics ธุรกิจที่ทำด้วยตัวเองและประสบความสำเร็จมายาวนานต่อเนื่อง 25 ปี ด้วยการผสมทักษะวาดการ์ตูน + marketing + การเขียน

    ดังนั้น แม้ว่าสังคมอาจมีความต้องการ generalist น้อยลง แต่การเป็น generalist ยังคงเป็นทางเลือกในการอยู่รอดในปัจจุบัน


    🧠 Part 2. Brain Audit (Sean D’Souza)

    Sean D’Souza (right): ขอลายเซ็น Sean 3 ครั้งในวันเดียวจน Sean จำหน้าได้ 😂

    ในส่วนนี้ Sean มาแชร์ความรู้ในการทำ marketing ซึ่งแบ่งได้เป็น 4 ประเด็น ได้แก่:

    1. The Seven Bags Framework
    2. Trigger
    3. Keep the attention
    4. Language

    .

    🧳 1. The Seven Bags Framework

    ลูกค้าจะซื้อก็ต่อเมื่อได้ข้อมูลครบทุกใบ

    เหตุผลหนึ่งที่ทำให้ลูกค้ายังไม่ตัดสินใจซื้อ คือ ลูกค้ายังมีข้อมูลไม่เพียงพอในการตัดสินใจ

    ดังนั้น ถ้าเราต้องการให้ลูกค้าซื้อของ หน้าที่หลักของเรา คือ การให้ข้อมูลที่เพียงพอในการตัดสินใจกับลูกค้า ซึ่งเราสามารถทำได้โดยใช้ The Brain Audit framework ที่มี 7 ส่วน:

    1. Problem
    2. Solution
    3. Target profile
    4. Objection
    5. Testimonials
    6. Risk
    7. Uniqueness

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

    Seven Red Bags

    ใน session, Sean พูดถึงกระเป๋า 3 ใบแรก ซึ่งเรียกรวมกันว่า trigger (สำหรับใบอื่น ๆ สามารถตามอ่านรายละเอียดกันได้ในหนังสือ The Brain Audit)

    .

    🔫 2. Trigger

    Trigger = Problem + Solution + Target profile

    Trigger คือ สิ่งที่จะกระตุ้นให้ลูกค้าหันมาสนใจเรา เพื่อที่เราจะสามารถส่งสารที่เหลือให้กับลูกค้าได้

    Trigger ประกอบด้วยกระเป๋า 3 ใบแรกในสายพานซึ่งได้แก่:

    1. Problem
    2. Solution
    3. Target profile

    ใบที่ 1. Problem หมายถึง สิ่งที่เปลี่ยนแปลงไปในทางที่แย่ลง เช่น:

    • ขับรถเล่นอยู่ดี ๆ แล้วถูกตำรวจเรียกให้จอด
    • เดินเล่นอยู่ดี ๆ แล้วเหยียบ dog poop ที่น้องหมาทิ้งไว้
    • ใส่เสื้อสีขาวตัวใหม่ แต่มีอะไรหยดใส่เป็นรอย

    Problem เป็นภาษาของสมอง และเป็นสิ่งที่จะทำให้ลูกค้าหันมาสนใจเรา สิ่งที่คนส่วนใหญ่มักทำพลาด คือ พูดถึงคุณประโยชน์ของ product/service โดยไม่เริ่มจาก problem ซึ่งจะทำให้ลูกค้าตัดสินใจซื้อไม่ได้ เพราะไม่เห็นความเชื่อมโยงระหว่าง product/service และตัวเอง

    ใบที่ 2. Solution คือ ประโยชน์ที่ product/service เราจะส่งมอบให้เพื่อแก้ปัญหาให้กับลูกค้า

    ใบที่ 3. Target profile คือ profile ของคนคนเดียวใน target audience ของเรา ซึ่งเราจะใช้เป็นต้นแบบในการสร้าง marketing message เพื่อสื่อสารกับลูกค้า

    นั่นคือ แทนที่เราจะเขียน marketing message เพื่อตอบโจทย์คนส่วนมาก เราจะสร้าง message ที่จะส่งถึงคนคนเดียว (target profile) ซึ่งเป็นคนที่มี problem และต้องการ solution ของเรา

    ถ้าเราเจอคนคนนั้นแล้ว ให้เราหาข้อมูลเกี่ยวกับคนคนนี้ เช่น ถามถึงปัญหาที่เจอ ทางเลือกที่มี ภาษาที่ใช้ เพื่อที่เราจะสามารถสร้าง marketing message ที่เข้าถึงคนคนนี้ได้ดีที่สุด

    แม้จะฟังดูแปลก แต่การเขียน message เพื่อคนคนเดียวจะช่วยให้เราสร้าง message ได้ง่ายขึ้น และตอบโจทย์ลูกค้าได้มากขึ้น ซึ่งสุดท้ายจะหมายถึงการที่มีคนสนใจ message ของเรามากขึ้น เพราะเราสามารถสื่อสารได้ตรงจุด

    การเขียน marketing message เพื่อให้เป็น trigger จะต้องประกอบด้วยกระเป๋า 3 ใบนี้ เพื่อทำให้ลูกค้าหันมาสนใจเรา

    ยกตัวอย่างเช่น marketing message ของ solution ที่จะช่วยให้คนน้อยหลับได้ง่ายขึ้น:

    Death of a loved one? Fix insomnia in under 5 minutes.

    • Problem: Insomnia
    • Solution: Fix [insomnia]
    • Target profile: [people with] death of a loved one

    ถ้าลูกค้าเห็น trigger ของเรา และถามว่า:

    • How do you do that? หรือ
    • What do you mean by that?

    แสดงว่า trigger ของเราสามารถดึงความสนใจของลูกค้าได้สำเร็จ และเราสามารถที่จะไป step ถัดไปได้

    เคล็ดลับกระเป๋า 3 ใบ:

    • ถ้าลูกค้าบอกว่า “Interesting” นั่นหมายถึง ลูกค้าไม่ได้สนใจจริง ๆ แต่ถ้าลูกค้าพูดว่า “Tell me more about it” แสดงว่าเราเรียกความสนใจของลูกค้าได้สำเร็จ
    • ในการสร้าง marketing message เราควรจะเริ่มจาก target profile > problem > solution

    .

    🎢 3. Keep the Attention

    Series of problems + solutions -> Rollercoaster

    เมื่อเราได้ความสนใจจากลูกค้าแล้ว เราจะทำให้ลูกค้าสนใจเราต่อไปได้ยังไง?

    Sean เสนอ framework ง่าย ๆ สำหรับปัญหานี้ นั่นคือ ให้เราพูดถึง problem + solution สลับกันไปเรื่อย ๆ:

    • 🔴 Problem
    • 🟢 Solution
    • 🔴 Problem
    • 🟢 Solution
    • 🔴 Problem
    • 🟢 Solution
    • 🔴 Problem
    • 🟢 Solution
    Keep the attention: Problem + Solution

    ถ้าเราไม่คอยพูดถึง problem + solution สลับกันไป ลูกค้าของเราก็จะเหมือนกำลังนั่งรถไฟที่วิ่งเอื่อย ๆ ไปบนที่ราบ (และหลับได้ง่าย ๆ)

    ในทางกลับกัน ถ้าเราคอยสื่อสารถึง problem + solution สลับกันไป ลูกค้าก็จะเหมือนกำลังนั่ง rollercoaster และไม่มีทางที่ลูกค้าจะหลับหรือรู้สึกเบื่อเราได้

    Problem + Solution = Rollercoaster

    .

    💬 4. Language

    ลูกค้าจะไม่เข้าใจถ้าเราไม่พูดภาษาลูกค้า

    สุดท้าย ไม่ว่า marketing message จะดีแค่ไหน แต่ลูกค้าเราจะไม่ตอบรับเลยถ้าไม่เข้าใจภาษาของเรา

    Sean ยกตัวอย่างว่า ถ้าเรากำลังยื่นข้อเสนอพักร้อนฟรี โดยไม่มีค่าใช้จ่ายหรือข้อผูกพันใด ๆ ให้กับลูกค้า ลูกค้ามีโอกาสที่จะไม่ตอบรับได้ ถ้าเรากำลังพูดเป็นภาษาที่ลูกค้าไม่เข้าใจ (เช่น พูดเป็นภาษา Hindi ให้คนไทยฟัง)

    ดังนั้น เราควรใช้ภาษาเดียวกับลูกค้าในการทำ marketing อย่างมีประสิทธิภาพ

    นอกจากนี้ สิ่งที่เราใส่ลงไปใน marketing message ก็มีผลต่อการตัดสินใจซื้อของลูกค้าเช่นกัน

    ยกตัวอย่างเช่น ถ้าเรามีรถ 2 คันซึ่งมีทุกอย่างเหมือนกันยกเว้นราคา:

    • คันที่ 1: $35,000
    • คันที่ 2: $18,000
    Which would you buy? $35,000 or $18,000 cars?

    หลายคนก็เลือกที่จะซื้อคันที่ 2 จนกระทั่งคนขายบอกว่าคันที่ 2 เป็นรถที่ถูกขโมยมา ถึงตอนนั้นทุกคนก็จะหันไปเลือกคันที่ 1 ซึ่งมีราคาแพงกว่าเท่าตัว


    🤚 Part 3. Q&A (Sean, P’Toy, & the Audience)

    Result > information

    ใน session ถามตอบ มี 6 หัวคิดที่น่าสนใจ:

    1. ลูกค้าที่สำคัญที่สุด คือ ลูกค้าที่กลับมาซื้อซ้ำ เราจะต้องทำให้ลูกค้ากลับมาซ้ำโดยการให้ result ไม่ใช่ให้ information เพราะในยุคของ AI ลูกค้าสามารถหา information ได้ง่ายมาก แต่น้อยคนที่จะให้ result กับลูกค้าได้
    2. Talent คือ การทำผิดให้น้อยลง และ learning คือ การสร้างความผิดพลาด (อ้างอิงหนังสือ Suddenly Talented)
    3. ถ้าเราไม่เก่ง AI ก็จะเก่งกว่าเรา แต่ถ้าเราเก่ง AI ก็จะไม่ค่อยมีประโยชน์
    4. การเขียน คือ การคิด (writing is thinking) เราควรจะฝึกเขียนทุกวันเพื่อพัฒนากระบวนการคิดให้ดีขึ้นเรื่อย ๆ
    5. มองหา “good teacher” ไม่ใช่ “fast teacher” เพราะ “good teacher” คือ คนที่จะให้ result กับเราได้
    6. เริ่มต้นจากการโฟกัสไปที่ลูกค้าคนเดียวของเรา ถ้าเราหาลูกค้าคนนี้เจอ เราก็จะหาลูกค้าอีก 1,000 คนได้
    ภาพบรรยากาศงาน The Brain Audit (source: Kasidis Satangmongkol)

    🍩 Bonus

    ในอนาคต ไม่มีใครรู้ว่าจะเกิดอะไรขึ้น

    ช่วงท้ายงาน ผมได้มีโอกาสพูดคุยกับพี่ทอยในระหว่างเซ็นหนังสือ มี 3 ประเด็นที่พี่ทอยแชร์ให้ฟังเกี่ยวกับการสร้างเว็บไซต์และการใช้ชีวิต:

    1. ถ้าจะสร้างตัวในโลกออนไลน์ เราควรสร้างเว็บไซต์เป็นของตัวเอง เพราะถ้าเราฝากตัวไว้กับ platform อื่น (เช่น Facebook) online presence เราจะเปลี่ยนไปเมื่อไรก็ได้ เพราะ algorithm ของ platform สามารถเปลี่ยนได้ทุกเมื่อ
    2. เมื่อเราได้ traffic เข้ามาในหน้าเว็บของเราแล้ว เราควรจะ direct traffic ไปที่ที่หนึ่ง ซึ่งที่นั้นควรเป็น product/service ของเรา (ตั้งแต่วันแรกที่มีเว็บไซต์ Sean ก็มีหนังสือ The Brain Audit ควรรับ traffic อยู่แล้ว)
    3. ไม่มีใครรู้ว่า ในอนาคตจะเกิดอะไรขึ้น เราควรใช้ชีวิตอยู่กับปัจจุบัน

    🤞 Additional Reading

    อ่านสรุปไอเดียเพิ่มเติมจาก event ได้ที่:


      📖 Expand Your Knowledge

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

      • The Brain Audit ของ Sean D’Souza: framework กระเป๋า 7 ใบในการทำ marketing ให้ลูกค้าซื้อ
      • The Almanack of Naval Ravikant ของ Eric Jorgenson: รวมข้อคิดเกี่ยวกับ wealth และ happiness ของ Naval Ravikant นักลงทุนที่ประสบความสำเร็จจากการลงทุนในบริษัทอย่าง Uber, X (Twitter), และ FourSquare
      • Suddenly Talented ของ Sean D’Souza: แนวคิดการทำตัวให้เก่งในระดับที่เข้าถึงได้ (ใครที่อยากวาดรูปวาฬเป็น ลองอ่านหนังสือเล่มนี้ดู 🐳)

      Note:

    • แบบทดสอบทางจิตวิทยาน่าเชื่อถือแค่ไหน? แนะนำให้รู้จักกับ Reliability และ Validity — 2 ลักษณะที่ทุกคนควรรู้ เพื่อประเมินประสิทธิภาพของแบบทดสอบทางจิตวิทยาได้ด้วยตัวเอง (ไม่ต้องเป็นนักจิตวิทยาก็ทำได้)

      แบบทดสอบทางจิตวิทยาน่าเชื่อถือแค่ไหน? แนะนำให้รู้จักกับ Reliability และ Validity — 2 ลักษณะที่ทุกคนควรรู้ เพื่อประเมินประสิทธิภาพของแบบทดสอบทางจิตวิทยาได้ด้วยตัวเอง (ไม่ต้องเป็นนักจิตวิทยาก็ทำได้)

      แบบทดสอบทางจิตวิทยา (psychological test) เป็นเครื่องมือที่ช่วยเราประเมินลักษณะทางจิตวิทยาได้อย่างมีมาตรฐาน เช่น:

      • Personality
      • Intelligence (IQ)
      • Value
      • Emotion
      • Self-concept

      แบบทดสอบทางจิตวิทยาเป็นที่นิยมอย่างแพร่หลาย โดยในแต่ละปีมีคนทำแบบทดสอบทางจิตวิทยาราว 80–100 ล้านคน (Goldberg, 2023; Leikvoll, 2022)

      เราใช้แบบทดสอบทางจิตวิทยา เช่น 16personalities ทั้งในชีวิตประจำวันและในการทำงาน เราทำแบบทดสอบเพื่อเข้าใจตัวเองมากขึ้น (เช่น ดูว่าเรามีนิสัยเหมือนคนดังหรือตัวละครใดจาก Game of Throne) ในการทำงาน เราใช้แบบทดสอบเพื่อคัดกรองผู้สมัครและวางแผนพัฒนาบุคลากรให้เหมาะสมกับองค์กร

      แม้ว่าแบบทดสอบทางจิตวิทยาจะใช้งานอย่างแพร่หลาย แต่ในหลาย ๆ ครั้งประสิทธิภาพของแบบทดสอบยังขาดความชัดเจน นั่นคือ เราไม่รู้ว่า ผลจาก 16personalities ที่บอกว่าเรานิสัยเหมือน John Snow เชื่อถือได้ไหม

      คำถามนี้อาจไม่สำคัญมากเมื่อเราทำแบบทดสอบด้วยเหตุผลส่วนตัว (เช่น ทำตามกระแส) แต่ประสิทธิภาพของแบบทดสอบอาจกลายมาเป็นประเด็นใหญ่ได้เมื่อบริษัทที่เราสมัครงานจะคัดเราออก เพราะเรานิสัยเหมือน John Snow

      แบบทดสอบที่เราใช้งานมีประสิทธิภาพเพียงพอที่จะตัดสินชีวิตของเราได้มากน้อยขนาดไหน?

      อะไรที่จะบอกเราได้ว่าแบบทดสอบสามารถประเมินสิ่งที่เราต้องการประเมินได้จริง?

      เราสามารถวิเคราะห์ประสิทธิภาพของแบบทดสอบได้จากหลายมุมมอง เช่น:

      • จำนวนข้อคำถาม (item)
      • รูปแบบการตอบ (เช่น เขียนตอบ, เลือกตอบ)
      • รูปแบบของแบบทดสอบ (เช่น ประเมินตัวเอง, สัมภาษณ์, เล่นเกม)
      • การแปลผล (เช่น แปลผลโดยอิงกลุ่มหรืออิงคะแนนตัวเอง)

      อย่างไรก็ตาม ไม่ว่าจะเป็นการวิเคราะห์แบบไหน คำตอบที่ได้จะย้อนกลับมาที่ 2 ลักษณะหลักที่ทุกแบบทดสอบจะต้องมี ได้แก่:

      1. Reliability (ความเที่ยง)
      2. Validity (ความตรง)

      ดังนั้น แม้ว่าเราอาจจะไม่ใช่นักจิตวิทยาหรือผู้เชี่ยวชาญในการทดสอบ ถ้าเราเข้าใจลักษณะทั้งสองอย่างนี้แล้ว เราจะสามารถบอกได้ว่า แบบทดสอบมีประสิทธิภาพภาพหรือไม่

      ในบทความนี้ เราจะไปทำความรู้จักกับทั้งสองลักษณะนี้กัน เพื่อที่เราจะได้มีความสามารถในการประเมินประสิทธิภาพของแบบทดสอบ โดยไม่จำเป็นต้องเป็นนักจิตวิทยาหรือผู้เชี่ยวชาญ

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


      1. 📏 Reliability
        1. ⌚ Test-Retest Reliability
        2. 🤌 Internal Consistency
        3. 🅰️ Alternate Form Reliability
      2. 📐 Intro to Validity
      3. 💭 Validity, Part I: Opinion-Based Approach
        1. 🙃 Face Validity
        2. 🧐 Content Validity
      4. 👁️ Validity, Part II: Empirical Approach
        1. 🏗️ Construct Validity
        2. 🌡️ Criterion Validity
      5. 💪 Summary
      6. 👀 See for Yourself: Is 16Personalities Reliable & Valid?
      7. 📚 Further Reading
      8. 📃 References
      9. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

      📏 Reliability

      Reliability หมายถึง ความเสถียรของคะแนนแบบทดสอบ

      ถ้าเราเปรียบแบบทดสอบเหมือนตลับเมตร reliability คือ การที่เราวัดโต๊ะตัวเดียวกันและได้ความยาวเท่าเดิมทุกครั้ง

      สำหรับแบบทดสอบทางจิตวิทยา เราสามารถประเมิน reliability ได้ 3 แบบ ได้แก่:

      1. Test-retest reliability: ความเสถียรในมิติเวลา
      2. Internal consistency: ความเสถียรภายในตัวเอง
      3. Alternate form reliability: ความเสถียรระหว่างต้นฉบับและ alternate form

      .

      ⌚ Test-Retest Reliability

      Test-retest reliability เป็น reliability ที่ประเมินตามมิติเวลา นั่นคือ ถ้าเราเก็บคะแนนแบบทดสอบ 2 ครั้งในเวลาที่ต่างกัน คะแนนทั้งสองครั้งจะเหมือนหรือต่างกันแค่ไหน

      เรามักใช้ correlation ในการวิเคราะห์ test-retest reliability

      Correlation มีค่าอยู่ระหว่าง 0 กับ 1 โดย:

      • 0 หมายถึง คะแนนสองครั้งไม่มีความสอดคล้องกันเลย
      • 1 หมายถึง คะแนนเหมือนกัน 100%

      ดังนั้น ยิ่งค่า correlation เข้าใกล้ 1 มากเท่าไร ก็แสดงว่ามี test-retest reliability สูงขึ้นเท่านั้น

      ยกตัวอย่างเช่น เรามีแบบทดสอบ IQ ที่มีค่า correlation ระหว่างคะแนน 2 ครั้ง (เช่น เดือนที่แล้วกับวันนี้) ต่ำ (เช่น .10) แสดงว่าคะแนนมีความแตกต่างมาก (เช่น IQ = 10 และ IQ = 100) และแบบทดสอบมีความเสถียรน้อย

      ในทางกลับกัน ถ้าแบบทดสอบมี correlation สูง (เช่น .80) แสดงว่า คะแนนมีความคล้ายกันสูง (เช่น IQ = 100 และ IQ = 101) และแบบทดสอบมีความเสถียรสูง

      ทั้งนี้ test-retest reliability เหมาะกับแบบทดสอบที่ประเมินลักษณะที่มีความคงที่และเปลี่ยนแปลงน้อย (เช่น personality, intelligence ซึ่งไม่เปลี่ยนวันต่อวัน)

      ถ้าเราต้องการประเมิน reliability ของแบบทดสอบที่ประเมินลักษณะที่เปลี่ยนแปลงได้ง่าย (เช่น อารมณ์) เราควรใช้ reliability ประเภทอื่นอย่าง internal consistency และ alternate form reliability ในการประเมินแบบทดสอบ

      .

      🤌 Internal Consistency

      Internal consistency เป็น reliability ที่ดูความสอดคล้องระหว่างข้อคำถาม โดยแนวคิด คือ ถ้าข้อคำถามประเมินลักษณะเดียวกัน คะแนนของทุกข้อควรเป็นไปในทิศทางเดียวกัน

      ยกตัวอย่างเช่น ถ้าแบบทดสอบ extraversion มี reliability สูง คนตอบแบบทดสอบก็ควรให้คะแนนทุกข้อเหมือนกัน เช่น:

      • ชอบคุยกับคนอื่น → 5/5 (สูง)
      • ชอบเที่ยวกับเพื่อน → 4/5 (สูง)
      • ชอบไปปาร์ตี้ → 5/5 (สูง)

      ในทางกลับกัน ถ้าแบบทดสอบมี reliability ต่ำ คะแนนของทุกข้อจะแตกต่างกัน เช่น:

      • ชอบคุยกับคนอื่น → 1/5 (ต่ำ)
      • ชอบเที่ยวกับเพื่อน → 3/5 (ปานกลาง)
      • ชอบไปปาร์ตี้ → 5/5 (สูง)

      การคำนวณ internal consistency มีหลายวิธี แต่วิธีที่นิยมที่สุด คือ การคำนวณ Cronbach’s alpha (α) ซึ่งมีค่าอยู่ระหว่าง 0 กับ 1 โดย:

      • 0 หมายถึง internal consistency ต่ำสุด
      • 1 หมายถึง internal consistency สูงสุด

      α ในระดับที่ “ยอมรับได้ (acceptable)” มีค่าตั้งแต่ .70 ขึ้นไป (Ashton, 2018)

      วิธีอื่น ๆ ในการประเมิน internal consistency ได้แก่:

      1. Split-half reliability: แบ่งแบบทดสอบเป็น 2 ส่วนและดูว่า คะแนนสองส่วนเหมือนกันขนาดไหน
      2. Inter-rater reliability: ดูความสอดคล้องระหว่างคะแนนจากผู้สังเกตการณ์ตั้งแต่ 2 คนขึ้นไป

      .

      🅰️ Alternate Form Reliability

      สุดท้าย alternate form reliability เป็น reliability ที่ดูความสอดคล้องระหว่างแบบทดสอบต้นฉบับและ alternate form

      Alternate form หมายถึง version ของแบบทดสอบที่ค่าทางสถิติต่าง ๆ เหมือนกับต้นฉบับ เช่น:

      • Mean
      • Standard deviation
      • Correlation กับแบบทดสอบอื่น ๆ

      ถ้าคะแนนของต้นฉบับเหมือนกับคะแนนของ alternate form แสดงว่า แบบทดสอบของเรามี reliability สูง

      Alternate form reliability ไม่เป็นที่นิยมใช้ เนื่องจากข้อจำกัด 2 อย่าง ได้แก่:

      1. การสร้างแบบทดสอบอีกฉบับให้เป็น alternate form มีความท้าทายสูง (การทำให้ค่าสถิติเหมือนกันเป็นเรื่องยาก)
      2. แม้ว่า เราจะสามารถสร้าง alternate form ได้แล้ว เราไม่สามารถมั่นใจได้ 100% ว่า คะแนนของ alternate form จะสะท้อนถึงสิ่งเดียวกับต้นฉบับ (เช่น คะแนน 100 ของต้นฉบับอาจหมายถึง extraversion แต่คะแนน 100 ของ alternate form อาจหมายถึง IQ ก็ได้) ทำให้การเปรียบเทียบต้นฉบับและ alternate form ไม่มีความหมาย เพราะ เรากำลังเปรียบเทียบแบบทดสอบที่ประเมินลักษณะที่แตกต่างกัน

      📐 Intro to Validity

      ในขณะที่ reliability ประเมินความเสถียรของคะแนน validity ประเมินว่า แบบทดสอบสามารถประเมินในสิ่งที่เราต้องการได้หรือไม่

      Reliability และ validity มีความเกี่ยวข้องกัน โดยแบบทดสอบจะไม่มี validity ถ้าไม่มี reliability เพราะถ้าคะแนนแบบทดสอบไม่คงที่ (reliability) เราจะไม่สามารถรู้ได้ว่า แบบทดสอบกำลังประเมินอะไรอยู่ (validity)

      การที่แบบทดสอบจะมี validity ได้ จะต้องมี reliability ก่อน อย่างไรก็ตามการมี reliability ไม่ได้หมายความว่า แบบทดสอบจะมี validity

      ยกตัวอย่างเช่น แบบทดสอบ extraversion อาจให้คะแนนเหมือนเดิมทุกครั้ง แต่แบบทดสอบอาจไม่ได้วัด extraversion แต่วัดลักษณะอื่นอย่าง intelligence (ซึ่งมีคะแนนคงที่) ก็ได้

      ดังนั้น แบบทดสอบจะมี validity ได้จะต้องมี reliability ก่อน แต่เมื่อมี reliability แล้ว เราจะต้องทดสอบ validity เพื่อดูว่า แบบทดสอบสามารถประเมินสิ่งที่ต้องประเมินได้หรือไม่

      Validity แบ่งเป็น 2 กลุ่มใหญ่ ๆ ได้แก่:

      1. Opinion-based approach: validity ตามความคิดเห็น
      2. Empirical approach: validity ตามหลักฐานเชิงประจักษ์ (หลักฐานที่สามารถมองเห็นและตรวจสอบได้)

      💭 Validity, Part I: Opinion-Based Approach

      ในกลุ่ม opinion-based approach เรามี validity 2 ประเภท ได้แก่:

      1. Face validity
      2. Content validity

      .

      🙃 Face Validity

      Face validity คือ validity ตามความเห็นของผู้ตอบแบบทดสอบ

      ถ้าคนที่ตอบแบบทดสอบบอกว่า แบบมาทดสอบ “สามารถ” วัดสิ่งที่เราต้องการได้ แสดงว่าแบบทดสอบเรามี face validity สูง

      เนื่องจาก face validity เป็นเพียงความคิดเห็น การมี face validity จึงไม่ได้หมายความว่าแบบทดสอบจะสามารถประเมินสิ่งที่เราต้องการได้จริง

      เราสามารถเห็นแบบทดสอบที่มี face validity ต่ำ แต่สามารถประเมินสิ่งที่ต้องการได้ เช่น:

      • IAT ที่วัดความลำเอียงต่อกลุ่มคน (เช่น คนผิวสี) แม้ว่า เราจะตอบว่า คนผิวสี = “ดี” แต่แบบทดสอบก็สามารถบอกได้ว่า เรามีความลำเอียงไหม
      • Name Letter Preference Task ที่ให้คนให้คะแนนความชอบต่อตัวอักษรต่าง ๆ ซึ่งสามารถประเมิน self-esteem ได้ (คนส่งนใหญ่จะให้คะแนนตัวอักษรในชื่อตัวเองมากกว่าตัวอักษรอื่น)
      • Iowa Gambling Task ที่เป็นเกมไพ่สำหรับประเมินความสามารถในการตัดสินใจ

      แม้ว่า face validity อาจไม่ใช่ตัวบ่งชี้ validity ที่ดี แต่ face validity มีประโยชน์เมื่อเราต้องการสร้างแรงจูงใจให้ผู้ตอบ: เมื่อแบบทดสอบดูเหมือนจะประเมินในสิ่งที่ควรประเมิน (มี face validity) ผู้ตอบจะมีแรงจูงใจที่จะทำแบบทดสอบให้เสร็จ มากกว่าเมื่อแบบทดสอบขาด face validity

      .

      🧐 Content Validity

      เช่นเดียวกับ face validity, content validity เกิดมาจากความคิดเห็น แต่แทนที่จะมาจากคนทั่วไป content validity เป็นความเห็นของผู้เชี่ยวชาญ

      ถ้าผู้เชี่ยวชาญประเมินแบบทดสอบของเราแล้วยกนิ้วให้ 👍 แสดงว่าแบบทดสอบเรามี content validity สูง

      เช่นเดียวกับ face validity, content validity ไม่ได้การันตีว่าแบบทดสอบเราจะสามารถวัดสิ่งที่ต้องการวัดได้ เพราะความเห็นของผู้เชี่ยวชาญยังมีความผิดพลาดได้

      Content validity มีประโยชน์ในขั้นต้นของการพัฒนาแบบทดสอบ เราสามารถให้ผู้เชี่ยวชาญประเมินและตัดข้อคำถามที่ไม่น่าเกี่ยวข้องกับสิ่งที่เราจะวัดออกได้

      ไม่ว่าแบบทดสอบจะมีหรือไม่มี face validity และ content validity เราจะไม่รู้เลยว่า แบบทดสอบสามารถประเมินสิ่งที่เราต้องการได้ไหม จนกว่าเราจะทดสอบให้เห็นกับตา (empirical approach)


      👁️ Validity, Part II: Empirical Approach

      Validity ในกลุ่ม empirical approach มีอยู่ 2 ประเภท ได้แก่:

      1. Construct validity
      2. Criterion validity

      .

      🏗️ Construct Validity

      Construct หมายถึง ลักษณะทางจิตวิทยาซึ่งเรามองไม่เห็นและไม่สามารถจับต้องได้ เช่น personality, intelligence, self-concept

      Construct validity หมายถึง validity ของแบบทดสอบในการประเมิน construct ที่ต้องการ

      เราสามารถวิเคราะห์ construct validity ได้ด้วยการดูความสัมพันธ์ระหว่างแบบทดสอบของเรากับแบบทดสอบอื่น ๆ ซึ่งสามารถแบ่งได้เป็น 2 แบบ ได้แก่:

      1. Convergent validity
      2. Divergent validity (หรือ discriminant validity)

      สำหรับ convergent validity เราจะดูว่า แบบทดสอบมีความสัมพันธ์กับแบบทดสอบอื่น ๆ ที่ควรมีไหม

      ยกตัวอย่างเช่น แบบทดสอบ IQ ซึ่งสะท้อนความฉลาดรอบด้าน ควรมีความสัมพันธ์กับแบบทดสอบความสามารถอื่น ๆ เช่น แบบทดสอบเลข แบบทดสอบความรู้ทั่วไป ถ้าแบบทดสอบ IQ มีความสัมพันธ์กับแบบทดสอบเหล่านี้ ก็แสดงว่ามี convergent validity

      Divergent validity คือ การที่แบบทดสอบของเราไม่มีความสัมพันธ์กับแบบทดสอบที่ไม่ควรเกี่ยวข้องด้วย

      ยกตัวอย่างเช่น ถ้าแบบทดสอบ IQ จะมี divergent validity ได้ จะต้องไม่มีความสัมพันธ์กับแบบทดสอบที่ไม่เกี่ยวข้องกับสามารถทางปัญญา เช่น ความทดสอบ integrity หรือแบบทดสอบความสุภาพ

      ในการวิเคราะห์ construct validity ยิ่งเราทดสอบ convergent validity และ divergent validity ได้มากเท่าไรก็ยิ่งดี เพราะเราจะยิ่งมั่นใจได้ว่า แบบทดสอบของเราสามารถประเมินสิ่งที่ต้องการประเมินได้จริง

      ยกตัวอย่างเช่น เราควรหา convergent validity ของแบบทดสอบ IQ กับแบบทดสอบหลาย ๆ วิชา เช่น ข้อสอบเลข, ข้อสอบภาษา, ข้อสอบสังคม แทนการหา convergent validity กับวิชาใดวิชาหนึ่ง

      เรามักใช้ correlation ในการวิเคราะห์ construct validity ดังนี้:

      1. Convergent validity: ยิ่ง correlation สูงยิ่งดี (เช่น .7 หรือ -.7) *
      2. Divergent validity: ยิ่ง correlation น้อยก็ยิ่งดี (เช่น .10 หรือ -.10)

      Note: * convergent validity ไม่ควรสูงเกิน เพราะนั่นอาจหมายความว่า แบบทดสอบเราอาจประเมินสิ่งเดียวกับแบบทดสอบอื่น เช่น แบบทดสอบ IQ กำลังประเมินความสามารถด้านคณิตศาสตร์แทน IQ (ความฉลาดรอบด้าน)

      .

      🌡️ Criterion Validity

      Criterion validity คือ validity ที่ดูความสอดคล้องระหว่างแบบทดสอบกับเกณฑ์ (criterion) ที่มีความสำคัญ

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

      • แบบทดสอบ IQ กับเกรดการเรียน
      • แบบทดสอบ extraversion กับจำนวนเพื่อน
      • แบบทดสอบ integrity กับพฤติกรรมการโกง
      • แบบทดสอบ depression กับภาวะซึมเศร้า

      Criterion validity มีอยู่ 2 แบบ ได้แก่:

      1. Concurrent validity: ดูว่าแบบทดสอบมีความเกี่ยวข้องกับเกณฑ์ที่เกิดขึ้นในเวลาเดียวกันไหม (เช่น คะแนนสอบวันนี้)
      2. Predictive validity (aka incremental validity): ดูว่า แบบทดสอบมีความเกี่ยวข้องกับเกณฑ์ที่จะเกิดขึ้นในอนาคตไหม (เช่น คะแนนสอบในอีก 2 เดือนข้างหน้า)

      เช่นเดียวกับ construct validity ยิ่งเรามี concurrent validity และ predictive validity มากเท่าไรก็ยิ่งดี เพราะจะทำให้เรายิ่งมั่นใจในแบบทดสอบมากขึ้น

      และเช่นเดียวกับ construct validity เรามักใช้ correlation ในการประเมิน criterion validity ซึ่งหมายความว่า ยิ่ง correlation สูงก็ยิ่งมี criterion validity สูง


      💪 Summary

      ในบทความนี้ เราได้ไปทำความรู้จักกับ 2 ลักษณะที่ช่วยให้เราประเมินประสิทธิภาพของแบบทดสอบทางจิตวิทยาได้ ซึ่งได้แก่:

      ลักษณะที่ 1. Reliability หรือ ความเสถียรของคะแนนแบบทดสอบ ซึ่งมี 3 ประเภท ได้แก่:

      TypeDescription
      Test-retest reliabilityความเสถียรตามมิติเวลา
      Internal consistencyความเสถียรระหว่างข้อคำถาม
      Alternate form reliabilityความเสถียรระหว่างต้นฉบับและ alternate form

      ลักษณะที่ 2. Validity ซึ่งบอกว่า แบบทดสอบวัดสิ่งที่ต้องการวัดได้ขนาดไหน และแบ่งได้เป็น 2 กลุ่มใหญ่ ได้แก่:

      กลุ่มที่ 1. Opinion-based approach หรือ validity ตามความเห็น:

      TypeDescription
      Face validityValidity ตามความเห็นของคนทั่วไป
      Content validityValidity ตามความเห็นของผู้เชี่ยวชาญ

      กลุ่มที่ 2. Empirical approach หรือ validity ที่มีหลักฐานเชิงประจักษ์:

      Construct validity:

      TypeDescription
      Convergent validityความสัมพันธ์ระหว่างแบบทดสอบกับปัจจัยที่ควรเกี่ยวข้อง
      Divergent validityความสัมพันธ์ระหว่างแบบทดสอบกับปัจจัยที่ไม่ควรเกี่ยวข้อง

      Criterion validity:

      TypeDescription
      Concurrent validityความสัมพันธ์ระหว่างแบบทดสอบกับเกณฑ์ในปัจจุบัน
      Predictive validityความสัมพันธ์ระหว่างแบบทดสอบกับเกณฑ์ในอนาคต

      👀 See for Yourself: Is 16Personalities Reliable & Valid?

      ตอนนี้ เรารู้จักกับ reliability และ validity แล้ว และสามารถประเมินประสิทธิภาพของแบบทดสอบทางจิตวิทยาได้แล้ว

      แบบทดสอบต่าง ๆ มักจะรายงานผลการทดสอบ reliability และ validity ไว้ ดังนั้น เราสามารถประเมินประสิทธิภาพของแบบทดสอบได้โดยไม่ต้องทำการทดสอบเอง

      ถ้าแบบทดสอบใดที่ไม่มีการรายงานค่าเหล่านี้ เราสามารถตั้งคำถามได้ว่าแบบทดสอบสามารถใช้งานได้จริงหรือไม่

      เราสามารถดูตัวอย่างการรายงาน reliability และ validity ได้จากรายงานของ 16personalities ซึ่งประกอบ:

      1. Internal consistency
      2. Test-retest reliability
      3. Discriminant (divergent) validity

      ใครที่ลองอ่านรายงานของ 16personalities สามารถทิ้งคอมเม้นท์ไว้ได้ว่า แบบทดสอบนี้น่าเชื่อถือแค่ไหน

      .

      (ใครที่ยังไม่ได้ดูรายงาน 16personalities ให้ข้ามบรรทัดล่างไปก่อนนะครับ 😁)

      (Note: รายงานไม่ได้ระบุ validity ประเภทอื่น ๆ ไว้ ทำให้เราไม่รู้ว่า 16personalities ประเมิน 4 มิติของบุคลิกภาพตามที่ออกแบบไว้หรือไม่)


      📚 Further Reading

      สำหรับคนที่สนใจอ่านเพิ่มเติมเกี่ยว reliability และ validity สามารถอ่าน

      • Ashton (2018): บทเรียนเกี่ยวกับ reliability และ validity เบื้องต้น
      • Geisinger (2013): บทเรียนเกี่ยวกับ reliability เชิงลึก
      • Sireci และ Sukin (2013): บทเรียนเกี่ยวกับ validity เชืงลึก
      • Part II และ III ของ Furr และ Bacharach (2014): บทเรียนเชิงทฤษฎีและสถิติของ reliability และ validity

      📃 References

      • Ashton, M. C. (2018). Basic concepts in psychological measurement. In M. C. Ashton (Ed.), Individual differences and personality (3rd ed., pp. 1–28). Academic Press. https://doi.org/10.1016/B978-0-12-809845-5.00001-9
      • Furr, R. M., & Bacharach, V. R. (2014). Psychometrics: An introduction (2nd ed.). Sage.
      • Geisinger, K. F. (2013). Reliability. In K. F. Geisinger, B. A. Bracken, J. F. Carlson, J. I. C. Hansen, N. R. Kuncel, S. P. Reise, & M. C. Rodriguez (Eds.), APA handbook of testing and assessment in psychology, Vol. 1. Test theory and testing and assessment in industrial and organizational psychology (pp. 21–42). American Psychological Association. https://doi.org/10.1037/14047-002
      • Goldberg, E. (2023, March 5). The $2 billion question of who you are at work. The New York Times. https://www.nytimes.com/2023/03/05/business/remote-work-personality-tests.html
      • Leikvoll, V. (2022, September 14). 80% of Fortune 500 companies use personality tests, but are they ethical? Leaders. https://leaders.com/articles/business/personality-tests/
      • Rindskopf, D. (2001). Reliability: Measurement. In N. J. Smelser & P. B. Baltes (Eds.), International encyclopedia of the social & behavioral sciences (pp. 13023–13028). Pergamon. https://doi.org/10.1016/B0-08-043076-7/00722-1
      • Sireci, S. G., & Sukin, T. (2013). Test validity. In K. F. Geisinger, B. A. Bracken, J. F. Carlson, J. I. C. Hansen, N. R. Kuncel, S. P. Reise, & M. C. Rodriguez (Eds.), APA handbook of testing and assessment in psychology, Vol. 1. Test theory and testing and assessment in industrial and organizational psychology (pp. 61–84). American Psychological Association. https://doi.org/10.1037/14047-004

      ✅ 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:

    • สรุปวิธีสร้างงานเขียนจาก 0 สำหรับนักออกแบบและผู้ที่ต้องการพัฒนาทักษะการเขียน จากหนังสือ Writing Is Not Magic, It’s Design โดย João Batalheiro Ferreira

      สรุปวิธีสร้างงานเขียนจาก 0 สำหรับนักออกแบบและผู้ที่ต้องการพัฒนาทักษะการเขียน จากหนังสือ Writing Is Not Magic, It’s Design โดย João Batalheiro Ferreira

      Writing Is Not Magic, It’s Design เป็นหนังสือของ João Batalheiro Ferreira ที่แนะนำแนวคิดในการเขียนสำหรับนักออกแบบ (designer) ซึ่งมัก “คิดเป็นภาพ” ได้ดีกว่า “คิดเป็นตัวหนังสือ”

      แม้ว่า Writing Is Not Magic, It’s Design จะถูกเขียนมาให้นักออกแบบ แต่แนวคิดในหนังสือสามารถปรับใช้ได้กับทุกคนที่ต้องการพัฒนาทักษะการเขียนของตัวเอง โดยเฉพาะการเขียน non-fiction อย่างเขียน blog และบทความ

      ในบทความนี้ เราจะมาสรุปเนื้อหาของ Writing Is Not Magic, It’s Design ใน 5 ส่วนกัน:

      1. What writing is: การเขียนคืออะไร
      2. Writing method: วิธีเขียนจาก 0 ถึง 100
      3. Modular writing: การจัดการโครงสร้างงานเขียน
      4. Writing stages: วิธีแปลงไอเดียให้เป็นงานเขียน
      5. Writing method combined: วิธีเขียนอย่างเป็นระบบ

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


      หนังสือ Writing Is Not Magic, It’s Design จาก Amazon

      1. ✍️ What Writing Is
        1. 💪 Writing = Skill
        2. 📣 Writing = Communication
        3. 🎨 Writing = Creative Process
        4. 🧠 Writing = Thinking
      2. 🖋️ Writing Method
      3. 1️⃣ Part I. Modular Writing
        1. 😭 Obstacle #1 to Writing
        2. 🙂‍↕️ What Is Modular Writing?
        3. 😇 Benefits
        4. 🪜 How to
      4. 2️⃣ Part II. Writing Stages
        1. 😭 Obstacle #2 to Writing
        2. 🎭 What Are Writing Stages?
        3. 🧑‍🎨 The Four Steps in Writing Stages
        4. 🫠 Don’t Skip
        5. 📝 Step 1. N for Note
        6. 🍱 Step 2. O for Outline
        7. 🖋️ Step 3. D for Draft
        8. ✍️ Step 4. E for Edit
      5. 🧢 Writing Method Combined
      6. 🤩 Deep Note: Your Digital Zettelkasten

      ✍️ What Writing Is

      เรามองการเขียนได้ 4 มุม:

      1. Skill
      2. Communication
      3. Creative process
      4. Thinking

      .

      💪 Writing = Skill

      การเขียนเป็นทักษะ ซึ่งหมายความว่า ทุกคนสามารถเป็นนักเขียนได้ด้วยการฝึกฝน ไม่ใช่พรสรรค์ที่ติดตัวมาแต่เกิด

      .

      📣 Writing = Communication

      จุดประสงค์ของการเขียน คือ การสื่อสารไอเดียระหว่างคนเขียนและคนอ่าน

      งานเขียนที่ไม่ดี คือ งานที่ไม่สามารถสื่อไอเดียไปถึงคนอ่านได้

      และงานเขียนที่ดี คือ งานที่แก้ปัญหาการสื่อสารได้สำเร็จ

      .

      🎨 Writing = Creative Process

      การเขียนเป็นงาน creative และเช่นเดียวกับงาน creative อื่น ๆ เช่น การออกแบบ งานเขียนจะสร้างผ่าน creative process ซึ่งเราจะไปดูกันต่อไป

      .

      🧠 Writing = Thinking

      การเขียน คือ การคิด

      ถ้าจะเขียนได้ดี เราจะต้องคิดได้ดีก่อน แต่ถ้าจะคิดได้ดี บางทีเราจะต้องเขียนออกก่อน

      ดังนั้น การเขียนไม่ใช่แค่สื่อ แต่ยังเป็นเครื่องมือช่วยคิดอีกด้วย


      🖋️ Writing Method

      Writing method เป็นวิธีการออกแบบงานเขียนอย่างเป็นระบบที่จะช่วยให้เราก้าวจาก 0 ไปถึง 100 ได้ และประกอบด้วย 2 ส่วน:

      1. Modular writing
      2. Writing stages

      ซึ่งแต่ละส่วนมีรายละเอียดดังต่อไปนี้


      1️⃣ Part I. Modular Writing

      .

      😭 Obstacle #1 to Writing

      อุปสรรคหนึ่งในการเขียน คือ blank-page anxiety

      ในการเขียน เราจะเริ่มจากหน้ากระดาษเปล่า พร้อมกับภาพในหัวว่างานเขียนของเราจะยิ่งใหญ่ขนาดไหน และเราพยายามจะทำให้ภาพนั้นกลายเป็นจริง

      เราพยายามเปลี่ยนหน้ากระดาษเปล่า (0) ให้กลายเป็นงานเขียนฉบับสมบูรณ์ (100) ในก้าวใหญ่เดียว ซึ่งทำให้เรารู้สึกกังวลจนเขียนไม่ออกได้

      ถ้าการเขียนจาก 0 เป็น 100 เป็นก้าวที่ใหญ่ไป สิ่งที่เราต้องทำคือแบ่งก้าวให้เล็กลงเพียงพอที่เราจะก้าวไปข้างหน้าได้อย่างมั่นใจ

      .

      🙂‍↕️ What Is Modular Writing?

      Modular writing เป็นเทคนิคในการเขียนที่แยกงานเขียนออกเป็นส่วน ๆ (module) โดยที่แต่ละส่วน:

      1. เขียนจบได้ในตัวเอง (มี start, middle, end ในตัวเอง)
      2. แยกประกอบกับส่วนอื่น ๆ ได้อย่างอิสระ

      ยกตัวอย่างเช่น บทความเกี่ยวกับ design thinking แยกได้เป็น 4 ส่วน หรือ modules ดังนี้:

      • Module 1. What design thinking is
      • Module 2. History of design thinking
      • Module 3. Examples of design thinking
      • Module 4. Case studies of design thinking

      เราสามารถจัดเรียง module ได้โดยไม่กระทบเนื้อด้านใน เช่น:

      • Module 2. History of design thinking
      • Module 1. What design thinking is
      • Module 4. Case studies of design thinking
      • Module 3. Examples of design thinking

      .

      😇 Benefits

      Modular writing มีข้อดี 2 อย่าง ได้แก่:

      1. Blank-page anxiety: ช่วยให้เราไม่รู้สึก overwhelmed เพราะแทนที่เราจะเริ่มจาก 0 (หน้าเปล่า) ไป 100 (งานเขียนที่สมบูรณ์) ในทันที เราจะค่อย ๆ เขียนทีละ module ไปเรื่อย ๆ จนครบ
      2. Structuring: จัดโครงสร้างงานเขียนได้ง่าย เพราะแต่ละส่วนครบจบในตัวเอง แสดงว่า เราสามารถโยกย้ายแต่ละส่วนได้โดยไม่ต้องแก้ไขงานเขียนใหม่ทั้งหมด แต่แก้เฉพาะจุดที่แต่ละส่วนเชื่อมต่อกันเท่านั้น

      .

      🪜 How to

      เราใช้ modular writing ได้ใน 3 ขั้นตอน:

      1. Split: แยกงานเขียนออกเป็น module
      2. Write: เขียนแต่ละ module
      3. Combine: ประกอบ module เข้าด้วยกันให้เป็นงานเขียนที่สมบูรณ์

      2️⃣ Part II. Writing Stages

      .

      😭 Obstacle #2 to Writing

      อีกอุปสรรคที่คนส่วนใหญ่เจอในการเขียน คือ “ไม่รู้จะเขียนอะไร” ซึ่งแบ่งได้เป็น 2 กรณี:

      1. ไม่มีข้อมูลที่จะเอามาเขียน
      2. มีข้อมูล แต่ไม่รู้จะเขียนออกมายังไง

      สิ่งที่เราต้องการในทั้ง 2 กรณี คือ ขั้นตอนที่จะช่วยเราเก็บข้อมูลและแปลงข้อมูลให้กลายเป็นงานเขียน

      .

      🎭 What Are Writing Stages?

      Writing stages คือ creative process ของงานเขียน หรือขั้นตอนที่จะแปลงไอเดียให้กลายเป็นงานเขียน

      .

      🧑‍🎨 The Four Steps in Writing Stages

      Creative process มีอยู่ 4 ขั้น ได้แก่:

      1. Gather information: รวบรวมข้อมูล
      2. Sketch: ร่าง
      3. Design spec: ออกแบบ
      4. Prototype: สร้างต้นแบบ
      Gather -> Sketch -> Design -> Prototype

      Writing stages มีอยู่ 4 ขั้นตอน ซึ่งย่อสั้น ๆ ว่า NODE ได้แก่:

      1. Note: จดรวบรวมข้อมูล
      2. Outline: วางโครงร่าง
      3. Draft: ร่างงานเขียน
      4. Edit: แก้ไขงาน
      Note -> Outline -> Draft -> Edit

      เปรียบเทียบ creative process กับ writing stages:

      Creative ProcessWriting Stages
      Gather infoNote
      SketchOutline
      Design specDraft
      PrototypeEdit

      .

      🫠 Don’t Skip

      เราควรเขียนงานตามลำดับ writing stages (note → outline → draft → edit) และไม่ข้ามขั้นตอน เช่น ข้าม note และ outline ไป draft เลย เพราะเราจะขาดวัตถุดิบที่จำเป็น และทำให้งานเขียนขาดรากฐานที่แข็งแรง

      ทั้งนี้ เราสามารถย้อนขั้นตอนได้ เช่น ร่างงานแล้ว (draft) และกลับไปปรับโครง (outline) อีกครั้งได้

      .

      📝 Step 1. N for Note

      ขั้นแรกใน writing stages คือ note ซึ่งหมายถึง การจัดเก็บไอเดียต่าง ๆ เพื่อเป็นข้อมูลในการเขียน

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

      เพื่อช่วยให้สมองมีพื้นที่คิด เราควรมีระบบจัดเก็บไอเดียข้างนอก เพื่อคืนพื้นที่คิดให้กับสมอง

      ระบบหนึ่งที่เราใช้ได้ คือ Deep Noting ซึ่งพัฒนามาจาก Zettelkasten ที่เป็นระบบจัดการความรู้ที่มีประสิทธิภาพในสมัยก่อน

      Deep Noting มีอยู่ 3 ขั้นตอน:

      1. Capture notes
      2. Review
      3. Deep notes

      โดยมีรายละเอียดดังนี้:

      ขั้นที่ 1. Capture notes: จดข้อมูล ไอเดีย หรือแรงบันดาลใจ (เช่น quote) ที่เราพบเจอลงในกระดาษ (João แนะนำกระดาษ A7 เพราะพกพาได้) โดยเราจะจด 1 ไอเดียต่อ 1 แผ่น พร้อมหมายเหตุสั้น ๆ (ถ้ามี) เช่น ไอเดียนี้ทำให้เรานึกถึงอะไร

      ยกตัวอย่างเช่น เราเจอ quote ที่น่าสนใจระหว่างอ่านหนังสือ:

      Writing is easy.
      All you have to do is
      cross out the wrong words.
      — Mark Twain.

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

      [1. IDEA 👇]
      “writing is easy.
      all you have to do is
      cross out the wrong words.”
      mark twain.
      [2. REMARK 👇]
      reminds of book “essentialism”

      ขั้นที่ 2. Review: รีวิว notes ที่เก็บไว้ เพื่อเลือกว่าจะเก็บหรือทิ้งไป โดยเราจะทำอย่างนี้ทุก ๆ สัปดาห์

      เราจะทิ้ง notes ที่ไม่เลือกไป และเปลี่ยน notes ที่เลือกเก็บให้เป็น deep notes ต่อไป

      ขั้นที่ 3. Deep notes: เราจะแปลง notes ที่เก็บไว้ ให้กลายเป็น deep notes หรือคลังข้อมูลที่พร้อมหยิบใช้ได้ทุกเมื่อ

      ในหนังสือ João แนะนำให้เราเก็บ deep notes เป็น text files บนคอมพิวเตอร์ เพราะเป็นไฟล์ที่เรียบง่ายและมีขนาดเล็ก โดยเราจะเก็บ 1 note ต่อ 1 ไอเดีย

      ในแต่ละไฟล์ เราจะเขียน 4 อย่าง:

      1. Idea: เขียนขยายความจาก notes ที่เก็บไว้ ว่าทำไมไอเดียนี้ถึงน่าสนใจ และไอเดียนี้มีความหมายกับเรายังไง
      2. Reference: ที่มาของไอเดีย (ถ้ามี เช่น อ่านจากหนังสือ X, ได้ยินจาก Y)
      3. Link to: อ้างอิงถึงไอเดียอื่น ๆ (ถ้ามี) โดยเขียนชื่อ text file ของไอเดียอื่นลงไป
      4. Tags: ใส่ #hashtag เพื่อช่วยจับกลุ่มไอเดีย

      ยกตัวอย่างเช่น เปลี่ยน note ที่เก็บไว้:

      “writing is easy.
      all you have to do is
      cross out the wrong words.”
      mark twain.
      reminds me of book “essentialism”

      ให้เป็น deep note ได้แบบนี้:

      [1. IDEA 👇]
      “Writing is easy.
      All you have to do is
      cross out the wrong words.”
      Good writing isn't about being wordy.
      It's as much about picking the right words
      as cutting out what's not essential.
      [2. REFERENCE 👇]
      Reference:
      Mark Twain
      [3. LINK TO 👇]
      Link to:
      “write drunk, edit sober”
      [4. TAGS 👇]
      #writing #editing
      #marktwain #essentialism

      Pro tips:

      • เราควรเก็บ text files ทั้งหมดไว้ใน folder เดียวกัน ไม่แยก folder ย่อย เพราะจะหาไฟล์ได้ง่ายขึ้น
      • เราสร้าง text file สำหรับเก็บ hashtags โดยเฉพาะได้ เพื่อช่วยให้รู้ว่าเรามีไอเดียประเภทไหนแล้วบ้าง

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

      .

      🍱 Step 2. O for Outline

      เมื่อมีไอเดียสำหรับงานเขียนแล้ว เราจะจัดเรียงไอเดียให้กลายเป็นโครงร่าง (outline) หรือแผนที่นำทางในการเขียน ใน 3 ขั้นตอน:

      1. Print: ปริ้นท์ text files ที่มี #hashtag ที่เกี่ยวข้องออกมาทั้งหมด (เช่น เราต้องการเขียนเกี่ยวกับ design thinking เราจะปริ้นท์ไฟล์ที่มี #designthinking ทั้งหมด รวมทั้ง #hashtag อื่น ๆ ที่เกี่ยวข้อง เช่น #designsprint #doublediamond)
      2. Group: จับกลุ่มไอเดียเป็นก้อน ๆ และตั้งชื่อกลุ่ม (เช่น “history of design thinking”, “prototyping”, “user persona”)
      3. Organise: จัดกลุ่มไอเดียให้เป็นเรื่องราว (story) ที่ต้องการจะเล่า และตั้งไว้ในจุดที่เรามองเห็นได้ (เช่น บนผนังหน้าโต๊ะทำงาน) เพื่อใช้เป็นแผนที่ในการเขียนต่อไป

      .

      🖋️ Step 3. D for Draft

      เมื่อมีแผนที่นำทางแล้ว เราจะร่างงานเขียนขึ้นมา (draft) ซึ่งในขั้นนี้ เราจะต้องทำ 2 อย่าง:

      1. Elaborate: ขยายความไอเดียที่มี
      2. Clarify: เชื่อมโยงไอเดียเข้าด้วยกัน

      ในขั้นนี้ เราควรจะเขียนไอเดียทั้งหมดที่มีในหัวออกมาให้ได้มากที่สุด โดยยังไม่ต้องสนใจความสวยงาม เพราะถ้าเราเขียนไปแก้ไปด้วย เราจะไม่เขียนได้ เพราะทั้ง 2 อย่างใช้หัวคนละแบบ (เขียนให้เยอะ vs ลดทอน)

      เมื่อร่างเสร็จแล้ว เราสามารถขอ feedback จากคนอื่น ๆ เพื่อนำมาปรับให้เป็นงานฉบับสมบูรณ์ต่อไป

      .

      ✍️ Step 4. E for Edit

      ในขั้นสุดท้าย เราจะปรับแก้ (edit) งานเขียนให้เป็นฉบับสมบูรณ์

      โดยในขั้นนี้ เราจะทำ 2 อย่าง:

      1. Structuring (what, where): แก้ไขโครงสร้างและลำดับการนำเสนอไอเดีย (เช่น เราอาจนำ module เกี่ยวกับ case study ขึ้นมาก่อน module เกี่ยวกับนิยามของ design thinking เพื่อดึงดูดผู้อ่านมากขึ้น)
      2. Revising (how): แก้ไขการสะกดคำ การเลือกใช้คำ และรูปแบบประโยค เพื่อให้งานเขียนอย่างกระชับ (concise) และตรงจุด (precise) มากขึ้น ถ้าคำหรือประโยคไหนที่ไม่มี 2 อย่างนี้ ให้ปรับแก้ในทันที

      🧢 Writing Method Combined

      Writing Method = Modular Writing + Writing Stages

      Writing method คือ วิธีสร้างงานเขียนที่ประกอบด้วย 2 หลักการ:

      1. Modular writing: แยกงานเขียนเป็นส่วน ๆ
      2. Writing stages: กระบวนการเปลี่ยนไอเดียให้กลายเป็นงานเขียน ผ่าน 4 ขั้นตอน (NODE)

      เราสามารถใช้ writing method ได้ใน 3 ขั้นตอนดังนี้:

      1. Split: แยกงานออกเป็น modules
      2. NODE: note, outline, draft, edit แต่ละ module
      3. Combine: นำทุก module มารวมกันให้เป็นงานเขียน
      Module 1 (Note -> Outline -> Draft -> Edit)
      +
      Module 2 (Note -> Outline -> Draft -> Edit)
      +
      Module 3 (Note -> Outline -> Draft -> Edit)
      +
      Module 4 (Note -> Outline -> Draft -> Edit)

      Writing method ช่วยให้เราสร้างงานเขียนได้โดยไม่ต้องกังวลว่าจะเขียนอะไร หรือจะเขียนได้ไหมอีกต่อไป เพราะเราจะเขียนอย่างค่อยเป็นค่อยไปและอย่างเป็นระบบที่เราสามารถมองเห็นและควบคุมแก้ไขได้


      🤩 Deep Note: Your Digital Zettelkasten

      ใครที่อยากมีระบบ Deep Noting ไว้ช่วยจัดเก็บและแปลงไอเดียให้กลายเป็นงานเขียนและ content ต่าง ๆ สามารถดูรายละเอียด Notion template “Deep Note: Your Digital Zettelkasten” ได้ที่ Notion Marketplace:


      🔔 ใครที่ชอบบทความนี้ ฝากกด subscribe และติดตามกันได้ที่:

    • 7 วิธีทำงานกับ time series data ในภาษา R: Base R, lubridate, และ zoo packages — ตัวอย่างการวิเคราะห์ราคา Bitcoin

      7 วิธีทำงานกับ time series data ในภาษา R: Base R, lubridate, และ zoo packages — ตัวอย่างการวิเคราะห์ราคา Bitcoin

      ในบทความนี้ เราจะมาเรียนรู้ 7 วิธีการทำงานกับ time series data หรือข้อมูลที่จัดเรียงด้วยเวลา ในภาษา R ผ่านการทำงานกับ Bitcoin Historical Data ซึ่งมีข้อมูล Bitcoin ในช่วงปี ค.ศ. 2010–2024 กัน:

      1. Converting: การแปลงข้อมูลเป็น datetime และ time series
      2. Missing values: การจัดการ missing values ใน time series data
      3. Plotting: การสร้างกราฟ time series data
      4. Subsetting: การเลือกข้อมูลจาก time series data
      5. Aggregating: การสรุป time series data
      6. Rolling window: การทำ rolling window
      7. Expanding window: การทำ expanding window

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


      🏁 Getting Started

      ในการเริ่มทำงานกับ time series ในภาษา R เราจะเริ่มต้นจาก 2 อย่าง ได้แก่:

      1. Install and load packages
      2. Load dataset

      .

      1️⃣ Install & Load Packages

      ในภาษา R เรามี 3 packages ที่ใช้ทำงานกับ time series data บ่อย ๆ ได้แก่:

      1. Base R packages ที่มาพร้อมกับภาษา R
      2. lubridate: ใช้แปลงข้อมูลและจัด format ของ date-time data
      3. zoo: ใช้ทำงานกับ time series data

      ในการเริ่มต้นใช้งาน เราจะติดตั้ง packages เหล่านี้กัน:

      # Install packages
      install.packages("lubridate"
      install.packages("zoo")
      install.packages("ggplot2") # for data visualisation
      

      จากนั้น เรียกใช้งาน packages:

      # Load packages
      library(lubridate)
      library(zoo)
      library(ggplot2) # for data visualisation
      

      Note: เราเพิ่ม ggplot2 เข้ามาด้วย เพื่อช่วยในการสร้างกราฟในภายหลัง

      .

      2️⃣ Load Dataset

      หลังติดตั้งและเรียกใช้งาน packages เราจะโหลด Bitcoin Historical Data (ดาวน์โหลดไฟล์ได้ที่ Kaggle) เข้ามาใน environment:

      # Load the dataset
      btc <- read.csv("btc_hist_2010-2024.csv")
      

      จากนั้น เราสามารถสำรวจข้อมูลได้ด้วย head() และ str():

      ## View the first 6 rows
      head(btc)
      
      ## View the structure
      str(btc)
      

      ผลลัพธ์ของ head():

                Date    Price     Open     High      Low   Vol. Change..
      1 Feb 09, 2024 47,545.4 45,293.3 47,710.2 45,254.2 86.85K    4.97%
      2 Feb 08, 2024 45,293.3 44,346.2 45,579.2 44,336.4 66.38K    2.15%
      3 Feb 07, 2024 44,339.8 43,088.4 44,367.9 42,783.5 48.57K    2.91%
      4 Feb 06, 2024 43,087.7 42,697.6 43,375.5 42,566.8 33.32K    0.91%
      5 Feb 05, 2024 42,697.2 42,581.4 43,532.2 42,272.5 39.26K    0.27%
      6 Feb 04, 2024 42,581.4 43,006.2 43,113.2 42,379.4 20.33K   -0.99%
      

      ผลลัพธ์ของ str():

      'data.frame':	4955 obs. of  7 variables:
       $ Date    : chr  "Feb 09, 2024" "Feb 08, 2024" "Feb 07, 2024" "Feb 06, 2024" ...
       $ Price   : chr  "47,545.4" "45,293.3" "44,339.8" "43,087.7" ...
       $ Open    : chr  "45,293.3" "44,346.2" "43,088.4" "42,697.6" ...
       $ High    : chr  "47,710.2" "45,579.2" "44,367.9" "43,375.5" ...
       $ Low     : chr  "45,254.2" "44,336.4" "42,783.5" "42,566.8" ...
       $ Vol.    : chr  "86.85K" "66.38K" "48.57K" "33.32K" ...
       $ Change..: chr  "4.97%" "2.15%" "2.91%" "0.91%" ...
      

      จากผลลัพธ์ เราจะเห็นว่า Bitcoin Historical Data มี 7 columns ด้วยกัน ได้แก่:

      No.ColumnDescription
      1Dateวันที่
      2Closeราคาปิด (USD)
      3Openราคาเปิด (USD)
      4Highราคาสูงสุด (USD)
      5Lowราคาต่ำสุด (USD)
      6Vol.ปริมาณการซื้อขาย
      7Change..การเปลี่ยนแปลงราคาจากวันก่อน (คิดเป็น %)

      นอกจากนี้ เราจะเห็นได้ว่า ทุก column เป็น character ซึ่งเราจะต้องแปลงให้เป็นประเภทข้อมูลที่ถูกต้องก่อน ซึ่งเราสามารถทำได้ดังนี้:

      1. สร้าง copy ของ btc
      2. เปลี่ยนชื่อ column (เพื่อให้ง่ายต่อการทำงาน)
      3. เปลี่ยน format ข้อมูลของ price และ volume
      4. แปลงประเภทข้อมูลจาก character เป็น numeric
      # Clean the dataset
      
      ## Make a copy of the dataset
      btc_cleaned <- btc
      
      ## Rename columns
      
      ### Create new column names
      new_col_names <- c("date",
                         "close", "open",
                         "high", "low",
                         "volume", "change")
      
      ### Rename
      colnames(btc_cleaned) <- new_col_names
      
      ### Check the results
      str(btc_cleaned)
      
      ## Convert data types
      
      ### Specify the columns to clean
      cols_to_clean <- c("close", "open",
                         "high", "low")
      
      ### Remove comma
      for (col in cols_to_clean) {
        btc_cleaned[[col]] <- gsub(",",
                                   "",
                                   btc_cleaned[[col]])
      }
      
      ### Remove "K"
      btc_cleaned$volume <- gsub("K",
                                 "",
                                 btc_cleaned$volume)
      
      ### Remove "%"
      btc_cleaned$change <- gsub("%",
                                 "",
                                 btc_cleaned$change)
      
      ### Specify columns to convert to numeric
      cols_to_num <- colnames(btc_cleaned[, -1])
      
      ### Convert data type to numeric
      for (col in cols_to_num) {
        btc_cleaned[[col]] <- as.numeric(btc_cleaned[[col]])
      }
      
      ### Check the results
      str(btc_cleaned)
      

      ผลลัพธ์:

      'data.frame':	4955 obs. of  7 variables:
       $ date  : chr  "Feb 09, 2024" "Feb 08, 2024" "Feb 07, 2024" "Feb 06, 2024" ...
       $ close : num  47545 45293 44340 43088 42697 ...
       $ open  : num  45293 44346 43088 42698 42581 ...
       $ high  : num  47710 45579 44368 43376 43532 ...
       $ low   : num  45254 44336 42784 42567 42273 ...
       $ volume: num  86.8 66.4 48.6 33.3 39.3 ...
       $ change: num  4.97 2.15 2.91 0.91 0.27 -0.99 -0.44 0.26 1.18 -0.85 ...
      

      ตอนนี้ ทุก column (ยกเว้น date) ถูกเปลี่ยนให้เป็น numeric เรียบร้อยแล้ว และชุดข้อมูลก็พร้อมจะถูกนำไปใช้งานต่อแล้ว


      🔄️ Converting

      เรามาดูวิธีแรกในการทำงานกับ time series data กัน นั่นคือ:

      1. การแปลงข้อมูลให้เป็น datetime
      2. การแปลงข้อมูลให้เป็น time series

      .

      1️⃣ การแปลงข้อมูลให้เป็น Datetime

      ในการทำงานกับ time series data เราจะต้องแปลงข้อมูลประเภทอื่น ๆ เช่น character และ numeric ให้เป็น datetime ก่อน เช่น date (เช่น “Feb 09, 2024”) ใน Bitcoin dataset

      เราสามารถแปลงข้อมูลจาก character เป็น Date ได้ 2 วิธี ดังนี้:

      .

      วิธีที่ 1. ใช้ as.Date() ซึ่งเป็น base R function และต้องการ input 2 อย่าง ได้แก่:

      1. x: ข้อมูลที่ต้องการแปลงเป็น Date
      2. format: format ของวันเวลาของข้อมูลต้นทาง (เช่น วัน-เดือน-ปี, ปี-เดือน-วัน, เดือน-วัน-ปี)
      # Convert `date` to Date
      btc_cleaned$date <- as.Date(btc_cleaned$date,
                                  format = "%b %d, %Y")
      

      Note: ศึกษาการกำหนด format ได้ที่ strptime: Date-time Conversion Functions to and from Character และ Date Formats in R

      .

      วิธีที่ 2. ใช้ as_date() จาก lubridate ซึ่งเป็นที่นิยมมากกว่า as.Date() เพราะ as_date() แปลงข้อมูลให้อัตโนมัติ โดยเราไม่ต้องกำหนด format ให้:

      # Convert `date` to Date
      btc_cleaned$date <- as_date(btc_cleaned$date)
      

      จากตัวอย่าง จะเห็นได้ว่า as_date() ใช้งานง่ายกว่า as.Date()

      .

      ทั้งนี้ ทั้งสองวิธีให้ผลลัพธ์เหมือนกัน คือ แปลง character เป็น Date ซึ่งเราสามารถเช็กผลลัพธ์ได้ด้วย str():

      # Check the results
      str(btc_cleaned)
      

      ผลลัพธ์:

      'data.frame':	4955 obs. of  7 variables:
       $ date  : Date, format: "2024-02-09" "2024-02-08" "2024-02-07" ...
       $ close : num  47545 45293 44340 43088 42697 ...
       $ open  : num  45293 44346 43088 42698 42581 ...
       $ high  : num  47710 45579 44368 43376 43532 ...
       $ low   : num  45254 44336 42784 42567 42273 ...
       $ volume: num  86.8 66.4 48.6 33.3 39.3 ...
       $ change: num  4.97 2.15 2.91 0.91 0.27 -0.99 -0.44 0.26 1.18 -0.85 ...
      

      จะเห็นได้ว่า ตอนนี้ price เปลี่ยนเป็นจาก character เป็น Date เรียบร้อยแล้ว

      .

      2️⃣ การแปลงข้อมูลให้เป็น Time Series

      นอกจากการแปลงข้อมูลบางส่วนให้เป็น datetime แล้ว เรายังต้องการแปลง dataset จาก data frame ให้เป็น time series เพื่อมี index ของข้อมูล เป็น datetime

      ในภาษา R เรามี time series 2 ประเภทหลัก ได้แก่:

      1. ts ของ base R ซึ่งเหมาะกับข้อมูลที่มีความถี่คงที่ (เช่น ข้อมูลมีระยะห่างกัน 1 วัน)
      2. zoo จาก zoo package ซึ่งเหมาะกับข้อมูลที่มีความถี่ไม่คงที่ (เช่น บางข้อมูลห่างกัน 1 วัน และบางข้อมูลห่างกัน 1 เดือน)

      ในตัวอย่าง Bitcoin เราจะแปลง dataset ให้เป็น zoo กัน:

      # Convert data frame to zoo object
      
      ## Convert
      btc_zoo <- zoo(btc_cleaned[, -1],
                     order.by = btc_cleaned$date)
      
      ## Check the results
      head(btc_zoo)
      

      ผลลัพธ์:

                 close open high low volume change
      2010-07-18   0.1  0.0  0.1 0.1   0.08      0
      2010-07-19   0.1  0.1  0.1 0.1   0.57      0
      2010-07-20   0.1  0.1  0.1 0.1   0.26      0
      2010-07-21   0.1  0.1  0.1 0.1   0.58      0
      2010-07-22   0.1  0.1  0.1 0.1   2.16      0
      2010-07-23   0.1  0.1  0.1 0.1   2.40      0
      

      จะเห็นได้ว่า datetime ถูกเปลี่ยนให้เป็น index ของข้อมูลแล้ว


      🤷‍♂️ Missing Values

      ในบางครั้ง เราอาจมี time series data ที่มีข้อมูลขาดหายไป ซึ่งเราอาจต้องการแทนที่ด้วยค่าบางอย่าง

      ในตัวอย่าง Bitcoin dataset เรามี missing values อยู่ใน volume ซึ่งเราสามารถเช็กได้ด้วย colSums() และ is.na() แบบนี้:

      # Count the missing values in each column
      colSums(is.na(btc_zoo))
      

      ผลลัพธ์:

       close   open   high    low volume change 
           0      0      0      0    271      0
      

      zoo package มี 3 functions ที่ช่วยให้เราแทนค่า missing values ได้ ดังนี้:

      No.FunctionDescription
      1na.fill()แทนค่าด้วยค่าที่เรากำหนด
      2na.locf()แทนค่าตามค่าของข้อมูลที่มาก่อนหน้า
      3na.approx()แทนค่าด้วยตามข้อมูลที่มาก่อนและหลัง missing values

      สำหรับ Bitcoin dataset เราจะใช้ na.approx() เนื่องจากข้อมูล Bitcoin มีความผันผวนและการแทนค่าแบบยืดหยุ่นจะดีกว่าการแทนค่าแบบกำหนดตายตัว:

      # Impute with na.approx()
      btc_zoo <- na.approx(btc_zoo)
      
      # Check the results
      colSums(is.na(btc_zoo))
      

      ผลลัพธ์:

       close   open   high    low volume change 
           0      0      0      0      0      0 
      

      ตอนนี้ missing values ถูกแทนค่าเรียบร้อย


      📈 Plotting

      การสร้างกราฟสามารถช่วยให้เราเข้าใจ time series data ได้ง่ายขึ้น

      เราสามารถทำได้ง่าย ๆ ด้วย autoplot.*() เช่น autoplot.ts() และ autplot.zoo()

      ใน Bitcoin dataset เราสามารถสร้างกราฟราคาปิดของ Bitcoin ในช่วง 2010**–**2024 ได้ด้วย autoplot.zoo() แบบนี้:

      # Plot the time series
      autoplot.zoo(btc_zoo[, "close"]) +
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin Closing Price Over Time (2010–2024)",
             x = "Time",
             y = "Closing Price (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:

      Note: ในตัวอย่าง เราใช้ ggplot2 ช่วยตกแต่งกราฟให้เข้าใจง่ายขึ้น, สำหรับคนที่สนใจ สามารถศึกษาการใช้ ggplot2 ได้ที่ วิธีใช้ ggplot2 เพื่อสร้างกราฟอย่างมืออาชีพระดับโลก แบบ BBC และ Financial Times ในภาษา R — ตัวอย่างการสำรวจข้อมูลเพนกวินจาก palmerpenguins


      ✂️ Subsetting

      ในการทำงานกับ time series data เราอาจต้องการตัดแบ่งข้อมูลบางส่วนมาเพื่อสำรวจการเปลี่ยนแปลงของข้อมูลในช่วงเวลาที่ต้องการ

      ยกตัวอย่างเช่น เราอยากจะสำรวจการเปลี่ยนแปลงราคาปิดของ Bitcoin ในช่วง Crypto Winter (Nov 2021 – Dec 2022)

      ในภาษา R เราสามารถตัดแบ่ง time series ได้ 3 วิธี ได้แก่:

      1. window()
      2. Boolean masking
      3. Specific date

      .

      1️⃣ window()

      window() เป็น base R function ซึ่งช่วยเราเลือกช่วงเวลาได้ด้วย input 3 อย่าง:

      1. x: time series data
      2. start: วันเริ่มต้น (inclusive)
      3. end: วันสิ้นสุด (inclusive)

      เราสามารถใช้ window() สร้างกราฟได้แบบนี้:

      # Subset
      btc_winter_1 <- window(x = btc_zoo,
                             start = as.Date("2021-11-01"),
                             end = as.Date("2022-12-31"))
      
      # Plot the results
      autoplot.zoo(btc_winter_1[, "close"]) +
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin Closing Price During the Crypto Winter (2021–2022)",
             x = "Time",
             y = "Closing (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:

      .

      2️⃣ Boolean Masking

      นอกจาก window() แล้ว เราสามารถเลือกช่วงเวลาด้วยการสร้าง Boolean mask ขึ้นมา แบบนี้:

      # Create a Boolean masking
      crypto_winter_index <- 
        index(btc_zoo) >= "2021-11-01" &
        index(btc_zoo) <= "2022-12-31"
      
      # Subset
      btc_winter_2 <- btc_zoo[crypto_winter_index, ]
      
      # Plot the results
      autoplot.zoo(btc_winter_2[, "close"]) +  
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin Closing Price During the Crypto Winter (2021–2022)",
             x = "Time",
             y = "Closing (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:

      จะเห็นว่า กราฟของ Boolean masking เหมือนกับการใช้ window()

      .

      3️⃣ Specific Date

      ในกรณีที่เราต้องการเลือกวันแทนช่วงเวลา (เช่น ดูข้อมูล Bitcoin เมื่อเกิด halving ครั้งแรก) เราสามารถเขียนภาษา R ได้แบบนี้:

      # Subset
      btc_first_halving <- btc_zoo["2012-11-28"]
      
      # Print the result
      btc_first_halving
      

      ผลลัพธ์:

                 close open high  low volume change
      2012-11-28  12.4 12.2 12.4 12.1  30.69   1.23
      

      🧮 Aggregating

      ในภาษา R เราสามารถสรุปข้อมูล time series data (เช่น หาค่าเฉลี่ย) ได้ด้วย apply.*() จาก zoo package:

      FunctionDescription
      apply.daily()สรุปข้อมูลรายวัน
      apply.weekly()สรุปข้อมูลรายสัปดาห์
      apply.quarterly()สรุปข้อมูลรายไตรมาส
      apply.yearly()สรุปข้อมูลรายปี

      โดย apply.*() ต้องการ input 2 อย่าง คือ:

      1. x: time series data
      2. FUN: การสรุปข้อมูล (เช่น mean, median, max, min)

      ยกตัวอย่างเช่น หาค่าเฉลี่ยราคาปิดของ Bitcoin ในแต่ละปี:

      # Example 1. View yearly mean closing price
      btc_yr_mean <- apply.yearly(btc_zoo[, "close"],
                                  FUN = mean)
      
      # Plot the results
      autoplot.zoo(btc_yr_mean) +  
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin Yearly Mean Closing Price (2010–2024)",
             x = "Time",
             y = "Closing (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:

      หรือหาราคาปิดสูงสุดในแต่ละไตรมาส:

      # Example 2. View quarterly max closing price
      btc_qtr_max <- apply.quarterly(btc_zoo[, "close"],
                                     FUN = max)
      
      # Plot the results
      autoplot.zoo(btc_qtr_max) +  
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin Quarterly Maximum Closing Price (2010–2024)",
             x = "Time",
             y = "Closing (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:

      ทั้งนี้ ถ้าเราต้องการกำหนดความถี่ของเวลาเอง เราสามารถใช้ endpoints() คู่กับ period.apply() ได้

      โดย endpoints() ต้องการ input 3 อย่าง:

      1. x: time series data
      2. on: ระดับช่วงเวลา (เช่น ปี, เดือน, สัปดาห์)
      3. k: จำนวน

      และ period.apply() ต้องการ input 3 อย่าง คือ:

      1. x: time series data
      2. INDEX: variable ที่เก็บ endpoints() เอาไว้
      3. FUN: function ที่ใช้สรุปข้อมูล (เช่น mean())

      ยกตัวอย่างเช่น เราต้องการหาค่าเฉลี่ยราคาปิด Bitcoin ทุก ๆ 3 เดือน เราจะเขียนภาษา R ได้แบบนี้:

      # Create 3-month interval
      three_month_eps <- endpoints(x = btc_zoo,
                                   on = "months",
                                   k = 3)
      
      # Apply the interval
      btc_three_month_data <- period.apply(x = btc_zoo[, "close"],
                                           INDEX = three_month_eps,
                                           FUN = mean)
      
      # Plot the results
      autoplot.zoo(btc_three_month_data) +  
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin 3-Month Average Closing Price (2010–2024)",
             x = "Date",
             y = "Closing Price (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:


      🪟 Rolling Window

      Rolling window (moving window หรือ sliding window) คือ การสรุปข้อมูลตามช่วงเวลาที่กำหนด โดยช่วงเวลาในการคำนวณจะเคลื่อนตัวไปเรื่อย ๆ

      เช่น เราต้องการหาค่าเฉลี่ยของราคาปิด Bitcoin ในช่วง 7 วันล่าสุด การใช้ rolling window จะทำให้เราได้ข้อมูลดังนี้:

      DateAverage
      2024-01-07ค่าเฉลี่ยระหว่างวันที่ 1 ถึง 7
      2024-01-08ค่าเฉลี่ยระหว่างวันที่ 2 ถึง 8
      2024-01-09ค่าเฉลี่ยระหว่างวันที่ 3 ถึง 9

      ในภาษา R เราสามารถสร้าง rolling window ได้ 2 วิธี:

      1. ใช้ roll*()
      2. ใช้ rollapply()

      .

      1️⃣ roll*()

      เราสามารถสร้าง rolling window ได้ด้วย roll*() จาก zoo package เช่น:

      FunctionDescription
      rollmean()หาค่าเฉลี่ย
      rollmedian()หาค่ากลาง
      rollmax()หาค่าสูงสุด
      rollsum()หาผลรวม

      roll*() ต้องการ input 3 อย่าง ได้แก่:

      1. x: time series data
      2. k: ช่วงเวลา (window)
      3. align: กำหนดว่า ค่าสรุปที่ได้จะอยู่ด้วยซ้าย ขวา หรือกลางช่วงเวลา
      4. fill: จะแทนค่า missing values หรือไม่

      ยกตัวอย่างเช่น เราต้องการหาค่าเฉลี่ยราคาปิด Bitcoin ในช่วง 30 วัน เราจะใช้ rollmean() แบบนี้:

      # Create the window for mean price
      btc_30_days_roll_mean <- rollmean(x = btc_zoo,
                                        k = 30,
                                        align = "right",
                                        fill = NA)
      
      # Plot the results
      autoplot.zoo(btc_30_days_roll_mean[, "close"]) +  
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin 30-Day Rolling Mean Price (2010–2024)",
             x = "Time",
             y = "Closing (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:

      .

      2️⃣ rollapply()

      ในกรณีที่เราต้องการกำหนดการสรุปข้อมูลใน rolling window (เช่น หาค่าต่ำสุด ซึ่งไม่มีใน zoo package) เราสามารถทำได้ด้วย rollapply() ซึ่งต้องการ input 4 อย่างดังนี้:

      1. data: time series data
      2. width: ช่วงเวลา (window)
      3. FUN: การสรุปข้อมูล (เช่น min)
      4. align: กำหนดว่า ค่าสรุปที่ได้จะอยู่ด้วยซ้าย ขวา หรือกลางช่วงเวลา
      5. fill: จะแทนค่า missing values หรือไม่

      ยกตัวอย่างเช่น หาราคาปิดต่ำสุดของทุก ๆ 30 วัน:

      # Creating a rolling window with min() function
      btc_30_days_roll_min <- rollapply(data = btc_zoo,
                                        width = 30,
                                        FUN = min,
                                        align = "right",
                                        fill = NA)
      
      # Plot the results
      autoplot.zoo(btc_30_days_roll_min[, "close"]) +  
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin 30-Day Rolling Minimum Price (2010–2024)",
             x = "Time",
             y = "Closing (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:


      ➡️ Expanding Window

      Expanding window เป็นการสรุปข้อมูลแบบสะสม เช่น:

      DateAverage
      2024-01-01หาค่าเฉลี่ยของวันที่ 1
      2024-01-02หาค่าเฉลี่ยของวันที่ 1 + 2
      2024-01-03หาค่าเฉลี่ยของวันที่ 1 + 2 + 3
      2024-01-04หาค่าเฉลี่ยของวันที่ 1 + 2 + 3 + 4
      2024-01-05หาค่าเฉลี่ยของวันที่ 1 + 2 + 3 + 4 + 5

      ในภาษา R เราสามารถสร้าง expanding window ได้ด้วย rollapply() โดยเราต้องกำหนดให้:

      1. width เป็นชุดตัวเลข (เช่น 1, 2, 3, …)
      2. align = "right" เสมอ

      ยกตัวอย่างเช่น สร้าง expanding window แบบค่าเฉลี่ยราคาปิดของเดือนมกราคม 2024:

      # Subset for Jan 2024 data
      btc_jan_2024 <- window(x = btc_zoo,
                             start = as.Date("2024-01-01"),
                             end = as.Date("2024-01-31"))
      
      # Create a sequence of widths
      btc_jan_2024_width <- seq_along(btc_jan_2024)
      
      # Create an expanding window for mean price
      btc_exp_mean <- rollapply(data = btc_2024,
                                width = btc_jan_2024_width,
                                FUN = mean,
                                align = "right",
                                fill = NA)
      
      # Plot the results
      autoplot.zoo(btc_exp_mean[, "close"]) +  
        
        ## Adjust line colour
        geom_line(color = "blue") +
        
        ## Add title and labels
        labs(title = "Bitcoin Expanding Mean Price (Jan 2024)",
             x = "Time",
             y = "Closing (USD)") +
        
        ## Use minimal theme
        theme_minimal()
      

      ผลลัพธ์:


      😎 Summary

      ในบทความนี้ เราได้ทำความรู้จักกับ 7 วิธีการทำงานกับ time series ในภาษา R โดยใช้ base R, lubridate, และ zoo package กัน:

      วิธีการทำงาน 1. Converting:

      FunctionFor
      as.Date()แปลง character เป็น Date
      as_date()แปลง character เป็น Date
      zoo()แปลง data frame เป็น zoo

      วิธีการทำงาน #2. Missing values:

      FunctionFor
      na.fill()แทนค่า missing values ด้วยค่าที่กำหนด
      na.locf()แทนค่า missing values ตามค่าของข้อมูลที่มาก่อนหน้า
      na.approx()แทนค่า missing values ด้วยการวิเคราะห์ข้อมูลที่มาก่อนและหลัง missing values

      วิธีการทำงาน #3. Plotting:

      FunctionFor
      autoplot.zoo()สร้างกราฟจาก zoo

      วิธีการทำงาน #4. Subsetting:

      FunctionFor
      window()ดึงข้อมูลช่วงเวลาที่ต้องการ
      btc_zoo[boolean_mask, ]ดึงข้อมูลช่วงเวลาที่ต้องการ
      btx_zoo[x, y]ดึงข้อมูลวันที่ต้องการ

      วิธีการทำงาน #5. Aggregating:

      FunctionFor
      apply.daily()สรุปข้อมูลรายวัน
      apply.weekly()สรุปข้อมูลรายสัปดาห์
      apply.quarterly()สรุปข้อมูลรายไตรมาส
      apply.yearly()สรุปข้อมูลรายปี
      endpoints() และ period.apply()สรุปข้อมูลตามช่วงเวลาที่กำหนดเอง

      วิธีการทำงาน #6. Rolling window:

      FunctionFor
      rollmean()rolling window แบบหาค่าเฉลี่ย
      rollmedian()rolling window แบบหาค่ากลาง
      rollmax()rolling window แบบหาค่าสูงสุด
      rollsum()rolling window แบบหาผลรวม
      rollapply()rolling window แบบกำหนดการสรุปข้อมูลเอง

      วิธีการทำงาน #7. Expanding window:

      FunctionFor
      seq_along() และ rollapply()สร้าง expanding window

      😺 View Code in GitHub

      ดู code และ dataset ในบทความนี้ได้ที่ GitHub


      📃 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:

    • Grow Your Business: สรุป 6 ขั้นตอนในการสร้างและพัฒนาธุรกิจให้บินได้สูงและบินไกล จากหนังสือ How to Grow Your Small Business ของ Donald Miller

      Grow Your Business: สรุป 6 ขั้นตอนในการสร้างและพัฒนาธุรกิจให้บินได้สูงและบินไกล จากหนังสือ How to Grow Your Small Business ของ Donald Miller

      Donald Miller เขียนหนังสือ How to Grow Your Small Business เพื่อถ่ายทอดแนวทางในการทำงานที่ช่วย “professionalise” (ทำให้เป็นมืออาชีพ) ธุรกิจของเรามากขึ้น

      หลายปีก่อน แม้ว่าธุรกิจจะเป็นไปได้ดี แต่ Miller ก็รู้สึกว่า ยังมีอะไรบางอย่างขาดหายไป และสิ่งนั้นทำให้ Miller รู้สึกติดกับอยู่ในธุรกิจของตัวเอง เพราะแทนที่ธุรกิจจะเติบโตได้ด้วยตัวเอง Miller ต้องคอยกำกับปฏิบัติการธุรกิจไม่ให้ “ลุกเป็นไฟ” ตลอดเวลา

      จากการลองผิดลองถูก Miller ค้นพบแนวทางการทำงานที่เหมาะสมและช่วยให้ธุรกิจเดินไปข้างหน้าได้โดยไม่ต้องคอยกำกับทุกย่างก้าว

      ในบทความนี้ เราจะมาสรุป Small Business Flight Plan หรือ 6 แนวทางการดำเนินธุรกิจจาก How to Grow Your Small Business กัน

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


      1. ✈️ The Airplane Model
      2. 1️⃣ Cockpit: Leadership
        1. 🧑‍✈️ Business on a Mission Guiding Principles
        2. 🚀 Part 1. Mission Statement
        3. 🔑 Part 2. Key Characteristics
        4. 🫡 Part 3. Critical Actions
        5. 💪 How to Implement Business on a Mission Guiding Principles
      3. 2️⃣ Right Engine: Marketing
        1. 🙉 Three Characteristics of Effective Marketing Message
        2. 📖 StoryBrand
        3. 🧑 Element 1. Character
        4. ⚔️ Element 2. Problem
        5. 🧘 Element 3. Guide
        6. 🗺️ Element 4. Plan
        7. ✊ Element 5. Call to Action
        8. 🤔 Elements 6 & 7. Failure & Success
        9. 💪 How to Implement StoryBrand
      4. 3️⃣ Left Engine: Sales
        1. 🦸 Customer Is the Hero Sales Framework
        2. 💪 How to Implement Customer Is the Hero Sales Framework
        3. 💡 Pro Tips
      5. 4️⃣ Wings: Product/Service
        1. 🔍 Step 1. Product Profitability Audit
        2. ⚗️ Step 2. More Profitable Products
        3. 👀 Step 3. Product Brief
      6. 5️⃣ Body: Operation & Overhead
        1. 🤝 Management and Productivity Made Simple Playbook
        2. 💪 How to Implement Management and Productivity Made Simple
        3. 🍎 Other Meetings
      7. 6️⃣ Fuel: Cash Flow
        1. 💸 Cash Flow Made Simple
        2. 💪 How to Implement Cash Flow Made Simple
      8. 😎 How to Implement Business Flight Plan

      ✈️ The Airplane Model

      หน้าปกหนังสือ How to Grow Your Small Business บน Amazon

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

      แม้ว่าเครื่องบิน (ธุรกิจ) จะมีส่วนประกอบต่าง ๆ มากมาย แต่เราสามารถแบ่งส่วนที่สำคัญได้เป็น 6 ส่วน ซึ่งเปรียบได้กับองค์ประกอบของธรกิจ ดังนี้:

      ลำดับเครื่องบินธุรกิจ
      1ห้องนักบินLeadership
      2เครื่องยนต์ขวาMarketing
      3เครื่องยนต์ซ้ายSales
      4ปีกProduct/service
      5ตัวเครื่องOperation และ overhead
      6น้ำมันCash flow
      ธุรกิจ = เครื่องบิน

      เพื่อให้ธุรกิจขึ้นบินและไปให้ถึงเป้าหมาย ทั้งหกส่วนนี้จะต้องทำงานร่วมกันอย่างสมดุล ถ้าส่วนใดส่วนหนึ่งขาดประสิทธิภาพ ก็อาจทำให้เครื่องบิน (ธุรกิจ) ตกจากฟ้าได้

      ยกตัวอย่างเช่น ธุรกิจที่ได้รับเงินจากนักลงทุนและใช้สอยไปกับสำนักงาน พนักงาน และ overhead อื่น ๆ โดยไม่ได้ลงทุนเพิ่มเติมกับด้านอื่น ๆ อย่าง marketing หรือ sales ทำให้เครื่องบินมีตัวเครื่องที่ใหญ่ แต่มีเครื่องยนต์และปีกที่เล็ก ทำให้ธุรกิจบินไปข้างหน้าได้อย่างทุลักทุเล

      ในทางตรงกันข้าม ถ้าเครื่องบินมีตัวเครื่องที่เล็ก (มี overhead น้อย) แต่มีเครื่องยนต์ที่ทรงพลังและมีนักบินที่ดี เครื่องบินก็สามารถบินได้สูงและบินได้ไกล

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


      1️⃣ Cockpit: Leadership

      Leader หรือนักบิน เป็นส่วนสำคัญแรกของธุรกิจ เพราะเป็นคนกำหนดจุดหมายและเส้นทางการบิน

      ถ้านักบินไม่มีจุดหมายหรือไม่รู้ว่าจะไปจุดหมายยังไง ก็ยากที่เครื่องบินจะบินไปถึงปลายทาง

      ในทางกลับกัน ถ้านักบินมีจุดหมายที่ชัดเจนและรู้เส้นทางการบินเป็นอย่างดี เครื่องบินก็ไปถึงที่หมายได้อย่างมีประสิทธิภาพ

      หน้าที่หลักของ leader คือ กำหนดเป้าหมายที่ชัดเจนและวางเส้นทางที่จะไปถึงเป้าหมายนั้นให้กับธุรกิจ

      🧑‍✈️ Business on a Mission Guiding Principles

      Business on a Mission Guiding Principles เป็นแนวคิดในการกำหนดเป้าหมายของธุรกิจอย่างมีประสิทธิภาพ ซึ่งประกอบด้วย 3 ส่วน ได้แก่:

      1. Mission Statement: ภารกิจของธุรกิจ
      2. Key Characteristics: ลักษณะที่ทีมงานควรมี
      3. Critical Actions: สิ่งที่ทีมงานทำได้เพื่อช่วยผลักดันธุรกิจไปข้างหน้า

      เราไปดูแต่ละส่วนของแต่ละส่วนกัน

      🚀 Part 1. Mission Statement

      Mission Statement คือ สิ่งที่สื่อถึงเป้าหมายของธุรกิจ

      หลาย ๆ องค์กรมี Mission Statement ที่ฟังดูดี แต่ไม่สามารถใช้งานได้จริง เพราะไม่สามารถกระตุ้นให้เกิด action ที่ช่วยให้ธุรกิจทำภารกิจสำเร็จได้

      ยกตัวอย่างเช่น “เราจะให้บริการลูกค้าด้วยความเป็นเลิศและความซื่อสัตย์” ซึ่งทำให้เกิดคำถามมากกว่า action เช่น:

      • ทีมจะต้องทำยังไงถึงจะได้ชื่อว่า “เป็นเลิศ” และ “ซื่อสัตย์”?
      • ทีมจะต้องทำอย่างนี้เมื่อไร?
      • เพราะอะไร?

      Mission Statement ที่ใช้งานได้จริงไม่ต้องใช้คำสวยหนูหรือฟังดูดี แต่ควรมี ลักษณะ 3 อย่าง ได้แก่:

      1. สั้น
      2. จดจำง่าย
      3. สร้างแรงบันดาลใจให้กับทีมงาน

      ถ้าทีมงานไม่สามารถจำ Mission Statement ได้ ก็ไม่มีทางที่องค์กรจะเดินไปสู่จุดหมายได้

      Mission Statement ที่ดีควรเป็นเหมือน war cry ที่เราสามารถตะโกนออกไป ทำให้เกิด action ที่ผลักดันธุรกิจไปข้างหน้า

      Miller เสนอว่า Mission Statement ที่ดีควรประกอบด้วย 3 อย่าง ซึ่งเขียนเป็นสูตรสำเร็จได้ดังนี้:

      We will accomplish X by Y because Z.

      ข้อที่ 1. X หมายถึง economic priorities หรือเป้าหมายทางธุรกิจที่มีความเจาะจง วัดได้ และชัดเจน เช่น:

      • ร้านอาหาร: เราจะเปิดสาขาใหม่ 100 สาขา
      • ร้านหนังสือ: เราจะเพิ่มยอดขาย 10%
      • ที่ปรึกษาธุรกิจ: เราจะเพิ่มฐานลูกค้า 20%

      Pro tip: เราไม่ควรกำหนด X เกิน 3 ข้อ เพราะจะทำให้ทีมงานไม่สามารถโฟกัสกับสิ่งที่จะต้องทำจริง ๆ ได้ยากขึ้น การกำหนด 1-3 economic priorities เป็นตัวเลขที่กำลังดี

      ข้อที่ 2. Y หมายถึง timeline ที่เราจะต้องการไปถึงเป้าหมายที่วางไว้ เช่น:

      • ร้านอาหาร: เราจะเปิดสาขาใหม่ 100 สาขา ภายในสิ้นปี
      • ร้านหนังสือ: เราจะเพิ่มยอดขาย 10% ภายในไตรมาส 2
      • ที่ปรึกษาธุรกิจ: เราจะเพิ่มฐานลูกค้า 20% ภายใน 3 เดือน

      การเพิ่มเวลาเข้าไปก็เป็นการสร้างความเร่งด่วนที่จะช่วยผลักดันธุรกิจไปข้างหน้า

      ข้อที่ 3. Z คือ เหตุผลที่เราต้องการที่จะได้ X ภายใน Y

      คนส่วนใหญ่ต้องการเป็นส่วนหนึ่งของภารกิจที่มีความสำคัญ และการกำหนด Z จะช่วยสื่อสารกับทีมงานว่า ทำไม X ถึงสำคัญ

      เช่น:

      • ร้านอาหาร: เราจะเปิดสาขาใหม่ 100 สาขา ภายในสิ้นปี เพราะทุกคนควรจะมีโอกาสได้ทานอาหารอร่อย ๆ
      • ร้านหนังสือ: เราจะเพิ่มยอดขาย 10% ภายในไตรมาส 2 เพราะทุกคนควรได้อ่านหนังสือดี ๆ
      • ที่ปรึกษาธุรกิจ: เราจะเพิ่มฐานลูกค้า 20% ภายใน 3 เดือน เพราะทุกธุรกิจควรได้รับคำปรึกษาแบบมืออาชีพ

      🔑 Part 2. Key Characteristics

      ส่วนที่ 2 ของ Business on a Mission Guiding Principles คือ Key Characteristics หรือลักษณะที่ทีมงานควรมี ซึ่งจะช่วยให้ขับเคลื่อนธุรกิจให้ไปถึงเป้าหมายที่ต้องการ (three economic priorities)

      ในการกำหนด Key Characteristics เราควรเลือกลักษณะที่:

      1. ช่วยลูกค้าแก้ปัญหาหรือช่วยสร้างรายได้ให้กับธุรกิจ
      2. ช่วยให้ทีมงานไม่ย่อท้อเมื่อเผชิญกับปัญหาและอุปสรรค
      3. สร้างการมีส่วนร่วมและสภาพแวดล้อมในการทำงานที่ปลอดภัย

      ยกตัวอย่างเช่น ที่ปรึกษาทางการเงิน:

      1. ให้คิดถึงลูกค้าก่อนเสมอ
      2. สามารถอธิบายการลงทุนที่ซับซ้อนได้
      3. ช่วยให้ลูกค้ามีเงินเก็บ

      🫡 Part 3. Critical Actions

      ส่วนสุดท้ายของ Business on a Mission Guiding Principles คือ Critical Actions ซี่งหมายถึง action ที่ทีมงานแต่ละคนสามารถทำได้ทุกวัน ซึ่งจะช่วยขับเคลื่อนธุรกิจไปข้างหน้า พร้อมกับสร้างวัฒนธรรมองค์กรและภายลักษณ์ของธุรกิจให้คนภายนอก

      ยกตัวอย่างเช่น ร้านขายขนมปัง:

      1. เราจะชวนลูกค้าทุกคนที่เดินเข้ามาในร้านชิมขนมอบใหม่
      2. เราจะเช็กวันหมดอายุของทุกวัตถุดิบในครัว
      3. เราจะทำความสะอาดที่ทำงานทุดชั่วโมง

      💪 How to Implement Business on a Mission Guiding Principles

      เราสามารถกำหนด Business on a Mission Guiding Principles ได้โดยใช้ worksheet ฟรีจาก SmallBusinessFlightPlan.com:

      Business on a Mission Guiding Principles Worksheet

      เมื่อเรากำหนด Guiding Principles เรียบร้อยแล้ว เราสามารถนำ Guiding Principles ไปใช้ในเอกสารหรือวาระต่าง ๆ เพื่อเน้นย้ำเส้นทางและเป้าหมายของธุรกิจให้กับทีมงานได้

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

      • รีวิว Guiding Principles ในการประชุมพนักงานทุกสัปดาห์
      • เขียนติดไว้บนผนังในออฟฟิศ
      • ทำวิดีโอเพื่ออธิบาย Guiding Principles ให้กับพนักงานใหม่
      • ใส่ Guiding Principles ไว้ในเอกสารประกาศงาน

      การกำหนด Guiding Principles เป็นเหมือนการเสริมประสิทธิภาพห้องนักบิน ซึ่งจะทำให้ธุรกิจของเราบินไปข้างหน้าได้อย่างมีเป้าหมายและทิศทางมากขึ้น


      2️⃣ Right Engine: Marketing

      ส่วนประกอบที่ 2 ของธุรกิจ คือ marketing ซึ่งเปรียบเสมือนเครื่องยนต์ขวาที่ขับเคลื่อนธุรกิจไปข้างหน้า

      ถ้าเราไม่มี marketing ที่ดี ธุรกิจของเราก็จะขึ้นบินได้ยาก

      Marketing เป็นเรื่องของการสร้าง brand ผ่านการสื่อสารกับลูกค้า สิ่งที่ลูกค้ารับรู้เกี่ยวกับธุรกิจมาจากคำที่เราใช้ brand ของเราจะถูกสร้างจากคำที่เราสื่อสารออกไป ดังนั้น เราจะต้องเลือกใช้คำให้เหมาะสมเพื่อ marketing มีประสิทธิภาพที่สุด

      🙉 Three Characteristics of Effective Marketing Message

      ในยุคที่ทุกคนพยายามแย่งความสนใจที่มีอยู่อย่างจำกัด เราจะเรียกให้คนหันมาหา brand เราได้ ถ้า marketing message ของเรามี 3 อย่างนี้:

      1. Survive and thrive: สื่อสารให้ลูกค้าเข้าใจได้ว่า ธุรกิจของเราช่วยให้ลูกค้าอยู่รอดและเติบโตยังไงได้บ้าง
      2. Simple language: ใช้ภาษาที่เข้าใจง่าย ทำให้ลูกค้าไม่ต้องตีความสารที่เราต้องการจะสื่อ
      3. Story: สุดท้ายและอาจเรียกได้ว่าสำคัญที่สุด คือ เราจะต้องสื่อสารกับลูกค้าผ่านเรื่องราว เพราะมนุษย์จะจดจำสิ่งต่าง ๆ ได้ดีถ้าผูกกันเป็นเรื่องราว

      📖 StoryBrand

      StoryBrand เป็นแนวคิดในการออกแบบ marketing message ให้เป็นเรื่องราว โดยใช้ 7 องค์ประกอบที่เรามักพบได้ในหนังหรือนิยาย ซึ่งได้แก่:

      StoryBrand Seven-Part Framework (source: How to Grow Your Small Business)
      1. Character: ตัวละครเอกของเรื่อง เช่น Luke Skywalker
      2. Problem: ปมความขัดแย้งของเรื่อง เช่น การต่อสู้กับ Empire
      3. Guide: คนที่จะช่วยตัวเอกแก้ปัญหา เช่น Yoda
      4. Plan: เส้นทางการเดินทางของตัวเอก เช่น การฝึกเป็น Jedi
      5. Call to Action: การเรียกให้ตัวเอกออก action เช่น การที่ Yoda บอกให้ Luke ออกไปต่อสู้กับ Empire
      6. Failure: สิ่งที่จะเกิดขึ้นหากตัวเอกล้มเหลว เช่น ทุกคนจะตกอยู่ภายใต้อำนาจของ Empire
      7. Success: สิ่งที่จะเกิดขึ้นหากตัวเอกทำสำเร็จ เช่น ทุกคนจะเป็นอิสระจาก Empire

      เราไปดูรายละเอียดและการแต่ละองค์ประกอบในการสร้าง brand กัน

      🧑 Element 1. Character

      Character เป็นองค์ประกอบแรกสุดในของทุกเรื่องราว หนังที่เราดูหรือนิยายที่เราอ่านเปิดเรื่องมาด้วยตัวละครเอกที่มีความต้องการอะไรบางอย่าง (เช่น ต้องการเป็นราชาโจรสลัด)

      กรนำเสนอตัวเอกเป็นการเปิด story loop ในใจของผู้รับสาร และชวนให้อยากติดตามสารของเรา

      ในการสร้าง brand ตัวละครเอกของเรา คือ ลูกค้าที่ต้องการแก้ปัญหาบางอย่าง

      เราสามารถเปิด story loop ด้วยการสื่อสารถึงความต้องการของลูกค้าให้มีความเฉพาะเจาะจงมากที่สุด เพื่อเรียกความสนใจกลุ่มเป้าหมายของเรา

      ยกตัวอย่างเช่น ธุรกิจให้คำปรึกษาคู่แต่งงาน แทนที่จะเปิด loop อย่างกว้าง ๆ เช่น:

      ❌ ลูกค้าต้องการความสุขในชีวิตแต่งงาน

      ควรเจาะจงความต้องการของลูกค้ามากขึ้น เช่น:

      ✅ ลูกค้าต้องการกลับมารักกันเหมือนกับตอนแต่งงานใหม่ ๆ

      ยิ่งเราระบุความต้องการได้เฉพาะเจาะจงเท่าไร เราก็ยิ่งเรียกความสนใจจากกลุ่มเป้าหมายได้ดีขึ้นเท่านั้น

      ⚔️ Element 2. Problem

      หลังจากเปิด loop ด้วย Character แล้ว เราจะขยาย loop ให้กว้างขึ้นด้วยการนำเสนอ Problem หรือความขัดแย้งใน story ของเรา

      Problem ทำหน้าที่เป็น hook ที่จะทำให้ทุกคนหันมาสนใจ เรื่องราวที่ไม่มีความขัดแย้งจะเหมือนเรื่องที่ไม่มีจุดเริ่มต้นและเดินเรื่องไปเรื่อย ๆ อย่างน่าเบื่อ

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

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

      สำหรับการสร้าง brand, Problem ที่เราจะใส่เข้าไปในเรื่องราว คือ ปัญหาที่ลูกค้ามีซึ่งธุรกิจของเราสามารถช่วยแก้ไขได้

      เมื่อพูดถึงปัญหาที่ตรงใจ ลูกค้าก็พร้อมจะหันมารับฟังเรา

      ยกตัวอย่างเช่น บริษัทจัดหาพนักงาน: “หลายบริษัทหาพนักงานที่มีความสามารถและเข้ากับองค์กรไม่ได้”

      🧘 Element 3. Guide

      หลังจากนำเสนอตัวเอกที่มีความต้องการและอุปสรรคที่ขัดขวางความต้องการแล้ว เราพร้อมที่จะแนะนำธุรกิจของเราในฐานะ Guide

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

      ตัวเอกของเรื่องต้องการคนที่สามารถช่วยให้พวกเขาไปถึงจุดหมายได้ ไม่ใช่ตัวเอกอีกคนที่ต้องการอะไรบางอย่าง ดังนั้น เราไม่ควรวางตัวเป็น Hero แต่เป็น Guide ที่ดี

      เราสามารถแสดงตัวเป็น Guide ที่ดี ได้ด้วยการแสดงออกถึงลักษณะ 2 อย่าง ได้แก่:

      1. Empathy: แสดงออกว่า เราเข้าใจมุมมองและความรู้สึกของลูกค้า
      2. Authority: แสดงออกว่า เรามีความรู้ความสามารถที่จะช่วยแก้ปัญหาของลูกค้าได้

      เราสามารถแสดงออกถึง 2 ลักษณะนี้ผ่านข้อความง่าย ๆ เช่น:

      • Empathy: “We know how it feels like to …”
      • Authority: “We have helped thousands of people like you overcome …”

      เมื่อเราแสดงให้ลูกค้าเห็นว่า เราเป็น Guide ที่เข้าใจและมีความสามารถแล้ว ลูกค้าก็จะเชื่อใจเรามากขึ้น

      🗺️ Element 4. Plan

      หลังจากแนะนำตัวในฐานะ Guide แล้ว เราจะช่วยให้ลูกค้าเข้าใกล้เป้าหมายมากขึ้น ด้วยการบอก Plan หรือขั้นตอนที่ลูกค้าต้องทำเพื่อไปถึงจุดหมายที่ต้องการ

      Plan ที่เราจะสื่อสารออกไปควรไม่เกิน 3-4 ขั้นตอน เพื่อลูกค้าเข้าใจและจดจำได้ง่าย

      ยกตัวอย่างเช่น Plan ของเว็บไซต์ขายรองเท้าออนไลน์:

      1. สั่งสินค้า
      2. ลองสินค้า
      3. คืนสินค้าหากไม่พอดีเท้า
      4. สั่งสินค้า

      Plan จะช่วยให้ลูกค้าเข้าใจเป้าหมายมากขึ้น ด้วยการสร้างความชัดเจนถึงสิ่งที่ต้องทำเพื่อให้ได้สิ่งที่ต้องการ

      ✊ Element 5. Call to Action

      แม้ว่ามี Plan แล้ว แต่ลูกค้าก็อาจจะยังไม่กดซื้อสินค้า/บริการของเรา เพื่อกระตุ้นให้ลูกค้าลงมือทำ เราจะต้องมี Call to Action

      Call to Action ของเราควรตรงไปตรงมา และใช้คำที่ลูกค้าสามารถตอบรับหรือปฏิเสธได้

      เราควรหลีกเลี่ยงการใช้คำที่อ้อมค้อม เช่น “Learn more” หรือ “Get started” เพราะจะทำให้เราดูขาดความมั่นใจว่า ธุรกิจเราจะช่วยแก้ปัญหาของลูกค้าได้

      เราควรใช้คำที่ลูกค้าสามารถตอบรับหรือปฏิเสธได้อย่างชัดเจน เช่น:

      • “Buy now”
      • “Schedule a call”
      • “Call today”

      เพื่อให้ลูกค้ารู้ว่า เรากำลังเชิญชวนให้ลูกค้าทำอะไรบางอย่างเพื่อให้เกิดการเปลี่ยนแปลง

      🤔 Elements 6 & 7. Failure & Success

      สุดท้าย เราจะพูดถึง Failure และ Success เพื่อช่วยให้ลูกค้าตัดสินใจได้ง่ายขึ้น

      Failure หรือ Success หมายถึง การสื่อสารให้ลูกค้ารู้ว่า ชีวิตจะเปลี่ยนแปลงไปยังไงบ้าง ถ้าไม่ซื้อ vs ซื้อสินค้า/บริการของเรา

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

      • Failure: ลูกค้าจะต้องเจอปัญหาที่มีอยู่อีกนานเท่าไร?
      • Success: ชีวิตของลูกค้าจะดีขึ้นยังไงบ้าง?

      หลังจากสื่อสารทั้ง 7 องค์ประกอบแล้ว ลูกค้าก็มีโอกาสที่จะซื้อสินค้า/บริการของเรามากขึ้น

      💪 How to Implement StoryBrand

      เราสามารถสร้าง story ของเราได้ ด้วยการใช้ StoryBrand BrandScript จาก SmallBusinessFlightPlan.com:

      StoryBrand BrandScript (source: How to Grow Your Small Business)

      เมื่อเราได้ story ที่เราต้องการจะสื่อสารกับลูกค้าแล้ว เราสามารถนำ story ดังกล่าวไปปรับใช้กับเอกสารทาง marketing ต่าง ๆ เช่น:

      • Landing page
      • นามบัตร
      • โฆษณา

      เพื่อช่วยให้เรื่องราวที่เราสื่อสารในทุก ๆ จุดเป็นเนื้อเรื่องเดียวกัน


      3️⃣ Left Engine: Sales

      ส่วนประกอบที่ 3 ของธุรกิจ คือ sales ซึ่งเปรียบเหมือนเครื่องยนต์ซ้ายของเครื่องบิน

      Sales เป็นส่วนสำคัญในการผลักดันธุรกิจ เพราะถ้าไม่มี sales เราก็จะไม่สามารถส่งมอบคุณค่าให้กับลูกค้าและสร้างรายได้ให้กับธุรกิจได้

      ในการสร้างเครื่องยนต์ซ้ายที่ดี เราสามารถใช้ StoryBrand เพื่อสร้างเล่าเรื่องและชวนลูกค้าเข้ามาทำความรู้จักกับธุรกิจของเราได้

      StoryBrand เมื่อปรับใช้กับ sales จะเรียกแนวคิดนี้ว่า Customer Is the Hero Sales Framework

      🦸 Customer Is the Hero Sales Framework

      Sales เป็นสิ่งที่หลาย ๆ คนอาจไม่ชอบ เพราะรู้สึกว่า sales เป็นเรื่องของการจูงใจ โน้มน้าวใจให้ที่ไม่อยากซื้อมาซื้อกับเราให้ได้

      ในจุดนี้ Miller ชวนให้เรามอง sales ใหม่

      จาก:

      Sales = Manipulation (บงการ)

      เป็น:

      Sales = Invite customers into a story

      ในการขายในฉบับ Miller เราจะใช้แนวคิดเดียวกับ marketing นั่นคือ ขายผ่านเรื่องราวซึ่งมี 7 องค์ประกอบ:

      1. Character
      2. Problem
      3. Guide
      4. Plan
      5. Call to Action
      6. Failure
      7. Success

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

      ซึ่งถ้าเราจะทำแบบนั้นได้ เราจะต้อง “think in story” ให้เป็น

      Miller ยกตัวอย่างเชฟที่รับจ้างทำอาหารตามบ้าน ถ้าเชฟไม่ได้ “คิดเป็นเรื่องราว” เมื่อมีคนถามว่าทำอาชีพอะไร เชฟอาจจะตอบว่า:

      “ผมเป็นเชฟส่วนตัว ผมรับจ้างทำอาหารตามบ้าน”

      ในทางกลับกัน ถ้าเชฟใช้เรื่องราวในการขาย:

      “คุณรู้ไหมว่า ครอบครัวส่วนใหญ่ไม่ได้กินข้าวด้วยกัน? หรือถ้ากินด้วยกันก็ไม่ได้กินอาหารที่ดีต่อสุขภาพ ผมเป็นเชฟส่วนตัว ผมรับจ็อบทำอาหารตามบ้าน เพื่อให้เจ้าของบ้านได้ใช้เวลากับครอบครัวอย่างเต็มที่ และไม่ต้องห่วงเรื่องคุณภาพอาหารหรือเก็บกวาดครัว”

      ถ้าเราสังเกตดี ๆ จะเห็นว่า การพูดของเชฟมีองค์ประกอบของ StoryBrand เช่น:

      1. Character: ครอบครัวที่ต้องการทานอาหารด้วยกัน
      2. Problem: ไม่มีเวลาทานอาหารดี ๆ ด้วยกัน
      3. Guide: เชฟส่วนตัว

      ทั้งนี้ เชฟสามารถใช้องค์ประกอบอื่น ๆ ของ StoryBrand ในการพูดคุยต่อได้

      เช่น Plan:

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

      Failure ที่สื่อสารผลกระทบเชิงลบที่อาจตามมา พร้อมความเร่งด่วน:

      “อีกไม่กี่ปี เด็ก ๆ ก็จะโตออกไปอยู่ด้วยตัวเองแล้ว”

      และ Success:

      “ลูกค้าของผมได้ทานอาหารอร่อย ๆ และนั่งสบาย ๆ ทำความรู้จักคนในครอบครัวมากขึ้น นี่ขนาดว่าผมไปบ้านพวกเขาแค่ 1-2 วันจ่อสัปดาห์เองนะ”

      Call to Action ที่ตรงไปตรงมา ช่วยให้ลูกค้าตอบรับหรือปฏิเสธได้:

      “ตอนนี้ ผมมีเวลาช่วงเย็นวันพุธ คุณสนใจอยากจะนัดคุยกันเลยไหม?”

      💪 How to Implement Customer Is the Hero Sales Framework

      เพื่อช่วยให้เราคิดเป็นเรื่องราวได้ เราสามารถวางเรื่องราวที่เราจะใช้เล่าได้ก่อน

      เมื่อเราร่างเรื่องราวเสร็จ ให้เรา highlight ข้อความต่าง ๆ เพื่อให้แน่ใจว่า เรามีครบทั้ง 7 องค์ประกอบ:

      1. Character: –
      2. Problem: สีแดง 🔴
      3. Guide: สีม่วง 🟣
      4. Plan: สีน้ำตาล 🟤
      5. Call to Action: สีเขียว 🟢
      6. Failure: สีเหลือง 🟡
      7. Success: สีน้ำเงิน 🔵

      ในกรณีที่เราเห็นว่า เรื่องราวของเรามีองค์ประกอบมากเกินไป เช่น สีแดง (Problem) เยอะเกิน เราสามารถแก้ไขเนื้อเรื่องเพื่อให้มีความสมดุลมากขึ้นได้

      เมื่อเขียนเสร็จ เราก็จะได้เรื่องราวสำหรับพูดคุยและชวนลูกค้าเข้ามาทำความรู้จักกับธุรกิจของเรา

      💡 Pro Tips

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

      ถ้าไม่เหมาะ เราไม่ควรพยายามขายต่อ หรือพยายามไม่ให้ลูกค้าซื้อสินค้า/บริการจากเรา เพราะลูกค้าที่ไม่ fit อาจจะไม่ได้ประโยชน์จากธุรกิจของเรา และในกรณีที่ลูกค้าไม่พอใจ ก็อาจจะส่งผลเสียกับ brand มากกว่าได้

      ดังนั้น เราควรมองหาลูกค้าที่เหมาะกับเรื่องราวของเรา และกรองลูกค้าที่ไม่ใช่ออก

      นอกจากนี้ แม้ว่าเราจะขายผ่านเรื่องราว แต่ลูกค้าก็มีสิทธิ์ปฏิเสธที่จะเข้าร่วมเรื่องราวของเรา ในกรณีที่ลูกค้าปฏิเสธ ให้เราปิดจบการขายอย่างมั่นใจ เช่น:

      “ไม่เป็นไรครับ ถ้าคุณรู้จักใครที่อยากได้เชฟส่วนตัว สามารถบอกผมได้เลย”

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


      4️⃣ Wings: Product/Service

      ส่วนประกอบที่ 4 ของธุรกิจ คือ สินค้าและบริการ ซึ่งเปรียบเหมือนปีกเครื่องบิน

      ไม่ว่าเครื่องยนต์ (marketing และ sales) จะดีแค่ไหน แต่ถ้าปีกไม่กว้างหรือแข็งแรงพอ เครื่องบินก็จะไม่สามารถขึ้นบินได้

      เพื่อสร้างปีกที่แข็งแรง Miller เสนอให้เราทำตาม 3 ขั้นตอนดังนี้:

      1. Product Profitability Audit
      2. New profitable products
      3. Product brief

      🔍 Step 1. Product Profitability Audit

      ในขั้นแรก ให้เราจัดลำดับสินค้า/บริการตามผลกำไร (profitability) ซึ่งเราคำนวณได้ง่าย ๆ จากสูตร: ราคาขาย – ต้นทุน

      (เราสามารถใช้ Product Profitability Audit Worksheet ช่วยได้ ดู worksheet ฟรีได้ที่ SmallBusinessFlightPlan.com)

      Product Profitability Audit Worksheet:

      Product Profitability Audit Worksheet

      เมื่อทำแบบนี้แล้ว เราสามารถแบ่งสินค้า/บริการได้เป็น 2 กลุ่ม:

      1. กลุ่มที่ทำกำไรได้ดี
      2. กลุ่มที่ขายไม่ออก

      สำหรับกลุ่มแรก ให้เราโฟกัสการขายไปเพื่อเพิ่มยอดขายจากเดิม เพราะการขายของที่ขายดีอยู่แล้วง่ายกว่าการขายของอื่น

      สำหรับกลุ่มที่สอง ให้เราเลือกหยุดขายเพื่อที่เราจะได้ (1) โฟกัสกับสินค้า/บริการที่ขายดี และ (2) ไม่ต้องแบกรับต้นทุนต่อ

      ⚗️ Step 2. More Profitable Products

      นอกจากการโฟกัสไปที่สินค้า/บริการขายดีและหยุดขายสินค้า/บริการที่ขายไม่ดี เราสามารถเพิ่มประสิทธิภาพภาพของปีกด้วยการสร้างสินค้า/บริการที่ขายดีเพิ่ม

      Miller แนะนำสินค้า/บริการไว้ 6 ประเภท ได้แก่:

      1. Making money: สินค้า/บริการที่ช่วยลูกค้าสร้างรายได้เพิ่ม เช่น การให้คำปรึกษาทางการเงิน
      2. Save money: สินค้า/บริการที่ช่วยลูกค้าออมเงินหรือประหยัดเงิน
      3. Reducing frustration: สินค้า/บริการที่สร้างความอุ่นใจ สบายใจ หรือสุขใจให้กับลูกค้า เช่น บริการดูแลสัตว์เลี้ยงเวลาเจ้าของไม่อยู่บ้าน
      4. Gaining status: สินค้า/บริการที่สร้างฐานะให้กับลูกค้า เช่น เครื่องเพชร, นาฬิกา, รถยนต์
      5. Creating connection: สินค้า/บริการที่สร้าง community และทำให้คนที่มีความสนใจเหมือนกันได้รวมตัวกัน
      6. Offering simplicity: สินค้า/บริการที่ช่วยแก้ปัญหาได้อย่างง่ายดาย เช่น บริการทำความสะอาด

      👀 Step 3. Product Brief

      สุดท้าย ก่อนที่เราจะสร้างสินค้า/บริการใด ๆ เราจะต้องเขียน product brief หรือเอกสารที่แจกแจงรายละเอียดต่าง ๆ ของสินค้า/บริการ พร้อมส่งต่อ product brief ให้กับทีม เพื่อเป็นการทดสอบและพัฒนาไอเดียต่อที่จะสร้างเป็นสินค้า/บริการจริง

      (ดู Product Brief Worksheet ได้ฟรีที่ SmallBusinessFlightPlan.com)

      ตัวอย่าง Product Brief Worksheet:

      ตัวอย่างบางส่วนของ Product Brief Worksheet

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

      เมื่อเราทำทั้ง 3 อย่าง:

      1. Product Profitability Audit: เน้นขายสินค้า/บริการที่สร้างกำไรได้ดี และหยุดขายสินค้า/บริการที่ขายไม่ดี
      2. More profitability products: สร้างสินค้า/บริการที่สร้างรายได้เพิ่มเติม
      3. Product brief: เขียนรายละเอียดสินค้า/บริการใหม่

      เราก็จะทำให้ปีกของเราแข็งแรง มีแรงส่งให้ธุรกิจของเราบินไดีเร็วและไกลมากขึ้น


      5️⃣ Body: Operation & Overhead

      Operation และ overhead เปรีบเหมือนตัวเครื่อง และเป็นส่วนประกอบที่ 5 ของธุรกิจ

      ถ้าตัวเครื่องมีขนาดใหญ่เกินไป เครื่องบินก็จะขึ้นบินได้ยาก

      เช่นเดียวกัน ธุรกิจจะเติบโตจะได้ยาก ถ้าเรามีค่าใช้จ่ายที่ไม่ช่วยผลักดันธุรกิจไปข้างหน้ามากเกินไป

      ถ้าเราต้องการให้ธุรกิจบินได้เร็วและคล่องตัว เราจะต้องทำให้ตัวเครื่องมีขนาดเล็กลง ซึ่งทำได้ 2 วิธี:

      วิธีที่ 1: Lay off หรือลดขนาดตัวเครื่องด้วยการปลดพนักงานออก ซึ่งสามารถส่งผลต่อภาพลักษณ์ของธุรกิจ และความสัมพันธ์กับพนักงาน

      วิธีที่ 2: เปลี่ยน overhead ให้กลายเป็นเครื่องยนต์ที่ขับเคลื่อนธุรกิจ

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

      เราควรใช้วิธีที่ 2 เป็นอันดับแรก และเก็บวิธีที่ 1 ไว้ใช้เมื่อจำเป็นจริง ๆ เท่านั้น

      🤝 Management and Productivity Made Simple Playbook

      Miller สร้าง Management and Productivity Made Simple Playbook ขึ้นมาเพื่อเปลี่ยน overhead ให้กลายเป็นแรงผลักดันธุรกิจ ด้วยการจัดทัพให้พนักงานไปสู่จุดหมายเดียวกัน ผ่าน 5 การประชุม ได้แก่:

      1. All-Staff Meeting: ประชุมรวมพนักงาน ทุก ๆ วันแรกของสัปดาห์ เพื่อช่วยให้พนักงานโฟกัสกับ 3 economic priorities และรักษากำลังใจพนักงาน ใช้เวลา 45-60 นาที
      2. Leadership Meeting: ประชุมผู้บริหารและหัวหน้า เพื่อสื่อสารโปรเจกต์ที่ดำเนินการอยู่ของแต่ละฝ่าย รวมทั้งอุปสรรคที่กำลังเผชิญ จัดขึ้นทุกสัปดาห์หลัง All-Staff Meeting และใช้เวลา 30-60 นาที
      3. Department Stand-up: ประชุมทีมของแต่ละฝ่าย เพื่อกำหนดเป้าหมายงานในแต่ละวัน รวมทั้งจัดการอุปสรรคที่มี จัดขึ้น 3-4 ครั้งต่อสัปดาห์ และใช้เวลาไม่เกิน 15 นาทีต่อครั้ง
      4. Personal Priority Speed Check: ประชุม 1 ต่อ 1 ระหว่างหัวหน้าทีมและสมาชิกทีม เพื่อเช็กการทำงานและเป้าหมายส่วนบุคคล จัดขึ้นทุก ๆ สัปดาห์ ไม่เกิน 15 นาที
      5. Quarterly Performance Reviews: จัดขึ้นทุก ๆ ไตรมาส เพื่อให้สมาชิกทีมและหัวหน้าทีมได้รีวิวการทำงานกับหัวหน้าทีมแบบ 1 ต่อ 1

      💪 How to Implement Management and Productivity Made Simple

      Miller แบ่งการใช้งาน Playbook เป็น 2 ขั้นตอนหลัก ดังนี้:

      ขั้นที่ 1. หา operator

      Miller แบ่งผู้นำออกเป็น 3 ประเภท ได้แก่:

      1. Artist: ผู้นำที่มุ่งเน้นการพัฒนา product
      2. Entrepreneur: ผู้นำที่มองหาโอกาสทางธุรกิจ
      3. Operator: ผู้นำที่ชอบวางระบบและจัดระเบียบ

      Miller แนะนำว่า คนที่ช่วยทำให้เกิดการประชุมทั้งห้าควรเป็น Operator มากกว่า Artist และ Entrepreneur เพราะ Artist และ Entrepreneur จะเข้าประชุมพร้อมกับไอเดียและพาทุกคนออกทะเล แต่ Operator จะเข้าประชุมเพื่อทำให้การประชุมดำเนินไปได้ตามที่กำหนด

      ถ้าเราเป็นเจ้าของธุรกิจและรู้ตัวว่า เราไม่ใช่ Operator เราควรแต่งตั้งคนที่เป็น Operator มาช่วยทำให้เกิด meetings ขึ้นแทนเรา

      ขั้นที่ 2. จัดการประชุม

      เมื่อได้ Operator มาแล้ว ให้เราค่อย ๆ เพิ่มประชุมทีละอย่าง โดยเราจะเพิ่มประชุมก็ต่อเมื่อทุกอย่างเริ่มดูเข้าทีเข้าทางจากประชุมก่อนหน้า

      เราจะทยอยจัดประชุมตามนี้:

      1. All-Staff Meeting
      2. Leadership Meeting
      3. Department Stand-up
      4. Personal Priority Speed Check
      5. Quarterly Performance Reviews

      เพื่อทำให้การประชุมมีประสิทธิภาพ ผู้รับผิดควรจะต้องเตรียมตัวมาก่อนโดยการกรอก worksheet ของแต่ละการประชุมล่วงหน้า เราสามารถดู worksheets ฟรีได้ที่ SmallBusinessFlightPlan.com

      ตัวอย่าง worksheet:

      All-Staff Meeting worksheet

      🍎 Other Meetings

      ทั้งนี้ เราสามารถปรับเปลี่ยนการประชุมได้ตามความต้องการของธุรกิจ

      เช่น ธุรกิจเรามีพนักงาน 5 คน เราสามารถรวม All-Staff Meeting กับ Leadership Meeting เข้าด้วยกันได้ และไม่ต้องมี Department Stand-up เพราะทุกคนรู้อยู่แล้วว่า จะมีงานอะไรเกิดขึ้นบ้าง

      นอกจานี้ เราสามารถมีประชุมเสริม เพื่อตอบโจทย์อื่น ๆ ได้ เช่น:

      • Revenue meeting เพื่อรีวิวผลกำไรและทิศทางที่จะไปต่อ
      • War Rooms สำหรับแก้ปัญหาเฉพาะเจาะจง
      • Leadership off-site meeting สำหรับผู้บริหารและหัวหน้าทีมได้ใช้เวลาร่วมกันนอกออฟฟิศ

      คนที่รู้จักธุรกิจของเราดีที่สุด คือ ตัวเราเอง ดังนั้น เราสามารถออกแบบได้ว่าการประชุมแบบไหนจะให้ผลที่ดีที่สุดกับธุรกิจ


      6️⃣ Fuel: Cash Flow

      ส่วนสุดท้าย แต่สำคัญไม่น้อยกว่าส่วนอื่น ๆ คือ น้ำมัน หรือ cash flow

      ไม่ว่าเครื่องยนต์จะทรงพลังหรือปีกจะแข็งแรงขนาดไหน ธุรกิจของเราจะขึ้นบินไม่ได้ถ้าไม่มี cash flow หล่อเลี้ยงเครื่องยนต์

      แม้ว่าธุรกิจเกิดขึ้นมาเพื่อแก้ปัญหาบางอย่างในโลก แต่ธุรกิจจะดำเนินไปไม่ได้ถ้าไม่มีเงินสนับสนุน

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

      💸 Cash Flow Made Simple

      แนวคิด Cash Flow Made Simple เสนอให้เราแบ่งบัญชีออกป็น 5 บัญชี ได้แก่:

      1. Operating Account สำหรับดำเนินธุรกิจ (เช่น เงินเดือนพนักงาน, ค่าออฟฟิศ)
      2. Personal Account สำหรับรับเงินเดือน
      3. Tax Account สำหรับจ่ายภาษีธุรกิจ
      4. Business Profit Account สำหรับเก็บกำไรจากธุรกิจ
      5. Investment Holding Account สำหรับลงทุนต่อยอด

      การใช้ทั้ง 5 บัญชีมี 5 ขั้นตอนดังนี้:

      ขั้นที่ 1. เก็บเงินสำหรับใช้จ่ายทุกอย่างของธุรกิจไว้ใน Operating Account (เท่านั้น)

      ขั้นที่ 2. ทุก ๆ สัปดาห์ เดือน หรือปี ให้จ่ายเงินเดือนให้ตัวเอง จาก Operating Account เข้า Personal Account โดยเราควรกำหนดจำนวนเงินล่วงหน้า เพื่อไม่ให้เราดึงเงินออกมามากเกินและทำให้ธุรกิจขาด cash flow

      การจ่ายเงินเดือนจะทำให้เรารู้ว่า เงินไหนเป็นของเรา และเงินไหนสำหรับธุรกิจ

      ขั้นที่ 3. ในกรณีที่เงินใน Operating Account เกินจำนวนที่ตั้งไว้ ให้แบ่งเงินส่วนเกินไป 2 บัญชีนี้:

      1. ครึ่งหนึ่งไปที่ Tax Account เพื่อให้มีเงินจ่ายภาษี
      2. ครึ่งหนึ่งไปที่ Business Profit Account เพื่อเก็บเป็นเงินสำรองในยามที่ธุรกิจขัดสน

      ทั้งนี้ Miller แนะนำว่า ระดับที่เรากำหนดไว้ ควรเท่ากับค่าใช้จ่ายสูงสุดที่เราจะเจอในเดือนนั้น ๆ

      เช่น เราคาดว่า จะต้องจ่ายเงินให้ supplier 500,000 บาท แสดงว่า ระดับในเดือนนั้นควรสูงกว่า 500,000 บาท เพื่อให้เรามีเงินใช้จ่ายอย่างอื่นได้ (เช่น 600,000 บาท)

      ถ้าเรามีเงินเกินระดับที่กำหนด (เช่น 620,000 บาท) เราถึงจะแบ่งเงินส่วนเกินเข้า Tax Account และ Business Profit Account (บัญชีละ 20,000 / 2 = 10,000 บาท)

      ขั้นที่ 4. ในกรณีที่ Business Profit Account มีเงินมากเกินระดับที่กำหนดไว้ ให้โอนเงินส่วนเกินไปยัง Investment Holding Account

      ระดับที่กำหนดควรสูงกว่าระดับของ Operating Account 6 เท่า เพื่อให้เพียงพอที่จะหล่อเลี้ยงธุรกิจในยามวิกฤตได้

      Miller เปรียบเทียบการมีเงิน ใน Business Profit Account เหมือนกับเครื่องบินที่มีน้ำมันสำรอง ยิ่งมีเยอะก็ยิ่งทำให้บินรอบสนามได้นานได้จนกว่าสถานการณ์จะดีขึ้นและเครื่องบินสามารถลงจอดได้

      ในกรณีที่ธุรกิจเผชิญกับวิกฤติ เราสามารถโอนเงินจาก Business Profit Account และ Tax Account กลับไปยัง Operating Account ได้

      ขั้นที่ 5. เราสามารถเลือกได้ว่า จะทำอะไรกับเงินใน Investment Holding Account เช่น:

      • หาความสุขให้ตัวเองด้วยการซื้อรถคันใหม่
      • เอาเงินไปลงทุนต่อยอด เพื่อให้ได้ปันผลกลับมา เป็นรายได้ช่องทางที่สองต่อจากธุรกิจของเราเอง
      การไหลของเงินใน Cash Flow Made Simple: Operating Account >> Personal Account (Owner’s Personal) + Tax (Taxes) + Business Profit Account (Business Savings) >> Investment Holding Account (Owner’s Investment)

      💪 How to Implement Cash Flow Made Simple

      เราสามารถเริ่มใช้ Cash Flow Made Simple ได้ใน 5 ขั้นตอนดังนี้:

      1. เปิดบัญชีทั้งห้า
      2. ใช้จ่ายทุกอย่างเกี่ยวกับธุรกิจจาก Operating Account
      3. จ่ายเงินเดือนให้ตัวเองเข้า Personal Account
      4. กำหนดระดับของ Operating Account สำหรับโอนเงินไปยัง Tax Account และ Business Profit Account
      5. กำหนดระดับของ Business Profit Account สำหรับโอนไป Investment Holding Account

      Bonus: เราสามารถใช้ SmallBusinessFlightPlan.com เพื่อช่วยคำนวณและวางแผน cash flow ได้


      😎 How to Implement Business Flight Plan

      คนที่อยากใช้ Small Business Flight Plan สามารถทำได้ 3 วิธี:

      1. ทำเองโดยใช้หนังสือ How to Grow Your Small Business เป็นคู่มือ
      2. สมัครเรียนกับ Business Made Simple University (BusinessMadeSimple.com)
      3. จ้าง certified coach ของ Business Made Simple (HireACoach.com)

      ไม่ว่าจะใช้วิธีไหน เราสามารถปรับใช้ Small Business Flight Plan ได้ตามความเหมาะสมของธุรกิจเรา เพราะแต่ละธุรกิจมีลักษณะที่ไม่เหมือนกัน และคนที่รู้จักธุรกิจเราดีที่สุด คือ ตัวเราเอง


      หมายเหตุ:

      เนื้อหาบางส่วนถูกเสริมมาจากหนังสือและคอร์สเรียน Business Made Simple


      🧠 Grow Your Knowledge

      สำหรับคนที่สนใจอยากศึกษาการบินธุรกิจเพิ่มเติม สามารถซื้อหนังสือ How to Grow Your Small Business โดยคลิกด้านล่าง:

    • สอนปลูกต้นไม้ในภาษา R (ภาค 3): 5 ขั้นตอนการสร้าง Boosted Trees ด้วย xgboost package ในภาษา R — ตัวอย่างการทำนายระดับการกินน้ำมันของรถใน mpg dataset

      สอนปลูกต้นไม้ในภาษา R (ภาค 3): 5 ขั้นตอนการสร้าง Boosted Trees ด้วย xgboost package ในภาษา R — ตัวอย่างการทำนายระดับการกินน้ำมันของรถใน mpg dataset

      ในบทความนี้ เราจะไปทำความรู้จักกับ eXtreme Gradient Boosting (XGBoost) และวิธีสร้าง XGBoost model ในภาษา R ด้วย xgboost package กัน

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


      1. 🚀 XGBoost คืออะไร?
      2. 💻 XGBoost ในภาษา R
      3. 1️⃣ Install & Load the Package
      4. 2️⃣ Load & Prepare the Data
      5. 3️⃣ Split the Data
      6. 4️⃣ Train the Model
      7. 5️⃣ Evaluate the Model
      8. 💪 Summary
      9. 😺 GitHub
      10. 📃 References
      11. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

      อ่านเกี่ยวกับการปลูกต้นไม้ในภาษา R ภาคก่อน ๆ ได้ที่:


      🚀 XGBoost คืออะไร?

      XGBoost เป็น machine learning model ที่จัดอยู่ในกลุ่ม tree-based models หรือ models ที่ทำนายข้อมูลด้วย decision tree อย่าง single decision tree และ random forest

      ใน XGBoost, decision trees จะถูกสร้างขึ้นมาเป็นรอบ ๆ โดยในแต่ละรอบ decision trees ใหม่จะเรียนรู้จากความผิดพลาดของรอบก่อน ซึ่งจะทำให้ decision trees ใหม่มีความสามารถที่ดีขึ้นเรื่อย ๆ

      เมื่อสิ้นสุดการสร้าง XGBoost ใช้ผลรวมของ decision trees ทุกต้นในการทำนายข้อมูล ดังนี้:

      • Regression problem: หาค่าเฉลี่ยแบบถ่วงน้ำหนักจากทุกต้น
      • Classification problem: ทำนายผลลัพธ์ด้วยค่าเฉลี่ยความน่าจะเป็นจากทุกต้น

      💻 XGBoost ในภาษา R

      ในภาษา R เราสามารถสร้าง XGBoost ได้ด้วย xgboost package ใน 5 ขั้นตอน ได้แก่:

      1. Install and load the package
      2. Load and prepare the data
      3. Split the data
      4. Train the model
      5. Evaluate the model

      1️⃣ Install & Load the Package

      ในขั้นแรก ให้เราติดตั้งและเรียกใช้งาน xgboost package

      ติดตั้ง:

      # Install
      install.packages("xgboost")
      

      เรียกใช้งาน:

      # Load
      library(xgboost)
      

      2️⃣ Load & Prepare the Data

      ในขั้นตอนที่สอง ให้เราโหลดและเตรียมข้อมูลที่จะใช้สร้าง XGBoost model โดยในบทความนี้ เราจะใช้ mpg dataset จาก ggplot2 package กัน

      mpg ประกอบด้วยข้อมูลรถและระดับการใช้น้ำมัน และจุดประสงค์ของเรา คือ ทำนายระดับการกินน้ำมันเมื่อรถวิ่งบน highway (hwy)

      เราสามารถโหลด mpg ได้ผ่าน ggplot2:

      # Install ggplot2
      install.packages("ggplot2")
      
      # Load ggplot2
      library(ggplot2)
      
      # Load the dataset
      data(mpg)
      

      เมื่อโหลด dataset แล้ว เราสามารถสำรวจข้อมูลได้ด้วย head():

      # Preview
      head(mpg)
      

      ผลลัพธ์:

      # A tibble: 6 × 11
        manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class  
        <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>  
      1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compact
      2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compact
      3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compact
      4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compact
      5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compact
      6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compact
      

      และดูโครงสร้างข้อมูลด้วย str():

      # View the tructure
      str(mpg)
      

      ผลลัพธ์:

      tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
       $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
       $ model       : chr [1:234] "a4" "a4" "a4" "a4" ...
       $ displ       : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
       $ year        : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
       $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
       $ trans       : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
       $ drv         : chr [1:234] "f" "f" "f" "f" ...
       $ cty         : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
       $ hwy         : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
       $ fl          : chr [1:234] "p" "p" "p" "p" ...
       $ class       : chr [1:234] "compact" "compact" "compact" "compact" ...
      

      จากผลลัพธ์ เราจะเห็นได้ว่า mpg มี columns ที่เราต้องปรับจาก character เป็น factor อยู่ เช่น manufacturer, model ซึ่งเราสามารถปรับได้ดังนี้:

      # Convert character columns to factor
      
      ## Get character columns
      chr_cols <- c("manufacturer",
                    "model",
                    "trans",
                    "drv",
                    "fl",
                    "class")
      
      ## For-loop through the character columns
      for (col in chr_cols) {
        mpg[[col]] <- as.factor(mpg[[col]])
      }
      
      ## Check the results
      str(mpg)
      

      ผลลัพธ์:

      tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
       $ manufacturer: Factor w/ 15 levels "audi","chevrolet",..: 1 1 1 1 1 1 1 1 1 1 ...
       $ model       : Factor w/ 38 levels "4runner 4wd",..: 2 2 2 2 2 2 2 3 3 3 ...
       $ displ       : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
       $ year        : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
       $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
       $ trans       : Factor w/ 10 levels "auto(av)","auto(l3)",..: 4 9 10 1 4 9 1 9 4 10 ...
       $ drv         : Factor w/ 3 levels "4","f","r": 2 2 2 2 2 2 2 1 1 1 ...
       $ cty         : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
       $ hwy         : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
       $ fl          : Factor w/ 5 levels "c","d","e","p",..: 4 4 4 4 4 4 4 4 4 4 ...
       $ class       : Factor w/ 7 levels "2seater","compact",..: 2 2 2 2 2 2 2 2 2 2 ...
      

      ตอนนี้ columns ที่เราต้องการถูกเปลี่ยนเป็น factor เรียบร้อยแล้ว


      3️⃣ Split the Data

      ในขั้นที่สาม เราจะทำ 3 อย่างด้วยกัน คือ:

      1. แยกตัวแปรต้น (x) และตัวแปรตาม (y) ออกจากกัน
      2. แบ่งข้อมูลออกเป็น training และ test sets
      3. แปลงข้อมูลให้เป็น DMatrix

      ข้อที่ 1. เราสามารถแยกตัวแปรต้นและตัวแปรตามออกจากกันได้ดังนี้:

      # Separate the features from the outcome
      
      ## Get the features
      x <- mpg[, !names(mpg) %in% "hwy"]
      
      ## One-hot encode the features
      x <- model.matrix(~ . - 1,
                        data = x)
      
      ## Get the outcome
      y <- mpg$hwy
      

      สังเกตว่า ตอนที่เราแยกตัวแปรต้น เราแปลงตัวแปรเหล่านี้เป็น 0, 1 ด้วย one-hot encoding ด้วย เนื่องจาก xgboost ต้องการตัวแปรต้นที่เป็น numeric

      .

      ข้อที่ 2. จากนั้น เราจะแบ่ง dataset เป็น training (80%) และ test sets (20%) ดังนี้:

      # Split the data
      
      ## Set seed for reproducibility
      set.seed(360)
      
      ## Get training index
      train_index <- sample(1:nrow(x),
                            nrow(x) * 0.8)
      
      ## Create x, y train
      x_train <- x[train_index, ]
      y_train <- y[train_index]
      
      ## Create x, y test
      x_test <- x[-train_index, ]
      y_test <- y[-train_index]
      
      ## Check the results
      cat("TRAIN SET", "\\n")
      cat("1. Data in x_train:", nrow(x_train), "\\n")
      cat("2. Data in y_train:", length(y_train), "\\n")
      cat("---", "\\n", "TEST SET", "\\n")
      cat("1. Data in x_test:", nrow(x_test), "\\n")
      cat("2. Data in y_test:", length(y_test), "\\n")
      

      ผลลัพธ์:

      TRAIN SET
      1. Data in x_train: 187
      2. Data in y_train: 187
      ---
      TEST SET
      1. Data in x_test: 47
      2. Data in y_test: 47
      

      .

      ข้อที่ 3. สุดท้าย เราจะแปลง x, y เป็น DMatrix ซึ่งเป็น object ที่ xgboost ใช้ในการสร้าง XGboost model ดังนี้:

      # Convert to DMatrix
      
      ## Training set
      train_set <- xgb.DMatrix(data = x_train,
                               label = y_train)
      
      ## Test set
      test_set <- xgb.DMatrix(data = x_test,
                              label = y_test)
      
      ## Check the results
      train_set
      test_set
      

      ผลลัพธ์:

      TRAIN SET
      xgb.DMatrix  dim: 187 x 77  info: label  colnames: yes
      ---
      TEST SET
      xgb.DMatrix  dim: 47 x 77  info: label  colnames: yes
      

      4️⃣ Train the Model

      ในขั้นที่สี่ เราจะสร้าง XGBoost model ด้วย xgb.train() ซึ่งต้องการ 5 arguments ดังนี้:

      xgb.train(params, data, nrounds, watchlist, verbose)
      1. params = hyperparametre ที่ต้องการใช้สร้าง model ที่ดีที่สุด
      2. data = training set ที่ใช้สร้าง model
      3. nrounds = จำนวนครั้งในการในสร้าง decision trees
      4. watchlist = ชุดข้อมูลที่ต้องการใช้ประเมินความสามารถของ model
      5. verbose = พิมพ์ข้อมูลในระหว่างการสร้าง model (1) หรือไม่ (0)

      (Note: ศึกษา argument อื่น ๆ ของ xgb.train() ได้ที่ XGBoost Parameters)

      สำหรับบทความนี้ เราจะใช้ xgb.train() ดังนี้:

      # Train the model
      
      ## Set hyperparametres
      hp <- list(objective = "reg:squarederror",
                 eta = 0.1,
                 max_depth = 4,
                 eval_metric = c("rmse",
                                 "mae"))
      
      ## Train
      xgb_model <- xgb.train(params = hp,
                             data = train_set,
                             nrounds = 50,
                             watchlist = list(train = train_set,
                                              test = test_set),
                             verbose = 1)
      

      ผลลัพธ์:

      [1]	train-rmse:21.083975	test-rmse:22.739357 
      [2]	train-rmse:19.045063	test-rmse:20.598582 
      [3]	train-rmse:17.204130	test-rmse:18.713079 
      [4]	train-rmse:15.549113	test-rmse:16.974701 
      [5]	train-rmse:14.053049	test-rmse:15.453560 
      [6]	train-rmse:12.707307	test-rmse:14.097377 
      [7]	train-rmse:11.495216	test-rmse:12.877722 
      [8]	train-rmse:10.402476	test-rmse:11.767320 
      [9]	train-rmse:9.413522	test-rmse:10.740546 
      [10]	train-rmse:8.525230	test-rmse:9.863130 
      [11]	train-rmse:7.722776	test-rmse:9.068840 
      [12]	train-rmse:7.000648	test-rmse:8.357181 
      [13]	train-rmse:6.346603	test-rmse:7.687483 
      [14]	train-rmse:5.758685	test-rmse:7.091249 
      [15]	train-rmse:5.229548	test-rmse:6.557082 
      [16]	train-rmse:4.753713	test-rmse:6.079389 
      [17]	train-rmse:4.325653	test-rmse:5.651858 
      [18]	train-rmse:3.940325	test-rmse:5.275154 
      [19]	train-rmse:3.594545	test-rmse:4.938849 
      [20]	train-rmse:3.283961	test-rmse:4.627743 
      [21]	train-rmse:3.003089	test-rmse:4.352060 
      [22]	train-rmse:2.747553	test-rmse:4.110172 
      [23]	train-rmse:2.519617	test-rmse:3.889650 
      [24]	train-rmse:2.314957	test-rmse:3.691806 
      [25]	train-rmse:2.133630	test-rmse:3.499208 
      [26]	train-rmse:1.969083	test-rmse:3.330280 
      [27]	train-rmse:1.823011	test-rmse:3.181541 
      [28]	train-rmse:1.693565	test-rmse:3.045308 
      [29]	train-rmse:1.575817	test-rmse:2.919070 
      [30]	train-rmse:1.469256	test-rmse:2.812063 
      [31]	train-rmse:1.375599	test-rmse:2.700515 
      [32]	train-rmse:1.292928	test-rmse:2.615973 
      [33]	train-rmse:1.218867	test-rmse:2.541929 
      [34]	train-rmse:1.151134	test-rmse:2.462113 
      [35]	train-rmse:1.092395	test-rmse:2.404873 
      [36]	train-rmse:1.039158	test-rmse:2.336600 
      [37]	train-rmse:0.993882	test-rmse:2.291398 
      [38]	train-rmse:0.952062	test-rmse:2.236936 
      [39]	train-rmse:0.915935	test-rmse:2.198657 
      [40]	train-rmse:0.879957	test-rmse:2.152984 
      [41]	train-rmse:0.850423	test-rmse:2.102272 
      [42]	train-rmse:0.822475	test-rmse:2.054172 
      [43]	train-rmse:0.799025	test-rmse:2.011621 
      [44]	train-rmse:0.775398	test-rmse:1.971787 
      [45]	train-rmse:0.755066	test-rmse:1.933539 
      [46]	train-rmse:0.736655	test-rmse:1.900084 
      [47]	train-rmse:0.719087	test-rmse:1.870832 
      [48]	train-rmse:0.705279	test-rmse:1.853400 
      [49]	train-rmse:0.691914	test-rmse:1.834918 
      [50]	train-rmse:0.680016	test-rmse:1.825738 
      

      จะเห็นได้ว่า model ในแต่ละรอบมี RMSE หรือตัวบ่งชี้ความคลาดเคลื่อน ที่ลดลงเรื่อย ๆ เนื่องจาก model ใหม่เรียนรู้จากความผิดพลาดของ model ก่อนหน้า

      หลังจากสร้าง model เสร็จแล้ว เราสามารถดูรายละเอียดของ model ได้แบบนี้:

      # Print the model
      xgb_model
      

      ผลลัพธ์:

      ##### xgb.Booster
      raw: 62.4 Kb 
      call:
        xgb.train(params = hp, data = train_set, nrounds = 50, watchlist = list(train = train_set, 
          test = test_set), verbose = 1)
      params (as set within xgb.train):
        objective = "reg:squarederror", eta = "0.1", max_depth = "4", eval_metric = "rmse", validate_parameters = "mae", objective = "TRUE"
      xgb.attributes:
        niter
      callbacks:
        cb.print.evaluation(period = print_every_n)
        cb.evaluation.log()
      # of features: 77 
      niter: 50
      nfeatures : 77 
      evaluation_log:
        iter train_rmse test_rmse
       <num>      <num>     <num>
           1 21.0839746 22.739357
           2 19.0450628 20.598582
         ---        ---       ---
          49  0.6919137  1.834918
          50  0.6800159  1.825738
      

      5️⃣ Evaluate the Model

      ในขั้นสุดท้าย เราจะประเมินความสามารถของ model ใน 3 ขั้นตอนกัน คือ:

      1. ใช้ model ทำนายตัวแปรตาม
      2. คำนวณ MAE, RMSE, และ R squared
      3. Print MAE, RMSE, และ R squared

      .

      ข้อที่ 1. ใช้ model ทำนายตัวแปรตาม ด้วย predict():

      # Make predictions
      y_pred <- predict(xgb_model,
                        newdata = x_test)
      
      # Compare predictions to actual outcomes
      results <- data.frame(actual = y_test,
                            predicted = y_pred,
                            error = y_test - y_pred)
      
      # Preview the results
      head(results, 10)
      

      ผลลัพธ์:

         actual predicted      error
      1      31  27.81219  3.1878090
      2      25  25.89449 -0.8944893
      3      30  30.13318 -0.1331844
      4      29  26.77814  2.2218552
      5      24  24.34723 -0.3472347
      6      23  23.58175 -0.5817528
      7      19  17.81131  1.1886921
      8      12  12.32908 -0.3290768
      9      12  12.31534 -0.3153391
      10     16  16.25793 -0.2579288
      

      .

      ข้อที่ 2. คำนวณ MAE, RMSE, และ R squared ซึ่งเป็นตัวชี้วัดความสามารถของ regression models:

      # Calculate MAE
      mae <- mean(abs(results$error))
      
      # Calculate RMSE
      rmse <- sqrt(mean((results$error)^2))
      
      # Calculate R squared
      ss_res <- sum((results$error)^2)
      ss_tot <- sum((results$actual - mean(results$actual))^2)
      r_squared <- 1 - (ss_res / ss_tot)
      

      .

      ข้อที่ 3. แสดงผลลัพธ์:

      # Print the results
      cat("MAE:", round(mae, 2), "\\n")
      cat("RMSE:", round(rmse, 2), "\\n")
      cat("R squared:", round(r_squared, 2), "\\n")
      

      ผลลัพธ์:

      MAE: 1.23
      RMSE: 1.83
      R squared: 0.93 
      

      จะเห็นได้ว่า model ของเราสามารถอธิบายตัวแปรตามได้ถึง 93% (R squared) และมีความคลาดเคลื่อนโดยเฉลี่ย 1.23 miles per gallon (MAE)


      💪 Summary

      ในบทความนี้ เราได้ไปทำความรู้จักการสร้าง boosted tree ด้วย xgboost package ในภาษา R ซึ่งมีการทำงาน 5 ขั้นตอนกัน:

      1. Install and load the package
      2. Load and prepare the data
      3. Split the data
      4. Train the model
      5. Evaluate the model

      😺 GitHub

      ดู code ทั้งหมดในบทความนี้ได้ที่ GitHub


      📃 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:

    • Generalised Linear Model: วิธีใช้ glm() ในภาษา R เพื่อทำนายข้อมูลที่ไม่ปกติ — Linear, Logistic, และ Poisson Regression

      Generalised Linear Model: วิธีใช้ glm() ในภาษา R เพื่อทำนายข้อมูลที่ไม่ปกติ — Linear, Logistic, และ Poisson Regression

      ในบทความนี้ เราจะไปทำความรู้จักกับ generalised linear model (GLM) และวิธีทำ GLM ในภาษา R กัน

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


      1. 🤔 GLM คืออะไร?
      2. 💻 GLM ในภาษา R
      3. ☕ ตัวอย่างข้อมูล: coffee_shop
        1. 1️⃣ Linear Regression
        2. 2️⃣ Logistic Regression
        3. 3️⃣ Poisson Regression
      4. 💪 Summary
      5. 😺 GitHub
      6. 📃 References
      7. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

      🤔 GLM คืออะไร?

      GLM เป็นเทคนิคทางสถิติที่ใช้ทำนายข้อมูลที่มีการกระจายตัวไม่ปกติ (non-normal distribution) เช่น ข้อมูลที่มีผลลัพธ์เพียง 0 และ 1

      GLM ทำนายข้อมูลเหล่านี้โดยการต่อยอดจากสมการเส้นตรง (linear model) และมี 3 องค์ประกอบ ได้แก่:

      1. Family: การกระจายตัวของตัวแปรตาม (y)
      2. Linear predictors: สมการเส้นตัวตรงของตัวแปรต้น (x) หรือตัวแปรทำนาย (predictor)
      3. Link function: function ที่เชื่อมตัวแปรต้นกับตัวแปรตามเข้าด้วยกัน

      💻 GLM ในภาษา R

      ในภาษา R เราสามารถใช้งาน GLM ได้ผ่าน glm() function ซึ่งต้องการข้อมูล 3 อย่าง:

      glm(formula, data, family)
      1. formula = ความสัมพันธ์ระหว่างตัวแปรต้นและตัวแปรตาม ในรูปแบบ y ~ x
      2. data = ชุดข้อมูลที่ใช้ในการวิเคราะห์
      3. family = การกระจายตัวของตัวแปรตาม

      จะสังเกตว่า glm() ไม่มี parametre สำหรับ link function ทั้งนี้เป็นเพราะ glm() เรียกใช้ link function ให้อัตโนมัติตาม family ที่เรากำหนด

      ทั้งนี้ ประเภทข้อมูล, family, และ link function ที่เราสามารถเรียกใช้ glm() ได้มีดังนี้:

      DatafamilyLink Function
      Normalgaussianlink = "identity”
      Binomialbinomiallink = "logit”
      Poissonpoissonlink = "log”
      Quasi-poissonquasipoissonlink = "log”
      GammaGammalink = "inverse”

      เราไปดูตัวอย่างการใช้งาน glm() เพื่อทำนายและแปลผลกัน


      ☕ ตัวอย่างข้อมูล: coffee_shop

      เราจะไปดูตัวอย่างการใช้ glm() เพื่อทำนายข้อมูล 3 ประเภทกัน:

      1. Linear regression
      2. Logistic regression
      3. Poisson regression

      โดยเราจะใช้ตัวอย่างเป็นข้อมูลจำลองชื่อ coffee_shop ซึ่งประกอบด้วยข้อมูลการขายจากร้านกาแฟแห่งหนึ่ง และมีรายละเอียดดังนี้:

      No.ColumnDescription
      1dayวันที่
      2tempอุณหภูมิโดยเฉลี่ยของวัน
      3promoเป็นวันที่มีโปรโมชัน (มี, ไม่มี)
      4weekendเป็นวันหยุดสุดสัปดาห์ (วันหยุด, วันธรรมดา)
      5salesยอดขาย
      6customersจำนวนลูกค้าในแต่ละวัน
      7sold_outขายหมด (หมด, ไม่หมด)

      ก่อนวิเคราะห์ข้อมูล เราจะสร้าง coffee_shop ตามนี้:

      # Generate mock coffee shop dataset (15 days)
      
      ## Set seed for reproducibility
      set.seed(123)
      
      ## Generate
      coffee_shop <- data.frame(
        
        ## Generate 15 days
        day = 1:15,
        
        ## Generate daily temperature
        temp = round(rnorm(15,
                           mean = 25,
                           sd = 5),
                     1),
        
        ## Generate promotion day
        promo = sample(c(0, 1),
                       15,
                       replace = TRUE),
        
        ## Generate weekend
        weekend = c(0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1),
        
        ## Generate the number of sales
        sales = round(rnorm(15,
                            mean = 300,
                            sd = 50)),
        
        ## Generate the number of daily customers
        customers = rpois(15,
                          lambda = 80),
        
        ## Generate sold-out
        sold_out = sample(c(0, 1),
                          15,
                          replace = TRUE)
      )
      
      ## Convert binary variables to factors
      coffee_shop$promo <- factor(coffee_shop$promo,
                                  levels = c(0, 1),
                                  labels = c("NoPromo", "Promo"))
      
      coffee_shop$weekend <- factor(coffee_shop$weekend,
                                    levels = c(0, 1),
                                    labels = c("Weekday", "Weekend"))
      
      coffee_shop$sold_out <- factor(coffee_shop$sold_out,
                                     levels = c(0, 1),
                                     labels = c("No", "Yes"))
      
      ## View the dataset
      print(coffee_shop)
      

      ผลลัพธ์:

         day temp   promo weekend sales customers sold_out
      1    1 22.2 NoPromo Weekday   246        73      Yes
      2    2 23.8   Promo Weekday   296        76      Yes
      3    3 32.8 NoPromo Weekday   354        83       No
      4    4 25.4   Promo Weekday   293        87       No
      5    5 25.6   Promo Weekend   242        78      Yes
      6    6 33.6 NoPromo Weekend   259        91      Yes
      7    7 27.3 NoPromo Weekday   334        71      Yes
      8    8 18.7 NoPromo Weekday   284        76       No
      9    9 21.6 NoPromo Weekday   234        72      Yes
      10  10 22.8   Promo Weekend   270        79       No
      11  11 31.1 NoPromo Weekend   294        82      Yes
      12  12 26.8   Promo Weekday   344        79       No
      13  13 27.0   Promo Weekday   292        79       No
      14  14 25.6 NoPromo Weekday   316        92       No
      15  15 22.2 NoPromo Weekend   139        77      Yes
      

      เราไปดูวิธีทำนายข้อมูลกัน

      .

      1️⃣ Linear Regression

      Linear regression เป็นการทำนายข้อมูล numeric เช่น ยอดขาย (sales) ซึ่งเราสามารถใช้ glm() ทำนายได้ดังนี้:

      # Create a regression model with glm()
      linear_reg <- glm(sales ~ temp + promo + weekend,
                        data = coffee_shop,
                        family = gaussian)
      

      เราสามารถดู model ได้ด้วย summary():

      # Get model summary
      summary(linear_reg)
      

      ผลลัพธ์:

      Call:
      glm(formula = sales ~ temp + promo + weekend, family = gaussian, 
          data = coffee_shop)
      
      Coefficients:
                     Estimate Std. Error t value Pr(>|t|)   
      (Intercept)      96.599     59.669   1.619  0.13375   
      temp              7.703      2.283   3.373  0.00621 **
      promoPromo       23.014     18.537   1.241  0.24025   
      weekendWeekend  -73.444     19.654  -3.737  0.00328 **
      ---
      Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
      
      (Dispersion parameter for gaussian family taken to be 1222.243)
      
          Null deviance: 39702  on 14  degrees of freedom
      Residual deviance: 13445  on 11  degrees of freedom
      AIC: 154.54
      
      Number of Fisher Scoring iterations: 2
      

      จากผลลัพธ์ เราจะเห็นความสำคัญของตัวแปรต้นและ coefficient ซึ่งระบุการเปลี่ยนแปลงของตัวแปรตามการเปลี่ยนของตัวแปรต้น:

      • ตัวแปรที่สามารถทำนาย sales ได้อย่างมีนัยสำคัญ คือ temp และ weekend (สังเกตจาก **)
      • promo ไม่สามารถทำนาย sales ได้อย่างมีนัยสำคัญ
      • Coefficient ของ temp คือ 7.70 ซึ่งหมายถึง อุณหภูมิเปลี่ยน 1 หน่วย ยอดขายจะเพิ่มขึ้น 7.70 หน่วย
      • Coefficient ของ weekend คือ -73.44 ซึ่งหมายถึง วันหยุดสุดสัปดาห์ ยอดขายจะลดลง 73.44 หน่วย

      .

      2️⃣ Logistic Regression

      Logistic regression เป็นการทำนายข้อมูลที่เป็นมีผลลัพธ์เพียง 2 ค่า เช่น:

      • ใช่, ไม่ใช่
      • ผ่าน, ไม่ผ่าน
      • ตรง, ไม่ตรง

      ใน coffee_shop เรามี sold_out ซึ่งเราสามารถทำนายด้วย logistic regression ด้วย glm() ได้แบบนี้:

      # Create a logistic regression model
      log_reg <- glm(sold_out ~ temp + promo + weekend,
                     data = coffee_shop,
                     family = binomial)
      

      จากนั้น ดู model ด้วย summary():

      # Get model summary
      summary(log_reg)
      

      ผลลัพธ์:

      Call:
      glm(formula = sold_out ~ temp + promo + weekend, family = binomial, 
          data = coffee_shop)
      
      Coefficients:
                     Estimate Std. Error z value Pr(>|z|)
      (Intercept)     1.30934    3.92442   0.334    0.739
      temp           -0.04448    0.15189  -0.293    0.770
      promoPromo     -1.73681    1.31881  -1.317    0.188
      weekendWeekend  2.15038    1.45643   1.476    0.140
      
      (Dispersion parameter for binomial family taken to be 1)
      
          Null deviance: 20.728  on 14  degrees of freedom
      Residual deviance: 16.426  on 11  degrees of freedom
      AIC: 24.426
      
      Number of Fisher Scoring iterations: 4
      

      จะเห็นได้ว่า หน้าตาผลลัพธ์คล้ายกับ linear regression แต่สิ่งที่แตกต่างกัน คือ coefficient อยู่ในรูป log-odd ซึ่งเราสามารถถอดรูปได้ด้วย exp() เพื่อแปลผล:

      # Transform coefficient
      exp(coef(log_reg))
      

      ผลลัพธ์:

         (Intercept)           temp     promoPromo weekendWeekend 
           3.7037124      0.9564938      0.1760812      8.5881237
      

      เราสามารถแปลผลได้ดังนี้:

      PredictorCoefficientInterpretation
      temp0.96เมื่ออุณหภูมิสูงขึ้น 1 หน่วย ร้านมีโอกาสขายหมดเพิ่มขึ้น 0.96
      promo0.18เมื่อมีโปรโมชัน ร้านมีโอกาสขายหมดเพิ่มขึ้น 0.18
      weekend8.59เมื่อเป็นวันสุดสัปดาห์ ร้านมีโอกาสขายหมดเพิ่มขึ้น 8.59

      .

      3️⃣ Poisson Regression

      Poisson regression เป็นการทำนายข้อมูลการนับ (count data) หรือข้อมูลที่เกิดขึ้นในช่วงเวลาที่กำหนด เช่น:

      • จำนวนรถบนถนนในแต่ละชั่วโมง
      • จำนวนข้อความที่ได้รับใน 1 วัน
      • จำนวนสินค้าที่ขายได้ใน 3 เดือน

      ใน coffee_shop เรามี customers ซึ่งสามารถทำนาย poisson regression ผ่าน glm() ได้ดังนี้:

      # Create a poisson regression model
      poisson_reg <- glm(customers ~ temp + promo + weekend,
                         data = coffee_shop,
                         family = poisson)
      

      ดู model:

      # Get model summary
      summary(poisson_reg)
      

      ผลลัพธ์:

      Call:
      glm(formula = customers ~ temp + promo + weekend, family = poisson, 
          data = coffee_shop)
      
      Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
      (Intercept)    4.108939   0.192499  21.345   <2e-16 ***
      temp           0.010077   0.007299   1.381    0.167    
      promoPromo     0.010327   0.059616   0.173    0.862    
      weekendWeekend 0.012692   0.062739   0.202    0.840    
      ---
      Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
      
      (Dispersion parameter for poisson family taken to be 1)
      
          Null deviance: 7.0199  on 14  degrees of freedom
      Residual deviance: 4.8335  on 11  degrees of freedom
      AIC: 106.06
      
      Number of Fisher Scoring iterations: 3
      

      Coefficient ของ poisson regression อยู่ในรูป log เช่นเดียวกับ logistic regression ดังนั้น เราจะถอดรูปด้วย exp() ก่อนแปลผล:

      # Transform the coefficients
      exp(coef(poisson_reg))
      

      ผลลัพธ์:

         (Intercept)           temp     promoPromo weekendWeekend 
           60.882073       1.010127       1.010381       1.012773
      

      จะเห็นได้ว่า coefficient ของทั้ง 3 ตัวแปรต้นอยู่ที่ 1.01 ซึ่งหมายถึง การเปลี่ยนแปลงตัวแปรต้นตัวใดตัวหนึ่ง ทำให้จำนวนลูกค้าเพิ่มขึ้น 1 คน


      💪 Summary

      ในบทความนี้ เราได้ไปทำความรู้จักกับ GLM ซึ่งเป็นเทคนิคทางสถิติที่ใช้ทำนายข้อมูลที่ไม่ปกติ และได้ดูวิธีการใช้ glm() function ในภาษา R เพื่อทำนายข้อมูล 3 ประเภท:

      1. Linear regression
      2. Logistic regression
      3. Poisson regression

      😺 GitHub

      ดู code ทั้งหมดในบทความนี้ได้ที่ GitHub


      📃 References

      What is GLM?

      GLM in R:


      ✅ 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: