오픈소스 기반 데이터 분석

1장. 데이터 분석과 오픈소스의 이해

1.1. 데이터 분석의 이해

데이터

  • 분석의 재료가 되는 관찰된 사실
  • 관찰이나 측정을 통해 얻어진 사실이나 기록
  • 그 자체로 의미를 가지기보다는 객관적인 상태의 값
  • 수치, 문자, 특정 시간이나 공간에 대한 기록

정보

  • 데이터를 가공해 문제 해결이나 의사결정에 활용할 수 있는 의미 있는 형태로 변환한 결과물
  • 단순한 사실의 나열이 아닌 데이터 사이의 관계를 파악하거나 새로운 의미를 도출하는 형태
  • 데이터를 수집하여 정리하거나 요약하는 과정에서 정보가 만들어진다.

 

데이터 분석의 정의 (Data Analysis, DA)

  • 데이터에 숨겨진 의미를 발견하고 이를 바탕으로 의사결정에 활용할 수 있는 인사이트를 도출하는 일련의 과정
  • 데이터를 정보로 가공하는 고도의 처리 및 가공의 과정
  • 데이터를 구조화하고 패턴을 파악
  • 특정 현상의 원인을 찾거나 미래를 예측하기 위해 논리적이고 체계적인 접근
  • 단순한 기술적 작업이 아닌 문제 해결과 의사결정 지원을 위한 전문적인 활동
  • 원시 데이터를 수집한 후, 필요한 정보를 추출하고, 데이터를 정제하며, 분석을 통해 의미 있는 결론을 도출하는 일련의 작업 과정

 

데이터 분석의 출발점은 현실 세계에서 발생한 현상에 대한 관측과 기록

 

분석 목적이나 깊이에 따른 4단계 분류

  1.  설명적 분석 descriptive analytics, what happened?
    • 과거와 현재 데이터를 요약하여 무엇이 발생했는지 파악
    • 가장 기초적인 분석 형태
  2. 진단적 분석 diagnotic analytics, why happened?
    • 특정 현상이 발생한 원인을 규명하는 데 초점
    • 왜 발생했는지를 밝히는 것
    • 원인을 찾아내는 과정
    • 데이터를 비교하고 상관관계를 분석하여 현상의 배경을 파악하는 과정
  3. 예측적 분석 predictive analytics, what will happen?
    • 과거 데이터와 현재 데이터를 기반으로 무엇이 발생할 것인지 예측
    • 통계 모델, 회귀분석, 머신러닝 등 기법 활용
    • 미래 상황을 미리 예측함으로써 사전에 대비하거나 기회를 포착
  4. 처방적 분석 prescriptive analytics, what should we do?
    • 어떻게 하면 원하는 결과를 얻을 수 있는지에 대한 해답 제공
    • 데이터 분석의 최종 목표에 해당
    • 단순한 예측을 넘어 최적의 의사결정을 돕는 실현 가능한 전략을 도출
    • 최적화 기법, 시뮬레이션 기법 등 활용

 

PHM(Prognotics and Health Management)

  • 장비나 시스템의 상태를 실시간으로 감시하고, 고장 가능성을 예측하여 최적의 유지보수 및 관리 방안을 제공하는 체계적 접근법
  • 산업 기계, 항공기, 자동차 등 복잡한 장치의 신뢰성과 안전성을 높이기 위해 활용
  • 5단계
    • 계측 measurement / 모니터링 monitoring - 설명적 분석
      • 주로 데이터를 수집하고 실시간으로 현 상태를 확인
      • 시스템의 현황이나 성능 지표 등을 요약하여 제공
    • 진단 diagnostics - 진단적 분석
      • 시스템 상태가 비정상적이거나 고장 발생 시 그 원인을 파악하고 문제의 본질을 탐색
    • 예측 prognostics - 예측적 분석
      • 미래의 성능 저하나 고장 가능성을 미리 파악하여 예방적 조치
      • 교체 계획 수립, 부품의 수명과 유지보수 시기 예측
      • 데이터 패턴과 추세를 기반으로 미래 사건 예측 목표
    • 개선(처방) prescription - 처방적 분석
      • 예측된 상태를 기반으로 최적의 대응책과 유지보수 전략을 결정하여 제공
      • 점검 계획 추천, 교체 시기 제시
      • 예측된 결과를 활용하여 의사결정에 가장 적합한 전략과 조치

 

데이터 분석의 중요성

  • 기존에는 보이지 않던 패턴과 관계 발견 - 의미 있는 인사이트 도출
  • 비효율적인 프로세스 개선, 운영 최적화
  • 사회 전반에 긍정적 영향 (의료 분야 등)
  • 공공 정책 수립 (도로 혼잡도 예측, 범죄 데이터 분석)
  • DDD(Data-Driven Decision Making) - 객관적 근거 바탕 최적의 선택
    • 객관성, 정밀성, 재현 가능성

 

데이터 분석의 발전 과정

  • 1900년대 초반~1970년대 초반 : 전통적인 통계 분석
    • 확률론과 가설 검정 기법 이용
    • 데이터 해석 방식
  • 1980~2000년대: 데이터베이스와 BI 활용
    • 데이터 분석의 패러다임 변화
    • 체계적인 데이터 저장 및 관리 환경 조성 
    • DBMS 도입, RDBMS 널리 사용, SQL 기술 발전
    • 대규모 데이터 웨어하우스 구축
    • 구조화된 데이터 분석 방식 전환
    • 시각적으로 표현하는 BI 도구 도입  (Business intelligence)
  • 2010년대~현재: 빅데이터와 ML의 발전
    • 데이터의 규모와 다양성 증가
    • 오픈소스 프레임워크 개발
    • 맞춤형 마케팅 수행
    • 분산 데이터 처리 기술 발전, 오픈소스 프레임워크 개발
    • 머신러닝 기술이 데이터 분석의 핵심 방법론으로 자리잡음 (패턴 자동으로 학습하여 예측 모델 생성)
  • 현재~미래: 실시간 데이터 분석과 AI 자동화
    • 실시간 데이터 수집 및 분석, 즉각적인 의사결정
    • 즉각적인 의사결정 시스템 구축

 

