[SQL] PV, UV

jul ee·2025년 4월 8일

데이터 성장기

목록 보기
22/139

🖇  PV, UV란?
🖇  분석 시 주의사항
🖇  방문한 페이지 정보로 PV, UV 구하기


하루에도 수천만 명이 방문하는 쿠팡, 네이버, 인스타그램 같은 웹/앱 서비스에서 가장 중요한 지표는 무엇일까?

‘얼마나 많은 사람이 들어왔고’, ‘무엇을 얼마나 많이 봤는가?’ 일 것이라 생각한다.

    예를 들어,
    쿠팡에서 특정 상품 페이지에 10만 회 조회(PV)가 있었다면
    그것이 진짜 10만 명의 관심일까, 아니면 한 명이 1000번 새로고침한 걸까?

이처럼 PV와 UV는 겉으로 보기에 단순하지만 실제 해석에 따라 완전히 다른 인사이트를 제공하는 핵심 지표이다.

이 글에서는 PV와 UV의 개념부터 해석 시 주의할 점과,
현실 서비스에서의 지표 해석 포인트까지 예시를 통해 함께 정리해 보았다.

이어서 실제 분석 상황에서의 활용 방법까지 빅쿼리 환경에서 실습을 진행해 보았으니 PV와 UV를 이해하는 데에 도움이 되길 바란다.



🖇  PV와 UV

웹/앱 플랫폼을 운영하는 회사에서 가장 기본적으로 분석하는 지표 중 하나가 바로 PV(Page View) 와 UV(Unique Visitor) 이다.

해당 지표들을 이해하기 위해 먼저
PV, Unique PV, Visits, UV 의 정의와 특징을 표로 살펴보자.

키워드정의특징
PV(Page View)페이지 단위의 (조회) 수허수가 많기 때문에 주의 필요
Unique PVPV에서 중복 뷰를 제거한 수
Visits사이트에 방문한 총 사용자 수세션 기준으로 집계
UV(Unique Visits)Visits에서 중복을 제거한 방문자 수 (순 방문자수)특정 기간으로 중복 제거 (주로 하루 단위)

PV  vs  Unique PV

예를 들어,
사용자 A가 하나의 페이지를 50번 새로고침 했다면 다음과 같이 집계된다:

    PV(Page View) ->  50회
    Unique PV ->  1회

동일 사용자가 페이지를 반복해서 보는 경우 PV는 반복 수만큼 늘어나지만,
Unique PV는 중복을 제거해 하나로 집계된다.

PV
"특정 페이지에 얼마나 많은 사람이 몰렸는가?" 를 측정할 수 있는 지표이다.


Visits  vs  UV

Visits은 주로 "세션" 단위를 기준으로,
UV(Unique Visitors)는 일정 기간 내의 중복을 제거한 방문자 수를 집계한다.

예를 들어, 세션 기준이 30분이라면:

    같은 사용자가 30분 이내에 여러 번 방문 →  Visits 1회로 집계
    30분 이상이 지난 후 재방문 →  Visits 2회로 집계

     이때 UV는 하루 기준이라면 여전히 1회로 집계된다.

즉, Visits는 세션 기반이고, UV는 사용자 기반이다.

💡 재방문률이 굉장히 좋은 서비스가 인스타그램인데,

     인스타그램을 하다가 폰을 내려놓고 10분 후 다시 접속하면?
     → 동일 세션 →  Visits 1회

     한참 뒤에 다시 들어가면?
     → 세션이 끊겨 →  Visits 2회

     마찬가지로 UV는 하루 기준이라면 여전히 1회로 집계된다.


참고로, Google Analytics나 App 내부 기준에서 기본적으로 30분 단위로 세션이 종료되며 이 기준은 설정 변경도 가능하다.

또한 위에서는 하루 단위 기준으로 UV를 정의하였지만, 프로젝트 성격에 따라 주간/월간 UV로도 정의할 수 있다.

UV
"우리 사이트에 몇 명이 실제로 방문했는지" 를 보여주는 핵심 지표이다.




