ch0nny_log

[빅데이터분석] R _ 48. 왜도와 첨도 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 48. 왜도와 첨도

chonny 2024. 7. 9. 13:58
★ 점심시간 문제: 자동화 스크립트 8번에 오라클 db 연동 코드를 추가하시오
파일명: orabledb.R
library(rJava)
library(DBI)
library(RJDBC)

driver <- JDBC('oracle.jdbc.driver.OracleDriver', 'c:\\data\\ojdbc8.jar')

oracle_db <- dbConnect( driver, 'jdbc:oracle:thin:@127.0.0.1:1521/xe', 'c##scott','tiger')

emp_query <- 'select e.ename, d.loc
                       from  emp  e, dept  d
                     where  e.deptno = d.deptno'

emp_data <- dbGetQuery( oracle_db, emp_query)
emp_data​

 


※ 이전 복습

2024.07.08 - [R] - [빅데이터분석] R _ 46. 머신러닝 하기 전에 미리 알아 둬야 할 내용들

 

[빅데이터분석] R _ 46. 머신러닝 하기 전에 미리 알아 둬야 할 내용들

* R의 자료구조의 종류   팩터(factor) 란?1.  범주 변수나 순위 변수를 나타내는 특별한 종류의 벡터입니다.머신러닝을 할 때, 기계에게 학습 데이터를 제공할 때는 반드시 팩터 형태로 제공

chonny1210.tistory.com

 

기계학습을 통한 분석을 하는 이유?

-> 예측과 분류를 하기 위해서

-> 기계에게 좋은 데이터를 제공해여됨

-> 기계학습 시키기 전에 데이터 전처리 순서는 다음과 같음

 

1. 적절한 머신러닝 기법을 선택해야함
2. 결측치 처리
3. 이상치 처리
4. 데이터 스케일링 -> 데이터의 특성을 더 잘 반영하고 분석의 정확성을 높이기 위해 사용하는 방법
      1) 최대 최소 정규화 : 기계학습이 경험적으로 더 잘됨
      2) 표준화

 


■ 수치형 데이터 살펴보기(히스토그램 그래프, 정규분포)

수치형 두 변수가 모두 숫자일 때
- 상관관계 분석: 피어슨 상관계수, 스피어만 상관계수
- 회귀 분석: 단순 회귀 분석: 다중 회귀 분석
범주형 두 변수가 모두 문자일 때
- 교차표 분석: 교차표를 생성
- 카이제곱 검정: 카이제곱 검정

 

 

■  왜도와 첨도  (p116 ~121 )

 수치형 데이터 살펴보는 방법은 3가지 ?  

 1. 히스토그램 그래프

 2. 왜도값 확인
 3. 첨도값 확인 

 

 

 위와 같이 데이터를 분석하기에 앞서서 미리 살펴보는 이유는 더 적절하고 정확한 데이터 분석을 위해서입니다.

 히스토그램 그래프는 수치변수의 퍼짐을 그래프로 시각화 한것인데 히스토그램은 값의 갯수 또는 빈도를 나타내는 높이를 갖는 일련의 막대로 구성되며, 값이 소속되어있는 균등한 빈(bin) 들이 전체값들을 분할합니다.

예제.  중고차 데이터의 가격과 주행거리를 히스토그램 그래프로 시각화하기

1. 빨리 시각화 하기
car <- read.csv("c:\\data\\usedcars.csv" )
par( mfrow=c(1,2) )
hist( car$price )
hist( car$mileage)​
설명:  중고차 가격은 중앙 양측에 균등하게 나뉘는경향이 있는 반면, 차량 주행거리는 오른쪽으로 좀 늘어난것으로 보입니다.즉 짧은 주행거리의 데이터가 몰려있고 일부 차량이 높은 주행거리를 가지고 있습니다.

그렇지 않고 위의 기울어짐 정도라든가 뾰족한 정도를 수치화 해서 세밀하게 비교허고 싶으면 왜도 값과 첨도값을 확인해야됩니다.

2. 더 예쁘게 시각화하기 (자동화 코드 사용_  source('chj.R'))
# 필요한 라이브러리 로드
library(modeest)

# 데이터 불러오기
setwd('c:\\data')
usedcars <- read.csv('usedcars.csv', header=T)

# 사용하고자 하는 데이터 지정하기
mileage <- usedcars$mileage

