[수학]/[데이터 과학을 위한 통계]

[데이터 과학을 위한 통계] 1. 탐색적 데이터 분석

딥러닝 도전기 2022. 1. 6. 00:46

[데이터 과학을 위한 통계] 1. 탐색적 데이터 분석

 

이번 포스팅은 한빛미디어의 "데이터 과학을 위한 통계"라는 교재를 공부한 내용을 정리하려 합니다.

다음의 교재를 참고했음을 미리 밝힙니다.

한빛미디어 - 데이터 과학을 위한 통계


1. 정형 데이터와 비정형 데이터

 

데이터는 정형 데이터와 비정형 데이터로 나뉩니다 (반정형 데이터라는 개념도 있기는 합니다). 정형 데이터는 수치만으로 의미 파악이 가능한 데이터를 의미하는데, 예를 들어 키, 몸무게 데이터 등이 있습니다.  비정형 데이터는 텍스트, 이미지, 음성 등 정형화 되지 않은 데이터를 의미합니다.

 

정형 데이터는 크게 수치형 데이터, 범주형 데이터로 나뉩니다.

 

다시 수치형 데이터는 연속적인 값을 갖는 연속형 데이터, 이산적인 값을 갖는 이산형 데이터로 나뉘고

         범주형 데이터는 0과1의 이진 값을 갖는 이진 데이터, 범주 안의 값들이 순위를 갖는 순서형 데이터로 나뉩니다.

 

정형 데이터를 표로 정리해보면 다음과 같습니다.

정형 데이터 수치형 데이터
연속형
데이터
이산형 데이터
범주형 데이터
이진 데이터

순서형
데이터

비정형 데이터는 위에서 말씀드렸듯이 이미지, 텍스트, 음성 등으로 수치로 의미 파악이 어려운 데이터를 의미합니다.

(반정형 데이터에는 QR코드, HTML과 같은 데이터들이 있습니다. 반정형 데이터는 semi정형 데이터입니다.)

 

 

2. 테이블 데이터

데이터 분석에서 가장 대표적으로 사용되는 형태는 csv파일이나 데이터베이스의 테이블과 같은 테이블 데이터입니다.

테이블 데이터는 행렬로 이루어져 있으며 샘플이 행을, 특성(feature)이 열로 구성됩니다.  

 

 

3. 위치 추정

데이터를 살펴보는 가장 기초적인 단계는 대푯값을 살펴보는 것 입니다.

 

  • 대푯값이란?

대부분의 값이 어디쯤에 위치하는지를 나타내는 추정값으로, 데이터를 대표하는 값으로 생각하시면 될 것 같습니다.

대푯값에는 평균, 중간값, 백분위수, 사분위수, 절사평균, 최빈값 등이 있습니다.

 

 

3-1. 평균

평균은 가장 기본적인 위치 추정 방법으로 모든 값의 총 합을 샘플의 개수로 나눈 값입니다.

모집단이 ${x_1, x_2, x_3, \cdots , x_n}$ 이라고 할 때, 모집단의 평균은 다음과 같습니다.

$$\bar{x} = \frac{\sum_{i=1}^n x_i}{n}$$

 

  • 절사평균

절사평균은 평균을 약간 변형한 것으로 값들을 크기 순서로 정렬한 후, 양 끝에서 일정 개수의 값을 삭제한 후 평균을 구합니다.

이는 극단적인 값 즉, 이상치를 제거하며 좀 더 통계적으로 이상적인 평균값을 계산할 수 있습니다.

양끝의 값을 p개 씩 제거한 절사평균의 수식은 다음과 같습니다.

$$\bar{x} = \frac{\sum_{i = p+1}^{n-p} x_i}{n-2p}$$

 

  • 가중평균

평균의 또다른 변형으로는 가중평균이 있습니다. 가중평균은 각 데이터의 값 $x_i$에 가중치 $w_i$를 곱한 값들의 총합을 다시 가중치의 총합으로 나눈 것을 의미합니다. 수식으로는 다음과 같습니다.

$$ \bar{x} = \frac{\sum_{i=1}^{n} w_ix_i}{\sum_{i=1}^{n}w_i}$$

 

가중평균을 사용하는 이유는 두 가지가 있습니다.

1. 어떤 값들이 본래 다른 값들에 비해 큰 변화량을 가질 때, 이러한 관측값에 대해 더 작은 가중치를 줄 수 있습니다.

