Jupyter 노트북에서 BigQuery 데이터 시각화

BigQuery는 방대한 양의 데이터를 대상으로 실시간에 가깝게 SQL 쿼리를 실행하는 데 사용할 수 있는 페타바이트 규모의 분석 데이터 웨어하우스입니다.

데이터 시각화 도구는 BigQuery 데이터를 이해하고 양방향 방식으로 데이터를 분석하는 데 도움이 됩니다. 시각화 도구를 사용하면 트렌드를 파악하고, 이에 대응하고, 데이터를 바탕으로 예측할 수 있습니다. 이 가이드에서는 BigQuery Python 클라이언트 라이브러리 및 Jupyter 노트북의 Pandas를 사용하여 BigQuery natality 샘플 테이블의 데이터를 시각화합니다.

목표

이 가이드의 목표는 다음과 같습니다.

  • Jupyter 노트북을 실행하도록 환경 설정
  • BigQuery Python 클라이언트 라이브러리 및 Pandas를 사용하여 BigQuery 데이터 쿼리 및 시각화

비용

BigQuery는 유료 제품이므로 BigQuery에 액세스하면 BigQuery 사용 비용이 발생합니다. BigQuery 쿼리 가격에서 매월 1TB까지는 무료입니다. 자세한 내용은 BigQuery 가격 책정 페이지를 참조하세요.

시작하기 전에

이 가이드를 시작하기 전에 Google Cloud Platform Console을 사용하여 프로젝트를 만들거나 선택하고 결제를 사용 설정하세요.

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Select or create a Google Cloud Platform project.

    Go to the Manage resources page

  3. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. 새 프로젝트에서는 BigQuery가 자동으로 사용 설정됩니다. 기존 프로젝트에서 BigQuery를 활성화하는 방법은 다음과 같습니다. BigQuery API를 사용 설정합니다.

    API 사용 설정

로컬 Jupyter 환경 설정

이 가이드에서는 로컬에서 호스팅되는 Jupyter 노트북을 사용합니다. 다음 단계를 완료하여 Jupyter를 설치하고 인증을 설정하고 필요한 Python 라이브러리를 설치합니다.

  1. 터미널에서 다음 명령을 실행하여 Pandas를 사용하는 함수에 필요한 Pandas 라이브러리를 포함하여 최신 버전의 BigQuery Python 클라이언트 라이브러리를 설치합니다.

    pip install --upgrade google-cloud-bigquery[pandas]
    
  2. Jupyter 문서의 설치 안내에 따라 Jupyter를 설치합니다.

  3. 인증 시작하기 페이지의 안내에 따라 애플리케이션 기본 사용자 인증 정보를 설정합니다. 서비스 계정을 생성하고 환경 변수를 설정하여 인증을 설정합니다.

개요: Jupyter 노트북

노트북은 코드 작성 및 실행을 위한 환경을 제공합니다. 노트북은 본질적으로 .ipynb 파일로 저장되는 소스 아티팩트이며, 설명이 포함된 텍스트 콘텐츠, 실행 가능 코드 블록, 연결된 결과(양방향 HTML로 렌더링됨)를 포함할 수 있습니다. 구조상 노트북은 셀의 시퀀스입니다.

셀은 결과를 생성하기 위해 평가되는 입력 텍스트의 블록입니다. 셀의 유형은 다음과 같이 2가지입니다.

  • 코드 셀: 평가할 코드를 포함합니다. 코드를 실행하여 얻은 출력 또는 결과는 입력 코드 바로 아래 렌더링됩니다.

  • 마크다운 셀: 헤더, 목록, 형식이 지정된 텍스트를 생성하기 위해 HTML로 변환되는 마크다운 텍스트를 포함합니다.

아래 스크린샷은 뒤에 Python 코드 셀이 오는 마크다운 셀을 보여줍니다. Python 셀의 출력은 코드 아래 즉시 표시됩니다.

Jupyter 마크다운 및 코드 셀

열려 있는 각 노트북은 하나의 실행 세션과 연결되어 있습니다. IPython에서는 이를 커널이라고도 합니다. 이 세션은 노트북에 입력된 모든 코드를 실행하고 상태(변수, 변수 값, 함수, 클래스, 사용자가 로드하는 기존의 모든 Python 모듈)를 관리합니다.

BigQuery 데이터 쿼리 및 시각화

이 가이드 섹션에서는 BigQuery에서 데이터를 쿼리하고 시각화하는 데 사용되는 Cloud Datalab 노트북을 만듭니다. 또한 natality 샘플 테이블의 데이터를 사용하여 시각적 요소를 생성합니다. 이 가이드의 모든 쿼리는 표준 SQL 구문입니다.

