猴子第三講實踐筆記—對航班計劃數據的處理
實踐內容:使用R語言函數對數據進行預處理,使數據便於使用和分析。
一、數據文件的說明。
我在民航預先飛行計劃管理系統網站上下載了2017夏秋季航班計劃(公開資源,網址民用航空預先飛行計劃管理系統),平時的工作中,需要定期對各公司在某一國家每周飛行的航班總量進行整理,雖然公司也有例如MIDT或Paxis等數據可以查詢到這個信息,但是不同系統查詢到的航班數量的口徑是不一樣的,民航預先飛行計劃管理系統是民航局在換季前批複的,這個口徑對於從航權利用的角度進行分析更能說明問題。
二、用R語言的便利性
首先,對於航班班次的計算,我沒有找到使用Excel進行計算的方法,而使用R語言,可以比較方便地將原始數據中的班期轉換為可以計算的數值。第二,考慮到未來工作實際,需要將機場四字代碼轉換為三字代碼,在Excel中進行替換,這個過程耗時太長,而且每次拿到新的航班計劃要從頭替換一遍,使用R,腳本可以複製,幾乎是一勞永逸,每次只要把新開通的機場加入進去就行了。第三,個別功能,比如Excel的Left文本處理函數,我感覺比我在R中使用的函數更加方便,應該是我沒有找到更合適的函數,但是目的還是學習和實踐R語言。
三、本次分析涉及的內容
1.將原始航班計劃中的班期轉換為可計算的數值,這樣就可以計算每一個公司的航班總量。
2.根據始發或到達機場,識別出某航空公司在某一個國家的航班總量。這是我們日常工作中需要用到的內容。
3.將機場四字代碼替換為三字代碼。三字代碼的使用範圍廣,便於識別。
四、實踐過程
#首先導入Excel數據,並轉換「班期」的格式。
library(readxl)
scheduledraft<-read_excel("D:/2017summer_schedule.xlsx")
schedule1<-scheduledraft[,c(1:10)]
schedule1
#第一步先解決班期的格式問題
#分割FD3列,生成列表schl
schl<-strsplit(schedule1$FD3,"")
#從列表中提取出數據框
frequen1<-sapply(schl,"[",1)
frequen2<-sapply(schl,"[",2)
frequen3<-sapply(schl,"[",3)
frequen4<-sapply(schl,"[",4)
frequen5<-sapply(schl,"[",5)
frequen6<-sapply(schl,"[",6)
frequen7<-sapply(schl,"[",7)
# 將含有各天班期數據的數據匡併入schedule2數據框,同時刪除原FD3列
schedule2<-cbind(schedule1[,-3],frequen1,frequen2,frequen3,frequen4,frequen5,frequen6,frequen7)
#對班期數據進行整理,便於計算。
schedule2$Mon[frequen1!="."]<-1
schedule2$Mon[frequen1=="."]<-0
schedule2$Tue[frequen2!="."]<-1
schedule2$Tue[frequen2=="."]<-0
schedule2$Wed[frequen3!="."]<-1
schedule2$Wed[frequen3=="."]<-0
schedule2$Thu[frequen4!="."]<-1
schedule2$Thu[frequen4=="."]<-0
schedule2$Fri[frequen5!="."]<-1
schedule2$Fri[frequen5=="."]<-0
schedule2$Sat[frequen6!="."]<-1
schedule2$Sat[frequen6=="."]<-0
schedule2$Sun[frequen7!="."]<-1
schedule2$Sun[frequen7=="."]<-0
schedule2<-schedule2[,-c(10:16)]
#上面的語句雖然較長,但是多數是重複的內容,目的就是將「1..4.67」這樣的字元型變數轉換為可以計算的班期。這個步驟完成後得到下面的數據:
FD1 FD2 FD4 FD5 FD6 FD7 Mon Tue Wed Thu Fri Sat Sun
1 3U601 330 ZUUU 0155 1220 YMML 1 0 0 1 0 1 0
2 3U602 330 YMML 1910 0550 ZUUU 0 1 0 0 1 0 1
3 3U603 330 ZUUU 1100 1755 OMDB 0 0 0 0 0 1 0
4 3U603 330 ZUUU 1505 2200 OMDB 0 0 1 0 0 0 0
5 3U604 330 OMDB 2330 0555 ZUUU 0 0 0 0 0 0 1
6 3U604 330 OMDB 0000 0700 ZUUU 0 0 0 1 0 0 0
7 3U605 330 ZUCK 2350 1020 YSSY 1 0 0 1 0 0 0
#增加一部分內容,將機場的四字代碼替換為三字代碼。
> origin<-sub("ZUUU","CTU",schedule2$FD4,fixed= TRUE)
> schedule2<-cbind(origin,schedule2)
> origin<-sub("OMDB","OOO",schedule2$origin,fixed= TRUE)
> schedule2<-cbind(origin,schedule2[,-1])
> origin<-sub("YMML","YYY",schedule2$origin,fixed= TRUE)
> schedule2<-cbind(origin,schedule2[,-1])
> head(schedule2)
#第二步解決航空公司代碼問題
#分離出航空公司兩字碼,本來想用類似於excel裡面提取前兩個字元的函數(Left),但是沒有找到。
codes<-strsplit(schedule1$FD1,"")
firstletter<-sapply(codes,"[",1)
secondletter<-sapply(codes,"[",2)
airline<-paste(firstletter,secondletter,sep= "")
schedule3<-cbind(airline,schedule2)
#提取廈門航空的兩字碼,nrow在這裡是我自己校驗用的,使用Excel的篩選功能(畢竟還是Excel更熟悉,哈哈),數了一下行數,104行,廈航每周52條航線(沒有剔除重複航線)
schedule.MF<-subset(schedule3,airline=="MF",select=airline:Sun)
nrow(schedule.MF)
#計算該公司的總航班班次
sum(schedule.MF$Mon,schedule.MF$Tue,schedule.MF$Wed,schedule.MF$Thu,schedule.MF$Fri,schedule.MF$Sat,schedule.MF$Sun)
#以上總班次顯示為358班。
#計算該公司某一國的航班班次。利用已知廈航開通的溫哥華航點,提取出其全部加拿大航線,然後計算班次。CYUL的航點我是裝樣子的,對於開通一國多個城市的,就這麼做。
#完整的想法是,分別用各城市的三字碼替換(賦值)各城市的四字碼,但是耗時太多,等有空慢慢做。
#用某一個國家各城市代碼作為識別標誌,新建變數(列)-國家
schedule.MF$country[schedule.MF$FD4=="CYVR"|schedule.MF$FD4=="CYUl"|schedule.MF$FD7=="CYVR"|schedule.MF$FD7=="CYUL"]<-"Canada"
schedule.MF.Canada<-subset(schedule.MF,country=="Canada")
schedule.MF.Canada
with(schedule.MF.Canada,{
sum(Mon,Tue,Wed,Thu,Fri,Sat,Sun)
})
#完整運行結果如下:
> library(readxl)
> scheduledraft<-read_excel("D:/2017summer_schedule.xlsx")
> schedule1<-scheduledraft[,c(1:10)]
> #第一步先解決班期的格式問題
> #分割FD3列,生成列表schl
> schl<-strsplit(schedule1$FD3,"")
> #從列表中提取出數據框
> frequen1<-sapply(schl,"[",1)
> frequen2<-sapply(schl,"[",2)
> frequen3<-sapply(schl,"[",3)
> frequen4<-sapply(schl,"[",4)
> frequen5<-sapply(schl,"[",5)
> frequen6<-sapply(schl,"[",6)
> frequen7<-sapply(schl,"[",7)
> # 將含有各天班期數據的數據匡併入schedule2數據框,同時刪除原FD3列
> schedule2<-cbind(schedule1[,-3],frequen1,frequen2,frequen3,frequen4,frequen5,frequen6,frequen7)
> #對班期數據進行整理,便於計算。
> schedule2$Mon[frequen1!="."]<-1
> schedule2$Mon[frequen1=="."]<-0
> schedule2$Tue[frequen2!="."]<-1
> schedule2$Tue[frequen2=="."]<-0
> schedule2$Wed[frequen3!="."]<-1
> schedule2$Wed[frequen3=="."]<-0
> schedule2$Thu[frequen4!="."]<-1
> schedule2$Thu[frequen4=="."]<-0
> schedule2$Fri[frequen5!="."]<-1
> schedule2$Fri[frequen5=="."]<-0
> schedule2$Sat[frequen6!="."]<-1
> schedule2$Sat[frequen6=="."]<-0
> schedule2$Sun[frequen7!="."]<-1
> schedule2$Sun[frequen7=="."]<-0
> schedule2<-schedule2[,-c(10:16)]
#增加一部分內容,將機場的四字代碼替換為三字代碼。
> origin<-sub("ZUUU","CTU",schedule2$FD4,fixed = TRUE)
> schedule2<-cbind(origin,schedule2)
> origin<-sub("OMDB","OOO",schedule2$origin,fixed = TRUE)
> schedule2<-cbind(origin,schedule2[,-1])
> origin<-sub("YMML","YYY",schedule2$origin,fixed = TRUE)
> schedule2<-cbind(origin,schedule2[,-1])
> head(schedule2)
origin FD1 FD2 FD4 FD5 FD6 FD7 FD8 FD9 FD10 Mon Tue Wed Thu Fri Sat Sun
1 CTU 3U601 330 ZUUU 0155 1220 YMML <NA> <NA> <NA> 1 0 0 1 0 1 0
2 YYY 3U602 330 YMML 1910 0550 ZUUU <NA> <NA> <NA> 0 1 0 0 1 0 1
3 CTU 3U603 330 ZUUU 1100 1755 OMDB <NA> <NA> <NA> 0 0 0 0 0 1 0
4 CTU 3U603 330 ZUUU 1505 2200 OMDB <NA> <NA> <NA> 0 0 1 0 0 0 0
5 OOO 3U604 330 OMDB 2330 0555 ZUUU <NA> <NA> <NA> 0 0 0 0 0 0 1
6 OOO 3U604 330 OMDB 0000 0700 ZUUU <NA> <NA> <NA> 0 0 0 1 0 0 0
> #第二步解決航空公司代碼問題
> #分離出航空公司兩字碼,本來想用類似於excel裡面提取前兩個字元的函數(Left),但是沒有找到。
> codes<-strsplit(schedule1$FD1,"")
> firstletter<-sapply(codes,"[",1)
> secondletter<-sapply(codes,"[",2)
> airline<-paste(firstletter,secondletter,sep = "")
> schedule3<-cbind(airline,schedule2)
> #提取某一個公司的兩字碼
> schedule.MF<-subset(schedule3,airline=="MF",select=airline:Sun)
> nrow(schedule.MF)
[1] 104
> #計算該公司的總航班班次
> sum(schedule.MF$Mon,schedule.MF$Tue,schedule.MF$Wed,schedule.MF$Thu,schedule.MF$Fri,schedule.MF$Sat,schedule.MF$Sun)
[1] 358
> #計算該公司某一國航班班次。
> #完整的想法是,分別用各城市的三字碼替換(賦值)各城市的四字碼,但是耗時太多,等有空慢慢做。
> #用某一個國家各城市代碼作為識別標誌,新建變數(列)-國家
> schedule.MF$country[schedule.MF$FD4=="CYVR"|schedule.MF$FD4=="CYUl"|schedule.MF$FD7=="CYVR"|schedule.MF$FD7=="CYUL"]<-"Canada"
> schedule.MF.Canada<-subset(schedule.MF,country=="Canada")
> schedule.MF.Canada
airline FD1 FD2 FD4 FD5 FD6 FD7 FD8 FD9 FD10 Mon Tue Wed Thu Fri Sat Sun country
1745 MF MF805 788 ZSAM 2140 0940 CYVR <NA> <NA> <NA> 1 0 0 1 0 1 0 Canada
1746 MF MF806 788 CYVR 1640 0610 ZSAM <NA> <NA> <NA> 1 0 1 0 0 1 0 Canada
> with(schedule.MF.Canada,{
+ sum(Mon,Tue,Wed,Thu,Fri,Sat,Sun)
+ })
[1] 6
推薦閱讀:
※吉利帝豪GS--車主洞察研究
※「不婚族」、「求三觀」......用數據解讀讓人意外的95後婚戀觀
※數據分析的三板斧
※精分分子的數據分析修行
TAG:數據分析 |