標籤:

猴子第三講實踐筆記—對航班計劃數據的處理

實踐內容:使用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:數據分析 |