เมื่อคนที่ยังงูๆ ปลาๆ Python มาเรียนภาษา R เพิ่ม: รีวิวคอร์ส R from Zero โดยเพจ Data Content

ถ้ามองย้อนกลับไปสัก 3 เดือนก่อน เราคงไม่เห็นภาพตัวเองมานั่งพิมพ์โค้ด

แต่ตอนนี้คือเรากำลังจะเรียนภาษาที่ 2 ที่ใช้ในแวดวงโปรแกรมมิ่งแล้ว แม้ว่าภาษาแรกอย่าง python จะยังไม่ได้เอาไปใช้ทำอะไรเป็นเรื่องเป็นราวก็ตาม แต่ก็อยากเรียนเพิ่มอ้ะ อยากรู้ว่าจะเป็นยังไง

หลังจากที่ครั้งก่อนได้เรียน python ไป วันนี้เราก็มาลองของใหม่กันบ้าง นั่นก็คือภาษา R ที่จะเน้นใช้ในการวิเคราะห์ข้อมูล โดยคอร์สนี้คือคอร์ส R from Zero สอนโดยเจ้าเก่าอย่างเพื่อนเรา แอดมินเพจ Data Content น่ะเอง

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

เราขอไล่หัวข้อไปตามที่ทางเพจให้ข้อมูลไว้เลยละกันเพื่อความง่ายต่อการอธิบาย โดยที่เรียนในวันนี้จะมี 3 ส่วนหลักๆ กับอีก 1 ส่วนพิเศษ สอนยาวกันตั้งแต่ 9 โมงยัน 5 โมงเลยทีเดียว ขอคารวะความอึดของแอดมินอีกครั้งนะ

Part 1: INTRODUCTION

1.1 รู้จัก R และ RStudio กันก่อน

สำหรับภาษา R นี่ทางแอดมินบอกเลยว่าคอร์สนี้จะเน้นเรื่องการคำนวณและสถิติมากสักหน่อย เพราะ R มันถูกออกแบบมาเพื่อประการนี้แหละ ซึ่งเมื่อเทียบกับ python แล้ว R นี่คำนวณได้เจ๋งกว่าเยอะ ไม่ต้อง import library เสริมมากมาย เพราะโปรแกรมมันเกิดมาเพื่อคำนวณอยู่แล้ว ฟังก์ชั่นคำนวณจึงมีพร้อม พิมพ์สั่งคำสั่งกันได้เลย

สำหรับ R นั้นมันจะมี 2 โปรแกรมที่เกี่ยวข้องกัน คือ R เฉยๆ กับ RStudio ซึ่งสิ่งที่ tricky คือแม้เราจะบอกว่าเรากำลังจะเขียน R แต่โปรแกรมที่เราใช้ไม่ใช่ R เว้ย มันคือ RStudio ต่างหาก

ซึ่งความแมวอยู่ตรงนี้… R ทำงานโดยปราศจาก RStudio ได้ แต่ RStudio อยู่ไม่ได้ถ้าไม่มี R

เอ๊า ทำไมต้องมี 2 อันมาให้งงเล่น

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

แค่เปิดหน้าจอของทั้ง 2 โปรแกรมเทียบกันก็จะพอรู้ว่าทำไมเราควรย้ายตัวเองไปอยู่ใน RStudio .. RStudio จะมีการแทร็กให้ด้วยว่าตัวแปรที่เรากำลังใช้งานอยู่คืออะไร มีช่องพิมพ์โค้ด (Script) ช่องแสดงผล (Console) ช่องบอกค่า (Environment) และช่องจิปาถะ (ไม่รู้จะแปลสั้นๆ ยังไงง่ะ) หรือ Graphical Output ซึ่งเป็นช่องที่หากเราสร้างกราฟ กราฟก็จะถูกแสดงได้นี้ นอกจากนี้มันก็ยังมีไว้ใช้อวดว่ามีฟังก์ชั่นอะไรให้เล่นบ้าง

Screen Shot 2018-10-06 at 9.37.27 AM
4 หน้าต่างหลักๆ