# 평균값, 중앙값, 최빈값 계산 함수
calculate_stats <- function(data) {
  mean_value <- mean(data)
  median_value <- median(data)
  mode_value <- density(data)$x[which.max(density(data)$y)]
  return(list(mean = mean_value, median = median_value, mode = mode_value))
}

# 통계량 계산
mileage_stats <- calculate_stats(mileage)

# 1. 대칭분포 그래프 그리기
hist(mileage, breaks=30, col="grey", border="white", prob=TRUE, main="대칭분포", xlab="값", ylab="밀도")
lines(density(mileage), col="red")  # 확률 밀도 함수 그래프
abline(v=mileage_stats$mean, col="blue", lwd=2, lty=2)   # 평균값
abline(v=mileage_stats$median, col="green", lwd=2, lty=2) # 중앙값
abline(v=mileage_stats$mode, col="purple", lwd=2, lty=2)  # 최빈값


1. 왜도:  데이터의 좌우로 기울어짐의 정도

 왜도값 > 0  :  오른쪽으로 꼬리가 길다. 즉 왼쪽으로 데이터가 치우쳐져 있다.
 왜도값 < 0 :   왼쪽으로 꼬리가 길다. 즉 오른쪽으로 데이터가 치우쳐져 있다.

 

# 왜도 시각화 코드 

# 필요한 패키지 설치
install.packages("e1071")
install.packages("ggplot2")
install.packages("gridExtra")

# 패키지 로드
library(e1071)
library(ggplot2)
library(gridExtra)

# 양수 왜도를 가지는 데이터 생성
set.seed(42)
data_positive_skew <- rlnorm(1000, meanlog = 0, sdlog = 1)

# 음수 왜도를 가지는 데이터 생성
data_negative_skew <- -rlnorm(1000, meanlog = 0, sdlog = 1)

# 왜도 계산
skew_positive <- skewness(data_positive_skew)
skew_negative <- skewness(data_negative_skew)

# 데이터 시각화
df_positive <- data.frame(value = data_positive_skew)
df_negative <- data.frame(value = data_negative_skew)

# 양수 왜도 그래프
plot_positive <- ggplot(df_positive, aes(x = value)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "blue", alpha = 0.5) +
  geom_density(color = "red", size = 1) +
  ggtitle(paste("Positive Skewness (Skewness =", round(skew_positive, 2), ")")) +
  xlab("Value") +
  ylab("Density")

# 음수 왜도 그래프
plot_negative <- ggplot(df_negative, aes(x = value)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "blue", alpha = 0.5) +
  geom_density(color = "red", size = 1) +
  ggtitle(paste("Negative Skewness (Skewness =", round(skew_negative, 2), ")")) +
  xlab("Value") +
  ylab("Density")

# 두 개의 그래프를 하나로 출력
grid.arrange(plot_positive, plot_negative, ncol = 2)
문제1. 중고차 주행거리의 왜도값을 구하고 해석하시오 ! 
install.packages("fBasics") 
library(fBasics) 
skewness( car$mileage ) 
hist(car$mileage)​
설명: 주행거리 데이터가 오른쪽으로 꼬리가 긴 분포를 보이고 있고 왜도값고 양수값으로 출력되고 있음.
양의 왜도는 데이터가 평균 보다 더 낮은 값에서 많이 분포하고 있고, 일부 높은 값이 존재함을 의미합니다.
문제2. 중고차의 가격의 히스토그램 그래프와 왜도값을 구하고 그래프를 해석하시오. 
install.packages("fBasics") 
library(fBasics) 
skewness( car$price ) 
hist(car$price)​

설명: 가격 데이터가 왼쪽으로 꼬리가 긴 분포를 보이고 있고 왜도값도 음수값으로 출력되고 있음.
음의 왜도는 데이터가 평균 보다 더 높은 값에서 많이 분포하고 있고, 일부 낮은 값이 존재함을 의미합니다.

2. 첨도:  위아래 뾰족한 정도 

  첨도 값이 3에 가까울 수록 정규분포에 속하고  3보다 작은 경우 완만한 곡선, 3보다 크면 뾰족한 곡선입니다.
 
- 높은 첨도: 극단값의 영향이 크고 정규성 가정이 위반 될 수 있음.
         -> 해결방법: 극단값 처리나 데이터 스케링으로 해결 할 수 있음
