brunch

You can make anything
by writing

C.S.Lewis

by 이영민 Mar 20. 2018

Yelp 데이터 뜯어보기

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에서 데이터 불러오기



1. 데이터 다운로드하기


Yelp에서는 주기적으로 열리는 dataset challenge 대회를 위해 데이터셋을 제공하고 있다. 이 링크로 들어가서 email 주소, 이름, 싸인을 입력하고 data license 동의에 체크하면 누구나 데이터를 다운로드할 수 있다. 파일은 .tar 형태로 다운로드되는데 용량이 2.11GB 정도 된다.



2. 데이터 압축 (2번) 풀기


처음에 압축을 2번 풀어야 한다는 걸 몰라서 개고생 했다.

    2-1) 일단 다운로드한 'yelp_dataset.tar' 파일을 우클릭하고 압축 풀기를 한다.

    2-2) 그럼 yelp_dataset 폴더에 'yelp_dataset'이라는 파일이 생기는데(그림 1), 이 파일에 확장자명 '.tar'를 붙여준다. 즉, 'yelp_dataset.tar' 이렇게 만든 다음에 한 번 더 압축을 푼다.

그림 1. yelp_dataset 속성


    2-3) 그러면 dataset 폴더에 json 파일 6개가 짠 나타난다(그림 2).

그림 2. json 파일 6개

3. json to csv


이제 저 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 파일에 대해 각각 실행해 주면 된다.

그림 3. json to csv

4. python에서 데이터 불러오기 


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. business.csv 출력 결과


    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개가 되는 것이다.

그림 5. checkin.csv 출력 결과


    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'와 연동하면 각 사진이 어떤 사진인지 알 수 있을 것이다. 이번 포스팅에서 거기까지는 다루지 않는다. 

그림 6. photos.csv 출력 결과


    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개 데이터 중 용량이 가장 크다.

그림 7. review.csv 출력 결과


    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'에 이어 세 번째로 많다.

그림 8. tip.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'에 이어 두 번째로 많다.

그림 9. user.csv 출력 결과



끝으로


이전에 사용했던 round 9 데이터셋과 round 10 데이터셋을 항목별로 정리하면서 마무리한다.

그림 10. round 9와 round 10 데이터셋 비교
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari