개발독서/데이터

빅데이터를 지탱하는 기술 (1.3~1.5 스크립트 언어에 의한 특별 분석과 데이터 프레임 & BI 도구와 모니터링)

보리시스템 2024. 10. 13.

[1부 빅데이터의 기초 지식]

1-3 [속성 학습] 스크립트 언어에 의한 특별 분석과 데이터 프레임
1) 데이터 처리와 스크립트 언어 ― 인기 언어인 파이썬과 데이터 프레임
2) 데이터 프레임, 기초 중의 기초 ― ‘배열 안의 배열’로부터 작성
3) 웹 서버의 액세스 로그의 예 ― pandas의 데이터 프레임으로 간단히 처리
4) 시계열 데이터를 대화식으로 집계하기 ― 데이터 프레임을 그대로 사용한 데이터 집계
5) SQL의 결과를 데이터 프레임으로 활용하기

1-4 BI 도구와 모니터링
1) 스프레드시트에 의한 모니터링 ― 프로젝트의 현재 상황 파악하기
2) 데이터에 근거한 의사 결정 ― KPI 모니터링
3) 변화를 파악하고 세부 사항을 이해하기 ― BI 도구의 활용
4) 수작업과 자동화해야 할 것의 경계를 판별하기

1-5 요약

 


 

1부 빅데이터의 기초 지식

 

1-3 [속성 학습] 스크립트 언어에 의한 특별 분석과 데이터 프레임

 

1) 데이터 처리와 스크립트 언어 ― 인기 언어인 파이썬과 데이터 프레임

- 데이터 분석 이전에 데이터 수집이 필요한데 BI 도구로 읽을 수 있도록 원시 데이터를 전처리(preprocessing)해야 함
=> 이를 위해 R, 파이썬 등 '스크립트 언어'를 사용

 


 

2) 데이터 프레임, 기초 중의 기초 ― ‘배열 안의 배열’로부터 작성

- 데이터 프레임
=> 표 형식의 데이터를 추상화한 객체
=> 데이터 프레임을 사용해 스크립트 언어에서 데이터 가공/집계를 할 수 있음

 

  • [보리] 데이터 프레임?
import pandas as pd

# 데이터 생성
data = {
    '이름': ['홍길동', '김철수', '이영희'],
    '나이': [25, 30, 22],
    '도시': ['서울', '부산', '대구']
}

# 데이터 프레임 생성
df = pd.DataFrame(data)

print(df)

# 출력값
    이름   나이    도시
0  홍길동   25   서울
1  김철수   30   부산
2  이영희   22   대구

 


 

3) 웹 서버의 액세스 로그의 예 ― pandas의 데이터 프레임으로 간단히 처리

- 데이터 전처리에 사용할 수 있는 pandas 함수
1) ix: 조건에 일치하는 데이터만 검색 => [보리] 현재 ix는 deprecated 상태로, loc와 iloc로 대체 됨
2) drop: 지정 행/칼럼 삭제
3) rename: 인덱스값/칼럼명 변경
4) dropna: 값이 없는 행/칼럼명 제외
5) fillna: 값이 없는 셀을 지정한 값으로 치환
6) apply: 각 칼럼/행에 함수 적용

 

  • [보리] pandas? 왜 빅데이터에는 적합하지 않을까?

- Pandas? 파이썬에서 데이터 조작 및 분석을 위한 라이브러리

- pandas가 빅데이터에는 적합하지 않은 이유?
1. 메모리 사용
=> 메모리 내(in-memory)에서 데이터를 처리

=> 모든 데이터를 RAM에 올려서 작업을 수행하므로, 데이터 크기가 컴퓨터의 메모리 용량을 초과하면 처리할 수 없음

2. 단일 프로세스 처리
=> 기본적으로 단일 프로세스로 동작

=> 여러 CPU 코어를 효과적으로 활용하지 못하고, 병렬 처리가 불가능

3. 속도 한계
=> 대량의 데이터를 처리할 때 최적화된 구조가 아니므로 복잡한 데이터 조작(그룹화, 병합 등)에서 속도 저하가 발생

4. 분산 처리 지원 부족
=> 기본적으로 단일 머신에서만 동작하므로, 수평 확장이 불가능

