추천

MARTECH 2030 :: 최신 트렌드

2021 마테크 트렌드

마케터라면 반드시 알아야 할 마테크 트렌드

목차
1. “No Code” Citizen Creators
2. Platforms, Networks & Marketplaces
3. The Great App Explosion
4. From Big Data to Big Ops
5. Harmonizing Humans & Machine

ChiefMartec

*본 글은 원문에 대한 필자의 의견을 덧붙여 재구성 하였음

1. “No Code” Citizen Creators

코딩의 영역은 UI에 의해 잠식당하고 있고, 그 속도는 점점 가속화되고 있다.
이제 디지털 세계에서 창작 활동은 개발자의 전유물이 아니다.

웹사이트 제작에서부터 시작해,
데이터 분석이나 심지어 앱, 챗봇, 머신러닝 개발까지도 이제 코딩 없이 제작할 수 있다.

표1. 활동 별 No Code Vendors

이를 Automation & Workflow, Content & UI Design, Databases & Spreadsheet-Driven 총 3가지 영역으로 구분해서 파악하기도 한다.

그림1. No Code Vendors 구분

SO WHAT?

이러한 흐름이 초래할 결과는 다음과 같다.

  1. 디지털 세계에 비개발자 출신의 창작자(a.k.a. Citizen Creator)가 많아진다.
  2. 더 많고 다양한 디지탈 창작물(ex. SW, 디지털 자산, 앱, 분석물, 워크플로우 등)이 나온다.
  3. 이것들을 조율/활용 가능한 ①플랫폼 ②거버넌스 ③API연계의 중요성이 대두된다.
  4. 여러 영역을 다룰 줄 아는 Multi player로써의 전문가 니즈가 늘어날 것이다.

2. Platforms, Networks & Marketplaces

플랫폼, 네트워크, 마켓플레이스는 현 시대의 비즈니스 모델이자 운영 모델이다.
선도기업들은 이러한 모델들을 조합해 지속 가능한 하나의 생태계를 만든다.

그림2. 모델 별 특징 및 사례

이 생태계를 중심으로, 여러 벤더사들은 크게 3가지 수익화 전략을 구사하고 있다.

벤더사들은,
– Provide: 참여자들에게 생태계 자체를 제공한다.
– Engage: 참여자들이 기존 생태계에서 잘 활동할 수 있도록 지원한다.
– Create: 참여자들이 직접 생태계를 만들 수 있도록 돕는다.

그림3. 벤더사들의 생태계 수익화 전략

SO WHAT?.

  1. 운영 모델 수립 시, 기존의 ~ Chain (ex.Value, Supply etc.) 기반의 Linear한 개념에서 벗어나 보다 동적이고 다층적인 개념 적용을 고려해야 한다.
  2. 전략 수립 시 플랫폼 구축 방안을 항상 고려해야 한다.

3. The Great App Explosion

세상에는 수 많은 앱이 있으나, 다음 5가지 종류로 분류될 수 있다.

앱 종류특징예시
Custom App기업에 의해 커스텀된 앱웹사이트, 모바일 앱
Specialist App특정 도메인/기능에 특화된 앱
API 지원되나 앱을 지원하는 생태계는 없음
Hotjar, Invision, Loom, SEMrush, Unibounce
App Platform도메인/기능 전반을 지원하는 앱/스위트(Suite)HubSpot, Salesforce, ServiceNow, Shopify
Service Platform특정 비즈니스 서비스를 지원하기 위해 타 앱에 임베드할 수 있는 API 제공 Twilio, Stripe, AuthO
Cloud Platform앱/서비스를 빌드하게끔 지원해주는 IaaS/PaaSAWS, Azure, GCP
표1. 앱 종류 별 특징. 하단으로 갈수록 개수가 적어짐

Custom App을 제외한 미국 SaaS 시장은,
솔루션 수 기준으로 2020년 8,000 여 개로 집계되었다.

이는 지난 10년 간 무려 52배가 늘어난 수치다.
폭발(Explosion)이라는 표현이 결코 과하지 않다.

이 성장세는 앞으로도 계속해서 이어질 전망이다.
트렌드 2번에서도 기술된 Platform, Marketplace가 꾸준히 성장하면서
더 많은 참여자들을 유인할 것이다.

