เรียนรู้การสร้างกราฟ Time Series และ Charts แบบต่าง ๆ ด้วย R Studio

เรียนรู้การสร้างกราฟ Time Series และ Charts แบบต่าง ๆ ด้วย R Studio

02 July 2020

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

ภาษา R เป็นภาษาทางคอมพิวเตอร์ที่นิยมใช้อย่างกว้างขวางมากในหมู่นักวิเคราะห์ข้อมูลทางสถิติและมีแนวโน้มที่จะได้รับความนิยมเพิ่มมากขึ้นเรื่อย ๆ ทั้งนี้ เนื่องจากการที่ทุกคนสามารถใช้ R ได้ฟรีโดยไม่ต้องเสียค่าใช้จ่าย ภาษา R จึงได้รับความนิยมเป็นอย่างมากจากทั้งวงการวิชาการ และภาคเอกชน อีกทั้ง ผลการวิเคราะห์ทางสถิติด้วย R นั้น ยังได้รับการยอมรับจากนานาชาติ และยังสามารถใช้งานได้ทั้งในระบบปฏิบัติการ Window PC, Mac และ Linux 1.2.4

ปกติแล้วเราเขียนภาษา R บนไหนกัน?

โปรแกรมที่ช่วยให้เราเขียนภาษา R ได้ง่ายนั้นก็คือ R Studio โดยผู้ใช้สามารถปรับแต่ง UI ให้เหมาะกับการใช้งานของตัวเอง แถมยังมีความยืดหยุ่นสูงอีกด้วย





รูปที่ 1 โลโก้ของโปรแกรม R และ R Studio

สำหรับผู้อ่านที่อยากจะลองทำตาม tutorial ในบทความนี้ ท่านจะต้องลงโปรแกรม R และ RStudio ก่อนนะครับ โดยท่านสามารถดาวน์โหลดทั้งสองโปรแกรมได้ที่ลิ้งนี้เลย

R Program -> https://cran.r-project.org/  (เลือกลงได้เลย: Windows | Mac | Linux)

R Studio    -> https://www.rstudio.com/

ข้อมูลผู้ติดเชื้อ COVID-19 ในประเทศไทย

