저항성: 데이터의 일부가 변동되었을 때 영향을 비교적 작게 받는 것을 저항적인 자료분석이라 할 수 있다. 간단한 예시로 데이터의 특정 값이 크게 변형되는 경우 평균은 이로 인해 크게 변할 수 있으나 중위수는 크게 변하지 않음을 볼 수 있다. 이때 중위수를 바람직한 대표 값 측도로 선호된다.
잔차: 잔차를 통해 각 개별 관측 값이 자료의 주 경향(main trend)으로부터 얼마나 벗어났는지 확인할 수 있다. 적합 직선을 찾아내는 회귀분석의 목적과 다르게 EDA에서는 각 개별 잔차에도 유용한 통계적 정보를 갖고 있다고 생각하며 각 잔차에 대한 의문을 풀고 탐구작업을 하는데 신경 써야한다.
재표현: 자료의 재표현은 기존 변수를 적당한 척도로 바꾸어 데이터 분석을 단순화할 수 있도록 한다. 재표현을 통해 분포의 대칭성, 산포의 균일성, 관계의 선형성 등에 도움을 준다. 즉, 기존의 데이터를 변환하여 기존보다 나은 관계를 확인할 수 있다면 변환하는 것이 좋다는 것이 EDA의 입장이다.
현시성: 자료의 숨겨진 정보를 파악하는 가장 효율적인 수단은 시각화이다. 요즘 데이터의 양이 폭발적으로 증가하고 있는 만큼 자료를 시각화 하는 것은 EDA뿐만 아니라 많은 곳에서 중요시 여기고 있다. 이러한 이유로 다양한 그래프 작성 기법과 표현이 사용되고 있다.
Nile 데이터 셋은 R내장 데이터로 Nile이라는 명령어로 불러올 수 있다.
?Nile을 통해 데이터 셋을 간단히 살펴보면 1871년부터 1970년까지 나일강의 연간 유량 흐름을 측정한 자료임을 알 수 있다.
Nile
## Time Series:
## Start = 1871
## End = 1970
## Frequency = 1
## [1] 1120 1160 963 1210 1160 1160 813 1230 1370 1140 995 935 1110 994 1020
## [16] 960 1180 799 958 1140 1100 1210 1150 1250 1260 1220 1030 1100 774 840
## [31] 874 694 940 833 701 916 692 1020 1050 969 831 726 456 824 702
## [46] 1120 1100 832 764 821 768 845 864 862 698 845 744 796 1040 759
## [61] 781 865 845 944 984 897 822 1010 771 676 649 846 812 742 801
## [76] 1040 860 874 848 890 744 749 838 1050 918 986 797 923 975 815
## [91] 1020 906 901 1170 912 746 919 718 714 740
stem()을 사용하여 줄기잎그림으로 표현하였다.
stem(Nile)
##
## The decimal point is 2 digit(s) to the right of the |
##
## 4 | 6
## 5 |
## 6 | 5899
## 7 | 000123444455667778
## 8 | 000011222233344555556667779
## 9 | 0011222244466678899
## 10 | 0122234455
## 11 | 00012244566678
## 12 | 112356
## 13 | 7
줄기는 100의 자리 수, 잎은 10의 자리 수를 의미하며 위의 줄기잎그림의 특성은 다음과 같다.
●군집의 수 위 그림에서 2개의 봉우리를 볼 수 있다. 즉 2개의 군집으로 이루어져 있으며 800대의 주 군집과 1100대의 주 군집이 혼합되어 있는 형태를 보인다. 군집 구분이 어떤 속성과 관련이 있는지 확인해볼 필요성이 있다.
●대칭성 여부 800대에서 가장 많은 데이터들이 있음을 확인할 수 있으며 이를 기준으로 양 극단으로 갈 수록 데이터 수가 줄어들고 있다. 하지만 2개의 군집이 혼합되어 있는 형태를 보이기때문에 대칭을 이루고 있다고 보기는 힘들다.
●자료의 범위 및 산포 자료의 범위 및 산포는 위의 그림을 통해 쉽게 확인할 수 있다. 자료의 최솟값은 456, 최댓값은 1370으로 확인되고 있으며 위의 그림에서는 반올림으로 인해 최솟값이 460으로 표현되었다. 하지만 자료를 해석하는데 큰 지장은 없을 것이다. 자료의 범위가 꽤 넓다고 생각되며 위의 그림에서 시각적으로 산포를 확인해 볼 수 있다. 특이점으로는 500이하의 값이 거의 관측되지 않고 있음을 확인할 수 있다. 표준편차와 같은 수치적 산포는 비교 대상이 존재하지 않아 따로 확인하지 않았다.
●특이점의 존재여부
stem(Nile,scale=2)
##
## The decimal point is 2 digit(s) to the right of the |
##
## 4 | 6
## 5 |
## 5 |
## 6 |
## 6 | 5899
## 7 | 0001234444
## 7 | 55667778
## 8 | 000011222233344
## 8 | 555556667779
## 9 | 00112222444
## 9 | 66678899
## 10 | 01222344
## 10 | 55
## 11 | 00012244
## 11 | 566678
## 12 | 1123
## 12 | 56
## 13 |
## 13 | 7
boxplot(Nile)
특이점의 존재여부를 좀 더 명확하게 판단해보고자 scale=2로 변경하여 줄기 잎그림을 그려보았다. 예상대로 460이라는 값이 다른 데이터에 비해 굉장히 바깥쪽에 존재하는 것을 확인할 수 있었다. 다만boxplot에서는 따로 특이점으로 나타나지 않아 여러 척도를 통하여 판단해야 할 것으로 보인다.
warpbreaks 데이터 셋은 R내장 데이터로 warpbreaks이라는 명령어로 불러올 수 있다.
?warpbreaks을 통해 데이터 셋을 간단히 살펴보면 실의 종류와 실의 장력에 따른 강도를 나타낸 자료임을 알 수 있다.
데이터가 너무 많은 관계로 head()함수를 이용하여 6개의 행만 추출하였다.
head(warpbreaks)
## breaks wool tension
## 1 26 A L
## 2 30 A L
## 3 54 A L
## 4 25 A L
## 5 70 A L
## 6 52 A L
summary(warpbreaks) #변수명 확인
## breaks wool tension
## Min. :10.00 A:27 L:18
## 1st Qu.:18.25 B:27 M:18
## Median :26.00 H:18
## Mean :28.15
## 3rd Qu.:34.00
## Max. :70.00
A=warpbreaks[warpbreaks$wool=="A",] #wool이 A인 데이터는 변수 A 에 저장
B=warpbreaks[warpbreaks$wool=="B",] #wool이 B인 데이터는 변수 B 에 저장
stem(A$breaks)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 0257888
## 2 | 114566689
## 3 | 00566
## 4 | 3
## 5 | 124
## 6 | 7
## 7 | 0
(A의breaks자료에 대한 줄기잎그림)
stem(B$breaks)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 34
## 1 | 5566799
## 2 | 00114
## 2 | 6788999
## 3 | 1
## 3 | 99
## 4 | 124
(B의breaks자료에 대한 줄기잎그림)
두 그림 모두 줄기는 10의 자리수, 잎은 1의 자리수를 의미하지만 두 줄기잎그림의 줄기가 달라 줄기의 수를 맞추는 작업을 하였다.
stem(A$breaks)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 0257888
## 2 | 114566689
## 3 | 00566
## 4 | 3
## 5 | 124
## 6 | 7
## 7 | 0
stem(B$breaks,scale=0.5)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 345566799
## 2 | 001146788999
## 3 | 199
## 4 | 124
A자료를 기준으로 B자료의 줄기를 변화시킨 결과 전에 비해 B의 줄기가 줄어듬을 확인할 수 있다.
stem(A$breaks,scale=2)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 02
## 1 | 57888
## 2 | 114
## 2 | 566689
## 3 | 00
## 3 | 566
## 4 | 3
## 4 |
## 5 | 124
## 5 |
## 6 |
## 6 | 7
## 7 | 0
stem(B$breaks)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 34
## 1 | 5566799
## 2 | 00114
## 2 | 6788999
## 3 | 1
## 3 | 99
## 4 | 124
B자료를 기준으로 A자료의 줄기를 변화시킨 결과 전에 비해 A의 줄기가 늘어났음을 확인할 수 있다.
분포의 특징 비교 및 설명
B자료의 줄기를 기준으로 그린 것이 좀 더 분포를 비교하는데 적합하다 판단되어 2)를 기준으로 설명하고자 한다.
●군집의 수 A와 B자료 모두 10후반대~20후반대 사이에서 하나의 군집을 이루고 있는 것처럼 보인다. 다만 10후반대와 20후반대에서 가장 빈도가 높은 것을 확인할 수 있다. 두 군집으로 나누어 어떤 속성이 관련이 있는지 밝히는 것도 생각해볼 수 있다.
●대칭성 여부 A, B 두 자료 모두 대칭적 분포라고 보기 힘들다. 1)의 그림을 참고하면 오히려 작은 값에서 많은 값들이 발견되고 있음을 확인할 수 있다.
●자료의 범위 및 산포 A와 B자료의 기본 줄기잎그림에서도 보았듯이 두 자료의 범위는 많이 차이가 난다. 최솟값은 비슷하지만 최댓값의 경우 A는 70이고 B는 44이다. 작은 값에서는 큰 차이가 없지만 A의 최댓값으로 인해 B에 비해 줄기의 수가 많은 것을 확인할 수 있다.
sd(A$breaks)
## [1] 15.85143
sd(B$breaks)
## [1] 9.300921
또한 표준편차를 확인해보면 A의 표준편차가 B보다 크다는 것을 확인할 수 있다.
●특이점의 존재여부
boxplot(A$breaks,B$breaks, names=c("A","B"))
B의 자료에서는 크게 특이점이 발견되지 않는다. 하지만 A 자료에서 비어 있는 부분을 발견할 수 있으며 특히, A의 자료에서 60후반대이후의 값이 다른 값들에 비해 바깥쪽에 존재하고 있다. 예상대로 A의 boxplot에서 특이 값이 관찰되며 여러 척도를 통하여 판단해야 할 것으로 보인다.
Seatbelts 데이터 셋은 R내장 데이터로 Seatbelts이라는 명령어로 불러올 수 있다. ?Seatbelts을 통해 데이터 셋을 간단히 살펴보면 1969년부터 1984년 까지 발생한 도로사고 현황을 나타낸 자료이다.
데이터가 너무 많은 관계로 원본데이터 표시는 생략하였다.
head(Seatbelts,10)
## [1] 107 97 102 87 119 106 110 106 107 134
summary(Seatbelts) #변수명 확인
## DriversKilled drivers front rear
## Min. : 60.0 Min. :1057 Min. : 426.0 Min. :224.0
## 1st Qu.:104.8 1st Qu.:1462 1st Qu.: 715.5 1st Qu.:344.8
## Median :118.5 Median :1631 Median : 828.5 Median :401.5
## Mean :122.8 Mean :1670 Mean : 837.2 Mean :401.2
## 3rd Qu.:138.0 3rd Qu.:1851 3rd Qu.: 950.8 3rd Qu.:456.2
## Max. :198.0 Max. :2654 Max. :1299.0 Max. :646.0
## kms PetrolPrice VanKilled law
## Min. : 7685 Min. :0.08118 Min. : 2.000 Min. :0.0000
## 1st Qu.:12685 1st Qu.:0.09258 1st Qu.: 6.000 1st Qu.:0.0000
## Median :14987 Median :0.10448 Median : 8.000 Median :0.0000
## Mean :14994 Mean :0.10362 Mean : 9.057 Mean :0.1198
## 3rd Qu.:17203 3rd Qu.:0.11406 3rd Qu.:12.000 3rd Qu.:0.0000
## Max. :21626 Max. :0.13303 Max. :17.000 Max. :1.0000
#Seatbelts$Driverkilled
#위와 같은 오류가 발생하여 Seatbelts 자료를 데이터프레임으로 변환하여 계산을 진행하였다.
Seat=as.data.frame(Seatbelts)
kill=(Seat$DriversKilled)*(1000/Seat$drivers)*(10000/Seat$kms)
(drivers: 전체운전자수, kms: 전체운행거리, Driverskilled: 전체사망운전자수, kill: 운전자 1000명당, 운행거리 10000km 당 사망운전자수(killed))
stem(kill)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 2 | 4
## 2 |
## 3 | 04444
## 3 | 555556677888888999
## 4 | 000001111111112222222222233333333444444444
## 4 | 555555666667777778888888888999999999
## 5 | 000000111122222333444
## 5 | 55556666677777777788888899
## 6 | 00000011111112223344444
## 6 | 55567899
## 7 | 011113
## 7 | 678
## 8 | 4
## 8 | 5
## 9 | 0
줄기는 10의 자리수, 잎은 1의 자리수를 의미하며 위의 줄기잎그림의 간단히 설명하고자 한다. 최솟값은 24, 최댓값은 90이며 대부분의 줄기에 값이 분포되어 있다. 40대에서 가장 많은 값들이 분포되어 있다. 대칭적인 모습보다는 왜도가 존재하여 오른쪽으로 꼬리가 길게 늘어진 모양이다. 특이 값의 경우 두드러지게 보이는 값은 존재하지 않으나 최솟값과 최댓값은 약간 바깥쪽에 존재하는 것처럼 보이기 때문에 확인해볼 필요성이 있다.
before=Seat[Seat$law==0,]
after=Seat[Seat$law==1,]
kill0=(before$DriversKilled)*(1000/before$drivers)*(10000/before$kms)
kill1=(after$DriversKilled)*(1000/after$drivers)*(10000/after$kms)
#(법 시행 전: law=0, 법 시행 후: law=1 /
#before: 법 시행 전 자료, after: 법 시행 이후 자료
#kill0: 법 시행 전 사망운전자수, kill1: 법 시행 이후 사망운전자수)
stem(kill0)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 3 | 44
## 3 | 555677888999
## 4 | 0000011111111122222223333334444444
## 4 | 55555666667777888888888999999999
## 5 | 000000111122222333444
## 5 | 5555666667777777778888899
## 6 | 00000011111112223344444
## 6 | 55567899
## 7 | 011113
## 7 | 678
## 8 | 4
## 8 | 5
## 9 | 0
#법 시행전의 줄기잎그림(줄기는 10의 자리수, 잎은 1의 자리수를 의미한다.)
stem(kill1)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 2 | 4
## 3 | 044556888
## 4 | 222233445778
## 5 | 8
#법 시행이후의 줄기잎그림(줄기는 10의 자리수, 잎은 1의 자리수를 의미한다.)
위의 두 그림을 확인해보면 줄기의 개수가 달라 비교하기가 모호한 부분이 있다. 하지만 법 시행이후 데이터가 너무 적기 때문에 줄기를 맞추는 작업은 따로 시행하지 않았다. 명확한 부분은 법 시행이후 줄기그림의 줄기가 줄어 사망자 수의 분산이 감소했다는 것을 확인할 수 있다.
var(kill0)
## [1] 116.922
var(kill1)
## [1] 48.90176
법 시행이전에는 50대 이후의 값도 많이 발생하고 있었지만 법 시행이후 50대 이후의 값이 확연히 많이 줄었다는 것을 볼 수 있다. 하지만 위에서 언급한 바와 같이 법 시행이후 데이터 수가 너무 적어 비교하기 어렵고 이전 이후 모두 40대에서 값이 가장 많이 나타나고 있다. 또한 법 시행여부라는 변수가 아닌 또 다른 변수가 시간적으로 영향을 미쳤거나 아직 법 시행이후 기간이 너무 짧은 것은 아닌지 확인해 봐야 할 것이다.