[設定所需的函式庫(libraries)]!?

install.packages("dygraphs")
install.packages("plotly")
install.packages("rCharts")
install.packages("DT")

進行資料分析前,總要先有資料吧!?

# 讀檔起手式
temp <- read.csv("歷年護理人員資料.csv")  #請輸入正確的檔案路徑
# 若讀入的是亂碼,試試以下
temp <- read.csv("歷年護理人員資料.csv",fileEncoding = 'big5')  #如果你是mac
# 或是
temp <- read.csv("歷年護理人員資料.csv",fileEncoding = 'utf-8') #如果你是windows
# 設定我們檔案存放的路徑
setwd("/media/hsusir/DATA/Rdata Practice/02DataEngineer/nurse-plotly") 
temp <- read.csv("歷年護理人員資料表.csv",fileEncoding = 'utf-8') #如果你是windows/Linux

以為開始了嗎?

str(temp)
## 'data.frame':    25634 obs. of  7 variables:
##  $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ 性別    : Factor w/ 2 levels "F","M": 1 1 1 1 1 1 1 1 1 1 ...
##  $ 醫療層級: Factor w/ 4 levels "區域醫院","地區醫院",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ 縣市    : Factor w/ 23 levels "","南投縣","台中市",..: 23 23 23 23 23 23 23 23 23 23 ...
##  $ 年齡    : int  20 20 20 20 20 20 20 20 21 21 ...
##  $ 年度    : int  2005 2006 2007 2008 2009 2010 2011 2012 2005 2006 ...
##  $ 人數    : int  56 17 11 1 5 5 7 7 71 75 ...

身為資料分析師,一定要有的好習慣!

  • 暸解基本的個變數統計量值
summary(temp)
##        X         性別          醫療層級         縣市            年齡      
##  Min.   :    1   F:21468   區域醫院:7409   台北市 : 1865   Min.   :18.00  
##  1st Qu.: 6409   M: 4166   地區醫院:7774   台中市 : 1841   1st Qu.:28.00  
##  Median :12818             基層院所:7053   新北市 : 1735   Median :37.00  
##  Mean   :12818             醫學中心:3398   高雄市 : 1685   Mean   :38.13  
##  3rd Qu.:19226                             台南市 : 1606   3rd Qu.:47.00  
##  Max.   :25634                             彰化縣 : 1588   Max.   :65.00  
##                                            (Other):15314                  
##       年度           人數       
##  Min.   :2005   Min.   :  1.00  
##  1st Qu.:2007   1st Qu.:  2.00  
##  Median :2009   Median :  9.00  
##  Mean   :2009   Mean   : 30.37  
##  3rd Qu.:2011   3rd Qu.: 31.00  
##  Max.   :2012   Max.   :729.00  
## 

資料介紹

X 性別 醫療層級 縣市 年齡 年度 人數
5651 5651 F 區域醫院 台南市 36 2009 78
18192 18192 F 基層院所 台東縣 29 2005 9
5804 5804 F 區域醫院 台南市 56 2005 2
11072 11072 F 地區醫院 屏東縣 29 2011 63
1818 1818 F 醫學中心 桃園市 46 2009 70
20999 20999 F 基層院所 雲林縣 43 2012 9
9813 9813 F 地區醫院 嘉義縣 57 2008 2

欄位說明

  • 性別:M:男生,F:女生
  • 醫療層級:1:醫學中心,2:區域醫院,3:地區醫院,4:基層院所
  • 縣市:台灣22個縣市
  • 年齡:台灣護理人員的年齡
  • 年度:第幾年的資料
  • 人數:護理人員的人數
  • 敘述:
    • 這個資料表由健保資料庫的歷年醫事人員基本資料檔轉換而得,並非常見的原始資料檔。

[PART 1]. 先用來 gglpot2 玩看看

Line chart

  • geom_line

  • 首先來看看2008年各個年齡層的護理師人數吧!

  • 是不是發現護理師主要都集中在某個年齡層呢??

temp_age <- temp %>% 
  filter(年度 == "2008") %>% #挑出年度為2008年
  group_by(年齡) %>% #根據年齡分群
  summarise(護理師_人數 = sum(人數)) #計算總人數 

# 資料整理可以直接複製貼上
thm <- function() theme(text=element_text(size = 15, family = "STHeiti")) # 控制字體與大小
# STHeiti是只有Mac才有的字體, 用來解決Mac系統中文顯示錯誤的問題
# Windows系統的使用者請忽略 `+ thm()` 指令
## Line chart

Line chart

## 可以與第10頁做簡單的對照
ggplot(temp_age,aes(x = 年齡, y = 護理師_人數))+geom_line()+thm()

Line chart and Scatter plot

  • 歷年的醫護人員是不是逐年的再增加呢?
temp_year <- temp  %>% 
  group_by(年度) %>% #根據年度分群
  summarise(護理師_人數 = sum(人數)) #計算總人數
# 資料整理可以直接複製貼上

Line chart and Scatter plot

ggplot(temp_year,aes(x = 年度 , y = 護理師_人數)) +
  geom_line(size = 2) + geom_point(size = 5) + # 控制點與線的大小粗細
  thm() + labs(titles = "各年度護理人員數", x = "年度", y = "護理師人數") # lab用來幫圖形的標題、x軸與y軸做命名

[小練習]

  • 比較高雄市、台中市、台南市,中南部的直轄市,歷年的護理人員數是否有差異?
  • 寬資料轉長資料(Wide format to long format)
