채니의 개발일기

데이터분포 탐색하기 (분포의 치우침, 왜도,첨도) 본문

수학/통계학

데이터분포 탐색하기 (분포의 치우침, 왜도,첨도)

윤채니챈 2023. 7. 23. 11:58
728x90
반응형

분포의 치우침

  • 실제 분석에서 만나는 데이터 값은 각각 다른 형태를 띠는 문제가 발생 ex) 예를 들어, 데이터 분포가 정규분포가 아닌 경우, 정규분포를 가정하는 분석 방법을 사용하면 정확한 결과를 얻을 수 없다
  • 분포 자체가 너무 틀어져있는 경우에는 어떤 분석을 해도 이상한 결과가 나올 수 있음
  • 따라서 분석을 진행하기 전에는 항상데이터 분포를 자세하게 탐색하는 과정을 거쳐야함

 

: 오른쪽으로 데이터 분포가 치우져져있는 그래프 예)

# 필요한 패키지를 불러옵니다.
library(ggplot2)

# 임의의 데이터 생성
set.seed(123) # 재현 가능성을 위해 시드 설정
data <- rnorm(1000, mean = 10, sd = 5) # 평균이 10이고 표준편차가 5인 정규분포를 따르는 데이터 생성

# 데이터의 분포를 확인하기 위해 히스토그램을 그립니다.
ggplot(data.frame(x = data), aes(x)) +
  geom_histogram(binwidth = 1, fill = "blue", color = "white") +
  labs(title = "Original Data Histogram")

# 로그 변환을 적용합니다.
log_data <- log(data)

# 로그 변환한 데이터의 분포를 확인하기 위해 히스토그램을 그립니다.
ggplot(data.frame(x = log_data), aes(x)) +
  geom_histogram(binwidth = 0.1, fill = "blue", color = "white") +
  labs(title = "Log-Transformed Data Histogram")

 

 

왜도, 첨도

왜도(skewness)와 첨도(kurtosis)는 데이터의 분포를 나타내는 통계적 지표

 

왜도: 데이터의 분포가 좌우 대칭인지(= 분포의 비대칭성을 나타냄)

  • 왜도의 절댓값 =  0 : 데이터의 분포는 좌우 대칭
  • 왜도의 절댓값 >  0 : 데이터의 분포는 왼쪽으로 치우쳐 있다.
  • 왜도의 절댓값 < 0 : 데이터 분포 오른쪽으로 치우쳐 있다.

왜도 식

 

첨도: 데이터의 분포가 뾰족한지 뭉툭한지 나타낸다

  • 첨도의 절댓값 =  0 : 데이터분포 정규분포와 같다
  • 첨도의 절댓값 >  0 :  정규분포보다 뾰족
  • 첨도의 절댓값 < 0 : 정규분포보다 뭉툭

> cat("MPG 왜도:", mpg_skew, "\n")
MPG 왜도: 0.610655 
> cat("MPG 첨도:", mpg_kurt, "\n")
MPG 첨도: -0.372766 

왜도>0이므로 왼쪽으로 치우져있고 뭉툭한형태임을 알 수 있다.

# mtcars 데이터셋 불러오기
data(mtcars)

# 왜도 계산 함수 정의
skewness <- function(x) {
  n <- length(x)
  mean_val <- mean(x)
  sd_val <- sqrt(sum((x - mean_val)^2) / (n - 1))
  skew <- sum((x - mean_val)^3 / (n * sd_val^3))
  return(skew)
}

# 첨도 계산 함수 정의
kurtosis <- function(x) {
  n <- length(x)
  mean_val <- mean(x)
  sd_val <- sqrt(sum((x - mean_val)^2) / (n - 1))
  kurt <- sum((x - mean_val)^4 / (n * sd_val^4)) - 3
  return(kurt)
}

# mtcars 데이터셋의 mpg (연비) 열의 왜도와 첨도 계산
mpg <- mtcars$mpg
mpg_skew <- skewness(mpg)
mpg_kurt <- kurtosis(mpg)

# 왜도와 첨도를 그래프로 시각화
ggplot(data.frame(x = mpg), aes(x)) +
  geom_histogram(binwidth = 2, fill = "lightgreen", color = "black") +
  geom_vline(xintercept = mean(mpg), color = "red", linetype = "dashed", size = 1) +
  annotate("text", x = mean(mpg) - 4, y = 8, label = "Mean", color = "red") +
  labs(title = "Histogram of MPG",
       x = "MPG",
       y = "Frequency") +
  theme_minimal()