이로 인해
– 경쟁이 심화되고
– 벤더사들의 교섭력이 약화되어 가격이 전반적으로 낮아지면서
– 동시에 벤더사들은 서로 모방과 차별화를 반복해 전반적인 기능 수준이 높아지고
– 결과적으로, 앱 시장에서 기업들이 체감하는 효용은 증가할 것이다.

SO WHAT?.

  1. 기업이 보유한 앱 포트폴리오를 얼마나 잘 orchestrate해 비즈니스 목적에 최적화해 활용하는가(Global Optimum)는, operation 단의 화두이자 중요 과제로 점점 부상할 것이다.
    해당 역할을 잘 수행하는 agency 또는 인재가 각광을 받을 것이다.
  2. 위 역할을 수행하고자 하는 사람이라면, 앱 시장에서의 역학 변화를 눈 여겨 보아야 한다. 중위 값 기준 하나의 앱은 15개의 다른 앱과 연계가 가능하며, 앱의 89%는 API를 제공하고 있다(Pandium 2020.5). 연계가 가장 많이 되는 앱 플랫폼 또는 앱은 무엇인지 현황과 트렌드를 잘 살핀다면, 현재 어느 앱 플랫폼/앱이 주도권을 쥐고 있는지 파악할 수 있을 것이다.

4. From Big Data to Big Ops

2020년 7월 IDC와 Seagate의 조사에 따르면,
기업이 취급하는 데이터 중 32%만이 활용된다.
전체 데이터의 24%는 수집 후 방치되고 있고, 나머지 44%는 수집조차 되지 않는 Dark Data다.

이는 상당수의 기업이 데이터를 제대로 활용하지 못하고 있음을 시사한다.
암만 데이터를 모아봤자 뭐하나? 아무런 가치가 없는데.
게다가 방치되는 데이터는 기업의 손익에서 0이 아닌 음수(-)의 관계다.
데이터의 저장에는 유지보수 관리 비용이 수반된다.

이러한 데이터의 활용에 관한 문제의식에서 출발한 개념이 Big Ops다.

기존에 ‘데이터’에 초점을 맞춘 Big Data가 있었다.
데이터를 수집/저장/처리하는 데 만전을 가하자는 2010년대의 주된 담론이었다.

반면 Big Ops는 ‘조직’에 초점을 맞춘다.
조직이 데이터를 얼마나 잘 연결시키고, 활성화해 의사결정에 반영하는가가 관건이다.
이것이 최근 2020년대 들어 화두가 되고 있는 주제이다.

이러한 관점에서 데이터는 다음 2가지 측면에서 다루어야 한다.
데이터를 증류(distillation)하고, 활성화(activation) 시켜야 한다.

그림4. Data Distillation & Data Reflexes

데이터를 가공한다는 표현은 기존에 보편적으로 사용되었으나, 증류한다는 표현은 생소하다. 보아하니, 딥러닝 영역에서 사용하는 전문 기법이라고도 하는데 이를 확장시킨 듯 하다.

데이터 증류의 종착점은 지식과 통찰(knowledge & insight)이다.
그렇다면, 데이터 활성화는 어떨까?
데이터 활성화는 고도화됨에 따라 자동화(automated)로 수렴한다.

SO WHAT?.

  1. 기업은 데이터를 활성화시키기 위해 먼저 데이터를 연결시킬 것이다.
  2. 내부적인 연결을 통해 데이터 관리의 복잡성이 증대되고, 이를 조율 및 제어하는 역량과 거버넌스의 역할이 대두된다.
  3. 외부와의 연결을 통해 2nd/3rd party 데이터를 확보한다. 데이터는 Marketplace를 통해 점차 활발히 거래된다.
  4. 데이터의 활용성, 수익화, 가치를 평가하는 모델/프로세스/방법론이 기업마다 내재화되어야 한다.

5. Harmonizing Humans + Machines

2019년 마케터 대상으로 조사되었던 설문에서,
‘AI/ML로 인해 마케터로서의 입지가 줄어들 것 같나요?’
라는 질문에 대해 불과 14%만이 ‘그렇다’고 응답을 했다.
1년이 지난 시점인 2020년, 해당 수치는 59%로 가파르게 올랐다.

AI/ML 시장에 교란을 일으키고 있는 현재 상황에서
과연 어떻게 해야 생존할 수 있을지, 많은 마케터들이 고민할 것이다.

