# 2-1. (비교용) 국제공항이 위치한 도시 리스트 데이터 불러오기


airport <- read.csv("airport_mini.csv", stringsAsFactors = FALSE)

str(airport)


> airport <- read.csv("airport_mini.csv", stringsAsFactors = FALSE)

> str(airport)

'data.frame':  143 obs. of  3 variables:

 $ X      : int  1 2 3 4 5 6 7 8 9 10 ...

 $ city   : chr w/ 143 levels " "," 마카오",..: 72 101 106 57 13 6 103 ...

 $ airport: chr w/ 143 levels " 싱가포르 창이 국제공항",..: 7 89 91 8 15 79 ...


이전 포스팅에서 완성한 데이터 프레임에서 국제공항이 있는 도시 이름만 추출하기 위하여 모든 도시 이름(과 국제공항)이 담긴 csv 파일을 불러옵니다. 해당 파일은 위키피디아의 정보를 이용해 R로 제작한 파일이며 제작 과정이 궁금하신 분들은 아래 링크를 참조해 주세요.


(참고) [비교용 데이터] 위키피디아 자료로 국가 리스트 csv파일 만들기 (바로가기)




# 2-2. 도시명 최대, 최소 길이 구하기


min(nchar(airport$city))

max(nchar(airport$city))


> min(nchar(airport$city))

[1] 1

> max(nchar(airport$city))

[1] 8


두 데이터를 비교하기 전에 확실하게 비교 대상이 아닌 값, 즉 도시명이 될 수 없는 데이터를 미리 제거해줍니다. 이 과정을 거치면 데이터 처리량이 줄어 소요 시간이 줄어들 것 입니다. 'nchar'와 'min', 'max'를 이용하여 도시 이름의 최소, 최대 길이를 구해 활용하겠습니다. 




# 2-3. 도시명 최대, 최소 길이 맞춰 필터링 전처리


travel_ht08 <- travel_ht07 %>% filter(nchar(tag) >= 1 & nchar(tag) <= 8)

str(travel_ht07)

str(travel_ht08)


> travel_ht08 <- travel_ht07 %>% filter(nchar(tag) >= 1 & nchar(tag) <= 8)

> str(travel_ht07)

'data.frame':  220 obs. of  1 variable:

 $ tag: chr  "그라나다" "Granada" "스페인" "Spai" ...

> str(travel_ht08)

'data.frame':  175 obs. of  1 variable:

 $ tag: chr  "그라나다" "Granada" "스페인" "Spai" ...


2-2. 처리에 의하면 도시명의 길이는 1글자 이상 8글자 이하이므로 'filter' 함수에 해당 조건을 넣어 필터링을 실행합니다. 결과 220개에서 175개로 분석 대상이 줄었음을 알 수 있습니다. 소량의 데이터라 거의 차이가 없지만, 데이터가 많아진다면 분석 시간 등의 차이를 체감하게 될 것입니다.




# 2-4. 도시명 리스트에 있는 단어(도시명)만 추출


travel_ht09 <- intersect(airport$city, travel_ht08$tag)

travel_ht10 <- as.data.frame(travel_ht09, stringsAsFactors = FALSE)

travel_ht11 <- travel_ht10 %>% rename(city = travel_ht09)

travel_ht12 <- travel_ht11 %>% group_by(city) %>% summarise(n())


> travel_ht12

# A tibble: 8 x 2

  city       `n()`

  <chr>      <int>

1 리마               1     

2 밀라노            1      

3 부다페스트      1     

4 브리즈번      1  

양곤               1 

취리히            1

파리               1

8 프라하            1


해시태그 중 국제공항이 있는 도시의 이름에 해당하는 값은 위의 8개입니다. ('intersect' 함수를 사용하여 [추출한 해시태그들이 담긴 데이터 프레임]과 [도시명이 담긴 데이터 프레임]의 교집합을 추출하였습니다) 추가로 'summarise(n())'를 이용하여 단어의 개수도 확인해보았습니다. 한 계정에서 한국어 도시명만 추출하였기에 카운팅을 한 의미는 크게 없지만(...) 추출된 데이터가 많을 때 가장 많이 출력된 값을 찾아내는 데 사용할 수 있을 것 같습니다.