# 왜도와 첨도 값 출력
cat("MPG 왜도:", mpg_skew, "\n")
cat("MPG 첨도:", mpg_kurt, "\n")

 

Quantile-Quantile Plot(QQ plot)

 

Quantile-Quantile Plot(QQ plot)은 두 데이터 분포의 모양을 비교하는 데 사용되는 시각적 도구

QQ plot은 하나의 분포의 사분위수를 다른 분포의 사분위수와 비교하여 그려진다

두 분포가 동일하다면 QQ plot은 직선으로, 두 분포가 다르다면 QQ plot은 직선에서 벗어난다

*** qqline은 qqnorm 그래프 상에 정규분포에 대한 기대값과 기울기를 나타내는 선을 추가하는 함수

 

각 데이터의 사분위수에 따른 분포와 정규분포 기울기를 알 수 있음 

# 예시 데이터 생성
set.seed(123)  # 재현 가능성을 위해 시드 설정
normal_data <- rnorm(100)  # 평균 0, 표준편차 1인 정규분포 데이터 생성
non_normal_data <- rexp(100, rate = 0.5)  # 감마 분포를 따르는 비정규분포 데이터 생성

# 그래프 그리기
par(mfrow = c(1, 2))  # 1행 2열로 그래프 배치

# 정규분포 데이터의 qqnorm과 qqline 그래프
qqnorm(normal_data, main = "QQ Plot - Normal Data")
qqline(normal_data, col = "red")

# 비정규분포 데이터의 qqnorm과 qqline 그래프
qqnorm(non_normal_data, main = "QQ Plot - Non-normal Data")
qqline(non_normal_data, col = "red")

par(mfrow = c(1, 1))  # 기본 그래프 배치로 복원

 

 

로그변환하기

 


로그를 취하는 이유는 비교적 큰 값들이 작게 보이도록 변환하여 데이터의 분포를 더 균등하게 만들기 위함입니다.

주로 qqnorm 함수에서 로그 변환을 사용하는 상황은 다음과 같습니다:

1. 지수적으로 증가하는 데이터: qqnorm 그래프를 그릴 때, 데이터가 지수적으로 증가하는 경우에는 그래프가 급격하게 휘어 질 수 있다. 이런 경우 로그 변환을 적용하여 데이터의 증가율을 완화시킬 수 있다.

-> 로그 변환을 적용하면 지수적인 증가가 선형적으로 변환되어 그래프가 더 직선에 가까워지게된다

2. 왼쪽으로 치우친 분포: 데이터가 왼쪽으로 치우쳐진 경우, qqnorm 그래프가 하단부에 밀집되고 상단부에 희소하게 나타날 수 있다.

-> 로그 변환을 적용하면 데이터의 왼쪽으로 치우침을 완화시키고, 데이터의 분포를 더 균등하게 만든다.

3. 상대적인 비교: 로그를 취하면 데이터의 상대적인 차이를 상대적으로 작게 만들 수 있다. 이는 데이터 포인트들의 크기 차이가 큰 경우에 그래프를 보다 해석하기 쉽게 만들어준다.

 

로그 취한 전후 그래프 비교

 

-> 분포가 거진 것들의 범위가 작아진것을 볼 수 있음

# 예시 데이터 생성
set.seed(123)  # 재현 가능성을 위해 시드 설정
data <- rnorm(100, mean = 10, sd = 2)  # 평균 10, 표준편차 2인 정규분포 데이터 생성
# 예시 데이터 생성
set.seed(123)  # 재현 가능성을 위해 시드 설정
data <- rnorm(100, mean = 10, sd = 2)  # 평균 10, 표준편차 2인 정규분포 데이터 생성

# 제곱근 변환을 적용하여 변환된 데이터 생성
sqrt_data <- sqrt(data)

# 제곱근 변환 전과 후의 qqnorm 그래프 그리기
par(mfrow = c(1, 2))  # 1행 2열로 그래프 배치

# 제곱근 변환 전의 qqnorm 그래프
qqnorm(data, main = "QQ Plot - Original Data")
qqline(data, col = "red")

# 제곱근 변환 후의 qqnorm 그래프
qqnorm(sqrt_data, main = "QQ Plot - Square Root Transformed Data")
qqline(sqrt_data, col = "red")

par(mfrow = c(1, 1))  # 기본 그래프 배치로 복원
728x90
반응형