Author: Shinin Varongchayakul

  • Intro to Python: ทำความรู้จักกับภาษา Python และวิธีใช้งานเบื้องต้น สำหรับผู้เริ่มต้น พร้อมตัวอย่าง

    Intro to Python: ทำความรู้จักกับภาษา Python และวิธีใช้งานเบื้องต้น สำหรับผู้เริ่มต้น พร้อมตัวอย่าง

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

    • Python คืออะไร?
    • วิธีเขียน Python เบื้องต้น
    • Data types ใน Python
    • การทำงานกับ data types ใน Python

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


    1. 🐍 Python คืออะไร?
    2. 🏁 Getting Started With Python
    3. 👶 Baby Steps
      1. 🔢 (1) Basic Arithmetic
      2. 📦 (2) Variables
    4. 🍞 Data Types
    5. 👉 Integre & Float
      1. 1️⃣ Arithmetic
      2. 2️⃣ Type Casting
    6. 👉 String
      1. 1️⃣ Markers of String
      2. 2️⃣ Type Casting
      3. 3️⃣ Concatenate
      4. 4️⃣ String Methods
    7. 👉 Boolean
      1. 1️⃣ Check for True & False
      2. 2️⃣ Comparison
    8. 👉 List
      1. 1️⃣ Purpose
      2. 2️⃣ Indexing & Slicing
      3. 3️⃣ Check Length
      4. 4️⃣ Add to List
      5. 5️⃣ Update List
      6. 6️⃣ Delete From List
    9. 👉 Dictionary
      1. 1️⃣ Purpose
      2. 2️⃣ Extract Values
      3. 3️⃣ Get Keys & Values
      4. 4️⃣ Add to Dictionary
      5. 5️⃣ Update Dictionary
      6. 6️⃣ Delete From Dictionary

    🐍 Python คืออะไร?

    Python เป็น high-level programming language ที่พัฒนาโดย programmer ชาวดัชต์ Guido van Rossum ในช่วง ปี ค.ศ. 1980-1990 เพื่อทำให้การเขียน programme เป็นเรื่องง่าย

    van Rossum เรียกภาษาที่คิดขึ้นมาว่า Python ตามชื่อกลุ่มนักแสดงตลกจากประเทศอังกฤษ Monty Python หรือ The Pythons เพราะคำว่า Python สั้น จำง่าย และดูลึกลับ (ไม่มีความเกี่ยวข้องกับชนิดงู Python แต่อย่างใด)

    .

    เนื่องจาก Python เป็น high-level language หรือมีความใกล้เคียงกับภาษามนุษย์ (มากกว่าภาษาคอมพิวเตอร์) จึงเป็นภาษาที่ใช้งานและทำความเข้าใจง่าย และเป็นที่นิยมของนักพัฒนาทั่วโลก

    ในปัจจุบัน (2025) Python ครองอันดับในฐานะ programming language ที่เป็นที่นิยมมากที่สุด (อ้างอิง TIOBE):

    นอกจากใช้งานง่ายแล้ว Python ยังมีข้อดีอื่น ๆ อีก ได้แก่:

    • เป็น open source
    • มี libraries รองรับการใช้งานที่มากมายและหลากหลาย
    • แก้ bug ได้ง่าย
    • ใช้ได้กับหลายระบบปฏิบัติการ ทั้ง Windows, macOS, และ Linux

    .

    การใช้งาน Python มีตั้งแต่:

    • เขียน programme
    • เขียน web application
    • ทำ web scraping
    • ทำ data analysis
    • พัฒนา AI และ machine learning

    🏁 Getting Started With Python

    สำหรับการเริ่มใช้งาน Python เราสามารถติดตั้ง Python บนคอมพิวเตอร์ของเรา โดยดาวน์โหลด Python จาก https://www.python.org/downloads/:

    หรือใช้งานผ่าน online services ฟรี เช่น:

    Note: บทความนี้มีตัวอย่าง code ใน Google Colab สามารถกดเข้าไปดูได้


    👶 Baby Steps

    หลังจากเตรียมตัวให้พร้อมแล้ว เรามาดูวิธีเขียน Python เบื้องต้นกัน

    .

    🔢 (1) Basic Arithmetic

    สำหรับก้าวแรกในการเขียน Python เรามาเริ่มจากการคิดเลขง่าย ๆ กัน เช่น:

    บวก:

    # Addition
    3 + 4
    

    ลบ:

    # Subtraction
    10 - 7
    

    คูณ:

    # Multiplication
    2 * 2
    

    หาร:

    # Division
    9 / 3
    

    เราจะเห็นได้ว่า Python สามารถคิดเลขให้ได้อย่างรวดเร็ว:

    .

    📦 (2) Variables

    ในการทำงานกับ Python เราสามารถสร้าง variable เพื่อช่วยเก็บข้อมูลได้ (แทนที่การเขียน code เรียกใช้ข้อมูลเองทุกครั้ง)

    เช่น เราสามารถเก็บเงินค่าขนม:

    # Create allowance variable
    allowance = 100
    

    และค่าใช้จ่าย:

    # Create expense variable
    expense = 40
    

    แล้วเรียกใช้งานทั้งสองค่า เช่น ดูว่าเดือนนี้เราเหลือเงินเท่าไร:

    # Calculate remaining balance
    allowance - expense
    

    ผลลัพธ์:

    60

    .

    เราสามารถ update ค่าใน variable ได้ เช่น update expense จาก 40 เป็น 70:

    # Update expense
    expense = 70
    

    ถ้าเราคำนวณเงินคงเหลือ:

    # Calculate remaining balance
    allowance - expense
    

    เราจะได้ค่าที่ต่างไปจากเดิม:

    30

    .

    สุดท้าย เราสามารถเก็บผลลัพธ์ที่ได้ ไว้ใน variable ตัวใหม่ เพื่อเรียกใช้งานในภายหลังได้:

    # Store remaining balance in a variable
    remain = allowance - expense
    
    # Check remaining balance
    remain
    

    ผลลัพธ์:

    30

    Note: เราสามารถลบ variable ได้ด้วย del() เช่น del(remain) จะลบ remain จาก Python


    🍞 Data Types

    ตอนนี้ เรารู้วิธีการทำงานกับ Python เบื้องต้นแล้ว

    เรามาทำความรู้จักกับ data type หรือประเภทข้อมูล ซึ่งเป็นตัวกำหนด action ที่เราสามารถกระทำใช้กับข้อมูลได้

    .

    โดย Python มี 6 data types ที่เราใช้บ่อย ได้แก่:

    No.TypeMeaningExample
    1Integreเลขจำนวนเต็ม11
    2Floatเลขทศนิยม3.78104
    3Stringข้อความ"Python"
    4Booleanจริง/ไม่จริงTrue
    5Listเก็บข้อมูลได้หลายประเภท[”John”, 34, True]
    6Dictionaryเก็บ key-value pair{"name": "John", "age": 34, "is_male": True}

    เราไปดูกันว่า แต่ละ data type สามารถทำอะไรได้บ้าง


    👉 Integre & Float

    .

    1️⃣ Arithmetic

    จากที่ได้เห็นก่อนหน้านี้ เราสามารถใช้ integre และ float ในการคำนวณเลขได้ เช่น:

    3 * 7
    

    และ

    7.3915 - 3.2914
    

    .

    2️⃣ Type Casting

    ทั้งนี้ เราสามารถเปลี่ยนข้อมูลบางประเภท ให้เป็น integre และ float ได้ดังนี้

    เปลี่ยนให้เป็น integre:

    # Convert to integre
    int(100.50)
    

    ผลลัพธ์:

    100

    เปลี่ยนให้เป็น float:

    # Convert to float
    float("100")
    

    ผลลัพธ์:

    100.0

    👉 String

    .

    1️⃣ Markers of String

    String ใน Python จะอยู่ใน "" หรือ '' เสมอ เช่น

    # Single-line string
    "John"
    

    หรือ

    # Single-line string
    'John'
    

    ถ้าเรามีข้อความหลายบรรทัด ให้ใช้ """ หรือ ''':

    # Multiple-line string
    """
    My name is Wick.
    John Wick.
    I'm looking for my dog.
    """
    

    หรือ

    # Multiple-line string
    '''
    My name is Wick.
    John Wick.
    I'm looking for my dog.
    '''
    

    .

    2️⃣ Type Casting

    เราสามารถเปลี่ยนข้อมูลต่าง ๆ ให้เป็น string ได้โดยใช้ str() เช่น:

    str(100)
    

    ผลลัพธ์:

    '100'

    สังเกตว่า ตอนนี้ 100 อยู่ใน '' แสดงว่า 100 เป็น string และไม่ใช่ integre แล้ว

    ถ้าเราเอา 100 นี้ไปคิดเลข ระบบจะส่ง error กลับมา เพราะเราไม่สามารถคำนวณเลขด้วย string ได้:

    TypeError                                 Traceback (most recent call last)
    <ipython-input-49-efc4e6e83db0> in <cell line: 0>()
          1 # String cannot be used in arithmetic operation
    ----> 2 str(100) + 100
    
    TypeError: can only concatenate str (not "int") to str

    .

    3️⃣ Concatenate

    แม้ว่าเราจะไม่สามารถบวกลบ string ได้ แต่เราสามารถใช้ + เพื่อรวม string เข้าด้วยกันได้ เช่น:

    "I have " + str(100) + " THB."
    

    ผลลัพธ์:

    'I have 100 THB.'

    .

    4️⃣ String Methods

    นอกจากการรวม string แล้ว เรายังมีอย่างอื่นที่ใช้กับ string ได้อีก เช่น:

    No.MethodExplain
    1upper()เปลี่ยนให้เป็นพิมพ์ใหญ่ทั้งหมด
    2lower()เปลี่ยนให้เป็นพิมพ์เล็กทั้งหมด
    3capitalize()เปลี่ยนอักษรแรกให้เป็นพิมพ์ใหญ่
    4title()เปลี่ยนอักษรแรกของทุกคำให้เป็นพิมพ์ใหญ่
    5strip()ลบ space ออกจากก่อนและหลังคำ
    6replace()แทนที่คำ
    7split()แยกคำ
    8join(iterable)รวมคำ
    9find(substring)หาตำแหน่งของคำ
    10count()นับตัวอักษรที่ต้องการ

    👉 Boolean

    Boolean เป็นเหมือนกับค่า on (True) และ off (False) ของ switch ซึ่งเป็นพื้นฐานของการทำงานของคอมพิวเตอร์

    .

    1️⃣ Check for True & False

    เราสามารถใช้ bool() เพื่อเช็กว่า ข้อมูลเราเป็น True หรือ False เช่น:

    bool("John")
    

    ผลลัพธ์:

    True

    .

    bool() จะส่ง True กลับมาทุกครั้ง ยกเว้นในกรณีเหล่านี้:

    TypeFalseExplain
    Integrebool(0)เลขเป็น 0
    Stringbool("")String ที่เป็นค่าว่าง
    Booleanbool(False)Boolean ที่เป็นค่า False
    Listbool([])List ที่เป็นค่าว่าง
    Dictionarybool({})Dictionary ที่เป็นค่าว่าง

    .

    2️⃣ Comparison

    Python จะส่งค่า boolean กลับมา เมื่อเราทำการเปรียบเทียบ เช่น:

    10 > 5
    

    ผลลัพธ์:

    True

    .

    หรือ

    10 < 5
    

    ผลลัพธ์:

    False

    👉 List

    .

    1️⃣ Purpose

    List ใช้เก็บข้อมูลหลาย ๆ ค่า เช่น:

    • Integre
    • Float
    • String
    • Boolean
    • List
    • Dictionary
    • etc.

    เช่น:

    # List can store data of different types
    a_list = [10, 15.94, "ok", True, ["egg", "milk"], {"store": "Walmart"}]
    

    .

    2️⃣ Indexing & Slicing

    เราสามารถดึงข้อมูลที่อยู่ใน list ได้ โดยการใช้ []:

    SyntaxExplain
    list[x]ดึงข้อมูลในตำแหน่งที่ x
    list[-x]ดึงข้อมูลในตำแหน่งที่ -x (นับจากหลังมาหน้า)
    list[x:y]ดึงข้อมูลในตำแหน่งระหว่าง x และ y-1 (ข้อมูลที่ y จะไม่ถูกดึงมาด้วย)
    list[-x:-y]ดึงข้อมูลในตำแหน่งระหว่าง -x และ -y-1 (ข้อมูลที่ -y จะไม่ถูกดึงมาด้วย)

    .

    เช่น เรามี list ผลไม้:

    # A list
    my_list = ["apple", "banana", "cherry"]
    

    เราสามารถดึง “apple” ออกได้โดยใช้:

    # Get "apple"
    my_list[0]
    

    ผลลัพธ์:

    'apple'

    Note: เราใช้ 0 เพราะใน Python เราจะเริ่มนับตำแหน่งที่ 1 เป็น 0

    .

    หรือเลือก “apple” ถึง “cherry”:

    # Get "apple" to "cherry"
    my_list[0:3]
    

    ผลลัพธ์:

    ['apple', 'banana', 'cherry']

    .

    3️⃣ Check Length

    เราสามารถหาความยาวของ list ได้ด้วย len() เช่น:

    # Check length
    len(my_list)
    

    ผลลัพธ์:

    3

    .

    4️⃣ Add to List

    เราสามารถเพิ่มข้อมูลลงใน list ได้ด้วย 2 วิธี:

    No.WayExample
    1.append()เพิ่มข้อมูล 1 ค่า
    2.extend()เพิ่มข้อมูลจาก list หรือ string

    .

    ตัวอย่าง .append():

    # append()
    my_list.append("orange")
    
    my_list
    

    ผลลัพธ์:

    ['apple', 'banana', 'cherry', 'orange']

    .

    ตัวอย่าง .extend():

    เรามี 2 lists ที่ต้องการรวมกัน:

    # Lists to merge
    list_1 = [1, 2, 3]
    list_2 = [4, 5, 6]
    

    ให้เราใช้ .extend() แบบนี้:

    # extend()
    list_1.extend(list_2)
    

    ผลลัพธ์:

    [1, 2, 3, 4, 5, 6]

    .

    5️⃣ Update List

    เราสามารถ update ข้อมูลใน list ได้ โดยการระบุตำแหน่งข้อมูลที่เราต้องการ update

    เช่น เราต้องการเปลี่ยน “orange” เป็น “kiwi”:

    # Update list
    my_list[3] = "kiwi"
    
    my_list
    

    เมื่อเราเรียกดู my_list เราจะเห็นว่า “orange” เปลี่ยนเป็น “kiwi”:

    ['apple', 'banana', 'cherry', 'kiwi']

    .

    6️⃣ Delete From List

    เราสามารถลบข้อมูลออกจาก list ได้ด้วย .remove()

    เช่น ลบ “kiwi” ออกจาก my_list:

    # Delete from list
    my_list.remove("kiwi")
    
    my_list
    

    ผลลัพธ์:

    ['apple', 'banana', 'cherry']

    👉 Dictionary

    .

    1️⃣ Purpose

    Dictionary มีไว้เก็บ key-value pair เช่น:

    # A dictionary
    cities = {"Thailand": "Bangkok",
              "Japan": "Tokyo",
              "Brazil": "Brasilia"}
    

    .

    2️⃣ Extract Values

    เราสามารถดึงข้อมูลออกจาก dictionary ได้ด้วยการระบุ key ของข้อมูล

    เช่น ต้องการดึง “Tokyo” ให้เราระบุ “Japan”:

    # Extract values from list
    cities["Japan"]
    

    ผลลัพธ์:

    'Tokyo'

    .

    3️⃣ Get Keys & Values

    เราสามารถดู keys และ values ทั้งหมดใน dictionary ได้ด้วย .keys() และ .values() เช่น:

    # Get keys
    cities.keys()
    

    ผลลัพธ์:

    dict_keys(['Thailand', 'Japan', 'Brazil'])

    .

    และ

    # Get values
    cities.values()
    

    ผลลัพธ์:

    dict_values(['Bangkok', 'Tokyo', 'Brasilia'])

    .

    4️⃣ Add to Dictionary

    เราสามารถเพิ่มข้อมูลลงใน dictionary ได้ โดยการใส่ key และ value ใหม่ เช่น:

    # Add to dictionary
    cities["US"] = "New York"
    
    cities
    

    ผลลัพธ์:

    {'Thailand': 'Bangkok',
     'Japan': 'Tokyo',
     'Brazil': 'Brasilia',
     'US': 'New York'}

    .

    5️⃣ Update Dictionary

    เราสามารถ update ข้อมูลใน dictionary ได้ด้วยเรียก key และใส่ value ใหม่ เช่น:

    # Update dictionary
    cities["US"] = "Washington DC"
    
    cities
    

    ผลลัพธ์:

    {'Thailand': 'Bangkok',
     'Japan': 'Tokyo',
     'Brazil': 'Brasilia',
     'US': 'Washington DC'}

    .

    6️⃣ Delete From Dictionary

    เราสามารถลบข้อมูลออกจาก dictionary ได้ด้วย del

    เช่น ลบ “US”: “Washington DC” ออก:

    # Delete from dictionary
    del cities["US"]
    
    cities
    

    ผลลัพธ์:

    {'Thailand': 'Bangkok', 'Japan': 'Tokyo', 'Brazil': 'Brasilia'}
  • สรุปแนวทางการทำงานกับ AI: Mindset และเทคนิคการเขียน Prompt เพื่อการทำงานร่วมกับ AI อย่างมีประสิทธิภาพ

    สรุปแนวทางการทำงานกับ AI: Mindset และเทคนิคการเขียน Prompt เพื่อการทำงานร่วมกับ AI อย่างมีประสิทธิภาพ

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

    เช่น:

    รวมไปถึงการใช้งาน AI ในการทำงานด้วยตัวเอง .

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

    โดยบทความจะแบ่งเป็น 5 ส่วน:

    1. What is AI?
    2. Mindset ในการทำงานกับ AI
    3. Prompting frameworks: โครงการเขียน prompt ง่าย ๆ
    4. Prompting techniques: เทคนิคการช่วย AI คิดให้ตอบโจทย์
    5. Tips: เคล็ดลับเพิ่มเติม

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


    1. 1️⃣ What Is AI?
    2. 2️⃣ Mindset ในการทำงานกับ AI
      1. 👌 ข้อที่ 1. AI Is Okay
      2. 🙆 ข้อที่ 2. AI as a Colleague
      3. ➿ ข้อ 3. Human in the Loop
      4. 🗝️ สรุป Mindset การทำงานกับ AI
    3. 3️⃣ Prompting Frameworks
      1. 🍚 RICE: Input Structure
      2. 🧂 SALT: Output Structure
      3. 🗝️ สรุป Prompting Frameworks
    4. 4️⃣ Prompting Techniques
      1. 🥃 n-Shot
      2. 💭 COT
      3. 🗝️ สรุป Prompting Techniques
    5. 5️⃣ Tips
      1. #️⃣ Annotation
      2. 😡 EmotionPrompt
      3. 🗑️ GIGO
      4. 🗝️ สรุป Tips ในการทำงานกับ AI

    1️⃣ What Is AI?

    AI หรือ artificial intelligence หมายถึง โปรแกรมคอมพิวเตอร์ที่สามารถทำงานได้เหมือนมนุษย์ เช่น:

    • คิดวิเคราะห์
    • ใช้เหตุผล
    • โต้ตอบด้วยภาษาธรรมชาติ
    • สร้างงานศิลป์

    เมื่อพูดถึง AI อีกคำที่มักจะได้ยิน คือ machine learning

    แม้จะมีความหมายคล้ายกัน แต่ machine learning เป็น subset และเป็นมันสมองของ AI

    โดยนิยามของ machine learning คือ การเขียนโปรแกรมที่ทำให้คอมพิวเตอร์เรียนรู้จากข้อมูลได้ด้วยตัวเอง โดยไม่ต้องมีมนุษย์คอยกำกับ (Arthur Samuel)


    2️⃣ Mindset ในการทำงานกับ AI

    ในการจะเริ่มทำอะไร เราควรเริ่มจากตัวเราก่อน โดย mindset ที่ควรมีในการทำงานกับ AI มีอยู่ 3 ข้อ

    .

    👌 ข้อที่ 1. AI Is Okay

    ก่อนอื่น เราควรจะเปิดใจยอมรับ AI

    AI เป็นสิ่งใหม่ที่หลายคนอาจยังไม่มีความเข้าใจอย่างลึกซึ้ง แต่ยังไง AI ก็เป็นเพียงเครื่องมืออย่างหนี่งในการทำงาน

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

    Note: ผมหยิบคำว่า “AI is okay” มาจากผู้บริหารในบริษัทอีกที 🙏

    .

    🙆 ข้อที่ 2. AI as a Colleague

    ข้อนี้อาจจะฟังดูขัดกับข้อแรกที่มองว่า AI เป็นเครื่องมือ

    AI เป็นเทคโนโลยีปฏิวัติโลก เช่นเดียวกับไฟ เครื่องจักรไอน้ำ และอินเทอร์เน็ต

    แต่ AI มีความแตกต่างคือ เป็นเครื่องมือที่มีความ “ฉลาด” ใกล้เคียงกับมนุษย์

    และด้วยความฉลาดนี้ ทำให้เราสามารถมองว่า AI เป็นมากกว่าเครื่องมือ หรือเป็นเพื่อนร่วมงานของเราได้

    การมอง AI แบบนี้ ไม่ได้มีผลต่อแค่ความคิด แต่ส่งผลในทางปฏิบัติด้วย

    เช่น ถ้าเราคิดไม่ออกว่าจะสั่งงาน AI ยังไง ให้ลองนึกว่า ถ้า AI เป็นคน เรากำลังจะพูดยังไง

    เราอาจจะพูดว่า:

    ช่วยทำรายงานให้หน่อย

    เช่นเดียวกับคน ถ้าเราไม่มีข้อมูล การเขียนรายงานจะเริ่มไม่ได้ ซึ่งเราก็อาจจะเห็น AI ตอบกลับเหมือนกับเพื่อนร่วมงานของเรา:

    อยากให้ช่วยเขียนรายงานเรื่องอะไร? ต้องเขียนเกี่ยวกับอะไรบ้าง? ขอข้อมูลหน่อย

    แล้วเราก็จะต้องส่งข้อมูลเพิ่มให้ก่อน AI จะทำงานได้

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

    .

    ➿ ข้อ 3. Human in the Loop

    สุดท้ายและเป็นข้อที่สำคัญ คือ เราควรทำงาน “ร่วม” กับ AI

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

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

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

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

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

    .

    🗝️ สรุป Mindset การทำงานกับ AI

    1. AI is okay: เปิดใจยอมรับ AI และทำความเข้าใจ AI ในฐานะเครื่องมือตัวหนึ่ง
    2. AI as a colleague: มองและทำงานกับ AI เหมือนเป็นเพื่อนร่วมงานคนหนึ่ง
    3. Human in the loop: ทำงานร่วมกับ AI โดยคอยตรวจสอบและกำกับการทำงานของ AI ก่อนนำงานไปใช้ต่อ

    3️⃣ Prompting Frameworks

    เราดู mindset ที่ควรมีในการทำงานกับ AI กันมาแล้ว ใน section นี้ เรามาดู prompting framework หรือแนวทางในการจัดโครงสร้าง prompt กัน

    เพื่อให้เข้าใจตรงกัน prompt หมายถึง คำสั่งที่เราให้กับ AI เพื่อให้ AI ทำงานบางอย่างให้กับเรา (W3Schools)

    Prompt มีหลากหลายรูปแบบ เช่น ข้อความ รูปภาพ วิดีโอ แต่แบบที่เราใช้กันบ่อยที่สุด คือ ข้อความ

    ทั้งนี้ frameworks ในการขึ้นโครง prompt มีมากมาย อย่างที่เห็นได้ในเว็บไซต์ของ Juuzt AI ที่ระบุไว้มากถึง 57 frameworks

    แต่ละ frameworks มีข้อดีและข้อเสียแตกต่างกันไป รวมทั้งมีการใช้งานที่ไม่เหมือนกัน เราควรศึกษาและเลือก framework ที่เหมาะกับเป้าหมายของงานของเรา

    สำหรับบทความนี้ ผมจะแนะนำ 2 frameworks ที่สามารถใช้กับหลากหลายหน้างาน:

    1. RICE
    2. SALT

    เหตุผลหนึ่งที่ผมเลือกนำเสนอ RICE และ SALT ก็เพราะ:

    1. RICE ใช้กำกับ input
    2. SALT ใช้กำกับ output

    ทำให้เมื่อใช้ทั้ง 2 frameworks ร่วมกัน เราก็จะได้ prompt ที่ครอบคลุมทั้งต้นทางและปลายทาง

    .

    🍚 RICE: Input Structure

    RICE เป็น framework ที่ระบุว่า เราควรกำหนด input ให้กับ 4 อย่าง:

    1. Role: บทบาทของ AI ในการทำงาน เพื่อให้ AI นึกข้อมูลที่เกี่ยวข้องมาใช้งาน
    2. Instruction: คำชี้แจงในการทำงาน เพื่อให้ AI รู้ว่าต้องทำอะไร
    3. Context: บริบทของงาน เพื่อให้เป็นข้อมูลเพิ่มเติมในการทำงาน
    4. Example: ตัวอย่างงาน เพื่อเป็นแนวทางในการทำงานให้ตรงกับภาพที่เราคาดหวัง

    เรามาดูตัวอย่างการใช้ RICE กัน โดยเปรียบเทียบกับการ prompt อย่างง่าย ๆ

    เช่น เราอยากให้ AI ช่วยวางแผนเที่ยวปีใหม่ให้กับเรา:

    ถ้าไม่ใช้ RICE:

    Help me plan for a New Year holiday trip.

    ผลลัพธ์จาก ChatGPT:

    จะเห็นว่า ChatGPT ต้องการข้อมูลเพิ่มเติม และเรายังไม่ได้คำตอบที่ต้องการ

    ถ้าใช้ RICE:

    [ROLE] You are a travel planner helping me organise a New Year holiday trip. [INSTRUCTION] Suggest a affordable 3-day itinerary for a relaxing vacation.

    [CONTEXT] I enjoy nature and fresh air, and I like to avoid crowded tourist spots. [EXAMPLE] Examples of places I like are Chiang Mai and Nan.

    ผลลัพธ์ จาก ChatGPT:

    จะเห็นว่า เมื่อใช้ RICE เราจะได้ผลลัพธ์ที่ละเอียด อ่านง่าย ตอบโจทย์ และลงมือทำได้ทันที

    Note: ในการเขียน prompt เราสามารถจัดลำดับ RICE ได้เอง (เช่น example มาก่อน instruction) แต่ขอให้อ่านแล้วฟังดูสมเหตุสมผลกัน

    .

    🧂 SALT: Output Structure

    SALT ช่วยเรากำหนดลักษณะ 4 อย่างของ output:

    1. Style: รูปแบบคำตอบที่ต้องการ เช่น เขียนเป็น paragraph หรือ bullet point
    2. Audience: ผู้รับสาร เพื่อให้ AI ปรับการใช้คำและประโยคให้เหมาะสม
    3. Length: ความยาวของคำตอบ
    4. Tone: การใช้ภาษา เช่น เป็นทางการ หรือเป็นกันเอง

    เรามาดูตัวอย่างกัน เช่น เราอยากเข้าใจคำว่า API (application programming interface):

    ไม่ใช้ SALT:

    Explain API

    ผลลัพธ์จาก ChatGPT:

    จะเห็นว่า ผลลัพธ์มีเนื้อหาที่อ่านง่าย แต่อาจต้องใช้เวลาในการทำความเข้าใจ

    เราสามารถใช้ SALT เพื่อช่วยได้:

    Explain API in a [STYLE] bullet-point format for [AUDIENCE] a 10-year-old, using an analogy. Length [LENGTH] around 100-150 words. Use [TONE] friendly tone.

    ผลลัพธ์จาก ChatGPT:

    จะเห็นว่า เราจะได้ผลลัพธ์ในแบบที่เรากำหนด ซึ่งช่วยให้อ่านและทำความเข้าใจได้ง่ายขึ้นกว่าก่อนหน้านี้

    .

    🗝️ สรุป Prompting Frameworks

    เราทำความรู้จัก 2 prompting frameworks ที่ใช้ทำงานทั่วไปได้:

    1. RICE: กำหนด input ด้วย role, instruction, context, example
    2. SALT: กำหนด output ด้วย style, audience, length, tone

    4️⃣ Prompting Techniques

    Prompting techniques เป็นกลยุทธ์ในการช่วย AI กำหนดขั้นตอนการคิดและการทำงาน และสามารถใช้ควบคู่กับ prompting framework เพื่อทำให้งานออกมามีคุณภาพภาพมากขึ้นได้

    ในบทความนี้ เราจะมาทำความรู้จักกับ 2 techniques พื้นฐานกัน ได้แก่:

    1. n-shot technique
    2. Chain-of-thought (COT) technique

    .

    🥃 n-Shot

    Shot ในการเขียน prompt หมายถึง ตัวอย่าง

    n-shot เป็นการเขียน prompt โดยเปลี่ยนจำนวนตัวอย่าง:

    N-ShotNumber of Shots
    Zero-shot0
    One-shot1
    Few-shot≥2

    เรามาลองดูผลของจำนวนตัวอย่างต่อผลลัพธ์กัน:

    n-ShotPromptChatGPT
    Zero-shotList 3 animals– Elephant
    – Penguin
    – Kangaroo
    One-shotList 3 animals such as dog– Cat
    – Wolf
    – Fox
    Few-shotList 3 animals such as dog, cat, hamster– Rabbit
    – Guinea pig
    – Ferret

    จะเห็นได้ว่า คำตอบของ ChatGPT จะเปลี่ยนไปเรื่อย ๆ โดยยิ่ง shot มากขึ้น ผลลัพธ์ก็จะยิ่งเหมือนกับ shot มากขึ้น:

    • Zero-shot: เป็นสัตว์ป่าทั้งหมด
    • One-shot: มีทั้งสัตว์ป่าและสัตว์เลี้ยง
    • Few-shot: สัตว์เลี้ยงทั้งหมด

    ดังนั้น เราสามารถใช้ n-shot ในการกำหนดผลลัพธ์ได้ โดย:

    • ต้องการผลลัพธ์ที่สร้างสรรค์หรือแปลกใหม่: ใช้ shot น้อย
    • ต้องการผลลัพธ์ที่ตรงกับสิ่งที่เรามีอยู่แล้ว: ใช้ shot เยอะ

    .

    💭 COT

    COT เป็น technique ที่บอกขั้นตอนในการคิดของ AI เพื่อให้มั่นใจว่า AI จะทำงานออกมาถูกต้อง

    ยกตัวอย่างจากงานต้นฉบับของ Wei et al. (2022):

    Standard vs CoT prompt from Wei et al. (2022) (CC BY 4.0)

    จากรูป จะเห็นว่า AI ในด้านซ้ายตอบผิด เพราะมีเพียงตัวอย่างโจทย์และคำตอบให้

    ในทางตรงกันข้าม prompt ในด้านขวามือ ซึ่งใช้ COT technique คือ ให้ตัวโจทย์ อธิบายการคิดเลข และเฉลยคำตอบ ช่วยให้ ChatGPT ตอบคำถามได้ถูกต้อง

    COT เหมาะกับงานที่มีความซับซ้อน (มีกระบวนการทำงานหลายขั้นตอน) ส่วนในงานง่าย ๆ (เช่น ถามว่าเมืองหลวงของไทยคืออะไร) เราสามารถใช้ prompt ทั่วไปได้

    .

    🗝️ สรุป Prompting Techniques

    ใน section นี้ เราทำความรู้จัก 2 prompting techniques ในการกำกับกระบวนการทำงานของ AI:

    1. n-shot technique: กำกับผ่านตัวอย่าง
    2. COT technique: กำกับผ่านขั้นตอนการคิด

    Note: ดู techniques อื่น ๆ เพิ่มเติมได้ที่ Prompting Techniques


    5️⃣ Tips

    สำหรับส่งท้ายบทความนี้ เรามาดู 3 เคล็ดลับเพิ่มเติมในการทำงานกับ AI กัน:

    1. Annotation
    2. EmotionPrompt
    3. Garbage in, garbage out (GIGO)

    .

    #️⃣ Annotation

    Prompt ของเราเป็นเหมือนเอกสารที่ AI อ่านก่อนไปทำงานให้เรา

    ถ้าเอกสารของเราอ่านไม่รู้เรื่อง AI ก็อาจจะทำงานผิดพลาดได้

    เพื่อช่วยให้ AI เข้าใจ เราสามารถใช้ annotation หรือเครื่องหมายต่าง ๆ กำกับ prompt ของเราได้

    ถ้านึกภาพไม่ออก ให้มองว่า annotation เป็นเหมือนการจัดหน้าเอกสารของเรา ซึ่งเราสามารถทำได้ดังนี้:

    NameUsageExample
    Markdownระบุหัวข้อ# Header 1
    ## Header 2
    ### Header 3
    Quotation marksเน้นข้อความ“n-shot technique”
    Delimiterแบ่งตอนSection 1

    Section 2
    XML tagติดแท็กข้อความ<file>example.docx</file>

    มาดูตัวอย่างการใช้งานกัน เช่น เราต้องการให้ ChatGPT เขียนกลอนให้

    เราอาจเขียน prompt ได้แบบนี้:

    You are a poet. Write a poem called The Last Night. See example poems that I like in the file: poems.docx

    เราสามารถใช้ annotation ได้แบบนี้ เพื่อให้ AI อ่าน prompt ได้ง่ายขึ้น:

    # Role & Task You are a poet.

    Write a poem called “The Last Night”.



    # Example Poems See example poems that I like in the file:

    <example_file>poems.docx</example_file>

    • ใช้ # เพื่อกำหนดหัวข้อ
    • ใช้ "" เพื่อเน้นชื่อเฉพาะของบทกลอน
    • ใช้ --- เพื่อแบ่ง prompt เป็น 2 sections (ตามหัวข้อ)
    • ใช้ <></> เพื่อระบุว่า poems.doc เป็นไฟล์ตัวอย่าง

    .

    😡 EmotionPrompt

    เพราะ AI เรียนรู้การทำงานจากมนุษย์ เราสามารถใส่คำแสดงอารมณ์เข้าไปใน prompt เพื่อส่งสารบางอย่างให้กับ AI ได้

    ถ้าเปรียบเทียบกับคน คือ แทนที่จะบอกว่า:

    ช่วยทำรายงานให้หน่อย

    เป็น

    รีบทำรายงานตอนนี้ให้หน่อย ด่วนที่สุด

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

    ใส่ความเร่งด่วน:

    This is extremely urgent! Summarise this article as quickly as possible, focusing only on the key points.

    ใส่ความตื่นเต้น:

    Write an exciting social media post that builds anticipation for our upcoming event! Make readers feel thrilled and eager to attend.

    ใส่ความสำคัญ:

    Write an important and professional email explaining the new company policy. Emphasise its significance and ensure employees understand its impact on their roles.

    อ่านเพิ่มเติมเกี่ยวกับ EmotionPrompt ได้ที่ Large Language Models Understand and Can be Enhanced by Emotional Stimuli

    .

    🗑️ GIGO

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

    ถ้าเราให้ข้อมูลที่ไม่ดีแล้ว AI ก็จะทำงานผิดพลาด หรือให้ผลลัพธ์ที่ใช้ไม่ได้ออกมา (ขยะ)

    เหมือนคำที่ว่า garbage in, garbage out

    .

    🗝️ สรุป Tips ในการทำงานกับ AI

    ใน section สุดท้าย เราได้เรียนรู้ 3 เคล็ดลับเพิ่มเติมในการทำงานกับ AI:

    1. Annotation: จัด prompt ให้อ่านง่ายด้วยเครื่องหมายต่าง ๆ
    2. EmotionPrompt: ใส่อารมณ์ลงใน prompt
    3. GIGO: AI ทำงานด้วยข้อมูล คุณภาพของผลลัพธ์ขึ้นอยู่กับข้อมูลที่เราให้กับ AI
  • แนะนำ dtplyr: package เชื่อม dplyr และ data.table เพื่อการทำ data wrangling กับข้อมูลขนาดใหญ่ที่ง่ายและรวดเร็ว — ตัวอย่างจาก mtcars dataset

    แนะนำ dtplyr: package เชื่อม dplyr และ data.table เพื่อการทำ data wrangling กับข้อมูลขนาดใหญ่ที่ง่ายและรวดเร็ว — ตัวอย่างจาก mtcars dataset

    ในบทความนี้ เรามาความรู้จักกับ package ในภาษา R ที่เรียกว่า dtplyr กัน


    1. 🏎️ dtplyr คืออะไร?
    2. 🧑‍💻 วิธีใช้ dytplyr
      1. 1️⃣ ขั้นที่ 1. Install & Load dtplyr
      2. 2️⃣ ขั้นที่ 2. Create a Lazy data.table
      3. 3️⃣ ขั้นที่ 3. Execute the Syntax
    3. 😺 GitHub
    4. 📃 References
    5. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    🏎️ dtplyr คืออะไร?

    dtplyr เป็น package ที่เชื่อม 2 libraries ยอดนิยมสำหรับ data wrangling เข้าด้วยกัน ได้แก่:

    .

    Library #1. dplyr ซี่งมี verb-based syntax ที่ใช้งานง่าย

    เช่น จาก mtcars dataset เลือกรถเกียร์ manual (am == 1) ที่มี miles/gallon (mpg) ตั้งแต่ 20 ขึ้นไป โดยเรียงจากมากไปน้อย:

    # dplyr
    mtcars |>
      filter(am == 1 & mpg >= 20) |>
      select(model, mpg) |>
      arrange(desc(mpg))
    

    Note: mtcars ถูกปรับให้มี column ชื่อ model (ดู code ในการเพิ่ม column ได้ใน GitHub)

    .

    Library #2. data.table ซึ่งมี syntax ที่เข้าใจยากกว่า:

    # data.table
    mtcars_dt[am == 1 & mpg >= 20, .(model, mpg)][order(-mpg)]
    

    Note: mtcars_dt เป็น dataset ที่ถูกเปลี่ยนจาก data.frame เป็น data.table object เพื่อใช้งานกับ data.table

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

    .

    dtplyr เชื่อม dplyr เข้ากับ data.table โดยการแปล dplyr syntax ให้เป็น data.table syntax ทำให้เราทำงานได้ง่ายและรวดเร็ว


    🧑‍💻 วิธีใช้ dytplyr

    เราสามารถใช้ dtplyr ได้ใน 3 ขั้นตอนง่าย ๆ:

    1. Install and load dtplyr
    2. Create a lazy data.table
    3. Execute the syntax

    .

    1️⃣ ขั้นที่ 1. Install & Load dtplyr

    ในการใช้งาน dtplyr เราต้องเรียกใช้ dplyr ด้วยเสมอ

    ดังนั้น ในการติดตั้ง เราต้องติดตั้งทั้ง dtplyr และ dplyr:

    # Install
    install.packages("dplyr")
    install.packages("dtplyr")
    

    เมื่อติดตั้งแล้ว ให้เราเรียกใช้งาน dtplyr และ dplyr ทุกครั้งที่เริ่ม session ในการทำงาน:

    # Load
    library(dplyr)
    library(dtplyr)
    

    Note: คู่มือการใช้ dtplyr แนะนำให้โหลด data.table ด้วย เพื่อใช้ functions ของ data.table ในการทำงาน

    .

    2️⃣ ขั้นที่ 2. Create a Lazy data.table

    หลังเรียกใช้งาน dtplyr ให้เราสร้าง dataset ที่เป็น lazy data.table object ขึ้นมา เพื่อช่วยให้ dtplyr เปลี่ยนคำสั่งของ dplyr เป็นคำสั่งของ data.table ได้:

    # Convert mtcars dataset into lazy data.table object
    mtcars_ldt <- lazy_dt(mtcars)
    

    .

    3️⃣ ขั้นที่ 3. Execute the Syntax

    ในขั้นสุดท้าย เราสามารถเริ่มทำงานโดยใช้ syntax ของ dplyr ได้เลย:

    # Execute the syntax
    mtcars_ldt |>
      filter(am == 1 & mpg >= 20) |>
      select(model, mpg) |>
      arrange(desc(mpg)) |>
      as.data.table()
    

    ผลลัพธ์:

                 model   mpg
                <char> <num>
     1: Toyota Corolla  33.9
     2:       Fiat 128  32.4
     3:    Honda Civic  30.4
     4:   Lotus Europa  30.4
     5:      Fiat X1-9  27.3
     6:  Porsche 914-2  26.0
     7:     Datsun 710  22.8
     8:     Volvo 142E  21.4
     9:      Mazda RX4  21.0
    10:  Mazda RX4 Wag  21.0
    

    จะสังเกตว่า ใน code บรรทัดสุดท้าย เราเพิ่ม as.data.table() เข้ามาเพื่อบอกให้ dtplyr รู้ว่า เราเขียน syntax เสร็จแล้ว และพร้อมให้แปลงให้เป็น data.table syntax

    ทั้งนี้ ถ้าเราเขียนโดยไม่มี as.data.table():

    # Execute the syntax, without as.data.table()
    mtcars_ldt |>
      filter(am == 1 & mpg >= 20) |>
      select(model, mpg) |>
      arrange(desc(mpg))
    

    เราจะได้ผลลัพธ์ที่เป็นแค่ preview ที่ไม่สามารถนำไปใช้งานต่อได้:

      model            mpg
      <chr>          <dbl>
    1 Toyota Corolla  33.9
    2 Fiat 128        32.4
    3 Honda Civic     30.4
    4 Lotus Europa    30.4
    5 Fiat X1-9       27.3
    6 Porsche 914-2   26  
    # ℹ 4 more rows
    # ℹ Use `print(n = ...)` to see more rows
    

    ดังนั้น ถ้าเราต้องการผลลัพธ์ทั้งหมด เราต้องใช้ as.data.table() ในการรันคำสั่งทุกครั้ง

    Note: เราสามารถใช้คำสั่งอื่น ๆ แทน as.data.table() ได้ โดยจะให้ผลลัพธ์ที่แตกต่างกันไปดังนี้:

    Functionผลลัพธ์ที่ส่งกลับมา
    as.data.table()data.table
    as.data.frame()data.frame
    as.tibble()tibble
    collect()tibble
    pull()Single column

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

  • สรุป 10 คอนเซ็ปต์ทางสถิติที่คนทำงานสาย data ควรรู้ จาก 3 คอร์สเรียน stats แนะนำของ Google, DataCamp, และ DataRockie

    สรุป 10 คอนเซ็ปต์ทางสถิติที่คนทำงานสาย data ควรรู้ จาก 3 คอร์สเรียน stats แนะนำของ Google, DataCamp, และ DataRockie

    Statistics เป็น 1 ใน 3 ทักษะที่สำคัญในการทำงานกับ data

    (อีก 2 ทักษะ คือ programming และ domain expertise)

    โดย statistics ช่วยให้เรา …

    • ค้นพบรูปแบบและความสัมพันธ์ในข้อมูล
    • วิเคราะห์และรับมือกับความไม่แน่นอน (uncertainty)
    • Get insights จาก data
    • ช่วยตัดสินใจเกี่ยวกับอนาคต
    • แก้ปัญหาที่ซับซ้อน

    ในบทความนี้ เราจะมาดู 10 statistical concepts ที่คนทำงานสาย data ควรรู้กัน โดยสรุปเนื้อหาจาก 3 คอร์ส data analytics:

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


    1. 1️⃣ What Is Statistics?
    2. 2️⃣ Central Tendency
    3. 3️⃣ Spread
    4. 4️⃣ Position
    5. 5️⃣ Probability
    6. 6️⃣ Sampling
    7. 7️⃣ Distributions & Central Limit Theorem (CLT)
    8. 8️⃣ Confidence Interval
    9. 9️⃣ Hypothesis Testing
    10. 🔟 Experimental Designs
    11. 📄 References

    1️⃣ What Is Statistics?

    👉 Statistics เป็นศาสตร์ของการเก็บรวบรวม (collect) และวิเคราะห์ (analyse) ข้อมูล

    เมื่อเราต้องการศึกษา population หรือกลุ่มที่เราสนใจ (เช่น คนไทย) เราต้องเก็บข้อมูลและนำมาวิเคราะห์ เพื่อหาข้อสรุป

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

    การที่เรามี population และ sample ทำให้เราแบ่ง statistics ได้เป็น 2 สาขา:

    No.TypeDescription
    1Descriptive statisticsสรุปลักษณะของชุดข้อมูล (sample และ popilation)
    2Inferential statisticsอนุมานลักษณะของ population จากลักษณะของ sample

    ตัวอย่างหัวข้อของ descriptive statistics:

    • Central tendency
    • Spread
    • Position

    ตัวอย่างหัวข้อของ inferential statistics:

    • Confidence level
    • Significance level
    • Hypothesis testing

    2️⃣ Central Tendency

    👉 Central tendency คือ ค่ากลางของชุดข้อมูล และมี 3 ค่า ได้แก่:

    No.MeasureDefinition
    1Meanค่าเฉลี่ย (average)
    2Medianข้อมูลที่อยู่กลางชุดข้อมูล (middle value)
    3Modeข้อมูลที่เกิดขึ้นบ่อยที่สุดในชุดข้อมูล (most frequent value)

    Note:

    • Central tendency ที่เรานิยมใช้ คือ mean
    • เราควรใช้ median ในกรณีที่ชุดข้อมูลมี outlier เพราะ mean มีความอ่อนไหวต่อ outlier
    • Mean และ median มีได้ 1 ค่า แต่ mode มีได้มากกว่า 1 ค่า

    อ่านเพิ่มเติมเกี่ยวกับ central tendency: บทความจาก Australian Bureau of Statistics


    3️⃣ Spread

    👉 Spread คือ การวัดความหลากหลายของข้อมูล และมี 4 ค่า ได้แก่:

    No.MeasureDefinition
    1Rangeค่าความต่างระหว่าง ค่าที่น้อยที่สุด (min) และค่าที่มากที่สุด (max)
    2Standard deviation (SD)ค่าความห่างโดยเฉลี่ยระหว่างข้อมูลและ mean ของชุดข้อมูล
    3VarianceSD กำลังสอง
    4Interquartile rangeค่าความต่างระหว่าง quartile ที่ 1 (Q1) และ quartile ที่ 3 (Q3)

    อ่านเพิ่มเติมเกี่ยวกับ spread: บทความจาก Australian Bureau of Statistics


    4️⃣ Position

    👉 Position หมายถึง ตำแหน่งของข้อมูลในชุดข้อมูล และมี 2 ค่าหลัก ได้แก่:

    No.MeasureDefinition
    1Percentileระบุตำแหน่งจาก % ข้อมูลที่มีค่าน้อยกว่าข้อมูลนั้น (เช่น ข้อมูลที่ P70 หมายถึง มีข้อมูลที่อยู่ต่ำกว่าข้อมูลนี้ 70%)
    2Quartileระบุตำแหน่งโดยแบ่งข้อมูลเป็น 4 ส่วนเท่า ๆ กัน (quartile)

    5️⃣ Probability

    👉 Probability (ความน่าจะเป็น) คือ การศึกษาความไม่แน่นอน (uncertainty) และแบ่งได้เป็น 2 ประเภทหลัก ตามลักษณะ event (เหตุการณ์) ที่เราสนใจ:

    1. Independent probability
    2. Conditional probability

    .

    ประเภทที่ 1. Independent probability

    👉 Probability ของเหตุการณ์ที่ไม่ขึ้นอยู่กับเหตุการณ์อื่น (independent events) เช่น:

    • การฟังเพลงรัก กับ พระอาทิตย์ขึ้น
    • การดื่มกาแฟ กับ ฝนตก
    • การใส่เสื้อสีฟ้า กับ ราคาหุ้นขึ้น

    🧮 วิธีคำนวณ:

    P(A) = Outcome A / Total outcomes

    • P(A) คือ probability ของ event A
    • Outcome A คือ จำนวนครั้งที่เกิด event A
    • Total outcomes คือ จำนวนครั้งที่เกิด events ทั้งหมด

    .

    ประเภทที่ 2. Conditional probability

    👉 Probability ของเหตุการณ์ที่ขึ้นอยู่กับเหตุการณ์อื่น (dependent events) เช่น:

    • การสอบเข้ามหาวิทยาลัย กับ การเรียนจบ ป.ตรี (จะเรียนไม่จบ ถ้าไม่ได้สอบ)
    • การซื้อหวย กับ การถูกหวย (จะถูกหวยไม่ได้ ถ้าไม่ได้ซื้อ)
    • การออมเงิน และ การมีเงินหลังเกษียณ (อาจไม่มีเงินใช้ ถ้าไม่ออมเงิน)

    🧮 วิธีคำนวณ:

    P(A | B) = P(A ∩ B) / P(B)

    • P(A | B) คือ probability ของ event A ถ้าเกิด event B
    • P(A ∩ B) คือ probability ของ event A และ B
    • P(B) คือ probability ของ event B

    6️⃣ Sampling

    👉 Sampling คือ การสร้าง sample จาก population และมี 2 ประเภท ได้แก่

    1. Non-probability sampling: การสร้าง sample ที่สมาชิกของ population มีโอกาสถูกเลือกไม่เท่ากัน
    2. Probability sampling: การสร้าง sample ที่สมาชิกของ population มีโอกาสถูกเลือกเท่า ๆ กัน

    โดยแต่ละประเภทมีประเภทย่อยดังนี้:

    .

    🍀 Non-probability sampling มี 4 ประเภทย่อย:

    No.TypeMeaning
    1Voluntary responseกลุ่มตัวอย่างสมัครใจเข้าร่วมเอง
    2Convenience samplingกลุ่มตัวอย่างมาจากคนที่เข้าถึงได้ง่าย (เช่น เพื่อน คนในครอบครัว)
    3Purposive samplingสร้างกลุ่มตัวอย่างตามเกณฑ์ที่กำหนด (เช่น เลือกคนอายุ 20 ปีเท่านั้น)
    4Snowball samplingกลุ่มตัวอย่างที่ได้จากการให้ผู้เข้าร่วมชวนกันต่อเป็นลูกโซ่

    .

    🍀 Probability sampling มี 4 ประเภทย่อย:

    No.TypeMeaning
    1Simple random samplingสุ่มกลุ่มตัวอย่างจากประชากรโดยตรง
    2Stratified random samplingแบ่งประชากรออกเป็นกลุ่ม ๆ แล้วสุ่มตัวอย่างจากแต่ละกลุ่มตามสัดส่วน
    3Cluster random samplingแบ่งประชากรเป็นกลุ่ม ๆ แล้วเลือกสุ่มกลุ่มมาเป็นตัวอย่าง
    4Systematic random samplingจัดลำดับสมาชิกแล้วสุ่มเลือกทุก ๆ nth คน เช่น คนที่ 5, 10, 15, …

    7️⃣ Distributions & Central Limit Theorem (CLT)

    👉 Distribution คือ การกระจายตัวของข้อมูล

    แม้ว่า distribution จะมีหลายประเภท แต่มี 2 ประเภท ที่เรามักพบบ่อย ได้แก่:

    1. Normal distribution
    2. Sampling distribution

    .

    ประเภทที่ 1. Normal distribution

    👉 Normal distribution คือ การกระจายตัวแบบระฆังคว่ำ (bell shape) เพราะมีข้อมูลส่วนใหญ่กระจุกตัวอย่างตรงกลาง และกระจายตัวออกด้านข้าง

    นอกจากทรงระฆังคว่ำที่เป็นจุดเด่น normal distribution ยังมีลักษณะอื่น ๆ อีก คือ:

    1. สมมาตร (symmetrical)
    2. พื้นที่ใต้กราฟ = 1
    3. หางทั้งสองข้างจะเข้าใกล้ 0 แต่ไม่แตะ 0
    4. เรารู้ว่า ในแต่ละส่วนของ normal distribution มีข้อมูลอยู่กี่เปอร์เซ็นต์:
    Zone%
    -/+1 SD68
    -/+2 SD95
    -/+3 SD99

    Normal distribution เป็น distribution ที่มีความสำคัญ เพราะ:

    1. เป็น distribution ที่พบได้ทั่วไปในธรรมชาติ เช่น ส่วนสูง ความดันเลือด IQ
    2. เป็นพื้นฐานของการวิเคราะห์ทางสถิติอื่น ๆ เช่น hypothesis testing

    .

    ประเภทที่ 2. Sampling distribution

    👉 Sampling distribution เป็น distribution ที่เกิดจากการเอา mean ของหลาย ๆ samples มาสร้างกราฟ

    ยกตัวอย่างเช่น sampling distribution จาก 10 samples, 100 samples, และ 1,000 samples (แต่ละ sample มีขนาด 30 คน):

    .

    📊 Central limit theorem (CLT)

    CLT ระบุว่า ยิ่งเรามี sample มากขึ้นเท่าไร sampling distribution ก็จะยิ่งเหมือน normal distribution เข้าไปเท่านั้น

    เราสามารถสังเกตเห็นได้จากตัวอย่างกราฟด้านบน ในขณะที่เราเพิ่ม samples จาก 10 เป็น 100 เป็น 1,000 การกระจายตัวก็ดูเหมือน normal distribution เข้าไปเรื่อย ๆ

    ทั้งนี้ CLT จะเป็นจริงได้ ถ้าเงื่อนไข 3 ข้อนี้เป็นจริง:

    No.AssumptionDescription
    1Randomisationsamples ได้มาจากการสุ่ม
    2Independenceการสุ่มแต่ละครั้งไม่ขึ้นกับการสุ่มครั้งก่อน
    3Sample sizeกลุ่มตัวอย่างมีขนาดใหญ่พอ (อย่างน้อย 30 ตัวอย่าง ตาม rule of thumb)

    8️⃣ Confidence Interval

    👉 Confidence interval คือ การประมาณการ (estimate) โดยใช้ช่วง (interval) แทนค่าเดี่ยว ๆ (point)

    ยกตัวอย่างเช่น แทนที่เราจะเดาว่า คนคนหนึ่งมีอายุ 20 ปี (point) เราสามารถเดาเป็นช่วงได้ เช่น อายุ 18-22 ปี (interval)

    ทั้งนี้ confidence interval ประกอบด้วย 3 ส่วน:

    No.ComponentExample
    1Sample statisticเรารู้ว่า คนคนนี้อยู่ในกลุ่มคนที่มีค่าเฉลี่ยอายุ 20 ปี
    2Margin of errorเราเชื่อว่า อายุจริงของคนคนนี้จะต่างจากค่าเฉลี่ย -/+ 2 ปี
    3Confidence levelเราเชื่อว่า การเดาของเรามีโอกาสถูก 95%

    Note:

    • 95% เป็น confidence level ที่นิยมใช้มากที่สุด
    • ยิ่ง confidence level สูง, confidence interval ก็ยิ่งกว้าง เพราะต้องมีความครอบคลุมเพิ่ม

    9️⃣ Hypothesis Testing

    👉 Hypothesis testing คือ การทดสอบว่า สิ่งที่เราเชื่อเกี่ยวกับ population เป็นจริงไหม

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

    • คนไทยมีความสูงเฉลี่ย 170 cm
    • ผู้หญิงทำข้อสอบเลขได้ดีกว่าผู้ชาย
    • กาแฟช่วยให้ทำงานได้ดีขึ้น

    .

    👉 4 ขั้นตอนในการทำ hypothesis testing:

    1. ตั้ง null hypothesis (H0) และ alternate hypothesis (H1)
    2. เลือก significance level
    3. หา p-value
    4. ตัดสินใจว่า จะ reject หรือ fail to reject H0

    .

    🤔 H0 vs H1

    HypothesisDescriptionExample
    H0สมมุติฐานที่ถือว่าเป็นจริง จนกว่าจะมีหลักฐานมาหักล้างความสูงเฉลี่ยของคนไทย เท่ากับ 170 cm
    H1สมมุติฐานที่ถือว่าเป็นจริง ต่อเมื่อมีหลักฐานสนับสนุนความสูงเฉลี่ยของคนไทย ไม่เท่ากับ 170 cm

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

    ExampleH0H1
    คนไทยมีความสูงเฉลี่ย 170 cmความสูงเฉลี่ยของคนไทย เท่ากับ 170 cmความสูงเฉลี่ยของคนไทย ไม่เท่ากับ 170 cm
    ผู้หญิงทำข้อสอบเลขได้ดีกว่าผู้ชายคะแนนสอบเลขของผู้หญิงและผู้ชายเท่ากันคะแนนสอบเลขของผู้หญิงและผู้ชายไม่เท่าเท่ากัน
    กาแฟช่วยให้ทำงานได้ดีขึ้นดื่มกาแฟแล้ว จะทำงานได้แค่ 8 ชม.ดื่มกาแฟแล้ว จะทำงานได้นานกว่า 8 ชม.

    .

    🤔 Significance level vs p-value

    TermDescription
    Significance levelความเป็นไปได้ที่จะ reject H0 เมื่อ H0 เป็นจริง
    P-valueความเป็นไปได้ที่จะเห็นผลลัพธ์ที่แตกต่างจาก H0 เมื่อ H0 เป็นจริง

    .

    🤔 Reject H0 vs fail to reject H0

    เราจะ reject H0 (ยอมรับ H1) เมื่อ significance level และ p-value มีค่าดังนี้:

    ActionWhen
    Reject H0p-value < significance level
    Fail to reject H0p-value > significance level

    🔟 Experimental Designs

    การเก็บข้อมูลทางสถิติทำได้ 3 แบบหลัก ๆ ได้แก่:

    1. Observational study
    2. A/B testing
    3. Randomised controlled trial (RCT)

    .

    👉 Observational study เป็นการเก็บข้อมูล ผ่านการสังเกตการณ์ เช่น:

    • สังเกตพฤติกรรมการซื้อของในร้านค้า
    • สังเกตพฤติกรรมการเล่นของเด็ก
    • สังเกตพฤติกรรมการหาคู่ของนก

    ใน observational study เราไม่ได้เปลี่ยนแปลงตัวแปรต้น (independent variable) ทำให้:

    • เราสามารถบอกได้ว่า อะไรเกิดขึ้นกับอะไร (correlation)
    • แต่ไม่สามารถบอกได้ว่า อะไรทำให้เกิดอะไร (causation) เท่านั้น

    .

    👉 A/B testing เป็นการทดสอบที่นิยมใช้ใน business เพื่อทดสอบผลิตภัณฑ์/บริการ

    ใน A/B testing เรามีของ 2 versions (A vs B) และกลุ่มตัวอย่างจะถูกสุ่มให้เห็น version ที่ไม่เหมือนกัน

    เช่น เรามีเว็บไซต์แบบเก่า (A) และแบบใหม่ (B) และเราอยากรู้ว่า แบบไหนกระตุ้นยอดขายดีที่สุด

    เราเปิดใช้งานเว็บไซต์ 2 versions โดยลูกค้าแต่ละคนจะเห็นเว็บไซต์ไม่เหมือนกัน (บางคนเห็นแบบเก่า และบางคนเห็นแบบใหม่)

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

    ดูตัวอย่าง A/B testing ในโลกจริง: 10 real-world examples of A/B testing that made an impact

    .

    👉 RCT เป็น “gold standard” ของ experimental design เพราะ:

    1. มีการควบคุมตัวแปรต้น ทำให้เราอนุมานถึง cause และ effect ได้
    2. ลดความลำเอียง (bias) และอิทธิพลของตัวแปรที่สาม (confounding variables)

    RCT มีลักษณะเด่น 2 อย่าง:

    No.CharacteristicDescription
    1Randomisationกลุ่มตัวอย่างถูกสุ่มเข้าเงื่อนไข
    2Control groupมีกลุ่มที่เป็น baseline เพื่อเปรียบเทียบกับกลุ่มที่ได้รับเงื่อนไขบางอย่าง

    ตัวอย่างการทำ RCT เช่น การทดสอบผลของยาลดความดัน:

    • เราใช้การสุ่มผู้เข้าร่วมให้เป็น 2 กลุ่ม
    • กลุ่มแรกให้รับยาปลอมที่ไม่ส่งผลต่อร่างกาย (control group)
    • กลุ่มที่สองได้รับยาจริงที่เราต้องการทดสอบผล (treatment)
    • หลังรับยา เราวัดความดันของทั้งสองกลุ่ม

    📄 References

  • วิธีใช้ ggplot2 เพื่อสร้างกราฟอย่างมืออาชีพระดับโลก แบบ BBC และ Financial Times ในภาษา R — ตัวอย่างการสำรวจข้อมูลเพนกวินจาก palmerpenguins

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

    ggplot2 เป็น package สำหรับ data visualisation ในภาษา R และเป็นเครื่องมือสร้างกราฟที่มืออาชีพนิยม ตั้งแต่นักวิจัยในการตีพิมพ์ผลงาน ไปจนถึงสำนักข่าวระดับโลกอย่าง BBC และ Financial Times

    ggplot2 มีจุดเด่น 4 ข้อ:

    1. ใช้งานง่าย
    2. สร้างกราฟได้หลากหลาย
    3. ปรับแต่งกราฟได้ดังใจ
    4. ได้กราฟที่ดูดีและมีคุณภาพ

    .

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

    • ggplot2 syntax
    • Basic plotting
    • Plot customisations

    .

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


    1. 🔤 gg for “Grammar of Graphics”
    2. 🏁 Getting Started With ggplot2
    3. ✍️ Basic Syntax
    4. 📊 Basic Plotting: Data, Aesthetics, & Geom
      1. 🎨 Aesthetics
      2. ⏹️ Geom
    5. 🔧 More Customisations
      1. 🖼️ Theme
      2. 🔤 Text
      3. ✌️ Facet
    6. 🔥 Summary
    7. 📚 Learn More About ggplot2
      1. 😺 GitHub
      2. 📖 Read More About ggplot2
      3. 📰 Cheat Sheets
    8. 📃 References
    9. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    🔤 gg for “Grammar of Graphics”

    gg ใน ggplot2 ย่อมาจาก “Grammar of Graphics”

    หนังสือ Grammar of Graphics ของ Leland Wilkinson บน Amazon

    Grammar of Graphics เป็นแนวคิดที่มองกราฟเป็นเหมือนภาษา คือ มีโครงสร้างและองค์ประกอบที่ตายตัว ซึ่งเมื่อเรานำมารวมกัน เราก็จะได้กราฟที่ต้องการขึ้นมา

    โดยกราฟใน ggplot2 ประกอบด้วย 7 ส่วน หรือ layers ได้แก่:

    No.LayerDescription
    1Dataชุดข้อมูลสำหรับสร้างกราฟ
    2Aestheticsจับคู่ข้อมูลกับกราฟ (เช่น แกน x และ y)
    3Geometric objectsประเภทกราฟ (เช่น กราฟเส้น กราฟแท่ง)
    4Facetsสร้างกราฟย่อย
    5Statistical transformationsวิเคราะห์ข้อมูล (เช่น หาค่าเฉลี่ย)
    6Coordinatesแกนในการสร้างกราฟ
    7Themeหน้าตาของกราฟ (เช่น สีพื้นหลัง)

    ในการทำงาน เรามักจะเรียกใช้งาน 3 layers แรกเป็นหลัก ได้แก่:

    1. Data
    2. Aesthetics
    3. Geometric objects

    🏁 Getting Started With ggplot2

    ในการเริ่มต้นใช้งาน ggplot2 เราต้องทำ 3 อย่างก่อน คือ:

    .

    ข้อที่ 1. ติดตั้ง ggplot2 บน environment ของเรา:

    install.packages("ggplot2")
    

    Note: ถ้าใครเคยติดตั้งแล้ว สามารถข้ามไปขั้นถัดไปได้เลย

    .

    ข้อที่ 2. เรียกใช้งาน ggplot2:

    library(ggplot2)
    

    Note: เราต้องเรียกใช้งาน ggplot2 ทุกครั้งที่เริ่ม session ใหม่

    .

    ข้อที่ 3. โหลด dataset ที่เราจะใช้สร้างกราฟ

    สำหรับบทความนี้ เราจะใช้ penguins dataset ที่มีข้อมูลของเพนกวิน 3 สายพันธุ์ (เช่น สปีชีส์ น้ำหนัก ความยาวปีก) กัน

    เราสามารถโหลด dataset ได้ดังนี้:

    install.packages("palmerpenguins")
    library(palmerpenguins)
    

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

    head(penguins)
    

    ผลลัพธ์:

    Note: เราสามารถอ่านคู่มือ penguins ได้ด้วยคำสั่ง ?penguins

    .

    เมื่อทำครบทั้ง 3 ขั้นตอน เราก็พร้อมที่จะสร้างกราฟใน ggplot2 แล้ว


    ✍️ Basic Syntax

    ก่อนไปดูการสร้างกราฟ เรามาดู syntax ของ ggplot2 กันก่อน:

    ggplot(data, aes(x, y, other)) +
    geom_*() +
    ...
    • ggplot() คือ การเรียกใช้งาน ggplot2
    • data คือ ชุดข้อมูลในการสร้างกราฟ
    • aes() คือ ส่วนจับคู่ข้อมูลกับลักษณะของกราฟ
      • x, y คือ ข้อมูลที่แสดงบนแกน x และ y
      • other คือ ข้อมูลที่จะแสดงผ่านส่วนอื่น ๆ ของกราฟ เช่น สี ขนาด รูปทรง
    • geom_* คือ ประเภทกราฟ
    • คือ function อื่น ๆ ในการตั้งค่ากราฟ (เช่น theme, facet)

    📊 Basic Plotting: Data, Aesthetics, & Geom

    ในการสร้างกราฟ เรามี 3 input เบื้องต้นที่เราต้องกำหนด ได้แก่:

    No.InputDescription
    1DataDataset ในการสร้างกราฟ
    2Aestheticsลักษณะของกราฟที่ใช้แสดงข้อมูล (เช่น แกน x และ y)
    3Geomประเภทกราฟ (เช่น กราฟเส้น กราฟแท่ง)

    Note: ทั้งสามอย่างสะท้อนถึง 3 layers แรกของ ggplot2

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

    สร้าง scatter plot ที่แสดงความสัมพันธ์ระหว่างน้ำหนักตัว (body_mass_g) และความยาวปีก (flipper_length_mm) ของเพนกวิน:

    ggplot(penguins, aes(x = body_mass_g,
                         y = flipper_length_mm)) +
      geom_point()
    

    ผลลัพธ์:

    .

    🎨 Aesthetics

    นอกจากแกน x และ y เราแสดงข้อมูลผ่านลักษณะอื่น ๆ ของกราฟได้ เช่น:

    No.ParametreDescription
    1colorสีขอบรูปทรง
    2fillสีในรูปทรง
    3shapeรูปทรง
    4sizeขนาด
    5alphaความโปร่งใส

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

    เพิ่มสปีชีส์เข้าไปใน scatter plot:

    ggplot(penguins, aes(x = body_mass_g,
                         y = flipper_length_mm,
                         color = species)) +
      geom_point()
    

    ผลลัพธ์:

    Note: เราใช้ color แทน fill เพราะ จุด default ของ scatter plot ไม่รองรับการเติมสี

    .

    ⏹️ Geom

    เราสามารถเปลี่ยนประเภทกราฟได้ โดยเปลี่ยน geom_*() เช่น:

    No.GeomGraph
    1geom_histogram()Histogram
    2geom_boxplot()Box plot
    3geom_line()Line plot
    4geom_col()Bar plot
    5geom_density()Density plot

    Note: ggplot2 มีรูปแบบกราฟกว่า 40+ แบบให้เลือก เราสามารถดูรูปแบบกราฟต่าง ๆ ได้ที่ Function reference และดูตัวอย่างกราฟได้ที่ The R Gallery

    .

    นอกจากนี้ เรายังสามารถปรับแต่งหน้าตาของกราฟได้ด้วย parametre ต่าง ๆ ใน geom_*() เช่น:

    No.ParametreDescription
    1colorสีขอบรูปทรง
    2fillสีในรูปทรง
    3shapeรูปทรง
    4sizeขนาด
    5alphaความโปร่งใส

    Note:

    • จะสังเกตว่า parametre เหล่านี้ (เรียกว่า attribute) เหมือนกับ parametres ของ aes()
    • ความแตกต่างอยู่ที่ parametre ใน geom_*() จะคงที่ ในขณะที่ parametre ใน aes() จะเปลี่ยนแปลงตามข้อมูล

    .

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

    เปลี่ยนจุดข้อมูลให้เป็นกล่องสี่เหลี่ยมใส:

    ggplot(penguins, aes(x = body_mass_g,
                         y = flipper_length_mm,
                         color = species)) +
      geom_point(shape = 22)
    

    ผลลัพธ์:

    จะเห็นได้ว่า จุดข้อมูลเปลี่ยนเป็นสี่เหลี่ยมเหมือนกันหมด และไม่เปลี่ยนตามประเภทเพนกวิน เพราะเรากำหนด argument ใน geom_*()

    .

    Note: เราสามารถดู argument ของ shape และ parametres อื่น ๆ ได้ที่ Aesthetic specifications


    🔧 More Customisations

    จนถึงตอนนี้ เรารู้วิธีสร้างและปรับแต่งกราฟเบื้องต้นกันแล้ว

    เรามาดู 3 วิธีในการปรับแต่งเพิ่มเติม เพื่อให้กราฟของเราดูเป็นมืออาชีพกัน:

    1. Theme
    2. Text
    3. Facet

    .

    🖼️ Theme

    Theme ใน ggplot2 หมายถึง หน้าตากราฟที่ไม่เกี่ยวข้องกับข้อมูล เช่น สีแกน x และ y และสีพื้นหลัง

    เราสามารถปรับ theme ได้โดยการเรียกใช้ theme_*() เช่น:

    ggplot(penguins, aes(x = body_mass_g,
                         y = flipper_length_mm,
                         color = species)) +
      geom_point() +
      
      # Apply classic theme
      theme_classic()
    

    ผลลัพธ์:

    จะเห็นว่า กราฟของเราดูสะอาดตามากขึ้น เมื่อไม่มี gridline

    .

    Note:

    ggplot2 มี built-in themes ให้เลือกใช้ 5 แบบหลัก ได้แก่:

    No.ThemeBackgroundGridline
    1theme_gray()สีเทาสีขาว
    2theme_classic()สีขาวNone
    3theme_bw()สีขาวสีเทา
    4theme_light()สีขาวสีเทา
    5theme_dark()สีเทาเข้มสีเทาอ่อน
    • theme_gray() เป็น default theme ของ ggplot2
    • ดู built-in themes อื่น ๆ ได้ที่ Complete themes
    • เราสามารถเลือกใช้ themes จาก packages อื่นใน R ได้ เช่น ggthemes และ bbcplot

    .

    🔤 Text

    ข้อความเป็นส่วนสำคัญของกราฟ ซึ่งสามารถช่วยให้คนที่ดูกราฟของเราเข้าใจกราฟได้ง่ายขึ้น

    ใน ggplot2 เราสามารถปรับแต่งข้อความได้ 3 วิธี:

    No.SyntaxDescription
    1theme()กำหนดขนาด และ typeface ของข้อความ
    2labs()เพิ่มชื่อกราฟ ชื่อแกน x, y และ legend
    3annotate()เพิ่มโน้ตในกราฟ

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

    ggplot(penguins, aes(x = body_mass_g,
                           y = flipper_length_mm,
                           color = species)) +
      geom_point() +
      theme_classic() +
      
      # Adjust text size
      theme(plot.title = element_text(size = 16, face = "bold"),
            axis.title.x = element_text(size = 14),
            axis.title.y = element_text(size = 14),
            legend.title = element_text(size = 14),
            legend.text = element_text(size = 12),
            strip.text = element_text(size = 14, face = "bold")) +
      
      # Add a title, labels, and a legend
      labs(title = "Penguin Body Mass vs. Flipper Length",
           x = "Body Mass (g)",
           y = "Flipper Length (mm)",
           color = "Penguin Species") +
      
      # Add annotation
      annotate("text",
               x = 3000,
               y = 225,
               label = "Larger penguins tend to \\n have longer flippers",
               size = 5,
               color = "gray",
               hjust = 0)
    

    ผลลัพธ์:

    จะเห็นได้ว่า กราฟของเรามีชื่อกราฟ คำประกอบแกน x, y และ legend รวมทั้งโน้ตที่ช่วยในการอ่านกราฟ “Larger penguins tend to have longer flippers” เพิ่มขึ้นมา

    .

    ✌️ Facet

    ในบางครั้ง เราอาจต้องการสร้างกราฟย่อย ซึ่งเราสามารถทำได้ด้วย 2 คำสั่งใน ggplot2:

    No.FunctionDividing Factor
    1facet_wrap()1 categorical variable
    2facet_grid()2 categorical variables

    .

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

    ใช้ facet_wrap() แบ่งกราฟตามชนิดเพนกวิน:

    ggplot(penguins, aes(x = body_mass_g,
                         y = flipper_length_mm,
                         color = species)) +
      geom_point() +
      theme_bw() +
      
      # Use facet_wrap()
      facet_wrap(~species)
    

    ผลลัพธ์:

    .

    ใช้ facet_grid() แบ่งตามเพศและชนิดของเพนกวิน:

    ggplot(penguins, aes(x = body_mass_g,
                         y = flipper_length_mm,
                         color = species)) +
      geom_point() +
      theme_bw() +
      
      # Use facet_grid()
      facet_grid(sex~species)
    

    ผลลัพธ์:

    Note: ในกราฟ เรามี row ที่ 3 (NA) เพราะบาง record ไม่มีข้อมูลเพศของเพนกวิน


    🔥 Summary

    ในบทความนี้ เราได้เรียนรู้วิธีใช้ ggplot2 เพื่อสร้างกราฟอย่างมืออาชีพ

    • Syntax ของ ggplot2
    • การตั้งค่า aesthetics
      • x
      • y
      • Aesthetics อื่น ๆ
    • การตั้งค่า geom
      • geom_*()
      • paramatres ของ geom_*()
    • การปรับแต่งกราฟ
      • Theme
      • Text
      • Facet

    📚 Learn More About ggplot2

    .

    😺 GitHub

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

    .

    📖 Read More About ggplot2

    .

    📰 Cheat Sheets


    📃 References

    Articles:

    Courses


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

  • data.table: แนะนำ 3 ส่วนวิธีใช้งาน package ทรงพลัง เพื่อทำงานกับข้อมูลขนาดใหญ่อย่างมีประสิทธิภาพและรวดเร็ว ในภาษา R แบบครบ — ตัวอย่างการทำงานกับข้อมูลเที่ยวบินจาก flights dataset

    data.table: แนะนำ 3 ส่วนวิธีใช้งาน package ทรงพลัง เพื่อทำงานกับข้อมูลขนาดใหญ่อย่างมีประสิทธิภาพและรวดเร็ว ในภาษา R แบบครบ — ตัวอย่างการทำงานกับข้อมูลเที่ยวบินจาก flights dataset

    R ได้ชื่อว่าเป็น “statistical programming language” เพราะออกแบบมาเพื่อทำงานกับ data โดยเฉพาะ

    ภาษา R มี packages มากมายที่รองรับการทำงานกับ data ในรูปแบบตาราง (tabular data) หรือ data frame อย่างตัวอย่างในภาพ:

    ตัวอย่าง data frame: flights dataset

    หนึ่งใน packages ที่ได้รับความนิยมในการทำงานกับ data frame โดยเฉพาะงาน data science ได้แก่ data.table

    data.table เป็น package สำหรับ data manipulation ที่มีจุดเด่น 3 อย่าง คือ:

    1. ใช้งานง่าย (แม้จะมีการเขียนที่แตกต่างจาก functions ทั่วไป แต่มี syntax ที่ตายตัว)
    2. ประมวลผลเร็วและประหยัด resource เพราะ data.table optimises code ที่เราเขียน
    3. รองรับการทำงานกับ data ขนาดใหญ่ (เช่น data ที่ใช้ RAM ขนาด 10 ถึง 100 GB ในการประมวลผล)

    ในบทความนี้ เราจะมาดูวิธีการใช้งาน data.table แบบครบจบใน 3 ส่วนกัน:

    1. การใช้งาน data.table เบื้องต้น (syntax และ arguments)
    2. การใช้งาน data.table ขั้นสูง (combining และ chaining)
    3. Special symbols ใน data.table

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


    1. 🏁 Get Started With data.table
    2. ✈️ Example Dataset: flights
      1. 1️⃣ Intro to flights
      2. 2️⃣ Get flights
    3. ✍️ Syntax: DT[i, j, by]
    4. 🍦 1st Argument: i
      1. 1️⃣ Select Rows
      2. 2️⃣ Filter
      3. 3️⃣ Sort
    5. 🧮 2nd Argument: j
      1. 1️⃣ Select Columns
      2. 2️⃣ Compute
      3. 3️⃣ Create Columns
    6. 🤝 3rd Argument: by
    7. 🔗 Combining & Chaining
      1. 1️⃣ Combining
      2. 2️⃣ Chaining
    8. 🍩 Special Symbols
      1. 1️⃣ .N
      2. 2️⃣ .SD
      3. 3️⃣ .SDcols
    9. 😎 Conclusion
    10. 🎒 Learn More About data.table
      1. 😺 GitHub
      2. 📚 อ่านเพิ่มเติมเกี่ยวกับ data.table
      3. 📑 Cheat Sheets ในการใช้งาน data.table
    11. 📃 References
    12. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    🏁 Get Started With data.table

    ในการเริ่มต้นใช้งาน data.table เราจะต้องทำ 2 อย่าง ได้แก่:

    1. ติดตั้ง data.table (ทำครั้งแรกครั้งเดียว)
    2. โหลด data.table (ทำทุกครั้งที่เริ่ม session ใหม่)
    # Install data.table
    install.packages("data.table")
    
    # Load data.table
    library(data.table)
    

    เมื่อทำทั้ง 2 อย่างนี้แล้ว เราก็พร้อมที่จะใช้งาน data.table กันแล้ว


    ✈️ Example Dataset: flights

    1️⃣ Intro to flights

    ในบทความนี้ เราจะมาดูตัวอย่างการใช้ data.table กับ flights ซึ่งมีข้อมูลเที่ยวบินที่ออกจาก New York City ในปี ค.ศ. 2014 เช่น:

    • วันที่
    • สนามบินต้นทางและปลายทาง
    • ระยะเวลาที่เที่ยวบิน delay
    • ระยะเวลาบิน
    • ระยะทาง

    Note: ดูรายละเอียดทั้งหมดของ dataset ได้ที่ GitHub

    .

    2️⃣ Get flights

    เราสามารถเริ่มใช้งาน flights ใน 2 ขั้นตอน:

    ขั้นที่ 1. Download ไฟล์จาก link โดยไฟล์ที่ได้จะเป็น CSV (comma-separated values):

    ขั้นที่ 2. Import ข้อมูลเข้าใน R ด้วย fread() (”fast read”) ซึ่งเป็น function สำหรับโหลดข้อมูลของ data.table:

    # Import the dataset
    flights <- fread("flights14.csv")
    

    เราสามารถดูตัวอย่างข้อมูลได้ด้วย head():

    # Preview the dataset
    head(flights)
    

    ผลลัพธ์:

        year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
       <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
    1:  2014     1     1        14        13      AA    JFK    LAX      359     2475     9
    2:  2014     1     1        -3        13      AA    JFK    LAX      363     2475    11
    3:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19
    4:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7
    5:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13
    6:  2014     1     1         4         0      AA    EWR    LAX      339     2454    18
    

    ✍️ Syntax: DT[i, j, by]

    การใช้งาน data.table ประกอบด้วย 4 ส่วน ดังนี้:

    DT[i, j, by]
    1. DT คือ dataset ที่เราต้องการใช้งาน
    2. i ใช้ทำงานกับ rows
    3. j ใช้ทำงานกับ columns
    4. by ใช้จับกลุ่มข้อมูล

    เราไปดูรายละเอียดการใช้งาน i, j, และ by กัน


    🍦 1st Argument: i

    เราสามารถใช้งาน i ได้ 3 อย่าง:

    1. Select rows: เลือก rows ที่ต้องการ
    2. Filter: กรองข้อมูล
    3. Sort: จัดลำดับข้อมูล

    .

    1️⃣ Select Rows

    เราสามารถใช้ i เพื่อเลือก rows ได้ 3 แบบ:

    1. เลือก 1 row
    2. เลือกหลาย rows
    3. คัด rows ที่ไม่ต้องการออก

    .

    แบบที่ #1. เลือก 1 row

    เช่น เลือก row ที่ 5 จาก flights:

    # Select a row
    flights[5]
    

    ผลลัพธ์:

        year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
       <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
    1:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13
    

    .

    แบบที่ #2 – เลือกหลาย rows

    ซึ่งเราทำได้โดยการใช้ vector เช่น เลือก rows 1 ถึง 10:

    # Select a range of rows
    flights[1:10]
    

    ผลลัพธ์:

         year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
        <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
     1:  2014     1     1        14        13      AA    JFK    LAX      359     2475     9
     2:  2014     1     1        -3        13      AA    JFK    LAX      363     2475    11
     3:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19
     4:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7
     5:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13
     6:  2014     1     1         4         0      AA    EWR    LAX      339     2454    18
     7:  2014     1     1        -2       -18      AA    JFK    LAX      338     2475    21
     8:  2014     1     1        -3       -14      AA    JFK    LAX      356     2475    15
     9:  2014     1     1        -1       -17      AA    JFK    MIA      161     1089    15
    10:  2014     1     1        -2       -14      AA    JFK    SEA      349     2422    18
    

    หรือเลือก rows 1, 3, 5, 7, และ 9:

    # Select multiple rows at interval
    flights[c(1, 3, 5, 7, 9)]
    

    ผลลัพธ์:

        year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
       <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
    1:  2014     1     1        14        13      AA    JFK    LAX      359     2475     9
    2:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19
    3:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13
    4:  2014     1     1        -2       -18      AA    JFK    LAX      338     2475    21
    5:  2014     1     1        -1       -17      AA    JFK    MIA      161     1089    15
    

    .

    แบบที่ #3 – คัด rows ที่ไม่ต้องการออก

    ซึ่งเราสามารถทำได้ 2 แบบ คือ:

    1. ใช้ -
    2. ใช้ !

    เช่น คัด row ที่ 1 ออก โดยใช้ -:

    # Deselect a row
    flights[-1]
    

    หรือใช้ !:

    # Deselect a row
    flights[!1]
    

    โดยทั้งสองแบบจะให้ผลลัพธ์แบบเดียวกัน แบบนี้:

             year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
            <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
         1:  2014     1     1        -3        13      AA    JFK    LAX      363     2475    11
         2:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19
         3:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7
         4:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13
         5:  2014     1     1         4         0      AA    EWR    LAX      339     2454    18
        ---                                                                                    
    253311:  2014    10    31         1       -30      UA    LGA    IAH      201     1416    14
    253312:  2014    10    31        -5       -14      UA    EWR    IAH      189     1400     8
    253313:  2014    10    31        -8        16      MQ    LGA    RDU       83      431    11
    253314:  2014    10    31        -4        15      MQ    LGA    DTW       75      502    11
    253315:  2014    10    31        -5         1      MQ    LGA    SDF      110      659     8
    

    .

    2️⃣ Filter

    นอกจากการเลือก rows เรายังสามารถใช้ i เพื่อกรอง data ได้ 3 แบบ:

    1. กรองโดยใช้ 1 เงื่อนไข
    2. กรองโดยใช้หลายเงื่อนไข
    3. กรองโดยใช้ helpers

    .

    แบบที่ #1 – กรองข้อมูลโดยใช้ 1 เงื่อนไข

    เช่น กรอง rows ที่มีระยะทางบิน 500 miles ขึ้นไป:

    # Filter with 1 condition
    flights[distance >= 500]
    

    ผลลัพธ์:

             year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
            <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
         1:  2014     1     1        14        13      AA    JFK    LAX      359     2475     9
         2:  2014     1     1        -3        13      AA    JFK    LAX      363     2475    11
         3:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19
         4:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7
         5:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13
        ---                                                                                    
    198323:  2014    10    31        18       -14      UA    EWR    LAS      291     2227    16
    198324:  2014    10    31         1       -30      UA    LGA    IAH      201     1416    14
    198325:  2014    10    31        -5       -14      UA    EWR    IAH      189     1400     8
    198326:  2014    10    31        -4        15      MQ    LGA    DTW       75      502    11
    198327:  2014    10    31        -5         1      MQ    LGA    SDF      110      659     8
    

    .

    แบบที่ #2 – กรองข้อมูลด้วยหลายเงื่อนไข

    เราสามารถเพิ่มเงื่อนไขการกรองได้ด้วย logical operators:

    OperatorMeaning
    &AND
    |OR
    !NOT

    เช่น กรอง rows ที่:

    • มีระยะทางบิน 500 miles ขึ้นไป และ
    • ออกจากสนามบิน LaGuardia (LGA):
    # Filter with multiple conditions
    flights[distance >= 500 & origin == "LGA"]
    

    ผลลัพธ์:

            year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
           <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
        1:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7
        2:  2014     1     1        -7        -6      AA    LGA    ORD      142      733     5
        3:  2014     1     1        -7         0      AA    LGA    ORD      143      733     6
        4:  2014     1     1        -8       -17      AA    LGA    ORD      139      733     6
        5:  2014     1     1        -2        15      AA    LGA    ORD      145      733     7
       ---                                                                                    
    63251:  2014    10    31        14       -17      UA    LGA    IAH      200     1416    17
    63252:  2014    10    31        24        -5      UA    LGA    IAH      198     1416     6
    63253:  2014    10    31         1       -30      UA    LGA    IAH      201     1416    14
    63254:  2014    10    31        -4        15      MQ    LGA    DTW       75      502    11
    63255:  2014    10    31        -5         1      MQ    LGA    SDF      110      659     8
    

    .

    แบบที่ #3 – กรองโดยใช้ helpers

    เราสามารถกรองข้อมูลโดยใช้ helpers หรือ operators พิเศษ 3 อย่างนี้:

    HelperForSyntax
    %between%กรองข้อมูลตาม rangecol %between% range
    %like%กรองข้อมูลตาม text patterncol %like% pattern
    %chin%กรองข้อมูลอยู่ใน set ที่กำหนดcol %chin% set

    ตัวอย่าง:

    ใช้ %between% เพื่อกรองข้อมูลที่มีระยะทางบินระหว่าง 500 ถึง 1,000 miles:

    # Filter using %between%
    flights[distance %between% c(500, 1000)]
    

    ผลลัพธ์:

            year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
           <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
        1:  2014     1     1        18        69      AA    JFK    ORD      155      740    17
        2:  2014     1     1        -7        -6      AA    LGA    ORD      142      733     5
        3:  2014     1     1        -7         0      AA    LGA    ORD      143      733     6
        4:  2014     1     1        -8       -17      AA    LGA    ORD      139      733     6
        5:  2014     1     1        -2        15      AA    LGA    ORD      145      733     7
       ---                                                                                    
    79754:  2014    10    31        10        -5      UA    EWR    ORD      110      719     6
    79755:  2014    10    31         5         2      UA    EWR    ORD      132      719    10
    79756:  2014    10    31       427       393      UA    EWR    ORD      100      719    21
    79757:  2014    10    31        -4        15      MQ    LGA    DTW       75      502    11
    79758:  2014    10    31        -5         1      MQ    LGA    SDF      110      659     8
    

    Note: code นี้ให้ผลลัพธ์เดียวกับการเขียน flights[distance >= 500 & distance <= 1000] แต่การใช้ %between% ทำให้ code สั้นและอ่านง่ายกว่า

    .

    ใช้ %like% เพื่อกรองข้อมูลที่สนามบินปลายทางขึ้นต้นด้วย “A” เช่น “ABQ”, “ACK”, “AGS”:

    # Filter using %like%
    flights[dest %like% "^A"]
    

    ผลลัพธ์:

            year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
           <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
        1:  2014     1     1        -1         1      AA    JFK    AUS      232     1521    17
        2:  2014     1     1        -5        16      B6    JFK    AUS      247     1521    20
        3:  2014     1     1        21        21      B6    JFK    AUS      237     1521     9
        4:  2014     1     1        10         4      B6    JFK    ABQ      280     1826    20
        5:  2014     1     1        10        10      DL    LGA    ATL      126      762    18
       ---                                                                                    
    15630:  2014    10    31        50        43      UA    EWR    ATL      113      746    15
    15631:  2014    10    31        -5       -38      UA    EWR    ATL      111      746     5
    15632:  2014    10    31        -5        -2      UA    EWR    AUS      211     1504    15
    15633:  2014    10    31        -9       -15      UA    EWR    ATL      119      746    11
    15634:  2014    10    31        11       -10      UA    EWR    ATL      109      746     8
    

    ใช้ %chin% เพื่อกรองข้อมูลที่สนามบินปลายทาง คือ ATL, LAX, หรือ ORD:

    # Filter using %chin%
    flights[dest %chin% c("ATL", "LAX", "ORD")]
    

    ผลลัพธ์:

            year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
           <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
        1:  2014     1     1        14        13      AA    JFK    LAX      359     2475     9
        2:  2014     1     1        -3        13      AA    JFK    LAX      363     2475    11
        3:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19
        4:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13
        5:  2014     1     1         4         0      AA    EWR    LAX      339     2454    18
       ---                                                                                    
    38827:  2014    10    31        10        -5      UA    EWR    ORD      110      719     6
    38828:  2014    10    31         3       -32      UA    EWR    LAX      320     2454    20
    38829:  2014    10    31         5         2      UA    EWR    ORD      132      719    10
    38830:  2014    10    31       427       393      UA    EWR    ORD      100      719    21
    38831:  2014    10    31        10       -27      UA    EWR    LAX      326     2454    10
    

    .

    3️⃣ Sort

    สุดท้าย เราสามารถใช้ i เพื่อเรียงลำดับข้อมูลได้ 3 แบบ:

    1. Sort ascending (A—Z)
    2. Sort descending (Z—A)
    3. Sort by multiple columns

    .

    แบบที่ #1 – Sort ascending

    เช่น จัดเรียงตามชื่อสนามบินต้นทาง จาก A—Z:

    # Sort ascending
    flights[order(origin)]
    

    ผลลัพธ์:

             year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
            <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
         1:  2014     1     1         4         0      AA    EWR    LAX      339     2454    18
         2:  2014     1     1        -5       -17      AA    EWR    MIA      161     1085    16
         3:  2014     1     1       191       185      AA    EWR    DFW      214     1372    16
         4:  2014     1     1        -1        -2      AA    EWR    DFW      214     1372    14
         5:  2014     1     1        -3       -10      AA    EWR    MIA      154     1085     6
        ---                                                                                    
    253312:  2014    10    31        24        -5      UA    LGA    IAH      198     1416     6
    253313:  2014    10    31         1       -30      UA    LGA    IAH      201     1416    14
    253314:  2014    10    31        -8        16      MQ    LGA    RDU       83      431    11
    253315:  2014    10    31        -4        15      MQ    LGA    DTW       75      502    11
    253316:  2014    10    31        -5         1      MQ    LGA    SDF      110      659     8
    

    .

    แบบที่ #2 – Sorting descending

    เราเรียงข้อมูลแบบ descending (Z—A) ได้ 2 วิธี:

    1. ใช้ decreasing = TRUE
    2. ใช้ -

    เช่น จัดเรียงตามชื่อสนามบินต้นทาง จาก Z-A โดยใช้ decreasing = TRUE:

    # Sort descending with decreasing = TRUE
    flights[order(origin, decreasing = TRUE)]
    

    หรือโดยใช้ -:

    # Sort descending with -
    flights[order(-origin)]
    

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

             year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
            <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
         1:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7
         2:  2014     1     1        -7        -6      AA    LGA    ORD      142      733     5
         3:  2014     1     1        -7         0      AA    LGA    ORD      143      733     6
         4:  2014     1     1        -8       -17      AA    LGA    ORD      139      733     6
         5:  2014     1     1        -2        15      AA    LGA    ORD      145      733     7
        ---                                                                                    
    253312:  2014    10    31        41        19      UA    EWR    SFO      344     2565    12
    253313:  2014    10    31       427       393      UA    EWR    ORD      100      719    21
    253314:  2014    10    31        10       -27      UA    EWR    LAX      326     2454    10
    253315:  2014    10    31        18       -14      UA    EWR    LAS      291     2227    16
    253316:  2014    10    31        -5       -14      UA    EWR    IAH      189     1400     8
    

    .

    แบบที่ #3 – Sort by multiple columns

    เช่น จัดเรียงตามชื่อสนามบินต้นทางและปลายทาง ตามลำดับ:

    # Sort by multiple columns
    flights[order(origin, dest)]
    

    ผลลัพธ์:

             year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
            <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
         1:  2014     1     2        -2       -25      EV    EWR    ALB       30      143     7
         2:  2014     1     3        88        79      EV    EWR    ALB       29      143    23
         3:  2014     1     4       220       211      EV    EWR    ALB       32      143    15
         4:  2014     1     4        35        19      EV    EWR    ALB       32      143     7
         5:  2014     1     5        47        42      EV    EWR    ALB       26      143     8
        ---                                                                                    
    253312:  2014    10    29         0         9      MQ    LGA    XNA      174     1147     6
    253313:  2014    10    29        -5       -16      MQ    LGA    XNA      162     1147    14
    253314:  2014    10    30        -4       -23      MQ    LGA    XNA      154     1147     6
    253315:  2014    10    30        -7       -11      MQ    LGA    XNA      157     1147    14
    253316:  2014    10    31        -5       -11      MQ    LGA    XNA      165     1147     6
    

    🧮 2nd Argument: j

    เราสามารถใช้ j เพื่อทำงานได้ 3 อย่าง ได้แก่:

    1. Select columns: เลือก columns ที่ต้องการ
    2. Compute: วิเคราะห์ข้อมูล
    3. Create columns: สร้าง columns ใหม่

    .

    1️⃣ Select Columns

    เราสามารถใช้ j เพื่อเลือก columns ได้ 3 แบบ:

    1. เลือก 1 column
    2. เลือกหลาย columns
    3. คัด columns ที่ไม่ต้องการออก

    .

    แบบที่ #1 – เลือก 1 column

    เช่น เลือก column สนามบินต้นทาง:

    # Select a column
    flights[, "origin"]
    

    ผลลัพธ์:

            origin
            <char>
         1:    JFK
         2:    JFK
         3:    JFK
         4:    LGA
         5:    JFK
        ---       
    253312:    LGA
    253313:    EWR
    253314:    LGA
    253315:    LGA
    253316:    LGA
    

    Note: เราสามารถใช้ตำแหน่ง (1, 2, 3, …) แทนชื่อ columns ("origin") ได้ แต่ไม่เป็นที่นิยม เพราะ columns อาจขยับตำแหน่งได้ และทำให้ผลลัพธ์เปลี่ยนไปได้

    .

    แบบที่ #2 – เลือกหลาย columns

    เราใช้ j เพื่อเลือกหลาย columns ได้ 3 วิธี:

    1. Vector
    2. List หรือ .()
    3. ..

    เช่น เลือก 3 columns คือ:

    • สนามบินต้นทาง
    • สนามบินปลายทาง
    • ระยะเวลาบิน

    โดยใช้ vector:

    # Select multiple columns with a vector
    flights[, c("origin", "dest", "air_time")]
    

    ผลลัพธ์:

            origin   dest air_time
            <char> <char>    <int>
         1:    JFK    LAX      359
         2:    JFK    LAX      363
         3:    JFK    LAX      351
         4:    LGA    PBI      157
         5:    JFK    LAX      350
        ---                       
    253312:    LGA    IAH      201
    253313:    EWR    IAH      189
    253314:    LGA    RDU       83
    253315:    LGA    DTW       75
    253316:    LGA    SDF      110
    

    โดยใช้ list:

    # Select multiple columns with a list
    flights[, list(origin, dest, air_time)]
    

    หรือใช้ .() ซึ่งเป็น shorthand สำหรับ list:

    # Select multiple columns using .()
    flights[, .(origin, dest, air_time)]
    

    ผลลัพธ์:

            origin   dest air_time
            <char> <char>    <int>
         1:    JFK    LAX      359
         2:    JFK    LAX      363
         3:    JFK    LAX      351
         4:    LGA    PBI      157
         5:    JFK    LAX      350
        ---                       
    253312:    LGA    IAH      201
    253313:    EWR    IAH      189
    253314:    LGA    RDU       83
    253315:    LGA    DTW       75
    253316:    LGA    SDF      110
    

    โดยใช้ .. ซึ่งเรามักใช้วิธีนี้เมื่อต้องการเลือก columns แบบ dynamic:

    # Select multiple columns using ..
    
    ## Create a vector of column names
    cols <- c("origin", "dest", "air_time")
    
    ## Select using ..
    flights[, ..cols]
    

    ผลลัพธ์:

            origin   dest air_time
            <char> <char>    <int>
         1:    JFK    LAX      359
         2:    JFK    LAX      363
         3:    JFK    LAX      351
         4:    LGA    PBI      157
         5:    JFK    LAX      350
        ---                       
    253312:    LGA    IAH      201
    253313:    EWR    IAH      189
    253314:    LGA    RDU       83
    253315:    LGA    DTW       75
    253316:    LGA    SDF      110
    

    Note: ความแตกต่างระหว่าง vector และ list หรือ .() และ .. คือ:

    • vector ให้ผลลัพธ์ที่เป็น vector
    • List หรือ .() และ .. ให้ผลลัพธ์เป็น data.table (data frame ของ data.table)

    .

    แบบที่ #3 – คัด columns ที่ไม่ต้องการออก

    เราสามารถคัด columns ที่ไม่ต้องการออกได้ 2 วิธี:

    1. ใช้ -
    2. ใช้ !

    เช่น เอาชื่อสายการบินออก โดยใช้ -:

    # Deselect a column using -
    flights[, -c("carrier")]
    

    หรือใช้ !:

    # Deselect a column using !
    flights[, !c("carrier")]
    

    ผลลัพธ์:

             year month   day dep_delay arr_delay origin   dest air_time distance  hour
            <int> <int> <int>     <int>     <int> <char> <char>    <int>    <int> <int>
         1:  2014     1     1        14        13    JFK    LAX      359     2475     9
         2:  2014     1     1        -3        13    JFK    LAX      363     2475    11
         3:  2014     1     1         2         9    JFK    LAX      351     2475    19
         4:  2014     1     1        -8       -26    LGA    PBI      157     1035     7
         5:  2014     1     1         2         1    JFK    LAX      350     2475    13
        ---                                                                            
    253312:  2014    10    31         1       -30    LGA    IAH      201     1416    14
    253313:  2014    10    31        -5       -14    EWR    IAH      189     1400     8
    253314:  2014    10    31        -8        16    LGA    RDU       83      431    11
    253315:  2014    10    31        -4        15    LGA    DTW       75      502    11
    253316:  2014    10    31        -5         1    LGA    SDF      110      659     8
    

    .

    2️⃣ Compute

    นอกจากการเลือก columns เรายังสามารถใช้ j เพื่อวิเคราะห์หรือข้อมูล (summarise, aggregate) ได้

    เช่น หาค่าเฉลี่ยของระยะเวลาบิน:

    # Calculate mean
    flights[, mean(air_time)]
    

    ผลลัพธ์:

    [1] 156.7228
    

    หรือ หาค่าเฉลี่ย และ standard deviation (SD) ของระยะเวลาบิน:

    # Calculate mean and SD
    flights[, .(avg_air_time = mean(air_time),
                sd_air_time = sd(air_time))]
    

    ผลลัพธ์:

       avg_air_time sd_air_time      n
              <num>       <num>  <int>
    1:     156.7228    96.12978 253316
    

    Note: เราสามารถวิเคราะห์ข้อมูลโดยไม่ตั้งชื่อให้กับผลลัพธ์ได้ (avg_air_time, sd_air_time, n) แต่การตั้งชื่อจะช่วยให้เราอ่าน output ได้ง่ายขึ้น

    .

    3️⃣ Create Columns

    สุดท้าย เราสามารถใช้ j สร้าง columns ใหม่ได้ร่วมกับ:

    1. := สำหรับสร้าง 1 column
    2. `:=` สำหรับสร้างหลาย columns

    เช่น สร้าง column ความเร็วในการบิน (ระยะทาง / เวลา) ด้วย :=:

    # Creating 1 new column
    flights[, speed := distance / (air_time / 60)]
    

    ผลลัพธ์:

        year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour    speed
       <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>    <num>
    1:  2014     1     1        14        13      AA    JFK    LAX      359     2475     9 413.6490
    2:  2014     1     1        -3        13      AA    JFK    LAX      363     2475    11 409.0909
    3:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19 423.0769
    4:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7 395.5414
    5:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13 424.2857
    6:  2014     1     1         4         0      AA    EWR    LAX      339     2454    18 434.3363
    

    Note:

    • เราหาร air_time ด้วย 60 เพื่อแปลงหน่วยจากนาทีเป็นชั่วโมง และทำให้ผลลัพธ์ที่ได้เป็นหน่วย miles/hour
    • สังเกตว่า column ใหม่จะอยู่ท้ายสุดของ data.table

    หรือ สร้าง 2 columns พร้อมกัน เช่น:

    • ความเร็วในการบิน (ระยะทาง / เวลา)
    • ระยะเวลาที่ delay โดยรวม (delay ขาออก + delay ขาเข้า)

    ด้วย `:=`:

    # Creating multiple new column
    flights[, `:=`(speed = distance / (air_time / 60),
                   total_delay = dep_delay + arr_delay)]
    

    ผลลัพธ์:

        year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour    speed total_delay
       <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>    <num>       <int>
    1:  2014     1     1        14        13      AA    JFK    LAX      359     2475     9 413.6490          27
    2:  2014     1     1        -3        13      AA    JFK    LAX      363     2475    11 409.0909          10
    3:  2014     1     1         2         9      AA    JFK    LAX      351     2475    19 423.0769          11
    4:  2014     1     1        -8       -26      AA    LGA    PBI      157     1035     7 395.5414         -34
    5:  2014     1     1         2         1      AA    JFK    LAX      350     2475    13 424.2857           3
    6:  2014     1     1         4         0      AA    EWR    LAX      339     2454    18 434.3363           4
    

    🤝 3rd Argument: by

    เราใช้ by เพื่อจับกลุ่มข้อมูล ซึ่งมีประโยชน์มากเวลาที่เราต้องการวิเคราะห์ข้อมูลเป็น ๆ กลุ่ม

    เราสามารถใช้ by ได้ 2 แบบ:

    1. จับกลุ่มด้วย 1 column
    2. จับกลุ่มด้วยหลาย columns

    .

    แบบที่ #1 – จับกลุ่มด้วย 1 column

    เช่น หาค่าเฉลี่ยของ delay ขาออก ตามชื่อสนามบินต้นทาง:

    # Group by 1 column
    flights[, mean(dep_delay), by = origin]
    

    ผลลัพธ์:

       origin       V1
       <char>    <num>
    1:    JFK 11.44617
    2:    LGA 10.60500
    3:    EWR 15.21248
    

    .

    แบบที่ #2 – จับกลุ่มด้วยหลาย columns

    เราจับกลุ่มด้วยหลาย columns ได้ด้วย 2 วิธี คือ:

    1. Vector
    2. List หรือ .()

    เช่น หาค่าเฉลี่ยของ delay ขาออก โดยจับกลุ่มตามชื่อสนามบินต้นทางและปลายทาง ตามลำดับ

    วิธีที่ 1. ใช้ vector:

    # Group by with a vector
    flights[, mean(dep_delay), by = c("origin", "dest")]
    

    ผลลัพธ์:

         origin   dest        V1
         <char> <char>     <num>
      1:    JFK    LAX  8.359718
      2:    LGA    PBI 10.168617
      3:    EWR    LAX 15.882631
      4:    JFK    MIA 10.008364
      5:    JFK    SEA 10.858953
     ---                        
    217:    LGA    AVL -6.500000
    218:    LGA    GSP  6.000000
    219:    LGA    SBN  5.000000
    220:    EWR    SBN -1.500000
    221:    LGA    DAL -6.266667
    

    วิธีที่ 2. ใช้ list:

    # Group by with a list
    flights[, mean(dep_delay), by = list(origin, dest)]
    

    หรือใช้ .():

    # Group by with .()
    flights[, mean(dep_delay), by = .(origin, dest)]
    

    ผลลัพธ์:

         origin   dest        V1
         <char> <char>     <num>
      1:    JFK    LAX  8.359718
      2:    LGA    PBI 10.168617
      3:    EWR    LAX 15.882631
      4:    JFK    MIA 10.008364
      5:    JFK    SEA 10.858953
     ---                        
    217:    LGA    AVL -6.500000
    218:    LGA    GSP  6.000000
    219:    LGA    SBN  5.000000
    220:    EWR    SBN -1.500000
    221:    LGA    DAL -6.266667
    

    Note: เช่นเดียวกับการเลือก columns …

    • ถ้าเราใช้ vector เราจะได้ผลลัพธ์เป็น vector
    • ถ้าใช้ list หรือ .() เราจะได้ data.table

    🔗 Combining & Chaining

    เราสามารถปลอดล็อกพลังที่แท้จริงของ data.table ได้ด้วย 2 วิธี:

    1. Combining: ใช้ i, j, by ร่วมกัน เพื่อตอบโจทย์ที่ซับซ้อน
    2. Chaining: เชื่อมต่อ data.table เข้าด้วยกัน

    .

    1️⃣ Combining

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

    • หาค่าเฉลี่ยของความเร็ว
    • เฉพาะเที่ยวบินที่มีระยะทางตั้งแต่ 500 miles ขึ้นไป
    • โดยจับกลุ่มตามชื่อสนามบินต้นทาง:
    # Combining
    flights[distance >= 500, 
            .(avg_speed = mean(distance / (air_time / 60))), 
            by = origin]
    

    อธิบาย code:

    • distance >= 500 เลือกเฉพาะข้อมูลที่มีระยะทางตั้งแต่ 500 miles ขึ้นไป
    • .(avg_speed = mean(distance / (air_time / 60))) หาค่าเฉลี่ยของความเร็ว
    • by = origin] จับกลุ่มข้อมูลด้วยสนามบินต้นทาง

    ผลลัพธ์:

       origin avg_speed
       <char>     <num>
    1:    JFK  436.6284
    2:    LGA  407.5462
    3:    EWR  417.1765
    

    .

    2️⃣ Chaining

    Chaining คือ การนำ code มาต่อกัน เพื่อส่ง output ต่อกันเป็นทอด ๆ:

    DT[...][...][...]

    เช่น ค้นหาสนามบินปลายทาง 5 อันดับแรกที่มีค่าเฉลี่ย delay ขาเข้ามากที่สุด ในเดือนสิงหาคม:

    # Chaining
    flights[month == 8,
            .(avg_arr_delay = mean(arr_delay)),
            by = dest][order(-avg_arr_delay)][1:5]
    

    อธิบาย code:

    • month == 8 เลือกข้อมูลจากเดือนสิงหาคม
    • .(avg_arr_delay = mean(arr_delay)) คำนวณค่าเฉลี่ย delay ขาเข้า
    • by = dest จับกลุ่มตามสนามบินปลายทาง
    • [order(-avg_arr_delay)] จัดลำดับตามค่าเฉลี่ย delay ขาเข้า แบบ descending
    • [1:5] เลือกเฉพาะ 5 rows แรกมาแสดง

    ผลลัพธ์:

         dest avg_arr_delay
       <char>         <num>
    1:    LIT      37.06452
    2:    DSM      22.85714
    3:    CAK      19.60976
    4:    TYS      19.44681
    5:    TVC      19.00000
    

    🍩 Special Symbols

    เพื่อช่วยให้เราทำงานได้ง่ายขึ้น data.table มี special symbols 3 ตัวที่เราสามารถเรียกใช้ในการทำงานได้:

    1. .N
    2. .SD
    3. .SDcols

    .

    1️⃣ .N

    .N เป็น special symbol ที่เก็บจำนวน rows ของ data.table เอาไว้ (เช่น 500)

    เรามักใช้งาน .N ใน 2 กรณีหลัก ๆ ได้แก่:

    1. เลือก rows
    2. นับจำนวนข้อมูล

    .

    กรณีที่ 1. เลือก rows

    เช่น เลือก row ที่ 500 จนถึง row สุดท้าย:

    # Select rows with .N
    flights[500:.N]
    

    ผลลัพธ์:

             year month   day dep_delay arr_delay carrier origin   dest air_time distance  hour
            <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
         1:  2014     1     1        81        86      WN    EWR    HOU      222     1411    17
         2:  2014     1     1        -3        -4      WN    EWR    MDW      128      711     7
         3:  2014     1     1         0        22      WN    EWR    MDW      144      711    12
         4:  2014     1     1        88       190      WN    EWR    MDW      130      711    21
         5:  2014     1     1        45        63      WN    EWR    MDW      141      711    16
        ---                                                                                    
    252813:  2014    10    31         1       -30      UA    LGA    IAH      201     1416    14
    252814:  2014    10    31        -5       -14      UA    EWR    IAH      189     1400     8
    252815:  2014    10    31        -8        16      MQ    LGA    RDU       83      431    11
    252816:  2014    10    31        -4        15      MQ    LGA    DTW       75      502    11
    252817:  2014    10    31        -5         1      MQ    LGA    SDF      110      659     8
    

    .

    กรณีที่ 2. นับจำนวนข้อมูล

    เช่น นับจำนวนข้อมูลการบินตามสนามบินต้นทางแต่ละแห่ง:

    # Compute with .N
    flights[, .N, by = origin]
    

    ผลลัพธ์:

       origin     N
       <char> <int>
    1:    JFK 81483
    2:    LGA 84433
    3:    EWR 87400
    

    .

    2️⃣ .SD

    .SD ย่อมาจาก “Subset of Data” ซึ่งหมายถึง ชุดข้อมูลย่อยที่เกิดจากการจับกลุ่มด้วย by

    เรามักใช้ .SD ในการคำนวณคู่กับ lapply() function เพื่อวิเคราะห์ข้อมูลตามกลุ่ม

    เช่น หาค่าสูงสุดของแต่ละ columns ในแต่ละเดือน:

    # Compute with .SD
    flights[,
            lapply(.SD, max, na.rm = TRUE),
            by = month]
    

    ผลลัพธ์:

        month  year   day dep_delay arr_delay carrier origin   dest air_time distance  hour
        <int> <int> <int>     <int>     <int>  <char> <char> <char>    <int>    <int> <int>
     1:     1  2014    31       973       996      WN    LGA    XNA      688     4983    24
     2:     2  2014    28      1014      1007      WN    LGA    XNA      685     4983    24
     3:     3  2014    31       920       925      WN    LGA    XNA      706     4983    24
     4:     4  2014    30      1241      1223      WN    LGA    XNA      664     4983    24
     5:     5  2014    31       889       879      WN    LGA    XNA      650     4983    24
     6:     6  2014    30      1071      1073      WN    LGA    XNA      640     4983    24
     7:     7  2014    31      1087      1090      WN    LGA    XNA      638     4983    24
     8:     8  2014    31       978       964      WN    LGA    XNA      635     4983    24
     9:     9  2014    30      1056      1115      WN    LGA    XNA      635     4983    23
    10:    10  2014    31      1498      1494      WN    LGA    XNA      662     4983    24
    

    .

    3️⃣ .SDcols

    .SDcols เป็น special symbol ที่เก็บชื่อ columns ของ .SD เอาไว้

    เรามักใช้ .SDcols คู่กับ .SD และ lapply() เพื่อวิเคราะห์เฉพาะ columns ที่ต้องการ

    เช่น หาเวลา delay สูงสุดของขาเข้าและขาออกในแต่ละเดือน:

    # Compute with .SDcols
    flights[,
            lapply(.SD, max, na.rm = TRUE),
            by = month,
            .SDcols = c("arr_delay", "dep_delay")]
    

    ผลลัพธ์:

        month arr_delay dep_delay
        <int>     <int>     <int>
     1:     1       996       973
     2:     2      1007      1014
     3:     3       925       920
     4:     4      1223      1241
     5:     5       879       889
     6:     6      1073      1071
     7:     7      1090      1087
     8:     8       964       978
     9:     9      1115      1056
    10:    10      1494      1498
    

    😎 Conclusion

    ในบทความนี้ เราได้ไปดูวิธีใช้ data.table เพื่อทำทำงานกับข้อมูลขนาดใหญ่กัน

    เราได้เห็นว่า data.table มีหลักการเขียนดังนี้:

    DT[i, j, by]

    และแต่ละ argument มีการใช้งานดังนี้:

    .

    Argument i:

    Use CaseExample
    Select rowsflights[1:5]
    Filterflights[distance >= 500]
    Sortflights[order(origin)]

    .

    Argument j:

    Use CaseExample
    Select columnsflights[, .(origin, dest)]
    Computeflights[, mean(air_time)]
    Create columnsflights[, speed := distance / (air_time / 60)]

    .

    Argument by:

    Use CaseExample
    Group dataflights[by = origin]

    .

    Special symbols:

    SymbolMeaning
    .Nจำนวน rows
    .SDSubset of Data
    .SDcolscolumns ใน Subset of Data

    .

    เราสามารถใช้ทุก arguments ร่วมกัน (combining) หรือเชื่อมต่อ data.table (chaining) เพื่อตอบโจทย์ที่ซับซ้อนได้


    🎒 Learn More About data.table

    .

    😺 GitHub

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

    .

    📚 อ่านเพิ่มเติมเกี่ยวกับ data.table

    .

    📑 Cheat Sheets ในการใช้งาน data.table


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

  • R Control Flow: วิธีเขียน if, for, while ในภาษา R เพื่อการทำงานที่ง่ายขึ้น พร้อมตัวอย่าง

    R Control Flow: วิธีเขียน if, for, while ในภาษา R เพื่อการทำงานที่ง่ายขึ้น พร้อมตัวอย่าง

    ในการเขียน code เรามักจะเจอกับงานที่เราต้องทำซ้ำ ๆ เช่น เปลี่ยนตัวเลขในช่วงที่กำหนด (เช่น 80 ถึง 100) ให้เป็นเกรด (เช่น A)

    แทนที่เราจะเขียน code ใหม่ทุกครั้งที่เราเจอตัวเลข (เช่น 89, 82, 91) เราสามารถใช้ control flow เข้ามาช่วย automate งาน ลดเวลาและภาระงานของเราลงไปได้

    .

    ในบทความนี้ เราจะมาดูวิธีเขียน control flow ในภาษา R กัน:

    • If-else:
      • if
      • else
      • else if
    • Loops:
      • for
      • while
    • Loop control:
      • next
      • break

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


    1. 🕹️ If-Else
      1. 1️⃣ if
      2. 2️⃣ else
      3. 3️⃣ else if
    2. 🔁 Loops
      1. 1️⃣ for
      2. 2️⃣ while
    3. 🚸 Loop Control
      1. 1️⃣ next
      2. 2️⃣ break
    4. 💪 Summary
    5. 🗒️ Practice Control Flow
    6. 😺 GitHub
    7. 📃 References
    8. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    🕹️ If-Else

    ในการเขียน if-else เรามี 3 syntax ที่ต้องทำความเข้าใจ:

    1. if
    2. else
    3. else if

    .

    1️⃣ if

    เราใช้ if เพื่อกำหนดเงื่อนไขในการทำงาน

    เช่น ถ้าคะแนนมากกว่า 60 ให้ผ่าน:

    if (score >= 60) {
    	print("Pass")
    }
    

    ถ้าไม่ตรงกับเงื่อนไข R จะรัน code บรรทัดถัดไป

    .

    2️⃣ else

    เราใช้ else เพื่อกำหนด action ที่ต้องทำเมื่อข้อมูลไม่เข้าเงื่อนไข

    เช่น ถ้าน้อยกว่า 60 ให้ไม่ผ่าน:

    if (score >= 60) {
    	print("Pass")
    } else {
    	print("Fail")
    }
    

    ในครั้งนี้ R จะแสดงคำว่า “Pass” หรือ “Fail” ก่อนจะรัน code บรรทัดถัดไป

    .

    3️⃣ else if

    ถ้าเรามีมากกว่า 2 เงื่อนไข ให้ใช้ else if เพื่อกำหนดเงื่อนไขเพิ่มเติม

    เช่น ตัดเกรดตามช่วงคะแนน:

    if (score >= 90) {
    	print("A")
    } else if (score >= 80) {
    	print("B")
    } else if (score >= 70) {
    	print("C")
    } else if (score >= 60) {
    	print("D")
    } else {
    	print("F")
    }
    

    ใน code นี้ R จะรันแต่ละบรรทัด และถ้าข้อมูลที่มีตรงกับเงื่อนไข ก็จะทำตาม action ในบรรทัดนั้น

    เช่น เรากำหนดให้:

    score <- 71
    

    R จะรัน else if จนถึงบรรทัดที่ 5 แล้วทำ action ที่อยู่ในบรรทัด 6:

    if, else if, else

    🔁 Loops

    Loops ใช้ในการทำ task ซ้ำเรื่อย ๆ ตามเงื่อนไขที่กำหนด

    เราสามารถเขียน loop ได้ 2 แบบ คือ:

    1. for
    2. while

    .

    1️⃣ for

    for ใช้สำหรับทำงานซ้ำ ๆ ที่เรารู้ว่าจะต้องทำกี่ครั้ง

    เช่น เรามีรายชื่อเพื่อนที่เราอยากจะทักทาย:

    friends <- c("John",
                 "Sarah", 
                 "Emma",
                 "Mike")
    

    เราสามารถใช้ for loop ช่วยได้แบบนี้:

    for (friend in friends) {
      print(paste("Hello,", friend))
    }
    

    ผลลัพธ์:

    for loop

    .

    2️⃣ while

    เราใช้ while เมื่อต้องทำงานซ้ำ ๆ ที่เราไม่รู้ว่าจะต้องทำกี่ครั้ง

    โดย while จะทำงานไปเรื่อย ๆ จนกว่าเงื่อนไขที่กำหนดจะไม่เป็นจริง

    เช่น ทอยเต๋าเรื่อย ๆ จนกว่าจะได้เลข 6:

    set.seed(42)
    
    roll <- sample(1:6, 1)
    
    while (roll != 6) {
      print(paste("Rolled:", roll, "Not yet..."))
      roll <- sample(1:6, 1)
    }
    
    print("You rolled a 6! Congratulations!")
    

    อธิบาย code:

    CodeExplain
    set.seed(42)ทำให้ code ให้ผลลัพธ์เหมือนกันทุกครั้ง
    sample(1:6, 1)สุ่ม 1 เลข ระหว่าง 1 ถึง 6
    while (roll != 6) {...}จนกว่า roll จะเท่ากับ 6 ให้ทำ action ใน {...}
    print("You rolled a 6! Congratulations!")ถ้าหลุดจาก while loop แล้ว ให้ print “You rolled a 6! Congratulations!”

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

    while loop

    จะเห็นว่า while loop หยุดเมื่อ roll != 6 ไม่เป็นจริง (เมื่อ roll = 6)


    🚸 Loop Control

    ในการเขียน for และ while loops เรามี 2 statements ที่ช่วยกำกับ loops ได้ คือ:

    1. next
    2. break

    .

    1️⃣ next

    next ใช้เพื่อข้ามข้อมูลที่เราไม่ต้องการให้เกิด action

    เช่น เรามี list ของสี:

    colours <- c("🟢", "🔴", "🔵", "🔴", "🟠", "🟢")
    

    ซึ่งเราต้องการ print เฉพาะสีโทนเย็น (skip สีโทนร้อน เช่น 🔴, 🟠) เราสามารถใช้ next คู่กับ if และ for ได้แบบนี้:

    for (colour in colours) {
      if (colour == "🔴" | colour == "🟠") next
      print(colour)  
    }
    

    ผลลัพธ์:

    next

    จะเห็นได้ว่า code ของเราข้ามข้อมูลที่เป็นสีโทนร้อน และ print เฉพาะสีโทนเย็นออกมา

    .

    2️⃣ break

    break ทำหน้าที่คล้าย next

    แต่แทนที่จะข้ามข้อมูลไป break จะหยุดการทำงานของ loop และปล่อยให้ R รัน code บรรทัดหลังจาก loop ได้

    เช่น เรามี while loop ที่นับเลขตั้งแต่ 10 ถึง 0:

    time <- 10  # Start countdown
    
    while (time > 0) {
      print(paste("Counting down:", time))
      time <- time - 1
    }
    

    ถ้าเราไม่ใส่ break, while loop ของเราจะนับเลขถึง 0:

    while without break

    .

    แต่ถ้าเราใส่ break เข้าไป while loop จะหยุดนับ ณ ตัวเลขที่เรากำหนด:

    time <- 10  # Start countdown
    
    while (time > 0) {
      if (time == 4) {
        print("Countdown stopped.")
        break  # Stop the loop when time reaches 4
      }
      print(paste("Counting down:", time))
      time <- time - 1
    }
    

    ผลลัพธ์:

    while with break

    จะเห็นได้ว่า break ทำให้ while loop หยุดทำงาน เมื่อนับถึง 4


    💪 Summary

    ในบทความนี้ เราเรียนรู้วิธีเขียน control flow ใน R กัน:

    If-else:

    StatementDescription
    ifกำหนด 1 เงื่อนไข
    elseทำ action เมื่ออยู่นอกเงื่อนไข
    else ifเพิ่มเงื่อนไข

    Loops:

    StatementDescription
    forrepeat task เมื่อรู้ว่า action ที่ต้องทำจะเกิดขึ้นกี่ครั้ง
    whilerepeat task เมื่อไม่รู้ว่า action ที่ต้องทำจะเกิดขึ้นกี่ครั้ง

    Loop control:

    StatementDescription
    nextSkip ข้อมูลใน loop
    breakหยุด loop

    🗒️ Practice Control Flow

    แม้ว่าตัวอย่างในบทความนี้จะเป็นตัวอย่างง่าย ๆ แต่ control flow เป็นการเขียน code ที่มีประโยชน์มาก และสามารถใช้แก้ปัญหาทั้งเล็กและใหญ่ในโลกจริงได้ เช่น:

    • ส่ง update ข้อมูล PM2.5 รายวัน
    • เช็ก username และ password เพื่อยืนยันการเข้าสู่ระบบ
    • ทำระบบสั่งอาหารและจ่ายเงินออนไลน์
    • สร้างเกมเป่ายิ้งฉุบ
    • สร้างระบบกดเงิน ATM

    และอีกมากมาย

    .

    สำหรับคนที่สนใจสามารถลองเขียน control flow เพื่อแก้ปัญหาเหล่านี้ได้

    .

    ติดตั้ง R และ RStudio เพื่อใช้งาน R:


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

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

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

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

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

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


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

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

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

    • Ross Ihaka
    • Robert Gentleman

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

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

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

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

    .

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

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

    .

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

    TIOBE index

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

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

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

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

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

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

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

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

    .

    Note:

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

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

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

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

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

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

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

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

    นั่นคือ:

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

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


    🧘 Objects: Existing in R

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

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

    .

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

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

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

    x <- 10
    

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

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

    .

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

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

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

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

    .

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

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

    .

    ตัวอย่าง 👇

    Numeric:

    age <- 10
    

    Character:

    name <- "Ben Tennyson"
    

    Logical:

    is_hero <- TRUE
    

    Date:

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

    Factor:

    gender <- as.factor("Male")
    

    .

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

    class(age)
    

    ผลลัพธ์:

    class()

    .

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

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

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

    .

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

    .

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

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

    .

    ตัวอย่าง 👇

    Vector:

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

    ผลลัพธ์:

    Vector

    Matrix:

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

    ผลลัพธ์:

    Matrix

    Array:

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

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

    ผลลัพธ์:

    Array

    .

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

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

    .

    ตัวอย่าง 👇

    List:

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

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

    ผลลัพธ์:

    List

    Data frame:

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

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

    ผลลัพธ์:

    Data frame

    .

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


    👟 Functions: Happening in R

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

    1. Operators
    2. Functions

    .

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

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

    .

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

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

    .

    ตัวอย่าง 👇

    Assignment

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

    my_name <- "John"
    

    Arithmetic

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

    3 + 4
    

    Logical

    เช่น not TRUE:

    !TRUE
    

    Relational

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

    15 > 11
    

    .

    🔨 (2) Functions: Action ใน R

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

    .

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

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

    .

    Note:

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

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

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

    greeting("John")
    

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

    User-defined function

    💪 Summary

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

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

    ⏭️ Learn More About R

    .

    🧑‍💻 GitHub

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

    .

    🔨 Free Tool

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

    ดาวน์โหลด R

    RStudio desktop

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

    .

    📗 Free e-Books

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

    .

    🏫 Free Courses

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


    📄 References


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

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

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

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

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

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

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

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

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

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

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

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

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

    .

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

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

    .

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

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

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

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


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

    💽 Example Database: Chinook

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

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

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

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


    1️⃣ Statement #1: SELECT

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

    SELECT Name, AlbumId
    FROM Track;
    

    ผลลัพธ์:

    Note:

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

    SELECT *
    FROM Tracks;
    

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

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

    SELECT Name AS Song, AlbumId AS Album
    FROM Track;
    

    ผลลัพธ์:

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


    2️⃣ Statement #2: WHERE

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

    SELECT Name, UnitPrice
    FROM Track
    WHERE UnitPrice > 0.99;
    

    ผลลัพธ์:

    .

    WHERE operators:

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

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

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

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

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

    เช่น:

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

    ผลลัพธ์:

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

    เช่น:

    • John
    • Gohn
    • Wohn

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

    หรือ:

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

    ผลลัพธ์:

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

    เช่น:

    • John
    • Jo
    • Jane
    • James

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


    3️⃣ Statement #3: ORDER BY

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

    SELECT FirstName, LastName
    FROM Customer
    ORDER BY FirstName;
    

    ผลลัพธ์:

    Note:

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

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

    SELECT FirstName, LastName
    FROM Customer
    ORDER BY FirstName DESC;
    

    ผลลัพธ์:


    4️⃣ Statement #4: GROUP BY

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

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

    ผลลัพธ์:

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


    5️⃣ Statement #5: Aggregate Functions

    Usage:

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

    .

    Syntax:

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

    .

    Common aggregate functions:

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

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

    .

    Example:

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

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

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

    ผลลัพธ์:

    Note:

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

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

    ผลลัพธ์:

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


    6️⃣ Statement #6: JOIN

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

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

    ผลลัพธ์:


    7️⃣ Statement #7: LIMIT

    Usage:

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

    .

    Syntax:

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

    .

    Example:

    SELECT FirstName, LastName
    FROM Customer
    LIMIT 10;
    

    ผลลัพธ์:


    💪Put It All Together

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

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

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

    ผลลัพธ์:


    🍩 Bonus: SQL Best Practice

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

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

    Note:

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

    ⏭️Next: Sharpen Your SQL

    .

    😺 GitHub

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

    .

    🔨 Free Tool

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

    .

    🎒 Free Course

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

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

    .

    📖 Free Tutorial

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

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

    📃 References

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

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

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

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

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

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

    .

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

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

    .

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


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

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

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

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

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

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

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

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

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


    🏷️ Named Ranges

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

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

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

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

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

    เช่น:

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

    วิธีใช้งาน:

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

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

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

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


    🤔 Syntax Help

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

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

    เช่น:

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


    🧑‍💼 Group #1 – Filtering & Sorting

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

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

    1. FILTER()
    2. SORT()

    .

    (1) FILTER()

    Usage:

    กรองข้อมูล

    Syntax:

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

    Example:

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

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

    ผลลัพธ์:

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

    FILTER()

    .

    (2) SORT()

    Usage:

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

    Syntax:

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

    Example:

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

    =SORT(transactions, 4, FALSE)

    ผลลัพธ์:

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

    SORT()

    Note:

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

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

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

    ผลลัพธ์:

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

    FILTER() + SORT()

    🧑‍💼 Group #2 – Aggregating

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

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

    ตัวอย่าง:

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

    Aggregate functions in Google Sheets

    Note:

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

    🧑‍💼 Group #3 – Searching

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

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

    .

    (1) VLOOKUP()

    Usage:

    VLOOKUP ย่อมาจาก:

    Vertical Lookup

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

    Syntax:

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

    Example:

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

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

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

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

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

    และ:

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

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

    ผลลัพธ์:

    VLOOKUP()

    Note:

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

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

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

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

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

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

    ผลลัพธ์:

    VLOOKUP()

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

    .

    (2) INDEX()

    Usage:

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

    Syntax:

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

    Example:

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

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

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

    =INDEX(transactions, 10, 6)

    ผลลัพธ์:

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

    .

    (3) MATCH()

    Usage:

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

    Syntax:

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

    Example:

    MATCH()

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

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

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

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

    ผลลัพธ์:

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

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

    Note:

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

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

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

    ผลลัพธ์:

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

    .

    (4) QUERY()

    Usage:

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

    Syntax:

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

    Example #1:

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

    =QUERY(transactions, "SELECT *")

    ผลลัพธ์:

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

    .

    Example #2:

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

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

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

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

    ผลลัพธ์:

    QUERY()

    .

    Example #3:

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

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

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

    ผลลัพธ์:

    QUERY()

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


    🧑‍💼 Group #4 – Conditions

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

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

    .

    (1) IF()

    Usage:

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

    Syntax:

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

    Example #1:

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

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

    ผลลัพธ์:

    IF()

    .

    Example #2:

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

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

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

    ผลลัพธ์:

    Nested IF()s

    .

    (2) IFS

    Usage:

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

    Example:

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

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

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

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

    ผลลัพธ์:

    IFS()

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

    .

    (3) IFERROR()

    Usage:

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

    Syntax:

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

    Example:

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

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

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

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

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

    ผลลัพธ์:

    With IFERROR()

    🧑‍💼 Group #5 – Working With Date

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

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

    .

    (1) TODAY()

    Usage:

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

    Example:

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

    =TODAY()

    ผลลัพธ์:

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

    .

    (2) DATEDIF()

    Usage:

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

    Example:

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

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

    ผลลัพธ์:

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

    .

    (3) NETWORKDAYS()

    Usage:

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

    Example:

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

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

    ผลลัพธ์:

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


    🧑‍💼 Group #6 – Working With Text

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

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

    .

    (1) Splitting Text

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

    Syntax:

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

    Example:

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

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

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

    ผลลัพธ์:

    SPLIT()

    .

    (2) Joining Text

    สูตร:

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

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

    Example:

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

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

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

    ผลลัพธ์:

    & + TEXTJOIN()

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

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

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

    .

    (3) Extracting Text

    สูตร:

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

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

    Syntax:

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

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

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

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

    Example:

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

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

    ผลลัพธ์:

    LEFT() vs MID() vs RIGHT()

    .

    (3) Regular Expression

    สูตร:

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

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

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

    Syntax:

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

    Example:

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

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

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

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

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

    ผลลัพธ์:

    REGEXMATCH() vs REGEXEXTRACT()

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

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


    🧑‍💼 Group #7 – Google

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

    1. GOOGLEFINANCE()
    2. GOOGLETRANSLATE()

    .

    (1) GOOGLEFINANCE()

    Usage:

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

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

    Syntax:

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

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

    .

    (2) GOOGLETRANSLATE()

    Usage:

    แปลภาษา

    Syntax:

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

    Example:

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

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

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

    ผลลัพธ์:

    GOOGLEFINANCE() vs GOOGLETRANSLATE()

    💪 Recap

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

    ⚓ Intro to Seaborn

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

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

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

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

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


    🍔 Dataset ตัวอย่าง

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

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

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

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

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

    .

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

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

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

    .

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

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

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

    Dataset: tips

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


    💻 Syntax ของ Seaborn

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

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

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

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

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

    .

    📊 1. Histograms

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

    ตัวอย่าง:

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

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

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

    ผลลัพธ์:

    Histogram

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

    .

    📊 2. Box Plots

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

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Box plot

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

    .

    📊 3. Scatter Plots

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Scatter plot

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

    .

    📊 4. Line Plots

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Line plot

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

    .

    📊 5. Bar Plots

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Bar plot

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


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

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

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

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

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

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

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

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

    ผลลัพธ์:

    Third variable added as hue

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

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


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

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

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

    .

    🎨 1. สี

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

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

    .

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

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

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

    ผลลัพธ์:

    Customise colour with palette

    .

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

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

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

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

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

    เช่น:

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

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

    ผลลัพธ์:

    Customise colour with sns.set_palette()

    .

    🎨 2. Style

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

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

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

    Note:

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

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

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

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

    ผลลัพธ์:

    Customise style with sns.set_style()

    .

    🎨 3. ข้อความ

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

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

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

    ผลลัพธ์:

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

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


    💪 สรุป Seaborn 101

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

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

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

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

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

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

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

    ⏭️ Next

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

    .

    🧑‍💻 Example Code on GitHub

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

    .

    📚 Further Reading

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

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

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

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

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

    cp image.jpg copy_of_image.jpg

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

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

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

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

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

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

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

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


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

    🧭 Group #1. Orienting

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

    1. pwd
    2. ls
    3. cd

    .

    📍 Command #1. pwd

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

    pwd

    ผลลัพธ์:

    /home/user/Downloads

    .

    📝 Command #2. ls

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

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

    ls

    ผลลัพธ์:

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

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

    ls Documents

    ผลลัพธ์:

    resume.docx
    thesis.pdf
    notes.txt
    projects/

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

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

    Note:

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

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

    .

    ⏭️ Command #3. cd

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

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

    cd /home/user/Documents

    Note:

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

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

    ⏹️ Group #2. Preparing

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

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

    Note:

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

    .

    📂 Command #4. mkdir

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

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

    mkdir new_folder

    .

    🚮 Command #5. rmdir

    rmdir (remove directory) ใช้ลบ folder

    เช่น ลบ folder “new_folder”:

    rmdir new_folder

    Note:

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

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

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

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

    .

    ✋ Command #6. touch

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

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

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

    touch new_file.txt

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

    touch new_file_1.txt new_file_2.txt new_file_3.txt

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

    touch new_file.txt

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

    .

    📋 Command #7. cp

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

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

    cp new_file.txt copy_of_new_file.txt

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

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

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

    cp new_file.txt /home/user/Documents

    Note:

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

    .

    📤 Command #8. mv

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

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

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

    mv new_file.txt my_file.txt

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

    mv new_file.txt /home/user/Documents

    Note:

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

    .

    🗑️ Command #9. rm

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

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

    rm my_file.txt

    Note:

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

    👀 Group #3. Inspecting

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

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

    .

    🐈 Command #10. cat

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

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

    cat small_file.txt

    ผลลัพธ์:

    .

    ⬇️ Command #11. less

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

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

    less large_file.txt

    ผลลัพธ์:

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

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

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

    .

    🗿 Command #12. head

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

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

    head large_file.txt

    ผลลัพธ์:

    Note:

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

    .

    🐒 Command #13. tail

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

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

    tail large_file.txt

    ผลลัพธ์:

    Note:

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

    🆕 Group #4. Analysing

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

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

    .

    🪝 Command #14. wc

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

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

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

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

    wc large_file.txt

    ผลลัพธ์:

    178 523 3703 large_file.txt

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

    wc -w large_file.txt

    ผลลัพธ์:

    523 large_file.txt

    .

    ✂️ Command #15. grep

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

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

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

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

    grep "@support.com" emails.txt

    ผลลัพธ์:

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

    Note:

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

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

    .

    📎 Command #16. cut

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

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

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

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

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

    cut -d , -f 5 people.csv

    ผลลัพธ์:

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

    .

    🗂️ Command #17. paste

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

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

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

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

    paste people.csv job_levels.txt

    ผลลัพธ์:

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

    .

    ☘️ Command #18. sort

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

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

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

    sort -r emails.txt

    ผลลัพธ์:

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

    .

    ☝️ Command #19. uniq

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

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

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

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

    uniq fruits.txt

    ผลลัพธ์:

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

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

    .

    ♣️ Command #20. Wildcards

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

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

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

    ls file?.txt

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

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

    ls *.txt

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

    ls 202[45].txt

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

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

    ls backup.{csv,txt}

    🔗 Group #5. Chaining

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

    1. |
    2. >
    3. >>

    .

    ⛓️ Command #21. |

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

    A | B

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

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

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

    ผลลัพธ์:

    apple 🍎
    banana 🍌
    grape 🍇
    orange 🍊

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

    .

    ⚡ Command #22. >

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

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

    ls > file_list.txt

    ผลลัพธ์:

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

    Note:

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

    .

    🃏 Command #23. >>

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

    ls >> file_list.txt

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

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

    🤖 Group #6. Automating

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

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

    .

    🔉 Command #24. =

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

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

    name="Gojo"

    .

    🥠 Command #25. echo

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

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

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

    echo name

    ผลลัพธ์:

    name

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

    echo $name

    ผลลัพธ์:

    Gojo

    .

    ➰ Command #26. for

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

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

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

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

    .

    📃 Command #27. bash

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

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

    ls

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

    bash script.sh

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

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

    .

    🗒️ Command #28. nano

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

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

    nano script.sh

    ผลลัพธ์:

    Note:

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

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

    💡 Group #7. Getting Unstuck

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

    1. history
    2. !
    3. man

    .

    🏛️ Command #29. history

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

    history

    ผลลัพธ์:

    .

    🕯️ Command #30. !

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

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

    !71

    ผลลัพธ์:

    apple 🍎
    banana 🍌
    grape 🍇
    orange 🍊

    .

    ❓ Command #31. man

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

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

    man ls

    ผลลัพธ์:


    💪 Summary

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

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

    1. pwd
    2. ls
    3. cd

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

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

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

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

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

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

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

    1. |
    2. >
    3. >>

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

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

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

    1. history
    2. !
    3. man

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


    😺 GitHub

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


    📖 Further Reading

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


    📄 References