🖇  분석 시 주의사항

PV와 UV는 항상 같이 다니는 개념인데, 그래서 더욱 사용과 해석에 주의해아 한다.

PV에는 허수가 많다

PV는 "특정 페이지에 얼마나 많은 사람이 몰렸는가?" 를 측정할 수 있는 지표로, 매출을 창출하는 강력한 무기로 활용할 수 있다.

하지만 PV는 허수가 많아, 주의해서 보아야 한다.

쉽게 말해
PV는 높으면 좋다고 생각하기 쉽지만, 반드시 그런 것은 아니라는 것이다.


원클릭 결제 기능을 예로 들어 생각해 볼 수 있다. 기존 구매 플로우가 다음과 같다고 가정해 보자.

[원클릭 결제 도입 전]  PV:6

[사이트 방문]> [상품 선택][주문서 확인][결제 수단 확인]> [PG사 결제 승인][결제 완료]
[원클릭 결제 도입 후] PV:4

[사이트 방문][상품 선택][원클릭 결제][결제 완료]

원클릭 결제 기능은 밀어서 스와이프만 하면 바로 결제가 되는 기능인데

  • 해당 서비스를 도입하기 전의 기존 구매 플로우를 보면
    각 페이지를 딱 한 번씩만 방문했다고 가정한다고 하더라도 결제까지 이 과정에서 본 페이지 수는 6개, PV가 6이 된다.

  • 원클릭 결제 도입 후, 즉 기능을 개선한 후의 PV는 과연 증가할까?
    사이트를 방문해서 마음에 드는 상품을 결제했다면 클릭 한 번에 결제가 완료되어 PV가 4로 줄어들게 된다.

하지만 이건 방문자가 줄어든 것이 아니라, 사용자의 행동 경로가 단축된 긍정적인 변화일 수 있다.

아주 간단한 예시로 생각해 보았지만 PV에 허수가 많다는 게 어떤 의미인지 와닿을 것이다.

이처럼 PV 수가 많다고 무조건 좋은 것은 아니며,
데이터가 바뀌게 되면 그 원인을 항상 세밀하게 따져보고 맥락을 분석해야 한다.



PV, UV 지표로부터 의미 도출하기

PV와 UV 지표의 증감 패턴을 통해 어떤 현상이 발생하고 있는지 파악할 수 있다.

UV 증가UV 감소
PV 증가(1)(2)
PV 감소(3)(4)

위의 표에서 각각의 경우를 상세하게 분석해 보자.

(1) PV 증가 + UV 증가
	-> 순 방문자 수도 늘고, 방문하는 페이지 수도 늘었다는 의미
    
	=> 많은 사용자들이 여러 페이지를 본다는 것으로, 대체적으로 긍정적인 성장 신호
(2) PV 증가 + UV 감소
    -> 사이트를 방문하는 사용자는 줄었지만, 한 명의 사용자가 더 많은 페이지를 보고 있다는 의미
    
    => 헤비 유저 또는 매니아층만 남은 것은 아닐까? 라고 판단하기에는 이르다.
    => 서비스 플로우가 지나치게 길고 불편하다는 신호일 수도 있다.
       앞서 살펴본 원클릭 결제 기능 도입 전과 같이 진입장벽이 높거나, 불편한 UI/UX 등도 고려해봐야 한다.
(3) PV 감소 + UV 증가
    -> 방문자 수는 많지만, 이탈률도 늘었다는 의미
    
    => 매력적인 컨텐츠나 제품을 제공하지 못하고 있다는 신호일 수 있다.
    => 이런 문제점을 제대로 파악하지 못해서 방치한다면
    => 시간이 지남에 따라 결국 UV까지 감소하는 최악의 경우를 낳을 수도 있다.
    => 따라서 이런 경우, 이탈 페이지 분석과 그에 맞는 조치를 취해야 한다.
(4) PV 감소 + UV 감소
    -> 방문자와 소비 모두 감소한다는 의미
    
    => 제품이 대중의 이목을 끌고 있지 못하거나, 불만족스러운 서비스를 제공하고 있다는 신호일지도 모르니
    => 이런 경우에는 반드시 전체 서비스를 검토할 것을 권장한다.