답은 명확하다. AI/ML 모델링을 할 줄 아는 마케터가 살아남을 수 있다.

그러나 생존에 관하여 마케터는 더 넓은 시야를 가져야 한다.
AI는 비단 마케터에게만 영향을 미치지 않는다.
AI는 고객에게도 영향을 미칠 것이며,
결과적으로 AI는 Buyer-Seller Interaction 자체에 관여할 것이다.

표2.Buyer/Seller Interaction

위 표에서 나와있듯이 각 영역(Sales & Service, Ecommerce, Bot Commerce) 별로 주도하는 역할은 다를지언정, Human과 Machine은 상보적인 관계를 이루며 존재할 것이다.

SO WHAT?.

결국 비즈니스 상황과 맥락에 따라 Machine을 어떤 역할(주도적/보조적)로 활용할 것인가에 대한 판단과 전략이 마케팅 성과의 성패를 좌우할 것이다.

comment. Bot Commerce에 대해서는 차후에 기회가 있으면 별도로 다루어보도록 하겠다.

Summary

지금까지의 5가지 마테크 트렌드를 한 판으로 정리한 그림으로 마무리한다.

그림5. Martech 5 Trends

ChatGPT 활용법 & 예시 10가지 (더 잘하기 위한 팁)

1. 전문가로서의 답변을 요구하라

ChatGPT 에게 질의를 할 때, “전문가처럼 답변”을 하라고 지시하라.
마치 상황극을 하는 것처럼, ChatGPT 에게 구체적인 캐릭터 (persona) 를 부여하라.

Ex. 당신(ChatGPT)은 하버드 비즈니스 스쿨을 졸업한 일류 마케팅 리서치 회사에서 근무하고 있는 유능한 분석가입니다. B2B SaaS 회사의 C 레벨 경영진과 얘기를 나눌 수 있는 소재거리에 대해 알려주세요. 어떤 열린 결말 형태의 질문들을 내가 물어볼 수 있죠? 흔하지 않고, 전문가의 조언을 우선적으로 답변 주세요.

2. 뻔하지 않은 주류 외의 답변을 요구하라

현재 주류로 자리잡은 담론이 아닌,
기존의 고정관념, 전제, 기대를 과감히 깨부수는
독특하고 새로운 관점의 답변을 요구하라.

Ex. 주제: 이메일 뉴스레터 구독량을 늘리는 방법.
위 주제에 대해서, 기존 주류의 답변들과는 상반되는 색다른 예시들을 알려주세요. 기존의 가설들과는 맞지 않는, 새로운 생각을 자극시킬 수 있는 내용들 위주로 요약해서 알려주세요.

3. 잘 사용하지 않는 문구를 써라

좀 더 추상적이고, 열린 결말을 지향하는 문구들을 사용하라.
이렇게 하면, ChatGPT 로부터 독특하고, 다른 사람들은 쉽게 접하지 않는 창의적인 답변을 받을 수 있을 것이다.
ChatGPT 를 좀 더 유별나게 대할 수록, ChatGPT 가 평범하지 않은, 창의적인 답변을 할 확률이 더 높아진다!

Ex. 기업가가 되는 기분을 10개의 형용사를 써서 설명해주세요.

4. 브레인스토밍 하라

ChatGPT를 활용하여, 다음 당신이 관심을 갖는 프로젝트에 대한 새로운 아이디어를 리스트업하게 하는 것은 매우 쉽다. 하지만 종종 ChatGPT는 뻔한 답변들을 내놓는다. 해서 이런 뻔한 답변을 내놓는 대신, ChatGPT로 하여금 새로운 관점이나 접근의 답변을 하도록 요구하라.

주제: 창의적인 활동에서 생산성을 높이는 방법.
위 주제에 대해, 새로운 관점이나 접근 방식으로 브레인스토밍 해주세요. 흔하지 않거나 새로운 아이디어의 우선순위는 높여서 답변해주세요.

5. ChatGPT 에게 당신의 글쓰기 스타일을 따라하게끔 하라

ChatGPT 에게 아예 당신의 글쓰기 스타일을 알려주고, 이를 모방해서 답변을 할 것을 명령하라. 기존에 당신이 글을 쓰고 있었고, 해당 문투나 뉘앙스, 맥락에 부합하는 답변을 ChatGPT 가 그대로 내놓는다면 당신이 직접 답변을 편집해야 하는 수고는 줄어들 것이다!