2. 데이터를 수집할 때, 우리가 관심 있는 서로 다른 대조군에 대해서 항상 똑같은 수가 얻어지지 않습니다. 이를 보정하기 위하여 데이터가 부족한 소수의 그룹에 대하여 더 높은 가중치를 적용할 필요가 있습니다.

3-2 중간값과 로버스트 추정

데이터를 정렬했을 때, 중앙에 위치하는 값을 중간값 혹은 중앙값이라고 합니다. 

데이터의 개수가 짝수면 어떻게하지? 의문이 드실 수 있습니다. 데이터의 개수가 짝수라면 중앙 두 개의 값을 평균내어 계산하게 됩니다.

중간값은 평균보다 데이터에 민감하지 않기 때문에 위치 추정에 좋은 지표로 사용됩니다.

 

예를 들어, 빌게이츠가 사는 동네의 소득을 조사하면 평균값은 빌게이츠에 의해 엄청나게 높게 집계될것입니다. 하지만 중간값을 사용하게 된다면 빌게이츠의 소득은 단지 평균보다 높은 값으로 취급되어 중간값 계산에 큰 영향을 주지 못합니다. 

중간값이 평균값보다 데이터에 덜 민감하기 때문에 발생하는 이점입니다. 이러한 것을 로버스트하다라고 합니다.

로버스트는 극단값(특잇값)들에 민감하지 않다는 것을 의미합니다.

 

4. 변이 추정

변이 추정에 가장 대표적으로 사용되는 지표는 편차입니다. 편차란 각 샘플 데이터의 평균과의 차이를 의미하며 평균을 기준으로 데이터가 얼마나 퍼져 있는지를 나타내는 지표입니다.

편차를 구할 때, 평균과의 차이를 그대로 사용하여 계산하면 편차의 합은 항상 0이 됩니다. 이를 보정하기 위하여 절댓값, 제곱 등의 방법을 사용하여 편차를 정의하게 됩니다. 절댓값을 사용하는 것을 평균절대편차, 제곱을 사용하는 것을 분산이라고 합니다.

 

  • 평균 절대 편차 = $\frac{\sum_{i=1}^n |{x_i - \bar{x}}|}{n}$

$\bar{x}$ : 표본평균

$n$ : 표본의 크기

 

  • 분산 = $s^2 = \frac{\sum_{i=1}^n(x_i - \bar{x})^2}{n-1}$
  • 표준편차 = $\sqrt{분산}$ = $s$

위에서 분산의 수식을 확인해보면 $n$이 아닌 $n-1$로 나누는 것을 확인하실 수 있습니다.

n이 충분히 크다면 n과 n-1이 비슷해져서 값에 차이가 별로 없지만, n이 작다면 문제가 됩니다.

여기에서 표준편차는 n-1을 자유도(degree of freedom)를 갖습니다. 

자유도 (degree of freedom) - wikipedia
통계적 추정을 할 때, 표본자료 중 모집단에 대한 정보를 주는 독립적인 자료의 수를 말한다.
분산 $s^2 = \frac{\sum_{i=1}^n(\bar{x}-x_i)^2}{n-1}$에 대해, $\bar{x} = \frac{1}{n} \sum_{i=1}^n x_i$인 관계식이 있기 때문에 자유도는 1 적은 $n-1$이 된다.

 

그렇기 때문에 분산은 n-1로 나누는 것이 올바른 것입니다.

하지만 저희는 빅데이터를 다루기 때문에 n으로 나누는 것이나 n-1로 나누는 것이 크게 상관 없을 것으로 보입니다.

 

이전 포스팅에서 로버스트에 대한 개념을 알아봤었습니다. 분산이나 표준편차를 생각해 보시면, 극단값에 영향을 크게 받기 때문에 로버스트하지 않은 것을 확인할 수 있습니다.

 

이를 해결하기 위하여 절대 중위 편차라는 개념을 사용합니다. 절대 중위 편차는 관측값에서 중앙값을 뺀 값들의 중앙값을 구하는 것입니다.

수식으로는 다음과 같습니다.

$$MAD = median(|x_i - median(x)|)$$

(MAD = Median Absolute Deviation)

 

  • 백분위수

변이를 추정하는 또다른 방법은 정렬된 데이터가 얼마나 퍼져 있는지 보는 방법이 있다. 특잇값에 민감한 것을 피하기 위해, 범위의 양 끝값들을 삭제한 후 범위를 다시 알아볼 수 있습니다. 

