標籤:

第四關—複雜數據分析

這一關屬於數據分析進階關,包括R語言中控制流和自定義函數、數據分析師的成長過程、應用搜索工具Google、應用機器學習進行數據分析。

第一部分是R語言實戰中第五章的實操過程,簡單來說就是循環流for、while;條件判斷if、else、ifelse、switch以及自定義函數,管道的使用,代碼如下:

1.1 for結構 循環執行一個語句,直到某個變數不在包含在Seq序列中

for (var in seq) { statement }

for (i in 1:10) { print("Hello")}

1.2 while結構,循環重複地執行一個語句,直到條件不為真為止

while (cond) {statement}

i <-10while (i>0) {print("Hello"); + i <- i-1}

1.3.1 if-else結構

grade <-c("long")if (is.character(grade)) grade <-as.factor(grade)if (!is.factor(grade)) grade <-as.factor(grade) else print("Grade already is a factor")

1.3.2 ifelse結構是if-else結構比較緊湊的向量化版本

ifelse(cond,statement1,statement2)

score <-1ifelse(score >0.5,print("Passed"),print("Failed"))

1.3.3 switch結構,條件選擇結構

switch(expr,...)

feelings <-c("sad","afraid")for (i in feelings){ print( switch(i, happy = "I am glad you are happy", afraid = "There is nothing to fear", sad = "Cheer up", angry = "Clam down now") )}

1.4 自定義函數

myfunction <-function(arg1,arg2,..) {

statements

return(object)

}

mystats <-function(x,parametric=TRUE,print=FALSE){ if(parametric){ center <-mean(x);spread <-sd(x) } else{ center <-median(x);spread <-mad(x) } if(print & parametric){ cat("Mean=",center,"
","SD=",spread,"
") } else if(print & !parametric){ cat("Median=",center,"
","MAD=",spread,"
") } result <-list(center=center,spread=spread) return(result)}set.seed(1234)x <-rnorm(500)y <-mystats(x,parametric = FALSE,print = TRUE)

2 整理與重構

2.1 轉置

cars <-mtcars[1:5,1:4]carst(cars)

2.2 整合數據 aggregate(x,by,FUN)

  • x 是待摺疊的數據對象,by是一個變數名組成的列表,將會被去掉形成新的觀測,fun則是用於計算描述性統計量的標量函數

attach(mtcars)aggdate <-aggregate(mtcars,by=list(cyl,gear),FUN=mean,na.rm=TRUE)aggdatedetach(mtcars)

2.3 整合數據 reshape2包

install.packages("reshape2")library("reshape2")mydata <-data.frame(ID = c(1,1,2,2),Time =c(1,2,1,2),X1=c(5,3,6,2),X2=c(6,5,1,4))

融合數據

md <-melt(mydata,id=c("ID","Time"))md

重鑄數據 (這一塊還是沒弄明白)

  • mewdata <-dcast(md,formula,fun.aggregate)
  • formula形式:rowvar1+rowvar2+...~colvar1+colvar2+...,fun.aggregate為整合函數

dcast(md,ID+Time~variable)dcast(md,ID+variable~Time)dcast(md,ID~Time+variable)

2.4 整合數據dplyr包

install.packages("nycflights13")library("dplyr")library("nycflights13")str(flights)

選擇子集

myFlights <-select(flights,year,month,day,dep_delay,arr_delay,distance,dest)

選擇列

select(flights,year:day)

去掉列

select(flights,-(year:day))

模糊查詢

#stats_with("abc") ends_with("xyz") contains("ijk") matches("(.)\1")myFlights <-select(flights,year:day,ends_with("delay"),distance,dest)

重命名rename

myFlights <-rename(myFlights,destination = dest)nrow(myFlights)myFlights <-filter(myFlights, !is.na(dep_delay), !is.na(arr_delay))nrow(myFlights)

條件選擇

#查詢延誤時間大於120min的filter(myFlights, arr_delay >120 | dep_delay >120)

排序

#排序,arrange默認升序,desc降序arrange(myFlights,desc(dep_delay))

條件分組

#split 數據分組 group_by函數by_dest <-group_by(myFlights,destination)delay <-summarise(by_dest, count = n(), dist = mean(distance,na.rm = TRUE), delay = mean(arr_delay,na.rm = TRUE))

移除噪音數據

delay <-filter(delay,count >20)

管道的使用

  • 管道%>%將這個符號左邊的值發送給右邊的函數,並作為該函數的第一個變數

    將上面一系列的操作寫成管道形式

delay <-flights %>% group_by(dest) %>% summarise( count = n(), dist = mean(distance,na.rm=TRUE), delay = mean(arr_delay,na.rm=TRUE) ) %>% filter(count >20)

3 可視化ggplot2包

library("ggplot2")ggplot(data = delay) + geom_point(mapping = aes(x=dist,y=delay))ggplot(data =delay) + geom_point(mapping =aes(x = dist,y = delay)) + geom_smooth(mapping = aes(x = dist,y = delay))projectPath <-getwd()servicePath <-str_c(projectPath, "service", "flight.R", sep="/")

第二部分,翻譯一篇dpyr包作者的文獻。

第三部分,Kaggle數據分析項目實戰。

近期空閑的時間比較少,晚了幾天完成任務。總的來說,第一部分的任務比較簡單,語法結構和Python中差不多。這幾天Google上不去,Hadley Wickham的文章找起來不方便,就在一些學術期刊上找了一篇,翻譯了Introduction和其中的一個章節,因為英文閱讀能力較弱,論文內容傾向於理論方面的討論,一些專業名詞不知道怎麼翻譯比較恰當,看起來比較吃力。第三部分是在Kaggle上的一個實際比賽項目,為了較快適應實戰過程,暫時挑選了網上教程比較多的Titanic乘客預測的那個題目。總的來說,有了基本的數據分析的脈絡,導入數據->數據觀測->數據清洗->特徵工程->建模->預測->優化模型->預測。在這個過程中,接觸到了數據處理包dpyr,mice,可視化包ggplot2,隨機森林演算法建模包randomForest。在接下來的實戰中,會進一步熟悉這些工作的使用,提升實踐經驗。


推薦閱讀:

數據篇(1):數據分析
使用藥店數據分析
數據分析的三板斧
第九期 | 人工智慧技術情報分享
Python數據分析的學習計劃

TAG:數據分析 |