본문 바로가기
프로그램 (PHP,Python)

YouTube API 활용한 시청시간 및 수익 데이터 자동 수집과 분석

by 날으는물고기 2025. 2. 23.

YouTube API 활용한 시청시간 및 수익 데이터 자동 수집과 분석

YouTube Data API ❘ Google for Developers

YouTube Analytics API를 통해 수집할 수 있는 메트릭 항목은 다음과 같습니다. 이 항목들은 API 요청 시 metrics 파라미터로 지정할 수 있습니다.

주요 메트릭 카테고리

  1. 시청 데이터 관련 메트릭
    • views: 조회수
    • estimatedMinutesWatched: 추정 시청 시간(분 단위)
    • averageViewDuration: 평균 시청 시간(초 단위)
    • averageViewPercentage: 평균 시청 비율 (%)
  2. 구독자 관련 메트릭
    • subscribersGained: 증가한 구독자 수
    • subscribersLost: 감소한 구독자 수
    • subscriberCount: 총 구독자 수
  3. 수익 관련 메트릭 (YouTube 파트너 프로그램 사용자 대상)
    • estimatedRevenue: 추정 총수익
    • estimatedAdRevenue: 추정 광고 수익
    • grossRevenue: 총 수익
    • estimatedRedPartnerRevenue: YouTube Premium 수익
    • monetizedPlaybacks: 수익화된 재생수
    • cpm: 1,000회 노출당 비용
  4. 동영상 참여 관련 메트릭
    • likes: 좋아요 수
    • dislikes: 싫어요 수
    • comments: 댓글 수
    • shares: 공유 수
    • videosAddedToPlaylists: 재생목록에 추가된 동영상 수
    • videosRemovedFromPlaylists: 재생목록에서 제거된 동영상 수
  5. 동영상 콘텐츠 및 재생 관련 메트릭
    • annotationClickThroughRate: 주석 클릭율
    • annotationCloseRate: 주석 닫기율
    • cardClickRate: 카드 클릭율
    • cardTeaserClickRate: 카드 티저 클릭율
    • endScreenClickRate: 엔드스크린 클릭율

주의 사항

  • 사용 가능한 메트릭은 선택한 dimensionsfilters에 따라 다릅니다.
    • 예를 들어, daydimensions로 선택하면 일별 데이터가 제공되며, 일부 메트릭은 특정 filters 조합에서만 사용 가능합니다.
  • 추가 조건
    • 수익 관련 메트릭을 수집하려면 채널이 YouTube 파트너 프로그램에 가입되어 있어야 합니다.
    • API 버전에 따라 일부 메트릭이 제한될 수 있으니 공식 문서에 명시된 조건을 참고하세요.

 

현재 사용 중인 dimensions=daymetrics=subscribersGained,subscribersLost,views,estimatedMinutesWatched는 일별 구독자 증감, 조회수, 시청 시간을 수집하는 기본적인 조합입니다. 다른 메트릭도 필요하면 위 목록을 참고해 추가하세요.

 

YouTube Analytics API에서 한 번의 요청으로 가능한 모든 메트릭을 받는 것은 제한이 있습니다. 이는 API 호출 시 특정 메트릭 조합이 지원되지 않거나 dimensionsfilters에 따라 일부 메트릭이 사용할 수 없기 때문입니다. 하지만 모든 메트릭을 수집하려면 여러 API 호출을 통해 데이터를 나눠서 받아야 합니다.

모든 메트릭을 수집하는 방법

  1. 가능한 메트릭 전체 목록을 그룹화: YouTube Analytics API에서 메트릭을 한 번에 요청할 수 있는 조합을 만들어야 합니다. 메트릭 조합은 문서에서 지원되는 dimensionsfilters에 따라 다릅니다.
  2. 추천 조합: 아래와 같이 호출 그룹을 나눠 요청합니다.

그룹 1: 콘텐츠 성과 메트릭

dimensions: day
metrics: views, estimatedMinutesWatched, averageViewDuration, averageViewPercentage, subscribersGained, subscribersLost

그룹 2: 참여도 메트릭