데이터 분석의 3요소

 

  • 컴퓨터과학
    • 데이터 처리와 분석의 효율성 제공
    • 데이터 분석의 기술적 기반 담당
    • 효과적 수집과 저장, 빠르게 처리하여 분석 결과 도축
    • 웹 스크래핑, 시각화 도구, 데이터 분석 라이브러리, 데이터베이스
  • 통계 및 수학
    • 분석 과정의 정확성과 신뢰성 확보
    • 데이터에 내재된 패턴과 관계를 파악하고, 신뢰할 수 있는 결과를 도출하기 위한 과학적 근거 제공
    • 데이터를 수집하는 단계에서부터 분석 과정 전반에 걸쳐 데이터의 신뢰성과 정확성을 확보하는 데 중요한 역할
  • 도메인 지식
    • 분석 결과의 해석력과 실무 적용성을 높인다
    • 분석 대상이 되는 특정 분야에 대한 전문적인 이해
    • 데이터에서 나타나는 특정 현상을 정확히 해석하고, 데이터 패턴에 숨겨진 의미를 파악하여 현장에 적용 가능한 해결책 도출

 

데이터 분석과 데이터 과학

  • 데이터 과학은 데이터 분석을 포함하면서도 더 포괄적인 개념
  • 데이터 분석은 주어진 데이터를 정리하고 이해하는 데 초점, 데이터 과학은 데이터에서 패턴을 학습하고 예측 모델을 개발하는 데 기술적 접근을 요구
항목 데이터 분석 데이터 과학
개념 수집된 데이터를 정리·가공하여 의미 있는 정보를 도출하는 과정 예측 모델을 만들고, 자동화된 의사결정 시스템을 구축하는 포괄적 과정
접근 방식 통계, 데이터 시각화, 기본적인 머신러닝 등을 활용 통계, 머신러닝, 컴퓨터 프로그래밍, 데이터 엔지니어링 등을 종합적으로 활용
목적 데이터 기반 의사결정 지원이 중심 의사결정의 자동화 및 최적화
범위 데이터 과학의 한 부분 데이터 분석을 포함하는 상위 개념
과정 데이터 수집 → 전처리 → EDA → 분석→ 시각화 → 인사이트 도출 데이터 수집 → 전처리 → 분석 → 자동화 시스템 구현
분야 마케팅, 리포트 작성, 경영 전략 수립 등 제품 추천, 예측 시스템, 자율주행, 인공지능 서비스 등

 

 

 

1.2. 데이터 분석 과정

 

1. 데이터 수집 및 저장

  • 수집 대상 데이터 정의
  • 데이터 수집 경로 선정
    • 내부 데이터: 기업이나 기관 내부에서 생성된 데이터로 데이터베이스, 고객 거래 내역, 직원 근태 기록, 공장 가동률 정보 등 포함
    • 외부 데이터: 외부 기관에서 제공, 정부의 공공데이터, 소셜 미디어 데이터, 연구 기관의 통계 자료 등
  • 데이터 수집 방법 결정
    • 파일 다운로드
    • 데이터베이스: 관계형 데이터베이스에 저장된 데이터를 SQL 등으로 추출
    • 웹 스크래핑
    • API
    • 센서 데이터 활용
  • 데이터 수집 자동화
  • 데이터 저장 방식 선택
    • 데이터 저장data storage: 수집된 데이터를 효율적으로 보관하고, 후속 분석과 활용이 가능하도록 하는 과정
    • 파일 기반 저장
    • 데이터베이스 저장: 다양한 사용자 동시 접근, 정형 데이터 중심
    • 클라우드 기반 저장소: 비정형 대용량 데이터 처리에 적합
  • 수집한 데이터가 분석 목적에 적합한지 검토하는 과정까지 포함
  • 데이터 출처 명확한 확인 필요
  • 데이터 수집 목적을 명확하게 해야 한다

 

2. 데이터 전처리

  • 데이터 분석에서 가장 중요한 과정
  • 데이터를 정리하고 변환하여 분석이 가능하도록 만듦
  • 데이터의 품질을 높이고 분석의 정확성을 보장하기 위한 과정
  • 결측치와 이상치 처리
  • 중복 데이터 제거 및 필터링
  • 데이터 축소 및 변환
  • 다섯 단계
    1. 데이터 측정: 전반적인 분포와 특성을 파악, 전처리 및 분석 방향 설정
    2. 데이터 정제: 오류 수정, 불완전 데이터 처리
    3. 데이터 통합: 하나의 데이터셋으로 결합
    4. 데이터 축소: 차원 축소, 변수 선택
    5. 데이터 변환: 분석에 적합한 형태로 변환. 속성 생성 정규화, 이산화 등

 

3. 데이터 분석

  • 의미 있는 패턴을 발견하고 의사결정을 위한 유용한 정보 도출
  • 데이터 간 관계 파악 및 예측 모델 구축하는 고급 분석 기법 활용
  • 탐색적 데이터 분석(EDA) 수행
    • 데이터의 분포와 특성을 직관적으로 이해하기 위해 수행
    • 데이터를 요약하고 시각적으로 표현해서 주요 패턴과 이상치를 파악한다
    • 변수 간의 관계 분석
  • 통계 분석, 머신러닝 및 딥러닝 과정 포함
  • 분석 계획 수립
  • 데이터 분석 기법 선택
  • 데이터 분석 결과 도출
  • 클러스터링, 연관 규칙 분석(특정 사건이 발생할 때 다른 사건이 함께 발생할 확률 분석)과 같은 데이터 마이닝 기법 사용

 