Jupyter 노트북을 사용하여 BigQuery 데이터를 쿼리 및 시각화하는 방법:

  1. 아직 Jupyter를 시작하지 않은 경우 터미널에서 다음과 같은 명령어를 실행합니다.

    jupyter notebook
    
  2. 그러면 Jupyter가 실행되고 브라우저 창에서 열립니다. Jupyter 창에서 새로 만들기 버튼을 클릭하고 Python 2 또는 Python 3을 선택하여 새 Python 노트북을 생성합니다.

    Jupyter 새 Python 3 노트북

  3. 페이지 상단에서 제목 없음을 클릭합니다.

  4. 노트북 이름 바꾸기 대화상자에서 BigQuery tutorial과 같은 새 이름을 입력한 후 이름 변경을 클릭합니다.

  5. BigQuery Python 클라이언트 라이브러리는 최소한의 코드로 쿼리를 실행할 수 있는 매직 명령을 제공합니다. 클라이언트 라이브러리에서 매직 명령어를 로드하려면 다음 코드를 노트북의 첫 번째 셀에 붙여넣습니다.

    %load_ext google.cloud.bigquery
  6. 실행 버튼을 클릭하거나 SHIFT + ENTER를 눌러 명령어를 실행합니다.

  7. BigQuery 클라이언트 라이브러리는 SQL 쿼리를 실행하고 Pandas DataFrame으로 결과를 반환하는 셀 매직 %%bigquery를 제공합니다. 다음 셀에 다음과 같은 항목을 입력하여 연도별 총 출생아 수를 반환합니다.

           %%bigquery
    SELECT
        source_year AS year,
        COUNT(is_male) AS birth_count
    FROM `bigquery-public-data.samples.natality`
    GROUP BY year
    ORDER BY year DESC
    LIMIT 15
      
  8. 실행을 클릭합니다.

  9. 쿼리 결과가 코드 셀 아래 나타납니다.

    연도별 출생아 수 표

  10. 다음 셀 블록에서 다음과 같은 명령을 입력하여 동일한 쿼리를 실행합니다. 단, 이번에는 결과를 %%bigquery에 대한 인수로 주어지는 새 변수 total_births에 저장합니다. 그런 다음 추가 분석 및 시각화에 결과를 사용할 수 있습니다.

           %%bigquery total_births
    SELECT
        source_year AS year,
        COUNT(is_male) AS birth_count
    FROM `bigquery-public-data.samples.natality`
    GROUP BY year
    ORDER BY year DESC
    LIMIT 15
      
  11. 실행을 클릭합니다.

  12. 이제 Pandas DataFrame이 변수 total_births에 저장되어 구성할 준비가 되었습니다. 쿼리 결과 구성을 준비하려면 다음 셀에 다음과 같은 내장 매직 명령을 붙여넣어 구성을 위해 Pandas에서 사용하는 라이브러리인 matplotlib을 활성화합니다.

    %matplotlib inline
  13. 실행을 클릭합니다.

  14. 다음 셀에서 다음과 같은 코드를 입력하여 쿼리 결과를 막대 그래프로 시각화하는 Pandas DataFrame.plot() 메소드를 사용합니다. Pandas를 통한 데이터 시각화에 대해 자세히 알아보려면 Pandas 문서를 참조하세요.

           total_births.plot(kind='bar', x='year', y='birth_count');
      
  15. 실행을 클릭합니다.

  16. 코드 블록 아래에 차트가 나타납니다.

    연도별 출생아 수 막대 그래프

  17. 이제 다음과 같은 쿼리를 다음 셀에 붙여넣어 주별 출생아 수를 검색합니다.

           %%bigquery births_by_weekday
    SELECT
        wday,
        SUM(CASE WHEN is_male THEN 1 ELSE 0 END) AS male_births,
        SUM(CASE WHEN is_male THEN 0 ELSE 1 END) AS female_births
    FROM `bigquery-public-data.samples.natality`
    WHERE wday IS NOT NULL
    GROUP BY wday
    ORDER BY wday ASC
      

    wday(주중) 필드가 null 값을 허용하므로 쿼리가 wday가 null인 레코드를 제외시킵니다.

  18. 실행을 클릭합니다.

  19. 다음 셀에서 다음과 같은 코드를 입력하여 쿼리 결과를 선 그래프로 시각화합니다.

           births_by_weekday.plot(x='wday');
      
  20. 실행을 클릭합니다.

  21. 코드 블록 아래에 차트가 나타납니다. 일요일(1) 및 토요일(7)에 출생아 수가 급격하게 감소하는 것을 알 수 있습니다.

    요일별 출생아 수 선 차트

  22. 파일 > 저장 및 체크포인트를 클릭하거나 툴바에서 저장 아이콘을 클릭합니다. 체크포인트를 생성하면 노트북을 이전 상태로 롤백할 수 있습니다.