dimensions: day
metrics: likes, dislikes, comments, shares, videosAddedToPlaylists, videosRemovedFromPlaylists

그룹 3: 수익 메트릭

dimensions: day
metrics: estimatedRevenue, estimatedAdRevenue, grossRevenue, estimatedRedPartnerRevenue, monetizedPlaybacks, cpm

그룹 4: 인터랙션 메트릭

dimensions: day
metrics: annotationClickThroughRate, annotationCloseRate, cardClickRate, cardTeaserClickRate, endScreenClickRate

모든 메트릭을 수집하는 Python 코드 예제

아래는 YouTube Analytics API에서 모든 메트릭을 나눠 호출하고 결과를 통합하는 예제입니다.

import requests
from google.oauth2.credentials import Credentials

# OAuth 인증을 통해 얻은 액세스 토큰
ACCESS_TOKEN = "your_access_token_here"
BASE_URL = "https://youtubeanalytics.googleapis.com/v2/reports"

# 요청 그룹 정의
groups = [
    {"dimensions": "day", "metrics": "views,estimatedMinutesWatched,averageViewDuration,averageViewPercentage,subscribersGained,subscribersLost"},
    {"dimensions": "day", "metrics": "likes,dislikes,comments,shares,videosAddedToPlaylists,videosRemovedFromPlaylists"},
    {"dimensions": "day", "metrics": "estimatedRevenue,estimatedAdRevenue,grossRevenue,estimatedRedPartnerRevenue,monetizedPlaybacks,cpm"},
    {"dimensions": "day", "metrics": "annotationClickThroughRate,annotationCloseRate,cardClickRate,cardTeaserClickRate,endScreenClickRate"},
]

# 함수: API 호출
def fetch_data(group):
    params = {
        "ids": "channel==MINE",
        "startDate": "2023-01-01",
        "endDate": "2023-12-31",
        "metrics": group["metrics"],
        "dimensions": group["dimensions"],
    }
    headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}
    response = requests.get(BASE_URL, params=params, headers=headers)
    return response.json()

# 데이터 수집 및 통합
all_data = []
for group in groups:
    result = fetch_data(group)
    all_data.append(result)

# 결과 출력
for data in all_data:
    print(data)

결과를 통합하여 저장

여러 호출의 데이터를 통합하려면 결과를 CSV 또는 데이터베이스에 저장하면 좋습니다. 이를 위해 pandas 라이브러리를 활용할 수 있습니다.

import pandas as pd

# 예제: 데이터를 pandas DataFrame으로 변환
dataframes = []
for data in all_data:
    df = pd.DataFrame(data.get('rows', []), columns=data.get('columnHeaders', []))
    dataframes.append(df)

# 통합 DataFrame 생성
final_df = pd.concat(dataframes, ignore_index=True)

# CSV로 저장
final_df.to_csv("youtube_analytics.csv", index=False)

주의사항

  1. 쿼리 제한: YouTube Analytics API는 일일 쿼리 제한(쿼터)을 가지고 있으므로 모든 데이터를 수집하기 위해 요청 횟수를 조정해야 합니다.
  2. 최신 메트릭 확인: Google 문서에서 제공하는 최신 메트릭 목록을 주기적으로 확인하세요.
  3. OAuth 인증: 액세스 토큰은 반드시 유효한 상태로 유지하며 필요시 갱신하세요.

위 코드를 활용하면 모든 메트릭 데이터를 수집하여 분석할 수 있습니다.

YouTube Analytics API에서 제공하는 정확한 수익 관련 지표를 사용하려면, watchTimeestimatedMinutesWatched와는 다르게 YouTube API에서 직접 지원하지 않는 경우가 있습니다. 특히 earnings 관련 데이터를 가져올 때는 YouTube Partner Program(YPP)에 가입된 계정이어야 합니다.

1. 사용 가능한 유효 시청시간 및 수익 관련 지표

YouTube Analytics API에서 사용할 수 있는 유효 시청시간 및 수익 관련 지표는 다음과 같습니다.