Ex. 아래 문단의 스타일, 톤, 어조를 분석해주세요. NLP를 활용해서, 제시된 문단과 같은 스타일, 톤, 어조의 새로운 글을 생성해주세요.

(복사붙여넣기한 당신의 문단을 삽입)

6. 답변 전략을 직접 구체적으로 지시하라

ChatGPT가 답변을 할 때, 어떤 방향으로 답변을 할 지 직접 구체적으로 요구하라. 답변 전략(어떤 글이 좋은 글인지)에 대해서는 인터넷에 널려있으니(ex.Grammarly blog) 구글링해볼것!

Ex. 카피라이팅이 왜 2023년에 필수적인 기술인지이 대해 짤막한 포스팅을 써주세요.
다음과 같은 방향으로 답변해주세요:
– 설득력이 높은 언어를 구사할 것
– 다음 문단으로 넘어갈 때 질문 형태의 문장을 사용할 것
– 주요 논지에 대해 분명한 논거(증거와 예시)를 들 것
– 독자들에게 에둘러 말하지 말고, 직접적으로 말할 것

7. ChatGPT에게 여러가지 관점에서 답변하도록 요구하라

동일 주제에 대해, ChatGPT로 하여금 서로 다른 성향, 배경 및 입장을 지닌 집단/그룹 각각의 관점에서 답변을 하도록 요구하라. 이는 당신의 글에 새로운 아이디어와 관점, 깊이를 선사할 것이다.

Ex. 주제: 기업가의 생산성
위 주제에 대해, 각각 서로 다른 관점을 지닌 그룹의 관점에서 여러가지 글을 써주세요. 각각의 답변은 실제로 각각의 그룹의 관점, 논조, 문투 등이 반영되어야 합니다.

8. 풍자 또는 역설 같이 색다른 글 유형으로 답변토록 요구하라

상이한 글 유형 (증명, 토의, 토론, 논쟁, 변론, 칭송, 선언, 우화, 풍자, 역설 등) 에 따라 ChatGPT가 답변하라고 한다면, 더 창의적이고 역동적인, 다양한 내용의 답변을 얻을 수 있을 것이다.

Ex. ChatGPT를 활용한 효과적인 글쓰기 방법에 대해, 역설적이고 풍자적인 조언을 해주세요.

9. ChatGPT에게 답변 형태(format)를 구체적으로 명시하라

ChatGPT는 다음과 같은 답변 형태를 사용할 수 있다:
– 요약 (outline)
– 마인드맵 (mind map)
– 불릿 포인트 (bullet point)
– 설득력 있는 에세이 (persuasive essay)
– 280 문자 수 미만의 텍스트 문단
– 구조화된 글: 1) 무엇을 2) 왜 3) 어떻게

Ex. 컨텐츠 크리에이터로서 Notion 을 잘 활용하는 방법이란 주제에 대해 마인드맵을 만들어주세요. 중심부 아이디어, 주요 주제, 하위 주제를 나누어서 리스트업해주세요.

10. 답변의 맥락과 목적에 대해 ChatGPT에게 명시하라

당신의 독자가 누구인지, 글을 통해 얻고자 하는 목표가 무엇인지에 대해 ChatGPT에게 구체적으로 알려줘라. ChatGPT에게 풍부한 맥락 정보를 줄 수록, 답변의 완성도는 높아진다!

Ex. 주제: 코칭 비즈니스를 키우는 방법
독자: 비즈니스 코칭
글의 목표: 독자로 하여금 코칭 비즈니스를 성장시키는 것에 대해 흥미와 동기부여를 일으키면서, 한 가지 구체적인 팁을 제공
글쓰기 스타일 : 분명하고, 정확하며, 대화체의, 실제적인, 겸손한, 경험이 풍부한

출처 : Rob Lennon (@thatroblennon)

*주의 : 한글보다는 영어로 ChatGPT를 사용하는 것을 권장하며, 위 팁은 한글에는 적용되지 않을 수 있음

버닝 플랫폼이란? (Burning Platform)

버닝 플랫폼의 개념과 유래

1. 버닝 플랫폼의 개념

버닝 플랫폼이란, 위기 상황에서 가만히 있기 보다는 새로운 변화 및 도전을 하는 접근 방법을 말함
사람들로 하여금 급진적인 변화 전략을 채택하도록 독려(encourage)

