第四關—複雜數據分析
這一關屬於數據分析進階關,包括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,..) {
statementsreturn(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:數據分析 |