메트릭(Metrics) 설명
estimatedMinutesWatched 예상 시청시간 (모든 유형 포함)
views 조회수
estimatedRevenue 총 예상 수익
adRevenue 광고 수익
redPartnerRevenue YouTube Premium 수익
playbackBasedCpm 광고 CPM(천 회 재생 기준 수익)
cpm CPM(천 회 노출 기준 수익)
monetizedPlaybacks 수익 창출이 가능한 재생수
grossRevenue 총 수익 (수수료 포함)

2. 채널의 수익 창출 데이터 조회

def get_monetized_data(youtube, channel_id, start_date, end_date):
    analytics = youtube.reports().query(
        ids="channel=="+channel_id,
        startDate=start_date,
        endDate=end_date,
        metrics="views,estimatedMinutesWatched,estimatedRevenue,adRevenue,redPartnerRevenue,monetizedPlaybacks",
        dimensions="day",
        sort="day"
    )
    response = analytics.execute()

    # 데이터 출력
    for row in response.get("rows", []):
        print(f"{row[0]} - 조회수: {row[1]}, 시청시간(분): {row[2]}, 예상 수익: ${row[3]}, 광고 수익: ${row[4]}, YouTube Premium 수익: ${row[5]}, 수익 창출 재생수: {row[6]}")

# 최근 30일간 수익 창출 관련 데이터 조회
get_monetized_data(youtube, channel_id, start_date, end_date)
  • views: 조회수
  • estimatedMinutesWatched: 예상 시청시간
  • estimatedRevenue: 총 예상 수익
  • adRevenue: 광고 수익
  • redPartnerRevenue: YouTube Premium에서 발생한 수익
  • monetizedPlaybacks: 수익이 발생한 재생수 (광고가 표시된 재생)

3. 영상별 수익 데이터 조회

특정 영상별 수익 데이터를 가져오려면 dimensions="video"를 사용합니다.

def get_video_monetized_data(youtube, channel_id, start_date, end_date):
    analytics = youtube.reports().query(
        ids="channel=="+channel_id,
        startDate=start_date,
        endDate=end_date,
        metrics="views,estimatedMinutesWatched,estimatedRevenue,adRevenue,redPartnerRevenue,monetizedPlaybacks",
        dimensions="video",
        sort="-estimatedRevenue"
    )
    response = analytics.execute()

    # 데이터 출력
    for row in response.get("rows", []):
        video_id = row[0]
        print(f"영상 ID: {video_id} - 조회수: {row[1]}, 시청시간(분): {row[2]}, 예상 수익: ${row[3]}, 광고 수익: ${row[4]}, YouTube Premium 수익: ${row[5]}, 수익 창출 재생수: {row[6]}")

# 최근 30일간 영상별 수익 데이터 조회
get_video_monetized_data(youtube, channel_id, start_date, end_date)
  • 조회수가 많지만 수익이 적은 영상과, 조회수가 적어도 수익이 높은 영상을 비교할 수 있음.

4. 영상 제목과 함께 조회

def get_video_title(youtube, video_id):
    request = youtube.videos().list(
        part="snippet",
        id=video_id
    )
    response = request.execute()
    return response["items"][0]["snippet"]["title"] if response["items"] else "알 수 없음"

def get_video_monetized_data_with_title(youtube, channel_id, start_date, end_date):
    analytics = youtube.reports().query(
        ids="channel=="+channel_id,
        startDate=start_date,
        endDate=end_date,
        metrics="views,estimatedMinutesWatched,estimatedRevenue,adRevenue,redPartnerRevenue,monetizedPlaybacks",
        dimensions="video",
        sort="-estimatedRevenue"
    )
    response = analytics.execute()

    # 데이터 출력
    for row in response.get("rows", []):
        video_id = row[0]
        video_title = get_video_title(youtube, video_id)
        print(f"영상: {video_title} - 조회수: {row[1]}, 시청시간(분): {row[2]}, 예상 수익: ${row[3]}, 광고 수익: ${row[4]}, YouTube Premium 수익: ${row[5]}, 수익 창출 재생수: {row[6]}")

# 최근 30일간 영상별 수익 데이터 조회 (제목 포함)
get_video_monetized_data_with_title(youtube, channel_id, start_date, end_date)

5. 데이터 저장 및 분석

pandas를 활용해 데이터 저장