เราจะทำการดึงข้อมูลจากศูนย์กลางการให้บริการข้อมูลเปิดภาครัฐ (Open Government Data) (https://www.data.go.th/dataset/covid-19-daily) เราสามารถดึงข้อมูลจากเว็บไซต์นี้ออกมาได้หลายรูปแบบเลยครับ แต่เพื่อให้ผู้ที่พึ่งรู้จักกับภาษา R ได้เข้าใจง่ายขึ้น เราจะดึงออกมาในรูปแบบ Excel กันนะครับ

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

รูปที่ 2 หน้าเว็บไซต์ศูนย์กลางการให้บริการข้อมูลเปิดภาครัฐ (Open Government Data)

หลังจากที่ผู้อ่านได้ข้อมูลและลงโปรแกรมเป็นที่เรียบร้อยแล้ว เรามาเริ่มสร้างกราฟกันเลยดีกว่าครับ

รูปที่ 3 โปรแกรม R Studio

นี่คือหน้าตาของโปรแกรม R Studio ครับ น่าใช้มากเลยใช่ไหมครับ หากใครไม่ชอบ Dark mode หรือ font ในการเขียนโค้ด ก็สามารถเปลี่ยนตามที่ชอบได้เลยครับ

เริ่มแรกเราจะต้องติดตั้งและเรียกใช้ Package ที่จำเป็นจะต้องใช้ในการสร้างกราฟ โดยผมได้รวมมาให้แล้วครับ ให้ทุกคนนำโค้ดด้านล่างวางบน R script จากนั้นก็กด run กันได้เลยครับ

> install.packages("tidyverse","ggplot2","dplyr","hrbrthemes","ggpubr")
> library(tidyverse)
> library(ggplot2)
> library(dplyr)
> library(scales)
> library(hrbrthemes)
> library(readxl)
> library(ggpubr)

เมื่อติดตั้ง package และทำการเรียกใช้ package ทั้งหมดนี้ด้วยคำสั่ง library() กันเสร็จแล้ว ขั้นตอนแรก ผมอยากให้ทุกคน import ข้อมูลเข้ามาในโปรแกรม โดยการ click import จากเมนูหรือ run ตาม script แค่เปลี่ยน Location ที่ข้อมูลวางอยู่ให้ตรงกับที่อยู่ของไฟล์ในเครื่องคอมพิวเตอร์ของคุณเท่านั้นเองครับ

> Covid_Th <- read_excel("C:/…………/20200528_pm.xlsx")

ผมได้เก็บข้อมููลไว้ในชื่อ Covid_Th

รูปที่ 4 แสดงตารางข้อมูลผู้ติดเชื้อบนโปรแกรม R Studio

หลังจากที่เราได้ข้อมูลมาแล้ว เราจะทำการเปลี่ยนประเภทของคอลัมน์ Announce Date ให้อยู่ในรูปของวันที่ (Date Format) ที่โปรแกรม R เข้าใจและสามารถนำมาสร้างกราฟได้อย่างถูกต้อง

> Covid_Th$`Announce Date` <- as.Date(Covid_Th$`Announce Date`, "%m/%d/%Y")

วิธีตรวจสอบก็คือ

> class(Covid_Th$`Announce Date`)
[1] "Date"

จะเห็นว่า คอลัมน์นี้เป็นข้อมูลประเภทวันที่เรียบร้อยแล้ว

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

ผมจะสร้าง Dataset ใหม่ขึ้นมา เพื่อนับจำนวนผู้ป่วย COVID-19 ในแต่ละวันชื่อว่า Covid_Th_group

> Covid_Th_group <- Covid_Th %>% 
      group_by(`Announce Date`) %>% 
      summarise(count = n())

เมื่อผมนำ Covid_Th_group ไปพลอต จะได้ผลลัพธ์ตามด้านล่างนี้ครับ

> Covid_Th_Plot <- ggplot(data = Covid_Th_group, aes(x = `Announce Date`, y = `count`)) + 
geom_line(size = 0.8,color = "#00AFBB")
รูปที่ 5 กราฟแสดงจำนวนผู้ติดเชื้อ COVID-19

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

> Covid_Th_Plot <- Covid_Th_Plot +
geom_point() +
labs(title="จำนวนผู้ติดเชื้อ Covid-19 ในประเทศไทยรายวัน",
      caption ="Source: https://data.go.th/dataset/covid-19-daily",x = "Date", y = "Number") +
xlab("") +
scale_x_date(labels = date_format("%Y %b %d"),date_breaks = "5 day") +
theme_ipsum() +
theme(axis.text.x=element_text(angle=60, hjust=1),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank())
รูปที่ 6 กราฟแสดงจำนวนผู้ติดเชื้อ COVID-19

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

> Covid_Th_Plot2 <- ggplot(data = Covid_Th %>% group_by(`Announce Date`,`sex`) %>%
summarise(count = n()), aes(x = `Announce Date`, y = `count`)) + 
geom_line(aes(col = sex),size = 0.8)  +
scale_color_manual(values = c("#00AFBB", "#E7B800")) +
scale_fill_manual(values = c("#00AFBB", "#E7B800")) +
labs(title="จำนวนผู้ติดเชื้อ Covid-19 ในประเทศแบ่งตามเพศของผู้ติดเชื้อรายวัน",
      caption ="Source: https://data.go.th/dataset/covid-19-daily",
      x = "Date", y = "Number") +
xlab("") +
scale_x_date(labels = date_format("%Y %b %d"),date_breaks = "5 day") +
theme_ipsum() +
theme(axis.text.x=element_text(angle=60, hjust=1),
      panel.grid.major.x = element_blank(),
      panel.grid.minor.x = element_blank())
รูปที่ 7 กราฟแสดงผู้ติดเชื้อ Covid-19 แบ่งตามเพศ

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

> ggarrange(Covid_Th_Plot, Covid_Th_Plot2, nrow = 2)
รูปที่ 8 รวมกราฟของรูปที่ 6 และ 7

นอกจากกราฟเส้นที่ได้แสดงไปแล้วนั้น Package ggplot2 ยังได้ถูกออกแบบมาให้เราสามารถสร้างกราฟชนิดอื่นได้อีกด้วย หากอยากเปรียบเทียบเพศในแต่ละวันผ่านกราฟแท่ง ก็สามารถทำได้ด้วยการแก้ code “geom_line” เป็น “geom_bar” ตามด้านล่างเลยครับ

> ggplot(Covid_Th, aes(`Announce Date`)) +
geom_bar(aes(fill = sex), position = position_stack(reverse = FALSE)) +
scale_color_manual(values = c("#00AFBB", "#E7B800")) +
scale_fill_manual(values = c("#00AFBB", "#E7B800")) +
labs(title="เปรียบเทียบจำนวนผู้ติดเชื้อ Covid-19 รายวันตามเพศสภาพ",
        caption ="Source: https://data.go.th/dataset/covid-19-daily",
        x = "Date", y = "Number") +
xlab("") +
scale_x_date(labels = date_format("%Y %b %d"),date_breaks = "5 day") +
theme_ipsum() +
theme(axis.text.x=element_text(angle=60, hjust=1),
         panel.grid.major.x = element_blank(),
         panel.grid.minor.x = element_blank())
รูปที่ 9 กราฟแท่งเปรียบเทียบจำนวนผู้ติดเชื้อ COVID-19

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

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

> ggplot(data = Covid_Th , aes(x =`Province of onset`)) +
geom_bar(aes(fill = `sex`)) +
labs(title="เปรียบเทียบจำนวนผู้ติดเชื้อ Covid-19 ตามจังหวัด",
        caption ="Source: https://data.go.th/dataset/covid-19-daily",
        x = "Province of onset", y = "Number") +
xlab("") +
theme_ipsum() +
theme(axis.text.x=element_text(angle=60, hjust=1),
         panel.grid.major.x = element_blank(),
         panel.grid.minor.x = element_blank())   
รูปที่ 10 กราฟแท่งเปรียบเทียบรายจังหวัด

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

> Covid_Th_group2 <- Covid_Th %>%
   group_by(`sex`) %>%
   summarise(count = n())
> ggplot(Covid_Th_group2, aes(x="", y=count, fill=sex)) +
geom_bar(stat="identity", width=1) +
coord_polar("y", start=0) +
theme_minimal() +
theme(axis.text.x=element_blank()) +
geom_text(aes(label = paste0(round(count*100/sum(count)), "%")), position = position_stack(vjust = 0.5),size=8) +
labs(x = NULL, y = NULL, fill = NULL, title = "สัดส่วนเพศของจำนวนผู้ติดเชื้อ Covid-19 ในประเทศไทย")+
theme_classic() +
theme(axis.line = element_blank(),
      axis.text = element_blank(),
      axis.ticks = element_blank(),
      plot.title = element_text(hjust = 0.5,size = 25),
      legend.text = element_text(size = 20))
รูปที่ 11 กราฟวงกลมแสดงสัดส่วนการติดเชื้อ Covid-19 ตามเพศ

จากบทความข้างต้น จะเห็นได้ว่า เราสามารถสร้างกราฟสวย ๆ แสดงจำนวนผู้ติดเชื้อ COVID-19 ได้ไม่ยากจากการใช้โปรแกรม R Studio ซึ่งเป็นโปรแกรมฟรี ไม่มีค่าใช้จ่าย ผู้อ่านสามารถติดตั้งและใช้งาน package ggplot2 ภายในโปรแกรม R Studio ได้เลยครับ ซึ่งการใช้ package ต่าง ๆ จะทำให้เราเขียนภาษา R เพื่อทำการวิเคราะห์ข้อมูลได้ง่ายขึ้นมาก สำหรับ package ggplot2 นี้ถือเป็น package ยอดนิยมในการสร้างกราฟของเหล่าบรรดาสาวก R อีกด้วยครับ ในบทความนี้ผมได้นำข้อมูลผู้ติดเชื้อ COVID-19 มาเป็นตัวอย่างในการทำ Visualization เพื่อเป็นไอเดียให้ทุกคนสามารถนำไปประยุกต์กับข้อมูลที่สนใจหรือทำอยู่ในปัจจุบันได้ง่ายขึ้นครับ

Data Scientist
Government Big Data Institute: GBDi

แบ่งปันบทความ

กลุ่มเนื้อหา

แท็กยอดนิยม

แจ้งเรื่องที่อยากอ่าน

คุณสามารถแจ้งเรื่องที่อยากอ่านให้เราทราบได้ !
และเราจะนำไปพัฒนาบทความให้มีเนื้อหาที่น่าสนใจมากขึ้น

PDPA Icon

We use cookies to optimize your browsing experience and improve our website’s performance. Learn more at our Privacy Policy and adjust your cookie settings at Settings

Privacy Preferences

You can choose your cookie settings by turning on/off each type of cookie as needed, except for necessary cookies.

Accept all
Manage Consent Preferences
  • Strictly Necessary Cookies
    Always Active

    This type of cookie is essential for providing services on the website of the Personal Data Protection Committee Office, allowing you to access various parts of the site. It also helps remember information you have previously provided through the website. Disabling this type of cookie will result in your inability to use key services of the Personal Data Protection Committee Office that require cookies to function.
    Cookies Details

  • Performance Cookies

    This type of cookie helps the Big Data Institute (Public Organization) understand user interactions with its website services, including which pages or areas of the site are most popular, as well as analyze other related data. The Big Data Institute (Public Organization) also uses this information to improve website performance and gain a better understanding of user behavior. Although the data collected by these cookies is non-identifiable and used solely for statistical analysis, disabling them will prevent the Big Data Institute (Public Organization) from knowing the number of website visitors and from evaluating the quality of its services.

  • Functional Cookies

    This type of cookie enables the Big Data Institute (Public Organization)’s website to remember the choices you have made and deliver enhanced features and content tailored to your usage. For example, it can remember your username or changes you have made to font sizes or other customizable settings on the page. Disabling these cookies may result in the website not functioning properly.

  • Targeting Cookies

    "This type of cookie helps the Big Data Institute (Public Organization) understand user interactions with its website services, including which pages or areas of the site are most popular, as well as analyze other related data. The Big Data Institute (Public Organization) also uses this information to improve website performance and gain a better understanding of user behavior. Although the data collected by these cookies is non-identifiable and used solely for statistical analysis, disabling them will prevent the Big Data Institute (Public Organization) from knowing the number of website visitors and from evaluating the quality of its services.

Save settings
This site is registered on wpml.org as a development site. Switch to a production site key to remove this banner.