{
  "id": "acd19ba2-55d8-451f-a01b-5536bb91c027",
  "slug": "ref/web/blog-bizspring-co-kr/sql만으로-머신러닝-bigquery-ml-bizspring-blog",
  "doc_type": "ref",
  "title": "SQL만으로 머신러닝 : BigQuery ML - BizSpring BLOG",
  "title_en": null,
  "one_liner": "SQL만으로 머신러닝 : BigQuery ML - BizSpring BLOG 콘텐츠로 건너뛰기 내비게이션 메뉴 인사이트 테크 활용 방법/사례 활용 방법/사례 성공사례 성공 사례 일반 광고/마케팅 에이전시 이커머스 미디어/콘텐츠 금융/핀테크 의료/헬스케어 통신/인",
  "summary_bullets": [
    "BigQuery ML은 Python이나 별도 프레임워크 없이 SQL만으로 머신러닝 모델을 만들고 예측할 수 있게 해주는 기능입니다.",
    "Google Merchandise Store의 공개 샘플 데이터셋을 활용해 세션 구매 여부를 예측하는 로지스틱 회귀 모델을 만드는 과정을 실습으로 보여줍니다.",
    "CREATE MODEL, ML.EVALUATE, ML.PREDICT, ML.WEIGHTS 등 SQL 문법만으로 모델 생성-평가-예측-해석까지 전 과정을 수행할 수 있습니다.",
    "모델 가중치를 직접 sigmoid 함수에 대입해 예측 확률을 수동 검증함으로써 로지스틱 회귀 동작 원리를 확인할 수 있습니다.",
    "데이터 이동 없이 BigQuery 내에서 빠른 프로토타입/POC가 가능하며, 전환·이탈 예측 등 다양한 실무 문제에 응용 가능합니다."
  ],
  "body_md": "SQL만으로 머신러닝 : BigQuery ML - BizSpring BLOG\n\n콘텐츠로 건너뛰기\n\n내비게이션 메뉴\n\n인사이트\n\n테크\n\n활용 방법/사례\n\n활용 방법/사례\n\n성공사례\n\n성공 사례 일반\n\n광고/마케팅 에이전시\n\n이커머스\n\n미디어/콘텐츠\n\n금융/핀테크\n\n의료/헬스케어\n\n통신/인터넷\n\n뉴스/트렌드\n\n릴리즈 노트\n\n인터넷트렌드 ↗\n\n웹사이트 ↗\n\n# SQL만으로 머신러닝 : BigQuery ML\n\n2025년 09월 24일 2025년 09월 24일\n테크\n\n데이터 분석과 머신러닝의 중요성은 누구나 알지만, 실제로 시작하려면 Python 환경 구성이나 TensorFlow 같은 프레임워크 설치부터 막히는 경우가 많습니다. BigQuery ML은 2018년 7월 공개된 이후 7년째 운영되고 있으며, 여전히 SQL만으로 머신러닝 모델을 만들 수 있다는 점에서 진입 장벽이 낮습니다. 최근에는 Google Cloud Vertex AI와도 연계되어, 단순 실습용을 넘어 다양한 ML 워크로드를 다룰 수 있는 플랫폼으로 발전했습니다.\n\n이번 포스트에서는 Google이 공개한 샘플 데이터셋을 활용해 모델 생성 → 평가 → 예측까지, 전 과정을 SQL만으로 어떻게 실행할 수 있는지 직접 살펴보겠습니다.\n\n## 1. 데이터 셋 소개\n\nconsole.cloud.google.com/marketplace/product/obfuscated-ga360-data/obfuscated-ga360-data\n\n이번 포스트에 사용할 데이터는 bigquery-public-data.google_analytics_sample 입니다. Google Merchandise Store의 실제 웹로그 데이터를 기반으로 만들어진 샘플이며, BigQuery에서 누구나 접근할 수 있습니다.\n\nbigquery-public-data.google_analytics_sample.INFORMATION_SCHEMA.COLUMNS\n\n핵심 테이블은 ga_sessions_* 입니다. 날짜 단위로 쪼개져 있으며, 각 세션의 정보가 담겨 있습니다. 스키마는 다소 복잡하지만, 크게 보면 다음과 같은 그룹으로 구성됩니다.\n\n트랜잭션 정보 : 구매 여부, 구매 건수, 매출 금액\n\n디바이스 정보 : 브라우저, 운영체제, 모바일 여부 등\n\n지역 정보 : 국가, 도시, 대륙\n\n행동 정보 : 페이지뷰, 세션 길이 등\n\n## 2. 실험 목표\n\n실험 목표는 다음과 같습니다. “방문자가 세션에서 구매할 확률을 예측할 수 있을까?”\n\n이를 위해 라벨과 피처를 정리합니다.\n\n피처(feature) : 운영체제, 모바일 여부, 국가, 페이지뷰 수\n\n라벨(label) : 세션 내 총 전자상거래 수 (거래 수가 NULL이면 열의 값을 0으로 설정. 그렇지 않으면 1로 설정)\n\n-- 2017-07~2017-08 세션 피처 확인용\nSELECT\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(totals.pageviews, 0) AS pageviews,\nIFNULL(geoNetwork.country, \"\") AS country,\nfullVisitorId\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801';\n\n세션 피처 예시 (운영체제, 모바일 여부, 국가, 페이지뷰 수)\n\n즉, 세션 단위 데이터를 가지고 “이 세션이 구매로 이어질지”를 분류하는 것이 목표입니다.\n\n## 3. 모델 학습\n\nBigQuery ML에서는 SQL로 로지스틱 회귀 모델을 만들 수 있습니다.\n\n-- 트랜잭션 유무를 label로 하여 로지스틱 회귀 모델 생성 (2016-08~2017-06 데이터 사용)\nCREATE OR REPLACE MODEL `bqml_tutorial.sample_model`\nOPTIONS(model_type='logistic_reg') AS\nSELECT\nIF(totals.transactions IS NULL, 0, 1) AS label,\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(geoNetwork.country, \"\") AS country,\nIFNULL(totals.pageviews, 0) AS pageviews\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20160801' AND '20170630';\n\nCREATE MODEL 문은 모델을 만든 다음 쿼리의 SELECT 문으로 검색된 데이터를 사용하여 모델을 학습시킵니다.\n\nOPTIONS(model_type=’logistic_reg’) 문은 로지스틱 회귀 모델을 만듭니다.\n\nSELECT 문은 세션 내 총 전자상거래 수, 운영체제, 모바일 여부, 국가, 페이지뷰 수를 열에서 검색합니다.\n\nFROM 문에서 bigquery-public-data.google_analytics_sample.ga_sessions 샘플을 사용해 모델을 학습시킵니다.\n\nWHERE 문에서 기간은 2016년 8월 1일 ~ 2017년 6월 30일 구간입니다.\n\nBigQuery ML 학습 로그\n\n## 4. 평가\n\nML.EVALUATE 함수를 사용하여 모델의 성능을 평가할 수 있습니다.\n\n-- 학습된 모델을 2017-07~2017-08 데이터로 평가\nSELECT\n*\nFROM\nML.EVALUATE(MODEL `bqml_tutorial.sample_model`, (\nSELECT\nIF(totals.transactions IS NULL, 0, 1) AS label,\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(geoNetwork.country, \"\") AS country,\nIFNULL(totals.pageviews, 0) AS pageviews\nFROM\n`bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE\n_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'));\n\nSELECT 문은 모델에서 열을 검색합니다.\n\nFROM 문은 모델에 ML.EVALUATE 함수를 사용합니다.\n\n중첩된 SELECT 문과 FROM 문은 CREATE MODEL 쿼리에 있는 것과 동일합니다.\n\nWHERE 문에서 학습 데이터 바로 다음 달인 2017년 7월 1일 ~ 2017년 8월 1일 구간을 선택합니다.\n\n학습된 모델 평가\n\nBigQuery ML에서는 ML.EVALUATE 결과로 정밀도(precision), 재현율(recall), 정확도(accuracy) 등의 지표를 확인할 수 있습니다. 위 결과는 공개 샘플 데이터로 학습한 단순 예시라 수치 자체에는 큰 의미가 없고, 복잡한 환경 설정 없이 SQL만으로 모델 품질을 검증 할 수 있다는 점이 핵심입니다.\n\n## 5. 예측 결과 확인\n\n이제 학습된 모델을 사용해 테스트 데이터의 구매 예측을 할 수 있습니다.\n\n-- 방문자별 예측 구매 건수 합계 (2017-07~2017-08 테스트 데이터)\nSELECT\nfullVisitorId,\nSUM(predicted_label) as total_predicted_purchases\nFROM\nML.PREDICT(MODEL `bqml_tutorial.sample_model`, (\nSELECT\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(totals.pageviews, 0) AS pageviews,\nIFNULL(geoNetwork.country, \"\") AS country,\nfullVisitorId\nFROM\n`bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE\n_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))\nGROUP BY fullVisitorId\nORDER BY total_predicted_purchases DESC\nLIMIT 10;\n\n사용자별 예측 구매 건수 집계\n\n예를 들어 사용자 9417857471295131045 의 경우, 모델은 약 4번의 구매를 예측했습니다. 실제 데이터에서는 해당 사용자가 5개의 세션에서 총 9건의 구매를 기록했습니다. 완벽하진 않지만 방향성은 어느 정도 맞췄다고 볼 수 있습니다.\n\n또한 BigQuery 쿼리를 통해 트랜잭션 ID, 구매한 상품, 금액까지 실제 기록을 확인할 수 있습니다.\n\n-- 2017-07~2017-08 기간에 실제 구매가 있었던 세션 목록과 금액\nSELECT\n_TABLE_SUFFIX,\nfullVisitorId,\nvisitId,\nDATETIME(TIMESTAMP_SECONDS(visitStartTime), \"UTC\") AS visit_start_utc,\nIFNULL(totals.transactions, 0) AS transactions,\nSAFE_DIVIDE(IFNULL(totals.transactionRevenue, 0), 1e6) AS revenue_usd\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'\nAND fullVisitorId = '9417857471295131045'\nAND (totals.transactions > 0 OR totals.transactionRevenue IS NOT NULL)\nORDER BY _TABLE_SUFFIX, visitId;\n\n사용자 9417857471295131045 의 실제 구매가 있었던 세션 목록과 거래 수, 금액\n\n## 6. 내부 매커니즘 해부\n\nBigQuery ML은 단순히 예측값만 주는 게 아니라, 모델 내부 계수(weight) 도 확인할 수 있습니다.\n\n-- 모델 가중치(회귀 계수) 목록\nSELECT *\nFROM ML.WEIGHTS(MODEL `bqml_tutorial.sample_model`)\nORDER BY ABS(weight) DESC;\n\n모델 가중치 목록\n\nML.WEIGHTS 로 로지스틱 회귀 계수를 조회\n\nINTERCEPT는 모든 feature 값이 0일 때의 log-odds 값\n\npageviews는 양수 계수 → 페이지뷰가 많을수록 구매 확률 상승\n\nos, is_mobile, country 등은 음수 계수 → 구매 확률 하락\n\n직접 수식에 대입해 sigmoid를 계산하면, ML.PREDICT가 내놓은 확률과 일치함을 검증 할 수 있습니다.\n\n## 7. sigmoid 함수로 로지스틱 회귀 예측 확률 검증하기\n\n로지스틱 회귀 모델은 선형 결합 결과 z를 sigmoid 함수에 통과시켜 확률을 계산합니다.\n\nz\n=\nβ 0\n+\n\n∑\ni\n\nβ i ⋅ x i\n\np\n=\n\n1\n\n1 +\n\ne\n− z\n\nβ 0 ​: 인터셉트 (기본값)\n\nβ i​ : 각 피처(feature)의 가중치\n\n𝑥 i ​: 세션에서 관측된 피처값 (𝑥 0 = 1)\n\n-- 특정 방문자의 세션 피처값 상세 확인 (2017-07~2017-08)\nSELECT\n_TABLE_SUFFIX,\nfullVisitorId,\nvisitId,\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(geoNetwork.country, \"\") AS country,\nIFNULL(totals.pageviews, 0) AS pageviews\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'\nAND fullVisitorId = '9417857471295131045'\nORDER BY _TABLE_SUFFIX, visitId\nLIMIT 20;\n\n사용자 9417857471295131045 의 세션별 피처값\n\n-- 숫자형 피처(pageviews) 및 범주형 피처(os, is_mobile, country)의 가중치 확인\nSELECT\nw.processed_input,\nw.weight AS base_weight,\ncw.category AS category,\ncw.weight AS category_weight\nFROM ML.WEIGHTS(MODEL `bqml_tutorial.sample_model`) AS w\nLEFT JOIN UNNEST(w.category_weights) AS cw\nWHERE w.processed_input IN ('__INTERCEPT__', 'pageviews')\nOR (w.processed_input = 'os' AND cw.category = 'Windows')\nOR (w.processed_input = 'is_mobile' AND cw.category = 'false')\nOR (w.processed_input = 'country' AND cw.category = 'United States')\nORDER BY w.processed_input;\n\n사용자 9417857471295131045 의 모델 가중치\n\n두 쿼리의 결과를 합치면 실제 로지스틱 회귀 예측 확률을 계산할 수 있습니다.\n\n선형 결합 공식은 다음과 같습니다.\n\nz\n=\nβ 0\n+\nβ pageviews\n·\nx pageviews\n+\nβ os=Windows\n+\nβ is_mobile=false\n+\nβ country=UnitedStates\n\n여기서 𝛽 계수는 모델 가중치(ML.WEIGHTS)에서 가져오고, 𝑥 값은 세션 데이터에서 가져옵니다. 예를 들어, 2017-07-13의 한 세션(pageviews = 109)에 대해 계산하면:\n\nz\n≈\n6.44\n\nsigmoid 적용 공식 :\n\np\n=\n\n1\n\n1\n+\n\ne\n\n–\nz\n\n≈\n\n1\n\n1\n+\n\ne\n\n–\n6.44\n\n≈\n0.9984\n\n즉, visitId = 1499951313 인 세션의 구매 확률은 약 99.8% 로 추정됩니다.\n\n-- (수동 검증용) 한 세션의 피처값 × 가중치 → z → sigmoid 확률 계산\nDECLARE target_fullVisitorId STRING DEFAULT '9417857471295131045';\nDECLARE start_suffix STRING DEFAULT '20170701';\nDECLARE end_suffix STRING DEFAULT '20170801';\n\nSELECT\np.fullVisitorId, p.visitId,\np.predicted_label,\nprobs.prob AS prob_predict\nFROM ML.PREDICT(\nMODEL `bqml_tutorial.sample_model`,\n(\nSELECT\nIFNULL(device.operatingSystem, '') AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(totals.pageviews, 0) AS pageviews,\nIFNULL(geoNetwork.country, '') AS country,\nfullVisitorId, visitId\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN start_suffix AND end_suffix\nAND fullVisitorId = target_fullVisitorId\n)\n) AS p, UNNEST(p.predicted_label_probs) AS probs\nWHERE probs.label = 1\nORDER BY visitId;\n\nsigmoid 확률 계산한 쿼리 결과\n\n로지스틱 회귀 모델은 각 세션에 대해 구매(1)일 확률을 출력합니다. ML.PREDICT 결과에서 predicted_label_probs를 펼치면, 클래스별 확률이 나오며 prob_predict는 그중 구매(1)일 확률을 의미합니다. 예를 들어, 세션 visitId = 1499951313의 경우 prob_predict = 0.9984로 계산되었습니다. 이는 해당 세션이 구매로 이어질 가능성을 99.84%로 추정한 것입니다.\n\n분류 문제에서는 보통 threshold = 0.5를 기본값으로 사용합니다. 즉:\n\nprob_predict ≥ 0.5 → predicted_label = 1 (구매)\n\nprob_predict < 0.5 → predicted_label = 0 (비구매)\n\n전체 세션 중 prob_predict ≥ 0.5인 데이터가 4개였고, 이는 모델이 “구매로 분류”한 세션 수와 일치합니다. 즉, sigmoid 계산 → threshold 적용 → 최종 분류라는 로지스틱 회귀의 동작 방식이 BigQuery ML에서도 그대로 적용됨을 확인할 수 있습니다.\n\n## 8. 결론\n\n데이터 준비 → 모델 학습 → 평가 → 예측 → 해석의 전 과정을 SQL만으로 경험할 수 있어 머신러닝 실습이 가능합니다.\n\n데이터 이동 없이 BigQuery 안에서 바로 처리 가능하여, 빠른 프로토타입/POC에 유리합니다.\n\nBigQuery 계정만 있으면 무료 크레딧으로 바로 실습할 수 있습니다.\n\n실무적으로는 전환 예측, 이탈 예측, 추천 시스템 등 다양한 문제에 응용할 수 있습니다.\n\nRef. SQL을 사용하여 BigQuery ML에서 머신러닝 모델 만들기 Logistic regression – Wikipedia\n\n최신 마케팅/고객 데이터 활용 사례를 받아보실 수 있습니다.\n비즈스프링 뉴스레터 구독하기 →\n\n## Related Posts via Categories\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\nAI 시대, 데이터도 설명이 필요합니다\nMCP 클라이언트는 Authorization Server를 어떻게 찾는가: 공식 MCP TypeScript SDK와 VS Code 구현 비교\nRAG 시대의 GEO: AI가 콘텐츠를 읽는 방식과 스키마의 진짜 역할\nAI 에이전트로 웹 데이터 수집 가능 여부 자동 검증하기\nGA4 Intraday 실시간 테이블, 대시보드 원천 데이터로 바로 사용할 수 있을까?\n워크플로우 오케스트레이션 플랫폼 Temporal 알아보기\niOS 14.5부터 GA4까지, 환경 변화가 가져온 업무 폭증을 해결하는 실무 전략은…?\n\n다음에 대해 검색하기...\n\n최신 글 둘러보기\n\n기존 SEO와 무엇이 같고 무엇이 다른가\n\n콘텐츠가 답인 걸 모르는 사람은 없습니다 — 문제는 지속입니다\n\n광고비를 늘리지 않고 매출을 늘린 회사들은 무엇을 했나\n\n코호트로 비교하면 광고 예산 판단이 달라집니다\n\nGEO를 위한 글쓰기를 위한 작은 노하우\n\n(해외동향) 광고주가 광고플랫폼 리포트에서 자체 측정으로 옮겨가고 있다.\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\n\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\n\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\n\n마케팅 자동화, 무엇부터 자동화해야 할까?\n\n출처: https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/sql%eb%a7%8c%ec%9c%bc%eb%a1%9c-%eb%a8%b8%ec%8b%a0%eb%9f%ac%eb%8b%9d-bigquery-ml/",
  "related_slugs": [],
  "faq": [
    {
      "a": "아니요, BigQuery ML은 SQL만으로 머신러닝 모델을 만들고 학습, 평가, 예측까지 진행할 수 있습니다. 별도의 Python 환경이나 프레임워크 설치가 필요 없어 진입 장벽이 낮습니다.",
      "q": "BigQuery ML을 쓰려면 Python이나 TensorFlow 같은 걸 따로 설치해야 하나요?"
    },
    {
      "a": "Google Merchandise Store의 실제 웹로그를 기반으로 만든 공개 샘플 데이터셋(bigquery-public-data.google_analytics_sample)을 사용했습니다. BigQuery에서 누구나 접근할 수 있는 데이터입니다.",
      "q": "실습에 사용된 데이터는 어떤 데이터인가요?"
    },
    {
      "a": "ML.EVALUATE 함수를 사용해 정밀도, 재현율, 정확도 등의 지표를 SQL 쿼리로 바로 확인할 수 있습니다. 본문의 예시는 공개 샘플 데이터로 만든 단순 예시라 수치 자체보다는 SQL만으로 품질 검증이 가능하다는 점이 핵심입니다.",
      "q": "모델 성능은 어떻게 확인하나요?"
    },
    {
      "a": "네, ML.WEIGHTS 함수로 로지스틱 회귀의 각 피처별 가중치(계수)를 확인할 수 있습니다. 예를 들어 페이지뷰가 많을수록 구매 확률이 올라가는 식의 해석이 가능하며, 이 가중치를 직접 sigmoid 함수에 대입해 ML.PREDICT 결과와 일치하는지 검증할 수도 있습니다.",
      "q": "모델이 어떤 근거로 예측했는지도 알 수 있나요?"
    },
    {
      "a": "본문에서는 전환 예측, 이탈 예측, 추천 시스템 등 다양한 문제에 응용할 수 있다고 설명합니다. 또한 데이터 이동 없이 BigQuery 안에서 바로 처리할 수 있어 빠른 프로토타입이나 POC에 유리합니다.",
      "q": "실무에서는 어떤 문제에 활용할 수 있나요?"
    }
  ],
  "jsonld": null,
  "keywords": [],
  "source_id": "https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/sql%eb%a7%8c%ec%9c%bc%eb%a1%9c-%eb%a8%b8%ec%8b%a0%eb%9f%ac%eb%8b%9d-bigquery-ml/",
  "video_url": null,
  "duration_sec": null,
  "thumbnail_url": null,
  "image_url": null,
  "caption": null,
  "solution_slug": null,
  "captured_at": null,
  "width": null,
  "height": null,
  "created_at": "2026-09-06T11:11:02.070275+00:00",
  "updated_at": "2026-09-06T11:11:02.070275+00:00",
  "visibility": "public",
  "source_stage": "1",
  "anonymized": true,
  "source_key": "web-blog",
  "origin": "ingest",
  "locked": false,
  "locked_by": null,
  "locked_at": null,
  "gate_state": {
    "g1": {
      "hits": [],
      "pass": true
    },
    "g2": {
      "pass": true,
      "total": 46,
      "issues": [
        "숫자·규격 같은 검증 가능한 구체가 부족합니다",
        "과장·공허한 표현 2회: 다양한"
      ],
      "applies": true
    },
    "g3": {
      "pass": true,
      "required": false
    },
    "stage": "1",
    "decided_at": "2026-09-12T15:43:23.696Z"
  },
  "raw_id": "9efa86b5-5013-45bc-b317-75bf015f4f17",
  "search_text": "SQL만으로 머신러닝 : BigQuery ML - BizSpring BLOG  SQL만으로 머신러닝 : BigQuery ML - BizSpring BLOG 콘텐츠로 건너뛰기 내비게이션 메뉴 인사이트 테크 활용 방법/사례 활용 방법/사례 성공사례 성공 사례 일반 광고/마케팅 에이전시 이커머스 미디어/콘텐츠 금융/핀테크 의료/헬스케어 통신/인  SQL만으로 머신러닝 : BigQuery ML - BizSpring BLOG\n\n콘텐츠로 건너뛰기\n\n내비게이션 메뉴\n\n인사이트\n\n테크\n\n활용 방법/사례\n\n활용 방법/사례\n\n성공사례\n\n성공 사례 일반\n\n광고/마케팅 에이전시\n\n이커머스\n\n미디어/콘텐츠\n\n금융/핀테크\n\n의료/헬스케어\n\n통신/인터넷\n\n뉴스/트렌드\n\n릴리즈 노트\n\n인터넷트렌드 ↗\n\n웹사이트 ↗\n\n# SQL만으로 머신러닝 : BigQuery ML\n\n2025년 09월 24일 2025년 09월 24일\n테크\n\n데이터 분석과 머신러닝의 중요성은 누구나 알지만, 실제로 시작하려면 Python 환경 구성이나 TensorFlow 같은 프레임워크 설치부터 막히는 경우가 많습니다. BigQuery ML은 2018년 7월 공개된 이후 7년째 운영되고 있으며, 여전히 SQL만으로 머신러닝 모델을 만들 수 있다는 점에서 진입 장벽이 낮습니다. 최근에는 Google Cloud Vertex AI와도 연계되어, 단순 실습용을 넘어 다양한 ML 워크로드를 다룰 수 있는 플랫폼으로 발전했습니다.\n\n이번 포스트에서는 Google이 공개한 샘플 데이터셋을 활용해 모델 생성 → 평가 → 예측까지, 전 과정을 SQL만으로 어떻게 실행할 수 있는지 직접 살펴보겠습니다.\n\n## 1. 데이터 셋 소개\n\nconsole.cloud.google.com/marketplace/product/obfuscated-ga360-data/obfuscated-ga360-data\n\n이번 포스트에 사용할 데이터는 bigquery-public-data.google_analytics_sample 입니다. Google Merchandise Store의 실제 웹로그 데이터를 기반으로 만들어진 샘플이며, BigQuery에서 누구나 접근할 수 있습니다.\n\nbigquery-public-data.google_analytics_sample.INFORMATION_SCHEMA.COLUMNS\n\n핵심 테이블은 ga_sessions_* 입니다. 날짜 단위로 쪼개져 있으며, 각 세션의 정보가 담겨 있습니다. 스키마는 다소 복잡하지만, 크게 보면 다음과 같은 그룹으로 구성됩니다.\n\n트랜잭션 정보 : 구매 여부, 구매 건수, 매출 금액\n\n디바이스 정보 : 브라우저, 운영체제, 모바일 여부 등\n\n지역 정보 : 국가, 도시, 대륙\n\n행동 정보 : 페이지뷰, 세션 길이 등\n\n## 2. 실험 목표\n\n실험 목표는 다음과 같습니다. “방문자가 세션에서 구매할 확률을 예측할 수 있을까?”\n\n이를 위해 라벨과 피처를 정리합니다.\n\n피처(feature) : 운영체제, 모바일 여부, 국가, 페이지뷰 수\n\n라벨(label) : 세션 내 총 전자상거래 수 (거래 수가 NULL이면 열의 값을 0으로 설정. 그렇지 않으면 1로 설정)\n\n-- 2017-07~2017-08 세션 피처 확인용\nSELECT\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(totals.pageviews, 0) AS pageviews,\nIFNULL(geoNetwork.country, \"\") AS country,\nfullVisitorId\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801';\n\n세션 피처 예시 (운영체제, 모바일 여부, 국가, 페이지뷰 수)\n\n즉, 세션 단위 데이터를 가지고 “이 세션이 구매로 이어질지”를 분류하는 것이 목표입니다.\n\n## 3. 모델 학습\n\nBigQuery ML에서는 SQL로 로지스틱 회귀 모델을 만들 수 있습니다.\n\n-- 트랜잭션 유무를 label로 하여 로지스틱 회귀 모델 생성 (2016-08~2017-06 데이터 사용)\nCREATE OR REPLACE MODEL `bqml_tutorial.sample_model`\nOPTIONS(model_type='logistic_reg') AS\nSELECT\nIF(totals.transactions IS NULL, 0, 1) AS label,\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(geoNetwork.country, \"\") AS country,\nIFNULL(totals.pageviews, 0) AS pageviews\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20160801' AND '20170630';\n\nCREATE MODEL 문은 모델을 만든 다음 쿼리의 SELECT 문으로 검색된 데이터를 사용하여 모델을 학습시킵니다.\n\nOPTIONS(model_type=’logistic_reg’) 문은 로지스틱 회귀 모델을 만듭니다.\n\nSELECT 문은 세션 내 총 전자상거래 수, 운영체제, 모바일 여부, 국가, 페이지뷰 수를 열에서 검색합니다.\n\nFROM 문에서 bigquery-public-data.google_analytics_sample.ga_sessions 샘플을 사용해 모델을 학습시킵니다.\n\nWHERE 문에서 기간은 2016년 8월 1일 ~ 2017년 6월 30일 구간입니다.\n\nBigQuery ML 학습 로그\n\n## 4. 평가\n\nML.EVALUATE 함수를 사용하여 모델의 성능을 평가할 수 있습니다.\n\n-- 학습된 모델을 2017-07~2017-08 데이터로 평가\nSELECT\n*\nFROM\nML.EVALUATE(MODEL `bqml_tutorial.sample_model`, (\nSELECT\nIF(totals.transactions IS NULL, 0, 1) AS label,\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(geoNetwork.country, \"\") AS country,\nIFNULL(totals.pageviews, 0) AS pageviews\nFROM\n`bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE\n_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'));\n\nSELECT 문은 모델에서 열을 검색합니다.\n\nFROM 문은 모델에 ML.EVALUATE 함수를 사용합니다.\n\n중첩된 SELECT 문과 FROM 문은 CREATE MODEL 쿼리에 있는 것과 동일합니다.\n\nWHERE 문에서 학습 데이터 바로 다음 달인 2017년 7월 1일 ~ 2017년 8월 1일 구간을 선택합니다.\n\n학습된 모델 평가\n\nBigQuery ML에서는 ML.EVALUATE 결과로 정밀도(precision), 재현율(recall), 정확도(accuracy) 등의 지표를 확인할 수 있습니다. 위 결과는 공개 샘플 데이터로 학습한 단순 예시라 수치 자체에는 큰 의미가 없고, 복잡한 환경 설정 없이 SQL만으로 모델 품질을 검증 할 수 있다는 점이 핵심입니다.\n\n## 5. 예측 결과 확인\n\n이제 학습된 모델을 사용해 테스트 데이터의 구매 예측을 할 수 있습니다.\n\n-- 방문자별 예측 구매 건수 합계 (2017-07~2017-08 테스트 데이터)\nSELECT\nfullVisitorId,\nSUM(predicted_label) as total_predicted_purchases\nFROM\nML.PREDICT(MODEL `bqml_tutorial.sample_model`, (\nSELECT\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(totals.pageviews, 0) AS pageviews,\nIFNULL(geoNetwork.country, \"\") AS country,\nfullVisitorId\nFROM\n`bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE\n_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))\nGROUP BY fullVisitorId\nORDER BY total_predicted_purchases DESC\nLIMIT 10;\n\n사용자별 예측 구매 건수 집계\n\n예를 들어 사용자 9417857471295131045 의 경우, 모델은 약 4번의 구매를 예측했습니다. 실제 데이터에서는 해당 사용자가 5개의 세션에서 총 9건의 구매를 기록했습니다. 완벽하진 않지만 방향성은 어느 정도 맞췄다고 볼 수 있습니다.\n\n또한 BigQuery 쿼리를 통해 트랜잭션 ID, 구매한 상품, 금액까지 실제 기록을 확인할 수 있습니다.\n\n-- 2017-07~2017-08 기간에 실제 구매가 있었던 세션 목록과 금액\nSELECT\n_TABLE_SUFFIX,\nfullVisitorId,\nvisitId,\nDATETIME(TIMESTAMP_SECONDS(visitStartTime), \"UTC\") AS visit_start_utc,\nIFNULL(totals.transactions, 0) AS transactions,\nSAFE_DIVIDE(IFNULL(totals.transactionRevenue, 0), 1e6) AS revenue_usd\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'\nAND fullVisitorId = '9417857471295131045'\nAND (totals.transactions > 0 OR totals.transactionRevenue IS NOT NULL)\nORDER BY _TABLE_SUFFIX, visitId;\n\n사용자 9417857471295131045 의 실제 구매가 있었던 세션 목록과 거래 수, 금액\n\n## 6. 내부 매커니즘 해부\n\nBigQuery ML은 단순히 예측값만 주는 게 아니라, 모델 내부 계수(weight) 도 확인할 수 있습니다.\n\n-- 모델 가중치(회귀 계수) 목록\nSELECT *\nFROM ML.WEIGHTS(MODEL `bqml_tutorial.sample_model`)\nORDER BY ABS(weight) DESC;\n\n모델 가중치 목록\n\nML.WEIGHTS 로 로지스틱 회귀 계수를 조회\n\nINTERCEPT는 모든 feature 값이 0일 때의 log-odds 값\n\npageviews는 양수 계수 → 페이지뷰가 많을수록 구매 확률 상승\n\nos, is_mobile, country 등은 음수 계수 → 구매 확률 하락\n\n직접 수식에 대입해 sigmoid를 계산하면, ML.PREDICT가 내놓은 확률과 일치함을 검증 할 수 있습니다.\n\n## 7. sigmoid 함수로 로지스틱 회귀 예측 확률 검증하기\n\n로지스틱 회귀 모델은 선형 결합 결과 z를 sigmoid 함수에 통과시켜 확률을 계산합니다.\n\nz\n=\nβ 0\n+\n\n∑\ni\n\nβ i ⋅ x i\n\np\n=\n\n1\n\n1 +\n\ne\n− z\n\nβ 0 ​: 인터셉트 (기본값)\n\nβ i​ : 각 피처(feature)의 가중치\n\n𝑥 i ​: 세션에서 관측된 피처값 (𝑥 0 = 1)\n\n-- 특정 방문자의 세션 피처값 상세 확인 (2017-07~2017-08)\nSELECT\n_TABLE_SUFFIX,\nfullVisitorId,\nvisitId,\nIFNULL(device.operatingSystem, \"\") AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(geoNetwork.country, \"\") AS country,\nIFNULL(totals.pageviews, 0) AS pageviews\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'\nAND fullVisitorId = '9417857471295131045'\nORDER BY _TABLE_SUFFIX, visitId\nLIMIT 20;\n\n사용자 9417857471295131045 의 세션별 피처값\n\n-- 숫자형 피처(pageviews) 및 범주형 피처(os, is_mobile, country)의 가중치 확인\nSELECT\nw.processed_input,\nw.weight AS base_weight,\ncw.category AS category,\ncw.weight AS category_weight\nFROM ML.WEIGHTS(MODEL `bqml_tutorial.sample_model`) AS w\nLEFT JOIN UNNEST(w.category_weights) AS cw\nWHERE w.processed_input IN ('__INTERCEPT__', 'pageviews')\nOR (w.processed_input = 'os' AND cw.category = 'Windows')\nOR (w.processed_input = 'is_mobile' AND cw.category = 'false')\nOR (w.processed_input = 'country' AND cw.category = 'United States')\nORDER BY w.processed_input;\n\n사용자 9417857471295131045 의 모델 가중치\n\n두 쿼리의 결과를 합치면 실제 로지스틱 회귀 예측 확률을 계산할 수 있습니다.\n\n선형 결합 공식은 다음과 같습니다.\n\nz\n=\nβ 0\n+\nβ pageviews\n·\nx pageviews\n+\nβ os=Windows\n+\nβ is_mobile=false\n+\nβ country=UnitedStates\n\n여기서 𝛽 계수는 모델 가중치(ML.WEIGHTS)에서 가져오고, 𝑥 값은 세션 데이터에서 가져옵니다. 예를 들어, 2017-07-13의 한 세션(pageviews = 109)에 대해 계산하면:\n\nz\n≈\n6.44\n\nsigmoid 적용 공식 :\n\np\n=\n\n1\n\n1\n+\n\ne\n\n–\nz\n\n≈\n\n1\n\n1\n+\n\ne\n\n–\n6.44\n\n≈\n0.9984\n\n즉, visitId = 1499951313 인 세션의 구매 확률은 약 99.8% 로 추정됩니다.\n\n-- (수동 검증용) 한 세션의 피처값 × 가중치 → z → sigmoid 확률 계산\nDECLARE target_fullVisitorId STRING DEFAULT '9417857471295131045';\nDECLARE start_suffix STRING DEFAULT '20170701';\nDECLARE end_suffix STRING DEFAULT '20170801';\n\nSELECT\np.fullVisitorId, p.visitId,\np.predicted_label,\nprobs.prob AS prob_predict\nFROM ML.PREDICT(\nMODEL `bqml_tutorial.sample_model`,\n(\nSELECT\nIFNULL(device.operatingSystem, '') AS os,\ndevice.isMobile AS is_mobile,\nIFNULL(totals.pageviews, 0) AS pageviews,\nIFNULL(geoNetwork.country, '') AS country,\nfullVisitorId, visitId\nFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`\nWHERE _TABLE_SUFFIX BETWEEN start_suffix AND end_suffix\nAND fullVisitorId = target_fullVisitorId\n)\n) AS p, UNNEST(p.predicted_label_probs) AS probs\nWHERE probs.label = 1\nORDER BY visitId;\n\nsigmoid 확률 계산한 쿼리 결과\n\n로지스틱 회귀 모델은 각 세션에 대해 구매(1)일 확률을 출력합니다. ML.PREDICT 결과에서 predicted_label_probs를 펼치면, 클래스별 확률이 나오며 prob_predict는 그중 구매(1)일 확률을 의미합니다. 예를 들어, 세션 visitId = 1499951313의 경우 prob_predict = 0.9984로 계산되었습니다. 이는 해당 세션이 구매로 이어질 가능성을 99.84%로 추정한 것입니다.\n\n분류 문제에서는 보통 threshold = 0.5를 기본값으로 사용합니다. 즉:\n\nprob_predict ≥ 0.5 → predicted_label = 1 (구매)\n\nprob_predict < 0.5 → predicted_label = 0 (비구매)\n\n전체 세션 중 prob_predict ≥ 0.5인 데이터가 4개였고, 이는 모델이 “구매로 분류”한 세션 수와 일치합니다. 즉, sigmoid 계산 → threshold 적용 → 최종 분류라는 로지스틱 회귀의 동작 방식이 BigQuery ML에서도 그대로 적용됨을 확인할 수 있습니다.\n\n## 8. 결론\n\n데이터 준비 → 모델 학습 → 평가 → 예측 → 해석의 전 과정을 SQL만으로 경험할 수 있어 머신러닝 실습이 가능합니다.\n\n데이터 이동 없이 BigQuery 안에서 바로 처리 가능하여, 빠른 프로토타입/POC에 유리합니다.\n\nBigQuery 계정만 있으면 무료 크레딧으로 바로 실습할 수 있습니다.\n\n실무적으로는 전환 예측, 이탈 예측, 추천 시스템 등 다양한 문제에 응용할 수 있습니다.\n\nRef. SQL을 사용하여 BigQuery ML에서 머신러닝 모델 만들기 Logistic regression – Wikipedia\n\n최신 마케팅/고객 데이터 활용 사례를 받아보실 수 있습니다.\n비즈스프링 뉴스레터 구독하기 →\n\n## Related Posts via Categories\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\nAI 시대, 데이터도 설명이 필요합니다\nMCP 클라이언트는 Authorization Server를 어떻게 찾는가: 공식 MCP TypeScript SDK와 VS Code 구현 비교\nRAG 시대의 GEO: AI가 콘텐츠를 읽는 방식과 스키마의 진짜 역할\nAI 에이전트로 웹 데이터 수집 가능 여부 자동 검증하기\nGA4 Intraday 실시간 테이블, 대시보드 원천 데이터로 바로 사용할 수 있을까?\n워크플로우 오케스트레이션 플랫폼 Temporal 알아보기\niOS 14.5부터 GA4까지, 환경 변화가 가져온 업무 폭증을 해결하는 실무 전략은…?\n\n다음에 대해 검색하기...\n\n최신 글 둘러보기\n\n기존 SEO와 무엇이 같고 무엇이 다른가\n\n콘텐츠가 답인 걸 모르는 사람은 없습니다 — 문제는 지속입니다\n\n광고비를 늘리지 않고 매출을 늘린 회사들은 무엇을 했나\n\n코호트로 비교하면 광고 예산 판단이 달라집니다\n\nGEO를 위한 글쓰기를 위한 작은 노하우\n\n(해외동향) 광고주가 광고플랫폼 리포트에서 자체 측정으로 옮겨가고 있다.\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\n\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\n\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\n\n마케팅 자동화, 무엇부터 자동화해야 할까?\n\n출처: https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/sql%eb%a7%8c%ec%9c%bc%eb%a1%9c-%eb%a8%b8%ec%8b%a0%eb%9f%ac%eb%8b%9d-bigquery-ml/",
  "embedding": null,
  "embedded_at": null,
  "embedding_hash": null,
  "map_x": null,
  "map_y": null,
  "backlinks": [],
  "html_url": "https://bizspring.ai/kb/ref/web/blog-bizspring-co-kr/sql만으로-머신러닝-bigquery-ml-bizspring-blog",
  "markdown_url": "https://bizspring.ai/kb/ref/web/blog-bizspring-co-kr/sql만으로-머신러닝-bigquery-ml-bizspring-blog.md"
}