import pandas as pd

def get_monetized_data_df(youtube, channel_id, start_date, end_date):
    analytics = youtube.reports().query(
        ids="channel=="+channel_id,
        startDate=start_date,
        endDate=end_date,
        metrics="views,estimatedMinutesWatched,estimatedRevenue,adRevenue,redPartnerRevenue,monetizedPlaybacks",
        dimensions="day",
        sort="day"
    )
    response = analytics.execute()

    data = []
    for row in response.get("rows", []):
        data.append({
            "날짜": row[0],
            "조회수": row[1],
            "시청시간(분)": row[2],
            "예상 수익($)": row[3],
            "광고 수익($)": row[4],
            "YouTube Premium 수익($)": row[5],
            "수익 창출 재생수": row[6]
        })

    return pd.DataFrame(data)

df = get_monetized_data_df(youtube, channel_id, start_date, end_date)
print(df)

# CSV 파일로 저장
df.to_csv("youtube_monetized_data.csv", index=False, encoding="utf-8-sig")

YouTube API에서 watchTime은 지원되지 않음 → 대신 estimatedMinutesWatched 사용
수익 창출과 관련된 주요 지표: estimatedRevenue, adRevenue, redPartnerRevenue, monetizedPlaybacks
영상별 수익 및 유효 시청시간 확인 가능
데이터를 pandas DataFrame으로 변환 후 CSV로 저장하여 분석 가능

 

이 방법을 활용하면 YouTube의 수익 창출과 연결된 데이터(시청시간, 수익, 광고 수익 등)를 자동으로 수집하고 분석할 수 있습니다.

YouTube 데이터를 체계적으로 수집, 저장, 분석, 시각화하는 자동화된 파이프라인을 구축하는 방법입니다. 이 파이프라인은 YouTube API → Airflow → Google BigQuery → Looker Studio로 구성되며, 데이터 수집부터 분석까지 자동화할 수 있습니다.

1. 전체 아키텍처 개요

목표

  • YouTube Analytics 데이터를 정기적으로 수집 (시청시간, 수익, 조회수 등)
  • Google BigQuery에 저장하여 분석 가능하도록 구축
  • Looker Studio를 활용하여 대시보드 자동 업데이트
  • 모든 작업을 Airflow를 활용하여 자동화

주요 구성 요소

구성 요소 역할
YouTube API YouTube 데이터 수집 (시청시간, 수익, 조회수 등)
Docker Airflow 환경을 컨테이너화하여 배포 및 실행
Apache Airflow YouTube API → BigQuery로 데이터를 ETL 자동화
Google BigQuery 데이터 저장 및 분석
Looker Studio BigQuery 데이터를 시각화하여 대시보드 생성

2. YouTube API를 활용한 데이터 수집

YouTube API를 사용하여 views, estimatedMinutesWatched, earnings 등의 데이터를 가져옵니다.

YouTube API 활성화 및 인증

  1. Google Cloud Console에서 YouTube Data API v3 활성화
  2. OAuth 2.0 인증 정보 생성 및 JSON 다운로드
  3. google-authgoogleapiclient 라이브러리 설치
pip install google-auth google-auth-oauthlib google-auth-httplib2 googleapiclient pandas

YouTube API를 통한 데이터 수집 코드

아래 Python 코드를 사용하여 YouTube 데이터를 수집할 수 있습니다.

import googleapiclient.discovery
import google_auth_oauthlib.flow

CLIENT_SECRETS_FILE = "client_secret.json"
SCOPES = ["https://www.googleapis.com/auth/youtube.readonly"]
API_SERVICE_NAME = "youtube"
API_VERSION = "v3"

def get_authenticated_service():
    flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
    credentials = flow.run_local_server(port=0)
    return googleapiclient.discovery.build(API_SERVICE_NAME, API_VERSION, credentials=credentials)

youtube = get_authenticated_service()

def get_channel_analytics(youtube, channel_id, start_date, end_date):
    request = youtube.reports().query(
        ids="channel=="+channel_id,
        startDate=start_date,
        endDate=end_date,
        metrics="views,estimatedMinutesWatched,earnings",
        dimensions="day",
        sort="day"
    )
    response = request.execute()
    return response["rows"]