4. 데이터 시각화

  • 기초 통계량 시각화
  • 데이터 유형별 시각화
  • 시각화 도구 활용
  • 데이터 탐색과 패턴 발견: 변수간 관계 파악, 이상치 탐색
  • 복잡한 데이터의 요약
  • 데이터 분석 결과 전달
  • 미래 변화 예측에 활용

 

1.3. 데이터의 분류

데이터의 속성에 따른 분류

  • 질적 데이터qualitative data(범주형 데이터): 주로 범주화하거나 속성, 성질, 상태 등을 나타냄. 집계, 분류 등에 사용
    • 명목형 데이터nominal data: 단순히 범주로 구분, 범주 사이에 순서나 계층 없음 (성별, 혈액형)
    • 서열형 데이터ordinal data: 범주 사이에 명확한 순서 (만족도 조사)
  • 양적 데이터quantitative data(수치형 데이터): 숫자 형태로 표현, 측정과 계량 가능. 통계적 분석 및 수학적 연산에 사용
    • 이산형 데이터discrete: 특정한 정수값을 가짐, 수량 등
    • 연속형 데이터continuous: 특정 범위 내의 모든 값을 가질 수 있음, 신장, 온도, 몸무게 등

 

데이터의 형태에 따른 분류

(데이터를 저장하고 검색하는 데 적절한 방법을 선택하고, 활용 목적에 맞는 적절한 분석 기법 적용을 위해 필요한 분류)

  • 정형 데이터structured data: 일정한 규칙과 구조, 행과 열로 구성된 표 형태
    • 각 열은 특정 속성, 행은 여러 속성값의 집합
    • SQL 등의 표준화된 언어로 효율적인 분석 및 접근
  • 비정형 데이터unstructured: 문장, 이미지, 영상, 음성 등
    • 컴퓨터가 인식하고 분석하려면 머신러닝 등의 인공지능 기법 필요
    • 정부량이 많고 숨겨진 의미를 담고 있다
  • 반정형 데이터semi-structured: 데이터 항목간 규칙이나 구조 존재, 완전한 표로 고정되진 않음
    • xml, json 등
    • 빅데이터 시대에 들어서며 활용 빈도 증가
    • 파싱 등 작업을 거쳐 정형 데이터로 변환하여 테이블 형태로 다루기도 함

 

1.4. 오픈소스 환경

오픈소스의 등장 배경과 철학

  • 리처드 스톨먼: GNU 프로젝트 시작, 자유 소프트웨어 재단(FSF) 설립, 소프트웨어 사용 조건 명시 GPL 제안
  • 에릭 레이먼드: 성당과 바자(1997)
    • OSI(Open Source Initiative) 설립의 시초

 

오픈소스 소프트웨어: 소스코드가 공개되어 누구나 자유롭게 접근, 사용, 복제, 수정, 재배포할 수 있는 소프트웨어

 

오픈소스 정의 OSD

  1. 소프트웨어는 소스코드 형태로 배포되어야 하며, 누구나 이를 수정하고 분석할 수 있어야 한다
  2. 소프트웨어의 재배포가 허용되어야 하며, 이는 상업적 목적의 재배포도 포함한다
  3. 사용이나 배포에 특정 집단이나 분야에 대한 차별이 없어야 한다.
  4. 파생 소프트웨어에 동일한 라이선스를 적용해야 한다.
  5. 기술 중립성 보장

 

기술 측면에서의 특징

  • 투명성과 신뢰성이 높다. 폐쇄형 소프트웨어보다 더 높은 수준의 보안성 확보
  • 지속적인 개선과 빠른 오류 수정 가능
  • 모듈화와 재사용성이 뛰어나다. > 소프트웨어 재사용 촉진, 개발 속도 향상
  • 사용자와 개발자 간의 경계를 허문다.

 

오픈소스의 생태계와 발전 방식

  • 깃: 중앙 서버 없이도 각 참여자가 독립적으로 코드의 전체 이력 관리, 병합

 

오픈 데이터: 누구나 자유롭게 접근할 수 있고, 재사용 및 재배포가 가능한 데이터. 비영리적 목적 및 상업적 활용 허용

 

오픈 데이터의 조건

  • 기계 판독 가능성: 컴퓨터 프로그램이 읽고 분석할 수 있어야 함
  • 비차별적 접근 보장
  • 데이터의 사용에 제한을 두지 않고, 라이선스를 통해 자유로운 재사용과 재배포 권리 명시

 

파이썬: 오픈소스 기반의 패키지 관리 시스템을 중심으로 작동

  • IDLE: 파이썬 인터프리터를 설치하면 기본적으로 제공되는 개발 환경
  • Jupyter Notebook: 데이터 분석을 위해 가장 널리 사용되는 개발 환경

 

파이썬 패키지와 라이브러리

  • Selenium: 웹 브라우저를 자동으로 제어하는 오픈소스 라이브러리
  • lxml: HTML 및 XML 문서를 효율적으로 파싱하고 처리할 수 있도록 지원하는 파이썬의 강력한 라이브러리
  • Numpy: 고속 수치 연산을 위한 핵심 라이브러리, 벡터 및 행렬 연산 최적화
  • Pandas: 데이터를 효율적으로 조작하고 분석할 수 있도록 설계된 라이브러리
  • Statsmodels: 파이썬 기반 오픈소스 통계 분석 라이브러리. 다양한 전통 통계 기법 지원
  • Matplotlib: 데이터 시각적 표현 기능 제공 라이브러리
  • Seaborn: Matplotlib 기반 보다 세련된 시각화 제공. 다양한 통계 그래프 구현(히트맵, 분포 그래프, 박스플롯 등)
  • Scikit-learn: 머신러니 모델 구축 및 평가에 필요한 라이브러리 제공. 선형 회귀, 의사결정 트리, 랜덤 포레스트 등

 

