본문 바로가기

[Data Engineering]/[Gloud-GCP]

[GCP] 5-1. Bigquery, Data Loading

728x90

 < 대화형 데이터 탐색 >

 

  EDA( Exploratory Data Analysis, 탐색적 데이터 분석 )이라는 것은 데이터셋에 대한 통찰력을 발전시키고, 견고한 통계모델을 개발할 수 있는 접근법으로 존 투기( John W. Tukey )에 의해 만들어졌다. EDA는 다음과 같은 5가지 조건을 만족하는 그래프를 작성해야 한다.

  • 그래프 전체를 뒷받침하는 기본 가정( ex> 특정 값이 항상 존재할 것이다. or 특정 범위에 값이 항상 존재할 것이다. )을 평가해야 한다.

  • 중요한 변수를 식별하기 위해 직감과 논리를 사용해야 한다.

  • 데이터의 하부 구조를 찾아야 한다. 여기서 하부 구조란 중요한 변수와 특정한 통계적 패턴으로 들어간 데이터와 같은 상황 사이의 관계 등을 말한다.

  • 간략한 모델을 개발해야 한다.

  • 특이한 데이터, 이상한 데이터(설명할 수 없는 데이터 등)를 감지할 줄 알아야 한다.

  탐색적 데이터 분석(EDA)을 수행하려면 대화형 분석이 가능한 형태로 데이터를 탑재해야 한다. 이를 책에서는 다음과 같은 방법으로 소개하고 있다.

  1. 구글 BigQuery에 데이터를 탑재한다.

  2. Cloud-DataLab에서 데이터를 탐색한다.

  3. 발견한 데이터를 토대로 품질 관리를 수행한다.

  4. 신규 모델을 작성한다.

  5. 모델을 평가한다.

  사실 EDA의 목표는 최종 사용자나 결정권자가 아니라 데이터 엔지니어들이다. 따라서 꽤나 복잡한 도표들을 사용한다. 책에서 소개하는 EDA기법들을 하나씩 실습을 통해 따라가보도록 하자.

 

 < 실습 - EDA >

 

- 구글 BigQuery에 데이터를 탑재한다 -

  3장에서 작성했던 코드는 쉼표로 구분된 값( .csv) 파일로 저장되어 있는 BTS 항공 운항 데이터를 가져와서 UTC로 타임스탬프를 수정하고, 공항 정보에 해당하는 추가적인 칼럼을 덧붙인 후, 클라우드 스토리지에 저장했다. 이번에는 이 csv파일을 클라우드 스토리지에서 빅쿼리의 flights테이블로 입수한다. 

클라우드를 사용하기 전에 일반 파일을 사용했다면 클라우드 스토리지를 사용하고, 데이터베이스에 데이터를 저장했다면 빅쿼리에 저장한다.

빅쿼리 데이터셋을 생성한다 ( 3장에서 이미 생성했다. )

  해당 데이터셋에서는 개인신상정보나 기밀정보 등 강력한 접근 권한제어를 해야 할 이유는 없으므로 모든 사용자에세 bigquery.user 역할을 부여해 데이터셋에 대한 쿼리를 실행할 수 있게 하겠다.

  bigquery에서 flights데이터 셋을 찾고, share dataset에서 모든 사람이 데이터에 접근할 수 있게 한다. 도메인을 google.comd으로 입력하면 모든 사용자가 접근할 수 있게되는 원리인 것 같다.

< 접근 가능한 사용자 추가 >

  이후에는 github의 저자의 레퍼지토리에 소개되어 있는 load_into_bq.sh의 코드를 따라가며 어떤 순서로 bigquery에 데이터셋을 로드하게 되는지 살펴보도록 하겠다. 먼저 load_into_bq.sh 코드를 열어보자.

#!/bin/sh

if [ "$#" -ne 1 ]; then
    echo "Usage: ./load_to_bq.sh  bucket-name"
    exit
fi
PROJECT=$DEVSHELL_PROJECT_ID
BUCKET=$1

bq show --format=prettyjson flights.simevents > simevents.json