ฟังๆ ดูแล้วก็ตลกดี ที่การใช้งานส่วนใหญ่อยู่บน RStudio ที่เป็นตัวเสริม ไม่ใช่ R ซึ่งเป็นโปรแกรมหลัก

1.2 Hello World

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

เมื่อโปรแกรมพร้อมแล้ว เราก็เปิด RStudio เพื่อเริ่มคำสั่งแรกในโหมด Script กันเลย นั่นก็คือคำสั่งทักทายชาวโลก “Hello World” พิมพ์เหมือนใน Python เลย

Screen Shot 2018-10-06 at 9.37.09 AM
เปิดโหมด Script เหมือนใน Python
Screen Shot 2018-10-06 at 9.53.32 AM
Hello World เวอร์ชั่นมีฟันหนูกับไม่มีฟันหนู และลิสต์คำศัพท์ที่ห้ามใช้ตั้งเป็นชื่อตัวแปร ไม่งั้นมันจะตีกันกับคำสั่ง

1.3 Object ต่างๆ เช่น Number, String, Vector, Matrix, List, Dataframe และตัวแปร

โอ้ ช่างมากมายเหลือเกิน ขอบอกว่าวันนี้แอดมินจัดตัวอย่างมาให้แน่นสุดๆ เราเริ่มจากการตั้งตัวแปรกันก่อน ซึ่งภาษา R เราจะใช้ลูกศร <- ในการกำหนดตัวแปรนะฮะ ในขณะที่ python จะใช้เป็น =

Screen Shot 2018-10-06 at 10.16.15 AM
รายชื่อประเภทข้อมูลใน R
Screen Shot 2018-10-06 at 10.18.32 AM
ความเมพคือแค่พิมพ์ pi มันก็รู้เลยว่าค่าคืออะไร
Screen Shot 2018-10-06 at 10.22.58 AM
ข้อมูลประเภท string factor & logical

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

ดูเหมือนจะดี…แต่การที่โปรแกรมเป็นแบบนี้ก็มีจุดที่เราต้องระวังเหมือนกัน เพราะเราจะต้อง run โค้ดกำหนดตัวแปรก่อนเรียกตัวแปรทุกครั้ง ไม่งั้นไม่เรียกไม่ออกเพราะมันไม่รู้ว่าตัวแปรมีค่าเป็นอะไร ตรงนี้ต้องอย่าลืม หรือถ้าจะให้ชัวร์ก็กด source เพื่อรันตัวแปรออกมาให้หมด ไม่ก็ไฮไลต์ครอบโค้ดทั้งหมดแล้วกด run ทีเดียวก็ได้ ถ้าแม่นแล้ว

Screen Shot 2018-10-06 at 9.55.51 AM
มาดูกันซิว่าถ้าตั้ง variable a เป็นชื่อ Jack กับ Ball สองชื่อ เวลาเรียกค่า A มันจะขึ้นว่าอะไร
Screen Shot 2018-10-06 at 9.56.53 AM
มันขึ้นว่า Ball เพราะโปรแกรมจะอ่านจากบนลงล่าง มันจะยึดเอาคำสั่งล่าสุด

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

Screen Shot 2018-10-06 at 10.05.08 AM

Part 2: CALCULATIONS + DATA ANALYSIS 

2.1 สถิติพื้นฐาน เช่น mean median S.D. variance และ z-score

มาหัวข้อนี้ รู้สึกเหมือนกลับไปเรียนมหา’ลัยกันเลยทีเดียว สำหรับการคำนวณทางสถิตินั้นทำได้ง่ายๆ ผ่าน R เลย โค้ดมันตรงตัวมาก ไม่ว่าจะเป็น mean median SD variance เชื่อแล้วว่าสร้างมาเพื่อการนี้จริงๆ

Screen Shot 2018-10-06 at 10.40.33 AM
พิมพ์ค่าแต่ละแบบ มันก็ออกมาเลย

สำหรับการคำนวณ z-score ก็จะซับซ้อนขึ้นอีกนิดนึง เพราะ z-score คือส่วนผสมของ mean และ SD อีกที ก็ต้องนำไปใส่เป็นตัวแปรแล้วคำนวณกันไป

Screen Shot 2018-10-06 at 10.48.42 AM
นำสูตรของแต่ละอันไปใส่ตัวแปร แล้วค่อยคำนวณ

2.2 Vector

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

Screen Shot 2018-10-06 at 10.12.13 AM
วิธีสร้าง vector ขั้นต้น
Screen Shot 2018-10-06 at 11.03.40 AM
นำ vector มาบวกลบกันได้

ความดีงามของ vector ใน R คือ สมมติว่าเราอยากจะเรียกไอเท็มใดไอเท็มหนึ่งออกมา เราสามารถเรียกตามลำดับมันได้เลย ไม่ปวดหัวเหมือน list ใน python ที่ว่าหากเรียกจากด้านซ้ายต้องเริ่มที่ 0 จากด้านขวาเริ่มที่ -1 ไรงี้ มึนมาก

Screen Shot 2018-10-06 at 10.25.26 AM
มันดีตรงนี้แหละ นับลำดับตามความจริง ไม่งงเหมือน python

อ้อ ลูกเล่นอีกอย่างหนึ่งของการทำ vector คือการสร้าง sequence ลองคิดภาพดูว่าหากเราต้องการข้อมูลตัวเลข 1 ถึง 1000 ถ้าต้องให้นั่งพิมพ์มือนี่แย่แน่ คำสั่ง seq() จะมาช่วยชีวิตเรา ง่ายๆ เพียงแค่ใส่ว่าอยากให้ตัวเลขเริ่มที่เท่าไร จบที่เท่าไร และเพิ่มขึ้นทีละเท่าไร

Screen Shot 2018-10-06 at 11.10.52 AM
คำสั่ง seq พิมพ์ได้ 2 แบบ ออกมาเหมือนกัน

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

Screen Shot 2018-10-06 at 11.26.37 AM
เราเลื่อนไปได้เรื่อยๆ เลยว่าจะใช้สูตรไหน

คำสั่งเพิ่มเติมที่สามารถใส่ได้คือ length() เพื่อหาว่า item ใน vector นั้นมีกี่ชิ้น, rep() หรือการกำหนดให้ item ใน vector สร้างจำนวนซ้ำๆ กัน

Screen Shot 2018-10-06 at 11.32.45 AM
คำสั่ง length และ repeating vector

2.3 Function

เราสามารถสร้าง Function ไว้ใช้ในการคำนวณเองด้วยนะ อย่างในตัวอย่างนี้แอดมินใช้เป็นการคำนวณความยาวของสามเหลี่ยมมุมฉาก ด้านที่ยาวที่สุด (hypothenuse) ซึ่งก็คือผลบวกกันของผลยกกำลังของความยาวอีก 2 ด้านมาบวกรวมกัน

Screen Shot 2018-10-06 at 11.22.40 AM
เป็นสูตรคำนวณที่ใช้ครั้งล่าสุดเมื่อสมัยมัธยม แฮ่

2.4 Matrix

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

Screen Shot 2018-10-06 at 11.41.52 AM
สร้าง matrix จาก sequence และกำหนด dimension ให้เป็น 5 แถว 4 คอลัมน์ อันนี้เป็นวิธีแบบกำหนดตัวแปร
Screen Shot 2018-10-06 at 11.43.17 AM
ถ้าอยากจะให้ตัวเลขเรียงจากซ้ายไปขวาแทนบนและล่างแบบรูปก่อน ก็ใช้คำสั่ง transpose
Screen Shot 2018-10-06 at 11.50.18 AM
ถ้าการสร้าง matrix แบบกำหนดตัวแปรมันยาว ขี้เกียจพิมพ์ เราใช้คำสั่ง matrix() ได้ ก็จะสั้นลง พอใส่ byrow มันก็จะเรียงจากซ้ายไปขวาให้

 

 

 

 

 

 

Screen Shot 2018-10-06 at 11.51.52 AM

ถ้า dimension ของ matrix เท่ากัน ก็จับมาบวกลบได้