2장. 데이터 분석을 위한 파이썬

2.1. 리스트와 딕셔너리

반복 가능한 객체: 리스트, 튜플, 딕셔너리, 문자열, 집합, range 객체 등

 

리스트 슬라이싱

numbers = [1, 2, 3, 4, 5, 6, 7]
reversed_list = [::-1]
print(reversed_list) # 7, 6, 5, 4, 3, 2, 1

 

딕셔너리 컴프리헨션

squares = {i: i ** 2 for i in range(5)}
city_population = {
	'서울': 900, '부산': 330
}

large_cities = {city: pop for city, pop in city_population.items() if pop >= 500}

 

 

C 스타일 포맷팅

item = 프린터
price = 300000
print('상품명: %s, 가격: %d' % (item, price))

 

 

str.format()

print('Hello, {}'.format('홍길동'))	# Hello, 홍길동
print('{0} {1}'.format('홍길동', 30))	# 홍길동 30
print('{name}'.format(name='홍길동'))	# 홍길동
print('{0} {age}세'.format('홍길동', age=30))	# 홍길동 30세

 

 

f-문자열: python 3.6 버전부터 도입된 문자열 포맷팅 방식

name=홍길동
print(f'이름: {name}')

 

 

with

  • with 블록이 종료되면 파일이 자동으로 닫혀서 file.close()를 명시적으로 안 닫아도 된다
  • 여러 개의 컨텍스트를 동시에 관리할수도 있다

 

함수형 프로그래밍

  • 데이터 변경을 최소화(상태 변경 지양)하고 순수 함수를 활용하여 부작용을 줄이는 것이 목표
  • 코드의 예측 가능성과 재사용성이 높아진다
  • 디버깅을 용이하게 하고 병렬 처리를 효율적으로 수행한다
  • 선언적 프로그래밍 방식을 취한다

 

람다 함수

  • 함수를 정의하는 동시에 사용할 수 있다
is_even = lambda x: '짝수' if x % 2 == 0 else '홀수'

 

 

map(): 데이터 변환

  • 적용할 함수와 반복 가능한 객체를 매개변수로 받아 리스트의 각 요소에 지정된 함수를 적용한 결과를 반환한다
  • 함수의 결과는 map()객체이므로 list() 함수 등을 통해서 리스트로 변환해야 한다.
  • N개의 입력 -> N개의 출력
words = ['python', 'data']
upper_words = list(map(lambda word: word.upper(), words))

 

 

filter(): 필터링

numbers = [10, 15, 20]
even_numbers = list(filter(lambda n: n % 2 == 0, numbers))

 

reduce(): 누적 연산

  • 리스트에 포함된 숫자의 총합을 구하거나, 문자열을 하나로 합치거나, 최댓값을 찾는 등의 작업 등 누적 연산 수행
  • N개의 입력 -> 1개의 출력
from functools import reduce
numbers = [1, 2, 3, 4, 5]
total_sum = reduce(lambda x, y: x + y, numbers)

numbers2 = [3, 2, 7]
max_number = reduce(lambda x, y: x if x > y else y, numbers2)

 

 

 

3장. 데이터 수집과 저장

3.1. 데이터 수집이란

데이터 수집: 단순히 데이터를 모으는 행위뿐만 아니라 결과 생성에 유용한 데이터의 위치를 파악하고 수집된 데이터를 분석에 적합한 형태로 준비하는 과정까지를 포함

 

데이터 사일로 현상: 기업이나 조직 내에서 부서별로 데이터를 각자 관리하면서 서로 공유하지 않고 고립된 상태

 

좋은 데이터의 조건 (ISO 8000의 데이터 품질 평가 기준)

  • 정확성
    • 실제 현실을 얼마나 정확하게 반영하고 있는가
    • 데이터 정제 과정을 통한 오류 수정 과정 필요
  • 완전성
    • 필요한 정보가 온전히 포함되어 있는가
    • 완전성이 결여되면 분석 결과의 편향 초래
    • 결측치를 확인하고 데이터를 정비해야 함
  • 일관성
    • 서로 다른 시스템이나 소스에서의 정보 일관성 유지
    • 데이터 표준 정의, 동기화 자동화 등 필요
  • 유효성
    • 데이터가 분석 목적에 적합한가
  • 적시성
    • 데이터가 최신 상태를 유지하고 있는가
  • 상호운용성
    • 데이터가 다양한 플랫폼, 시스템, 소프트웨어에서 원활하게 공유되고 확인될 수 있는가
    • 데이터의 표준화와 구조화가 핵심 요소
    • 공통된 데이터 형식을 정의하고 API 등으로 시스템간 데이터 연계를 원활히 해야한다

 

3.2. 데이터의 유형

 

정형 데이터

  • 표 형태의 미리 정의된 스키마에 따라 행과 열로 구성된 테이블 형태로 저장 (스키마: 데이터 구성을 설명하는 구조적 설계도)
  • 유형
    • 수치형: 나이, 키, 몸무게, 가격, 온도, 판매량 등
    • 날짜형: 생년월일, 배송일 등
    • 범주형: 성별, 지역, 직업, 학력, 만족도 등
  • 특징
    • 구조화: 데이터의 유형, 길이, 제약 조건 등이 사전에 명확하게 정의
    • 정량적: 수치 연산, 조건 기반 필터링, 통계 분석 등에 적합
    • 관계형 데이터베이스에 적합: 효율적인 저장, 검색, 관리
    • 분석 용이: SQL 등의 표준화된 쿼리 언어로 데이터 추출, 변환, 분석 체계적 수행 가능
  • 한계
    • 구조적 경직성: 예상치 못한 데이터 유형 수용 위해 스키마 변경 필요 - 상당한 유지보수 비용
    • 텍스트의 맥락적 의미나 감정 뉘앙스 등 복잡한 정보 효과적으로 담아내기 어렵다

 

