School/COSE471 데이터과학

Chapter 3. Data Munging

영이맞음 2023. 3. 25. 15:37

Typical Data Science Pipeline

Data Munging / Data wrangling

- 데이터를 얻고 분석을 위해 준비/정리하는 것

 

데이터과학에 사용하는 언어

- Python: 라이브러리, 피쳐 등 포함 - regular expressions

* regular expression 예

    - [hc]at : hat or cat

    - .at : .자리에 아무거나 들어갈 수 있음

    - ab*c : b가 0개 이상 있어야 함

    - ab+c : b가 1개 이상 있어야 함

- R: 통계학자들이 주로 사용

- Matlab: 행렬

- Java/C++: 빅데이터 시스템을 위한 언어

- Excel: bread and butter toool

 

노트북 환경

- reproducible, tweakable, documented

- 데이터 파이프라인을 유지하기 쉽다.

 

데이터 수집

- Files (CSV, XML, JSON)

- Databases (SQL server)

- API: Application Programming Interface

- Web Scraping (HTML)

 

데이터 형식

1. CSV (Comma-Separated Values)

2. XML (eXtensible Markup Language)

<student>

    <name> 000 </name>

    <age> 19 </age>

</student>

이런 식으로 <>, </> 로 구분 가능

3. JSON (JavaScript Object Notation)

{

    "a": {

             "name": 000,

             "age": 19

            }

... 이런 식으로, {}와 따옴표 등으로 구분

 

CSV 파일에서 데이터 불러오기 - pandas 이용

import pandas
student_data = pandas.read_csv("student_table.csv")

 

Relational DB에서 데이터 불러오기

import pandas
student_data = pandas.read_sql_query(sql_string, db_uri)
SELECT * FROM student_table --전체 불러오기
SELECT studentid, name FROM student_table WHERE gpa > 3.5
--테이블에서 gpa>3.5인 학생들의 id와 이름 불러오기

SELECT S.name, A.name
FROM student_table S, advisor_table A
WHERE S.advisorid = A.id --학생의 지도교수 아이디가 지도교수 명단 아이디와 동일한 경우에 이름 쌍 출력

SELECT S.advisorid, avg(S.gpa)
FROM student_table S
GROUP BY S.advisorid --지도교수가 같은 학생들의 지도교수 아이디와 학생들 성적 평균 출력

SELECT S.advisorid, avg(S.gpa)
FROM student_table S
WHERE S.birthdate >= 2000/1/1 AND S.birthdate < 2010/1/1
GROUP BY S.advisorid

 

API를 이용하여 데이터 얻기

- REST (Representational State Transfer) API

import json
import requests

url = 'https://...format=json'

data = requests.get(url).text
parsed_data = json.loads(data)

 

Web Scraping

<html>
	<head>
    	<title> ... </title>
    </head>
    <body>
        <h1> hello world! </h1>
        <p> COSE471 data science </p>
    </body>
</html>

 

데이터의 원천

1. Proprietary Data Sources

- 기업이 수집하는 내부 데이터

- API로 제한적으로 공개할 수 있음

- 외부로 데이터 전체를 공개하기 어려운 이유: 비즈니스적 이유(경쟁사를 도와줄 수 있음), 프라이버시 이슈

- 예시: 2006년 AOL search log release

 

2. Government Data Sources

- 시, 국가 등에서 공개하는 오픈 데이터

- Freedom of Information Act: 데이터를 공개해달라고 요청할 수 있음

- 데이터가 공개될 때 프라이버시를 지켜야 함

 

3. Academic Data Sets

- 논문 등에서 발표하는 자료

 

4. Web Search/Scraping

- Scraping: 웹페이지에서 데이터나 텍스트를 추출하는 것

- 이미 API가 존재하는지, 누군가 이미 scraper를 작성해두었는지 확인하고 해야 함

 

5. Available Data Sources

- Bulk Downloads: 위키피디아, IMDB, Million Song Database

- API access: 뉴욕타임스, 트위터 등

 

6. Sensor Data Logging

- 이미지, 비디오 데이터: Flicker 이미지를 이용하여 날씨를 관측

- 휴대폰의 accelerometer를 이용하여 지진 관측

- 택시 GPS를 이용하여 교통 흐름 관측

- logging system 구축: 저장소가 저렴함

 

7. Crowdsourcing

- 위키피디아, Freebase, IMDB 등 여러 저자가 참여한 데이터

- Amazon Turk, CrowdFlower 등의 플랫폼에 돈을 지불하면 다수의 사람이 데이터를 모아올 수 있음

 

8. Sweat Equity

- 역사 자료 등은 종이, 피디에프 등의 형식으로 저장되어있어 변환이 필요함

 

Cleaning Data: Garbage In, Garbage Out

- 데이터 정리 중에 나타날 수 있는 문제

* artifact와 오류를 구별

* Data compatibility, unification

* 결측치 처리

* 미관측값 (0) 추정

* 이상치 탐지

 

Errors vs. Artifacts

- error: 데이터를 수집하는 과정에서 근본적으로 잃어버린 정보

- artifact: 데이터 처리 과정 중에 나타나는 시스템적인 문제

- sniff test: product를 가까이에서 조사하여 잘못되었다는 낌새를 알아차리는 방법

 

연도별 과학자의 첫 논문 발표자 수 관련 데이터

- PubMed를 이용하여 가장 자주 인용되는 과학자 100,000명의 첫 논문 발표 연도를 조사

- 예상 분포: 1960년에 몰려있고, 2023년에 가까워지면 0에 수렴하며, 그 중간은 일정하게 유지되는 그래프

(이유: 1960년부터 데이터를 수집했으므로 그 이전 논문들도 1960년으로 반영될 수 있으며, 최근에 가까워질수록 커리어가 적은 사람이 많아서 순위에 들지 못할 가능성이 높음)

- 실제 분포 (왼쪽)

1965년 이전 데이터는 수작업으로 하여 누락되었을 가능성 있음

2000년 이후 저자 이름 기록 방식이 변화로, 다른 저자지만 같은 저자로 인식할 수 있어 오류 발생

 

Data Compatibility

1. Unit Conversion

- 1999년 나사의 Mars Climate Orbiter가 사라짐

- 이유는 단위 차이 때문

- Z-score를 이용하면 단위가 사라지므로 유용

 

2. Number / Character Representation

- 1996년 Ariane 5 rocket 폭발: 64-bit float을 16-bit integer로 전환했기 때문

- 실제 수치의 integer 근사를 피할 것

- 측정값은 decimal number, count는 integer가 되도록 하자

- fractional quantities는 decimal 값으로 기록하자

 

3. Character Representations

- 텍스트 데이터의 인코딩 방식을 주의하자

- UTF-8: multibyte encoding for all Unicode characters

 

4. Name Unification

- 글 저자 기록 방식이 다 다를 수 있음. ex) Steve, Steven. S. 등등

