Author: Shinin Varongchayakul

  • สรุป 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. Conclusion
    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

    Conclusion

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

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

    Learn More About R

    .

    🧑‍💻 GitHub

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

    .

    🔨 Free Tool

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

    ดาวน์โหลด R

    RStudio desktop

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

    .

    📗 Free e-Books

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

    .

    🏫 Free Courses

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


    References


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

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

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

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

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

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

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

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

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

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

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

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

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

    .

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

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

    .

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

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

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

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


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

    💽 Example Database: Chinook

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

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

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

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


    1️⃣ Statement #1: SELECT

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

    SELECT Name, AlbumId
    FROM Track;
    

    ผลลัพธ์:

    Note:

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

    SELECT *
    FROM Tracks;
    

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

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

    SELECT Name AS Song, AlbumId AS Album
    FROM Track;
    

    ผลลัพธ์:

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


    2️⃣ Statement #2: WHERE

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

    SELECT Name, UnitPrice
    FROM Track
    WHERE UnitPrice > 0.99;
    

    ผลลัพธ์:

    .

    WHERE operators:

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

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

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

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

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

    เช่น:

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

    ผลลัพธ์:

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

    เช่น:

    • John
    • Gohn
    • Wohn

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

    หรือ:

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

    ผลลัพธ์:

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

    เช่น:

    • John
    • Jo
    • Jane
    • James

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


    3️⃣ Statement #3: ORDER BY

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

    SELECT FirstName, LastName
    FROM Customer
    ORDER BY FirstName;
    

    ผลลัพธ์:

    Note:

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

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

    SELECT FirstName, LastName
    FROM Customer
    ORDER BY FirstName DESC;
    

    ผลลัพธ์:


    4️⃣ Statement #4: GROUP BY

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

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

    ผลลัพธ์:

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


    5️⃣ Statement #5: Aggregate Functions

    Usage:

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

    .

    Syntax:

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

    .

    Common aggregate functions:

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

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

    .

    Example:

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

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

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

    ผลลัพธ์:

    Note:

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

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

    ผลลัพธ์:

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


    6️⃣ Statement #6: JOIN

    Usage:

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

    .

    Syntax:

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

    .

    Example:

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

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

    ผลลัพธ์:


    7️⃣ Statement #7: LIMIT

    Usage:

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

    .

    Syntax:

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

    .

    Example:

    SELECT FirstName, LastName
    FROM Customer
    LIMIT 10;
    

    ผลลัพธ์:


    💪Put It All Together

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

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

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

    ผลลัพธ์:


    🍩 Bonus: SQL Best Practice

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

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

    Note:

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

    ⏭️Next: Sharpen Your SQL

    .

    😺 GitHub

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

    .

    🔨 Free Tool

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

    .

    🎒 Free Course

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

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

    .

    📖 Free Tutorial

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

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

    📃 References

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

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

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

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

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

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

    .

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

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

    .

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


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

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

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

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

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

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

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

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

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


    🏷️ Named Ranges

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

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

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

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

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

    เช่น:

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

    วิธีใช้งาน:

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

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

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

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


    🤔 Syntax Help

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

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

    เช่น:

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


    🧑‍💼 Group #1 – Filtering & Sorting

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

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

    1. FILTER()
    2. SORT()

    .

    (1) FILTER()

    Usage:

    กรองข้อมูล

    Syntax:

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

    Example:

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

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

    ผลลัพธ์:

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

    FILTER()

    .

    (2) SORT()

    Usage:

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

    Syntax:

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

    Example:

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

    =SORT(transactions, 4, FALSE)

    ผลลัพธ์:

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

    SORT()

    Note:

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

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

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

    ผลลัพธ์:

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

    FILTER() + SORT()

    🧑‍💼 Group #2 – Aggregating

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

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

    ตัวอย่าง:

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

    Aggregate functions in Google Sheets

    Note:

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

    🧑‍💼 Group #3 – Searching

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

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

    .

    (1) VLOOKUP()

    Usage:

    VLOOKUP ย่อมาจาก:

    Vertical Lookup

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

    Syntax:

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

    Example:

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

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

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

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

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

    และ:

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

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

    ผลลัพธ์:

    VLOOKUP()

    Note:

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

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

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

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

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

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

    ผลลัพธ์:

    VLOOKUP()

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

    .

    (2) INDEX()

    Usage:

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

    Syntax:

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

    Example:

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

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

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

    =INDEX(transactions, 10, 6)

    ผลลัพธ์:

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

    .

    (3) MATCH()

    Usage:

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

    Syntax:

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

    Example:

    MATCH()

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

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

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

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

    ผลลัพธ์:

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

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

    Note:

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

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

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

    ผลลัพธ์:

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

    .

    (4) QUERY()

    Usage:

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

    Syntax:

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

    Example #1:

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

    =QUERY(transactions, "SELECT *")

    ผลลัพธ์:

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

    .

    Example #2:

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

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

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

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

    ผลลัพธ์:

    QUERY()

    .

    Example #3:

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

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

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

    ผลลัพธ์:

    QUERY()

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


    🧑‍💼 Group #4 – Conditions

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

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

    .

    (1) IF()

    Usage:

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

    Syntax:

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

    Example #1:

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

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

    ผลลัพธ์:

    IF()

    .

    Example #2:

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

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

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

    ผลลัพธ์:

    Nested IF()s

    .

    (2) IFS

    Usage:

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

    Example:

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

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

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

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

    ผลลัพธ์:

    IFS()

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

    .

    (3) IFERROR()

    Usage:

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

    Syntax:

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

    Example:

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

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

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

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

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

    ผลลัพธ์:

    With IFERROR()

    🧑‍💼 Group #5 – Working With Date

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

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

    .

    (1) TODAY()

    Usage:

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

    Example:

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

    =TODAY()

    ผลลัพธ์:

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

    .

    (2) DATEDIF()

    Usage:

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

    Example:

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

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

    ผลลัพธ์:

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

    .

    (3) NETWORKDAYS()

    Usage:

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

    Example:

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

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

    ผลลัพธ์:

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


    🧑‍💼 Group #6 – Working With Text

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

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

    .

    (1) Splitting Text

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

    Syntax:

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

    Example:

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

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

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

    ผลลัพธ์:

    SPLIT()

    .

    (2) Joining Text

    สูตร:

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

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

    Example:

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

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

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

    ผลลัพธ์:

    & + TEXTJOIN()

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

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

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

    .

    (3) Extracting Text

    สูตร:

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

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

    Syntax:

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

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

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

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

    Example:

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

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

    ผลลัพธ์:

    LEFT() vs MID() vs RIGHT()

    .

    (3) Regular Expression

    สูตร:

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

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

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

    Syntax:

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

    Example:

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

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

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

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

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

    ผลลัพธ์:

    REGEXMATCH() vs REGEXEXTRACT()

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

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


    🧑‍💼 Group #7 – Google

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

    1. GOOGLEFINANCE()
    2. GOOGLETRANSLATE()

    .

    (1) GOOGLEFINANCE()

    Usage:

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

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

    Syntax:

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

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

    .

    (2) GOOGLETRANSLATE()

    Usage:

    แปลภาษา

    Syntax:

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

    Example:

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

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

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

    ผลลัพธ์:

    GOOGLEFINANCE() vs GOOGLETRANSLATE()

    💪 Recap

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

    ⚓ Intro to Seaborn

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

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

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

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

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


    🍔 Dataset ตัวอย่าง

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

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

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

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

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

    .

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

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

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

    .

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

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

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

    Dataset: tips

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


    💻 Syntax ของ Seaborn

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

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

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

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

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

    .

    📊 1. Histograms

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

    ตัวอย่าง:

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

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

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

    ผลลัพธ์:

    Histogram

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

    .

    📊 2. Box Plots

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

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Box plot

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

    .

    📊 3. Scatter Plots

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Scatter plot

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

    .

    📊 4. Line Plots

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Line plot

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

    .

    📊 5. Bar Plots

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

    ตัวอย่าง:

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

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

    ผลลัพธ์:

    Bar plot

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


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

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

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

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

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

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

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

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

    ผลลัพธ์:

    Third variable added as hue

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

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


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

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

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

    .

    🎨 1. สี

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

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

    .

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

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

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

    ผลลัพธ์:

    Customise colour with palette

    .

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

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

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

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

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

    เช่น:

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

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

    ผลลัพธ์:

    Customise colour with sns.set_palette()

    .

    🎨 2. Style

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

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

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

    Note:

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

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

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

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

    ผลลัพธ์:

    Customise style with sns.set_style()

    .

    🎨 3. ข้อความ

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

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

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

    ผลลัพธ์:

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

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


    💪 สรุป Seaborn 101

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

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

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

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

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

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

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

    ⏭️ Next

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

    .

    🧑‍💻 Example Code on GitHub

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

    .

    📚 Further Reading

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

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

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

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

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

    cp image.jpg copy_of_image.jpg

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

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

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

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

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

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

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

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


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

    🧭 Group #1. Orienting

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

    1. pwd
    2. ls
    3. cd

    .

    📍 Command #1. pwd

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

    pwd

    ผลลัพธ์:

    /home/user/Downloads

    .

    📝 Command #2. ls

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

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

    ls

    ผลลัพธ์:

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

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

    ls Documents

    ผลลัพธ์:

    resume.docx
    thesis.pdf
    notes.txt
    projects/

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

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

    Note:

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

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

    .

    ⏭️ Command #3. cd

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

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

    cd /home/user/Documents

    Note:

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

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

    ⏹️ Group #2. Preparing

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

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

    Note:

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

    .

    📂 Command #4. mkdir

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

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

    mkdir new_folder

    .

    🚮 Command #5. rmdir

    rmdir (remove directory) ใช้ลบ folder

    เช่น ลบ folder “new_folder”:

    rmdir new_folder

    Note:

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

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

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

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

    .

    ✋ Command #6. touch

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

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

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

    touch new_file.txt

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

    touch new_file_1.txt new_file_2.txt new_file_3.txt

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

    touch new_file.txt

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

    .

    📋 Command #7. cp

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

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

    cp new_file.txt copy_of_new_file.txt

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

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

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

    cp new_file.txt /home/user/Documents

    Note:

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

    .

    📤 Command #8. mv

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

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

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

    mv new_file.txt my_file.txt

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

    mv new_file.txt /home/user/Documents

    Note:

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

    .

    🗑️ Command #9. rm

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

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

    rm my_file.txt

    Note:

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

    👀 Group #3. Inspecting

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

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

    .

    🐈 Command #10. cat

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

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

    cat small_file.txt

    ผลลัพธ์:

    .

    ⬇️ Command #11. less

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

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

    less large_file.txt

    ผลลัพธ์:

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

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

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

    .

    🗿 Command #12. head

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

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

    head large_file.txt

    ผลลัพธ์:

    Note:

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

    .

    🐒 Command #13. tail

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

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

    tail large_file.txt

    ผลลัพธ์:

    Note:

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

    🆕 Group #4. Analysing

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

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

    .

    🪝 Command #14. wc

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

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

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

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

    wc large_file.txt

    ผลลัพธ์:

    178     523    3703 large_file.txt

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

    wc -w large_file.txt

    ผลลัพธ์:

    523 large_file.txt

    .

    ✂️ Command #15. grep

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

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

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

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

    grep "@support.com" emails.txt

    ผลลัพธ์:

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

    Note:

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

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

    .

    📎 Command #16. cut

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

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

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

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

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

    cut -d , -f 5 people.csv

    ผลลัพธ์:

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

    .

    🗂️ Command #17. paste

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

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

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

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

    paste people.csv job_levels.txt

    ผลลัพธ์:

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

    .

    ☘️ Command #18. sort

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

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

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

    sort -r emails.txt

    ผลลัพธ์:

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

    .

    ☝️ Command #19. uniq

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

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

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

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

    uniq fruits.txt

    ผลลัพธ์:

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

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

    .

    ♣️ Command #20. Wildcards

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

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

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

    ls file?.txt

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

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

    ls *.txt

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

    ls 202[45].txt

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

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

    ls backup.{csv,txt}

    🔗 Group #5. Chaining

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

    1. |
    2. >
    3. >>

    .

    ⛓️ Command #21. |

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

    A | B

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

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

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

    ผลลัพธ์:

    apple 🍎
    banana 🍌
    grape 🍇
    orange 🍊

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

    .

    ⚡ Command #22. >

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

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

    ls > file_list.txt

    ผลลัพธ์:

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

    Note:

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

    .

    🃏 Command #23. >>

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

    ls >> file_list.txt

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

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

    🤖 Group #6. Automating

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

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

    .

    🔉 Command #24. =

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

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

    name="Gojo"

    .

    🥠 Command #25. echo

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

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

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

    echo name

    ผลลัพธ์:

    name

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

    echo $name

    ผลลัพธ์:

    Gojo

    .

    ➰ Command #26. for

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

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

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

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

    .

    📃 Command #27. bash

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

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

    ls

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

    bash script.sh

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

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

    .

    🗒️ Command #28. nano

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

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

    nano script.sh

    ผลลัพธ์:

    Note:

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

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

    💡 Group #7. Getting Unstuck

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

    1. history
    2. !
    3. man

    .

    🏛️ Command #29. history

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

    history

    ผลลัพธ์:

    .

    🕯️ Command #30. !

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

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

    !71

    ผลลัพธ์:

    apple 🍎
    banana 🍌
    grape 🍇
    orange 🍊

    .

    ❓ Command #31. man

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

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

    man ls

    ผลลัพธ์:


    💪 Summary

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

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

    1. pwd
    2. ls
    3. cd

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

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

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

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

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

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

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

    1. |
    2. >
    3. >>

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

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

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

    1. history
    2. !
    3. man

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


    😺 GitHub

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


    📖 Further Reading

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


    📄 References

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

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

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

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

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


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

    Data Viz & Its Values

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

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

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

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

    Anscombe’s Quartet

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

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

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

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

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

    Data viz ของ Anscombe’s Quartet

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

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


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

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

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

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

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


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

    .

    (1) Histogram

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

    Categorical variable

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

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

    ตัวอย่าง:

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

    .

    (2) Box Plot

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

    Categorical variable

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

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

    ตัวอย่าง:

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


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

    .

    (1) Scatter Plot

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

    1 continuous x 1 continuous variable

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

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

    ตัวอย่าง:

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

    .

    (2) Line Plot

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

    1 continuous x 1 continuous variable

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

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

    ตัวอย่าง:

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

    .

    (3) Bar Plot

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

    1 categorical x 1 continuous variable

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

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

    ตัวอย่าง:

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

    .

    (4) Dot Plot

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

    1 categorical x 1 continuous variable

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

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

    ตัวอย่าง:

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


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

    .

    (1) Pair Plot

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

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

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

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

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

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

    ตัวอย่าง:

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

    .

    (2) Heatmap

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

    Continuous variables

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

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

    ตัวอย่าง:

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

    .

    (3) Parallel Coordinates Plot

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

    Continuous variables เท่านั้น

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

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

    ตัวอย่าง:

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


    Caution: Pie Chart

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

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

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

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

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


    สรุป

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

    Book a room

    เป็น …

    Check availability

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

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

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


    Microcopy: How-to

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

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

    UX Writing Principles

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

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

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

    .

    Principle #1: Clear

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

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

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

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

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

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

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

    .

    Principle #2: Concise

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

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

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

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

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

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

    .

    Principle #3: Useful

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

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

    • “TRY AGAIN”
    • “RECOVER PASSWORD”

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

    .

    Principle #4: On Brand

    Principle #4: On Brand

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

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

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

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

    [Give it another shot!]

    [Lost your password pal?]

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

    Incorrect password. Please verify your entry.

    [Retry]

    [Recover password]

    .

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

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

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

    Microcopy Patterns

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

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

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

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


    Pattern #1: Title

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

    .

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

    .

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

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

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

    .

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

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

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

    .

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

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

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

    .

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

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

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


    Pattern #2: Button

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

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

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

    .

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

    .

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

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

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

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

    .

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

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

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


    Pattern #3: Error Message

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

    .

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

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

    .

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

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

    .

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

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

    .

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

    .

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

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

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

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

    .

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

    เช่น error message ของ Instagram

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

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

    .

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

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

    .

    Pro tips:

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

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

    1. ประโยคคำสั่ง เช่น “ต้องกรอกข้อมูลนี้” vs “โปรดกรอกข้อมูลนี้”
    2. ศัพท์เทคนิค เช่น “Authentication error” vs “Wrong password”
    3. คำที่สื่อถึงความผิดพลาด เช่น “เกิดข้อผิดพลาดในระบบ” vs “ระบบไม่สามารถตอบสนองได้ในขณะนี้ กรุณาลองใหม่อีกครั้ง”

    Pattern #4: Confirmation Message

    Confirmation message เป็น microcopy ที่เกิดขึ้นหลังจาก user ทำ action บางอย่างแล้ว และทำให้ user รู้ว่า action ที่ทำไปสำเร็จไปได้ด้วยดี

    .

    การเขียน confirmation message ทำได้ง่าย ๆ ด้วยสูตร object + V3 เช่น

    “Song removed” หรือ “ย้ายเพลงออกจากเพลย์ลิสต์”

    “Message sent” หรือ “ส่งข้อความสำเร็จ”

    “File moved to trash” หรือ “ไฟล์ถูกย้ายไปถังขยะ”

    ตัวอย่าง confirmation message เมื่อลบไฟล์ใน Google Drive

    .

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

    • “ส่งข้อความสำเร็จ ทีมงานจะติดต่อกลับภายใน 7 วัน”
    • “ไฟล์ถูกย้ายไปถังขยะ คุณสามารถกู้ไฟล์คืนได้ภายใน 30 วัน”
    • “ย้ายเพลงออกจากเพลย์ลิสต์ คุณสามารถเพิ่มเพลงใหม่ตลอดเวลา”

    Pattern #5: Text-Input Field

    Text-input field เป็น microcopy ที่อยู่กับกล่องกรอกข้อมูล และมีหน้าที่ช่วยให้ user กรอกข้อมูลได้สะดวก ถูกต้อง และครบถ้วน

    .

    Text-input field ประกอบด้วย 4 ส่วน ได้แก่

    .

    ส่วนที่ 1. Title หรือ ชื่อข้อมูลที่ต้องกรอก:

    • การเขียน: บอก user ว่าข้อมูลที่ต้องกรอกในช่องนี้คืออะไร
    • ตัวอย่าง: “อีเมล” หรือ “เบอร์โทรศัพท์”

    .

    ส่วนที่ 2. Instruction หรือ คำชี้แจงในการกรอก:

    • การเขียน: บอก user ว่าต้องกรอกอะไร
    • ตัวอย่าง: “กรอกอีเมลที่ต้องการรับข่าวสาร” หรือ “กรอกเบอร์โทรศัพท์ที่ต้องการใช้ลงทะเบียนบัญชี”

    .

    ส่วนที่ 3. Hint หรือ ตัวช่วยในการกรอก:

    • การเขียน: เขียนตัวอย่าง หรือรูปแบบการกรอก เพื่อให้ user รู้ว่าต้องกรอกข้อมูลที่ถูกต้องยังไง
    • ตัวอย่าง: “example@domain.com” หรือ “09-xxxx-xxxx”

    .

    ส่วนที่ 4. Guidance หรือ เงื่อนไขในการกรอก:

    • การเขียน: เขียนระบุเงื่อนไขการกรอกให้ชัดเจน
    • ตัวอย่าง: “กรอกอีเมลส่วนตัวเท่านั้น” หรือ “กรอกเบอร์โทรศัพท์ 10 หลัก”

    .

    เราสามารถใช้องค์ประกอบทั้งสี่ส่วนในการสร้าง text-input field ที่ทำให้ user อยากกรอก form และ engage กับเว็บไซต์ของเราได้


    Pattern #6: Empty State

    Empty state หมายถึง microcopy ในหน้าเว็บที่ว่างเพราะยังไม่มีข้อมูล หรือโหลดข้อมูลไม่สำเร็จ

    .

    จุดประสงค์ของ empty state คือ เพื่อให้ user รู้ว่าในหน้านี้ควรจะมีข้อมูลอะไร

    .

    Empty state มี 4 ประเภท คือ

    1. First use หรือ หน้าว่าง เพราะเป็นการใช้งานครั้งแรก
    2. Clear หรือ หน้าว่างจากการลบข้อมูล
    3. No results หรือ หน้าว่าง เพราะไม่พบข้อมูลค้นหา
    4. 404 error หรือ หน้าว่าง เพราะหาหน้าที่ต้องการไม่เจอ

    .

    การเขียนของ first use, no results, 404 error มีองค์ประกอบเหมือนกัน คือ

    1. Title แจ้งว่า หน้านี้ควรมีข้อมูลอะไร
    2. Description แจ้งว่า ทำไมหน้าถึงว่างเปล่า
    3. Call to action ชวนให้ user ทำ action บางอย่าง
    4. Button เพื่อให้ user ทำ action ได้

    .

    ตัวอย่าง pattern นี้ ที่เห็นได้ทั่วไป คือ Google Search เวลาที่ไม่พบสิ่งที่เราต้องการค้นหา

    Note: Google Search ไม่มี button เพราะ user สามารถใช้ search bar ด้านบนได้

    .

    ส่วน clear ให้เขียนแค่ …

    1. Title
    2. Description

    เพราะ clear เป็นหน้าว่างที่เกิดจากความตั้งใจของ user เอง เช่น user ลบอีเมลทั้งหมดจาก inbox เราไม่จำเป็นต้องมี call to action กับ button เพื่อชวนให้ user หาอีเมลมาเติม inbox ให้เต็มอีกครั้ง

    ตัวอย่างเช่น หน้า inbox ของ Outlook เมื่อเราเคลียร์อีเมลจนหมด:

    รูปจาก https://amrabed.medium.com/enjoy-your-empty-inbox-191307c6b0a7

    Pattern #7: Waiting Time

    Waiting time เป็น microcopy ที่แสดงระหว่างการเปลี่ยนหน้าหรือรอเว็บประมวลผลข้อมูล และเอื้อให้ user รู้ว่า ระบบกำลังทำงานอยู่

    .

    การเขียน: ใช้ V-ing เช่น

    • “Submitting” หรือ “กำลังส่ง”
    • “Removing …” หรือ “กำลังลบ …”

    .

    Pro tips

    ในระหว่างรอ เราสามารถเพิ่มคุณค่าให้กับ waiting time ได้โดย …

    • บอกว่า เว็บกำลังทำอะไรอยู่ เพื่อให้ user มีส่วนร่วมในการระหว่างรอ โดยการบอกว่า เช่น Gmail ที่เขียนว่า “กำลังโหลดข้อความของคุณ …” แทนการเขียนว่า “กำลังโหลด …” เพื่อให้ user รู้สึกว่า สิ่งที่รอเกี่ยวข้องกับตนเอง
    • เราสามารถนำเสนอข่าวสารหรือข้อมูล เช่น fun fact, product ตัวใหม่, หรือการใช้งาน feature ต่าง ๆ ให้กับ user ได้ ตัวอย่างเช่น Duolingo ที่ให้ fun fact ระหว่างรอโหลดบทเรียน

    Recap

    Microcopy เป็นคำเล็ก ๆ ที่อยู่บนหน้าเว็บของเรา ซึ่งไม่เพียงแต่ช่วยให้ user ใช้งานได้ แต่ยังสร้าง engagement ให้กับ user ได้ด้วย

    การจะสร้าง microcopy ที่ดี จะต้องมีความเข้าใจ 2 อย่าง คือ

    1. หลักการ UX writing (4 ข้อ)
      1. Clear
      2. Concise
      3. Useful
      4. On Brand
    2. Microcopy patterns (7 รูปแบบ)
      1. Title
      2. Button
      3. Error message
      4. Confirmation message
      5. Text-input field
      6. Empty state
      7. Waiting time

    Tips ส่งท้าย

    Tip #1 – Start microcopy early: การเขียน microcopy ควรเริ่มพร้อม ๆ กับตอนออกแบบเว็บไซต์ เพื่อที่เราจะได้จัดวาง element และคำให้เข้ากัน และหลีกเลี่ยงความไม่ลงตัว เช่น ปุ่มสั้นกว่าคำ หรือคำยาวกกว่ากล่อง

    .

    Tip #2 – Conversational writing: เวลาร่าง microcopy ให้ลองคิดว่า ถ้าเราคุยกับ user เราจะพูดว่ายังไง และ user จะตอบว่าอะไร แล้วนำการสนทนามาแปลงเป็น microcopy

    เช่น …

    เรา: สวัสดีครับ ยินดีต้อนรับ

    user: สวัสดีค่ะ

    เรา: วันนี้มีอะไรให้ช่วยบ้างครับ?

    user: อยากรู้ว่า เคยทำ project อะไรมาบ้าง

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

    user: แล้วประสบการณ์การทำงานละ

    เรา: จะเป็นทางนี้เลยครับ ผมเคยทำงาน …

    จาก role-play นี้ เราอาจแปลงบทสนทนาให้เป็นหน้าเว็บและ microcopy ในเว็บได้แบบนี้:

    Note: ถ้าจะให้ดี การ role-play ควรใช้ persona ของเราและ user ที่เราอยากจะดึงดูดเข้ามาในเว็บของเรา เพื่อให้ microcopy ที่ได้สะท้อน brand ของเรา และดึงดูด user มากที่สุด


    Further Reading

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

    1. Microcopy: The Complete Guide โดย Kinneret Yifrah และ Jacqui Licht
    2. Strategic Writing for UX: Drive Engagement, Conversion, and Retention with Every Word โดย Torrey Podmajersky
  • เล่นกับข้อมูลง่าย ๆ ด้วย 5 functions จาก dplyr: วิธีใช้งาน dplyr เบื้องต้น พร้อมตัวอย่างการทำงานกับข้อมูล HR

    เล่นกับข้อมูลง่าย ๆ ด้วย 5 functions จาก dplyr: วิธีใช้งาน dplyr เบื้องต้น พร้อมตัวอย่างการทำงานกับข้อมูล HR

    1. 💻 ภาษา R
    2. 🔢 dplyr: Library สำหรับหมุนข้อมูล
    3. 🧑‍💼 ตัวอย่างข้อมูล HR
    4. ✍️ Pattern การเขียน Function
    5. 1️⃣ Function #1: select()
    6. 2️⃣ Function #2: filter()
    7. 3️⃣ Function #3: arrange()
    8. 4️⃣ Function #4: summarise()
    9. 5️⃣ Function #5: mutate()
    10. 🫂 Put Everything Together: Pipe Operator
    11. 🔥 สรุป 5 Functions จาก dplyr
    12. 💪 Try It Yourself
    13. 📚 อ่านเพิ่มเติมเกี่ยวกับ dplyr
    14. ✅ R Book for Psychologists: หนังสือภาษา R สำหรับนักจิตวิทยา

    💻 ภาษา R

    R เป็นภาษาคอมพิวเตอร์ที่ออกแบบมาเพื่อทำงานกับ data เหมาะกับสายงานที่ต้องทำงานกับ data เช่น

    • Researcher ที่ต้องการวิเคราะห์ลักษณะกลุ่มตัวอย่าง เช่น จำนวนตัวอย่างแบ่งตามเพศ หรือช่วงอายุ
    • Data analyst ที่ต้องการหา insight จากข้อมูลขององค์กร เช่น วิเคราะห์แนวโน้มทางธุรกิจ
    • Sale ที่ต้องการวิเคราะห์ข้อมูลการขาย เช่น จำนวนลูกค้า ยอดขาย และกำไร
    • หรือแม้แต่ HR ที่ต้องการทำข้อมูลพนักงาน เช่น วิเคราะห์ performance, engagement, และ job satisfaction

    🔢 dplyr: Library สำหรับหมุนข้อมูล

    R มี built-in functions และ libraries หลากหลายที่รองรับการทำงานกับ data ในรูปแบบต่าง ๆ ซึ่งหนึ่งใน libraries ที่นิยมใช้กัน ได้แก่ dplyr

    dplyr เป็น library ที่ออกแบบมาเพื่อ data transformation หรือการแปลงข้อมูล ช่วยให้การทำงานกับ data ง่ายขึ้น เมื่อเทียบกับ built-in functions

    Use case ของ dplyr เช่น:

    • สำรวจข้อมูล (data exploration)
    • ทำความสะอาดข้อมูล (data cleaning)
    • วิเคราะห์ข้อมูล (data analysis)

    .

    ในบทความนี้ เราจะไปทำความรู้จักกับ 5 functions พื้นฐานของ dplyr ที่ใช้ทำงานกับข้อมูลกัน ซึ่งได้แก่:

    1. select()
    2. filter()
    3. arrange()
    4. summarise() หรือ summarize() (เขียนได้ทั้งสองแบบ)
    5. mutate()

    🧑‍💼 ตัวอย่างข้อมูล HR

    ในบทความนี้ เราจะใช้ชุดข้อมูลจำลอง hr_data เพื่อช่วยอธิบายการใช้งาน 5 functions ของ dplyr

    hr_data ช่วยจำลองสถานการณ์ของ HR ที่ต้องวิเคราะห์ข้อมูลพนักงาน เพื่อหาวิธีแก้ปัญหาพนักงานลาออก (attrition)

    โดย hr_data ประกอบด้วย 8 ตัวแปร:

    No.ColumnData
    1IDรหัสพนักงาน
    2Nameชื่อพนักงาน
    3Departmentแผนก
    4Ageอายุ
    5Engagementคะแนนการมีส่วนร่วม (1 ถึง 100)
    6YearsAtCompanyอายุงาน
    7AttritionRiskความเสี่ยงที่จะลาออก (Low, Medium, High)
    8Salaryเงินเดือน

    Code ในการสร้างและเรียกดู hr_data:

    # Create the dataset
    hr_data <- data.frame(
      ID = 1:15,
      Name = c("Alice", "Bob", "Carol", "David", "Eve", "Frank", "Grace", 
               "Henry", "Ivy", "Jack", "Karen", "Liam", "Mona", "Nate", "Olivia"),
      Department = c("HR", "IT", "Finance", "HR", "Sales", "IT", "Finance", 
                     "Sales", "IT", "HR", "Finance", "Sales", "IT", "HR", "Sales"),
      Age = c(34, 29, 45, 50, 27, 30, 42, 35, 31, 40, 38, 28, 33, 55, 26),
      Engagement = c(85, 70, 65, 55, 90, 75, 60, 88, 80, 50, 68, 72, 78, 40, 95),
      YearsAtCompany = c(5, 2, 15, 25, 1, 3, 10, 7, 4, 20, 12, 1, 6, 30, 0),
      AttritionRisk = c("Low", "Medium", "High", "High", "Low", "Medium", "High", 
                        "Low", "Medium", "High", "High", "Low", "Medium", "High", "Low"),
      Salary = c(55000, 60000, 70000, 75000, 50000, 62000, 68000, 58000, 
                 61000, 77000, 72000, 51000, 64000, 80000, 49000)
    )
    
    # View the dataset
    hr_data
    

    ผลลัพธ์:


    ✍️ Pattern การเขียน Function

    แม้ว่าทั้ง 5 functions จะมีหน้าที่แตกต่างกัน แต่มีการเรียกใช้งานที่เหมือนกัน:

    func(dataset,
         condition)
    • func = ชื่อ function เช่น select, filter, arrange
    • dataset = ชุดข้อมูลที่เป็น input
    • condition = เงื่อนไขในการใช้งานทำงานของ function

    1️⃣ Function #1: select()

    select() ใช้เลือก column ข้อมูลที่ต้องการ

    ตัวอย่าง:

    ผู้บริหารต้องการข้อมูลที่มีแค่รายชื่อพนักงาน แผนก และคะแนนการมีส่วนร่วม

    เราสามารถใช้ select() เลือกเฉพาะ column ที่ต้องการได้:

    # Select only desired columns
    select(hr_data,
           Name,
           Department,
           Engagement)
    

    ผลลัพธ์:

    .

    Note:

    เวลาเลือก column ด้วย select() เราสามารถกำหนดลำดับของ column ที่จะมาแสดงได้ เช่น ต้องการแสดง Department ก่อน Name ก็ให้เขียน Department, Name

    .

    dplyr มี helper function ที่ช่วยในการเลือก column ให้ง่ายขึ้น เช่น:

    FunctionMeaning
    starts_with()เลือก column ที่เริ่มด้วย x
    ends_with()เลือก column ที่ลงท้ายด้วย x
    contains()เลือก column ที่มีคำว่า x
    matches()เลือก column ที่ตรงกับ regular expression
    last_col()เลือก column สุดท้ายในชุดข้อมูล
    ~เลือกทุก column ยกเว้น column ที่ระบุ

    .

    เราสามารถตั้งชื่อ column ใหม่ได้ ด้วยใช้ = เช่น FullName = Name เพื่อให้หัว column แสดงคำว่า Fullname แทน Name


    2️⃣ Function #2: filter()

    filter() ใช้เลือก row ที่ตรงกับเงื่อนไขที่กำหนดมาแสดง

    ตัวอย่าง:

    ผู้บริหารต้องการข้อมูลพนักงานที่ความเสี่ยงที่จะลาออกสูง

    เราสามารถใช้ filter() เพื่อกำหนดเงื่อนไขเพื่อกรองข้อมูลออกมาได้:

    # Filter for high attrition risk
    filter(hr_data,
           AttritionRisk == "High")
    

    ผลลัพธ์:

    .

    Note:

    เราสามารถใช้ boolean operator และ comparison operator ร่วมได้:

    OperatorMeaning
    ==เท่ากับ
    !=ไม่เท่ากับ
    >มากกว่า
    <น้อยกว่า
    &and
    |or
    !not

    เช่น:

    ผู้บริหารต้องการข้อมูลพนักงานที่ความเสี่ยงที่จะลาออกสูง ในแผนกการเงิน (Finance)

    # Filter for high attrition risk in Finance
    filter(hr_data,
           AttritionRisk == "High" & Department == "Finance")
    

    ผลลัพธ์:


    3️⃣ Function #3: arrange()

    arrange() ใช้เรียงข้อมูลตามเงื่อนไข

    ตัวอย่าง:

    ผู้บริหารอยากได้ข้อมูลพนักงานเรียงจากคะแนนการมีส่วนร่วม

    เราสามารถใช้ arrange() จัดลำดับตาม column ที่ต้องการได้:

    # Sort employees by engagement
    arrange(hr_data,
            Engagement)
    

    ผลลัพธ์:

    .

    Note:

    Default ของ arrange() เป็นเรียงจากน้อยไปมาก (A-Z)

    ถ้าต้องการเรียงจากน้อยไปมาก (Z-A) ให้ใช้ desc() เช่น:

    # Sort employees by engagement, from high to low
    arrange(hr_data,
            desc(Engagement))
    

    ผลลัพธ์:


    4️⃣ Function #4: summarise()

    summarise() ใช้ย่อยข้อมูลให้น้อยลง ช่วยให้เข้าใจข้อมูลได้ง่ายขึ้น

    ตัวอย่าง:

    ผู้บริการต้องการรู้ค่าเฉลี่ยคะแนนการมีส่วนร่วม

    เราสามารถใช้ summarise() เพื่อหาค่าเฉลี่ยได้:

    # Calculate mean engagement
    summarise(hr_data,
              mean(Engagement))
    

    ผลลัพธ์:

    .

    Note:

    Functions ที่มักใช้กับ summarise() ได้แก่:

    FunctionMeaning
    mean()หาค่าเฉลี่ย
    min()หาค่าต่ำสุด
    max()หาค่าสูงสุด
    sd()หาค่าเบี่ยงเบนมาตรฐาน (standard deviation)
    n()นับจำนวนข้อมูล

    .

    summarise() มักใช้กับ group_by() เพื่อหาค่าสถิติตามกลุ่มข้อมูล เช่น หาค่าเฉลี่ยคะแนนการทำงานตามระดับความเสี่ยงในการลาออก:

    # Calculate mean engagement by attrition risk
    summarise(group_by(hr_data, AttritionRisk),
              mean(Engagement))
    

    ผลลัพธ์:

    .

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

    # Naming the output
    summarise(group_by(hr_data, AttritionRisk),
              AvgEng = mean(Engagement))
    

    ผลลัพธ์:


    5️⃣ Function #5: mutate()

    mutate() ใช้สำหรับสร้างข้อมูลใหม่จากข้อมูลที่มีอยู่แล้ว

    ตัวอย่าง:

    ผู้บริหารอยากรู้ว่า พนักงานแต่ละคนเหลือเวลาก่อนเกษียณอายุเท่าไร

    เราสามารถใช้ mutate() เพื่อสร้าง column ใหม่ที่แสดงจำนวนปีก่อนเกษียณได้:

    # Add a new column
    mutate(hr_data,
           YearsUntilRetirement = 60 - Age)
    

    ผลลัพธ์:

    จากผลลัพธ์ จะเห็นได้ว่า column ใหม่จะต่อท้ายสุด (ด้านขวาสุด)

    .

    Note:

    ถ้าต้องการเห็นแค่ข้อมูลใหม่ เราสามารถเปลี่ยน mutate() เป็น transmute() ได้

    โดยหลังจากได้ข้อมูลใหม่แล้ว transmute() จะทิ้งข้อมูลตั้งต้น และเก็บเฉพาะข้อมูลใหม่ไว้


    🫂 Put Everything Together: Pipe Operator

    เราจะเห็นความสามารถที่แท้จริงของ dplyr ได้เมื่อใช้งานทั้ง 5 functions ร่วมกัน โดยใช้ pipe operator: %>% หรือ |>

    Pipe operator เป็นสิ่งที่ช่วยส่ง output จาก function หนึ่งไปเป็น input ของ function ต่อไป

    เช่น จาก code หาค่าเฉลี่ยคะแนนการทำงานตามระดับความเสี่ยงในการลาออก ก่อนหน้านี้:

    # Calculate mean engagement by attrition risk
    summarise(group_by(hr_data, AttritionRisk),
              AvgEng = mean(Engagement))
    

    ถ้าใช้ pipe operator แล้ว จะเขียนได้แบบนี้:

    # Calculate mean engagement by attrition risk
    hr_data |>
      
      # Group by AttritionRisk
      group_by(AttritionRisk) |>
      
      # Calculate mean
      summarise(AvgEng = mean(Engagement))
    

    ซึ่ง code ทั้งสองชุดให้ผลลัพธ์ที่เหมือนกัน:

    แต่จะเห็นได้ว่า code ที่ใช้ pipe operator มีความชัดเจนและอ่านง่ายกว่า เพราะไม่จำเป็นต้องเขียน code ที่ซ้อนกันเป็นชั้น ๆ

    .

    ทีนี้ ถ้าเราใช้ pipe operator เพื่อรวมทั้ง 5 functions เข้าด้วยกันแล้ว จะทำให้เราใช้ข้อมูลเพื่อตอบคำถามที่ซับซ้อนขึ้นได้

    ตัวอย่าง:

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

    เราสามารถใช้ pipe operator ร่วมกัน group_by() + summarise() + arrange() เพื่อตอบโจทย์ได้:

    # Find employees with high attrition risk
    # and sort by tenure and salary
    hr_data |>
      
      # Filter for high attrition risk
      filter(AttritionRisk == "High") |>
      
      # Sort descending by tenure and salary
      arrange(desc(YearsAtCompany),
              desc(Salary))
    

    ผลลัพธ์:

    .

    หรือ

    ผู้บริหารต้องการรู้ว่า จำนวนพนักงานและค่าเฉลี่ยคะแนนการมีส่วนร่วมของแต่ละแผนก โดยเรียงแผนกจากค่าเฉลี่ยมากไปน้อย

    hr_data |> 
      
      # Group by department
      group_by(Department) |>
      
      # Calculate mean and count the number of employees
      summarise(AvgEng = mean(Engagement),
                EmpCount = n()) |>
      
      # Sort descending by average engagement
      arrange(desc(AvgEng))
    

    ผลลัพธ์:

    .

    หรือ

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

    hr_data |>
      
      # Group by department
      group_by(Department) |>
      
      # Count high attrition risk and find attrition risk ratio
      summarise(HighRiskCount = sum(AttritionRisk == "High"),
                TotalEmp = n(),
                HighRiskRatio = (HighRiskCount / TotalEmp) * 100) |>
      
      # Select desired columns
      select(Department, HighRiskRatio, TotalEmp, HighRiskCount) |>
      
      # Sort descending by high rish ratio
      arrange(desc(HighRiskRatio))
    

    ผลลัพธ์:


    🔥 สรุป 5 Functions จาก dplyr

    5 functions พื้นฐาน ของ dplyr เป็น functions ที่สามารถใช้ร่วมกันเพื่อทำงานกับข้อมูลต่าง ๆ เช่น ข้อมูลพนักงาน ได้อย่างมีประสิทธิภาพ

    No.FunctionExplain
    1select()เลือก column ที่ต้องการ
    2filter()เลือก row ที่ต้องการ
    3arrange()จัดลำดับข้อมูล
    4sumamrise()สรุปข้อมูล
    5mutate()แปลงข้อมูล

    Note: ใช้ %>% หรือ |> เพื่อเชื่อม functions เข้าด้วยกัน


    💪 Try It Yourself

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


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


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

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

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

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

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

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

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

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

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