data = get_channel_analytics(youtube, "CHANNEL_ID", "2024-01-01", "2024-01-31")
print(data)

이 데이터를 BigQuery에 업로드하여 저장할 수 있습니다.

3. Airflow를 활용한 데이터 자동화

Airflow는 데이터 파이프라인을 관리하고 스케줄링하는 도구입니다.

Airflow 환경 설정 (Docker 기반)

Airflow를 Docker 컨테이너에서 실행하려면 docker-compose.yaml 파일을 설정해야 합니다.

version: '3'
services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
  webserver:
    image: apache/airflow:latest
    restart: always
    depends_on:
      - postgres
    environment:
      - AIRFLOW__CORE__EXECUTOR=LocalExecutor
      - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
    ports:
      - "8080:8080"
    command: webserver

컨테이너 실행

docker-compose up -d

Airflow DAG 생성 (YouTube API → BigQuery 자동화)

Airflow에서 DAG(Directed Acyclic Graph)를 정의하여 자동화합니다.

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta
import pandas as pd

default_args = {
    "owner": "airflow",
    "depends_on_past": False,
    "start_date": datetime(2024, 1, 1),
    "retries": 1,
    "retry_delay": timedelta(minutes=5),
}

dag = DAG(
    "youtube_data_pipeline",
    default_args=default_args,
    description="Fetch YouTube analytics data and store in BigQuery",
    schedule_interval="0 12 * * *",
)

def fetch_youtube_data():
    data = get_channel_analytics(youtube, "CHANNEL_ID", "2024-01-01", "2024-01-31")
    df = pd.DataFrame(data, columns=["date", "views", "watch_time", "earnings"])
    df.to_csv("/tmp/youtube_data.csv", index=False)

task_fetch = PythonOperator(
    task_id="fetch_youtube_data",
    python_callable=fetch_youtube_data,
    dag=dag,
)

task_fetch

4. Google BigQuery에 데이터 저장

YouTube 데이터를 BigQuery로 업로드하여 분석할 수 있도록 합니다.

BigQuery 테이블 생성

CREATE TABLE youtube_data (
    date DATE,
    views INT64,
    watch_time INT64,
    earnings FLOAT64
);

Python을 활용한 BigQuery 데이터 업로드

from google.cloud import bigquery

client = bigquery.Client()
table_id = "your_project.youtube_dataset.youtube_data"

job_config = bigquery.LoadJobConfig(
    source_format=bigquery.SourceFormat.CSV,
    autodetect=True,
)

with open("/tmp/youtube_data.csv", "rb") as source_file:
    job = client.load_table_from_file(source_file, table_id, job_config=job_config)

job.result()
print("Data loaded into BigQuery!")

5. Looker Studio를 활용한 데이터 시각화

BigQuery 데이터를 Looker Studio에 연결

  1. Looker Studio에 접속
  2. 데이터 소스로 Google BigQuery 선택
  3. youtube_data 테이블을 연결하여 그래프 및 대시보드 생성
  4. 시청시간, 수익, 조회수 트렌드를 시각화

6. 전체 자동화 파이프라인 요약

데이터 흐름

  1. YouTube API: YouTube 데이터를 가져옴
  2. Airflow DAG: API 호출 및 데이터 저장을 자동화
  3. BigQuery: 데이터를 저장 및 분석 가능하도록 구축
  4. Looker Studio: 데이터를 시각화하여 분석 가능

기대 효과

  • YouTube 데이터를 자동으로 수집 및 저장
  • Google BigQuery를 활용한 대규모 데이터 분석 가능
  • Looker Studio를 통한 실시간 대시보드 제공
  • Airflow를 활용한 완전 자동화 시스템 구축

 

이 방법을 적용하면 YouTube API 데이터를 자동으로 수집, 저장, 분석, 시각화하는 완전 자동화된 파이프라인을 구축할 수 있습니다.

YouTube API → Airflow → BigQuery → Looker Studio
완전 자동화 및 확장 가능
데이터 기반 YouTube 운영 최적화 가능

728x90

댓글