Screen Shot 2018-10-06 at 11.56.18 AM
ความ tricky คือถ้าจับคูณกัน มันจะคูณแบบตรงๆ คือจับคู่ตัวเลขตำแหน่งเดียวกันมาคูณกัน ซึ่งไม่ใช่วิธีคูณ matrix ที่ถูกต้อง
Screen Shot 2018-10-06 at 11.56.30 AM
ถ้าจะคูณแบบ matrix ต้องใช้เป็น *%*t

2.5 List และ Dataframe สร้างฐานข้อมูล

จากคลาส python ครั้งก่อน เราได้เห็นความ creative ในการสร้างโจทย์ของแอดมินไปแล้ว คราวนี้แอดมินก็ยังไม่ทิ้งคอนเซ็ปต์การสร้างโจทย์ที่ทุกคนสามารถเข้าใจได้ง่ายๆ ด้วยการใช้ตัวอย่างเป็นสมาชิกของ BNK48, The Avengers และ Star Wars ซึ่งฐานข้อมูลก็จะสามารถสร้างได้ 2 แบบคือเป็น list กับ dataframe โดยอย่างหลังนี่แอดมินบอกว่าเป็นลักษณะข้อมูลยอดนิยมของการวิเคราะห์ข้อมูลเลย การเรียกข้อมูลแบบ dataframe ยังดูง่ายกว่าแบบ list อีกด้วย

Screen Shot 2018-10-06 at 1.32.00 PM
สร้าง list ข้อมูล BNK48
Screen Shot 2018-10-06 at 1.32.21 PM
เรียก data แบบระบุตำแหน่ง และ เรียกแบบสร้าง condition ว่าอายุมากกว่าเท่านี้ ความสูงมากกว่าเท่านี้
Screen Shot 2018-10-06 at 1.47.19 PM
list ข้อมูล star wars
Screen Shot 2018-10-06 at 2.01.44 PM
จัดระเบียบข้อมูลด้วยการสร้าง dataframe มันก็คือการนำ list พวกนั้นมาสร้างตารางนั่นละ
Screen Shot 2018-10-06 at 2.02.00 PM
เรียก data แบบระบุแถว/คอลัมน์ก็ได้

2.6 ลองเล่นกับข้อมูลจริงบ้าง ด้วยข้อมูลเซ็ต airquality

ใน RStudio นี่ก็มีเซ็ตข้อมูลจริงให้เราฝึกเล่นนะ ตัวอย่างที่แอดมินยกมาเล่นรัวๆ วันนี้คือ airquality หรือฐานข้อมูลของคุณภาพอากาศในนิวยอร์ก ซึ่งข้อมูลเซ็ตนี้มี sample ที่ค่อนข้างเยอะเลยทีเดียว พอ run ออกมาทีก็จะยาวเป็นหางว่าว แอดมินเลยเสนอทริกในการเลือกดูแค่แถวแรกๆ หรือแถวท้ายๆ เพื่อไม่ให้ข้อมูลล้นเกินไป ด้วยการใช้คำสั่ง head & tail

Screen Shot 2018-10-06 at 2.32.30 PM
เลือกเรียกเฉพาะส่วน ด้วยคำสั่ง head & tail หรือจะเรียกแบบเจาะจงประเภทข้อมูล เช่น เดือนและวัน ก็ได้
Screen Shot 2018-10-06 at 2.35.53 PM
พอจะคำนวณค่า mean ปรากฎว่าออกมาเป็น NA นั่นเพราะข้อมูลมี error อยู่ ต้อง clean ด้วย library ชื่อ tidyverse

ด้วยความที่เป็นข้อมูลจริง จึงเป็น error ในรูปแบบของ NA หลายจุด นี่คือปัญหา เพราะเราจะไม่สามารถคำนวณข้อมูลเหล่านี้ได้เลย ดังนั้นจึงต้องทำการ clean ข้อมูล งานนี้ต้องติดตั้งฟังก์ชั่น tidyverse มาช่วยกันหน่อย ซึ่งวิธีติดตั้งก็แค่เลื่อนเม้าส์ไปตรงปุ่ม package ในกล่องขวาล่าง แล้วพิมพ์ชื่อฟังก์ชั่น กด install ทีนี้หน้าจอซ้ายล่างก็จะรันรัวๆ เลย ค่อนข้างยาวนิดนึง รอกันไป เมื่อเสร็จเรียบร้อยเราก็จะสามารถสั่งให้โปรแกรมลบ NA ออกไปได้ จะได้คำนวณกันได้

