R

สำหรับคนทำงานสาย IT ช่วงหลายปีหลังมานี้น่าจะไม่มีใครไม่เคยได้ยินคำว่าข้อมูลขนาดใหญ่ (big data) แม้หลายคนจะคิดว่าคำดังกล่าวเป็นเพียงแค่คำแฟชั่นเท่ๆ (buzzword) เท่านั้น แต่ก็ปฏิเสธไม่ได้ว่าโลก IT ก้าวมาถึงขั้นที่ให้ความสำคัญกับการขุดหาความรู้ (data mining) จากข้อมูลที่มีอยู่กันซักพักแล้ว

ส่วนก้าวต่อไปในโลก IT คงหนีไม่พ้นเครื่องจักรที่เรียนรู้ได้ (machine learning) และปัญญาประดิษฐ์ (artificial intelligence) การจะเข้าใจในศาสตร์เหล่านี้ได้ แค่เขียนโปรแกรมเป็นอย่างเดียวนั้นไม่เพียงพออีกต่อไป แต่ยังต้องรู้จักและจัดการกับข้อมูลเป็นอีกด้วย

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

ประวัติโดยย่อ

R เป็นภาษาแบบเปิดซอร์ซที่ได้รับแรงบันดาลใจมาจากภาษา S โดยมีจุดประสงค์สำหรับการคำนวณและนำเสนอกราฟิกทางสถิติ มันถูกสร้างและเผยแพร่เป็นครั้งแรกในปี 1993 โดย Ross Ihaka และ Robert Gentleman ปัจจุบันตัวภาษาเดินทางมาถึงรุ่นที่ 3.4 แล้ว

ด้วยความเฉพาะทางของมัน R จึงแตกต่างจากภาษาโปรแกรมสำหรับงานทั่วไป (general-purpose programming language) อย่างเช่น C, Python ถึงกระนั้น การจะเรียนรู้ R ก็ไม่จำเป็นต้องทิ้งความรู้จากภาษาอื่นๆ ไปเสียทั้งหมด เพียงแค่ให้ระวังความแตกต่างอันเป็นเอกลักษณ์จากภาษาใหม่นี้ก็พอแล้ว

ซึ่งเอกลักษณ์สำคัญอย่างหนึ่งของภาษา R ก็คือการเป็นภาษาโปรแกรมเชิงอาเรย์ (array language) ที่เน้นการคำนวณข้อมูลพร้อมกันเป็นกลุ่ม แนวคิดนี้อาจฟังดูแปลกและไกลตัว แต่อันที่จริงแล้วมันอาจเป็นเรื่องใกล้ตัวที่หลายคนเคยผ่านหูผ่านตาจนชินด้วยซ้ำ นั่นก็คือ การคำนวณเซลล์หลายเซลล์ด้วยสูตรเดียวกันบนโปรแกรม Excel นั่นเอง

เริ่มต้นใช้งานผ่าน REPL

สำหรับใครที่คุ้นเคยแต่กับการเขียนภาษาที่ต้องคอมไพล์ก่อน เช่น C, Java จะพบว่าการทดลองคำนวณเล็กน้อยๆ ก่อนการเขียนโปรแกรมจริงนั้นเป็นเรื่องที่ยุ่งยากพอสมควร ในภาษาแบบสคริปต์หลายๆ ภาษาจึงมักมีเครื่องมือคำนวณแบบโต้ตอบที่เรียกว่า REPL (read-eval-print loop) แถมมาให้ โดยเครื่องมือนี้มีหลักการทำงานง่ายๆ 3 ขั้นตอนตามชื่อของมัน คือ อ่านคำสั่ง คำนวณค่าตามคำสั่งนั้นๆ แล้วแสดงผลลัพธ์กลับมาให้ผู้ใช้งานเห็นทันที ก่อนจะวนกลับไปรออ่านคำสั่งถัดไปซ้ำเรื่อยๆ นั่นเอง

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

เราสามารถทดลองใช้ REPL ของภาษา R ได้ผ่านเว็บ R-Fiddle หรือ Jupyter ได้ทันที หรือถ้าใครติดตั้งโปรแกรมไว้ในเครื่องแล้ว ก็เพียงแค่เปิดโปรแกรม terminal/cmd ขึ้นมา พิมพ์ R (ใช้ตัวอักษรตัวใหญ่ ต่างจากคำสั่งโดยทั่วไปที่มักใช้ตัวเล็กทั้งหมด) แล้วกดปุ่ม <Enter>

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

> 1+1
[1] 2

สังเกตว่าที่ด้านหน้าของผลลัพธ์ (เลข 2) จะมีตัวเลขในวงเล็บปีกแข็ง ([1]) แสดงอยู่ นี่เป็นตัวเลขที่จะแสดงเฉพาะในโหมด REPL เท่านั้น มันมีไว้เพื่อช่วยให้เรานับได้อย่างสะดวกว่า ค่าผลลัพธ์ที่เห็นเป็นตัวแรกในแถวนี้เป็นผลลัพธ์ตัวที่เท่าไรจากผลลัพธ์ทั้งหมด

เราอาจทดลองคำนวณค่าอื่นๆ ด้วยตัวดำเนินการพื้นฐานทางคณิตศาสตร์ที่เราคุ้นเคยในภาษาทั่วไป อันได้แก่ บวก (+) ลบ (-) คูณ (*) หาร (/) หรือบางตัวก็แปลกกว่าภาษาอื่นบ้าง เช่น ยกกำลัง (^) หารเอาเศษ (%%) และหารปัดเศษทิ้ง (%/%) สังเกตว่า R จะมองว่าตัวเลขต่างๆ เป็นตัวเลขแบบจุดทศนิยมลอยตัว (floating point) โดยปริยาย ดังนั้นการคำนวณตัวเลขแปลกๆ มักจะไม่ส่งผลให้โปรแกรมต้องหยุดทำงานเนื่องจากมีข้อผิดพลาดเกิดขึ้น เช่น

> 1/0
[1] Inf

แต่นั่นก็ไม่ได้หมายความภาษา R จะเป็นภาษาที่เขียนโปรแกรมได้โดยไม่มีข้อผิดพลาดแต่อย่างใด เช่น ข้อผิดพลาดนี้ที่เกิดจากการพิมพ์คำสั่งผิด (syntax error)

> (1+)*3
Error: unexpected ')' in "(1+)"

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

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

help()           # หน้าแรกเอกสาร
help("+")        # เอกสารเกี่ยวกับการดำเนินการตัวเลขพื้นฐาน
help(numeric)    # เอกสารเกี่ยวกับข้อมูลประเภทตัวเลข

เมื่อต้องการออกจาก REPL สามารถพิมพ์ฟังก์ชัน q() จากที่ได้เกริ่นไปข้างต้นว่าการใช้งานโปรแกรม REPL นี้เปรียบได้ดั่งกระดาษทด โปรแกรมจะถามว่าเราต้องการเก็บบันทึกตัวแปรและคำสั่งต่างๆ บนกระดาษทดครั้งนี้ไว้เผื่อใช้ซ้ำในครั้งถัดไปหรือไม่ หากตอบว่าใช่ (y) ทุกครั้งนับจากนี้ที่เปิดโปรแกรม REPL จากตำแหน่งแฟ้มเดิมขึ้นมา เราจะสามารถเรียกใช้ตัวแปรที่เคยสร้างและย้อนดูคำสั่งที่เคยเรียกจากครั้งนี้ได้เสมอ

ตัวแปรและประเภทข้อมูล

แม้ภาษา R จะรับแนวคิดการเขียนโปรแกรมเชิงวัตถุ (object-oriented programming) ที่ทำให้เราสามารถดัดแปลงและสร้างประเภทข้อมูลชนิดใหม่ๆ ขึ้นมาได้ แต่โดยส่วนใหญ่เราจะวนเวียนอยู่กับข้อมูลพื้นฐานเพียงไม่กี่ประเภทเท่านั้น

การทดสอบว่าข้อมูลดังกล่าวถูกจัดอยู่ในประเภทใด สามารถใช้ฟังก์ชัน class() เพื่อตรวจสอบประเภทของข้อมูลนั้นได้ เช่น

> class("hello")
[1] "character"

แต่ก่อนที่เราจะไปดูว่าภาษา R มีประเภทข้อมูลที่น่าสนใจใดบ้าง จะขอกล่าวถึงเรื่องพื้นฐานที่น่าสนใจไม่แพ้กันอย่างการประกาศตัวแปรเสียก่อน

ประกาศตัวแปร

การประกาศตัวแปรในภาษา R จะใช้สัญลักษณ์ที่แตกต่างจากภาษาโปรแกรมโดยทั่วไป แต่ดูคุ้นเคยเมื่อเขียนเป็นสมการคณิตศาสตร์ ซึ่งก็คือสัญลักษณ์ลูกศรซ้าย (<-) นั่นเอง ดังเช่นตัวอย่างการประกาศตัวแปรเหล่านี้

> x <- 42
> y <- "We \u2764 R-lang"

อย่างไรก็ตาม R ยังยอมให้ใช้สัญลักษณ์เท่ากับ (=) เพื่อประกาศตัวแปรได้เช่นกัน (แม้หลายที่เช่น Google จะไม่แนะนำวิธีนี้) ความแตกต่างคือสัญลักษณ์เท่ากับถูกออกแบบมาเพื่อใช้ประกาศพารามิเตอร์/อาร์กิวเมนต์ของฟังก์ชันเป็นหลัก การใช้สัญลักษณ์ลูกศรซ้ายเพื่อประกาศพารามิเตอร์/อาร์กิวเมนต์ฟังก์ชันอาจทำให้โปรแกรมทำงานผิดพลาดได้

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

เราสามารถขอดูตัวแปรทั้งหมดที่เราสร้างขึ้นมาได้ผ่านฟังก์ชัน ls() และทำลายตัวแปร ได้ผ่านฟังก์ชัน rm()

ประเภทข้อมูลเดี่ยว

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

ข้อมูลตัวเลข

เนื่องจาก R เป็นภาษาที่เน้นการนำไปใช้งานทางสถิติเป็นหลัก การเก็บตัวเลขแบบจุดทศนิยมลอยตัว (ในภาษา R เรียกข้อมูลชนิดนี้ว่า numeric) จึงเป็นท่ามาตรฐานที่ R เลือกใช้ เพราะนำไปคำนวณต่อได้ง่าย อย่างไรก็ตาม R ยังมีข้อมูลตัวเลขอีกสองประเภทให้เลือกใช้เพิ่มเติมตามความเหมาะสมเช่นกัน ซึ่งก็คือ

  1. จำนวนเต็ม (integer) สร้างได้โดยเขียนห้อยตัว L ไว้ข้างหลังตัวเลข เช่น 100L จำนวนเต็มมีไว้สำหรับใช้ในงานที่ต้องการให้แน่ใจว่าการคำนวณต่างๆ เป็นแบบวิยุตคณิต (discrete mathematics) หรือใช้เพื่อบ่งบอกจำนวนการวนซ้ำ
  2. จำนวนเชิงซ้อน (complex) สร้างได้โดยเขียนห้อยตัว i ไว้ข้างหลังตัวเลข เช่น 1i, 3+4i จำนวนเชิงซ้อนมีไว้สำหรับงานทางด้านวิทยาศาสตร์-วิศวกรรมบางแขนง เช่น การคำนวณด้านแม่เหล็กไฟฟ้า พลศาสตร์ของไหล

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

ข้อมูลตัวอักษร