temp_t <- read.csv("我是寬資料.csv",header=T)
temp_long <- temp_t %>% melt(id='year') #id是將保留的欄位名稱
colnames(temp_long) <- c('年度','地區','人數')
# gruop按照不同區域劃線
ggplot(temp_long, aes(x = 年度, y = 人數 , group = 地區, color = 地區)) + 
  geom_line() + 
  geom_point() + thm() +
  labs(titles="歷年台南市、高雄市、台中市護理師人數差異",x="年度",y="護理師人數") +
  theme(axis.text.x = element_text(angle = 30, hjust = 1)) # 控制x軸字體傾斜程度

[小挑戰]

  • 試著畫出歷年男性護理師的人數趨勢?
## 資料整理
temp_t <- temp  %>% 
          filter(性別=="M") %>% #挑出男性
          group_by(年度) %>% #根據年度分群
          summarise(護理師_人數 = sum(人數)) #計算總人數
## 繪圖
ggplot(temp_t,aes(x = 年度 , y = 護理師_人數)) +
  geom_line(size = 0.5) + geom_point(size = 1)+ # 控制點與線的大小粗細
  thm()+labs(titles = "各年度男性護理人員數" , x = "年度" , y = "護理師人數")

Bar Chart

  • 以2008年來說,不同的醫療層級,護理人員的分佈狀況如何呢?
#資料整理
temp_hosp <- temp %>% 
  filter(年度 == "2008") %>% #選擇年度2008
  group_by(年度,醫療層級) %>% #對年度與醫療層級分群
  summarise(護理師_人數 = sum(人數)) 
#畫圖
ggplot(temp_hosp,aes(x = 醫療層級, y = 護理師_人數)) +
  geom_bar(stat = 'identity') + thm()# stat='identity'以表格的值做為bar的高度

  • 如何控制長條圖的排序呢?有兩種比較簡單的方式。
  • 手動修改levels
class(temp_hosp$醫療層級) #看看這個變數的屬性類型
## [1] "factor"
# 發現他是integer的屬性,所以我們要將其轉成factor來改變他的順序
temp_hosp$醫療層級 <- factor(temp_hosp$醫療層級,levels = c("醫學中心","區域醫院","地區醫院","基層院所"))
  • 利用arrange事先依照y軸對應的數值的大小來排序
# 我們也可以在一開始先對資料排序完在畫圖
temp_hosp <- temp_hosp %>% arrange(護理師_人數) 
# 此時在接上畫圖的code就會自動排序囉!
# 資料整理大挑戰~~~
temp_MF <- temp %>% 
           group_by(性別,醫療層級) %>% 
           summarise(護理師人數 = sum(人數)) %>% 
           mutate(百分比 = round(護理師人數/sum(護理師人數),2))

兩種類別.stack

ggplot(temp_MF,aes(x = 性別, y = 百分比 , fill = 醫療層級)) + 
  geom_bar(stat = 'identity', position = 'stack') + thm()

兩種類別.dodge

ggplot(temp_MF,aes(x = 性別, y = 百分比 , fill = 醫療層級 )) + 
  geom_bar(stat = 'identity' , position = 'dodge') + thm()

圖形思考?

stack與dodge之間的差異?

[PART 2]. 傳說中的Plotly

  • Plotly是一個資料視覺化的R套件,以簡單的方式,讓資料能夠產生互動的效果。
  • 提供一個合作平台,使用者能夠將自己在R中繪製的圖存上屬於自己的Plotly平台上。
  • Plotly官方網站
  • 結合了各式各樣的API,包裝PythonRMalab、…等等
  • 當然~ggplot2也能夠輕易地使用plotly轉換成互動式的圖表!!

套件安裝

  • 直接從CRAN內下載就好囉!!
# Plotly is now on CRAN!
install.packages("plotly")
# install the latest development version (on GitHub) via devtools
  • 或是github上下載,但前提是安裝devtools
# install.packages("devtools")
devtools::install_github("ropensci/plotly")

BarDemo(step1)

  • 2012年各縣市的護理師人數呈現什麼趨勢呢?縣市之間差異很大嗎?

  • 資料整理

temp_plot <- temp %>%  
  filter(年度 == "2012") %>% 
  group_by(縣市) %>% 
  summarise(total = sum(人數))

BarDemo(step2)

  • 先用ggplot2畫出
ggplot(temp_plot,aes(x = 縣市, y = total,fill = 縣市))+
  geom_bar(stat = 'identity')+
  thm()+
  labs(titles = "2012年各縣市護理師數", x = "縣市",y = "護理師人數")+coord_flip()

BarDemo(step3)

  • 首先先將剛剛的圖存入一個物件
a <- ggplot(temp_plot,aes(x = 縣市, y = total ,fill = 縣市))+
     geom_bar(stat = 'identity')+
     thm()+
     labs(titles = "2012年各縣市護理師數",x = "縣市", y = "護理師人數")+coord_flip()

BarDemo(step4)

ggplotly(a)

lineDemo(step1)

  • 2005年~2012年高雄市與台南市的護理人員人數是否有明顯的變化?
## 
temp_plot <- temp %>% 
             filter(縣市 == "台南市"|縣市 == "高雄市") %>% 
             group_by(年度,縣市) %>% 
             summarise(護理人員數=sum(人數)) 

lineDemo(step2)

a <- ggplot(temp_plot,aes(x = 年度,y = 護理人員數,group = 縣市,color = 縣市))+
    geom_line() +  
    thm()+
    labs(titles = "高雄市與台南市歷年護理師人數",x = "年度",y = "護理師人數")+
    theme(axis.text.x = element_text(angle = 30, hjust = 1))# 控制x軸字體傾斜程度
a

lineDemo(step3)

ggplotly(a)