ช่วงนี้เป็นมือใหม่ลองใช้ภาษา R ในการจัดการข้อมูลและลองวิเคราะห์ข้อมูลพื้นฐาน ก็มาถงส่วนที่อยากทำความรู้จักกับ package dplyr กับ ggplot2 วิธีที่ดีที่สุดก็คือต้องลองใช้งานดูเยอะๆ จะได้รู้จัก package นั้นๆ ดียิ่งขึ้น
Package dplyr
สำหรับ package dplyr เป็น package พื้นฐานของ R ไว้สำหรับจัดการกับก้อนข้อมูลที่เรามีเช่น กรองข้อมูลเฉพาะบางคอลัมน์, กรองข้อมูลเฉพาะแถวที่มีข้อมูลบางอย่างอยู่, จัดเรียงลำดับข้อมูลที่มีตามเงื่อนไขที่ระบุ เป็นต้น
ฟังก์ชันหลักๆ ของ dplyr ที่มักจะถูกเรียกใช้เพื่อจัดการข้อมูล:-
- filter() : มักถูกเรียกใช้เพื่อจะกรองข้อมูลของแต่ละแถว(row) ว่าข้อมูลในแถวนั้นมีข้อมูลตรงตามเงื่อนไขที่ระบุหรือไม่ ถ้าไม่มีข้อมูลก็จะถูกกรองออก เมื่อประมวลผลเสร็จก็จะคืนค่าเป็นข้อมูลใหม่ที่กรองตามเงื่อนไขเรียบร้อยแล้ว
- select(): มักถูกเรียกใช้เพื่อจะกรองข้อมูล จากชื่อหลัก(column)หรือจากชนิดของข้อมูล(data type)ในคอลัมน์นั้น เมื่อประมวลผลเสร็จก็จะคืนค่าเป็นข้อมูลใหม่ที่กรองตามเงื่อนไขที่ระบุไว้
- arrage(): มักถูกเรียกใช้เพื่อจัดเรียงลำดับข้อมูล(มากไปน้อย, น้อยไปมาก) ตามเงื่อนไข(สามารถเลือกจัดเรียงจากข้อมูลหลักเดียว หรือ หลายหลักรวมกันได้) เมื่อประมวลผลเสร็จฟังก์ชันก็จะคืนค่าข้อมูลที่ได้รับการจัดเรียงเสร็จเรียบร้อยแล้ว
- mutate(): มักจะใช้สำหรับเพิ่มหลัก(column)ใหม่ ให้กับข้อมูล ซึ่งข้อมูลใหม่นั้นมักจะเป็นข้อมูลที่ได้มาจากการคำนวณจากข้อมูลเดิมที่มี เช่น คำนวณค่าเฉลี่ยจากข้อมุล 3 หลัก แล้วสร้างเป็นข้อมูลในหลักใหม่, หรือใช้ข้อมูลจากหลักที่เป็นน้ำหนักและส่วนสูง เพื่อมาสร้างข้อมูลในหลักใหม่ที่เป็น BMI เป็นต้น เมื่อทำการประมวลผลข้อมูลเสร็จฟังก์ชันก็จะคืนค่าข้อมูลที่ทำการเพิ่มหลักใหม่เรียบร้อยแล้ว
- group_by(): มักจะใช้เพื่อจัดกลุ่มข้อมูล จากเงื่อนไขที่ระบุ เช่น สรุปข้อมูลค่าใช้จ่ายของบริษัทโดยจะสรุปข้อมูลแยกเป็นรายปี, รายเดือน (อาจจะระบุหลายเงื่อนไขได้)
- summarize(): มักใช้ร่วมกับ group_by() เพื่อจะระบุว่าจะทำอย่างไรกับข้อมูลที่จัดกลุ่มไว้ เช่นถ้าต้องการสรุปค่าใช้จ่ายของบริษัทสรุปแยกข้อมูลเป็นรายปี สำหรับฟังก์ชัน summarize ก็ต้องทำกับระบุให้ฟังก์ชันทำการรวม(summation)ค่าใช้จ่ายทั้งหมดในปีนั้นๆ แล้วก็ยุบข้อมูลทั้งหมดให้เป็นข้อมูลรายปี
ฟังก์ชันของ dplyr เหล่านี้ นอกจากใช้งานแบบเรียกใช้ฟังก์ชัน แล้วเอาตัวแปรใหม่มารับผลจากการประมวลข้อมูลแต่ละฟังก์ชันตามปกติแล้ว ก็สามารถใช้งานแบบเรียกต่อกันได้(piping) โดยแต่ละฟังก์ชันสามารถใช้สัญลักษณ์ %>% เชื่อมระหว่างการประมวลผลฟังก์ชันได้ ในส่วนของการทำงาน ก็จะเอาผลลัพท์จากฟังก์ชันด้านซ้าย ส่งต่อไปให้ ฟังก์ชันด้านขวาของสัญลักษณ์ %>% ทำงานต่อกันไปเรื่อยๆได้เลย โดยไม่ต้องมีตัวแปรมารับทันที ซึ่งถือว่าค่อนข้างสะดวกในการเขียนโค้ดด้วย ตัวอย่างเช่น
new_data <- filter(init_data, "ระบุเงื่อนไขการกรองข้อมูล") %>% group_by("ระบุเงื่อนไขการรวมกลุ่มข้อมูล") %>% summarize("ระบุวิธีการที่ใช้ในการจัดการสรุปข้อมูลที่ระบุไว้ใน group_by")
Package ggplot2
สำหรับ package ggplot2 ไว้สำหรับนำข้อมูลไปแสดงผลในรูปแบบต่างๆ คอนเซปต์ของการจัดการ component ต่างๆ ใน ggplot จะมีชื่อว่า “Grammar of Graphics” คือ มีการแยกององค์ประกอบ(components) ที่ใช้แสดงผลกราฟแยกเป็นชั้นๆ กัน แต่ละชั้นก็จะมีฟังก์ชันให้เรียกสำหรับป้อนข้อมูลและเชื่อมแต่ละชั้นของข้อมูลด้วยเครื่องหมาย (+) ในการแสดงผลครั้งนึงอยากได้ component อะไรบ้างก็เพิ่ม/ลด ได้ตามต้องการอย่างเป็นอิสระต่อกัน
ในส่วนของการกำหนดข้อมูลที่จะใช้แสดงผล แทนที่จะกำหนดตัวแปรตั้งต้นไว้เลยว่าถ้าจะกราฟแต่ละแบบต้องระบุตัวแปร(parameter) กี่ตัวหรือชื่ออะไรบ้าง ซึ่งการกำหนดแบบนี้จะมีแค่รูปแบบตายตัว จะเพิ่มหรือลดอะไรก็ลำบาก แต่เนื่องจาก package ggplot2 นั้นมีการแยกองค์ประกอบของกราฟเป็นส่วนๆ ถ้าเราต้องการให้กราฟของเราแสดงผลอะไรบ้าง เราก็ใส่เพิ่มเข้าไปได้เรื่อยๆ และ ไม่ว่าจะแสดงผลเป็นกราฟเส้น, กราฟแท่ง, แผนภูมิวงกลม, ปรับแต่งแกน x,y , ปรับแต่เรื่องสี, ความหนาของเส้น, การจัดวางตัวอักษรในแต่ละแกน โดยองค์ประกอบแต่ละอย่างก็ยังสามารถเอาไปเพิ่ม/ลด เพื่อสร้างเป็นกราฟรูปแบบอื่นๆ ได้ค่อนข้างหลากหลายด้วย
องค์ประกอบหลักๆ สำหรับการกำหนดการแสดงผล:-
- ข้อมูล: ระบุชุดข้อมูลที่ต้องการนำไปแสดงผล
- aesthetic mapping: ทำการระบุข้อมูลจากชุดข้อมูล กับ วิธีการนำมาแสดงผลจะ ใช้ฟังก์ชัน aes() เพื่อระบุว่าจะใช้ข้อมูลไหนในแกน x, y หรือ ระบุสี, ขนาดและรูปร่างของการนำเสนอข้อมูล
- ลักษณะการแสดงผลข้อมูล: geom_point() แสดงข้อมูลเป็นจุด, geom_line() แสดงผลเป็นกราฟเส้น, geom_bar() แสดงข้อมูลเป็นกราฟแท่ง
- กำหนดรายละเอียดเพิ่มเติมสำหรับการแสดงผล เช่น กำหนดว่าแกน x,y จะให้แสดงผลค่าน้อยสุด-มากสุดที่เท่าไร, จุดเริ่มต้นของแกนเป็น 0,0 หรือจะเป็นค่าอื่น และ ตีมจะเป็นขาวดำหรือเป็นสีแบบต่างๆ
ยังมีรายละเอียดอีกหลายๆ อย่างที่เราสามารถเลือกระบุได้อีกเยอะมาก สามารถไปลองใชังานดูเพิ่มเติมได้
ข้อมูล (Data)
ก่อนที่จะเริ่มใช้งานฟังก์ชันต่างๆ จาก package เพื่อมาจัดรูปแบบข้อมูลและพลอตแสดงผลเป็นกราฟได้ เราก็จำเป็นต้องมีข้อมูลที่เราต้องการจะทำความเข้าใจก่อน วันนี้ไปเจอข้อมูล “สถิติของการใช้รถ EV(BEVs, PHEVs) ที่เป็นข้อมูลรถยนต์จากการลงทะเบียนข้อมูลรถของผู้ขอใบอนุญาติขับขี่ในรัฐวอชิงตัน ประเทศสหรัฐอเมริกา ช่วงของข้อมูลนี้จะเป็นข้อมูลตั้งแต่ปี 1999-2026” (ที่มาของข้อมูล http://www.data.gov) แหล่งข้อมูลเองมีรูปแบบข้อมูลให้เลือกหลายรูปแบบเลย เช่น .xml, .csv, .json แต่ที่จะใช้ในครั้งนี้จะเลือกใช้อันที่เป็นไฟล์นามสกุล .csv
เริ่มต้นก็ดาวน์โหลดไฟล์ .csv ของชุดข้อมูลที่เราต้องการมาก่อน ดาวน์โหลดเสร็จก็ย้ายมาบันทึกในโฟลเดอร์ที่เราต้องการจะทำงานในโปรเจคนี้
ทำการตรวจสอบว่าตอนนี้โฟลเดอร์ที่ R ที่เราทำงานอยู่นั้นอยู่ตรงไหน ตรวจสอบโฟลเดอร์ทำงานปัจจุบันด้วยคำสั่ง getwd()
getwd()
ถ้าโฟลเดอร์นั้นไม่ใช่โฟลเดอร์ที่เราต้องการทำงาน เราสามารถจะเปลี่ยนแปลงตำแหน่งของโฟลเดอร์ได้ ให้ย้ายไฟล์ไปที่โฟลเดอร์ที่เราต้องการทำงานได้ด้วยคำสั่ง setwd(“/path/to/my_project”)
setwd("/path/to/my_project")
#ตรวจสอบอีกครั้งด้วยคำสั่ง getwd() ว่าได้เปลี่ยนมายังโฟลเดอร์ที่เราระบุแล้วหรือยัง
getwd()
เมื่อเราเปลี่ยนตำแหน่งโฟลเดอร์ที่เรากำลังจะทำงานด้วยเสร็จแล้ว เราก็มาลองเริ่มโหลดข้อมูลดูกัน
โหลดข้อมูลจากไฟล์ขึ้นมาในหน่วยความจำ
library(dplyr)
library(ggplot2)
#This dataset shows the Battery Electric Vehicles (BEVs) and Plug-in Hybrid Electric Vehicles (PHEVs)
# that are currently registered through Washington State Department of Licensing (DOL).
# https://catalog.data.gov/dataset/electric-vehicle-population-data
# ใช้ฟังก์ชัน read.csv() ทำการอ่านไฟล์ข้อมูลขึ้นมาเก็บไว้ในหน่วยความจำ
ev_vehicle_data <- read.csv("Electric_Vehicle_Population_Data.csv")
# ตรวจสอบจำนวนแถว, หลัก ของข้อมูลด้วยฟังก์ชัน dim()
dim(ev_vehicle_data)
|
[1] 271113 16 # โปรแกรมจะคืนค่าข้อมูล มีข้อมูล 271,113 แถว, 16 คอลัมน์ |
เช็คดูว่าข้อมูลมีคอลัมน์อะไรบ้าง
# ตรวจสอบชื่อคอลัมน์ของข้อมูลด้วยฟังก์ชัน colnames() colnames(ev_vehicle_data)
|
# โปรแกรมจะคืนค่าชื่อของคอลัมน์ทั้งหมด 16 คอลัมน์ออกมา [1] "VIN..1.10." [2] "County" [3] "City" [4] "State" [5] "Postal.Code" [6] "Model.Year" [7] "Make" [8] "Model" [9] "Electric.Vehicle.Type" [10] "Clean.Alternative.Fuel.Vehicle..CAFV..Eligibility" [11] "Electric.Range" [12] "Legislative.District" [13] "DOL.Vehicle.ID" [14] "Vehicle.Location" [15] "Electric.Utility" [16] "X2020.Census.Tract" |
เริ่มจัดการข้อมูลและแสดงผลข้อมูลเป็นกราฟแบบต่างๆ
ดูข้อมูลรถ EV ของรัฐวอชิงตัน, สหรัฐอเมริกา ช่วงข้อมูลระหว่างปี 1999-2026, รถยนต์ EV ที่รับการลงทะเบียนข้อมูลจากผู้ขออนุญาติใบขับขี่ โดยจัดกลุ่มข้อมูลจากชื่อบริษัทผู้ผลิตรถยนต์
# ทำการสรุปข้อมูลด้วยการจัดกลุ่มรวมข้อมูลจำนวนรถ EV ทั้ง จัดกลุ่มตามชือบริษัทที่ผลิตรถยนต์เพื่อดูว่ารถแต่ละกลุ่มมีผู้ลงทะเบียนใช้งานไปทั้งหมดจำนวนเท่าไร
# ฟังก์ชัน group_by สำหรับจัดกลุ่มข้อมูล ในที่นี้รวมกลุ่มข้อมูลโดยเลือกใช้คอลัมน์ Make ซึ่งเป็นชื่อบริษัทผู้ผลิตรถยนต์
# ฟังก์ชัน summarize สำหรับรวมจำนวนแถวที่มีผู้ลงทะเบียนใช้รถยนต์จากบริษัทผู้ผลิตรถยนต์นั้นๆ เพื่อนับจำนวนผู้ลงทะเบียนใช้งานรถยนต์แยกตามชื่อบริษัทผู้ผลิตรถยนต์
# ฟังก์ชัน arrange สำหรับทำการเรียงลำดับข้อมูล ในที่นี้ใช้สำหรับเรียงลำดับจำนวนผู้ใช้งานรถยนต์ซึ่งแยกตามบริษัทผู้ผลิตรถยนต์ เรียงลำดับจากมากไปน้อย
summarized_ev_vehicle_overtime <- ev_vehicle_data %>%
group_by(Make) %>%
summarize(total_amount=n(), .groups ="drop") %>%
arrange(desc(total_amount))
#ใช้ฟังก์ชัน ggplot จาก package ggplot2 เพื่อทำการแสดงข้อมูลเปรียบเทียบในรูปแบบแผนภูมิแท่ง
ggplot(summarized_ev_vehicle_overtime, aes(x=reorder(Make, -total_amount), y=total_amount)) +
geom_bar(position = "dodge", stat = "identity") +
labs(title="Registered electric vehicle of Washington State, USA 1999-2026 (group by Make) ", x="Make", y="Amount of registered vehicle")+
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
พอรันโปรแกรมแล้วผลออกมาจะได้กราฟแบบนี้ จะเห็นว่าจากข้อมูลมีผู้ลงทะเบียนใช้รถยนต์ EV จากบริษัทต่างๆ มากน้อยแตกต่างกันไป เรียงลำดับจากมากไปน้อยแล้ว Tesla มาเป็นอันดับแรก, ตามด้วย CHEVROLET, NISSAN, FORD, KIA และจากบริษัทอื่นๆเรียงไปตามลำดับ

คราวนี้เราลองมาพลอตข้อมูลเพื่อดูว่ารถยนต์โมเดล(Model)ไหนของแต่ละบริษัทผู้ผลิตรถยนต์ EV ที่มีผู้ลงทะเบียนใช้งานรถเยอะที่สุด โดยจะเลือกพลอตข้อมูลเพียง 50 อันดับแรก
# ทำการสรุปข้อมูลจำนวนผู้ที่ลงทะเบียนใช้งานรถยนต์ จัดกลุ่มข้อมูลจากคอลัมน์บริษัทผู้ผลิต(Make), โมเดล(Model)
# ฟังก์ชัน group_by สำหรับจัดกลุ่มข้อมูล ในที่นี้เลือกใช้คอลัมน์ Make, Model ซึ่งเป็นชื่อบริษัทผู้ผลิตรถยนต์, โมเดล
# ฟังก์ชัน summarize สำหรับรวมจำนวนแถวที่มีผู้ลงทะเบียนใช้รถยนต์โมเดลนั้นจากบริษัทผู้ผลิตรถยนต์ EV
# ฟังก์ชัน arrange สำหรับทำการเรียงลำดับข้อมูล ในที่นี้ใช้สำหรับเรียงลำดับจำนวนผู้ใช้งานรถยนต์ซึ่งแยกตามบริษัทผู้ผลิตรถยนต์, โมเดล เรียงลำดับจากมากไปน้อย
summarized_ev_group_by_model <- ev_vehicle_data %>%
group_by(Make, Model) %>%
summarize(total_amount=n(), .groups ="drop") %>%
arrange(desc(total_amount))
# เลือกเพียงข้อมูล 50 อันดับแรก
summarized_ev_group_by_model <- summarized_ev_group_by_model[1:50,]
# ปรับข้อความเพื่อแสดงผลตรงแกน Y ให้ระบุชื่อบริษัทผู้ผลิตพร้อมกับชื่อโมเดลของรถ
adjust_y_labels <- vapply(summarized_ev_group_by_model, paste, summarized_ev_group_by_model$Make, "(", summarized_ev_group_by_model$Model, ")")
#ใช้ฟังก์ชัน ggplot จาก package ggplot2 เพื่อทำการแสดงข้อมูลเปรียบเทียบในรูปแบบแผนภูมิแท่ง
ggplot(summarized_ev_group_by_model, aes(y=reorder(Model, -total_amount), x=total_amount)) +
geom_bar(position="dodge", stat = "identity", width=0.8 ) +
geom_col(aes(fill = Make), position = position_dodge(width = 0.1), width = .6)+
scale_y_discrete(labels = adjust_y_labels) +
labs(title="Registered electric vehicle of Washington State, USA (group by Make, Model) ", y="Model", x="Amount of registered vehicle")+
theme(axis.text.y = element_text(size=8, angle = 0, vjust = 0.5, hjust = 1))
ข้อมูลที่พลอตออกมาได้ก็จะเป็นดังนี้:-
สองอันดับแรกก็จะเป็น TESLA (MODEL Y, MODEL 3), อันดับที่สามก็จะเป็น NISSAN (LEAF), ตามด้วย CHEVROLET (BOLT EV) และ TESLA (MODEL S) และโมเดลอื่นๆ ถัดไป

ถ้าลองเลือกดูข้อมูลเฉพาะรถยนต์ EV ที่มีปีที่ผลิตเป็นปี 2025 เพื่อจะดูว่ารถยนต์แต่ละโมเดลในปี 2025 นี้ มีผู้ลงทะเบียนจำนวนมาก-น้อยอย่างไร
# ใช้ฟังก์ชัน filter() เพื่อกรองข้อมูลเฉพาะข้อมูลปีที่ผลิตคือปี 2025
filter_rows <- filter( ev_vehicle_data, Model.Year==2025)
# ทำการสรุปข้อมูลจำนวนผู้ที่ลงทะเบียนใช้งานรถยนต์ EV จัดกลุ่มข้อมูลจากคอลัมน์บริษัทผู้ผลิต(Make), โมเดล(Model)
# ฟังก์ชัน group_by สำหรับจัดกลุ่มข้อมูล ในที่นี้เลือกใช้คอลัมน์ Make, Model ซึ่งเป็นชื่อบริษัทผู้ผลิตรถยนต์, โมเดล ในการรวมกลุ่มข้อมูล
# ฟังก์ชัน summarize สำหรับรวมจำนวนแถวที่มีผู้ลงทะเบียนใช้รถยนต์ EV จากบริษัทผู้ผลิตรถยนต์นั้นๆ เพื่อนับจำนวนผู้ลงทะเบียนใช้งานรถยนต์แยกตามบริษัทผู้ผลิตรถยนต์, โมเดล
# ฟังก์ชัน arrange สำหรับทำการเรียงลำดับข้อมูล ในที่นี้ใช้สำหรับเรียงลำดับจำนวนผู้ใช้งานรถยนต์ซึ่งแยกตามบริษัทผู้ผลิตรถยนต์, โมเดล เรียงลำดับจากมากไปน้อย
summarized_ev_group_by_model <- filter_rows %>%
group_by(Make, Model) %>%
summarize(total_amount=n(), .groups ="drop") %>%
arrange(desc(total_amount))
# เลือกเพียง 50 อันดับแรก
summarized_ev_group_by_model <- summarized_ev_group_by_model[1:50,]
# ปรับข้อความเพื่อแสดงผลตรงแกน Y ให้ระบุชื่อบริษัทพร้อมกับชื่อโมเดลของรถ
adjust_y_labels <- vapply(summarized_ev_group_by_model, paste, summarized_ev_group_by_model$Make, "(", summarized_ev_group_by_model$Model, ")")
#ใช้ฟังก์ชัน ggplot จาก package ggplot2 เพื่อทำการแสดงข้อมูลเปรียบเทียบในรูปแบบแผนภูมิแท่ง
ggplot(summarized_ev_group_by_model, aes(y=reorder(Model, -total_amount), x=total_amount)) +
geom_bar(position="dodge", stat = "identity", width=0.8 ) +
geom_col(aes(fill = Make), position = position_dodge(width = 0.1), width = .6)+
scale_y_discrete(labels = adjust_y_labels) + # Replace with your labels
labs(title="Registered electric vehicle of Washington State, USA model year 2025 (group by Make, Model) ", y="Model", x="Amount of registered vehicle")+
theme(axis.text.y = element_text(size=8, angle = 0, vjust = 0.5, hjust = 1))
#theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))+

จากข้อมูลที่พลอตออกมา สองอันดับแรกก็จะเป็น TESLA (MODEL 3, MODEL Y), อันดับที่สามก็จะเป็น RIVIAN (R1S), ตามด้วย HYUNDAI (IONIQ 5) และ FORD (MUSTANG MACH-E) และโมเดลอื่นๆ ถัดไป จะเห็นว่าผลจะมีความแตกต่างกับกราฟที่แล้วที่เป็นการสรุปผลรวมของทุกปี ถ้าดูเฉพาะข้อมูลของปี 2025 5 อันดับแรกก็จะมีรถยนต์ EV โมเดลใหม่ๆ ได้อันดับสูงขึ้นมาด้วย
ลองเปลี่ยนการแสดงผลเป็น pie chart บ้าง คราวนี้เราจะมาลองดูอัตราส่วนระหว่างผู้ที่ลงทะเบียนรถยนต์เป็น BEVs กับ PHEVs กันบ้างว่าจะมีความแตกต่างกันอย่างไร
# สรุปข้อมูลตามชนิดของรถ BEVs กับ PHEVs โดยสรุปจากข้อมูลทั้งหมดที่มี
# ฟังก์ชัน group_by เพื่อทำการรวมกลุ่มข้อมูลตามชนิดของรถไฟฟ้า Electric.Vehicle.Type ในข้อมูลนี้จะมีรถยนต์ชนิด (BEV, PHEV)
# ฟังก์ชัน summarize ใช้ต่อจาก group_by เพื่อทำการรวมจำนวนแถวข้อมูล ของรถที่มีการลงทะเบียนไว้แยกข้อมูลตามชนิดของรถไฟฟ้า
# ฟังก์ชัน arrange ใช้ต่อจาก group_by, summarize เพื่อทำการจัดเรียงข้อมูลที่สรุปไว้แล้วข้างต้น และเลือกเรียงลำดับจากมากไปหาน้อย
summarize_bev_vs_phev_overtime <- ev_vehicle_data %>%
group_by(Electric.Vehicle.Type) %>%
summarize(total_amount=n(), .groups ="drop") %>%
arrange(desc(total_amount))
# ใช้ฟังก์ชัน mutate เพื่อเพิ่มคอลัมน์ใหม่ ที่ใช้สำหรับเก็บข้อมูลที่คำนวณจำนวนผู้ลงทะเบียนใช้รถไฟฟ้าสำหรับรถไฟฟ้าแต่ละชนิด แบบคิดเป็นจำนวนเปอร์เซ็นต์
summarize_bev_vs_phev_overtime <- mutate(summarize_bev_vs_phev_overtime, percent_type = round( (total_amount / sum(total_amount)) *100 ,digit=2))
# ใช้ฟังก์ชัน ggplot เพื่อทำการแสดงผลข้อมูลผู้ลงทะเบียนใช้รถไฟฟ้าแต่ละชนิด
ggplot(summarize_bev_vs_phev_overtime, aes(x="", y=total_amount, fill=Electric.Vehicle.Type)) +
geom_bar(stat="identity", width=1) +
coord_polar("y", start=0) +
theme_void() +
labs(title="Registerd electric vehicle of Washington State, USA 1999-2026 \n (group by Electric.Vehicle.Type) ", x="Year", y="Amount of registered vehicle")+
geom_text(aes(label = paste0(Electric.Vehicle.Type, ":", total_amount, "\n", percent_type, "%")), position = position_stack(vjust = 0.5))

จากกราฟจะพบว่ามีผู้ลงทะเบียนที่ใช้รถไฟฟ้า BEVs ถึง 79.79% และผู้ใช้งานรถยนต์ไฮบริด PHEVs เพียง 20.21% เท่านั้น
คราวนี้ก็มาลองพลอตข้อมูล โดยเฉพาะเจาะจงเป็นรถยนต์ของบริษัทผู้ผลิตรถยนต์ FORD จะมีผู้ลงทะเบียนใช้งานรถยนต์ในแต่ละโมเดลมีอัตราส่วนเท่าไรกันบ้าง
# ใช้ฟังก์ชัน filter() เพื่อกรองข้อมูลเฉพาะแถวที่บริษัทผู้ผลิตรถยืน(Make)เป็นบริษัท FORD
filter_rows <- filter( ev_vehicle_data, Make=="FORD")
# สรุปข้อมูลตามโมเดลของรถ
# ฟังก์ชัน group_by เพื่อทำการรวมกลุ่มข้อมูลตามโมเดล(Model)
# ฟังก์ชัน summarize ใช้ต่อจาก group_by เพื่อทำการรวมจำนวนแถวข้อมูล
# ฟังก์ชัน arrange ใช้ต่อจาก group_by, summarize เพื่อทำการจัดเรียงข้อมูลที่สรุปไว้แล้วข้างต้น และเลือกเรียงลำดับจากมากไปหาน้อย
summarize_make_by_model <- filter_rows %>%
group_by(Model) %>%
summarize(total_amount=n(), .groups ="drop") %>%
arrange(desc(total_amount))
# ใช้ฟังก์ชัน mutate เพื่อเพิ่มคอลัมน์ใหม่ ที่ใช้สำหรับเก็บข้อมูลที่คำนวณจำนวนผู้ลงทะเบียนใช้รถไฟฟ้าสำหรับรถไฟฟ้าแต่ละโมเดลของบริษัท FORD คำนวณแบบคิดเป็นจำนวนเปอร์เซ็นต์
summarize_make_by_model <- mutate(summarize_make_by_model, percent_type = round( (total_amount / sum(total_amount)) *100 ,digit=2))
ggplot(summarize_make_by_model, aes(x="", y=total_amount, fill=Model)) +
geom_bar(stat="identity", width=1, color="white") +
geom_text(aes(x=1.7, label = paste0(Model, "\n", total_amount, "\n", percent_type, " %")), position = position_stack(vjust = .4))+
coord_polar("y") +
theme_void()

ข้อมูลสรุปจะเห็นว่าสำหรับบริษัทผู้ผลิตรถยนต์ FORD โมเดล MUSTANG MACH-E มีผู้ลงทะเบียนใช้งานเยอะที่สุดถึง 41.71% ตามมาด้วยโมเดล F-150 26.66%, FUSION 10.96% ตามลำดับ
จากข้อมูลกราฟด้านบน ถ้าเราต้องการเปรียบเทียบข้อมูลต่อระหว่างบริษัทผู้ผลิตรถยนต์แต่ละจ้าว เราก็สามารถเอากราฟมาวางเทียบกันได้ เพื่อเปรียบเทียบ โดยเราจะใช้ package cowplot มาช่วยรวมกราฟหลายๆ กราฟเพื่อแสดงผลในคราวเดียวกัน และใช้ for...loop มาช่วยทำงานในการวนลูปเพื่อคำนวณกราฟแบบเดียวกันโดยเปลี่ยนแค่ชื่อบริษัทที่ผลิตรถยนต์
library(dplyr)
library(ggplot2)
library(cowplot)
#This dataset shows the Battery Electric Vehicles (BEVs) and Plug-in Hybrid Electric Vehicles (PHEVs)
# that are currently registered through Washington State Department of Licensing (DOL).
# https://catalog.data.gov/dataset/electric-vehicle-population-data
ev_vehicle_data <- read.csv("learn_R/Electric_Vehicle_Population_Data.csv")
# สร้าง vector ไว้สำหรับเก็บข้อมูล กราฟที่เราเตรียมจะแสดงผล
list_plots <- c()
# สร้าง vector ไว้สำหรับระบุชื่อบริษัทผู้ผลิตรถยนต์ที่เราต้องการจะเลือกดูข้อมูล
list_make_companies <- c("TESLA", "CHEVROLET", "NISSAN", "FORD")
# ใช้ for...loop ในการวนลูปเพื่อประมวลผลข้อมูลโมเดลที่เป็นที่นิยม จากบริษัทผู้ผลิตรถยนต์ที่ได้ทำการระบุไว้
for (company in list_make_companies){
# ใช้ฟังก์ชัน filter() เพื่อกรองข้อมูลเฉพาะแถวที่บริษัทผู้ผลิตรถยืน(Make)เป็นบริษัท
filter_rows <- filter( ev_vehicle_data, Make==company)
# สรุปข้อมูลตามโมเดลของรถ
# ฟังก์ชัน group_by เพื่อทำการรวมกลุ่มข้อมูลตามโมเดล(Model)
# ฟังก์ชัน summarize ใช้ต่อจาก group_by เพื่อทำการรวมจำนวนแถวข้อมูล
# ฟังก์ชัน arrange ใช้ต่อจาก group_by, summarize เพื่อทำการจัดเรียงข้อมูลที่สรุปไว้แล้วข้างต้น และเลือกเรียงลำดับจากมากไปหาน้อย
summarize_make_by_model <- filter_rows %>%
group_by(Model) %>%
summarize(total_amount=n(), .groups ="drop") %>%
arrange(desc(total_amount))
# ใช้ฟังก์ชัน mutate เพื่อเพิ่มคอลัมน์ใหม่ ที่ใช้สำหรับเก็บข้อมูลที่คำนวณจำนวนผู้ลงทะเบียนใช้รถไฟฟ้าสำหรับรถไฟฟ้าแต่ละโมเดลของบริษัทที่ระบุ คำนวณแบบคิดเป็นจำนวนเปอร์เซ็นต์
summarize_make_by_model <- mutate(summarize_make_by_model, percent_type = round( (total_amount / sum(total_amount)) *100 ,digit=2))
# ใช้ฟังก์ชัน ggplot สร้างกราฟ แต่ไม่แสดงผลเลยทันที ให้เก็บเป็น object ไว้ก่อนไว้รอแสดงผลคราวเดียวกันกับกราฟอื่นๆ
plot_obj <- ggplot(summarize_make_by_model, aes(x="", y=total_amount, fill=Model)) +
geom_bar(stat="identity", width=1, color="white") +
geom_text(aes(x=1.7, label = paste0(Model, "\n", total_amount, "\n", percent_type, " %")), position = position_stack(vjust = .4))+
coord_polar("y") +
theme_void() +
labs(title=paste("Registered electric vehicle of Washington State, USA \n (", company, "'s model)") )
# เอากราฟที่ถูกสร้างในแต่ละรอบของการวนลูป ไปเก็บไว้ใน vector ก่อน
list_plots <- c(plot_obj, list_plots)
}
# ใช้ฟังก์ชัน plot_grid() ของ cowplot เพื่อจะแสดงผลกราฟทั้งหมดพร้อมกัน
plot_grid( list_plots[[1]], list_plots[[2]], list_plots[[3]], list_plots[[4]])
ลองดูข้อมูลว่าสำหรับรถยนต์ EV หากเทียบในแต่ละโมเดลที่บริษัทผู้ผลิตได้ทำการผลิตออกมา สำหรับรถที่มีโมเดลเดียวกันแต่มีปีการผลิตแตกต่างกัน จะมีจำนวนผู้ลงทะเบียนใช้รถยนต์ที่ปีการผลิตนั้นๆ แตกต่างกันอย่างไร
library(dplyr)
library(ggplot2)
library(cowplot)
#This dataset shows the Battery Electric Vehicles (BEVs) and Plug-in Hybrid Electric Vehicles (PHEVs)
# that are currently registered through Washington State Department of Licensing (DOL).
# https://catalog.data.gov/dataset/electric-vehicle-population-data
ev_vehicle_data <- read.csv("learn_R/Electric_Vehicle_Population_Data.csv")
# สร้าง vector ไว้สำหรับเก็บข้อมูล กราฟที่เราเตรียมจะแสดงผล
list_plots <- c()
# สร้าง vector ไว้สำหรับระบุชื่อบริษัทผู้ผลิตรถยนต์ที่เราต้องการจะเลือกดูข้อมูล
list_companies <- c("TESLA", "CHEVROLET", "NISSAN", "FORD")
# ใช้ for...loop ในการวนลูปเพื่อประมวลผลข้อมูลโมเดลที่เป็นที่นิยม จากบริษัทผู้ผลิตรถยนต์ที่ได้ทำการระบุไว้
for (company in list_companies){
# ใช้ฟังก์ชัน filter() เพื่อกรองข้อมูลเฉพาะแถวที่บริษัทผู้ผลิตรถยืน(Make)เป็นบริษัท
filter_rows <- filter( ev_vehicle_data, Make==company)
# สรุปข้อมูลตามปี, บริษัทผู้ผลิต, โมเดล
# ฟังก์ชัน group_by เพื่อทำการรวมกลุ่มข้อมูลตามปี, บริษัทผู้ผลิต, โมเดล(Model.Year, Make, Model)
# ฟังก์ชัน summarize ใช้ต่อจาก group_by เพื่อทำการรวมจำนวนแถวข้อมูล
# ฟังก์ชัน arrange ใช้ต่อจาก group_by, summarize เพื่อทำการจัดเรียงข้อมูลที่สรุปไว้แล้วข้างต้น และเลือกเรียงลำดับจากมากไปหาน้อย
summarize_tesla_by_model <- filter_rows %>%
group_by(Model.Year, Make, Model) %>%
summarize(total_amount=n(), .groups ="drop") %>%
arrange(desc(total_amount))
# ใช้ฟังก์ชัน ggplot สร้างกราฟ แต่ไม่แสดงผลเลยทันที ให้เก็บเป็น object ไว้ก่อนไว้รอแสดงผลคราวเดียวกันกับกราฟอื่นๆ
plot_obj <- ggplot(summarize_tesla_by_model, aes(x=Model.Year, y=total_amount, fill=Model)) +
geom_bar(position = position_dodge(width = 0.9), stat="identity") +
labs(title = "Electric vehicle registerd in Washington State, USA \n (group by Model.Year, Make, Model)",
x = "Model Year",
y = "Amount of registerd vehicle",
fill = paste0(company, " ", "Model") )
# เอากราฟที่ถูกสร้างในแต่ละรอบของการวนลูป ไปเก็บไว้ใน vector ก่อน
list_plots <- c(plot_obj, list_plots)
}
# ใช้ฟังก์ชัน plot_grid() ของ cowplot เพื่อจะแสดงผลกราฟทั้งหมดพร้อมกัน
plot_grid( list_plots[[1]], list_plots[[2]], list_plots[[3]], list_plots[[4]])
วันนี้ผึกลองใช้งาน package dplyr กับ ggplot2 ได้ประมาณนี้ ได้ลองพลอตกราฟ 2 แบบคือ bar chart กับ pie chart ก็ถือว่าทำให้ได้พอทราบวิธีใช้งานคร่าวๆ มากขึ้นสักหน่อยแล้วหล่ะนะ