2. 버닝 플랫폼의 유래

  • 1988년 7월 6일 영국 스코틀랜드 근해 원유 시추 플랫폼인 Piper Alpha에서 큰 화재 발생
  • 화재로 인해 플랫폼 위에 있던 229명 중 168명이 사망하고 62명만이 구조됨
  • 이 과정에서 사람들은 우왕좌왕했고, 선택 가능한 옵션은 두 가지가 있었음:
    옵션①. 구조 헬기가 오기까지 플랫폼 위에서 기다기
    옵션②. 30m 아래 영하의 바닷물에 뛰어들기
  • 결국 옵션② 를 선택한 사람들만 살아남았음

3. 버닝 플랫폼의 유명 일화

source : fairygodboss

  • 2011년 Nokia CEO Stephen Elop, 버닝 플랫폼 메모
  • 배경 : 당시 스마트폰이 기존 모바일 시장을 신규 잠식하면서, Nokia 는 시장점유율에서 밀려나고 반면 신흥강자인 Apple, Samsung, Google 이 치고 올라오는 상황이었음
  • 메모 내용 : 가만히 있으면 우리는 좌초된다. Nokia 가 살아남기 위해서는 Microsoft 와 전략적인 협력관계를 새로 만들어야 한다.
  • 위 Elop 의 주장(Microsoft 와 협력) 자체는 훌륭한 선택은 아니었으나, 가만히 있고 아무 것도 안하는 것보다는 낫다는 평가

4. 버닝 플랫폼 비유에 대한 비판

비판 내용:

  • 방향성(toward)이 아닌 회피(away from)에 초점
  • 과도하게 자극적인 표현

reference links
https://fairygodboss.com/career-topics/burning-platform
https://www.excitant.co.uk/burning-platform-finding-a-better-change-metaphor/

BigQuery 에서 PIVOT 하는 방법

  • BigQuery 에서2021년 7월 19일, PIVOT 기능이 신규 추가되었다.
  • PIVOT 이란 테이블의 열과 행을 변경하는 것을 말한다.
  • 해당 PIVOT 기능에 대한 문법과 유의점에 대해 알아보자.

1. Syntax

--PIVOT 연산자
FROM from_item[, ...] pivot_operator

pivot_operator:
    PIVOT(
        aggregate_function_call [as_alias][, ...]
        FOR input_column
        IN ( pivot_column [as_alias][, ...] )
    ) [AS alias]

as_alias:
    [AS] alias

2. Example

다음과 같은 테이블이 있다고 해보자.

productsalesquarteryear
Kale51Q12020
Kale23Q22020
Kale45Q32020
Kale3Q42020
Kale70Q12021
Kale85Q22021
Apple77Q12020
Apple0Q22020
Apple1Q12021
table_A

위 table A 를 아래 table B 와 같이 변경하고 싶다면,

productyearQ1Q2Q3Q4
Apple2020770NULLNULL
Apple20211NULLNULLNULL
Kale20205123453
Kale20217085NULLNULL
table_B

다음과 같이 쿼리를 작성하면 된다.

SELECT * FROM
 table_A
 PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))

3. 유의사항

PIVOT 하고자 하는 테이블에서 내가 참조하지 않는 속성이 있는 경우,
명확하게 PIVOT 앞의 FROM 절에서 명시를 해주어야 한다.

그렇지 않을 경우, PIVOT 결과 값이 왜곡된다.
(행 중복)

3.1. Bad Case

단순히 쿼터 별로 합계를 보고 싶다고 할 때(연도와 상관 없이),

아래와 같이 쿼리를 작성하지 말자.

SELECT product, Q1, Q2, Q3, Q4 FROM
 table_A
 PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))

이에 대한 Result 는 다음과 같다.

productQ1Q2Q3Q4
Kale5123453
Kale7085NULLNULL
Apple770NULLNULL
Apple1NULLNULLNULL
3.1. 잘못된 결과

3.2. Good Case

참조하고자 하는 속성 중 year 가 없는 경우, 다음과 같이 명시해주어야 한다.

SELECT product, Q1, Q2, Q3, Q4 FROM
(SELECT product, quarter, sales FROM table_A)
PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))

이에 대한 Result 는 다음과 같다.