- 이름을 같게 통일하자. 대소문자 변환, 미들네임 제거 등

- false positive와 negative 사이의 tradeoff

 

5. Time / Date Unification

- 날짜 통일: UTC 등 이용

 

6. Financial Unification

- Currency conversion: 환율을 이용

- 절대값 변화보다 returns / percentage change를 이용하자

- stock price를 올바르게 하자. (split(액면분할), dividends(배당))

- time value of money는 공정한 장기 비교를 위해 인플레이션의 correction을 해야 한다.

 

결측치 다루기

- 모른다고 하여 0으로 설정하는 것은 옳지 않다.

- 결측치 처리: 빈칸으로 두는 것보다 estimation, imputation이 필요하다.

 

Imputation methods

- Heuristic-based imputation: 평균수명을 반영하여 사망일자 예측

- Mean value imputation: 평균으로 대체

- Random value imputation: 난수로 대체 -> 통계적 평가에 imputation의 영향을 줄여줌

- Imputation by nearest neighbor: 가장 가까운 record를 이용하여 대체

- Imputation by interpolation: linear regression을 이용하여 대체 -> record에 빈 필드가 많이 없을 때

 

Outlier Detection

- 최댓값, 최솟값을 잘 확인하기

- Normally distributed data는 큰 outlier를 갖지 않는다. (k sigma from the mean)

- 그냥 삭제하지 말고 이상치가 생긴 이유를 생각하여 고치기

- 시각화를 통해 탐지하기 쉬움 (저차원인 경우만 가능)

- 클러스터링 했을 때 중심으로부터 멀리 떨어져있는 경우

 

Delete Outliers Prior to Fitting?

- 적합 이전에 이상치를 지우는 것은 더 나은 모델을 만들어내기도 한다.

ex) 이상치가 측정 오류로 생긴 것일 때

- 반대로 더 나쁜 모델을 만들어내기도 한다.

ex) 간단한 모델에 의해 설명되지 않는다고 해서 해당하는 점을 모두 지워버릴 경우