Pandas DataFrames

매직 명령을 통해 최소한의 구문을 사용하여 BigQuery와 상호 작용할 수 있습니다. 백그라운드에서 %%bigquery가 BigQuery Python 클라이언트 라이브러리를 사용하여 지정된 쿼리를 실행하고 결과를 Pandas Dataframe으로 변환하며(선택적으로 결과를 변수로 저장) 최종적으로 결과를 표시합니다. 매직 명령을 통하는 대신 BigQuery Python 클라이언트 라이브러리를 직접 사용하면 쿼리를 보다 세부적으로 관리할 수 있고 더욱 복잡한 구성도 가능합니다. Pandas와 함께 라이브러리의 통합을 사용하면 선언형 SQL의 기능을 명령형 코드(Python)와 결합하여 흥미로운 데이터 분석, 시각화 및 변환 작업을 수행할 수 있습니다.

Pandas DataFrames를 사용하여 BigQuery 데이터 쿼리 및 시각화

이 가이드 섹션에서는 Pandas DataFrames를 사용하여 BigQuery의 데이터를 쿼리하고 시각화합니다. BigQuery 데이터를 쿼리하려면 BigQuery Python 클라이언트 라이브러리를 사용합니다. DataFrames를 사용하여 데이터를 분석하려면 Pandas 라이브러리를 사용합니다.

  1. 다음 셀에 다음 Python 코드를 입력하여 BigQuery Python 클라이언트 라이브러리를 가져오고 클라이언트를 초기화합니다. BigQuery 클라이언트는 BigQuery API에서 메시지를 주고받는 데 사용됩니다.

           from google.cloud import bigquery
    client = bigquery.Client()
      
  2. 실행을 클릭합니다.

  3. Client.query() 메소드를 사용하여 쿼리를 실행합니다. 다음 셀에서 다음 코드를 입력하여 생일이 같은 연간 출생아 수를 쌍둥이 수별로 검색합니다(쌍둥이는 2, 세쌍둥이는 3 등).

           sql = """
    SELECT
        plurality,
        COUNT(1) AS count,
        year
    FROM
        `bigquery-public-data.samples.natality`
    WHERE
        NOT IS_NAN(plurality) AND plurality > 1
    GROUP BY
        plurality, year
    ORDER BY
        count DESC
    """
    df = client.query(sql).to_dataframe()
    df.head()
      
  4. 실행을 클릭합니다.

  5. 쿼리 결과를 데이터 프레임에 그래프로 표시하려면 다음 셀에 다음 코드를 삽입하여 데이터를 피봇하고 시간 경과에 따른 다둥이 출생아 수의 누적 막대 그래프를 만듭니다.

           pivot_table = df.pivot(index='year', columns='plurality', values='count')
    pivot_table.plot(kind='bar', stacked=True, figsize=(15, 7));
      
  6. 실행을 클릭합니다.

  7. 코드 블록 아래에 차트가 나타납니다.

    연도별 다둥이 출생아 수 누적 막대 그래프

  8. 다음 셀에서 다음 쿼리를 입력하여 임신 주수별 출생아 수를 검색합니다.

           sql = """
    SELECT
        gestation_weeks,
        COUNT(1) AS count
    FROM
        `bigquery-public-data.samples.natality`
    WHERE
        NOT IS_NAN(gestation_weeks) AND gestation_weeks <> 99
    GROUP BY
        gestation_weeks
    ORDER BY
        gestation_weeks
    """
    df = client.query(sql).to_dataframe()
      
  9. 실행을 클릭합니다.

  10. 쿼리 결과를 데이터 프레임에 그래프로 표시하려면 다음 셀에 다음 코드를 붙여넣습니다.

           ax = df.plot(kind='bar', x='gestation_weeks', y='count', figsize=(15,7))
    ax.set_title('Count of Births by Gestation Weeks')
    ax.set_xlabel('Gestation Weeks')
    ax.set_ylabel('Count');
      
  11. 실행을 클릭합니다.

  12. 코드 블록 아래에 막대 그래프가 나타납니다.

    임신 주수별 평균 몸무게 차트

다음 단계

  • BigQuery에서 쿼리 작성하는 법 자세히 알아보기 - BigQuery 문서의 데이터 쿼리에서 쿼리 실행 방법, UDF(사용자 정의 함수) 작성 방법 등을 설명합니다.

  • BigQuery 구문 살펴보기 - BigQuery에서 SQL 쿼리에 사용되는 기본 언어인 표준 SQL은 SQL 참조에 설명되어 있습니다. BigQuery의 이전 SQL 유사 구문은 쿼리 참조(이전 SQL)에 설명되어 있습니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...