productQ1Q2Q3Q4
Kale121108453
Apple780NULLNULL
3.2. 잘된 결과

BigQuery 랜덤 샘플링

RAND() 함수를 활용한 BigQuery 랜덤 샘플링

랜덤 샘플링은 RAND() 함수를 사용하면 된다.

N개의 행(row)을 랜덤 샘플링하는 쿼리는 다음과 같다.

--샘플 크기가 100개 행이라고 가정했을 때,

SELECT *
FROM `project.dataset.table`
WHERE RAND() < 100/(SELECT COUNT(*) FROM  `project.dataset.table`)
;

BigQuery 에서 TO_CHAR 사용해서 date 로부터 YYYY-MM 추출하기

BigQuery 를 사용하다보면, Oracle 이나 타 SQL 에 비교해서 가장 짜증나는 부분이
BigQuery 에서는 TO_CHAR 함수가 없다는 것이다.

즉, 특정 date 속성에서 ‘YYYY-MM’ string 을 추출하고자 한다면

Oracle 에서는

--Oracle SQL
SELECT TO_CHAR(<date>, 'YYYY-MM') AS <colname>

위와 같이 간결한 쿼리문이 BigQuery 에서는

--BigQuery
SELECT CONCAT(CAST(FORMAT_DATE("%E4Y", CAST(<date> as date)) AS string),'-',CAST(FORMAT_DATE("%m", CAST(<date> as date)) AS string)) AS <colname>

위와 같이 매우 번거롭게 쿼리를 작성해야 한다.

BigQuery ARRAY 속성 EXCEPT 적용, REPLACE

1. * EXCEPT

BigQuery 는 편리하게도 SELECT 문에서 전체 속성을 지정하는 Wildcard(*) 를 사용 시,
특정 속성을 제외할 수 있는 문법을 제공한다.

가령, 속성 a, b, c, d, e, f 중 a, b, d, e, f 만 선택하고 싶을 경우 (=c 제외)

--아래와 같이 일일히 속성을 지정하는 것 대신,
SELECT a, b, d, e
FROM table


--다음과 같이 * EXCEPT 를 적용하면 효율적이다
SELECT * EXCEPT(c)
FROM table

2. ARRAY 속성 관련 제한사항

그러나 * EXCEPT 는 그 편리함에도 불구하고,
제외할 속성으로 ARRAY 내 nested column 을 특정할 수 없다는 단점이 있다.

(ARRAY, UNNEST 에 대해 잘 모른다면 다음 포스팅 참고)

3. REPLACE 사용하기

가령, ARRAY 속성 b 를 가진 테이블을 UNNEST 하여
속성 a, b.1, b.2, b.3, c 중 a, b.2, b.3, c 만 선택하고 싶을 경우 (=b.1 제외)

--직관적으로는 아래와 같이 쿼리를 하고 싶지만 실행 오류가 뜬다.
SELECT * EXCEPT(b.1)
FROM table, UNNEST(b) AS b


--이 때는 REPLACE 를 적용해 다음과 같이 쿼리해야 한다.
SELECT * REPLACE (ARRAY(SELECT AS STRUCT * EXCEPT(1) FROM UNNEST(b)) AS b)
FROM table

BigQuery 여러 날짜 별 테이블 한 번에 쿼리

1. 테이블 구성

BigQuery 는 GA 와 연계해서 사용하는 경우,
일반적으로 GA 데이터는 일 (daily) 단위의 별개 테이블로 BigQuery에 적재된다.

events_ & events_intraday_ tables in BigQuery for GA4 (Google Analytics 4)  - Optimize Smart

출처 : Optimize Smart

가령, 위 화면 좌측 Explorer에 events_ (9) 라는 테이블은
events_20210115
events_20210114
events_20210113

events_20210107
총 9개의 일 별 테이블이 있는 것이다.

events 라는 테이블 명에 ‘_YYYYMMDD’ 형태의 Suffix 가 적용되었고,
총 테이블 개수는 괄호 안에 ‘_(9)’ 와 같이 표현된다.

2. 여러 테이블 쿼리하기

위와 같은 테이블 구성에서, 그렇다면 여러 테이블들을 어떻게 한 번에 호출할까?

여러 테이블을 일일히 UNION 하는 방식도 있겠으나,
BigQuery 에서는 보다 효율적인 문법을 제시한다.