# 1. 파일 불러오기


test01 <- readLines("airport_raw.txt")

head(test01)


> head(test01)

[1] "모스크바 셰레메티예보 공항의 터미널 구조"

[2] ""

[3] "인천국제공항"

[4] ""

[5] "프랑크푸르트 공항에 있는 루프트한자 항공기"

[6] "공항(空港, 영어: airport)은 상업용 제반 항공기의 발착에 필요한 시설을 갖춘 공개비행장을 말한다. 주로 여객기·화물기 등의 항공기 이착륙에 이용한다. 항공기의 대형화와 항공기 대()수의 증가로 공항시설의 확장이 대부분의 도시에서 요청된다."


국제공항이 있는 도시의 이름과 공항 이름 칼럼이 있는 데이터 프레임을 생성하기 위해 관련 위키피디아 페이지의 정보를 텍스트 파일로 저장해 사용하였습니다.



[그림 1. 위키피디아 '국제공항' 페이지 (https://ko.wikipedia.org/wiki/%EA%B5%AD%EC%A0%9C%EA%B3%B5%ED%95%AD)]




# 2. ':'가 있는 행만 추출하기 (& 값 불러오기, data frame로 추출)


test02 <- grep(":", test01)

head(test02, 10)


> test02 <- grep(":", test01)

> head(test02, 10)

[1]  6 18 19 20 21 22 23 24 25 27


test03 <- as.data.frame(test01[test02], stringsAsFactor = FALSE)

test03 <- test03 %>% rename(city = `test01[test02]`)

head(test03, 5)


> test03 <- as.data.frame(test01[test02], stringsAsFactor = FALSE)

> test03 <- test03 %>% rename(city = `test01[test02]`)

> head(test03, 5)

            city

1 공항(空港, 영어: airport)은 상업용 제반 항공기의 발착에 필요한 시설을 갖춘 공개비행장을 말한다. 주로 여객기·화물기 등의 항공기 이착륙에 이용한다. 항공기의 대형화와 항공기 대(臺)수의 증가로 공항시설의 확장이 대부분의 도시에서 요청된다.

2 서울:김포 국제공항

3 인천:인천 국제공항

4 제주:제주 국제공항

5 부산:김해 국제공항


[그림 1]을 보면 위키피디아 '국제공항' 페이지의 자료가 '국가명:국제 공항 명'으로 되어있음을 알 수 있습니다. 따라서 'grep'을 사용하여 : 를 포함한 행만 추출했습니다.  'grep'은 인덱스를 반환하는 함수이므로 '원 데이터[결과 데이터]'로 값을 불러오는 단계 거쳤고, 'head'로 출력한 값을 보면 원하는 행이 제대로 추출되었음을 알 수 있습니다. 




# 3. 글자수 필터링


test04 <- test03 %>% filter(nchar(city) > 5 & nchar(city) < 30)

head(test04)


> test04 <- test03 %>% filter(nchar(city) > 5 & nchar(city) < 30)

> head(test04, 10)

                       city

1                    서울:김포 국제공항

2                    인천:인천 국제공항

3                    제주:제주 국제공항

4                    부산:김해 국제공항

5                    대구:대구 국제공항

6                    강원:양양 국제공항

7                    전남:무안 국제공항

8                    충북:청주 국제공항

9  도쿄:하네다 국제공항,나리타 국제공항

10               오사카:간사이 국제공항


test03의 1행과 같이 공항 명이 아닌 다른 정보인데 ':' 를 포함하는 값을 제거해주기 위해서 글자수 길이를 이용하여 데이터를 필터링했습니다.




# 4. (도시):(공항) > ':'를 기준으로 열 구분짓기


test05 <- as.data.frame(str_split_fixed(test04$city, ":", 2), stringsAsFactors = FALSE)

head(test05)


> test05 <- as.data.frame(str_split_fixed(test04$city, ":", 2), stringsAsFactors = FALSE)

> head(test05)

   V1          V2

1 서울         김포 국제공항

2 인천         인천 국제공항

3 제주         제주 국제공항

4 부산         김해 국제공항

5 대구         대구 국제공항

6 강원         양양 국제공항


도시와 공항을 각각의 칼럼으로 만들기 위해 'str_split_fixed'를 이용하여 ':' 를 기준으로 단어를 나누었습니다. 'str_split_fixed(string, pattern, n)'는 'stringr' 패키지에 있는 함수로 처리 대상인 stringpattern 기준에 따라 n개로 나누어 줍니다. 




# 5. 공항 2개인 경우 하나만 남기기


test06 <- as.data.frame(str_split_fixed(test05$V2, ",", 2), stringsAsFactors = FALSE)

head(test06, 10)


> test06 <- as.data.frame(str_split_fixed(test05$V2, ",", 2))

> head(test06)

               V1 V2

1    김포 국제공항                

2    인천 국제공항                

3    제주 국제공항                

4    김해 국제공항                

5    대구 국제공항                

6    양양 국제공항                

7    무안 국제공항                

8    청주 국제공항                

9  하네다 국제공항 나리타 국제공항

10 간사이 국제공항       


국제 공항이 2개 이상 있는 경우 ','로 연결되어 있습니다. (예: 하네다 국제공항, 나리타 국제공항) 따라서 ','를 pattern으로 칼럼을 한 번 더 나눠줍니다. 다음으로 이번 프로젝트는 약식으로 진행하는 것이라 도시별로 대표 국제공항 하나만 사용할 예정입니다. 따라서 아래 보이는 것과 같이 'select'를 이용해 첫 번째 칼럼만 남기겠습니다.


test061 <- test06 %>% select(V1)

head(test061, 10)


> test061 <- test06 %>% select(V1)

> head(test061, 10)

            V1

1 김포 국제공항

2 인천 국제공항

3 제주 국제공항

4 김해 국제공항

5 대구 국제공항

6 양양 국제공항

7 무안 국제공항

8 청주 국제공항

9 하네다 국제공항

10 간사이 국제공항




# 6. 필요 없는 문자열 제거


test062 <- as.data.frame(str_split_fixed(test061$V1, "\\(", 2), stringsAsFactors = FALSE)

head(test062)


> test062 <- as.data.frame(str_split_fixed(test061$V1, "\\(", 2), stringsAsFactors = FALSE)

> head(test062)

            V1 V2

1 김포 국제공항   

2 인천 국제공항   

3 제주 국제공항   

4 김해 국제공항   

5 대구 국제공항   

6 양양 국제공항  


국제공항이라는 단어 뒤에 괄호로 부연 설명이 되어있는 행이 있어 국제공항 이후 부분을 제거해주었습니다. 4. ~ 5.에서 진행한 것과 같은 과정이므로 설명은 생략하겠습니다. 참고로 특수문자 '('의 경우 기능을 가진 제어문자이므로, 문자 그대로를 인식시켜 주기 위해 역슬래쉬 두 개(\\)를 앞에 붙여주었습니다.




# 7. 도시-공항 데이터프레임 생성


test07 <- test05 %>% select(V1) %>% mutate(airport=test062$V1)

test08 <- test07 %>% rename(city = V1)

head(test08)

write.csv(test08, file="airport_mini.csv")


> test07 <- test05 %>% select(V1) %>% mutate(airport=test062$V1)

> test08 <- test07 %>% rename(city = V1)

> head(test08)

 city       airport

1 서울     김포 국제공항

2 인천     인천 국제공항

3 제주     제주 국제공항

4 부산     김해 국제공항

5 대구     대구 국제공항

6 강원     양양 국제공항


공항 명을 정제하느라 나뉘어 있던 두 행을 'mutate'를 사용하여 결합해주었습니다. 결과 도시명과 공항 명이 잘 연결되었음을 알 수 있었습니다. 정제 후에는 다시 과정을 거치지 않고 데이터를 불러오기 위해(너무나도 당연한 말이지만...) 'write.csv'를 이용하여 csv 파일로 내보냈습니다.



+ Recent posts