일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 인덱스
- EC2
- 매일영어습관
- CSS
- DOMAPI
- Mac konlpy
- 파이썬
- 명령어
- HTML
- 함수
- NLP
- 노마쌤과 즐거운 영어 습관
- DOM
- 벡터
- 자기지도학습
- R
- 신뢰구간
- 유의수준
- Ajax
- Filter
- Ajax프레임워크
- 노마쌤
- 정수인코딩
- 클러스터링기법
- 노트list
- 행렬
- 웹폰트
- 프로토콜
- JS
- 질의확장
- Today
- Total
채니의 개발일기
데이터분포 탐색하기 (분포의 치우침, 왜도,첨도) 본문
분포의 치우침
- 실제 분석에서 만나는 데이터 값은 각각 다른 형태를 띠는 문제가 발생 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)) # 기본 그래프 배치로 복원
'수학 > 통계학' 카테고리의 다른 글
구간추정하기:신뢰구간 (0) | 2023.08.02 |
---|---|
통계적 의사결정 (0) | 2023.07.23 |
연속형 확률분포(정규분포, 표준정규분포): 정규분포, 지수분포, 표준정규분포, 카이제곱,F분포 (0) | 2023.07.05 |
중심극한정리 (0) | 2023.07.03 |
확률분포, 이산형확률분포(확률질량함수,베르누이시행) (0) | 2023.06.17 |