ภาษา R ไม่แบ่งแย่งข้อมูลตัวอักษรเป็นหลายระดับ (แบบภาษา C) แต่จะมองว่าตัวอักษรชุดหนึ่งไม่ว่าจะยาวเท่าใดคือหนึ่งข้อความเสมอ (แบบภาษา Python) และเรียกข้อมูลชนิดนี้ว่า character การประกาศข้อความสามารถใช้ได้ทั้งอัญประกาศเดี่ยว (') หรืออัญประกาศคู่ (") ล้อมรอบข้อความที่ต้องการโดยไม่มีความแตกต่างกันแต่อย่างใด

ข้อมูลตรรกะ

การแสดงข้อมูลตรรกะ (logical) ว่าถูกหรือผิด จะใช้คำว่า TRUE กับ FALSE ตามลำดับ ไม่สามารถใช้ตัวเลขทดแทนได้ อย่างไรก็ตาม หากต้องการประหยัดเวลาพิมพ์ในส่วนนี้ ก็สามารถป้อนแค่ตัวอักษรตัวแรก (T,F) เข้าไปได้เช่นกัน

R ยังมีข้อมูลตรรกะแบบพิเศษอีกตัวหนึ่งเพิ่มเข้ามา คือ ข้อมูลว่าง (NA) ซึ่งจะเกิดขึ้นเมื่อพยายามเข้าถึงข้อมูลในตำแหน่งที่ไม่มีข้อมูล หรือพยายามคำนวณค่าทั้งที่ไม่มีข้อมูลอยู่ หมายเหตุว่า R จะไม่ถือว่าเกิดข้อผิดพลาดขึ้นจนต้องหยุดการคำนวณ แต่อาจขึ้นคำเตือนบางครั้งเมื่อพยายามทำงานบนข้อมูลที่ไม่สมบูรณ์นี้

ประเภทข้อมูลชุด

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

เวกเตอร์

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

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

> x <- 1
> y <- c(2,3,4)
> z <- c(x,y)
> z
[1] 1 2 3 4

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

> class(z)
[1] "numeric"
> mix <- c(1,"a",NA,T)
> mix
[1] "1"    "a"    NA     "TRUE"
> class(mix)
[1] "character"

การเข้าถึงสมาชิกในเวกเตอร์ สามารถใช้สัญลักษณ์วงเล็บปีกแข็งล้อมรอบตัวเลขตำแหน่งที่ต้องการ โดย R จะเริ่มนับสมาชิกตัวแรกด้วยเลขหนึ่ง (one-based indexing) และการเข้าถึงสมาชิกตัวที่สูงเกินกว่าขนาดของเวกเตอร์จะได้ผลลัพธ์เป็นข้อมูลว่าง เช่นนี้

> z[3]
[1] 3
> z[10]
[1] NA
> length(z)
[1] 4

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

> z[c(2,4)]
[1] 2 4
> z[1:3]
[1] 1 2 3
> z[4:2]
[1] 4 3 2
> z[c(T,F,F,T)]
[1] 1 4
> z[c(T,F)]
[1] 1 3

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

> z - 1
[1] 0 1 2 3
> z * c(1,-1)
[1]  1 -2  3 -4
> z + c(4,5,6)
[1] 5 7 9 8
Warning message:
In z + c(4, 5, 6) :
  longer object length is not a multiple of shorter object length

ข้อมูลชุดสำหรับคำนวณทางคณิตศาสตร์

หากเราต้องการเก็บข้อมูลที่เทียบเท่ากับอาเรย์สองมิติในภาษาอื่น ภาษา R จะเรียกข้อมูลชนิดนั้นว่าเมทริกซ์ (matrix) การจะสร้างข้อมูลชนิดนี้ได้ต้องเตรียมข้อมูลให้อยู่ในรูปของเวกเตอร์เสียก่อน แล้วจึงค่อยเปลี่ยนประเภทข้อมูลเป็นเมทริกซ์ ดังนี้

> A <- matrix(z, nrow=2, ncol=2)
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> B <- matrix(z, nrow=2, ncol=2, byrow=TRUE)
     [,1] [,2]
[1,]    1    2
[2,]    3    4

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

> A[1,2]
[1] 3
> B[,2]
[1] 2 4
> A[2:1,2:1]
     [,1] [,2]
[1,]    4    2
[2,]    3    1

หากเรายังต้องการเก็บอาเรย์ที่มีมิติสูงขึ้นไปกว่านี้ ก็สามารถสร้างประเภทข้อมูลอาเรย์ได้ผ่านฟังก์ชัน array() โดยระบุขนาดในแต่ละมิติเข้าไป

> array(1:24, c(4,3,2,1))
, , 1, 1
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

, , 2, 1
     [,1] [,2] [,3]
[1,]   13   17   21
[2,]   14   18   22
[3,]   15   19   23
[4,]   16   20   24

สังเกตว่าการดำเนินการทางคณิตศาสตร์โดยใช้เครื่องหมายธรรมดาทั่วไป (+,-,*,/) จะเป็นการนำสมาชิกในข้อมูลทั้งสองชุดมาจับคู่กันตัวต่อตัวแล้วดำเนินการทางคณิตศาสตร์แบบธรรมดาเท่านั้น หากต้องการดำเนินการทางคณิตศาสตร์แบบเมทริกซ์ ต้องใช้เครื่องหมายคณิตศาสตร์สำหรับเมทริกซ์โดยเฉพาะ (เช่น การคูณเมทริกซ์ %*%) ดังตัวอย่างต่อไปนี้

> A * B
     [,1] [,2]
[1,]    1    6
[2,]    6   16
> A %*% B
     [,1] [,2]
[1,]   10   14
[2,]   14   20

กรอบข้อมูล

กรอบข้อมูล (data.frame) คือข้อมูลชุดแบบตารางเช่นเดียวกับตารางในฐานข้อมูล กล่าวคือ แต่ละหลักของตารางจะบอกว่าหลักนี้ใช้เก็บข้อมูลเรื่องใด ส่วนแต่ละแถวของตารางก็คือข้อมูลหนึ่งระเบียน (record) นั่นเอง

วิธีสร้างกรอบข้อมูล เริ่มจากการเตรียมข้อมูลแต่ละหลักด้วยเวกเตอร์ โดยตรวจสอบให้แน่ใจว่าเวกเตอร์ทุกตัวมีความยาวเท่ากัน แล้วจึงนำมารวมกันด้วยฟังก์ชัน data.frame() ดังนี้

> handle <- c("Sheldon","Leonard","Penny")
> year <- c(1980,1980,1985)
> iq <- c(187,173,NA)
> big.bang <- data.frame(handle, yob=year, iq)
> big.bang
   handle  yob  iq
1 Sheldon 1980 187
2 Leonard 1980 173
3   Penny 1985  NA

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

> big.bang[3,]
  handle  yob iq
3  Penny 1985 NA

ส่วนการเข้าถึงข้อมูลแต่ละหลัก สามารถใช้เครื่องหมาย $ แล้วตามด้วยชื่อของเขตข้อมูลที่ต้องการได้เลย ซึ่งก็คือ

> big.bang$yob
[1] 1980 1980 1985

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

> new.big.bang <- data.frame(row.names=handle, yob=year, iq)
> new.big.bang
         yob  iq
Sheldon 1980 187
Leonard 1980 173
Penny   1985  NA
> new.big.bang["Sheldon",]
         yob  iq
Sheldon 1980 187

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

> use <- new.big.bang$yob == 1980
> use
[1]  TRUE  TRUE FALSE
> new.big.bang[use,]
         yob  iq
Sheldon 1980 187
Leonard 1980 173

สถิติและความน่าจะเป็นอย่างรวบรัด

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

สิ่งสำคัญที่เรียกได้ว่าเป็นพระเอกของงานนี้ก็คือ "ข้อมูล" นั่นเอง หากขาดซึ่งข้อมูลแล้ว ไม่ว่าจะสร้างโมเดลทำนายความน่าจะเป็นมาดีขนาดไหนก็คงไร้ประโยชน์

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

นำเข้าข้อมูล

เนื่องจากการเข้าถึงไฟล์ข้อมูลทางสถิติต่างๆ ของประเทศไทยยังเป็นไปได้ยาก ตัวอย่างต่อไปนี้จะขอยืมข้อมูลจากต่างประเทศมาใช้ก่อน ซึ่งก็คือข้อมูลคะแนนเฉลี่ยของการสอบ SAT จากโรงเรียนระดับมัธยมในเมืองนิวยอร์ก (แนวคิดข้อสอบเทียบได้กับการสอบแอดมิชชั่นของไทย) โดยมีขั้นตอนดังนี้

เริ่มจากเข้าไปดาวน์โหลดข้อมูลดังกล่าวผ่าน Data.gov เลือกรูปแบบไฟล์ที่จะดาวน์โหลดเป็นแบบ CSV (comma separated values) เพื่อความสะดวกในการนำไปใช้ต่อ

เมื่อดาวน์โหลดไฟล์ดังกล่าวเสร็จสิ้น อาจทดสอบความถูกต้องของข้อมูลด้วยการเปิดไฟล์ดังกล่าวผ่านโปรแกรมจำพวกสเปรดชีต เช่น Microsoft Excel, Google Sheets, LibreOffice Calc หรือจะเปิดผ่านโปรแกรมแก้ไขข้อความทั่วไปก็ได้

ต่อไปจะอ่านข้อมูลเข้ามาใช้ใน R โดยคร่าวๆ แล้วสามารถทำได้ดังนี้ (สำหรับ Windows ใช้เครื่องหมาย / เพื่อคั่นระหว่างโฟลเดอร์เช่นเดียวกัน)

> data <- read.csv("PATH/TO/DOWNLOAD/SAT_Results.csv")

อย่างไรก็ตาม หากเราลองดูข้อมูลตัวเลขที่อ่านเข้ามา จะพบว่าในหลักเดียวกันนั้น บางแถวก็ยังมีตัวอักษร "s" ปนอยู่ด้วย หากยังพอจำกันได้ การมีข้อมูลตัวอักษรปนกับข้อมูลตัวเลขนั้น จะทำให้ข้อมูลตัวเลขถูกแปลงไปเป็นตัวอักษรทันที ซึ่งอาจส่งผลให้วิเคราะห์ผิดพลาดในภายหลัง นี่เป็นสิ่งที่เราสามารถหลีกเลี่ยงได้โดยระบุว่าตัวอักษร "s" หมายถึงข้อมูลในช่องนั้นหายไป (ข้อมูลชุดอื่นๆ อาจใช้ตัวอักษรระบุค่าที่หายไปแตกต่างกัน เช่น "-", "n/a" เป็นต้น)

> data <- read.csv("PATH/TO/DOWNLOAD/SAT_Results.csv",
                   na.strings="s")

นอกจากนี้แล้ว เรายังสามารถระบุเพิ่มเติมว่า ให้ใช้หลักแรกสุดเป็นกุญแจในการเข้าถึงข้อมูลในแถวนั้นๆ โดยเพิ่มอาร์กิวเมนต์ row.names เข้าไป

> data <- read.csv("PATH/TO/DOWNLOAD/SAT_Results.csv",
                   na.strings="s", row.names=1)

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

> data <- read.csv("PATH/TO/DOWNLOAD/SAT_Results.csv",
                   na.strings="s", row.names=1,
                   colClasses=c(rep("character",2), rep("numeric",4)))

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

> data <- na.omit(data)

ภาพรวมข้อมูลทางสถิติ

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

ตำแหน่งข้อมูล

ตำแหน่งข้อมูลจะแสดงว่าข้อมูลดังกล่าวมีตำแหน่งสำคัญๆ ตรงไหนบ้าง เช่น ค่ามากสุด/น้อยสุด ค่ากลางข้อมูล และควอร์ไทล์

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

  1. มัชฌิม (mean) หรือบางที่ก็เรียกว่าค่าเฉลี่ย (average) หาได้จากการนำทุกค่าในข้อมูลมาบวกรวมกัน แล้วจึงหารด้วยจำนวนข้อมูลที่ใช้
  2. มัธยฐาน (median) หาได้จากการเรียงข้อมูลจากน้อยไปมากตามลำดับ แล้วดูว่าที่ตำแหน่งตรงกลางของข้อมูลมีค่าเป็นเท่าใด
  3. ฐานนิยม (mode) หาได้จากการนับว่าค่าใดปรากฏซ้ำมากที่สุดในข้อมูล

ค่าทั้งสามนี้ไม่จำเป็นต้องมีค่าเท่ากัน ซึ่งก็ถือเป็นเรื่องปรกติเนื่องจากข้อมูลมักมีการกระจายตัวไม่สม่ำเสมอ

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

  1. ควอร์ไทล์ที่ 1 (1st quartile) คือค่าที่มีตำแหน่งอยู่ตรงกลางระหว่างค่าน้อยสุดและค่ามัธยฐาน
  2. ควอร์ไทล์ที่ 2 (2nd quartile) คือมัธยฐานนั่นเอง (และเรามักไม่ค่อยเรียกว่า "ควอร์ไทล์ที่ 2" เท่าใดนักเพราะสามารถเรียกชื่อที่พื้นฐานกว่าได้)
  3. ควอร์ไทล์ที่ 3 (3rd quartile) คือค่าที่มีตำแหน่งอยู่ตรงกลางระหว่างค่ามากที่สุดและค่ามัธยฐาน

ใน R เราสามารถเรียกฟังก์ชัน summary() เพื่อดูภาพรวมตำแหน่งข้อมูลต่างๆ เหล่านี้ได้ทันที เช่น

> summary(data$SAT.Math.Avg..Score)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  312.0   371.0   395.0   413.4   437.0   735.0 

สังเกตว่าผลลัพธ์ดังกล่าว ไม่ได้นำข้อมูลฐานนิยมมาแสดงด้วย เพราะโดยทั่วไปข้อมูลมักมีความแม่นยำของตำแหน่งทศนิยมสูงจนไม่มีข้อมูลชิ้นใดซ้ำกัน การหาฐานนิยมด้วยวิธีพื้นฐานมักไม่ให้ข้อสรุปที่เกิดประโยชน์เท่าไร

เราอาจเลี่ยงไปหาฐานนิยมด้วยการแบ่งข้อมูลเป็นช่วงๆ ผ่านฮิสโตแกรม ซึ่งจะกล่าวถึงในหัวข้อถัดไป

การกระจายข้อมูล

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

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

  • พิสัย (range) บอกถึงขนาดของช่วงที่เล็กที่สุดที่สามารถครอบคลุมข้อมูลได้ทั้งหมด คำนวณจากการนำค่ามากที่สุดลบน้อยที่สุดได้เลย
  • พิสัยระหว่างควอร์ไทล์ (interquartile range) คำนวณจากการนำค่าของควอร์ไทล์ที่ 3 ลบด้วยค่าของควอร์ไทล์ที่ 1 หรือกล่าวอีกนัยหนึ่งได้ว่า วิธีนี้คือเป็นหาพิสัยที่ครอบคลุมข้อมูลจำนวนครึ่งหนึ่งที่กระจายรอบมัธยฐานนั่นเอง

นอกจากนี้ ยังมีการวัดการกระจายข้อมูลอีกวิธีหนึ่งที่เป็นที่นิยม ซึ่งก็คือส่วนเบี่ยงเบนมาตรฐาน (standard deviation, สัญลักษณ์ σ) จุดเด่นของวิธีนี้คือการใช้ข้อมูลทุกตัวมาคำนวณ แทนที่จะอ้างอิงจากค่าสรุปทางสถิติเพียงไม่กี่ค่า (ขอละการอธิบายสมการเนื่องจากมีรายละเอียดค่อนข้างมาก) การวัดการกระจายด้วยวิธีนี้จะใช้ได้ผลดีที่สุดเมื่อข้อมูลมีรูปร่างเป็นการแจกแจงปรกติ (normal distribution) ซึ่งบอกเป็นนัยว่ามีข้อมูลที่อยู่ห่างจากค่าเฉลี่ยไม่เกิน ±1σ อยู่ถึง 68% อย่างไรก็ตาม ข้อมูลที่มีการแจกแจงรูปแบบอื่นจะไม่สามารถสรุปขนาดของการแจกแจงเช่นนี้ได้

ฟังก์ชันสำหรับคำนวณการกระจายข้อมูลในภาษา R ได้แก่

> range(data$SAT.Math.Avg..Score)
[1] 312 735
> IQR(data$SAT.Math.Avg..Score)
[1] 66
> sd(data$SAT.Math.Avg..Score)
[1] 64.68466

พล็อตข้อมูล

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

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

พล็อตประชันทุกเขตข้อมูล

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

การพล็อตประชันทุกเขตข้อมูล คือการจับเอาข้อมูลทุกๆ คู่ในแต่ละหลักของกรอบข้อมูลมาประชันกัน แล้วพล็อตแต่ละคู่ของข้อมูลแบบกระจาย (scatter plot) การพล็อตนี้สามารถทำได้ผ่านฟังก์ชันง่ายๆ คือ plot() ตัวอย่างต่อไปนี้จะยืมข้อมูลดอกไอริสของ Edgar Anderson มาใช้ โดยข้อมูลดังกล่าวสามารถเรียกใช้งานได้ทันทีเลยในภาษา R โดยไม่ต้องโหลดไลบรารีใดเพิ่ม

> iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
...
150          5.9         3.0          5.1         1.8  virginica
> plot(iris)

ภาพที่ 1: พล็อตประชันทุกเขตข้อมูลของข้อมูลดอกไอริส

พล็อตกระจาย (Scatter Plot)

จากภาพที่ 1 เราอาจเริ่มต้นให้ความสนใจที่ความยาวกลีบดอก (Petal.Length) ต่อความกว้างกลีบดอก (Petal.Width) เนื่องจากเมื่อดูอย่างหยาบๆ แล้วน่าจะสร้างโมเดลได้ง่ายที่สุด เราจะเลือกพล็อตกระจายโดยใช้เขตข้อมูลเพียง 2 เขตนี้เท่านั้น เพื่อความสะดวกเราจะบอก R ก่อนว่ากำลังใช้ข้อมูลชุดใดเป็นหลักผ่านฟังก์ชัน attach() แล้วจึงสั่งพล็อตแบบเฉพาะเจาะจงด้วยสมการดังนี้

> attach(iris)
> plot(Petal.Width ~ Petal.Length)

ภาพที่ 2: พล็อตกระจายข้อมูลดอกไอริส โดยสนใจความกว้างต่อความยาวกลีบดอก

หมายเหตุว่า Petal.Width ~ Petal.Length ไม่ใช่การนำตัวแปรสองตัวมาดำเนินการกันแต่อย่างใด แต่มันคือการประกาศตัวแปรแบบสมการในภาษา R ที่มีความมหัศจรรย์ตรงที่ไม่ต้องใช้เครื่องหมายอัญประกาศมาครอบเพื่อบอกขอบเขตของสมการเฉกเช่นการประกาศข้อความ

อนึ่ง ในอนาคตเมื่อไม่ต้องการใช้ข้อมูลชุดนี้แล้ว (เช่น หลังจบหัวข้อนี้) ควรเรียกฟังก์ชัน detach() ในทำนองเดียวกันกับที่เรียก attach() ทุกครั้ง เพื่อไม่ให้เกิดความสับสนจากการที่มีข้อมูลจำนวนหลายชุดมากเกินกว่าที่ต้องการใช้งาน และเพื่อป้องกันกรณีที่มีข้อมูลต่างชุดกันแต่ใช้ชื่อเขตข้อมูลซ้ำกัน

ลากโมเดลเชิงเส้น

จากภาพที่ 2 เราอาจต้องการหาโมเดลเชิงเส้นของข้อมูลดังกล่าว เพื่อทำนายแนวโน้มว่าหากมีข้อมูลใหม่ๆ เพิ่มขึ้นมา ควรคาดหวังว่าข้อมูลเหล่านั้นจะเกิดบริเวณไหน การคำนวณดังกล่าวสามารถทำได้ผ่านฟังก์ชัน lm() ดังนี้

> lm(Petal.Width ~ Petal.Length)
Call:
lm(formula = Petal.Width ~ Petal.Length, data = iris)

Coefficients:
 (Intercept)  Petal.Length  
     -0.3631        0.4158  

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

> plot(Petal.Width ~ Petal.Length)
> abline(lm(Petal.Width ~ Petal.Length))

ภาพที่ 3: โมเดลเชิงเส้นของความกว้างต่อความยาวกลีบดอก

ลากโมเดลไม่เชิงเส้น

อย่างไรก็ตาม หากข้อมูลที่สนใจมีแนวโน้มว่าจะไม่เป็นเชิงเส้น ภาษา R ก็มีวิธีการคำนวณโมเดลแบบต่างๆ ให้เลือกใช้ได้หลายวิธี สำหรับวิธีที่ง่ายต่อการเรียกใช้งานที่สุด คือการประมาณค่าถดถอยแบบท้องถิ่น (local regression หรือ LOESS) ซึ่งจะสร้างโมเดลสมการพหุนามโดยอาศัยข้อมูลแต่ละส่วนในบริเวณใกล้เคียงมาปรับค่า เราสามารถเรียกดูผลลัพธ์จุดตัดต่างๆ บนเส้นโค้งของโมเดลที่คำนวณได้ดังนี้

> loess.smooth(Petal.Length, Petal.Width)
$x
 [1] 1.000000 1.120408 1.240816 1.361224 1.481633
...
$y
 [1] 0.06892099 0.11545407 0.16200259 0.20869061 0.25544166
...

ส่วนการพล็อตเส้นโค้งดังกล่าว จะเปลี่ยนมาเรียกผ่านฟังก์ชัน lines() ที่จะลากเส้นตรงเชื่อมระหว่างจุดตัดต่างๆ ตามที่ระบุ แต่เนื่องจากเรามีจุดตัดที่คำนวณไว้เป็นจำนวนมาก จึงได้ผลลัพธ์ออกมาเปรียบเสมือนเส้นโค้งนั่นเอง

> plot(Petal.Width ~ Petal.Length)
> lines(loess.smooth(Petal.Length, Petal.Width))

ภาพที่ 4: โมเดลไม่เชิงเส้นของความกว้างต่อความยาวกลีบดอก

ขอให้สังเกตการสลับที่ของตัวแปร สำหรับบรรทัดบนที่ระบุสมการผ่านเครื่องหมาย ~ นั้น จะมีความหมายว่าฝั่งซ้ายของ ~ คือข้อมูลในแกนตั้ง หรืออาจมองเป็นสมการคณิตศาสตร์ที่คุ้นตาโดยเปลี่ยนเครื่องหมาย ~ เป็น = ในทำนองเดียวกันกับ y=x นั่นเอง ส่วนในบรรทัดล่างเนื่องจากเราไม่สามารถระบุสมการด้วยเครื่องหมาย ~ ได้ จึงต้องส่งค่าเข้าไปเป็นข้อมูลในแกนนอน (x) แล้วจึงตามด้วยแกนตั้ง (y) ตามลำดับ

ลากโมเดลอิสระจากสมการที่กำหนดเอง

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

> plot(Petal.Width ~ Petal.Length)
> curve(exp(x-4/3*pi), add=TRUE)

ภาพที่ 5: โมเดลจากสมการ ex-(4/3)π

จุดที่น่าสนใจคือเราสามารถเขียนสมการที่ประกอบขึ้นมาจากพจน์ x แล้วส่งเป็นอาร์กิวเมนต์แรกของฟังก์ชัน curve() ได้ตรงๆ โดยที่เราไม่จำเป็นต้องมีตัวแปร x มาก่อน (หรือหากมีตัวแปรนี้อยู่ มันจะไม่ถูกใช้ในการคำนวณนี้แต่อย่างใด) นี่เป็นอีกหนึ่งในความมหัศจรรย์ของภาษา R ที่พยายามเอาใจผู้ใช้ที่มีพื้นฐานมาจากฝั่งคณิตศาสตร์/สถิติ ซึ่งอาจจะดูผิดปรกติไปบ้างเมื่อเทียบกับภาษาคอมพิวเตอร์อื่นๆ

แต้มสีแยกกลุ่มข้อมูล

อนึ่ง จากข้อมูลตั้งต้นของดอกไอริส นอกจากจะมีข้อมูลเชิงตัวเลขที่บ่งบอกลักษณะดอกไม้แล้ว ยังมีข้อมูลการแบ่งกลุ่มดอกไม้ตามสปีชีส์อีกด้วย ซึ่งข้อมูลการแบ่งกลุ่มนี้อาจไม่เหมาะสมในการพล็อตเทียบกับข้อมูลตัวเลขซักเท่าไร (ดังจะเห็นได้จากแถวล่างสุด/แถบขวาสุดในภาพที่ 1) แต่จะเหมาะสมกว่าหากพล็อตข้อมูลตัวเลขเทียบกันเช่นเดิม แล้วเพิ่มการแบ่งกลุ่มเข้าไปเป็นอีกแกนหนึ่ง เช่น แต้มสีจุดของแต่ละกลุ่มให้แตกต่างกัน ซึ่งสามารถสั่งได้ดังนี้

> plot(Petal.Width ~ Petal.Length, col=Species)

ภาพที่ 6: ข้อมูลดอกไอริสโดยแยกสีตามสปีชีส์

ทั้งนี้ทั้งนั้น หากข้อมูลตั้งต้นไม่ได้ถูกแบ่งกลุ่มไว้ก่อน แต่เรายังต้องการจัดกลุ่มข้อมูลอยู่ อาจเลือกใช้วิธี k-means ในการแบ่งกลุ่มข้อมูล โดยมีหลักการคร่าวๆ ดังนี้

  1. สุ่มเลือกจุดศูนย์กลางของแต่ละกลุ่มมาทั้งหมด k จุด
  2. กำหนดว่าจุดข้อมูลต่างๆ อยู่ในกลุ่มใด โดยพิจารณาจากจุดข้อมูลนั้นอยู่ใกล้จุดศูนย์กลางใดมากที่สุด
  3. คำนวณย้ายค่าจุดศูนย์กลางของแต่ละกลุ่มให้เป็นค่าเฉลี่ยของทุกจุดข้อมูลในกลุ่ม
  4. ทำซ้ำขั้นตอนที่ 2-3 จนกว่าการจัดกลุ่มจะเสถียร

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

> group <- kmeans(iris[3:4], 3)
> plot(Petal.Width ~ Petal.Length, col=group$cluster)

ภาพที่ 7: ข้อมูลดอกไอริสที่จัดกลุ่มแยกสีด้วยวิธี k-means เป็นจำนวน 3 กลุ่ม

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

พล็อตข้อสรุปการแจกแจงข้อมูล

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

ฮิสโตแกรม (histogram)

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

> hist(Sepal.Width)

ภาพที่ 8: ฮิสโตแกรมความกว้างกลีบเลี้ยงดอกไอริส

จากภาพที่ 8 จะเห็นว่าแท่งที่สูงที่สุดคือแท่งที่ 5 จากทางซ้าย หรือเมื่อดูเป็นช่วงจะได้ว่าคือช่วงที่ข้อมูลมีค่ามากกว่า 2.8 แต่ไม่เกิน 3.0 ซึ่งจะได้ว่าช่วงนี้คือฐานนิยมนั่นเอง

เราสามารถเปลี่ยนจำนวนรอยต่อระหว่างช่วงที่ต้องการได้ ด้วยการระบุอาร์กิวเมนต์ breaks เพิ่มเข้าไปดังนี้

> hist(Sepal.Width, breaks=4)

ภาพที่ 9: ฮิสโตแกรมความกว้างกลีบเลี้ยงดอกไอริส โดยขีดเส้นแบ่งช่วง 4 ครั้ง

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

> hist(Sepal.Width, breaks=c(2,2.1,2.4,2.7,3.0,3.3,3.6,3.9,4.4))

ภาพที่ 10: ฮิสโตแกรมความกว้างกลีบเลี้ยงดอกไอริส โดยแบ่งขนาดช่วงไม่เท่ากัน

หากแต่ละแท่งในฮิสโตแกรมมีความกว้างไม่เท่ากัน (เช่น ในภาพที่ 10) แกนแนวตั้งในพล็อตจะไม่ได้แสดงจำนวนการเกิดของข้อมูลอีกต่อไปแล้ว แต่มันคือค่าความหนาแน่นของข้อมูลในแต่ละช่วงแทน โดยใช้กฎว่าพื้นที่ของสี่เหลี่ยมทุกแท่ง (ขนาดช่วงคูณความหนาแน่น) รวมกันจะต้องได้เท่ากับหนึ่งหน่วยเสมอ ดังนั้นหากเราขยายขนาดของช่วงโดยที่มันยังครอบคลุมข้อมูลได้เป็นจำนวนเท่าเดิม แท่งข้อมูลแทนช่วงนั้นก็จะมีความสูงลดลงไปนั่นเอง (เช่น ขยายขนาดของช่วงสุดท้ายจาก 3.9-4.4 ไปเป็น 3.9-5.0)

พล็อตกล่อง (box plot)

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

> boxplot(Sepal.Length)

ภาพที่ 11: พล็อตกล่องความกว้างกลีบเลี้ยงดอกไอริส

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

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

> boxplot(iris[1:4])

ภาพที่ 12: พล็อตกล่องข้อมูลตัวเลขทั้งหมดของดอกไอริส

การเปรียบเทียบการกระจายในภาพที่ 12 แสดงให้เห็นชัดว่า ความกว้างกลีบเลี้ยง (Sepal.Width) มีการกระจายตัวต่ำที่สุด และในทางกลับกัน ความยาวกลีบดอก (Petal.Length) ก็มีการกระจายตัวมากที่สุด นอกจากนี้มันยังบอกตำแหน่งข้อมูลได้อีกด้วยว่า ความยาวกลีบเลี้ยง (Sepal.Length) มีค่ามากกว่าความกว้างกลีบดอก (Petal.Width) เสมอ

จุดเด่นอีกอย่างของพล็อตกล่อง คือมันสามารถแยกให้เห็นค่าผิดปรกติ (outlier) ได้ง่าย โดยแสดงเป็นจุดที่อยู่ไกลเลยขากล่องไปนั่นเอง หลักเกณฑ์สำหรับคัดแยกค่าผิดปรกติ คือ ค่านั้นมีค่าน้อยกว่า/มากกว่าค่าจากควอร์ไทล์ที่ 1/ควอร์ไทล์ที่ 3 อยู่ 1.5 เท่าของพิสัยระหว่างควอร์ไทล์ตามลำดับ ซึ่งอาจตีความหมายได้ว่า ค่านั้นเกิดจากการจดบันทึกข้อมูลผิดเพี้ยน และควรลบมันทิ้งก่อนนำข้อมูลไปประมวลผลต่อไป

เขียนโปรแกรมด้วย R

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

เราจะแสดงการเขียนโปรแกรมในภาษา R โดยยกตัวอย่างผ่านปัญหานักสะสมคูปอง ที่ถามคำถามง่ายๆ แต่น่าสนใจว่า นักสะสมคูปองต้องเปิดซองเสี่ยงโชคกี่ครั้งถึงจะเก็บคูปองที่สุ่มแจกได้ครบทุกแบบ

หมายเหตุว่าสำหรับหัวข้อนี้ โค้ดที่แสดงจะไม่มีสัญลักษณ์ > นำหน้า ซึ่งก็คือทุกคำสั่งต่อไปนี้ไม่ได้สั่งงานผ่าน REPL และรอดูคำตอบแล้ว แต่เป็นการเขียนคำสั่งต่างๆ เหล่านี้ลงไปในไฟล์สคริปต์แทน ใครที่ต้องการทดลองตามขอให้สร้างไฟล์ใหม่ชื่อ coupon.R แล้วคัดลอกโค้ดต่างๆ ที่กำลังจะปรากฏในหัวข้อนี้ลงไปยังไฟล์ดังกล่าว

ประกาศฟังก์ชัน

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

random.int <- function(n) { sample.int(n, 1) }

โค้ดข้างต้นสร้างฟังก์ชัน random.int สำหรับสุ่มเลขจำนวนเต็มระหว่าง 1 ถึง n ขึ้นมาหนึ่งตัว

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

วนซ้ำจนกว่าจะผิดเงื่อนไข (while loop)

การวนซ้ำจนกว่าจะผิดเงื่อนไข ประกาศโดยคำสำคัญ while และมีโครงสร้างเฉกเช่นภาษาทั่วไป

random.coupon <- function(...) {
  count <- 0
  have.coupon <- logical(...)
  while (!all(have.coupon)) {
    have.coupon[random.int(...)] <- TRUE
    count <- count + 1
  }
  count
}

โค้ดข้างต้นสร้างฟังก์ชัน random.coupon สำหรับนับว่าต้องเปิดซองชิงโชคกี่ครั้ง ถึงจะได้คูปองครบ n แบบ โดยใช้เทคนิคการวนซ้ำแบบ while ในบรรทัดที่ 4 ถึง 7

ข้อสังเกตที่มาคู่กับการวนซ้ำเช่นนี้ คงหนีไม่พ้นการเพิ่มค่าตัวนับในแต่ละรอบที่วน ในภาษาทั่วไปอาจใช้เครื่องหมาย ++ หรือ += เพื่อเพิ่มค่านั้นก็ได้ แต่สำหรับภาษา R ที่ไม่มีตัวดำเนินการทั้งสองให้ใช้แล้ว จึงจำเป็นต้องเขียนเต็มยศ ดังเช่นที่เห็นได้จากบรรทัดที่ 6 ในโค้ดข้างต้น

ข้อสังเกตอื่นๆ อยู่ตรงการประกาศฟังก์ชันที่ระบุพารามิเตอร์ว่า ... ซึ่งมีความหมายว่าฟังก์ชันนี้สามารถรับอาร์กิวเมนต์ได้ไม่จำกัด และจะส่งต่อค่าในอาร์กิวเมนต์ที่รับเข้ามาไปยังฟังก์ชันอื่นๆ ในเนื้อหาฟังก์ชันนี้ที่เรียกใช้ ... เป็นอาร์กิวเมนต์ (ตัวอย่างเช่น ถ้าเรียกใช้ฟังก์ชัน random.coupon(42) ค่า 42 นี้จะถูกส่งไปเป็นเรียกใช้งานฟังก์ชัน logical(42) ต่อไป)

วนซ้ำสำหรับของแต่ละชิ้น (for loop)

การวนซ้ำสำหรับของแต่ละชิ้น ประกาศโดยใช้คำสำคัญ for ตามด้วยตัวแปรสำหรับรับสิ่งของในแต่ละรอบ แล้วตามด้วยเวกเตอร์ของสิ่งของทั้งหมดที่ต้องการวนซ้ำ (เช่นเดียวกับ foreach ในหลายภาษา)

sample.coupon <- function(n, size=10*n) {
  result <- NULL
  for (i in 1:size) {
    result <- c(result, random.coupon(n))
  }
  result
}

โค้ดข้างต้นสร้างฟังก์ชัน sample.coupon สำหรับทดลองหลายๆ ครั้งว่าแต่ละครั้งต้องสุ่มเปิดซองชิงโชคกี่ครั้ง โดยใช้เทคนิคการวนซ้ำแบบ for ในบรรทัดที่ 3 ถึง 5

จุดที่น่าสนใจอยู่ที่การประกาศพารามิเตอร์โดยกำหนดอาร์กิวเมนต์ปริยาย (default argument) ที่สามารถอ้างอิงไปยังอาร์กิวเมนต์อื่นของฟังก์ชันนี้ได้ทันที

ทำหรือไม่ตามแต่เงื่อนไขจะกำหนด (if-else)

การตรวจสอบถ้า-แล้ว สามารถใช้คำสำคัญได้เช่นเดียวกันกับภาษาทั่วไป คือ if else if และ else

if (!interactive()) {
  args <- commandArgs(TRUE)
  if (length(args) == 1) {
    filename <- "sample-coupon.png"
  } else if (length(args) == 2) {
    filename <- args[2]
  } else {
    stop("wrong number of argument!")
  }
  png(filename, width=800, height=800)
  arg.list <- list(x=as.numeric(args[1]))
  do.call(hist, list(substitute(sample.coupon(x), arg.list)))
  dev.off()
}

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

เรียกใช้โปรแกรม

ถึงตอนนี้หากใครพิมพ์ตามโค้ดข้างต้นทั้งหมด ก็จะได้ไฟล์สคริปต์ภาษา R มาหนึ่งโปรแกรมแล้ว (ส่วนใครไม่ได้พิมพ์ตาม แต่ยังอยากทดลองต่อ สามารถดาวน์โหลดโค้ดข้างต้นได้ที่นี่) เราสามารถเรียกใช้โปรแกรมดังกล่าวผ่าน terminal/cmd ได้ดังนี้

$ Rscript coupon.R 30

หรือจะนำเข้าฟังก์ชันจากไฟล์ดังกล่าวเข้ามายัง REPL เพื่อประยุกต์ใช้แบบโต้ตอบก็ย่อมได้

> source("PATH/TO/SCRIPT/coupon.R")
> hist(sample.coupon(30))

ไม่ว่าจะเรียกด้วยวิธีไหน ผลลัพธ์ที่ได้จะมีหน้าตาหนีไม่พ้นภาพที่ 13 ไปเท่าใดนัก (แม้ว่าอัลกอริทึมดังกล่าวจะอาศัยการสุ่มก็ตาม)

ภาพที่ 13: ฮิสโตแกรมคำตอบจากการทดลองปัญหานักสะสมคูปอง เมื่อมีคูปองแตกต่างกัน 30 แบบ

ดาวน์โหลดแพ็กเกจเสริมความสามารถ

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

โดยสถานที่จัดเก็บแพ็กเกจหลักอย่างเป็นทางการของภาษาดังกล่าวมีชื่อว่า CRAN (Comprehensive R Archive Network) ซึ่งปัจจุบันได้โฮสต์แพ็กเกจเสริมความสามารถกว่าหนึ่งหมื่นแพ็กเกจให้เลือกใช้งาน

วิธีการดาวน์โหลดแพ็กเกจเหล่านี้ก็ไม่ยาก เพียงแค่มีชื่อแพ็กเกจเหล่านั้นไว้ในใจ แล้วเปิด REPL ขึ้นมาเรียกฟังก์ชันต่อไปนี้

> install.pacakges("packageName")

โดยเปลี่ยน "packageName" เป็นชื่อแพ็กเกจที่ต้องการ หลังจากนั้นจะมีตัวเลือก mirror ของประเทศต่างๆ ขึ้นมา เลือกประเทศที่อยู่ใกล้ที่สุดเพื่อความเร็วในการดาวน์โหลด แล้วรอโปรแกรมดาวน์โหลดและติดตั้งแพ็กเกจเหล่านั้น

หลังจากติดตั้งเสร็จสิ้น เมื่อต้องการนำเข้าแพ็คเกจเหล่านั้นมาใช้งาน ก็ทำได้โดย

> library(packageName)

ต่อไปนี้จะขอแนะนำแพ็กเกจที่น่าสนใจจำนวนหนึ่ง (หากสั่ง library() แล้วพบข้อความแสดงความผิดพลาด อย่าลืมว่าต้องดาวน์โหลดแพ็กเกจเหล่านั้นก่อน)

กราฟเครือข่าย

กราฟเครือข่ายสามารถบ่งบอกความสัมพันธ์ในข้อมูลผ่านจุด (node) และเส้นเชื่อม (edge) ตัวอย่างข้อมูลที่เราคุ้นเคยกันดีคงหนีไม่พ้นความสัมพันธ์บนเครือข่ายสังคมออนไลน์ แต่ข้อมูลชนิดอื่นๆ ก็อาจถูกแปลงให้เป็นกราฟเครือข่ายได้ เช่น แผนที่ทางหลวง

> library(igraph)
> plot(make_graph("petersen"))

ภาพที่ 14: กราฟเครือข่ายที่มีการเชื่อมโยงแบบกราฟปีเตอร์เซน

ทำนายอนาคต

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

> library(forecast)
> plot(forecast(nottem))

ภาพที่ 15: พยากรณ์อุณหภูมิของเมืองนอตทิงแฮม (เส้นสีน้ำเงิน)

แผนที่โลก

นอกจากการพล็อตข้อมูลเชิงสถิติแล้ว R ยังสามารถพล็อตแผนที่โลกได้อีกด้วย

> library(maps)
> library(mapdata)
> map("world2Hires", xlim=c(110,190), ylim=c(-50,0))
> points(quakes[2:1], pch=".", col="red")

ภาพที่ 16: แผนที่โลกพร้อมตำแหน่งเกิดแผ่นดินไหว (จุดสีแดง) ใกล้ฟีจี

สรุป

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

อย่างไรก็ตาม บทความนี้ก็ไม่ได้กล่าวถึงทุกเรื่องที่ควรรู้ในภาษา R และตัวอย่างการคำนวณทางสถิติก็ยังอยู่ในระดับขั้นพื้นฐานเป็นอย่างมาก ใครที่ต้องการนำภาษา R ไปประยุกต์ใช้งานอย่างจริงจัง หรือวาดฝันไว้ว่าต้องการเป็นนักวิทยาศาสตร์ข้อมูล (data scientist) ก็คงต้องบอกว่าจงตั้งใจศึกษาตัวภาษาและวิชาสถิติเพิ่มเติม

เพราะการเรียนรู้ไม่มีวันสิ้นสุด และการเรียนรู้จะบรรลุผลสูงสุดเมื่อสามารถประยุกต์ใช้ความรู้นั้นเพื่อสร้างสรรค์ประโยชน์ได้

ภาคผนวก

ติดตั้งโปรแกรมบนเครื่อง

การติดตั้ง R นั้นสามารถทำได้อย่างง่ายดาย เพียงแค่เข้าไปยังเว็บไซต์หลักของภาษา R แล้วตามลิงก์ที่เขียนคำว่า "download R" จะพบกับรายชื่อ mirror ต่างๆ ทั่วโลกที่ทำสำเนาโครงการภาษา R ไว้ เลือกตัวเลือกที่อยู่ใกล้เคียงตำแหน่งปัจจุบันมากที่สุดเพื่อความเร็วในการดาวน์โหลด (สำหรับประเทศไทย มี mirror ของมหาวิทยาลัยสงขลานครินทร์สำหรับสำเนาดังกล่าว) เมื่อเข้าไปแล้ว จะพบกับตัวเลือกให้ดาวน์โหลดโปรแกรมได้ทั้งบน Windows, OS X และ Linux โดยมีรายละเอียดต่างกันเล็กน้อย ดังนี้

  • Windows เลือกดาวน์โหลดไฟล์ติดตั้ง .exe จากแฟ้ม "base" มาติดตั้งก็เพียงพอแล้วสำหรับบทความนี้
  • OS X ดาวน์โหลดไฟล์ติดตั้ง .pkg รุ่นใหม่ล่าสุดจากหน้าดาวน์โหลดของ OS X มาติดตั้งได้เลย
  • Linux เนื่องจากความหลากหลายทางดิสโทร การหาไฟล์ติดตั้งที่ถูกต้องจากหน้านี้อาจเป็นเรื่องยุ่งยากเกินจำเป็น เราอาจเลือกสั่งเพียงคำสั่งต่อไปนี้ผ่าน terminal แทน
    • apt install r-base สำหรับดิสโทร Debian/Ubuntu
    • yum install R สำหรับดิสโทร Red Hat/Fedora

หลังจากติดตั้งโปรแกรมสำเร็จแล้ว ผู้ใช้ OS X/Linux ไม่ต้องทำอะไรต่อ ส่วนผู้ใช้ Windows ควรแก้ไขตัวแปร PATH โดยเพิ่มตำแหน่งที่ติดตั้งโปรแกรม R (เช่น C:\Program Files\R\R-3.4.1\bin\x64) ต่อท้ายตัวแปรนั้น เพื่อให้สามารถเรียกโปรแกรม R ผ่าน cmd ได้ในภายหลัง

Hiring! บริษัทที่น่าสนใจ

Carmen Software company cover
Carmen Software
Hotel Financial Solutions
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
T.N. Digital Solution Co., Ltd. company cover
T.N. Digital Solution Co., Ltd.
TNDS has been involving in every first move of banking’s major digital transformation.
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
The Gang Technology Co., Ltd. company cover
The Gang Technology Co., Ltd.
We're a Digital Agency that helps our customers transform their business into digital with ease.
LTMH (WM) _TECH company cover
LTMH (WM) _TECH
LTMH (WM) _TECH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand

เราจะพบกับข้อความต้อนรับที่บอกรายระเอียด

รายระเอียด => รายละเอียด

ค่าผลลัพธ์ที่เห็นเป็นตัวแรกในแถวนี้เป็นผลลัพธ์ตัวที่เท่าไหร่จากผลลัพธ์ทั้งหมด

การหาฐานนิยมด้วยวิธีพื้นฐานมักไม่ให้ข้อสรุปที่เกิดประโยชน์เท่าไหร่

เท่าไหร่ => เท่าไร

ส่วนอีกร้านอาจขายตั้งแต่สากกระเบือยันเรือดำน้ำก็เป็นได้

สากกระเบือ => สากกะเบือ

Jedt3D Fri, 28/07/2017 - 19:03

login เข้ามาเพื่อของคุณโดยเฉพาะเลย ขอบคุณมากนะครับที่เขียนบทความสรุปเรื่องภาษา R มาเสียยาวเลยครับ เดี๋ยวมาอ่านต่อครับผม ตอนนี้เอาไปแชร์ก่อน :D

itpcc Fri, 28/07/2017 - 21:18

ขอบคุณครับ
เคยใช้ตอนเรียนวิชา TextMining ใช้งานสะดวกดีครับ ติดแต่ R ภาษามันออกประหลาดๆ ไปหน่อย แต่โดยรวมก็ถือว่าใช้สะดวกดีครับ Lib โหลดง่ายมาก

ปีที่แล้ว Google รับพนักงานมี requirement เรื่อง R โดยเฉพาะเลยล็อตนึง

วิทยากรของกูเกิ้ลเองก็ยังบอกว่าเขาใช้ R ในขั้นสุดท้ายของ Analytic อยู่ประมาณว่า Automate tool ยังไงยังต้องจบขั้นสุดท้ายใน R

หรือจะดีจะร้ายยังไง สุดท้ายความจริงที่ว่าเวลาเจอข้อมูลก้อนใหญ่ๆ มันไม่มีปัญหาเหมือน Spss แค่นี้ก็น่าสนใจแล้ว

Apple
public://topics-images/apple_webp.png
SCB10X
public://topics-images/347823389_774095087711602_515970870797767330_n_webp.png
Windows 11
public://topics-images/hero-bloom-logo.jpg
Huawei
public://topics-images/huawei_standard_logo.svg_.png
Google Keep
public://topics-images/google_keep_2020_logo.svg_.png
Instagram
public://topics-images/instagram_logo_2022.svg_.png
Microsoft
public://topics-images/microsoft_logo.svg_.png
Basecamp
public://topics-images/bwpepdi0_400x400.jpg
FTC
public://topics-images/seal_of_the_united_states_federal_trade_commission.svg_.png
Pinterest
public://topics-images/pinterest.png
Palantir
public://topics-images/-nzsuc6w_400x400.png
AIS Business
public://topics-images/logo-business-2021-1.png
PostgreSQL
public://topics-images/images.png
JetBrains
public://topics-images/icx8y2ta_400x400.png
Krungthai
public://topics-images/aam1jxs6_400x400.jpg
Palworld
public://topics-images/mccyhcqf_400x400.jpg
Bill Gates
public://topics-images/bill_gates-september_2024.jpg
VMware
public://topics-images/1nj4i1gp_400x400.jpg
Take-Two Interactive
public://topics-images/0khle7nh_400x400.jpg
OpenAI
public://topics-images/ztsar0jw_400x400.jpg
Thailand
public://topics-images/flag_of_thailand.svg_.png
ServiceNow
public://topics-images/ytnrfphe_400x400.png
Klarna
public://topics-images/urcllpjp_400x400.png
Google Play
public://topics-images/play.png
Drupal
public://topics-images/drupal.png
Virtua Fighter
public://topics-images/virtua_figther_2024_logo.png
Paradox Interactive
public://topics-images/paradox_interactive_logo.svg_.png
Europa Universalis
public://topics-images/europa-icon.png
Nintendo Switch 2
public://topics-images/mainvisual.png
Cloudflare
public://topics-images/cloudflare_logo.svg_.png
Samsung
public://topics-images/samsung.png
Google
public://topics-images/google_2015_logo.svg_.png
Uber
public://topics-images/uber.png
Microsoft 365
public://topics-images/m365.png
USA
public://topics-images/flag_of_the_united_states.svg_.png
GM
public://topics-images/0pe0po-z_400x400.jpg
Perplexity
public://topics-images/perplex.jpg
Xperia
public://topics-images/xperia.png
iOS 18
public://topics-images/ios-18-num-96x96_2x.png
True
public://topics-images/true_logo.png
SoftBank
public://topics-images/softbank.jpg
Pac-Man
public://topics-images/pacman.png
Harry Potter
public://topics-images/harry.png
Marvel
public://topics-images/marvel.png
Skydance
public://topics-images/skydance.png
SEA
public://topics-images/sealogo.png
Find Hub
public://topics-images/find.png
Accessibility
public://topics-images/accessibility-128x128_2x.png
Material Design
public://topics-images/m3-favicon-apple-touch.png
Android 16
public://topics-images/android16.png
Android
public://topics-images/android_0.png
Firefox
public://topics-images/firefox_logo-2019.svg_.png
Google Messages
public://topics-images/messages.png
Notepad
public://topics-images/notepad.png
Singapore
public://topics-images/flag_of_singapore.svg_.png
Airbnb
public://topics-images/airbnb.png
PS5
public://topics-images/ps5.png
Krafton
public://topics-images/krafton.png
Doom
public://topics-images/doom-game-s_logo.svg_.png
AMD
public://topics-images/amd_logo.svg_.png
GTA
public://topics-images/gta_0.png
DoorDash
public://topics-images/doordash.png
YouTube
public://topics-images/yt.png
YouTube Music
public://topics-images/yt-music.png
Facebook
public://topics-images/fb.png
iQiyi
public://topics-images/iqiyi_0.png
Viu
public://topics-images/viu.png
Amazon Prime Video
public://topics-images/prime-vid.png
Spotify
public://topics-images/spotify.jpg
HBO Max
public://topics-images/max.png
Threads
public://topics-images/threads.png
Alexa
public://topics-images/alexa.png
Kindle App
public://topics-images/kindle.png
Shopee
public://topics-images/shopee.png
Waze
public://topics-images/waze.png
Bilibili
public://topics-images/bili.png
Google Maps
public://topics-images/maps.png
Apple Music
public://topics-images/apple-music.png
Claude
public://topics-images/claude.png
TikTok
public://topics-images/tiktok.png
Xbox
public://topics-images/xbox.png
Tesla
public://topics-images/tesla.png
Chrome
public://topics-images/chrome.png
Google Calendar
public://topics-images/gcal.png
Google Meet
public://topics-images/meet.png
NotebookLM
public://topics-images/notebooklm.png
Reddit
public://topics-images/reddit.png
Assassin’s Creed
public://topics-images/ac.png
Mark Zuckerberg
public://topics-images/zuck.jpg
Meta
public://topics-images/meta.png
Meta AI
public://topics-images/meta-ai.png
Epic Games
public://topics-images/epic_games_logo.svg_.png
Unreal
public://topics-images/unreal_engine_logo-new_typeface-svg.png
Fortnite
public://topics-images/fortnite.png
DeepMind
public://topics-images/deepmind.png
Databricks
public://topics-images/databricks.png
Netflix
public://topics-images/netflix-logo.png
Microsoft Azure
public://topics-images/azure.png
Microsoft Copilot
public://topics-images/microsoft_copilot_icon.svg_.png
Bing
public://topics-images/bing.png
EA
public://topics-images/ea.png
Intel
public://topics-images/intel.png
Amazon
public://topics-images/amazon.png
AWS
public://topics-images/aws.png
Zoom
public://topics-images/zoom.png
Dropbox
public://topics-images/dropbox_0.png
Dell Technologies
public://topics-images/dell-tech.png
Nothing
public://topics-images/nothing.svg_.png
Microsoft Teams
public://topics-images/teams.png
Mojang
public://topics-images/mojang.png
Minecraft
public://topics-images/minecraft.png
Redis
public://topics-images/redis_logo.svg_.png
Ubisoft
public://topics-images/ubisoft_logo.svg_.png
Elden Ring
public://topics-images/elden.png
Brave
public://topics-images/brave.png
Opera
public://topics-images/opera.png
Vivaldi
public://topics-images/vivaldi.png
Microsoft Edge
public://topics-images/edge.png
Duolingo
public://topics-images/duolingo.png
LinkedIn
public://topics-images/linkedin.png
Canva
public://topics-images/canva.png
Realme
public://topics-images/realme.png
NASA
public://topics-images/nasa-logo.png
Booking.com
public://topics-images/booking.png
Agoda
public://topics-images/agoda.png
Bolt
public://topics-images/bolt.png
Temu
public://topics-images/temnu.png
LINE
public://topics-images/line.png
Facebook Messenger
public://topics-images/messenger.png
WhatsApp
public://topics-images/whatsapp.png
Telegram
public://topics-images/telegram.png
Signal
public://topics-images/signal.png
X.com
public://topics-images/x.png
Grok
public://topics-images/grok.png
xAI
public://topics-images/xai.png
CapCut
public://topics-images/capcut.png
Edits
public://topics-images/edit.png
Google One
public://topics-images/gone.png
Tinder
public://topics-images/tinger.png
Whoscall
public://topics-images/whoscall.png
OneDrive
public://topics-images/onedrive.png
Lightroom
public://topics-images/lr.png
Meitu
public://topics-images/meitu.png
Outlook
public://topics-images/outlook.png
Excel
public://topics-images/excel.png
PowerPoint
public://topics-images/ppt.png
Microsoft Word
public://topics-images/word.png
Phone Link
public://topics-images/phone-link.png
OneNote
public://topics-images/onenote.png
Windows App
public://topics-images/windows-app.png
Notion
public://topics-images/notion.png
Google Drive
public://topics-images/drive.png
YouTube Kids
public://topics-images/yt-kids.png
Gboard
public://topics-images/gboard.png
DeepSeek
public://topics-images/deepseek_logo.svg_.png
Prince of Persia
public://topics-images/prince-persia.png
Sony
public://topics-images/nq0nd2c0_400x400.jpg
Cisco
public://topics-images/jmyca1yn_400x400.jpg
Alibaba Cloud
public://topics-images/qm43orjx_400x400_cloud.png
Coinbase
public://topics-images/consumer_wordmark.png
CarPlay
public://topics-images/carplay.png
Rust
public://topics-images/rust-logo-blk.png
Red Hat
public://topics-images/redhat.png
Anthropic
public://topics-images/anthropic.png
Xcode
public://topics-images/xcode.png
Tim Cook
public://topics-images/tim-cook.jpg
Donald Trump
public://topics-images/trump.jpg
Microsoft Surface
public://topics-images/surface.jpg
Copilot+ PC
public://topics-images/copilotpc.png
Stellar Blade
public://topics-images/stellar-blade.jpg
Snapdragon
public://topics-images/snapdragon_chip.png
Qualcomm
public://topics-images/qualcomm-logo.svg_.png
CoreWeave
public://topics-images/coreweave.png
Ford
public://topics-images/ford.png
Xiaomi
public://topics-images/xiaomi.png
Google Cloud
public://topics-images/google_cloud_logo.svg_.png
PlayStation Network
public://topics-images/psn.png
PlayStation Plus
public://topics-images/ps-plus.png
Windsurf
public://topics-images/windsurf.png
Square Enix
public://topics-images/square-enix.png
MIT
public://topics-images/x7hyjl3t_400x400.jpg
Zoox
public://topics-images/zoox.jpg
Evernote
public://topics-images/1neatidg_400x400.jpg
Magic the Gathering
public://topics-images/magic.png
Call of Duty
public://topics-images/cod.png
NVIDIA
public://topics-images/nvidia_logo.svg_.png
Satya Nadella
public://topics-images/nadella.png
Nintendo
public://topics-images/nintendo.png
Japan
public://topics-images/japan_flag.png
China
public://topics-images/china-flag-sq.png
Sam Altman
public://topics-images/sam-altman.png
SNK
public://topics-images/snk_logo.svg_.png
EPYC
public://topics-images/epyc.png
Juniper
public://topics-images/juniper.png
CMA
public://topics-images/cma.png
App Store
public://topics-images/app-store.png
DoJ
public://topics-images/doj.png
Siri
public://topics-images/siri.png
Apple Intelligence
public://topics-images/apple-intelligence.png
Acer
public://topics-images/acer.png
GeForce
public://topics-images/geforce.png
Omen
public://topics-images/omen.png
Alienware
public://topics-images/alienware.png
Dell
public://topics-images/dell.png
Bungie
public://topics-images/bungie.png
Marathon
public://topics-images/marathon.png
Intel Arc
public://topics-images/badge-arc-graphics.png
GitHub
public://topics-images/8zfrryja_400x400.png
GitHub Copilot
public://topics-images/copilot.png
Foxconn
public://topics-images/foxconn_0.png
Visual Studio
public://topics-images/vs.png
Visual Studio Code
public://topics-images/vscode.png
WSL
public://topics-images/wsl.png
Linux
public://topics-images/linux.png
Tencent
public://topics-images/tencent_logo_2017.svg_.png
Entra
public://topics-images/microsoft_entra_id_color_icon.svg_.png
RHEL
public://topics-images/rhel-icon.png
MSI
public://topics-images/msi-logo-for_digital_use_b.png
MCP
public://topics-images/mcp.png
Docker
public://topics-images/docker.png
RISC-V
public://topics-images/risc-v-logo.svg_.png
Fedora
public://topics-images/fedora.png
ASUS
public://topics-images/asus.png
ROG
public://topics-images/rog-logo_red.png
Naughty Dog
public://topics-images/naughty-dog.png
AIS
public://topics-images/357073423_657473419752809_8491928084596189631_n.png
National Telecom
public://topics-images/nt.jpg
Elon Musk
public://topics-images/elon_musk_2015_0.jpg
OpenShift
public://topics-images/openshift-logotype.svg-0.png
Shift Up
public://topics-images/shiftup.png
Bethesda
public://topics-images/bethesda.png
The Elder Scrolls
public://topics-images/tes.png
CATL
public://topics-images/img_7841.png
Radeon
public://topics-images/radeon.png
Borderlands
public://topics-images/borderlands4.png
Android XR
public://topics-images/android-xr.png
Ninja Theory
public://topics-images/ninja.jpg
Jonathan Ive
public://topics-images/ive.jpg
Bitcoin
public://topics-images/bitcoin.svg_.png
Baidu
public://topics-images/baidu.jpg
Wear OS
public://topics-images/wearos.png
Activision
public://topics-images/activision.svg_.png
Netmarble
public://topics-images/netmarble.png
NetEase
public://topics-images/netease.png
Fujifilm
public://topics-images/l_9ycfw2_400x400.png
Google Vids
public://topics-images/vids.png
Google Docs
public://topics-images/docs.png
Google Sheets
public://topics-images/sheets.png
Google Chat
public://topics-images/gchat.png
Google Slides
public://topics-images/slides.png
Google Photos
public://topics-images/photos_0.png
Snapchat
public://topics-images/snapchat.png
Google TV
public://topics-images/gtv.png
Android Auto
public://topics-images/aauto.png
Gmail
public://topics-images/gmail.png
Google Forms
public://topics-images/forms.png
Google Workspace
public://topics-images/workspace_0.png
Android Studio
public://topics-images/android_studio_logo_2024.svg_.png
Pocket
public://topics-images/spnhfky8_400x400.png
Mozilla
public://topics-images/mozilla.jpg
Thunderbird
public://topics-images/thunderbird.png
Bluesky
public://topics-images/bluesky.jpg
Warhammer
public://topics-images/warhammer-bw.png
Relic Entertainment
public://topics-images/relic_entertainment_logo.svg_.png
Age of Empires
public://topics-images/age_of_empires_franchise_logo.png
Azul
public://topics-images/azul.png
Meta Quest
public://topics-images/meta-quest.png
Informatica
public://topics-images/qzlzwpsp_400x400.jpg
Salesforce
public://topics-images/salesforce.com_logo.svg_.png
Steam
public://topics-images/steam.png
Valve
public://topics-images/valve_logo.svg_.png
SteamOS
public://topics-images/steamos_wordmark.svg_.png
Steam Deck
public://topics-images/steam-deck.png
Arch Linux
public://topics-images/archlinux-logo-standard-version.svg_.png
Half-Life
public://topics-images/orange_lambda.svg_.png
Counter-Strike
public://topics-images/counter-strike.png
OnlyFans
public://topics-images/onlyfans_logo_icon_blue.png
Strava
public://topics-images/strava.png
Mortal Kombat
public://topics-images/mortal-kombat.png
Canon
public://topics-images/canon.png
Snipping Tool
public://topics-images/snipping.png
Microsoft Paint
public://topics-images/paint.png
Microsoft Photos
public://topics-images/photos.png
File Explorer
public://topics-images/file_explorer.png
Git
public://topics-images/git-logo.svg_.png
Star Wars
public://topics-images/star-wars.png
Activision Blizzard
public://topics-images/actvision-blizz.png
Microsoft Store
public://topics-images/microsoft-store.png
France
public://topics-images/france.png
Ricoh
public://topics-images/ricoh_logo_2005.svg_.png
Xeon
public://topics-images/xeon.png
.NET
public://topics-images/dotnet.png
SQL Server
public://topics-images/microsoft_sql_server_2025_icon.svg_.png
Power BI
public://topics-images/power-bi.png
Microsoft Fabric
public://topics-images/fabric.png
MSN
public://topics-images/msn.png
SharePoint
public://topics-images/sharepoint.png
Ubuntu
public://topics-images/ubuntu-logo-2022.svg_.png
Debian
public://topics-images/debian-openlogo.svg_.png
LLM
public://topics-images/7410e129-824e-479c-93c7-558e87130b8f.png
Meituan
public://topics-images/meituan.png
Logitech
public://topics-images/logitech_logo.svg_.png
Llama
public://topics-images/llama.png
Oracle
public://topics-images/oracle_logo.svg_.png
Circle
public://topics-images/circle.png
T-Mobile
public://topics-images/tmobile.jpg
Starlink
public://topics-images/starlink.jpg
SpaceX
public://topics-images/hbri04tm_400x400.jpg
Apple Arcade
public://topics-images/en-us-large-1x.png
TypeScript
public://topics-images/typescript.svg_.png
AlmaLinux
public://topics-images/almalinux.png
Subnautica
public://topics-images/subnautica.png
Clair Obscur
public://topics-images/clair-33.png
Dragon Quest
public://topics-images/dragon_quest_logo.png
Twitter
public://topics-images/twitter300.png
One UI
public://topics-images/one-ui.png
Fire TV
public://topics-images/amazon_fire_tv_2024.svg_.png
Stellantis
public://topics-images/stellantis.png
Taobao
public://topics-images/taobao.png
WeChat
public://topics-images/wechat.png
Alipay
public://topics-images/alipay.png
DingTalk
public://topics-images/dingtalk.png
Alibaba
public://topics-images/alibaba-group-logo.svg_.png
Pokemon
public://topics-images/international_pokemon_logo.svg_.png
NBTC
public://topics-images/nbtc.png
CD Projekt
public://topics-images/cd_projekt_logo.svg_.png
Cyberpunk 2077
public://topics-images/cyberpunk.png
The Witcher
public://topics-images/witcher.png
Boeing
public://topics-images/boeing.png
Discord
public://topics-images/discord.png
Grammarly
public://topics-images/grammarly.png
Google Lens
public://topics-images/lens.png
WordPress
public://topics-images/wordpress.png
Automattic
public://topics-images/automattic.png
Zotac
public://topics-images/zotac.png
Black Forest Labs
public://topics-images/flux.png
Sega
public://topics-images/sega.png
Twitch
public://topics-images/twitch.png
Person
public://topics-images/gemini_generated_image_ddj47iddj47iddj4.png
IntelliJ
public://topics-images/intellij.png
CrowdStrike
public://topics-images/cs_logo.png
Bandai Namco
public://topics-images/bandainamco.png
Oppo
public://topics-images/oppo.png
Dontnod
public://topics-images/don-t_nod.png
Hugging Face
public://topics-images/huggingface.png
Bixby
public://topics-images/logo_bixby_new.svg_.png
Gemma
public://topics-images/gemma.png
Flash Express
public://topics-images/flash.png
Lyft
public://topics-images/lyft.png
James Bond
public://topics-images/007.png
Snowflake
public://topics-images/snowflake.png
IO Interactive
public://topics-images/ioi.png
The Sims
public://topics-images/the_sims.png
Character.AI
public://topics-images/character_ai.png
IBM
public://topics-images/xy93qvy4_400x400.png
USB
public://topics-images/usb-logo.png
Zynga
public://topics-images/zynga.svg_.png
Broadcom
public://topics-images/broadcom.png
Photoshop
public://topics-images/ps.png
Adobe
public://topics-images/adobe.png
Premiere Pro
public://topics-images/premier.png
Database
public://topics-images/gemini_generated_image_nlgayenlgayenlga.png
GeForce Now
public://topics-images/gf-now.png
Go
public://topics-images/o6aczwfv_400x400.png
ChatGPT
public://topics-images/chatgpt.png
Final Fantasy
public://topics-images/ff.png
Swift
public://topics-images/swift_logo.svg_.png
Cursor
public://topics-images/cursor.png
AirPods Max
public://topics-images/airpodsmax.png
Koei Tecmo
public://topics-images/koei_tecmo.png
Team Ninja
public://topics-images/team-ninja.png
Disney+
public://topics-images/disney-plus.png
Capcom
public://topics-images/capcom.png
Pornhub
public://topics-images/pornhub-logo.svg_.png
Proton
public://topics-images/proton.png
PlayStation
public://topics-images/playstation.png
GOG
public://topics-images/gog-logo.png
Mistral
public://topics-images/mistral.png
No Man's Sky
public://topics-images/nomansky.png
Hello Games
public://topics-images/hello-games-logo.png
SCB
public://topics-images/scb.png
Kasikorn Bank
public://topics-images/kbank.png
Grasshopper Manufacture
public://topics-images/grasshopper-100.png
Metal Gear
public://topics-images/metal_gear_franchise_logo.svg_.png
Google Wallet
public://topics-images/g-wallet.png
PayPal
public://topics-images/paypal.png
Mark Cuban
public://topics-images/cuban.jpg
Giant Squid
public://topics-images/giant-squid.png
Black Myth: Wukong
public://topics-images/blackmyth.jpg
Deathloop
public://topics-images/deathloop_logo.webp_.png
Resident Evil
public://topics-images/residentevil.png
Street Fighter
public://topics-images/street_fighter_logo.png
Ryu Ga Gotoku
public://topics-images/ryugagotokustudio.png
Like a Dragon
public://topics-images/lad-logo.png
Sonic the Hedgehog
public://topics-images/sonic.png
Blender
public://topics-images/logo_blender.svg_.png
Volvo
public://topics-images/volvo-iron-mark-black.svg_.png
Atomic Heart
public://topics-images/atomic.png
Hitman
public://topics-images/hitman.png
Mac
public://topics-images/apple-finder.png
Arc Raiders
public://topics-images/arc-raiders.jpg
Krungsri Bank
public://topics-images/krungsri.png
Owlcat Games
public://topics-images/owlcat.png
Scale
public://topics-images/scale_ai.png
The Outer Worlds
public://topics-images/1600px-outerworlds-logo.png
Obsidian Entertainment
public://topics-images/obsidian_entertainment.svg_.png
Avowed
public://topics-images/avowed.png
Grounded
public://topics-images/grounded.png
Atlus
public://topics-images/atlus_logo_thin_stroke_277x108.png
High on Life
public://topics-images/high-logo.png
Ryzen
public://topics-images/ryzen.png
Flight Simulator
public://topics-images/microsoft_flight_simulator.png
Indiana Jones
public://topics-images/indiana_jones_logo.svg_.png
Dawnwalker
public://topics-images/the-blood-of-dawnwalker-logo-light.png
Rebel Wolves
public://topics-images/rebel-wolves-logo-black.png
inXile
public://topics-images/inxile_entertainment_logo.png
Double Fine Productions
public://topics-images/double-fine.png
Game Freak
public://topics-images/game_freak_logo.svg_.png
iOS 26
public://topics-images/ios26.png
Tahoe
public://topics-images/macos26.png
iPadOS 26
public://topics-images/ipados26.png
Zelda
public://topics-images/zelda_logo.svg_.png
watchOS 26
public://topics-images/watchos26.png
Apple Vision Pro
public://topics-images/applevisionpro.png
Amiibo
public://topics-images/amiibo.png
Thunder Lotus
public://topics-images/thunder-lotus.png
Games
public://topics-images/role-playing_video_game_icon.svg_.png
Waymo
public://topics-images/waymo.png
Grab
public://topics-images/grab_0.png
Fallout
public://topics-images/fallout_logo.svg_.png
Warner Bros. Discovery
public://topics-images/wbd.png
Splatoon
public://topics-images/splatoon.png
Kingston
public://topics-images/kingston.png
Roblox
public://topics-images/roblox_thumb.png
Google Pixel
public://topics-images/pixel_wordmark.svg_.png
Jensen Huang
public://topics-images/jensen-headshot-1906-600x338.png
Midjourney
public://topics-images/61396273.png
NBCUniversal
public://topics-images/umh_w5l-400x400.png
Disney
public://topics-images/disney.png
Snap
public://topics-images/snap_inc.png
Wikipedia
public://topics-images/wikipedia-logo-v2.svg_.png
Kaggle
public://topics-images/kaggle_logo.svg_.png
Wikimedia Foundation
public://topics-images/wikimedia_foundation.png
IonQ
public://topics-images/ionq.png
Apple TV+
public://topics-images/apple_tv_plus.png
Slack
public://topics-images/slack.png
Webex
public://topics-images/webex.png
Wayland
public://topics-images/wayland.png
GNOME
public://topics-images/gnomelogo.svg_.png
X.Org
public://topics-images/xorg.png
PCI-SIG
public://topics-images/pci-sig_logo.png
PCI
public://topics-images/pci_express.svg_.png
Instinct
public://topics-images/instinct.png
MariaDB
public://topics-images/img_9067.png
Mattel
public://topics-images/mattel-2019-svg.png
Silent Hill
public://topics-images/silent_hill_2022_logo.png
Bloober Team
public://topics-images/blooberlogo260b.png
India
public://topics-images/flag_of_india.png
Nexon
public://topics-images/nexon.svg_.png
Helldivers
public://topics-images/helldivers_print_logo.png
Mac Mini
public://topics-images/mac-mini-202410-gallery.png
Dyson
public://topics-images/dyson.png
Mario Kart
public://topics-images/mario-kart-100.png
Germany
public://topics-images/flag_of_germany.svg_.png
Gears of War
public://topics-images/gears-of-war-logo-2006.png
Warren Buffett
public://topics-images/buffett.png
Craig Federighi
public://topics-images/craige1.png
Boston Dynamics
public://topics-images/boston.png
aespa
public://topics-images/aespa.png
NewJeans
public://topics-images/newjeans.png
iPhone 16
public://topics-images/iphone16_.png
iPhone 16 Pro
public://topics-images/iphone16_pro.png
Indonesia
public://topics-images/indo_flag.png
Devil May Cry
public://topics-images/dmc5.png
Etsy
public://topics-images/etsy.png
Ghost of Yōtei
public://topics-images/ghost.png
BT
public://topics-images/bt_logo_2019.svg_.png
Kubernetes
public://topics-images/kubernetes_logo_without_workmark.svg_.png
Pixelfed
public://topics-images/pixelfed.png
Mastodon
public://topics-images/mastodon.png
Iran
public://topics-images/iran.png
Israel
public://topics-images/flag_of_israel.png
Warner Bros.
public://topics-images/warner_bros.png
Qwen
public://topics-images/qwenpng.png
Donkey Kong
public://topics-images/dk.png
Mario
public://topics-images/mario.png
Honda
public://topics-images/kln5su0v_400x400.jpg
Wix
public://topics-images/wix.png
Google Tensor
public://topics-images/ggtensor.png
Bank of Thailand
public://topics-images/bankofthailand.png
Beat Saber
public://topics-images/beat.png
PlayStation VR
public://topics-images/psvr2.png
Texas Instrument
public://topics-images/ti.png
NFC
public://topics-images/daak0pur_400x400.jpg
LG
public://topics-images/lg.png
EA Sports FC
public://topics-images/ea-fc.png
Volkswagen
public://topics-images/volkswagen_logo_2019.svg_.png
Disco Elysium
public://topics-images/disco.png
Neowiz
public://topics-images/neowiz_holdings_logo.png
Lies of P
public://topics-images/lies-p.png
Thinking Machines Lab
public://topics-images/u6tsxu60_400x400_0.png
Mira Murati
public://topics-images/-pnysxgr_400x400.png
Vimeo
public://topics-images/vimeo.png
Japan Airlines
public://topics-images/jal.png
HarmonyOS
public://topics-images/harmonyos_logo.png
Sequoia
public://topics-images/sequoia.png
iPadOS 18
public://topics-images/ipados-18-num-96x96_2x.png
Sakana AI
public://topics-images/dtnrodgp_400x400.png
Runway
public://topics-images/lpx3j0s7_400x400.png
Exynos
public://topics-images/exynos.png
MediaTek
public://topics-images/mediatek_logo.svg_.png
Arm
public://topics-images/arm.png
Facebook Groups
public://topics-images/groupslogo2.png
Death Stranding
public://topics-images/death_stranding_logo.png
Bumble
public://topics-images/bumble.png
Rematch
public://topics-images/logorematch_transcreen.png
GWM
public://topics-images/2025-gwm-logo-rgb-digital_2.png
Barclays
public://topics-images/barclays_logo.svg_.png
Asana
public://topics-images/asana.png
Dying Light
public://topics-images/dying-light-200.png
Creative Commons
public://topics-images/apple-touch-icon.png
EU
public://topics-images/flag-for-european-union_1f1ea-1f1fa.png
Cambodia
public://topics-images/flag_of_cambodia.svg_.png
HDMI
public://topics-images/high_definition_multimedia_interface_logo.svg_.png
Denmark
public://topics-images/denmark-flag.png
Riot Games
public://topics-images/riot_games_2022.svg_.png
League of Legends
public://topics-images/lol.png
Valorant
public://topics-images/valorant.png
Pioneer
public://topics-images/459525305_7951848951587833_4839605414563613731_n.png
Google Earth
public://topics-images/gearth.png
Google TV Streamer
public://topics-images/gtv_0.png
Chromecast
public://topics-images/chromecast.png
Fairphone
public://topics-images/fairphone.png
Honor
public://topics-images/honor_logo-2020-svg.png
Counterpoint Research
public://topics-images/counterpoint.png
BBC
public://topics-images/bbc.png
TrueMove H
public://topics-images/334187583_158099563725447_7727972013376860320_n.png
AliExpress
public://topics-images/aliexpress.png
Norway
public://topics-images/flag_of_norway.svg_.png
Research
public://topics-images/research-icon.png
Science
public://topics-images/science.png
Figma
public://topics-images/wpgpzf_m_400x400.png
Gemini
public://topics-images/gemini-colors.png
Social Security
public://topics-images/social-security.png
Hikvision
public://topics-images/cdyc5hhc_400x400.png
Autodesk
public://topics-images/autodesk_logo_2021.svg_.png
Rare
public://topics-images/rare_logo_2015.svg_.png
Sea of Thieves
public://topics-images/sea-of-thieves.png
Skype
public://topics-images/skype.png
Safe Superintelligence
public://topics-images/ssi.png
PowerShell
public://topics-images/powershell_256.png
Apple Store
public://topics-images/apple_store.png
Battlefield
public://topics-images/battlefieldlogo.svg_.png
Robinhood
public://topics-images/1ftlyz2c_400x400.png
Malaysia
public://topics-images/malaysia-flag.png
Forza
public://topics-images/forza_logo_2020.svg_.png
John Romero
public://topics-images/romero.jpg
TSMC
public://topics-images/tsmc_1.png
Vietnam
public://topics-images/flag_of_vietnam.svg_.png
React
public://topics-images/react.png
KPLUS
public://topics-images/kplus.png
Jack Dorsey
public://topics-images/jack.jpg
Replit
public://topics-images/replit.png
GlobalFoundries
public://topics-images/gf.png
MIPS
public://topics-images/mips.png
Linda Yaccarino
public://topics-images/c5dthmbt.png
GameStop
public://topics-images/ouc1sr_p_400x400.png
Belkin
public://topics-images/belkin_logo_2024.svg_.png
Home Assistant
public://topics-images/home-assistant.png
Next.js
public://topics-images/if82cpbs_400x400.jpg
Hertz
public://topics-images/hertz_car_rental_logo.svg_.png
Jio
public://topics-images/jio.png
Lucid Motors
public://topics-images/lucidmotor.png
Guinness World Record
public://topics-images/gwr.png
EFF
public://topics-images/eff.png
TIOBE
public://topics-images/tiobe.png
MLX
public://topics-images/102832242.png
DoD
public://topics-images/dod.png
IDC
public://topics-images/idc.png
OpenGL
public://topics-images/opengl_logo.svg_.png
Vulkan
public://topics-images/vulkan_logo.svg_.png
NIST
public://topics-images/hp8oa5cb_400x400.png
ASML
public://topics-images/img_1736.jpeg
Curl
public://topics-images/curl_icon.png
Google Assistant
public://topics-images/assistant.png
ChromeOS
public://topics-images/chromeos_logo.svg_.png
Adobe Firefly
public://topics-images/firefly.png
SonicWall
public://topics-images/sonicwall.png
Astronomer
public://topics-images/astro.jpg
Corning
public://topics-images/corning.png
Emoji
public://topics-images/emoji.png
CUDA
public://topics-images/nvidia_cuda.png
Ready or Not
public://topics-images/readyornot-logo.png
Google Tasks
public://topics-images/gtasks.png
Qi
public://topics-images/qi.png
Lego
public://topics-images/lego_logo.svg_.png
Game Boy
public://topics-images/nintendo_game_boy_logo.svg_.png
SK Hynix
public://topics-images/img_2498.png
Sonos
public://topics-images/sonos_logo.png
Eidos
public://topics-images/eidos_montreal.png
Tomb Raider
public://topics-images/tomb_raider_logo_2022.png
Guardians of the Galaxy
public://topics-images/guardians_of_the_galaxy-logo.png
Kindle
public://topics-images/kindle-smile-logo.png
Amazon Prime
public://topics-images/prime.png
Amazon Luna
public://topics-images/amazon-luna-logo.png
Moon Studios
public://topics-images/moon.png
Ghost Recon
public://topics-images/ghost_recon_logo.png
Wolfenstein
public://topics-images/wolfenstein_logo.svg_.png
Pony.ai
public://topics-images/img_2799.png
Premier League
public://topics-images/pl-logo-light.png
Horizon
public://topics-images/horizon_game_series_logo.png
Exchange
public://topics-images/exchange_1500x1500.png
Mercedes-Benz
public://topics-images/mercedes_benz-logo.png
Django
public://topics-images/django_logo.svg_.png
Apple Card
public://topics-images/apple-card.png
JPMorgan
public://topics-images/logo-jpm-brown.png
Bitchat
public://topics-images/img_6038.png
Palo Alto Networks
public://topics-images/img_6100.png
KBTG
public://topics-images/c8qypege_400x400.jpg
Linux Foundation
public://topics-images/lf_sustainability_banner.png
Octopath Traveler
public://topics-images/project_octopath_traveler_logo.png
Monster Hunter
public://topics-images/monster_hunter_logo.png
Hideo Kojima
public://topics-images/kojima.jpg
Nintendo Switch
public://topics-images/switch1.png
Cerebras
public://topics-images/celebras.png
2K Games
public://topics-images/2k_2021_logo.svg_.png
BioShock
public://topics-images/bioshock-logo.svg_.png
Australia
public://topics-images/flag_of_australia.png
Groq
public://topics-images/groq.png
Ukraine
public://topics-images/flag_of_ukraine.svg_.png
Delta Air Lines
public://topics-images/o1z2hvzv_400x400.jpg
SAP
public://topics-images/img_8162.png
Audible
public://topics-images/lj9g-ikl_400x400.png
Vine
public://topics-images/vine_logo.svg_.png
THQ Nordic
public://topics-images/thq_nordic_logo_2016.svg_.png
Darksiders
public://topics-images/darksiders_logo.png
Embracer Group
public://topics-images/embracer_group_logo.svg_.png
Kingdom Come
public://topics-images/kcd2-banner-2.png
Gearbox
public://topics-images/gearbox_software_logo.svg_.png
Rockstar
public://topics-images/rockstar.png
Amazon Games
public://topics-images/amazon_games_logo.svg_.png
New World
public://topics-images/new-world.png
Crystal Dynamics
public://topics-images/cd.png
Metro Games
public://topics-images/metro.png
Supermicro
public://topics-images/img_8331.png
Genshin Impact
public://topics-images/genshin_impact_logo.svg_.png
Tan Lip-Bu
public://topics-images/img_8326.jpeg
Hulu
public://topics-images/hulu.png
iFixit
public://topics-images/ifixit_logo.svg_.png
Nightdive Studios
public://topics-images/nightdive_studios.svg_.png
id Software
public://topics-images/id_software.svg_.png
Quake
public://topics-images/quake.png
Astro
public://topics-images/astro.png
Zend
public://topics-images/logo-zend-reg.png
PHP
public://topics-images/php-logo.svg_.png
Framework Laptop
public://topics-images/framework.png
WebKit
public://topics-images/webkit_logo-2023-svg.png
Safari
public://topics-images/safari.png
Diablo
public://topics-images/diablo.png
Warcraft
public://topics-images/warcraft_logo.png
Blizzard
public://topics-images/blizzard_entertainment_logo_2015.svg_.png
Overwatch
public://topics-images/overwatch_circle_logo.svg_.png
World of Warcraft
public://topics-images/logo-wow.png
Hearthstone
public://topics-images/hearthstone.png
HandBrake
public://topics-images/handbrake.png
AOL
public://topics-images/hkam9td-400x400.png
Yahoo!
public://topics-images/yahoo.png
PayPay
public://topics-images/paypay.png
WinRAR
public://topics-images/winrar.png
ESET
public://topics-images/eset.png
Internet Archive
public://topics-images/bygruzmj_400x400.png
OpenSSH
public://topics-images/2387206.png
Vodafone
public://topics-images/vodafone.png
Verizon
public://topics-images/verizon.png
Microsoft Defender
public://topics-images/defender.png
Cryptocurrency
public://topics-images/bitcoin.svg__0.png
LINE Webtoon
public://topics-images/naver_line_webtoon_logo.png
Google News
public://topics-images/google-news.png
Pebble
public://topics-images/pebble.png
FFmpeg
public://topics-images/ffmpeg_logo_new.svg_.png
VLC
public://topics-images/vlc_icon.svg_.png
AV1
public://topics-images/av1_logo_2018.svg_.png
Football Manager
public://topics-images/fm.png
United Kingdom
public://topics-images/flag_of_the_united_kingdom.png
Python
public://topics-images/python-logo-notext.svg_.png
DuckDuckGo
public://topics-images/duck.png
nginx
public://topics-images/nginx.png
Google Translate
public://topics-images/google-translate.png
Parag Agrawal
public://topics-images/parag.jpg
VirtualBox
public://topics-images/virtualbox_2024_logo.svg_.png
Google Flights
public://topics-images/travel_flights_96dp_maskable.png
Posit
public://topics-images/posit-logo-2024.png
Apple Health
public://topics-images/apple-health.png
BMW
public://topics-images/bmw.svg_.png
Node.js
public://topics-images/node.js_logo.svg__0.png
Workday
public://topics-images/qa8vjtrt_400x400.png
MSNBC
public://topics-images/msnbc_2023.svg_.png
PuTTY
public://topics-images/screenshot-2025-08-20-at-00.23.08.png
Batman
public://topics-images/batman.png
LibreOffice
public://topics-images/libreoffice.png
Google Pixel 10
public://topics-images/pixel10_.png
Pixel Watch
public://topics-images/watch.png
Google Pixel Buds
public://topics-images/buds-2a.png
Ghost of Tsushima
public://topics-images/gotlogo.png
Fitbit
public://topics-images/fitbit.png
Hollow Knight
public://topics-images/silksong-cover.png
Tropico
public://topics-images/tropico_logo.png
DirectX
public://topics-images/directx.png
ROG Ally
public://topics-images/rog-ally.png
FBI
public://topics-images/seal_of_the_federal_bureau_of_investigation.svg_.png
ZA/UM
public://topics-images/zaum.png
Saudi Arabia
public://topics-images/flag_of_saudi_arabia.png
Niantic Labs
public://topics-images/niantic.png
Pokemon Go
public://topics-images/pokemon-go.png
Scopely
public://topics-images/scopely.png
Monopoly
public://topics-images/monopoly.png
Transformers
public://topics-images/transformers_2014_logo.png
Hashbro
public://topics-images/hasbro_logo.svg_.png
Sony Pictures
public://topics-images/sony_pictures_inc-logo.svg_.png
Angry Birds
public://topics-images/angry_birds_promo_art.png
Atom Text Editor
public://topics-images/atom.png
Electron
public://topics-images/electron.png
Zed
public://topics-images/zed.png
Finland
public://topics-images/flag_of_finland.svg_.png
South Korea
public://topics-images/flag_of_south_korea.png
Xbox Game Pass
public://topics-images/xbox_game_pass.png
HP
public://topics-images/hp_new.png
Taylor Swift
public://topics-images/img_0838.png
Atari
public://topics-images/atari_official_2012_logo.svg_.png
BYD
public://topics-images/byd_auto_2022_logo.svg_.png
Stardew Valley
public://topics-images/stardew.png
Escape From Tarkov
public://topics-images/tarkov.png
McDonalds
public://topics-images/mcdonalds.png
Taco Bell
public://topics-images/taco-bell-icon.png
Fastly
public://topics-images/fastly_logo.svg_.png
Bangkok Bank
public://topics-images/bangkok-bank.png
Western Digital
public://topics-images/western_digital_logo-2025-svg.png
Dolby
public://topics-images/dolby.png
Hisense
public://topics-images/hisense.png
Sharp
public://topics-images/sharp.png
Toshiba
public://topics-images/toshiba.png
Anker
public://topics-images/ankerpng.png
EVO
public://topics-images/evo_championship_series_logo.png
MrBeast
public://topics-images/img_1683.jpeg
Garmin
public://topics-images/garmin.png
HPE
public://topics-images/img_1744.png
Atlassian
public://topics-images/atlassian.png
The Browser Company
public://topics-images/browser-company.png
ThinkPad
public://topics-images/thinkpad_logo.svg_.png
Lenovo
public://topics-images/lenovo-2015-svg_0.png
European Commission
public://topics-images/eu-com.png
Firaxis Games
public://topics-images/firaxis.png
AppLovin
public://topics-images/9qvw0l4x_400x400.png
OnePlus
public://topics-images/oneplus.png
Beats
public://topics-images/beats.png
VK
public://topics-images/vk.png
Russia
public://topics-images/flag_of_russia.png
Wargaming
public://topics-images/wg.png
Nebius
public://topics-images/tcowockq_400x400.png
AirPods
public://topics-images/airpodspro3.png
Apple Watch
public://topics-images/watch11.png
Apple Watch Ultra
public://topics-images/watchultra3.png
iPhone 17 Pro
public://topics-images/ip17_pro.png
iPhone Air
public://topics-images/iphoneair.png
iPhone 17
public://topics-images/iphone17.png
Apple Watch SE
public://topics-images/applewatchse.png
Unicode
public://topics-images/13873561.jpeg
Bending Spoons
public://topics-images/bending.png
Larry Ellison
public://topics-images/larryel.png
Stability AI
public://topics-images/stability_ai-wordmark.png
NPM
public://topics-images/npm.png
F5 Networks
public://topics-images/f5_400.png
HMD
public://topics-images/hmd_global_logo_2024.png
Fire Emblem
public://topics-images/fire_emblem_logo.svg_.png
FDA
public://topics-images/untvhciq_400x400.jpg
Hades
public://topics-images/hades-2-logo.png
Metroid
public://topics-images/metroid_logo_2017.svg_.png
Nova Launcher
public://topics-images/nova.png
Alphabet
public://topics-images/alphabet.png
Webtoon
public://topics-images/webtoon1.png
Ray-Ban
public://topics-images/ray-ban_logo.svg_.png
Java
public://topics-images/java_programming_language_logo.svg_.png
StubHub
public://topics-images/stubhub.png
Oakley
public://topics-images/oakley_logo.svg_.png
Horizon Worlds
public://topics-images/meta-horizon.png
Netskope
public://topics-images/netskope.png
WebAssembly
public://topics-images/webassembly_logo.svg_.png
Roku
public://topics-images/roku.png
AYANEO
public://topics-images/ayaneo.png
AKB48
public://topics-images/akb48.png
Northrop Grumman
public://topics-images/northrop_grumman.png
True ID
public://topics-images/true-id.png
Google Play Games
public://topics-images/gg-play-games.png
Insomniac
public://topics-images/insomniac_games.png
Deus Ex
public://topics-images/deus_ex_universe_logo.png
Housemarque
public://topics-images/housemarque.svg_.png
Google Search
public://topics-images/google-search-app.png
Raspberry Pi
public://topics-images/x9zmzhi9_400x400.jpg
eBay
public://topics-images/img_4817.jpeg
Klook
public://topics-images/klook.png
Google Home
public://topics-images/new-google-home.png
Jules
public://topics-images/jules.png
Supabase
public://topics-images/supabase.png
Firebase
public://topics-images/firebase.png
Peter Molyneux
public://topics-images/peter_molyneux.jpg
Affinity
public://topics-images/p5wlrso8_400x400.jpg
Unity
public://topics-images/unity.png
Deloitte
public://topics-images/logo_of_deloitte.svg_.png
Hitachi
public://topics-images/d5cb3u_d_400x400.png
AltStore
public://topics-images/altstore.jpg
Nobel
public://topics-images/nobel.png
Arduino
public://topics-images/arduino_logo.png
Sora
public://topics-images/img_8233.png
Windows XP
public://topics-images/windows_xp.png
GoPro
public://topics-images/gopro.png
Pikmin
public://topics-images/pikmin.png
Windows 10
public://topics-images/windows_10_logo.svg_.png
Toyota
public://topics-images/toyota-logo.png
iPad Pro
public://topics-images/ipadpro.png
Apple M5
public://topics-images/apple-m5.png
MacBook Pro
public://topics-images/macbookpro.png
Coral
public://topics-images/coral_symbol.png
Parallels
public://topics-images/parallels.png
Privacy Sandbox
public://topics-images/privacy-sandbox.png
Indiegogo
public://topics-images/352568630_639892788063249_6998682290287321916_n.jpg
GIMP
public://topics-images/wilber-big.png
JavaScript
public://topics-images/unofficial_javascript_logo_2.svg_.png
Xubuntu
public://topics-images/vvrc4lnm_400x400.jpg
Atlas
public://topics-images/atlas_browser.png
Mastercard
public://topics-images/mastercard.png
ICANN
public://topics-images/icann_logo.svg_.png
Halo
public://topics-images/halo-series-logo.svg_.png
Open Source
public://topics-images/open_source_initiative.svg_.png
Grokipedia
public://topics-images/grokipedia.png
Redmi
public://topics-images/redmi.png
SUSE
public://topics-images/suse.png
Superhuman
public://topics-images/img_1132.jpeg
Paramount
public://topics-images/paramount.png
Pat Gelsinger
public://topics-images/img_1172.jpeg
Animal Crossing
public://topics-images/img_1544.png
Magic Leap
public://topics-images/magic_leap_logo.svg_.png
Coca-Cola
public://topics-images/coca_cola.png
PlayStation Portal
public://topics-images/ps-portal.png
Polestar
public://topics-images/polestar.png
Eclipse Foundation
public://topics-images/eclipse-foundation.png
Moonshot AI
public://topics-images/moonshot-ai.png
BioWare
public://topics-images/bioware_2018.svg_.png
Mass Effect
public://topics-images/logo_mass_effect.svg_.png
Red Dead Redemption
public://topics-images/red-dead.png
ROCm
public://topics-images/rocm.png
Reuters
public://topics-images/reuters.png
Battery
public://topics-images/battery.png
Yann LeCun
public://topics-images/357655504_766123181865912_4812354228100980545_n.jpg
Amazon Leo
public://topics-images/leo-logo.png
X
public://topics-images/google-x.png
Steam Machine
public://topics-images/steam-machine.png
Deezer
public://topics-images/deezer_logo.jpg
Windows
public://topics-images/windows.png
Jeff Bezos
public://topics-images/jeff.jpg
The Game Awards
public://topics-images/the-game-award.png
Antigravity
public://topics-images/google-antigravity.png
Nexperia
public://topics-images/vydrpct0_400x400.jpg
Netherlands
public://topics-images/netherland_flag.png
SQLite
public://topics-images/sqlite.png
Rocket League
public://topics-images/rocket.png
AirDrop
public://topics-images/airdrop.png
Cities: Skylines
public://topics-images/cities-2.png
Ai2
public://topics-images/ai2.png
CSA
public://topics-images/csa.jpg
Matter
public://topics-images/matter.png
Apple TV
public://topics-images/appletv.png
Cryptography
public://topics-images/gemini_generated_image_lmurlulmurlulmur-removebg-preview.png
Quick Share
public://topics-images/quickshare.png
PS3
public://topics-images/ps3.png
PDPC
public://topics-images/pdpc.png
Far Cry
public://topics-images/farcry-logo.png
Spring
public://topics-images/spring.png
KDE
public://topics-images/kde.png
SCB 10X
public://topics-images/scb10x.png
Airbus
public://topics-images/logo_blue-copy.png
Nano Banana
public://topics-images/nano-banana.png
teppay
public://topics-images/teppay.png
Absurd Ventures
public://topics-images/absurd.png
IPO
public://topics-images/ipo_font.png
Memory
public://topics-images/media-flash.svg_.png
Synopsys
public://topics-images/bfge93-w_400x400.jpg
MKBHD
public://topics-images/mkbhd.jpg
Let's Encrypt
public://topics-images/lsujvwxu_400x400.jpg
Bun
public://topics-images/bun.png
Z.ai
public://topics-images/zai.png
Kiro
public://topics-images/kiro.png
Binance
public://topics-images/f5y2qenu_400x400.jpg
Total War
public://topics-images/total-war.png
Oxford English Dictionary
public://topics-images/oajpdine_400x400.jpg
Mihoyo
public://topics-images/mihoyo.png
Tekken
public://topics-images/tekken_series_logo.svg_.png
XREAL
public://topics-images/xreal.png
Elastic
public://topics-images/elastic.png
Elasticsearch
public://topics-images/elasticsearch.png
OpenSearch
public://topics-images/opensearch.png
Log4j
public://topics-images/apache_log4j_logo.png
Circana
public://topics-images/circana.png
Terra
public://topics-images/terra.png
Larian Studios
public://topics-images/larian.jpg
Time
public://topics-images/cv44xy5x_400x400.jpg
Control
public://topics-images/control.png
Remedy Entertainment
public://topics-images/remedy.png
Alan Wake
public://topics-images/alanwake-logo.svg_.png
Rockman
public://topics-images/rockman_logo.png
R
public://topics-images/r_logo.svg_.png
System76
public://topics-images/system76.png
Tether
public://topics-images/fzan41qwaae5z82.jpg
iRobot
public://topics-images/ifhlpvr6_400x400.jpg