비정형 데이터

  • 비구조화
  • 다양한 형태: 고유한 특성과 처리 방법 요구
  • 저장 및 관리의 어려움: 특수한 저장소나 분산 파일 시스템 활용, 대량의 저장소 필요
  • 분석의 어려움: 고도의 분석 기술 필요
  • 유형
    • 텍스트 데이터
    • 이미지 데이터
    • 음성 데이터
    • 동영상 데이터
  • 전체 데이터의 80%를 차지한다
  • 분석이 어렵지만 다양한 정보와 맥락을 담고 있어 인사이트 발견 능력이 중요함
  • 인공지능 발전으로 처리 및 분석 성능 향상

 

반정형 데이터

  • 어느 정도의 구조화된 요소 포함, 엄격한 스키마나 고정 형식 따르지는 않음
  • 정형 데이터보다 더 풍부한 정보와 복잡한 관계 표현
  • 분석을 위해서는 구조를 파악하고 데이터를 정제하는 과정이 추가적으로 필요
  • 특징
    • 일정 수준의 구조: 태그, 키-값 쌍, 계층적 구조 등으로 데이터 요소간 관계와 의미 표현
    • 다양한 형태:JSON, XML, YAML, HTML, 이메일 등 다양한 형태
    • 유연성: 스키마 변경이 용이하고 확장성이 높음
    • 분석 방법: 정규현식, 파서 등 특화된 도구와 기법, NoSQL 데이터베이스나 문서 지향 데이터베이스에서 효과적
  • 유형
    • JSON 데이터: API 응답 데이터, 설정 파일 등
    • XML 데이터: 웹 서비스 데이터, 전자 문서 등
    • HTML 데이터: 웹 페이지 데이터
    • 로그 파일
    • 이메일

 

3.3. 데이터 수집 방법

 

파일

  • 가장 기본적이고 널리 사용되는 방법
  • 일회성 분석이나 배치 처리 방식의 분석에 적합
  • CSV
    • 쉼표로 구분된 텍스트 데이터 파일로 표 형태의 데이터 저장
    • 높은 범용성 - 대부분의 프로그래밍 언어에서 기본적으로 지원
    • 복잡한 데이터 구조나 계층적 관계를 표현하기 어렵다
    • 이미지, 동영상 등 바이너리 데이터는 직접 저장 불가
    • 데이터 타입 위한 추가 처리 필요
  • JSON
    • JavaScript 객체 표기법을 따르는 텍스트 데이터 파일
    • 중첩된 구조 표현 가능, 계층적 구조 표현
    • json.load(): 파일에 저장된 데이터 읽어옴
    • json.loads(): 문자열로 표현된 데이터 읽어옴
    • pd.read_json(): orient의 파라미터로 json 데이터의 저장 형식 알려줌
  • 텍스트 파일
    • 비구조화 데이터의 저장에 적합하다
    • 구조화되어 있지 않아서 텍스트 정제, 패턴 추출, 토큰화와 같은 추가적인 작업이 필수적
    • 파이썬 내장 함수인 open(), read(), readline(), readlines()로 파일 읽어옴
    • re 라이브러리: 정규표현식으로 원하는 데이터 추출

 

API

  • 소프트웨어 간의 상호작용을 가능하게 하는 인터페이스
  • 특정 시스템이나 서비스가 제공하는 기능이나 데이터를 외부 프로그램이 접근할 수 있도록 미리 정의된 규칙과 명령어 집합
  • http
    • 가장 일반적으로 사용되는 프로토콜
    • 웹 브라우저가 웹 서버와 통신할 때 사용
    • 요청-응답 방식: 클라이언트가 요청하면 서버가 응답
  •  WebSocket
    • HTTP와 달리 서버와 클라이언트 사이의 상호작용이 실시간 지속적으로 이루어진다
    • 초기 연결 설정 이후 자유로운 데이터 송수신
  • GraphQL
    • 데이터 질의 언어이자 통신 프로토콜
    • 단일 엔드포인트 연결
    • 학습 필요, 캐싱 처리 어려움
    • 클라이언트가 필요한 데이터의 구조와 속성을 명시적으로 요청하여 필요한 것만 가져옴
  • Requests 라이브러리

 

웹 스크래핑

  • selenium
    • 웹 사이트 상호작용을 통해 원하는 데이터 수집
  • lxml: HTML과 XML 문서를 효과적으로 읽고 특정 정보를 추출하며 필요에 따라 문서를 수정하거나 생성
    • BeautifulSoup 등 다른 파서 라이브러리에 비해 빠른 처리 속도
  • Headless 모드: 웹 브라우저의 시각적인 부분을 생략한 채 내부적으로만 실행
  • 웹 크롤링과의 차이점 - 스크래핑은 특정 페이지에서 데이터 추출, 크롤링은 여러 페이지 탐색

 

 

3.4. 데이터 저장

파일

  • 운영체제에 관계없이 호환성이 뛰어남
  • 대규모 데이터 처리에는 비효율적(순차적으로 데이터를 읽고 쓰는 방식)
  • 데이터 무결성과 보안 측면에서 취약
  • CSV
import pandas as pd

data = {
    'student_id': [101, 102, 103, 104, 105],
    'database_score': [85, 76, 92, 63, 88],
    'cloudcomputing_score': [78, 82, 95, 70, 84],
    'python_score': [92, 78, 85, 75, 91],
    'watch_rate': [0.95, 0.87, 0.99, 0.80, 0.93]
}
## DataFrame 생성
df = pd.DataFrame(data)
df

## CSV 형식 저장
df.to_csv('Chapter 4/student_analysis.csv', encoding='utf-8', index=False)

 

  • JSON
### 라이브러리 임포트
import json
import pandas as pd

data = {
    "이름": "홍길동",
    "나이": 25,
    "거주지": "서울",
    "관심사": ["프로그래밍", "데이터 분석", "여행"]
}

## json.dump를 이용한 저장
with open('Chapter 4/output.json', mode='w', encoding='utf-8') as f:	# 파일 생성
    json.dump(data, f, indent=4, ensure_ascii=False)

## DataFrame을 이용한 저장
df = pd.DataFrame(data)
df.to_json('Chapter 4/output_df.json', orient='records', indent=4, force_ascii=False)	# records: DataFrame의 각 행을 JSON 객체로 변환해 리스트로 만듦

df2 = pd.DataFrame([data])
df2.to_json('Chapter 4/output_df2.json', orient='columns', indent=4, force_ascii=False)

 

 

데이터베이스

  • 비관계형 데이터베이스
    • 문서, 키-값 쌍, 그래프 형태 등 다양한 유연한 방식으로 데이터 보관
    • 분산 처리와 확장성 측면에서 강점

 

 

3.5. Pandas의 DataFrame 이해

 

DataFrame의 구성 요소

 

  • DataFrame 생성 시 정수형 인덱스가 자동 부여
    • set_index() 메소드 사용해서 특정 컬럼 인덱스로 설정 가능
  • 데이터는 DataFrame 내부에 NumPy의 배열 형태로 저장

 

DataFrame 생성 함수

  • from_dict(), from_records()
  • read_csv(), read_json(), read_excel()
  • read_html(), read_clipboard(), read_sql

 

DataFrame 저장

  • pickle: 파이썬 전용 형식으로 DataFrame의 데이터를 그대로 저장할 수 있지만 다른 프로그래밍 언어와의 호환성은 떨어진다

 

4장. 데이터 전처리

4.1. 데이터 전처리란

 

데이터의 품질

  • GIGO Garbage In, Garbage Out: 잘못된 데이터를 입력하면 잘못된 결과가 도출된다.

 

데이터 전처리의 정의

  • 데이터 분석 전에 데이터를 정제하고 분석에 적합한 형태로 변환

 

데이터 전처리 과정

  • 측정 Measurement
    • 분포, 중심 경향 등 데이터의 구조와 패턴을 이해하고 전처리의 필요 여부 판단
    • 통계적 특성을 알면 분석 방법론, 모델링 전략 선택에 도움이 된다
    • 데이터 유형 확인 필요
    • 범주형 데이터의 경우에는 각 범주의 빈도분석이 주로 이루어진다
  • 정리/정제 Cleaning
    • 데이터에 포함된 노이즈를 제거하고 비일관성을 수정
    • 결측치, 이상치 등 오류 데이터 찾아내고 적절하게 처리
    • 결측치 처리 - 데이터 정제의 핵심 과정
      1. 결측치 포함 레코드 삭제
      2. 사람이 직접 결측치 보간: 정확하지만 대규모에는 비효율적
      3. unknown 등 전역 상수 대입: 특정 패턴으로 오해될 수 있음
      4. 평균값, 중앙값으로 보완
      5. 동일한 클래스 내 평균값이나 중앙값
      6. 회귀분석, 베이지안 추론 등 통계적 기법으로 예측
    • 이상치: 데이터에 포함된 불규칙한 변동이나 오류
      • 데이터 평활화 기법: 주변 데이터의 평균이나 중앙값 이용
      • 이상치 탐지 기법: 특정 기준에서 벗어난 값 제거
  • 통합 Integration
    • 여러 소스에서 수집한 데이터를 결합하여 하나의 일관된 데이터 저장소로 만든다
    • 명칭 충돌, 중복 등을 해결하는 작업 포함
    • 개체 식별: 서로 다른 데이터 소스에서 동일한 개체를 나타내는 값이 다를 경우 이를 올바르게 연결해야 한다.
    • 중복된 데이터를 탐지하고 하나의 대표값으로 정리
    • 같은 데이터 값이 서로 다른 기준으로 저장되는 경우 방식 통일
  • 축소 Reduction
    • 데이터의 일부 속성 제거, 집계 통한 요약, 군집화로 차원 축소 등
    • 필요한 이유
      1. 연산 속도의 향상
      2. 저장 공간 절약
      3. 모델의 성능 향상
      4. 해석 용이성
    • 방법
      • 군집화 기법: 유사한 특성을 가진 데이터들을 하나의 cluster로 묶는다. 각 군집의 대표값만 사용하여 데이터 축소
      • 샘플링 기법: 일부를 무작위로 선택해서 보다 작은 데이터 부분 집합으로 원본 데이터를 대표하게 한다.
  • 변환 Transformation
    • 데이터의 형식 변경, 특정 범위로 정규화하여 스케일을 맞춘다 
    • 평활화smoothing
      • 데이터에 포함된 잡음 제거 (e.g., 주식 시장 분석에서의 이동평균 기법)
    • 속성 생성
      • 기존 데이터를 활용하여 새로운 속성 생성 (e.g., 생년월일로 나이 생성)
    • 집계
      • 데이터를 요약하여 더 높은 수준의 분석이 가능하게 함 (e.g., 일별 매출 데이터를 월별, 연도별로 합산)
      • 데이터 추상화 수준 조정
    • 정규화
      • 데이터의 값을 일정한 범위로 변환
      • 모든 값이 동일한 스케일을 가져 분석 결과의 정확성이 향상된다
    • 이산화
      • 연속형 데이터를 일정한 구간으로 나누어 범주형 데이터로 변환

 

+) 데이터 통합, 데이터 축소 관계 후 새롭게 정제가 필요한 데이터가 만들어 질 수 있다. (단계가 서로 유기적 관계)

 

 

데이터 전처리의 어려움

  • 방대한 데이터의 양과 다양한 데이터 형태
  • 데이터 문제의 해결 방법이 다양하여 분석가의 주관적 판단이 개입된다
    • 판단은 데이터의 특성과 분석 목표에 따라 달라진다
  • 시간과 노력의 소모
  • 기술적인 어려움
    • 프로그래밍 언어, 데이터 분석 라이브러리에 대한 이해 필요

 

4.2. Pandas를 이용한 데이터 측정

데이터 측정 기준

  1. 전체 데이터 측정: 데이터의 전반적인 경향과 특성 파악
  2. 레코드별 측정: 개별 객체의 특성을 구체적으로 이해
  3. 그룹별 측정: 집단 간 차이를 비교하여 숨겨진 패턴을 발견

 

요약 통계 지표

  • 사분위 범위: Q3(75%) - Q1(25%):, 중앙 50% 구간의 범위를 나타내며 이상치 탐지에 활용

 

기타 통계 지표

  • 왜도: 데이터 분포가 평균을 중심으로 대칭적인지, 한쪽으로 치우쳤는지 나타냄
  • 첨도: 데이터 분포의 뾰족한 정도. 이상치의 빈도 파악에 유용

 

describe()

  • 데이터의 기초 통계량을 자동으로 계산해 요약
  • 데이터의 종류(수치형, 범주형)에 따라 서로 다른 통계 요약 정보 출력
# 모든 데이터 타입 측정
df.describe(include='all')

# 수치형 데이터 측정
df.describe(include=[np.number])

# 범주형 데이터 측정
df.describe(include=['object'])
# DataFrame 열순서 변경
reordered_cols = df[['학과', '이름', '학년', '동아리', '학점']]

# DataFrame 열이름 변경
renamed_df = df.rename(columns={'이름': '학생명', '학점': '평점'})

 

  • loc: 인덱스 이름 또는 조건을 사용하여 행 선택
  • iloc: 정수 위치를 기반으로 행 선택
#DataFrame 행 선택
df.loc['김철수']
df.loc[['이영희', '정소희']]
df.loc['김철수':'박민수']   # python indexing도 가능

#DataFrame 위치 기반 행 선택
df.iloc[1]
df.iloc[[2, 3]]

#DataFrame 조건 기반 선택
df.loc[[True, False, True, False, False]]

# 여러 조건 결합
df[(df['학년'] == 2) & (df['학점'] >= 3.7)]
#DataFrame 인덱스 지정
df = df.set_index('이름')

 

#DataFrame 단일 열 오름차순, 내림차순 정렬
df.sort_values(by='학점')
df.sort_values(by='학점', ascending=False)

#DataFrame 복수 열 오름차순, 내림차순 정렬
df.sort_values(by=['학년', '학점'], ascending=[True, False])

#DataFrame 인덱스 기준 오름차순, 내림차순 정렬
df.sort_index(ascending=False)

 

 

4.3. Pandas를 이용한 데이터 정제

 

결측치 찾기

  • 행별 결측치 개수 알고 싶다면 sum(axis = 1) 매개변수 사용
## 결측치 여부 확인
df.isnull()

## 열별 결측치 개수 확인 
df.isnull().sum()

# 행별 결측치 개수 확인
df.isnull().sum(axis=1)

## 특정 행 결측치 확인
df[df.isnull().any(axis=1)] # any: 1개 이상 있는 것

## 특정 열 결측치 확인
df[df['나이'].isnull()]

## 결측치가 아닌 항목 확인
df.notnull()

## 결측치 비율
# 전체 개수: 가로(shape[0]) * 세로
df.isnull().sum().sum() / (df.shape[0] * df.shape[1]) * 100
import numpy as np
import pandas as pd

### 시각화 라이브러리 임포트
import seaborn as sns
import missingno as msno

data = {'이름': ['김철수', '이영희', '박민수', '최지훈', '정소희'],
        '나이': [25, 30, np.nan, 22, 35],
        '도시': ['서울', None, '인천', '서울', '대전'],
        '점수': [90, 85, np.nan, 80, 92]}
df = pd.DataFrame(data)

### 결측치 히트맵
plt.figure(figsize=(8, 6))
sns.heatmap(df.isnull(), cbar=False)
plt.title("결측치 히트맵")
plt.show()

### 결측치 매트릭스
msno.matrix(df)
plt.title("결측치 매트릭스")
plt.show()

# 하얀색이 결측치 있는 부분

 

 

이상치 찾기

  • 통계적 방법: IQR(사분위 범위) 사용
    • 사분위수 기준으로 데이터 분포의 중심 50% 범위를 벗어나는 데이터를 이상치로 간주
    • 비정규 또는 이상치가 많은 데이터에 적합
    • 어떤 값이 (Q1-1.5*IQR) 보다 작거나 (Q3 + 1.5 * IQR) 보다 크면 이상치로 간주
    • pandas quantile() 메서드 사용해서 데이터의 Q1, Q3 값 쉽게 계산
### 사분위 범위 경계값 계산
q1 = df['점수'].quantile(0.25)
q3 = df['점수'].quantile(0.75)
iqr = q3 - q1
하한값 = q1 - 1.5 * iqr
상한값 = q3 + 1.5 * iqr

 

  • 통계적 방법: Z-score 사용
    • 데이터 값이 평균으로부터 표준편차의 몇 배만큼 떨어져 있는지 수치화
    • (데이터 값-평균) / 표준편차
    • 데이터가 정규분포를 따른다고 가정할 때 접합
    • Z-score의 절댓값이 특정 임계값을 초과하는 경우 해당 데이터 포인트를 이상치로 판단
### Z-점수 계산
점수_평균 = df['점수'].mean()
점수_표준편차 = df['점수'].std()
df['점수_Z'] = (df['점수'] - 점수_평균) / 점수_표준편차

### 임계값 설정 및 이상치 여부 판단
임계값 = 2  # Z-score가 2가 넘어가면 이상치!
df['이상치여부'] = df['점수_Z'].abs() > 임계값

### 이상치 비율 출력
df['이상치여부'].mean() * 100   # True가 1, False가 0이므로 평균 이용

 

 

4.4. Pandas를 이용한 데이터 문제 해결

제거 전략

  • 결측치나 이상치를 포함하는 행 또는 열을 데이터셋에서 완전히 삭제
  • 구현이 간단하고 빠르게 적용
  • pandas의 dropna()
  • thresh 매개변수를 사용하여 특정 개수 이상의 결측치가 있는 행 또는 열만 제거

 

 

대치 전략 imputation

  • 결측치나 이상치를 적절한 값으로 대체
  • pandas의 fillna()

 

보간 전략 interpolation

  • 주변 데이터 포인트의 관계를 이용하여 결측치를 추정
  • 시계열, 공간 데이터 등 데이터 포인트간 논리적 연속성이 있는 경우 효과적
# 결측치가 1개보다 적은 것만 남긴다
df_cleaned = df.dropna(thresh=df.shape[1] - 1)

### 나이, 소득 평균값 대치 및 결과 출력
df_cleaned.loc[:, ['나이', '소득']] = df_cleaned[['나이', '소득']].fillna(df_cleaned[['나이', '소득']].mean())

### 지출, 평균구매횟수 선형보간법 적용
df_cleaned.loc[:, ['지출', '평균구매횟수']] = df_cleaned[['지출', '평균구매횟수']].interpolate(method='linear')

 

 

Pandas 데이터 값 변경

### replace를 이용한 Seoul -> 서울
df['city'] = df['city'].replace('Seoul', '서울')

### replace를 이용한 None -> 미정, Incheon -> 인천
df['city'] = df['city'].replace({None: '미정', 'Incheon': '인천'})

### map을 이용한 값 변경
df = pd.DataFrame(data)
city_map = {'Seoul': '서울특별시', None: '미정', 'Incheon':'인천광역시', 'Daejeon':'대전광역시'}
df['city'] = df['city'].map(city_map)

df['age_str'] = df['age'].map(lambda x : f'{x}살' if pd.notna(x) else '알수없음')

### apply 함수를 이용한 값 변경
df['age_apply'] = df['age'].apply(lambda x: x*2 if pd.notna(x) else None)

### apply 함수를 이용한 행단위 값 변경
def age_plus_score(row):
    age = row['age'] if pd.notna(row['age']) else 0
    score = row['score'] if pd.notna(row['score']) else 0
    return age + score

df['age_plus_score'] = df.apply(age_plus_score, axis=1) #axis-행단위 적용

### loc 인덱스를 이용한 값 변경
df.loc[df['score'] < 90, 'score'] = 90

### where 함수를 이용한 값 변경(age가 30 이상인 값만 유지)
df['age_where'] = df['age'].where(df['age']>= 30, other=0)

 

 

날짜 데이터 다루기

### datetime 타입 변환
df_date['date'] = pd.to_datetime(df_date['date_str'])
df_date.info()

### 날짜 데이터 분리
df_date['date'].dt.year
df_date['date'].dt.day_name()

### 날짜 데이터 포멧 변경
df_date['date_formatted'] = df_date['date'].dt.strftime('%Y/%m/%d')

 

 

데이터 통합

  • 여러 데이터셋을 통합하여 분석을 위한 최종 데이터셋 구성
  • pd.merge(): SQL의 JOIN과 유사
## 판매, 거래 데이터 통합
train_with_trans = pd.merge(
    train_cleaned, transaction,
    on=['date', 'store_nbr'],
    how='left'
)

## 매장 데이터 통합
train_with_store = pd.merge(
    train_with_trans, stores,
    on=['store_nbr'],
    how='left'
)

 

5장. 데이터 분석

5.1. 데이터 분석의 이해

 

데이터 분석: 데이터에서 의미 있는 패턴과 인사이트를 발견하여 합리적인 의사결정 지원

 

데이터 분석의 어려움

  • 데이터 품질 문제: 결측치, 이상치, 중복 불일치 등
  • 데이터의 규모와 복잡성 문제 (5V: 양Volume, 생성 속도Velocity, 다양성Variety, 진실성Veracity, 가치Value)
  • 적절한 분석 방법론 선택의 어려움
  • 분석 결과 해석과 커뮤니케이션의 어려움
    • 블랙박스 문제: 복잡한 기계학습 모델의 경우

 

t-검정의 주요 목적: 두 집단의 평균 차이 검정 (p-값이 작을수록 귀무가설 기각 증거가 강해진다

ANOVA(분산분석): 세 개 이상의 그룹 간 평균 차이를 한 번에 검정하는 통계적 방법

시계열분석: 시간에 따라 순서대로 측정된 데이터 분석

시계열 데이터의 특성: 추세, 계절성, 순환성, 불규칙성

 

5.6. 딥러닝 기반 분석 방법론

TensorFlow: 구글이 개발한 오픈소스 기계학습 프레임워크

Keras: TensorFlow 위에 구축된 고수준 API

 

 

6장. 데이터 시각화

6.1. 데이터 시각화란

데이터 유형에 따른 시각화 방법

  • 범주형 데이터: 막대 그래프, 파이 차트, 도넛 차트
  • 수치형 데이터: 선 그래프, 히스토그램, 산점도, 박스 플롯, 바이올린 플롯
  • 시계열 데이터: 선 그래프, 영역 그래프, 히트맵

 

6.2. Matplotlib 라이브러리

파이썬에서 데이터를 시각화하는 데 가장 널리 사용되는 라이브러리

 

고급 시각화 기법

  • 트리맵: 계층적 데이터를 시각화하는 데 사용