=> (비교) 반면 Apache Spark와 같은 도구는 데이터를 여러 노드에 나누어 병렬로 처리할 수 있음

 

  • [보리] pandas 함수 예시
1. ix: 조건에 일치하는 데이터만 검색 => [보리] 현재 ix는 deprecated 상태로, loc와 iloc로 대체 됨

df.loc[df['나이'] > 25]

# loc: 조건에 맞는 행 선택
# 출력값?
     이름  나이   도시
1  김철수  30  부산


df.iloc[0:2, 1:3]

# iloc: 정수 인덱스를 기반으로 행과 열 선택
# 첫 번째 인덱스는 선택할 행을 지정하며, 0부터 2 이전까지의 행을 선택
# 두 번째 인덱스는 열을 선택하며, 콜론(:)은 모든 행을 의미하고, 1:3은 1번째 열부터 3번째 열 이전까지를 선택
# 출력값?
   나이    도시
0   25   서울
1   30   부산
2. drop: 지정 행/칼럼 삭제

df.drop([0], axis=0)
# axis=0는 행 삭제
# 출력값?
    이름   나이    도시
1  김철수   30   부산
2  이영희   22   대구


df.drop(['나이'], axis=1)
# axis=1는 열 삭제
# 출력값?
    이름    도시
0  홍길동   서울
1  김철수   부산
2  이영희   대구
3. rename: 인덱스값/칼럼명 변경

df.rename(columns={'이름': '성명', '나이': '연령'}, inplace=True)
# 칼럼명 변경
# 출력값?
     성명   연령    도시
0  홍길동   25   서울
1  김철수   30   부산
2  이영희   22   대구


df.rename(index={0: 'a', 1: 'b'}, inplace=True)
# 인덱스명 변경
# 출력값?
     성명   연령    도시
a  홍길동   25   서울
b  김철수   30   부산
2  이영희   22   대구
4. dropna: 값이 없는 행/칼럼명 제외

    이름   나이    도시
0  홍길동  25.0    서울
1  김철수  30.0    NaN
2  이영희   NaN    대구
# NaN 데이터가 있는 데이터 프레임 예시


df.dropna(axis=0, how='any')
# NaN이 하나라도 있으면 해당 행을 삭제
# 출력값?
    이름   나이    도시
0  홍길동  25.0   서울


df.dropna(axis=1, how='all')
# 모든 값이 NaN인 열을 삭제
# 출력값?
    이름   나이    도시
0  홍길동  25.0   서울
1  김철수  30.0   NaN
2  이영희   NaN   대구
5. fillna: 값이 없는 셀을 지정한 값으로 치환

df.fillna(0)
# NaN 값을 0으로 대체
# 출력값?
    이름   나이    도시
0  홍길동  25.0   서울
1  김철수  30.0     0
2  이영희   0.0   대구


df.fillna(df.mean())
# NaN 값을 각 열의 평균값으로 대체
# 출력값?
    이름   나이    도시
0  홍길동  25.0    서울
1  김철수  30.0    NaN
2  이영희  27.5    대구
6. apply: 각 칼럼/행에 함수 적용

df.apply(lambda x: x**2 if x.name == '나이' else x)
# 각 열에 대해 제곱 계산
# '나이' 열의 값들을 제곱
# 출력값?
    이름     나이    도시
0  홍길동   625.0   서울
1  김철수   900.0    NaN
2  이영희     NaN   대구


df.apply(lambda row: row['나이'] * 2 if row['도시'] == '서울' else row['나이'], axis=1)
# 각 행에 대해 특정 계산
# '도시' 값이 '서울'인 행의 '나이' 값을 두 배
# axis=1: 각 행에 대해 적용
# 출력값?
    이름   나이    도시
0  홍길동  50.0   서울
1  김철수  30.0   NaN
2  이영희   NaN   대구

 


 

4) 시계열 데이터를 대화식으로 집계하기 ― 데이터 프레임을 그대로 사용한 데이터 집계

- 데이터 프레임을 사용해 데이터를 있는 그대로 집계하는 것도 가능
=> pandas에는 시계열 데이터를 취급하기 위한 다양한 기능이 있음

=> 시간을 인덱스로 지정해 시계열 데이터를 분석할 수 있음 

 

  • 스몰 데이터의 기술 잘 사용하기