🖇  방문한 페이지 정보로 PV, UV 구하기

실습은 구글 BigQuery에서 진행하였다.

빅쿼리를 무료로 시작하는 방법과 실습을 위한 환경 세팅이 궁금하다면 구글 BigQuery 시작하기를 참고하기 바란다.

아래는 유저가 조회한 페이지 정보를 기록한 visits 테이블이다.
해당 테이블에서 PV, Unique PV, Visits, UV를 계산해 보자.


PV 구하기

PV는 해당 페이지가 조회된 총 횟수(행 수 기준) 를 구하는 것이기 때문에,
page_url을 기준으로 그룹화하여 각 페이지가 몇 번 조회되었는지 계산하였다.

SELECT page_url,
       COUNT(*) AS PV
FROM 프로젝트명.데이터세트.visits
GROUP BY page_url
ORDER BY page_url;


Unique PV 구하기

Unique PV는 해당 페이지를 조회한 유니크한 사용자 수를 구하는 것이기 때문에,
각 페이지(page_url)를 조회한 서로 다른 user_id의 수를 계산하였다.

SELECT page_url,
       COUNT(DISTINCT user_id) AS UniquePV
FROM 프로젝트명.데이터세트.visits
GROUP BY page_url
ORDER BY page_url;


Visits 구하기

Visits는 특정 '세션'을 기준으로 동일 세션 내 방문인지 판단한다.

  • 일단 각 로그 행마다 '직전 세션'이 언제 일어났는지에 대한 데이터를 추출한다.
  • 해당 값과 현재 시간을 비교하여 세션 단위로 나누어 방문을 집계한다.
  • is_session_diff = 1인 경우만 카운트하면, 페이지별로 세션 시작 수 = Visits가 된다.
WITH LAST_SESSION AS (
  SELECT *,
         -- "각 유저가 특정 페이지에 대하여 남긴 로그"의 직전 timestamp
         LAG(timestamp) OVER (PARTITION BY user_id, page_url ORDER BY timestamp) AS last_timestamp
  FROM 프로젝트명.데이터세트.visits
),
SESSION_DIFF AS (
  SELECT *,
  		 -- timestamp와 last_timestamp 사이의 시간 차이를 계산하고
         -- 30분 초과 여부로 세션을 나눈다.
         IF (last_timestamp IS NULL OR TIMESTAMP_DIFF(timestamp, last_timestamp, MINUTE) > 30,
             1,
             0) AS is_session_diff
  FROM LAST_SESSION
)
SELECT page_url,
       -- 페이지별 Visits 집계
       COUNT(*) AS Visits
FROM SESSION_DIFF
WHERE is_session_diff = 1
GROUP BY page_url
ORDER BY page_url;


UV 구하기

UV는 각 페이지(page_url)를 방문한 고유한 사용자(user_id)의 수이므로,
use_id 컬럼에서 중복을 제거하여 방문자 수를 집계하였다.

SELECT page_url,
       COUNT(DISTINCT user_id) AS UV
FROM 프로젝트명.데이터세트.visits
GROUP BY page_url
ORDER BY page_url;




지금까지 PV와 UV의 개념과 특징, 그리고 지표를 분석할 때 주의해야 할 점들을 알아보고

유저가 방문한 페이지 정보가 담긴 테이블에서 PV, Unique PV, Visits, UV를 직접 구하는 실습까지 진행해 보았다.

지표들을 구하기 위한 더 효율적인 쿼리가 있다면 언제든지 공유해주기 바란다 :)

💡  PV와 UV는 그 자체로도 중요하지만,
함께 비교하고 맥락을 이해해야 진짜 의미 있는 인사이트를 도출할 수 있게 된다.

단순히 숫자가 줄었다고 걱정할 것이 아니라 그 원인이 사용자 경험(UX), 진입 플로우, 서비스 변화 등 무엇 때문인지를 따져보는 것이 중요할 것이다.

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글