Screen Shot 2018-10-06 at 2.44.35 PM
ตัด NA ออกไปก่อน
Screen Shot 2018-10-06 at 2.45.51 PM
คำนวณค่า mean ได้แล้ว

Part 3: DATA VISUALIZATION

3.1 Plot Graph

ถ้าจะให้ตอบว่านอกจากการคำนวณแล้ว มีอะไรที่ R ง่ายกว่า Python บ้าง? ก็เห็นจะเป็นการพล็อตกราฟนี่แหละ ที่พิมพ์เสร็จครบจบในที่เดียว ไม่เหมือนใน python ที่ต้องติดตั้ง library เสริมไปเรื่อย ตัวอย่างที่ยกกันมาในวันนี้ก็อย่างเช่นการสร้าง linear model ซึ่งสามารถกดดู summary เพื่อดูข้อมูลทางสถิติสำคัญๆ ได้ด้วย

Screen Shot 2018-10-06 at 3.15.07 PM
คำนวณค่าต่างๆ มาให้พร้อม!!

การพล็อตกราฟก็ทำได้หลากหลาย ไม่ว่าจะเป็น line graph, histogram, scatter plot, box plot และ scatter plot matrix ที่ดูครั้งแรกแล้วงงมากว่ามันคืออะไร แต่พอเข้าใจแล้วนี่กระจ่างเลย มันสุดยอดดด อ้อ แล้วเราสามารถปรับเปลี่ยนรูปลักษณ์การแสดงผลของกราฟแบบ scatter plot ได้ด้วย อยากเปลี่ยนเป็นรูปสามเหลี่ยม ดาว สี่เหลี่ยม วงกลม ได้หมดตามใจชอบ มีกราฟหลากหลายหน้าตาให้เลือกเล่นด้วย อันข้างล่างนี้ส่วนใหญ่จะมาจากข้อมูลเซ็ต airquality ที่เล่นกันไปเมื่อครู่

Part 4: Extra Workshop: Clustering

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

Screen Shot 2018-10-06 at 4.50.52 PM
ถึงตรงนี้สมงสมองไปละ พิมพ์ตามอย่างเดียวฮะ

จบกันไปแล้วกับคอร์ส R from Zero โดยแอดมินเพจ Data Content ถือเป็นอีกวันที่เนื้อหาเข้มข้นมาก โดยส่วนตัวเราว่าเข้มข้นกว่า Python เยอะเลย อาจจะเพราะมีการคำนวณค่อนข้างเยอะด้วยละมั้ง แต่พอมาเรียนอย่างนี้ก็ทำให้เราเข้าใจว่าความแตกต่างระหว่าง python และ R คืออะไร ทำไมถึงควรใช้เป็นทั้ง 2 อัน? ก็เพราะทั้ง 2 อันมีจุดแข็งต่างกันไป ฝั่ง python จะทำโจทย์แนว logic ได้สวยกว่า ง่ายกว่า ส่วน R จะทำเรื่องคำนวณ สร้างกราฟได้ง่ายกว่า

Screen Shot 2018-10-06 at 4.38.46 PM
if ในนี้ต้องมีเติมปีกกาด้วย ใน python ไม่มี

สำหรับใครที่สนใจอยากเข้าร่วมคอร์ส สามารถไปกดติดตามเพจ  Data Content ได้เลย เค้าจะมีมาอัพเดตเรื่อยๆ เลยละ สุดท้ายแล้วก็ต้องขอคารวะแอดมินที่สามารถอัดเนื้อหาที่ปกติแล้วควรเรียนกันหลายคอร์สให้เหลือคอร์สเดียวได้ -/I\-

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Blog at WordPress.com.

Up ↑

%d bloggers like this: