Author: Shinin Varongchayakul

  • วิธีสร้าง KNN model ใน 5 ขั้นตอนด้วย class package ในภาษา R – ตัวอย่างการทำนายประเภทดอกไม้ใน iris dataset

    วิธีสร้าง KNN model ใน 5 ขั้นตอนด้วย class package ในภาษา R – ตัวอย่างการทำนายประเภทดอกไม้ใน iris dataset

    ในบทความนี้ เราจะมาทำความรู้กันกับ KNN model และวิธีสร้าง KNN model ด้วย class package ในภาษา R กัน


    1. 💻 KNN in R With class Package
    2. 1️⃣ Step 1. Get class Package
    3. 2️⃣ Step 2. Get the Dataset
    4. 3️⃣ Step 3. Prepare Data
      1. 📉 Normalise Data
      2. 🪓 Split Data
      3. 🏷️ Separate Features From Label
    5. 4️⃣ Step 4. Train a KNN Model
    6. 5️⃣ Step 5. Evaluate the Model
    7. 🍩 Bonus: Fine-Tuning
    8. 😺 GitHub
    9. 📃 References
    10. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    KNN หรือ K-Nearest Neighbors เป็น machine learning algorithm ประเภท supervised learning ซึ่งใช้ได้กับงานประเภท classification (จัดกลุ่ม) และ regression (ทำนายแนวโน้ม)

    การทำงานของ KNN ตรงไปตรงมา คือ ทำนายข้อมูลโดยการดูจากข้อมูลใกล้เคียง จำนวน k ข้อมูล (เราสามารถกำหนดค่า k เองได้)

    ยกตัวอย่างเช่น เราต้องการใช้ KNN ทำนายราคาหุ้น KNN จะดูราคาหุ้นที่อยู่ใกล้เคียงกับหุ้นที่เราต้องการทำนายราคา เช่น 5 หุ้นใกล้เคียง โดย:

    • 2/5 หุ้น = ราคาลง
    • 3/5 หุ้น = ราคาขึ้น

    KNN จะทำนายว่า หุ้นในใจของเรา จะราคาขึ้น เพราะหุ้นใกล้เคียงส่วนใหญ่ปรับราคาขึ้น เป็นต้น


    💻 KNN in R With class Package

    เราสามารถสร้าง KNN model ในภาษา R ด้วย class package โดยมี 5 ขั้นตอนดังนี้:

    1. Get class package
    2. Load the dataset
    3. Prepare the data
    4. Train a KNN model
    5. Evaluate the model

    เราไปดูตัวอย่างการสร้าง KNN model เพื่อทำนายประเภทดอกไม้ ด้วย iris dataset กัน


    1️⃣ Step 1. Get class Package

    ในขั้นแรก ให้เราติดตั้งและเรียกใช้งาน class package

    ติดตั้ง (ทำครั้งเดียว):

    # Install
    install.packages("class")
    

    เรียกใช้งาน (ทำทุกครั้งที่เริ่ม session ใหม่):

    # Load
    library(class)
    

    2️⃣ Step 2. Get the Dataset

    ในขั้นที่สอง ให้เราโหลด dataset ที่จะใช้งาน

    โดยในบทความนี้ เราจะใช้ iris ที่มีข้อมูลดอกไม้ 3 ชนิด ได้แก่:

    • Iris setosa
    • Iris virginica
    • Iris versicolor

    นอกจากประเภทดอกไม้ (species) iris dataset ยังประกอบด้วยความกว้าง (width) และความยาว (length) ของกลีบดอกชั้นนอก (sepal) และชั้นใน (petal)

    เนื่องจาก iris เป็น built-in dataset ใน ภาษา R เราสามารถโหลดข้อมูลด้วยคำสั่ง data() ได้:

    # Load
    data(iris)
    

    เมื่อโหลดแล้ว เราสามารถดูตัวอย่าง dataset ได้ด้วย head():

    # Preview
    head(iris)
    

    ผลลัพธ์:

      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    3          4.7         3.2          1.3         0.2  setosa
    4          4.6         3.1          1.5         0.2  setosa
    5          5.0         3.6          1.4         0.2  setosa
    6          5.4         3.9          1.7         0.4  setosa
    

    3️⃣ Step 3. Prepare Data

    ในขั้นที่สาม เราจะเตรียมข้อมูล เพื่อใช้สร้าง KNN model

    โดยสำหรับ iris dataset เราจะทำ 3 อย่าง คือ:

    1. Normalise data
    2. Split data
    3. Separate features from the label

    .

    📉 Normalise Data

    เนื่องจาก KNN model อ้างอิงระยะห่างระหว่างข้อมูลในการทำนายผลลัพธ์ ข้อมูลที่มีช่วงกว้าง (เช่น 0-100) จะมีน้ำหนักกว่าข้อมูลที่มีช่วงแคบ (เช่น 0-10) และทำให้ model ของเรา bias ได้

    เพื่อป้องกันความเสี่ยงนี้ เราต้อง normalise ข้อมูล หรือการทำให้ข้อมูลมีช่วงมีช่วงข้อมูลเดียวกัน

    การทำ normalisation มีหลายวิธี แต่วิธีที่นิยมใช้กับ KNN คือ min-max normalisation ซึ่งเปลี่ยนช่วงข้อมูลให้อยู่ในช่วง 0-1 ผ่านสูตร:

    (X - Min) / (Max - Min)
    • X คือ ข้อมูล
    • Min คือ ค่าที่น้อยที่สุด
    • Max คือ ค่าที่มากที่สุด

    ในภาษา R เราไม่มี function ที่ใช้ทำ min-max normalisation ได้โดยตรง เราเลยต้องเขียน function ขึ้นมาใช้เอง:

    # Define a function for normalisation
    normalise <- function(x) {
      return((x - min(x)) / (max(x) - min(x)))
    }
    

    จากนั้น ให้เราใช้ function นี้กับ columns ที่เป็นตัวเลข (numeric) เช่น Sepal.Length แล้วเก็บผลลัพธ์ไว้ใน data frame ใหม่ ชื่อ iris_normalises:

    # Apply the function to the dataset
    iris_normalised <- as.data.frame(lapply(iris[, 1:4],
                                            normalise))
    

    เนื่องจากตอนที่เราใช้ function เราตัด column ที่ไม่ใช่ตัวเลขออก ทำให้ iris_normalised ไม่มี column Species

    เราสามารถใส่ Species กลับเข้าไป เพื่อใช้ในขั้นตอนถัดไป แบบนี้:

    # Add species column back into the data frame
    iris_normalised$Species <- iris$Species
    

    สุดท้าย เราเช็กผลลัพธ์ด้วยการเรียกดูสถิติของ iris_normalised:

    # Check the results
    summary(iris_normalised)
    

    ผลลัพธ์:

      Sepal.Length     Sepal.Width    
     Min.   :0.0000   Min.   :0.0000  
     1st Qu.:0.2222   1st Qu.:0.3333  
     Median :0.4167   Median :0.4167  
     Mean   :0.4287   Mean   :0.4406  
     3rd Qu.:0.5833   3rd Qu.:0.5417  
     Max.   :1.0000   Max.   :1.0000  
      Petal.Length     Petal.Width     
     Min.   :0.0000   Min.   :0.00000  
     1st Qu.:0.1017   1st Qu.:0.08333  
     Median :0.5678   Median :0.50000  
     Mean   :0.4675   Mean   :0.45806  
     3rd Qu.:0.6949   3rd Qu.:0.70833  
     Max.   :1.0000   Max.   :1.00000  
           Species  
     setosa    :50  
     versicolor:50  
     virginica :50  
    

    จะเห็นว่า:

    1. Columns ที่เป็นตัวเลข มีช่วงอยู่ระหว่าง 0 และ 1
    2. เรายังมี column Species อยู่

    .

    🪓 Split Data

    ในการสร้าง KNN model เราควรแบ่ง dataset ที่มีเป็น 2 ส่วน คือ:

    1. Training set: ใช้สำหรับสร้าง model
    2. Test set: ใช้สำหรับประเมิน model

    เราเริ่มแบ่งข้อมูลด้วยการสุ่ม row index ที่จะอยู่ใน training set:

    # Set seed for reproducibility
    set.seed(2025)
    
    # Create a training index
    train_index <- sample(1:nrow(iris_normalised),
                          0.7 * nrow(iris_normalised))
    

    จากนั้น subset ข้อมูลด้วย row index ที่สุ่มไว้:

    # Split the data
    train_set <- iris_normalised[train_index, ]
    test_set <- iris_normalised[-train_index, ]
    

    .

    🏷️ Separate Features From Label

    ขั้นตอนสุดท้ายในการเตรียมข้อมูล คือ แยก features หรือ X (columns ที่จะใช้ทำนาย) ออกจาก label หรือ Y (สิ่งที่ต้องการทำนาย):

    # Separate features from label
    
    ## Training set
    train_X <- train_set[, 1:4]
    train_Y <- train_set$Species
    
    ## Test set
    test_X <- test_set[, 1:4]
    test_Y <- test_set$Species
    

    4️⃣ Step 4. Train a KNN Model

    ขั้นที่สี่เป็นขั้นที่เราสร้าง KNN model ขึ้นมา โดยเรียกใช้ knn() จาก class package

    ทั้งนี้ knn() ต้องการ input 3 อย่าง:

    1. train: fatures จาก training set
    2. test: feature จาก test set
    3. cl: label จาก training set
    4. k: จำนวนข้อมูลใกล้เคียงที่จะใช้ทำนายผลลัพธ์
    # Train a KNN model
    pred <- knn(train = train_X,
                test = test_X,
                cl = train_Y,
                k = 5)
    

    ในตัวอย่าง เรากำหนด k = 5 เพื่อทำนายผลลัพธ์โดยดูจากข้อมูลที่ใกล้เคียง 5 อันดับแรก


    5️⃣ Step 5. Evaluate the Model

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

    Accuracy = Correct predictions / Total predictions

    ในภาษา R ให้เราสร้าง confusion matrix หรือ matrix แสดงจำนวนคำตอบที่ถูกและผิด ด้วย table() function:

    # Create a confusion matrix
    cm <- table(Predicted = predictions,
                Actual = test_Y)
    
    # Print the matrix
    print(cm)
    

    ผลลัพธ์:

                Actual
    Predicted    setosa versicolor virginica
      setosa         15          0         0
      versicolor      0         17         0
      virginica       0          2        11
    

    Note: จะเห็นได้ว่า model เราตอบถูกเป็นส่วนใหญ่ (ราว 90%)

    จากนั้น คำนวณ accuracy ด้วย sum() และ diag():

    # Calculate accuracy
    acc <- sum(diag(cm)) / sum(cm)
    
    # Print accuracy
    cat("Accuracy:", round(acc, 2))
    

    ผลลัพธ์:

    Accuracy: 0.96
    

    จากผลลัพธ์ เราจะเห็นว่า model มีความแม่นยำสูงถึง 96%


    🍩 Bonus: Fine-Tuning

    ในบางครั้ง ค่า k ที่เราตั้งไว้ อาจไม่ได้ทำให้เราได้ KNN model ที่ดีที่สุด

    แทนที่เราจะแทนค่า k ใหม่ไปเรื่อย ๆ เราสามารถใช้ for loop เพื่อหาค่า k ที่ทำให้เราได้ model ที่ดีที่สุดได้

    ให้เราเริ่มจากสร้าง vector ที่มีค่า k ที่ต้องการ:

    # Create a set of k values
    k_values <- 1:20
    

    และ vector สำหรับเก็บค่า accuracy ของค่า k แต่ละตัว:

    # Createa a vector for accuracy results
    accuracy_results <- numeric(length(k_values))
    

    แล้วใช้ for loop เพื่อหาค่า accuracy ของค่า k:

    # For-loop through the k values
    for (i in seq_along(k_values)) {
      
      ## Set the k value
      k <- k_values[i]
      
      ## Create a KNN model
      predictions <- knn(train = train_X,
                         test = test_X,
                         cl = train_Y,
                         k = k)
      
      ## Create a confusion matrix
      cm <- table(Predicted = predictions,
                  Actual = test_Y)
      
      ## Calculate accuracy
      accuracy_results[i] <- sum(diag(cm)) / sum(cm)
    }
    
    # Find the best k and the corresponding accuracy
    best_k <- k_values[which.max(accuracy_results)]
    best_accuracy <- max(accuracy_results)
    
    # Print best k and accuracy
    cat(paste("Best k:", best_k),
        paste("Accuracy:", round(best_accuracy, 2)),
        sep = "\n")
    

    ผลลัพธ์:

    Best k: 12
    Accuracy: 0.98
    

    แสดงว่า ค่า k ที่ดีที่สุด คือ 12 โดยมี accuracy เท่ากับ 98%

    นอกจากนี้ เรายังสามารถสร้างกราฟ เพื่อช่วยทำความเข้าใจผลของค่า k ต่อ accuracy:

    # Plot the results
    plot(k_values,
         accuracy_results,
         type = "b",
         pch = 19,
         col = "blue",
         xlab = "Number of Neighbors (k)",
         ylab = "Accuracy",
         main = "KNN Model Accuracy for Different k Values")
    grid()
    

    ผลลัพธ์:

    จะเห็นได้ว่า k = 12 ให้ accuracy ที่ดีที่สุด และ k = 20 ให้ accuracy ต่ำที่สุด ส่วนค่า k อื่น ๆ ให้ accuracy ในช่วง 93 ถึง 96%


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

  • pandas fundamentals: 5 กลุ่ม pd functions ที่ควรรู้ในการทำงานกับข้อมูล พร้อมตัวอย่างจาก Spotify dataset

    pandas fundamentals: 5 กลุ่ม pd functions ที่ควรรู้ในการทำงานกับข้อมูล พร้อมตัวอย่างจาก Spotify dataset

    pandas เป็น library ใน Python ที่นิยมใช้ทำงานกับ data เพราะ:

    • pandas สามารถเก็บข้อมูลในรูปแบบ table หรือ data frame ได้
    • มี functions/methods สำหรับทำงานกับ data frame

    .

    ในบทความนี้ เราจะมาดูวิธีใช้ pandas ในการทำงานกับ data เบื้องต้นกัน

    โดย functions ของ pandas ที่เราจะดู แบ่งเป็น 5 กลุ่ม ได้แก่:

    No.GroupDescription
    1Exploringสำรวจข้อมูลเบื้องต้น
    2Selecting and filteringเลือกและกรองข้อมูล
    3Sortingจัดลำดับข้อมูล
    4Slicingตัดแบ่งข้อมูล
    5Aggregatingสรุปข้อมูล

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


    1. 🎧 Dataset: Spotify Tracks
    2. ▶️ Press Play
      1. 1️⃣ Install
      2. 2️⃣ Import
      3. 3️⃣ Read
    3. 🎶 Playlist #1 – Exploring
      1. 1️⃣ .head()
      2. 2️⃣ .info()
      3. 3️⃣ .describe()
      4. 4️⃣ .shape
    4. 🎶 Playlist #2 – Selecting & Filtering
      1. 1️⃣ df[condition]
      2. 2️⃣ .query()
    5. 🎶 Playlist #3 – Sorting
      1. 1️⃣ .sort_values()
    6. 🎶 Playlist #4 – Slicing
      1. 1️⃣ df[column_name]
      2. 2️⃣ .loc[]
      3. 3️⃣ .iloc[]
      4. 4️⃣ .filter()
    7. 🎶 Playlist #5 – Aggregating
      1. 1️⃣ Aggregation Functions
      2. 2️⃣ .agg()
      3. 3️⃣ .groupby()
    8. ⏭️ Next Song
      1. 💻 Example Code
      2. 📚 Further Reading

    🎧 Dataset: Spotify Tracks

    ในบทความนี้ dataset ที่จะใช้เป็นตัวอย่าง คือ Spotify Tracks Dataset จาก Kaggle

    Spotify Tracks Dataset เป็นชุดข้อมูลเพลงใน Spotify ทั้งหมด 125 แนวเพลง และประกอบด้วย 20 columns เช่น:

    • track_name: ชื่อเพลง
    • artists: ชื่อศิลปิน
    • popularity: คะแนนความนิยม
    • energy: ความดัง + ความเร็ว
    • liveness: เป็นเพลง live หรืออัดใน studio

    ▶️ Press Play

    ก่อนไปดูการใช้งาน pandas เรามาดูวิธีการเตรียม pandas และ dataset กันก่อน:

    1. Install
    2. Import
    3. Read

    .

    1️⃣ Install

    ในการใช้งาน pandas ให้เราเริ่มจากติดตั้ง pandas ก่อน:

    # Install pandas
    !pip install pandas
    

    Note: ถ้าใครติดตั้งแล้ว สามารถไปที่ step ต่อไปได้เลย

    .

    2️⃣ Import

    หลังติดตั้ง pandas แล้ว ให้เรียกใช้งานผ่านคำสั่ง import:

    # Load pandas
    import pandas as pd
    

    Note:

    • pandas มักใช้ตัวย่อ pd เพื่อง่ายต่อการทำงาน
    • ทุกครั้งที่เปิด session ใหม่ จะต้อง run บรรทัดนี้ก่อนทำงานเสมอ

    .

    3️⃣ Read

    เมื่อติดตั้งและเรียกใช้งาน pandas แล้ว ให้โหลด dataset ที่ต้องการใช้งานซึ่งในกรณีนี้ คือ Spotify Tracks Dataset ซึ่งเป็นไฟล์ CSV โดยเราจะโหลดผ่าน read_csv() ของ pandas:

    # Load the dataset
    spotify = pd.read_csv("spotify_tracks_dataset.csv", index_col=0)
    

    Note: ในกรณีของ Spotify Tracks Dataset เราต้องใช้ index_col=0 เพื่อบอก pandas ว่า เราจะไม่ต้องการสร้าง column ที่เป็น running number

    .

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


    🎶 Playlist #1 – Exploring

    เริ่มแรก เรามาดูการใช้งาน pandas เพื่อสำรวจข้อมูลเบื้องต้นกัน

    Functions ในกลุ่มนี้ประกอบด้วย 4 functions/methods:

    1. .head()
    2. .info()
    3. .describe()
    4. .shape

    .

    1️⃣ .head()

    Use case:

    เรียกดู 5 rows แรกของ dataset

    ตัวอย่าง:

    # View the first 5 rows
    spotify.head()
    

    ผลลัพธ์:

    Note:

    • ถ้าต้องการดูมากกว่า 5 rows ให้ใส่จำนวน rows ที่ต้องการ เช่น spotify.head(10) จะเรียกดู 10 rows แรก

    .

    2️⃣ .info()

    Use case:

    ดูข้อมูลภาพรวมของ dataset

    ตัวอย่าง:

    # Get overview of the dataset
    spotify.info()
    

    ผลลัพธ์:

    .

    3️⃣ .describe()

    Use case:

    เรียกดู summary stats ของ datasets ซึ่งได้แก่:

    • Count
    • Mean
    • Standard deviation (std)
    • Min
    • Quartiles
      • 25
      • 50
      • 75
    • Max

    ตัวอย่าง:

    # Get summary stats
    spotify.describe()
    

    ผลลัพธ์:

    Note:

    โดย default, .describe() จะสรุปข้อมูลเฉพาะ column ที่เป็น numerical variable เท่านั้น

    ถ้าเราต้องการ summary stats ของ categorical variable เราสามารถใช้ argument include="all" ได้:

    # Get summary stats for all variable types
    spotify.describe(include="all")
    

    ผลลัพธ์:

    จะเห็นได้ว่า ตอนนี้เราจะได้ summary stats ของทั้ง numerical (เช่น popularity) และ categorical variables (เช่น artists)

    .

    4️⃣ .shape

    Use case:

    ดูจำนวน rows และ columns ของ dataset

    ตัวอย่าง:

    # See the dimensions of the dataset
    spotify.shape
    
    

    ผลลัพธ์:

    • 114000 คือ จำนวน rows
    • 20 คือ จำนวน columns

    🎶 Playlist #2 – Selecting & Filtering

    ในกลุ่มการใช้งานที่ 2 เรามาดูวิธีการเลือกและกรองข้อมูลกัน:

    1. df[condition]
    2. .query()

    .

    1️⃣ df[condition]

    Use case:

    df[condition] เป็น syntax เพื่อกรองข้อมูล

    ตัวอย่าง:

    เราต้องการดูข้อมูลเพลงที่มีคะแนนความนิยม (popularity) สูงกว่า 80:

    # Select records where popularity is greater than 80
    spotify[spotify["popularity"] > 80]
    

    ผลลัพธ์:

    Note:

    ในการกรอง เราสามารถใช้ comparison operators เหล่านี้ช่วยได้:

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

    นอกจากนี้ เราสามารถใช้ Boolean operators เพื่อเพิ่ม conditions ในการกรองข้อมูลได้:

    Boolean OperatorMeaning
    &and
    ``
    !not

    เช่น ดูข้อมูลเพลงที่มีคะแนนความนิยม (popularity) สูงกว่า 80 จากวง The Neighbourhood (ดูจาก artists):

    # Select records where popularity is greater than 80 from The Neighbourhood
    spotify[(spotify["popularity"] > 80) & (spotify["artists"] == "The Neighbourhood")]
    

    ผลลัพธ์:

    .

    2️⃣ .query()

    Use case:

    .query() ทำหน้าที่คล้ายกับ df[condition] นั่นคือ กรองข้อมูล

    แต่ .query() มีข้อดีอยู่ 2 อย่าง:

    1. ใช้งานง่าย
    2. เหมาะกับการกรองข้อมูล ด้วย conditions ที่ซับซ้อน

    การเขียน input ของ .query() เราจะใช้ใน syntax ของ SQL

    ตัวอย่าง:

    จากตัวอย่างก่อนหน้านี้ที่เราต้องการดูข้อมูลเพลงที่:

    • มีคะแนนความนิยม (popularity) สูงกว่า 80
    • จากวง The Neighbourhood (ดูจาก artists)

    เราสามารถเขียน .query() ได้ดังนี้:

    # Filter with .query()
    spotify.query("popularity > 80 and artists == 'The Neighbourhood'")
    

    ผลลัพธ์:

    Note:

    ถ้าเราเทียบระหว่าง df[condition] และ .query() :

    df[condition].query()
    spotify[(spotify["popularity"] > 80) & (spotify["artists"] == "The Neighbourhood")]spotify.query("popularity > 80 and artists == 'The Neighbourhood'")

    จะเห็นว่า .query():

    • สั้นกว่า
    • ทำความเข้าใจได้ง่ายกว่า

    🎶 Playlist #3 – Sorting

    หลังจากกรองข้อมูล บางครั้งเราอยากจะจัดลำดับข้อมูล เพื่อช่วยในการทำความเข้าใจข้อมูล:

    • .sort_values()

    .

    1️⃣ .sort_values()

    Use case:

    จัดเรียงข้อมูล โดย:

    • default จะเรียงจากน้อยไปมาก (A-Z)
    • ถ้าต้องการเรียงจากมากไปน้อย (Z-A) ให้ใช้ ascending=False

    ตัวอย่าง:

    ต้องการเรียงเพลงตามคะแนนความนิยม (popularity) จากสูงไปต่ำ เพื่อหาเพลงฮิต:

    # Sort tracks by popularity in descending order
    spotify.sort_values(by="popularity", ascending=False)
    

    ผลลัพธ์:


    🎶 Playlist #4 – Slicing

    ในกลุ่มนี้ เราจะมาดู 4 วิธี เพื่อดึง rows และ/หรือ columns ออกจาก dataset กัน:

    1. df[column]
    2. .loc[]
    3. .iloc[]
    4. .filter()

    .

    1️⃣ df[column_name]

    Use case:

    df[column_name] เป็น syntax เพื่อเลือกข้อมูลจาก column ที่ต้องการ โดย:

    • df หมายถึง ชื่อ dataset
    • column_name หมายถึง ชื่อ column ที่เราเลือก

    ตัวอย่าง:

    เลือกดูชื่อเพลง (track_name):

    # Select column track_name
    spotify["track_name"]
    

    ผลลัพธ์:

    Note:

    ถ้าต้องการมากกว่า 1 column เราสามารถใส่ input เป็น list ได้

    เช่น เลือกชื่อเพลง (track_name) และคะแนนความนิยม (popularity):

    # Select columns track_name and popularity
    spotify[["track_name", "popularity"]]
    

    ผลลัพธ์:

    .

    2️⃣ .loc[]

    Use case:

    เลือก rows และ/หรือ columns โดยใช้ ชื่อ rows และ columns (label-based)

    Syntax:

    .loc[] มีหลักการใช้งานดังนี้:

    SyntaxFor
    df.loc[r_lab]เลือก 1 row
    df.loc[rx:ry]เลือกมากกว่า 1 rows
    df.loc[[r_list]]เลือกมากกว่า 1 rows
    df.loc[:, c_lab]เลือก 1 column
    df.loc[:, cx:cy]เลือกมากกว่า 1 column
    df.loc[:, [c_list]]เลือกมากกว่า 1 columns
    • r_lab คือ ชื่อ row
    • rx:ry คือ ช่วง rows ที่ต้องการเลือก
    • [r_list] คือ list ของ rows ที่ต้องการเลือก
    • c_lab คือ ชื่อ column ที่ต้องการเลือก
    • cx:cy คือ ช่วง columns ที่ต้องการเลือก
    • [c_list] คือ list ของ columns ที่ต้องการเลือก

    ตัวอย่าง:

    เลือก 5 rows แรก และแสดงเฉพาะ:

    • ชื่อเพลง (track_name)
    • ชื่อศิลปิน (artists)
    • คะแนนความนิยม (popularity)
    # Select first 5 rows from track_name, artists, popularity
    spotify.loc[0:4, ["track_name", "artists", "popularity"]]
    

    ผลลัพธ์:

    .

    3️⃣ .iloc[]

    Use case:

    เลือก rows และ/หรือ columns โดยใช้ ตำแหน่ง rows และ columns (position-based)

    Syntax:

    .iloc[] มีวิธีการใช้งาน คล้ายกับ .loc[] ดังนี้:

    SyntaxFor
    df.iloc[r_index]เลือก 1 row
    df.iloc[rx:ry]เลือกมากกว่า 1 rows
    df.iloc[[r_list]]เลือกมากกว่า 1 rows
    df.iloc[:, c_index]เลือก 1 column
    df.iloc[:, cx:cy]เลือกมากกว่า 1 column
    df.iloc[:, [c_list]]เลือกมากกว่า 1 columns
    • r_index คือ ตำแหน่ง row
    • rx:ry คือ ช่วง rows ที่ต้องการเลือก
    • [r_list] คือ list ของ rows ที่ต้องการเลือก
    • c_index คือ ตำแหน่ง column ที่ต้องการเลือก
    • cx:cy คือ ช่วง columns ที่ต้องการเลือก
    • [c_list] คือ list ของ columns ที่ต้องการเลือก

    ความแตกต่างระหว่าง .loc[] และ .iloc[] คือ สิ่งที่ใช้ในการเลือก s และ columns:

    • .loc[] ใช้ ชื่อ (label)
    • .iloc[] ใช้ ตำแหน่ง (position)

    ตัวอย่าง:

    เลือก 5 rows แรก และแสดงเฉพาะ:

    • ชื่อเพลง (track_name)
    • ชื่อศิลปิน (artist_name)
    • คะแนนความนิยม (popularity)
    # Select first 5 rows from track_name, artists, popularity
    spotify.iloc[0:5, [0, 1, 5]]
    

    ผลลัพธ์:

    .

    4️⃣ .filter()

    Use case:

    .filter() ทำหน้าที่คล้ายกับ df[condition] แต่ทรงพลังกว่า เพราะเลือกกรองข้อมูลได้ทั้ง rows และ columns

    Syntax:

    df.filter(condition, axis)
    
    • df คือ ชื่อ dataset
    • condition คือ เงื่อนไขในการเลือกข้อมูล ซึ่งเรามี 3 parametres ให้เลือกใช้:
      • items กรองตาม labels ของ rows หรือ columns
      • like กรองตาม คำค้นหา
      • reg กรองตาม regular expression
    • axis ระบุว่า ต้องการเลือก rows (0) หรือ columns (1)

    ตัวอย่าง:

    เลือก rows ที่เลข 123:

    # Select rows with "123"
    spotify.filter(like="123", axis=0)
    

    ผลลัพธ์:

    หรือ เลือกข้อมูลจาก columns:

    • ชื่อเพลง (track_name)
    • ชื่อศิลปิน (artist_name)
    • คะแนนความนิยม (popularity)
    # Select first 5 rows from track_name, artists, popularity
    spotify.filter(items=["track_name", "artists", "popularity"])
    

    ผลลัพธ์:


    🎶 Playlist #5 – Aggregating

    สุดท้าย เรามาดูวิธีการสรุปข้อมูลกัน:

    1. Aggregation functions
    2. .agg()
    3. .groupby()

    .

    1️⃣ Aggregation Functions

    ในกรณีที่เราต้องการ คำนวณค่าทางสถิติ pandas มี functions ให้เลือกใช้งานมากมาย เช่น:

    FunctionMeaning
    .sum()หาผลรวม
    .mean()หาค่าเฉลี่ย
    .median()หาค่ากลาง
    .mode()หาค่าที่ซ้ำมากที่สุด
    .min()หาค่าน้อยที่สุด
    .max()หาค่ามากที่สุด
    .std()หา standard deviation (SD)
    .cumsum()หาผลรวมสะสม
    .value_counts()นับจำนวนข้อมูล
    .nunique()นับจำนวนข้อมูลที่ไม่ซ้ำ

    ตัวอย่าง:

    ต้องการหาค่าเฉลี่ยของคะแนนความนิยม (popularity):

    # Calculate the mean of popularity
    spotify["popularity"].mean()
    

    ผลลัพธ์:

    หรือหา SD ของคะแนนความนิยม (popularity):

    # Calculate the SD of popularity
    spotify["popularity"].std()
    
    

    ผลลัพธ์:

    .

    2️⃣ .agg()

    Use case:

    ในบางครั้ง เราต้องการคำนวณหลายค่าทางสถิติพร้อมกัน เช่น ตัวอย่างก่อนหน้านี้ที่เราต้องการหา mean และ SD

    แทนที่เราจะเขียน code เพื่อแสดงผลแยกกัน เช่น:

    # Calculate mean
    spotify["popularity"].mean()
    
    # Calculate SD
    spotify["popularity"].std()
    

    เราสามารถใช้ agg() เพื่อช่วยลดเวลาได้

    ตัวอย่าง:

    หาค่าเฉลี่ยและ SD ของคะแนนความนิยม (popularity):

    # Calculate mean and SD of popularity
    spotify["popularity"].agg(["mean", "std"])
    

    ผลลัพธ์:

    Note:

    เราสามารถใช้ .agg() เพื่อคำนวณค่าทางสถิติกับหลาย column พร้อมกันได้ เช่น หาค่า:

    • mean
    • std

    ให้กับ:

    • คะแนนความนิยม
    • ความยาวของเพลง
    # Calculate mean and SD for popularity and duration_ms
    spotify[["popularity", "duration_ms"]].agg({
    		"popularity": ["mean", "std"],
    		"duration_ms": ["mean", "std"]
    		})
    

    ผลลัพธ์:

    .

    3️⃣ .groupby()

    Use case:

    บางครั้ง เราต้องการคำนวณค่าทางสถิติตามกลุ่มข้อมูล

    เราสามารถใช้ .groupby() เพื่อจับกลุ่มข้อมูล ก่อนจะคำนวณค่าทางสถิติได้

    ตัวอย่าง:

    ต้องการหา ค่าเฉลี่ยและ SD ของคะแนนความนิยม (popularity) ของศิลปินแต่ละคน:

    # Group by artists and calculate mean of popularity 
    spotify.groupby("artists")["popularity"].agg(["mean", "std"])
    

    ผลลัพธ์:


    ⏭️ Next Song

    .

    💻 Example Code

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

    .

    📚 Further Reading

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

  • 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()แปลภาษา