Liz's Blog

就是要學R #11:資料視覺化應用篇(ggplot2、Plotly)

| Comments

截至目前為止,我真的蠻喜歡這套課程,講師會擷取重點教學,然後再鼓勵學生去看資料細節,並且提供上課筆記可以複習,很適合R初學者入手,對於有程式背景的人會學得更快。唯一缺點不是中文,但講師沒有太多腔調,搭配上課筆記,打開字幕應該不難理解。

Udemy
課程名稱:Data Science and Machine Learning Bootcamp with R
講師:Jose Portilla

繼前幾天學到ggplot2資料視覺化基本運用,這套課程也有幾個小節是在介紹如何用在真實世界的案例。

1.第一個是實作經濟學人在2011年的發表的Corrosive corruption,看貪汙和人類發展的相關性。分別利用Corruption Perceptions IndexHuman Development Index (HDI)的資料來做,因為涉及課程中提供的檔案,這邊我就不放出來。有興趣可以去網站上下載原始資料來練習。

#載入ggplot、ggthemes、data.table,並用fread讀取檔案資料,drop=1代表跳過第一列。
library(ggplot2)
library(ggthemes)
library(data.table)
df <- fread('Economist_Assignment_Data.csv',drop=1)
head(df)

#要是所有資料都標國名會太混亂,下面是只出現的國家名稱。
pointsToLabel <- c("Russia", "Venezuela", "Iraq", "Myanmar", "Sudan",
                   "Afghanistan", "Congo", "Greece", "Argentina", "Brazil",
                   "India", "Italy", "China", "South Africa", "Spane",
                   "Botswana", "Cape Verde", "Bhutan", "Rwanda", "France",
                   "United States", "Germany", "Britain", "Barbados", "Norway", "Japan",
                   "New Zealand", "Singapore")

#製作散佈圖。
pl <- ggplot(df,aes(x=CPI,y=HDI,color=Region)) + geom_point(size=4,shape=1)

#加入趨勢線,lm代表線性模式,se=false代表不表示信賴區間。
pl2 <- pl + geom_smooth(aes(group=1),method ='lm',formula = y~log(x),se=FALSE,color='red')

#標示資料名稱。
pl3 <- pl2 + geom_text(aes(label = Country), color = "gray20", 
                data = subset(df, Country %in% pointsToLabel),check_overlap = TRUE)

#加入經濟學人主題的表格。              
pl4 <- pl3 + economist_white()

#加入x軸名稱,限制資料範圍0.9~10.5,並分成十格。
pl5 <- pl4 + scale_x_continuous(name = "Corruption Perceptions Index, 2011 (10=least corrupt)",
                     limits = c(.9, 10.5),breaks=1:10)

#加入y軸名稱,限制範圍0.2~1.0。
pl6 <- pl5 + scale_y_continuous(name = "Human Development Index, 2011 (1=Best)",
                     limits = c(0.2, 1.0))
                     
#加入表格標題。                   
pl7 <- pl6 + ggtitle("Corruption and Human development")
print(pl7)

2.plotly是線上互動表格,主要是透過plotly.js來完成。只要載入ggplot和plotly就可以直接操作這項的功能。詳細請參考Plotly ggplot2 LibraryPlotly R Library說明。這部分我之前很想用在我ROR的專案裡,之後有測試成功,再跟大家分享。

install.packages('plotly')
library(plotly)
pl <- ggplot(df,aes(x=CPI,y=HDI,color=Region)) + geom_point(size=4,shape=1)       #拿上方經濟學人資料
print(ggplotly(pl))

3.講師這邊整合過去所學的技巧來做這個Capstone Project,用了很有名的魔球來練習。對!就是Brad Pitt演過的魔球,我個人覺得很好看的電影。故事背景是在於球隊總經理Brad Pitt要在非常有限的預算下,組一支強打隊,用的正是統計數據來找球員。原始資料可從Lahman’s Baseball Database下載。挑戰是奧克蘭運動家隊在輸球後,痛失三名球員,Jason Giambi、Johnny Damon、Rainer Gustavo,Brad Pitt要在有限的預算及時間內(2011-2012休季時)找到三名候補球員。

棒球統計中文可見維基百科,非常清楚。
(1)在找到三名替代球員,還要先跑出另外三項重要指標,打擊率、上壘率、長打率。

#讀取打擊表現的表格,跑str()就可以發現這是一份海量資料。
batting <- read.csv('Batting.csv')
head(batting)
str(batting)

#AB代表At Bats(打數),X2B二壘安打。
head(batting$AB)
head(batting$X2B)

#batting average 打擊率(BA)=安打數(H)/打數(AB)
batting$BA <- batting$H / batting$AB
tail(batting$BA,5)