Wildcard 와 _TABLE_SUFFIX 를 사용을 통해서다.

events 테이블 중 2021-01-09 부터 2021-01-12 까지의 테이블을 조회해야 한다고 가정해보자.

--아래와 같은 방식 대신,
SELECT *
FROM 'dbrt-ga4.analytics_207472454.events_20210109'
UNION ALL 
SELECT *
FROM 'dbrt-ga4.analytics_207472454.events_20210110'
UNION ALL 
SELECT *
FROM 'dbrt-ga4.analytics_207472454.events_20210111'
UNION ALL 
SELECT *
FROM 'dbrt-ga4.analytics_207472454.events_20210112'



-- Wildcard 와 _TABLE_SUFFIX 를 사용하는 것이 더 효율적이다.
SELECT *
FROM 'dbrt-ga4.analytics_207472454.events_*'
WHERE PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) BETWEEN DATE('2021-01-09') AND DATE('2021-01-12')

참고
https://cloud.google.com/bigquery/docs/querying-wildcard-tables

UI 용어 정리 (요소 별 명칭)

UI 요소 이름, 명칭 정리

웹 관련 업무를 하다보면 UI 요소 관련해서 명칭을 정확히 알아야 커뮤니케이션이 원활하다. 관련 UI 용어를 살펴보자.

  1. Input Controls
  2. Navigational Components
  3. Information Components
  4. Containers

Input Controls

ElementExamples
CheckboxesExample of checkboxes
Radio buttonsExample of radio buttons
Dropdown listsExample of a dropdown
List boxesExample of a list box
ButtonsExample of buttons
Dropdown ButtonExample of dropdown button
TogglesExample of toggles
Text fieldsExample of text field
Date and time pickersExamples of date and time pickers
정보 입력

Navigational Components

ElementExamples
CaratWhat are the little arrows called that hide additional details? - User  Experience Stack Exchange
화살표 모양의 클릭 가능한 아이콘 (펼칠 때 사용)
Search FieldExample of search boxes with various functions
BreadcrumbExample of breadcrumb
전체 체계에서 사용자의 현 위치를 알려줌
PaginationExamples of pagination
TagsExample of tags
SlidersExample of sliders
IconsExamples of icons
Image CarouselExample of an image carousel
네비게이션

Information Components

ElementExamples
NotificationsExample of a notification
Progress BarsExamples of progress bars
Tool TipsExamples of tool tips
Message BoxesExample of message boxes
Modal Window (pop-up)Example of a modal window
정보 전달

Containers

ElementExamples
AccordionExample of an accordion
항목 별 펼처보기, 숨기기 기능
컨테이너

Source : https://www.usability.gov/how-to-and-tools/methods/user-interface-elements.html

BigQuery UNNEST 친절한 설명

1. ARRAY 란?

Oracle 과 같이 기존에 전통적인 RDBMS 문법을 기반으로 쿼리를 배웠을 경우,
BigQuery 에서 이런 저런 데이터를 다루다 보면 간혹 낯선 풍경과 조우하는 경우가 있다.

그 중 하나가 BigQuery 의 데이터형(data type) 중 하나인 ARRAY 이다.

BigQuery에서 배열은 데이터 유형이 동일한 0개 이상의 값으로 구성된 순서가 지정된 목록을 의미합니다.

Google BigQuery Doc

별로 와닿지 않는 정의다…
풀어서 설명을 해보도록 하겠다.

일반적으로 기업에서 BigQuery 를 사용한다고 하면,
Google Analytics (이하 GA) 와 연동해서 사용하는 경우가 많으므로
GA 데이터를 샘플 삼아 설명하도록 하겠다.

GA 는 Web 에서 고객이 남기는 행동들을 Log 형태로 수집을 하고,
수집된 raw data는 JSON 형식에서 대략 다음과 같다.

[
  {
    "visitId": "123456789",
    "visitStartTime": "1622124798",
    "totals": {
      "visits": "1",
      "hits": "1",
      "pageviews": "1"
    }
  }
]

(참고) visitStartTime 값이 왜 1622124798 인지 궁금하신 분들은 관련 포스팅을 참고

JSON 문법을 잘 모르더라도,
위 내용을 아래와 같이 직관적으로 파악할 수 있을 것이다.

👨 visitId 가 123456789 이고
🕒 1622124798 UNIX time 에 들어와서
🔢 총 방문 수를 1회, hit 수는 1회, 페이지 조회 수는 1회 기록했구나.

