Visualize Diamond dataset ด้วยภาษา R
ดูโค้ดเต็มๆได้ที่ : https://github.com/neennera/Works/blob/main/Diamond_visuallization_by_R.Rmd
เรามาเตรียมพร้อมโดยการนำเข้า ggplot2 library ซึ่งเป็น library ที่ช่วยในการสร้างกราฟแสดงผล data ที่เราสนใจ
pattern ของการใช้งาน ggplots ประกอบไปด้วย
- data : ข้อมูลที่ต้องการพล็อต
2. mapping : เอา data มา map ไปที่ แกน x, แกน y ตั้งค่าสี ขนาด ฯลฯ
3. Geometry : กำหนดว่าพล็อตยังไง กราฟแท่ง, กราฟเส้น, ฯลฯ
แต่ก่อนอื่น มาลองดูคร่างๆว่า diamonds มีตัวแปรอะไรบ้าง
library(ggplot2)
summary(diamonds)
## ราคาของ diamonds
กราฟที่เราได้ใช้ตลอดคือ histogram ซึ่งเป็นกราฟที่เราตรวจดูว่า data มีความถี่ของแต่ละช่วง bin เท่าไหร่ ช่วงดูได้ว่าข้อมูลมีการกระจุกตัวที่ช่วง range ไหน
ggplot(data=diamonds, aes(x=price)) +
geom_histogram(fill="gray", color="black") +
ggtitle("Price of Diamonds")
จากกราฟ จะเห็นได้ว่ากราฟมีความเบ้ซ้าย คือเพรชมักจะมีราคาในช่วง 0–50000 มาก
ยิ่งราคาแพงขึ้น จำนวนเพรชที่ขายในช่วงนั้นก็ยิ่งน้อยลง ในแนวโน้มแบบ exponential
## Carat and Price but in cut group
เนื่องจากข้อมูลมีขนาดใหญ่มากๆ เราใช้ sample_frac ในการเลือก sampling ออกมาแค่ 20% ให้พอเห็นเส้นแนวโน้ม
ใช้ geom_point มาพล็อตจุด scatter และ geom_smooth มาวาดเส้นแนวโน้ม
รวมทั้งใช้ facet_wrap มาแยกกราฟตามตัวแปร cut และจัดคอลัมน์แค่แถวละ 2 คอลัมน์
library("dplyr")
ggplot(sample_frac(diamonds, 0.20), aes(x=carat, y=price, col=price)) +
geom_point(alpha = 0.4) +
scale_color_gradient(low = "lightblue", high = "blue") +
geom_smooth(method = lm, color = "red") +
facet_wrap(~cut, ncol = 2)
จากกราฟ พบว่า หากเรามี caratมาก ราคาของเพชรก็จะมากไปด้วย ในทุกๆ
## Cut and Price
box plot เป็นกราฟที่มีประโยชน์มาก ในการหาการกระจายตัวของข้อมูล ดู mean, max, min,Q1,Q3 รวมทั้งหา outliers ของข้อมูลได้
ggplot(data=diamonds, aes(x=cut, y=price)) +
geom_boxplot()
จากกราฟรูปกล่อง เห็นได้ว่าdiamond ที่มีการตัดแบบ Fair มีความกว้าง range ของ price น้อยสุด แต่ Premium มีความกว้างมากที่สุด หากดูที่ค่าเฉลี่ย จะพบว่าเพรชที่ตัดแบบ Premium มีราคาสูงสุด
## Clarity
ลองมาพล็อต histogram แบบมีการตั้งค่าสีด้วย เพื่อให้การนำเสนอของข้อมูลดูมีอะไรๆมากกขึ้น
ggplot(data = diamonds, aes(x=clarity)) +
geom_bar(fill='red')
จากกราฟเพชรมี clarity แบบ SI1 มากที่สุด และมีแบบ I1 น้อยที่
## Depth of Diamond
นอกจากนี้ เรายังใช้ geom_density ซึ่งจะมีการพล็อตเป็นเส้นของความถี่ในช่วงต่างๆ ควบคู่ไปกับ histogram
ggplot(data=diamonds, aes(x=depth, y =..density..)) +
geom_histogram(fill = "steelblue") +
geom_density(color = "red", linewidth = 1)
จากกราฟ diamond มีการตัด depth ที่ราวๆ 63 มาก