ONE_FILE=$(gsutil ls gs://${BUCKET}/flights/tzcorr/all_flights-00001*)
echo "Creating table definition from $ONE_FILE"
bq mk --external_table_definition=./tzcorr.json@CSV=$ONE_FILE flights.fedtzcorr

echo "Loading all files into BigQuery"
bq load flights.tzcorr "gs://${BUCKET}/flights/tzcorr/all_flights-*" tzcorr.json

 

  처음 나오는 부분은 프로젝트의 flights 데이터셋에 있는 simevents 테이블의 스키마를 얻는 과정이다.

bq show --format=prettyjson flights.simevents > simevents.json

< simevents테이블의 스키마를 얻어올 수 있다 >

다음은 csv 파일의 스키마가 만들어 졌으므로 이를 사용해서 테이블 정의를 새롭게 만드는데, simevents.json파일를 사용한 것이 아니라, 동일한 폴더의 tzcorr.json파일을 사용한 것이다. 해당 파일을 열어보면 simevents.json과 마지막 필드 3개가 다른 것을 확인할 수 있다.( event, notify_time, event_data를 제거했다.) 

ONE_FILE=$(gsutil ls gs://${BUCKET}/flights/tzcorr/all_flights-00001*)
echo "Creating table definition from $ONE_FILE"
bq mk --external_table_definition=./tzcorr.json@CSV=$ONE_FILE flights.fedtzcorr

< 새롭게 빅쿼리의 flights 테이블을 정의했다 >

  마지막으로 클라우드 스토리지의 데이터를 동일한 스키마( tzcorr.json )로 빅쿼리에 직접 탑제하게 된다. 실행하고 결과를 확인해 보자.

echo "Loading all files into BigQuery"
bq load flights.tzcorr "gs://${BUCKET}/flights/tzcorr/all_flights-*" tzcorr.json

  확인해 보면 필드값이 수정되어 있는 것을 볼 수 있다. ( event, notify_time, event_data )

< bigquery table이 변경된 모습을 볼 수 있다 >

  이제 쿼리문을 실행시켜 보자. 실행시킬 쿼리문은 다음과 같다.

 SELECT
   *
 FROM (
   SELECT # inner query
     ORIGIN, # 공항
     AVG(DEP_DELAY) AS dep_delay, # 평균 출발지연
     AVG(ARR_DELAY) AS arr_delay, # 평균 도착지연
     COUNT(ARR_DELAY) AS num_flights # 항공편 숫자는 3650대 이상인 경우만
   FROM
     flights.tzcorr
   GROUP BY
     ORIGIN )
 WHERE
   num_flights > 3650
 ORDER BY
   dep_delay DESC # 출발지연 정렬
   

   결과값을 보고 저자는 예상밖의 결과라고 판단하고 있다. EWR과 LGA등 뉴욕 지역의 공항들, ASE, EGE등 스키리조트 근방의 공항들은 이해가 된다( 겨울에만 개장하는 리조트는 부피가 큰 짐을 적재해야 하고, 날씨와 관련된 더 많은 지연을 겪을 수 있다.). 하지만 일부 공항의 경우, 대부분이 정시에 운행을 했지만 일부 항공편이 매우 지연되어 평균을 왜곡한 경우가 있을 수 있다. 이를 위해서는 분포함수를 그릴 필요가 있는데 안타깝게도 BigQuery는 이 기능을 제공하지 않는다. 따라서 다음 포스팅에서 Cloud Data Lab을 이용해서 데이터를 탐색해 보자.

 

 

 

 

"Data Science on the Google Cloud Platform by Valliappa Lakshmanan (O'Reilly). Copyright 2018 Google Inc."

 

728x90

'[Data Engineering] > [Gloud-GCP]' 카테고리의 다른 글

[GCP] 5-3. Data refining & model eval  (0) 2020.02.25
[GCP] 5-2. Cloud Data LAB  (4) 2020.02.24
[GCP] 4-2. Stream Processing  (2) 2020.02.19
[GCP] 4-1. ETL Pipeline  (0) 2020.02.19
[GCP] 3-3. DashBoard  (0) 2020.02.18