자, 그러면 위 JSON 데이터를 쿼리가 가능하도록 table 형태로 보면 어떨까?

2. Why UNNEST?

위 데이터를 표로 만들 경우, 결과는 다음과 같을 것이다.

visitIdvisitStartTimetotals
1234567891622124798“visits”: “1”,
“hits”: “1”,
“pageviews”: “1”
table1. UNNEST 전

자, 한 번 보자.
딱 봐도 문제가 있지 않은가? (불편 +1)

table1. 불편한 부분

totals 컬럼의 값을 펼쳐서 추가적인 컬럼으로 만들고 싶은 욕구가 생긴다.
마치 R 에서의 reshape 패키지 cast 함수처럼.

visitIdvisitStartTimetotals.visitstotals.hitstotals.pageviews
1234567891622124798111
table2. UNNEST 후


table1 에서 table2 로 변경을 해주는 작업.
이것이 바로 UNNEST 함수다.

3. UNNEST Syntax

UNNEST 의 사용 문법은 다음과 같다.

--visitId 별 페이지 조회 수

SELECT visitId, t.pageviews
FROM table1, UNNEST(totals) AS t

테이블 내 값을 컬럼으로 펼치는 과정에서 CROSS JOIN 이 들어가기 때문에,
FROM table1 뒤에 쉼표(,) 가 붙는다.

UNNEST(totals) 에 대한 alias 가 필수는 아니지만,
복잡한 JOIN 이 들어간 쿼리에서 해당 속성을 특정할 수 있어 사용을 권고한다.

외 참고 링크

Google 에서 직접 GA 샘플 데이터셋을 제공하기도 하니,
실무적인 연습이 필요한 분은 아래 링크를 참고.
Google Analytics sample dataset for BigQuery

R 과 BigQuery 연계 (bigrquery, DBI)

본 포스팅에서는 R 과 BigQuery를 연계하는 방법을 다룬다.

구체적으로, R 에서 함수를 호출해 BigQuery에 쿼리를 날리고
해당 쿼리 결과 값을 로컬에 있는 R 로 가져와
dataframe object로 저장하기까지의 과정을 다룬다.

이를 위해 사용되는 R 패키지는 DBI, bigrquery, dbplyr 총 3가지다.
각 패키지의 역할은 간략하게 다음과 같다.

1. DBI
BigQuery를 비롯한 포괄적인 R/DBMS database 와의 인터페이스를 제공하는 패키지

2. bigrquery
BigQuery에 특정된 인터페이스를 취급하는 패키지

3. dbplyr
dplyr를 SQL 로 번역해주는 역할을 하는 패키지. 데이터 조작을 위해 필요하다.

아래 코드에서는 이해를 목적으로, 함수 별로 앞에 ‘패키지명’:: 을 명시함으로써 구분을 해 놓았다.
예외 적으로, dbplyr 의 경우는 명시하지 않았고 다만 ‘%>%’ 가 포함된 코드는 dbplyr 가 사용된 것이다.

#패키지 설치 및 로드

install.packages("bigrquery")
install.packages("DBI")
install.packages("dbplyr")

library(bigrquery)
library(DBI)
library(dbplyr)

##연결 셋팅

#요금 청구 대상이 되는 프로젝트 ID 입력
billing <- "project id"
#쿼리하고자 하는 프로젝트 ID 입력
projectName <- "project id"
#쿼리하고자 하는 데이터셋 입력
datasetName <- "dataset"

con <- DBI::dbConnect(
  bigrquery::bigquery(),
  project = "project id",
  dataset = "dataset",
  billing = billing
)

ds <- bigrquery::bq_dataset(projectName , datasetName)

#인증
bigrquery::bq_auth()

#사용하고자 하는 sql문 입력, 이때 syntax는 BigQuery
sql_tmp <- paste0("SELECT column
                  FROM `project id.`.dataset.table;")

#sql 호출
tb <- bigrquery::bq_dataset_query(ds,
                       query = sql_tmp,
                       billing = billing,
                       quiet = NA)

#테이블을 dataframe 형태로 다운로드
tb_df <- bigrquery::bq_table_download(tb) %>% as.data.frame()

Reference
https://cloud.google.com/architecture/data-science-with-r-on-gcp-eda