10번째 백분위 수는 정렬된 데이터 기준으로 전체 데이터의 $\frac{1}{10}$번째의 데이터에 해당하며 중간값은 50번째 백분위수는 중앙값이 됩니다.

대표적으로 자주 쓰이는 사분위범위(IQR)라는 25번째 백분위수와 75번째 백분위 수의 차이를 보는 방법이 존재합니다.

 

5.  데이터 분포 탐색

  • 상자그림 

상자그림은 위에서 알아본 백분위수를 활용하여 데이터의 분포를 쉽게 시각화 하는 방법입니다.

 

다음과 같이 python에서 pandas를 활용하여 상자그림을 쉽게 그릴 수 있습니다.

import pandas as pd
data = pd.read_csv('cvs데이터 파일 경로')
ax = (data['column정보']).plot.box()
ax.set_ylabel('y축 이름 설정')

 

위의 상자그림에서 인구의 중간값이 약 500만 (네모 박스 안의 실선)이고, 높은 이상치가 있음을 알 수 있습니다.

위아래로 연결되어있는 부분을 "수염"이라고 하며 이는 1.5 IQR값, 즉 사분위범위의 1.5배 이상 넘어가지 않도록 설정합니다.

사분위범위의 1.5배를 넘어가는 데이터는 위의 그림처럼 동그라미로 이상치 표시를 합니다.

 

  • 도수분포표

도수분포표는 각 구간에 해당하는 샘플을 구간 별로 표기하여 시각화하는 도표입니다.

python코드를 통하여 간단하게 도수분포표를 만들어 보도록 하겠습니다.

binnedPopulation = pd.cut(data['Population'], 2)
binnedPopulation.value_counts()

'''
(526935.67, 18908791.0]     47
(18908791.0, 37253956.0]     3
'''

binnedPopulation = pd.cut(data['Population'], 5)
binnedPopulation.value_counts()

'''
(526935.67, 7901692.0]      38
(7901692.0, 15239758.0]      8
(15239758.0, 22577824.0]     2
(22577824.0, 29915890.0]     1
(29915890.0, 37253956.0]     1
'''

binnedPopulation = pd.cut(data['Population'], 10)
binnedPopulation.value_counts()

'''
(526935.67, 4232659.0]      24
(4232659.0, 7901692.0]      14
(7901692.0, 11570725.0]      6
(11570725.0, 15239758.0]     2
(15239758.0, 18908791.0]     1
(18908791.0, 22577824.0]     1
(22577824.0, 26246857.0]     1
(33584923.0, 37253956.0]     1
(26246857.0, 29915890.0]     0
(29915890.0, 33584923.0]     0
'''

위의 코드와 같이 pd.cut함수를 사용하여 각 구간에 값들을 매핑시킵니다. pd.cut이 받는 인자는 (데이터, 나눌 구간의 수)가 됩니다.

 

위의 데이터를 살펴보면 data['Population']이라는 데이터는 앞부분에 많이 밀집되어있음을 확인할 수 있습니다.

 

  • 히스토그램

히스토그램은 도수분포표를 시각화한 그래프라고 생각하면 될 것 같습니다.

위와 동일한 데이터를 python을 통하여 시각화 해보았습니다.

ax = (data['Population']).plot.hist()
ax.set_xlabel('Population')

Histogram

예상대로 앞부분에 데이터가 몰려있는 것을 확인할 수 있습니다.

 

  • 밀도 추정(Density Estimation - KDE)

밀도추정(Density Estimation)이란 데이터와 변수의 관계를 파악하는 방법입니다. 여기에서 Density는 확률 밀도(Probability density)를 의미합니다.

 

밀도 추정은 ParametricNon-parametric으로 나뉩니다. Parametric 밀도 추정은 미리 pdf에 대한 모델을 정해놓고 데이터를 활용하여 모델의 parameter만 결정하는 방식입니다. 예를 들어 모델을 가우시안으로 가정한 후, 데이터에 맞추어 평균과 분산만 계산하는 등의 작업을 말합니다. Non-parametric 밀도 추정은 대표적으로 히스토그램 밀도 추정이 있습니다. 다음 그림과 같이 히스토그램을 기반으로 연속된 함수 즉, pdf를 만들어 내는 과정을 의미합니다.

 

6. 범주 데이터 탐색