- 낮은 첨도: 분포가 평평하여 데이터의 중심경향을 파악하기 어려울 수 있음
         -> 해결방법: 데이터 스켈링이나 샘플 데이터의 크기의 증가로 해결

# 첨도 시각화 코드 

# 필요한 패키지 설치
install.packages("e1071")
install.packages("ggplot2")
install.packages("VGAM")

# 패키지 로드
library(e1071)
library(ggplot2)
library(VGAM)

# 데이터 생성
set.seed(42)
data_normal <- rnorm(1000, mean = 0, sd = 1)  # 정규 분포
data_high_kurtosis <- rlaplace(1000, location = 0, scale = 1)  # 양의 첨도 분포
data_low_kurtosis <- runif(1000, min = -sqrt(3), max = sqrt(3))  # 음의 첨도 분포

# 첨도 계산
kurtosis_normal <- kurtosis(data_normal)
kurtosis_high <- kurtosis(data_high_kurtosis)
kurtosis_low <- kurtosis(data_low_kurtosis)

# 데이터 프레임 생성
df_normal <- data.frame(value = data_normal, distribution = "Normal")
df_high <- data.frame(value = data_high_kurtosis, distribution = "High Kurtosis")
df_low <- data.frame(value = data_low_kurtosis, distribution = "Low Kurtosis")
df_all <- rbind(df_normal, df_high, df_low)

# 데이터 시각화
plot_kurtosis <- ggplot(df_all, aes(x = value, color = distribution)) +
  geom_density(size = 1.2) +
  ggtitle("Distributions with Different Kurtosis") +
  xlab("Value") +
  ylab("Density") +
  theme_minimal() +
  scale_color_manual(values = c("blue", "red", "green")) +
  annotate("text", x = 2, y = 0.3, label = paste("Normal Kurtosis =", round(kurtosis_normal, 2)), color = "blue") +
  annotate("text", x = 2, y = 0.25, label = paste("High Kurtosis =", round(kurtosis_high, 2)), color = "red") +
  annotate("text", x = 2, y = 0.2, label = paste("Low Kurtosis =", round(kurtosis_low, 2)), color = "green")

# 첨도 그래프 출력
print(plot_kurtosis)
문제1. 첨도값 확인하는 R 코드
install.packages("e1071")
library(e1071)

result <-  kurtosis(car$mileage)
print(result)
hist(car$mileage)​

설명: 첨도 값 1.504747은 excess kurtosis 로 계산된 것임. 이는 정규 분포 첨도(3)을 기준으로 한 초과 첨도임. 
즉, 실제 첨도는 1.5047474 +3  = 4.5047474 임.

높은 첨도로 해석되고 실제 첨도값 3보다 큰 4.5047474이므로 이 데이터 분포는 정규 분포보다 뾰족한 형태를 가지고 있음. 이는 데이터가 평균 근처에 많이 몰려있고 극단값이 정규분포보다 더 많음을 의미함.

대부분 차량 주행거리가 비교적 짧으며, 데이터 평균 근처에 많이 몰려있음.

문제2. 중고차 가격의 첨도값과 히스토그램 그래프를 그려서 해석하시오.
result <-  kurtosis(car$price)
print(result)
hist(car$price)​
첨도값: 0.4333284

설명: 첨도 값 0.4333284은 excess kurtosis 로 계산된 것임. 이는 정규 분포 첨도(3)을 기준으로 한 초과 첨도임. 
즉, 실제 첨도는0.4333284+3  = 3.4333284임.

높은 첨도로 해석되고 실제 첨도값 3와 비슷한 3.4333284이므로 이 데이터 분포는 정규 분포와 비슷한 분포를 보이고 있음. 데이터가 평균 근처에 많이 몰려있고 극단값이 적당히 존재하고 있음.

이와 같이 예쁜 정규분포의 차 가격 데이터로 어떤 데이터분석을 할 수 있는가 ?
     질문1: 2010년 이전 차량과 2010년 이후 차량의 가격의 중앙값의 차이가 있는가?
     질문2: 가솔린 차량과 디젤 차량의 가격 중앙값의 차이가 있는가 ?
     질문3: 주행거리와 차량 가격과의 상관관계가 있는가 ?

1장의 내용은 숫자로 되어있는 데이터의 데이터 분석 문자로 되어있는 데이터분석시 미리 알아둬야할 내용을  설명하고 있음