Jupyter 메모장에서 BigQuery 데이터 시각화

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

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

목표

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

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

비용

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

시작하기 전에

이 가이드를 시작하기 전에 Google Cloud Console을 사용하여 프로젝트를 만들거나 선택합니다.

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

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

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. BigQuery는 새 프로젝트에서 자동으로 사용 설정됩니다. 기존 프로젝트에서 BigQuery를 활성화하려면 BigQuery API를 사용 설정합니다.

    API 사용 설정

    로 이동합니다.
  4. 프로젝트에 신용 카드를 제공하지 않거나 결제를 사용 설정하지 않으려면 BigQuery에서 제공하는 샌드박스를 사용합니다. 이 주제의 단계는 프로젝트에 결제가 사용 설정되었는지 여부에 관계없이 프로젝트에 적용됩니다. 필요에 따라 결제를 사용 설정하려면 결제 사용 설정 방법 알아보기를 참조하세요.

로컬 Jupyter 환경 설정

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

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

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

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

개요: Jupyter 메모장

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

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

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

  • 마크다운 셀: 헤더, 목록, 서식 있는 텍스트를 생성하도록 HTML로 변환되는 마크다운 텍스트를 포함합니다.

다음 스크린샷은 마크다운 셀과 Python 코드 셀을 차례로 보여줍니다. Python 셀의 출력은 코드 아래에 바로 표시됩니다.

Jupyter 마크다운 및 코드 셀

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

BigQuery 데이터 쿼리 및 시각화

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

Jupyter 메모장을 사용하여 BigQuery 데이터를 쿼리 및 시각화하려면 다음 안내를 따르세요.

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

    jupyter notebook
    
  2. 그러면 Jupyter가 실행되고 브라우저 창에서 열립니다. Jupyter 창에서 New(새로 만들기) 버튼을 클릭하고 Python 3을 선택하여 Python 메모장을 만듭니다.

    Jupyter 새 Python 3 메모장

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

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

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

    %load_ext google.cloud.bigquery
  6. Run(실행) 버튼을 클릭하거나 SHIFT + ENTER 키를 사용하여 명령어를 실행합니다.

  7. Python용 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. Run(실행)을 클릭합니다.

  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. Run(실행)을 클릭합니다.

  12. 이제 Pandas DataFrame이 변수 total_births에 저장되어 표시할 수 있게 되었습니다. 쿼리 결과를 표시할 수 있도록 다음 셀에 다음과 같은 기본 제공 매직 명령어를 붙여넣어 매트플롯립을 활성화합니다. 매트플롯립은 Pandas가 그래프 표시에 사용하는 라이브러리입니다.

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

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

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

  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. Run(실행)을 클릭합니다.

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

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

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

    요일별 출생아 수 선 차트

  22. File(파일) > Save and Checkpoint(저장 및 체크포인트)를 클릭하거나 툴바에서 저장 아이콘을 클릭합니다. 체크포인트를 만들면 메모장을 이전 상태로 되돌릴 수 있습니다.

Pandas DataFrames

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

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

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

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

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

  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. Run(실행)을 클릭합니다.

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

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

  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. Run(실행)을 클릭합니다.

  10. 쿼리 결과를 DataFrame에 차트로 표시하려면 다음 셀에 다음 코드를 붙여넣습니다.

    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. Run(실행)을 클릭합니다.

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

    임신 주수별 평균 몸무게입니다.

다음 단계

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

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