이 글은 "데이터분석을 위한 SQL 레시피 (가사키 나가토, 다미야 나오토 지음)"을 읽고 주관적으로 작성된 글입니다.
1. 시스템
1) PostgreSQL
- 오픈소스 RDB
- MySQL등 다른 오픈소스 RDB에 비해 표준 SQL을 잘 준수하고 있음
- 윈도 함수, CTE(WITH 구문) 등 분석에 필수적으로 사용하는 구문을 모두 구현
- 특유의 확장 기능을 많이 제공하여 편리함
- 소규모 데이터 분석 / SQL 학습 목적으로 사용
2) Apache Hive
- 대용량 데이터에 대한 RDBMS의 한계(bottle neck)
- 빅데이터 시스템에서는 일반적으로 저렴한 디스크를 사용
- 따라서, 디스크의 데이터 I/O 속도와 CPU의 처리 속도의 gap이 큼
- 이를 위한 아키텍처로 분산 파일 시스템이 고안됨
- Apache Hive
- HDFS 위의 데이터를 SQL 인터페이스로 처리하는 시스템
- 분산 시스템 위의 데이터를 동시에 읽어 디스크 I/O bottle neck 해결
- 그러나 분산 시스템에서 읽은 데이터의 순서를 제대로 맞춰야하는 문제가 있음
- 이를 해결하기 위해 MapReduce 알고리즘을 사용
- 장점
- 쿼리 실행시 동적으로 데이터 정의가 가능
- ex) "Korea, Seoul, GangseoGu"가 '국가','시','구'처럼 3개의 컬럼 혹은 1개의 문자열로 다룰 수 있음
- 데이터를 어떻게 사용할지 모를 때, 일단 저장 후 필요시 동적으로 스키마 정의가 가능 - 데이터 분석을 위한 풍부한 UDF(User-Defined Function)
- SQL로 구현이 어려운 문자열 처리 등이 쉬움
- 쿼리 실행시 동적으로 데이터 정의가 가능
- 단점
- 파일 시스템(HDFS)을 기반
- 특정 레코드 하나에 대한 변경/제거가 어려움
- 인덱스가 디폴트로 존재하지 않음 - 리액턴시가 낮은 처리에 적합하지 않음
- throughput을 위한 아키텍처
- 쿼리 실행 과정
1) HiveQL로 작성된 처리를 자바 코드로 변환
2) 생성된 jar를 각 연산 노드에 배치 후 처리
- 파일 시스템(HDFS)을 기반
3) Amazon Redshift
- Redshift
- AWS에서 제공하는 분산 병렬 RDB
- Hive는 파일 기반 batch 처리를 SQL 인터페이스로 구현
- Redshift는 RDB
- 레코드 업데이트 / 제거
- 트랜잭션 지원
- PostgreSQL과 호환성
- 장점
- 일반적인 RDB에서 다룰 수 없는 대용량 데이터 쿼리에 효과적
- Hive는 MapReduce로 분산 처리를 실행하면 가벼운 job도 10초 이상 걸림 - 작은 규모로 시작하여 큰 규모로 쉽게 변경 가능
- 일반적인 RDB에서 다룰 수 없는 대용량 데이터 쿼리에 효과적
- 단점
- 전문 지식이 필요
- 성능 튜닝 / 비용 최소화를 위해 최적의 노드 수 / 스펙을 예측하여 인스턴스를 실행 / 종료해야함
- 컬럼 기반 스토리지로, 설계 / 쿼리 실행시 일반 RDB와 다른 발상 필요 - 상업적인 이용
- 사용 시간에 따라 비용 발생
- 전문 지식이 필요
- 컬럼 지향 스토리지
- 테이블의 데이터를 물리적으로 저장할 때, 레코드별로 저장하지 않고 컬럼별로 저장
- 데이터 압축율이 높음
- 쿼리 실행 때 디스크 I/O 감소
- 일반 RDB의 정규화를 사용하지 않고, 분석에 필요한 데이터를 하나의 테이블 칼럼에 추가
- 테이블의 데이터를 물리적으로 저장할 때, 레코드별로 저장하지 않고 컬럼별로 저장
4) Google BigQuery
- Google BigQuery
- 빅데이터 분석을 위해 구글이 제공하는 클라우드 서비스
- 구글의 다른 서비스와 쉬운 연동
- 구글 애널리틱스 등 - 레거시 SQL과 표준 SQL 두 종류 지원
- 컬럼 지향 스토리지 아키텍쳐
- Redshift와 차이
- 직접 노드 인스턴스를 관리할 필요 없음
- 데이터 양으로 비용 발생
- 단점
- 데이터 사용량 기준으로 요금을 예측하기 어려움
5) SparkSQL
- SparkSQL
- Spark의 기능 중 SQL 인터페이스
- Spark
- MapReduce를 사용한 분산 처리 프레임워크
- 장점
- 빅데이터 관련 활용 / 처리를 한 번에 구현
- 일반적인 경우
- 데이터 추출을 파이썬 스크립트로 작업
- 수집한 데이터를 SQL로 가공
- 통계 분석과 기계학습을 R로 진행
- 결과 리포트를 엑셀로 작성 - 위 과정을 모두 Spark 프로그램 내부에 한 번에 구현 가능
- DataFrames API
- SQL 뿐만 아니라 절차적인 프로그래밍 비슷한 구현도 가능
- 중간 과정을 확인하여 처리
- 데이터 처리를 작은 모듈로 분할하여 다양한 처리
- SQL 뿐만 아니라 절차적인 프로그래밍 비슷한 구현도 가능
2. 데이터
- 리포트를 만들 때, 데이터에 대한 이해가 필요함
- 어떤 데이터를 추출하는지
- 데이터는 어떤 성질을 가지는지
1) 데이터의 종류
- 데이터의 종류
- 업무 데이터
- 업무에 필요한 데이터 - 로그 데이터
- 직접적으로 업무 용도는 아닌 분석을 위해 추출하는 데이터
- 업무 데이터
- 업무 데이터
- 서비스와 시스템을 운용하기 위한 목적으로 구축된 데이터베이스에 존재하는 데이터
- 갱신형 데이터
- 새로운 데이터 삽입이 아닌, 기존 데이터를 갱신 - 트랜잭션 데이터와 마스터 데이터로 나뉨
- 트랜잭션 데이터
- 서비스 / 시스템을 통해 사용자의 행동을 기록한 데이터
- 트랜잭션 데이터를 기반으로 리포트를 만드는 경우가 많음
- 그러나 리포트를 만들 때는 이를 설명하는 마스터 데이터가 필요 - 마스터 데이터
- 서비스 / 시스템이 정의하고 있는 데이터
- 트랜잭션 데이터만으로는 상품의 명칭, 카테고리 등을 알 수 없음
- ex) <사용자 id>, <상품 id>, <개수> 로 이루어진 데이터 {170414, 82091, 2}로는 어떤 상품을 구매했는지 알 수 없음
- 이를 명확하게 만들어야 리포트 업무의 폭을 넓힐 수 있음
- 트랜잭션 데이터
- 로그 데이터
- 로그 데이터의 종류
- 통계 / 분석 용도로 설계된 데이터
- 특정 태그를 포함하는 데이터
- 특정 행동을 서버에 출력하는 데이터 - 누적형 데이터
- 출력 시점의 정보를 축적해두는 데이터
- 기존 데이터를 수정하지 않음
- 로그 데이터의 종류
2) 업무 데이터
- 업무 데이터
- 빅데이터 기반 / 데이터 분석 기반 시스템이 없는 경우, 일반적으로 업무 데이터로 데이터 분석을 진행
- 업무 데이터의 특징
- 데이터 정밀도가 높음
- 여러 데이터 처리 중 문제 발생에 대한 내성이 강함 (트랜잭션, 롤백)
- 데이터의 정합성이 보증됨
- 정확한 값이 요구되는 경우 업무 데이터 활용 (매출 관련 리포트 등) - 갱신형 데이터
- 매일 다양한 데이터 추가 / 갱신 / 제거 등이 실행
- 데이터를 추출하는 시점에 따라 추출 데이터가 바뀔 수 있음을 인지
- 데이터 갱신의 예시
- 사용자의 탈퇴로 인한 물리적 데이터 제거
- 주문 취소로 인한 논리적 제거 (플래그 활용)
- 이사 등 주소 변경으로 인한 사용자 정보 갱신
- 테이블의 수가 많음
- 대부분 RDB 사용
- 이는 데이터의 확장성 배제, 정합성을 쉽게 유지하며 데이터 저장을 위함 (정규화)
- 따라서, 하나의 테이블 참조로 데이터의 상세 내용 파악이 어려움
- ER 다이어그램 파악 / 여러 테이블 결합으로 전체 내용 파악 가능
- 데이터 정밀도가 높음
- 업무 데이터 축적 방법
- 모든 데이터 변경하기
- 날짜 기반 / 누적만 되는 데이터가 아닐 경우
- ex) 우편번호 마스터, 상품 카테고리 마스터
- 데이터 전체를 한꺼번에 바꾸어 최신 상태로 만듦 - 빈번하게 변경되는 테이블 / 날짜가 경과하면 상태가 바뀌는 테이블
- ex) 사용자의 유료 서비스 신청
- 한꺼번에 바꾸면 항상 최신 상태
- 리포트를 만들 때는 편하지만, 과거 정보를 영구적으로 잃으므로 주의
- 날짜 기반 / 누적만 되는 데이터가 아닐 경우
- 모든 레코드 스냅샷을 날짜별로 저장하기
- 날짜에 따라 상태가 변하는 데이터
- 용량 측면에서 좋지 않으나, 모든 레코드를 날짜별로 누적하면 신뢰성을 어느 정도 보장함 - 어제와의 변경 사항만 누적하기
- 트랜잭션 데이터 중 변경/삭제없이 추가만 일어나는 테이블은 한꺼번에 변경 가능
- 그러나 데이터 전송량과 처리 시간을 줄여야할 경우, 어제 데이터와의 차이만 누적해도 됨
- 모든 데이터 변경하기
- 업무 데이터 다루기
- 정확한 값을 요구할 경우 활용 (매출액, 사용자 수)
- 트랜잭션 기능으로 데이터의 정합성이 보장됨
- 로그 데이터는 전송 방법에 따라 중간 손실이 발생할 수 있음
- 정확한 값을 요구할 경우 업무 데이터 사용 - 활용할 수 없는 분석 (서비스 방문 횟수, 페이지뷰, 사용자 유도)
- 예를 들어, 구매 데이터의 경우 어떤 장치에서 구매했는지는 업무에 필요없는 정보
- 필요없는 정보 저장은 서비스 처리에 영향을 줄 수 있음
- 따라서, 위와 같은 분석에는 로그 데이터를 활용해야함 - 데이터 변경이 가능하므로 추출 시점에 따라 결과도 변동 가능
- 업무데이터의 신뢰성은 서비스를 제공할 때임
- 리포트를 만들 때는 데이터 정합성을 완벽히 보장할 수 없음
- 정확한 값을 요구할 경우 활용 (매출액, 사용자 수)
3) 로그 데이터
- 로그 데이터의 특징
- 서비스 처리에 영향 없는 정보 저장
- 시간, 사용자 엔드포인트, IP, URL, 레퍼러, Cookie 등 - 추출 방법에 따라 데이터 정밀도가 달라짐
- 추출 방법, 집계 대상 데이터의 상태를 제대로 파악하지 않고 사용시 잘못된 판단을 할 수 있음 - 데이터 갱신/변경없이 추가
- 출력 시점의 정보를 기록
- 상품의 가격이 변하더라도, 과거의 로그 데이터는 변경되지 않음
- 서비스 처리에 영향 없는 정보 저장
- 로그 데이터 축적 방법
- 로그 데이터 활용시 고려할 사항
- 어떤 로그 데이터인지 파악
- 어떤 방법으로 사용할지 검토
- 리포트로 설명할 범위 결정
- 로그 데이터 전송 / 축적 방법
- 태그, SDK를 통해 사용자 장치에서 데이터 전송 / 출력 (비컨 형태)
- HTML에 특정 태그 삽입으로 데이터를 전송하는 방식
- 웹사이트 개발시 활용하는 일반적인 방법
- JS로 로그 데이터 전송시, 크롤러의 영향을 적게 받음 - 서버에서 데이터 추출 / 출력 (서버 형태)
- 클라이언트 쪽에서 처리하지 않고, 서버에서 로그를 출력하는 방법
- 크롤러의 접근을 막는 것은 거의 불가능
- 따라서, 사용자의 행동을 집계 / 분석할 경우 잘못된 판단을 내릴 수 있음
- 태그, SDK를 통해 사용자 장치에서 데이터 전송 / 출력 (비컨 형태)
- 로그 데이터 활용시 고려할 사항
- 로그 데이터 다루기
- 사이트 방문 횟수, 페이지뷰, 사용자 유도 상황을 집계 / 분석할 때 사용
- 업무 데이터로 관리할 수 없는 열람 페이지, 레퍼러, 사용자 에이전트 등을 저장
- 방문 횟수, 페이지뷰, 액션 수, 장치별 방문 수 등의 지표로 사용 - 최신 상태를 고려한 분석에는 적합하지 않음
- 당시 상황 분석시 편하지만, 이후 데이터 변경을 고려할 경우 별도 가공이 필요할 수 있음
- ex) 상품 카테고리 변경, 사용자 주소 변경 등 - 변경 없이 누적만 하는 데이터로, 추출 결과가 변할 가능성이 적음
- 업무 데이터에 비해 데이터의 정확도는 낮음
- 추출 방법에 따라 크롤러의 로그가 함께 포함되어 집계될 수 있음
- 따라서, 정확한 값이 필요할 경우 적합하지 않음
- 사이트 방문 횟수, 페이지뷰, 사용자 유도 상황을 집계 / 분석할 때 사용
4) 두 데이터를 사용해서 생성되는 가치
- 업무 데이터와 로그 데이터의 가치
- 업무 데이터
- 매출액의 추이
- 어떤 상품이 인기 있는지
- 어떤 상품이 계절성을 가지는지
- 특정 시간이 많이 팔리는지 - 로그 데이터
- 페이지뷰
- 액션
- 해당 데이터에 포함된 값(레퍼러, 사용자 에이전트, 사용자 정의 변수 등)
- 접근 분석 도구의 리포트는 공통으로 사용할 수 있는 형식으로 설계
- 업무 데이터
- 두 데이터를 사용했을 때 발생하는 새로운 가치
- 두 데이터를 함께 활용하라는 결론
- 로그 데이터는 웹사이트에서의 행동을 기록
- 업무 데이터는 웹사이트+오프리안 데이터도 기록
- POS 데이터, 음식점 예약 데이터, 대응 이력 등 - 웹사이트에서의 행동이 오프라인 행동에 어떤 영향을 미치는지 조사 가능
- 특정 미디어 / 광고로 유입된 사용자의 오프라인 계약 가능성 확인
- 음식점 방문 전 웹사이트에서 많이 본 상품이 실제 매장에서 많이 팔리는 경향 확인
- 데이터 사용 가치
- 목표 관리
- 목표를 관리, 설계하고 서비스 / 조직의 성장에 기여 - 서비스 개선
- 대량 데이터 기반으로 사용자 경향 발견하고, 매출 / 서비스 개선에 기여 - 미래 예측
- 과거 경향 기반으로 미래 행동 예측
- 특정 행동의 사용자가 탈퇴하는 경향이 있는지
- 추천 시스템
- 목표 관리
'책읽기' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰] 7장 - 배열 (0) | 2021.07.18 |
---|---|
[파이썬 알고리즘 인터뷰][문자열] 가장 긴 팰린드롬 부분 문자열 (0) | 2021.07.18 |
[쉽게 배우는 운영체제](요약)[Part-1][Ch-2] 컴퓨터의 구조와 성능 향상 (0) | 2021.07.17 |
[스프링 인 액션][Part-1 스프링 기초][Ch-1] 스프링 시작하기 (0) | 2021.07.17 |
[쉽게 배우는 운영체제][Part-1][Ch-1] 운영체제의 개요 (0) | 2021.07.16 |