- pandas는 분산 시스템이 아니기 때문에 빅데이터를 대응할 수는 없음
=> 어느 정도 데이터양을 감소시킨 후, 스몰 데이터로 처리하는 것이 하나의 방법

=> pandas를 사용하면 여러 데이터 소스로부터 데이터를 읽어 들여 결합하거나, SQL과 스크립트 엄어를 구분해 사용하는 처리를 이용하는 것이 쉽게 가능
=> 스몰 데이터에는 스몰 데이터 기술을 사용하는 것이 효율적이므로 빅데이터 기술을 사용할 필요는 없음

 


 

5) SQL의 결과를 데이터 프레임으로 활용하기

- 데이터 프레임은 실행한 결과로도 만들 수 있음
=> 복잡한 데이터의 집계에는 SQL을 사용하면서 데이터 프레임에 의한 대화형 데이터 처리의 혜택을 받을 수 있음
=> 데이터 집계 부분에서는 웨어하우스나 데이터 레이크를 이용하고, 그 결과를 데이터 프레임으로 변환해 대화형 데이터를 확인하고 가공

 


 

1-4 BI 도구와 모니터링

 

1) 스프레드시트에 의한 모니터링 ― 프로젝트의 현재 상황 파악하기 

- 모니터링(monitoring)
=> 보다 계획적으로 데이터의 변화를 추적해 나가는 것
=> 데이터는 현재 상황을 파악하기 위한 도구로 사용할 수 있음

- 데이터 변화 모니터링 후 예상과 다른 움직임이 있는 경우 사람의 판단이 필요
=> 데이터의 의미를 제대로 이해하기 위해서는 사전 지식이 필요

 


 

2) 데이터에 근거한 의사 결정 ― KPI 모니터링

- 데이터 기반(data-driven) 의사 결정
=> 객관적인 데이터에 근거해 판단

- 스프레드시트 통한 보고서 작성과 한계
=> 스프레드시트는 보고서에 입력하는 숫자를 어디선가 계산해야 한다는 한계가 있음

=> 이를 위해 준비된 '데이터 웨어하우스'에서 '배치 처리'를 실행

 


 

3) 변화를 파악하고 세부 사항을 이해하기 ― BI 도구의 활용

- BI 도구
=> Tableau 등이 있음
=> 고속의 집계 엔진을 내장하고 있어 수백만 레코드 정도의 스몰 데이터는 순식간에 그래프를 그려줌
=> BI 도구로 읽어 들일 정보를 늘려 시각화할 범위를 넓힘

- 모니터링의 기본 전략 및 BI 도구
=> 데이터의 움직임을 모니터링하기 위한 기본 전략은 정기적인 보고를 통해 중요한 변화를 파악하는 것임
=> 원인을 알고 싶다면 원이 되는 데이터로 돌아와 재집계를 반복하면서 자세히 살펴보기

- 원하는 대로 집계 결과를 얻기 위해서는 '시각화하기 쉬운 데이터'를 만들어야 함

 


 

4) 수작업과 자동화해야 할 것의 경계를 판별하기

-  제대로 설계된 데이터가 없다면 BI 도구를 통해 원하는 시각화 데이터를 만들 수 없음
=> 수작업으로 할 수 있는 것은 수작업으로 해야 함

- 자동화하려는 경우에는 데이터 마트 만들기
=> 중요성이 높은(자주 업데이트되고, 다수의 사람에게 공유되는 등) 순으로 자동화

- 데이터를 SQL/스크립트를 사용해 생성하고 BI 도구를 통해 읽는 방법 3가지
=> 가장 범용성이 높은 방법은 2번
1) BI 도구에서 직접 데이터 소스에 접속하기
* 장점: 시스템 구성이 간단
* 단점: BI 도구 측에서 지원하지 않는 데이터 소스에는 접속할 수 없음

2) 데이터 마트를 준비하고, BI 도구에서 열기

* 장점: 어떤 테이블이라도 자유롭게 만들 수 있음
* 단점: 데이터 마트의 설치/운영에 시간이 걸림

3) 웹 방식의 BI 도구를 도입해 CSV 파일 업로드하기

* 장점: 스크립트로 자유롭게 데이터를 가공할 수 있음
* 단점: 데이터 생성/업로드에 프로그래밍이 필요