Yelp Dataset Challenge Round 10
예전에 Yelp dataset challenge 사이트에서 다운로드해 놨던 round 10 데이터를 뜯어보았다(현재는 round 11 제공 중). 전에 논문 쓸 때 round 9 데이터를 사용했었는데, round 10 데이터를 열어 보니 달라진 부분들이 꽤 눈에 띈다(마지막 부분에 정리함).
Yelp 데이터 다운로드부터 python을 이용해 데이터를 불러오는 과정까지 정리해 보았다.
1. 데이터 다운로드하기
2. 데이터 압축 (2번) 풀기
3. json to csv
4. Python에서 데이터 불러오기
Yelp에서는 주기적으로 열리는 dataset challenge 대회를 위해 데이터셋을 제공하고 있다. 이 링크로 들어가서 email 주소, 이름, 싸인을 입력하고 data license 동의에 체크하면 누구나 데이터를 다운로드할 수 있다. 파일은 .tar 형태로 다운로드되는데 용량이 2.11GB 정도 된다.
처음에 압축을 2번 풀어야 한다는 걸 몰라서 개고생 했다.
2-1) 일단 다운로드한 'yelp_dataset.tar' 파일을 우클릭하고 압축 풀기를 한다.
2-2) 그럼 yelp_dataset 폴더에 'yelp_dataset'이라는 파일이 생기는데(그림 1), 이 파일에 확장자명 '.tar'를 붙여준다. 즉, 'yelp_dataset.tar' 이렇게 만든 다음에 한 번 더 압축을 푼다.
2-3) 그러면 dataset 폴더에 json 파일 6개가 짠 나타난다(그림 2).
이제 저 json들을 csv로 바꿔줘야 한다. 이 과정에서 고생을 좀 했는데, python2.x 버전을 이용하면 간단하게 해결할 수 있다. 코드는 깃헙에 올려져 있고 친절한 설명도 함께 있으니 참고하시길.
나는 Anaconda2 prompt를 이용했다(그림 3). 중간에 simplejson 모듈이 없다고 해서 설치하고 'json_to_csv_converter.py'를 실행했다. 코드를 실행할 때는
$ python json_to_csv_converter.py tip.json
이런 식으로 값을 넣어주면 된다. tip.json이 변환할 json 파일이다.
그림 3의 코드를 실행하면 동일 폴더 내에 json 파일명과 같은 파일명으로 .csv 파일이 생성된다. 6개 json 파일에 대해 각각 실행해 주면 된다.
pandas를 이용해서 6개 데이터(business.csv, checkin.csv, photos.csv, review.csv, tip.csv, user.csv)를 Dataframe 형태로 불러와 보자.
4-0) 필요한 함수 import
import csv
import pandas as pd
4-1) business.csv 불러오기
df_biz = pd.read_csv('business.csv', lineterminator='\n')
데이터 크기: 156,639 rows × 101 columns
속성: 'attributes.Ambience.divey', 'attributes.RestaurantsDelivery', 'attributes.DogsAllowed', 'postal_code', 'hours.Thursday', 'attributes.HairSpecializesIn.coloring', 'attributes.BestNights.sunday', 'attributes.BYOB', 'attributes.AgesAllowed', 'attributes.Music.video', 'hours.Friday', 'latitude', 'attributes.Alcohol', 'attributes.Ambience.classy', 'attributes.RestaurantsTableService', 'business_id', 'attributes.Ambience.touristy', 'attributes.RestaurantsCounterService' 등
불러온 데이터를 출력해 보면 그림 4와 같다. 속성(column)이 101개나 된다. round 9 데이터에서는 16개였는데 엄청나게 늘어났다.
4-2) checkin.csv 불러오기
df_checkin = pd.read_csv('checkin.csv', lineterminator='\n')
데이터 크기: 135,148 rows × 169 columns
속성: 'time.Wednesday.14:00', 'time.Thursday.0:00', 'time.Sunday.14:00', 'time.Friday.9:00', 'time.Sunday.12:00', 'time.Wednesday.8:00', 'time.Wednesday.2:00', 'time.Wednesday.11:00', 'time.Monday.19:00', 'time.Tuesday.14:00', 'time.Wednesday.20:00', 'time.Saturday.7:00', 'time.Thursday.15:00', 'time.Sunday.23:00' 등
불러온 데이터를 출력해 보면 그림 5와 같다. checkin 데이터의 속성은 business 데이터보다도 많은 169개다. round 9 데이터에서는 3개였다.
보니까 time을 요일과 시간(1시간씩)으로 다 잘라놔서 속성의 수가 늘어난 것이다. 169개 속성 중 중 1개는 'business_id' 이므로, 7일 x 24시간 = 168개가 되는 것이다.
4-3) photos.csv 불러오기
df_photo = pd.read_csv('photos.csv', lineterminator='\n')
데이터 크기: 196,278 rows × 4 columns
속성: 'photo_id', 'business_id', 'label', 'caption'
불러온 데이터를 출력해 보면 그림 6과 같다. 속성이 4개라서 한눈에 다 들어온다. 지금 다루고 있는 데이터 외에 'yelp_photos.tar' 데이터를 따로 제공하는데, 'photo_id'와 연동하면 각 사진이 어떤 사진인지 알 수 있을 것이다. 이번 포스팅에서 거기까지는 다루지 않는다.
4-4) review.csv 불러오기
df_review = pd.read_csv('review.csv', lineterminator='\n')
데이터 크기: 4,736,897 rows × 9 columns
속성: 'funny', 'user_id', 'review_id', 'text', 'business_id', 'stars', 'date', 'useful', 'cool'
불러온 데이터를 출력해 보면 그림 7과 같다. 속성은 9개다. 이 데이터가 row의 수도 가장 많고, 'text' 속성에 사용자가 해당 장소에 대해 작성한 리뷰 글이 들어가 있어서 6개 데이터 중 용량이 가장 크다.
4-5) tip.csv 불러오기
df_tip = pd.read_csv('tip.csv', lineterminator='\n')
데이터 크기: 1,028,802 rows × 5 columns
속성: 'user_id', 'text', 'business_id', 'likes', 'date'
불러온 데이터를 출력해 보면 그림 8과 같다. 속성은 5개다. 이 데이터의 row 개수가 'review.csv', 'user.csv'에 이어 세 번째로 많다.
4-6) user.csv 불러오기
df_user = pd.read_csv('user.csv', lineterminator='\n')
데이터 크기: 1,183,368 rows × 22 columns
속성: 'yelping_since', 'useful', 'compliment_photos', 'compliment_list', 'compliment_funny', 'compliment_plain', 'review_count', 'elite', 'fans', 'compliment_note', 'funny' 등
불러온 데이터를 출력해 보면 그림 9와 같다. 속성은 22개다. 이 데이터의 row 개수가 'review.csv'에 이어 두 번째로 많다.
이전에 사용했던 round 9 데이터셋과 round 10 데이터셋을 항목별로 정리하면서 마무리한다.