범주 데이터에서 범주(category)가 2개인 데이터, 즉 참/거짓, 0/1로 구분되는 데이터를 이진 데이터라고 합니다.

한편, 범주가 3개 이상인 데이터를 일반적으로 범주 데이터라고 부릅니다.

범주형 데이터에서는 간단한 비율이나 퍼센트를 이용하여 데이터에 관해 이야기 하며 범주형 데이터를 나타내는 좋은 도표로 막대도표가 있습니다.

 

막대도표의 모양은 히스토그램과 상당히 유사하지만 x축 값에 차이가 있습니다. 히스토그램의 x축은 수치적인 정도를 나타내는 반면, 막대도표의 x축은 범주(category)를 나타냅니다.

 

  • 최빈값

범주형 데이터에서 사용하는 대표값으로는 최빈값이 있습니다. 최빈값이란 데이터에서 가장 자주 등장하는 값(범주)를 의미합니다. 예를 들어 흡연자 중 성별에 대한 최빈값은 남자일 것입니다.

 

7. 상관관계

데이터를 분석하는 기본적인 방법 중 하나로 상관관계를 조사하는 방법이 있습니다. 상관관계란 두 개의 변수가 선형 관계가 있는 범위를 표현하는 통계적 측도로, 만약 변수 x와 y가 있다고 생각해 보면 x가 증가할 때, y도 증가하고 x가 감소할 때, y가 감소하면 양의 상관관계, x가 증가할 때, y가 감소하고 x가 감소할 때, y가 증가한다면 음의 상관관계가 있다고 말합니다. 정리해보면 다음과 같습니다.

x↑ y↑    &&      x↓ y↓ 양의 상관관계
x↑ y↓    &&      x↓ y↑   음의 상관관계

 

  • 상관계수(Correlation coefficient) 

상관계수란 상관관계의 정도를 수치로 나타냅니다. 상관계수는 $r$ 로 표기하며 $-1\leq r\leq 1$의 값을 갖습니다. 1에 가까울수록 양의 상관관계, -1에 가까울수록 음의 상관관계가 커집니다. 0일때는 두 변수는 서로 관련이 없다고 해석하면 될 것 같습니다.

아래의 그림은 임의의 데이터에서 상관계수 행렬을 뽑은 그림입니다.

상관계수 행렬의 각 행과 열은 동일한 feature로 구성됩니다. 행렬에서 main diagonal이 1인 이유는 같은 특성끼리의 상관계수이기 때문에 1이 나오는 것은 당연합니다.

데이터 분석 부분에서 상관계수행렬은 매우 유용하게 사용됩니다. 

 

상관계수의 수식은 다음과 같습니다. $$r = \frac{\sum_{i = 1}^n(x_i - \bar{x})(y_i - \bar{y})}{(n-1)s_xs_y}$$

 

$s_x, s_y$는 $x,y$ 각각의 표준편차를 의미합니다. $n-1$로 나누게 되는 것은, 위에서 분산에서 말씀드렸던 것과 동일하게 자유도와 연관이 있습니다.

 

8. 다변량 분석

  • 이변량 분석

우리는 이변수함수의 그래프를 그릴 때 아래의 그림처럼 3차원 그래프를 그리게 됩니다. 하지만 종이, 모니터와 같은 우리에게 시각적인 효과를 제공하는 도구들은 2차원 평면이라고 생각할 수 있습니다. 그렇기 때문에 3차원의 그래프를 종이, 모니터 같은 도구에서 보는 것은 한 눈에 잘 들어오지 않을 뿐더러 해석하기 쉽지 않을 때가 있습니다.

3d-plot

이변량분석 또한 마찬가지로 그래프를 그리면 위와 같은 3차원 그래프가 됩니다. 하지만 python의 pandas패키지에서는 "hexabin"메서드를 사용하여 육각형 구간 도표를 z축의 높낮이는 색상으로 표현하여 그려줍니다. 이렇게 하는 것이 시각적으로 한 눈에 보기 편하기 때문이라고 생각합니다. plot을 그리는데 소모되는 자원 또한 절약할 수 있습니다.

 

아래는 육각형 도표 그림입니다. 위의 3차원 이미지와는 연관 없는 그래프입니다.

 

이것으로 <데이터 과학을 위한 통계> 첫 번째 리뷰를 마치도록 하겠습니다.

 

읽어주셔서 감사합니다.

반응형