체크리스트 살펴보기
- Formulate your question (질문을 만들어라.)
- 왜 분석을 하는지에 대한 이유 찾기
- 모집단 정하고, 표본 디자인,
- Read in your data (너의 데이터에서 읽어라.)
- R로 불러오기
- Check the packaging (분석에 필요한 패키지 찾기)
- 구글링….
- 토털 패키지로써의 의미도 포함
- Run
str()(str()돌려보기)- 변수를 전체적으로 훑어보기
- Look at the top and the bottom of your data (처음과 끝 보기)
- head(), tail() 변수를 보면서 찾아보기
- Check your “n”s (샘플수 확인하기)
- 샘플수가 틀리면 처음부터 다시 해야 한다.
- 테이블을 편집하는 것이 제일 시간이 많이 걸린다.
- Validate with at least one external data source (이상치를 확인해라)
- 이상치(outlier)가 나왔을 때, 꼭 확인해볼 것.
- ex. 20대 혈압 자료 중 280이 나왔다면?
- ex. 측정값에 음수가 포함되어 있는 경우
- 0 이하의 값은 0으로 처리하기
- Try the easy solution first (쉬운 것부터)
- 가장 쉬운 것부터 해보기
- 솔루션 → 확인
- Challenge your solution
- 목적에 맞게 더 분석
- Follow up questions
- 기타 고급분석 등등
중요한 것 : 원하는 자료인지 확인하기
1번~5번 - 시작 전 확인
Formulate your question
- 질문을 만듬으로써, 과정을 찾고, 분석 방법을 제한시킬 수 있다.
- 구체적인 질문과 가정은 변수를 줄이는 역할을 해준다.
- 변수 줄이기 = 차원 축소
- 질문에 답할 수 있는 맞는 데이터가 있나?
Read in Your Data
- 데이터를 읽는 것.
- 데이터 : 굉장히 지저분하게 나올수도 있다.
- 데이터를 Cleaning하는 것은 굉장히 중요하다.
Check the Packaging
- 데이터를 분석하기 전, 제대로 된 데이터인지 확인
Run str()
str()돌려보기
Look at the Top & Bottom of Your Data
- 아래쪽에 이상한 값들이 있거나, 데이터 자체가 없을 수 있기에 확인
head(),tail()
예시 데이터와 질문
미국 환경부에서 따온 데이터를 가지고 질문 만들기
- 어느 곳의 오염도가 더 심각한가? 동부 vs 서부
좀 더 심도 있게 질문을 만든다면 다음과 같다.
- 시간당 오존 레벨이 평균적으로 높은 곳은? 뉴욕 vs LA
- 지역 ⇒ 대표성을 띄는 도시로 축소
진짜 질문은 다음과 같다.
- 공기중 오존 레벨이 가장 높은 county는?
시작 전 확인 - 코드
hourly_44201_2014_ver2.csv를 ozone이라는 이름으로 저장.
이후 데이터 확인 절차를 밟는다.
해답 : 1번 ~ 5번
library(readr)
ozone = read_csv("", col_types="ccccinn")
names() = make.names(names(ozone))
dim(ozone)
nrow(ozone)
ncol(ozone)
str(ozone)
head(ozone)
tail(ozone)
6. Check your “n”s
- 샘플수에 대해서 민감해야 한다.
- 샘플수가 30개 정도일때 missing이 있으면 값이 확확 줄어들 수 있다.
예를 들어 데이터가 다음과 같을 경우….
| v1 | v2 | v3 | v4 |
| NA | 12 | 1 | 3 |
| 0.1 | 12 | 1 | 1 |
| 0.25 | NA | 2 | 10 |
| 0.4 | 23 | 2 | NA |
| NA | 25 | 1 | NA |
결측값을 지워버리면 제대로 된 것이 없다!
이럴 때는 이 변수가 제대로 된 건지 확인해야 한다.
예시
- 미국의 hourly ozone data를 보자. 힌트 :
table()
해답
table(ozone$Time.Local)
- 미국의 주를 기준으로 분석한다고 할 때, 주가 아닌 것들이 있다.
주의 이름을 나열해 이들을 찾아보자. 힌트 :
unique()
해답
# 중복된 행을 삭제해야 하므로 unique를 쓴다.
unique(ozone$State.Name)
7. vaildate
데이터의 이상치 확인해보기.
예시문제
1번. summary of sample measurements를 구해보자.
2번. 이후 sample measurements의 십분위수(decile) 확인. 힌트 = quantile()
1번, 2번 해답
summary(ozone$Sample.Measurement)
quantile(ozone$Sample.Measurement, seq(0, 1, 0.1))
8. Try the Easy one
오존 레벨 top 10인 지역들을 확인해보자.
해답
# aggregate 함수로 만들어주기
ranking = aggregate(Sample.Measurement~State.Name+County.Name,
ozone, mean)
# 이름 바꿔주기 : ozone으로
names(ranking)[3] = "ozone"
# ranking의 order 정리
ranking = ranking[order(ranking$ozone, decreasing=T),]
- 열들을 붙이고, 계산을 할 때 aggregate를 쓴다.
How many observations in California, Mariposa?
힌트 : 새 데이터프레임을 만들고 행의 갯수를 샌다.
해답
# 이름 알아보기
mariposa.data = ozone[(ozone$State.Name == "California" &
ozone$County.Name == "Mariposa"),]
# mariposa의 갯수 알아보기
nrow(mariposa.data)
시간 순으로 체크해보자. 힌트 : 테이블을 만든다.
해답
with(mariposa.data, table(Method.Name, Time.Local))
월별 오존농도를 체크해보자. 힌트 : aggregate 사용
해답
ozone$Date.Local = as.Date(ozone$Date.Local)
ozone$month = factor(months(ozone$Date.Local))
data = aggregate(Sample.Measurement~month, ozone, mean)
names(data)[2] = "ozone"
data
9. Challenge Your Solution
부트스트랩 샘플을 이용해 샘플을 뽑아나고, 새 ranking을 만들어보자.
해답
set.seed(10234)
N = nrow(ozone)
idx = sample(N, N, replace=T)
ozone2 = ozone[idx, ]
이후 기존의 ranking과 새 ranking(ranking2)를 붙여보자.
해답
# ranking2 만들기
ranking2 = aggregate(Sample.Measurement~State.Name + County.Name,
ozone2, mean)
names(ranking2)[3] = "ozone"
ranking2 = ranking2[order(ranking2$ozone, decreasing=T),]
# ranking, ranking2 붙이고 확인
cbind(head(ranking, 10), head(ranking2, 10))
cbind(tail(ranking, 10), tail(ranking2, 10))
10. Follow-up question
- 이렇게 했는데 이상한 데이터가 나올 수 있다.
- 분명히 numeric으로 했는데, text로 나오는 경우
- 빈칸 = ND(not detected)로 적은 경우 당연히 numeric으로 인식될 줄 알겠지만, 실제로 보니 char.
- 필요한 변수가 있는가?
- 다른 데이터도 추가로 필요한가?
- 올바른 질문인가?
- EDA의 목표
- 데이터에 대해 자료를 다시 확인
- 필요하다면 목적에 맞는 데이터를 다시
- iterative process