#on base percentage 上壘率(OBP)=(安打H + 保送BB + 觸身球HBP)/(打數AB + 保送BB + 觸身球HBP + 高飛犧牲打SF)
batting$OBP <- (batting$H + batting$BB + batting$HBP)/(batting$AB + batting$BB + batting$HBP + batting$SF)

#Slugging Percentage 長打率(SLG)=((一壘安打1B)+(2*二壘安打2B)+(3*三壘安打3B)+(4*全壘打HR))/打數(AB)
batting$X1B <- batting$H - batting$X2B - batting$X3B - batting$HR
batting$SLG <- ((1 * batting$X1B) + (2 * batting$X2B) + (3 * batting$X3B) + (4 * batting$HR) ) / batting$AB

str(batting)

(2)將薪資表格和打擊表現表格格併在一起。

#跑summary可以看到yearID年代非常久遠。
sal <- read.csv('Salaries.csv')
summary(batting)

#利用subset()將年代只追溯到1985年。
batting <- subset(batting,yearID >= 1985)
summary(batting)

#利用merge()函數把兩個都有重複的playerID、yearID合併起來。
combo <- merge(batting,sal,by=c('playerID','yearID'))
summary(combo)

(3)分析失去隊員的戰力

#先找出這三個球員的所有資料
lost_players <- subset(combo,playerID %in% c('giambja01','damonjo01','saenzol01') )
lost_players

#限定只要2001年的資料
lost_players <- subset(lost_players,yearID == 2001)

#限定特定欄位資料
lost_players <- lost_players[,c('playerID','H','X2B','X3B','HR','OBP','SLG','BA','AB')]
head(lost_players)

(4)接著再來找替補球員,限制是預算不能超過一千五百萬、打數需要大於或等於失去的三個球員、平均的上壘率要等於或大於失去的三個球員。以下是講師提供的作法:

library(dplyr)
avail.players <- filter(combo,yearID==2001)

library(ggplot2)
ggplot(avail.players,aes(x=OBP,y=salary)) + geom_point()

#限定薪水要小於800萬且OBP>0,打數大於等於500
avail.players <- filter(avail.players,salary<8000000,OBP>0)
avail.players <- filter(avail.players,AB >= 500)

#依照上壘率前十名由大排序到小
possible <- head(arrange(avail.players,desc(OBP)),10)

#列出playerID、上壘率、打數及薪水
possible <- possible[,c('playerID','OBP','AB','salary')]
possible

#第一名的giambja不能選,所以選第二到四名。
possible[2:4,]

(5)我自己的做法,是每位球員限定薪水小於500萬、上壘率要大於三個失去球員的平均0.364,打數要大於等於500。原則上選出來的人選是一樣的,heltoto01、berkmla01、gonzalu01,從薪資的最大最小值等資料可以看到,球員的薪水差非常多,平均是1879256,中位數是550000,最大值是33000000,一千五百萬要找到低估球員的可能性頗高。特別是看到上壘率的中位數是0.305。

library(dplyr)
avail.players <- filter(combo,yearID==2001)
library(ggplot2)
ggplot(avail.players,aes(x=OBP,y=salary)) + geom_point()

candidate <- filter(avail.players,salary<5000000,OBP>0.364,AB >= 500)
players <- head(arrange(candidate,desc(OBP)),10)
players <- players[,c('playerID','OBP','AB','salary')]
players

【延伸閱讀】
1.就是要學R #1:Basic 基礎篇
2.就是要學R #2:Matrix 矩陣篇
3.就是要學R #3:Data Frame 資料框架篇
4.就是要學R #4:List 列表篇
5.就是要學R #5:Import & Export 匯入匯出篇(csv & excel)
6.就是要學R #6:Import & Export 匯入匯出篇(SQL & web scraping)
7.就是要學R #7:R programming 基礎篇
8.就是要學R #8:R Programming 進階篇
9.就是要學R #9:資料前處理篇(dplyr、tidyr)
10.就是要學R #10:ggplot2幫你搞定資料視覺化
11.就是要學R #11:資料視覺化應用篇(ggplot2、Plotly)
12.就是要學R #12:機器學習之線性迴歸實作篇
13.就是要學R #13:機器學習之邏輯迴歸實作篇
14.就是要學R #14:機器學習之K Nearest Neighbor(KNN)實作篇
15.就是要學R #15:機器學習之決策樹、隨機森林實作篇
16.就是要學R #16:機器學習之Support Vector Machine(SVM)實作篇
17.就是要學R #17:機器學習之K Means Clustering實作篇
18.就是要學R #18:機器學習之自然語言處理(NLP)實作篇
19.就是要學R #19:機器學習之類神經網路(Neural Net)實作篇

Comments

comments powered by Disqus