Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Archives
Today
Total
관리 메뉴

초보자의 빅데이터 정복기

22-08-31 chap12_CorrelationAnalysis 본문

아이티월 수업일지(R)

22-08-31 chap12_CorrelationAnalysis

서부남93 2022. 8. 31. 12:43

# chap12_CorrelationAnalysis

######################################
# 1. 피어슨(Pearson) 상관계수
######################################
# - 두 변수 x,y의 상관성(관련성) 분석 
# - 사용 변수 : 숫자형 변수(등간/비율)
# - 관련함수 : cor(), cov(), cov2cor() 

product <- read.csv("C:/ITWILL/3_Rwork/data/product.csv")
head(product) # 친밀도 적절성 만족도(등간척도 - 5점 척도)

# 기술통계량
summary(product) # 요약통계량

sd(product$제품_친밀도); sd(product$제품_적절성); sd(product$제품_만족도)
# 변수 간의 상관관계 분석 
# 형식) cor(x,y, method) # x변수, y변수, method(pearson): 방법

# 1) 상관계수(coefficient of correlation) : 두 변량 X,Y 사이의 상관관계 정도를 나타내는 수치(계수)
cor(product$제품_친밀도, product$제품_적절성, method="pearson") # 0.4992086 -> 다소 높은 양의 상관관계

cor(product$제품_친밀도, product$제품_만족도, method="pearson") # 0.467145 -> 다소 높은 양의 상관관계

# 전체 변수 간 상관계수 보기 : 상관계수 행렬 
cor(product, method="pearson") # 피어슨 상관계수 - default

# 방향성 있는 색생으로 표현 - 동일 색상으로 그룹화 표시 및 색의 농도 
install.packages("corrgram") # corrgram()함수 
library(corrgram)
corrgram(product) # 색상 적용 - 동일 색상으로 그룹화 표시
corrgram(product, upper.panel=panel.conf) # 수치(상관계수) 추가(위쪽)
corrgram(product, lower.panel=panel.conf) # 수치(상관계수) 추가(아래쪽)

# 차트에 곡선과 별표 추가
install.packages("PerformanceAnalytics") # chart.Correlation()
library(PerformanceAnalytics) 

# 상관성,p값(*),정규분포 시각화 - 모수 검정 조건 
chart.Correlation(product, histogram=TRUE) 

# 상관계수 행렬 시각화 
install.packages('corrplot') # corrplot()
library(corrplot) # 상관계수 시각화 
corrplot( cor(product, method="pearson") )


# 자동차 연비 관련 dataset 
str(mtcars)

# 연비 vs 차체 무게 
cor(mtcars$mpg, mtcars$wt) # -0.8676594
# 산점도 + 회귀선 
plot(wt ~ mpg, data=mtcars)
abline(lm(mtcars$wt ~ mtcars$mpg), col='red')

# 상관계수 행렬 
c_re <- cor(mtcars)
str(c_re) # num [1:11, 1:11]

# mpg vs 나머지변수 상관계수 
mpg_cor <- c_re[,1]
mpg_cor # wt, cyl, disp 변수와 음의 상관성 높다.

# 상관관계 행렬 시각화
corrplot(cor(mtcars))

# 연비 vs 무게 vs 실린더 관계 
library(ggplot2) # qplot() 함수 

table(mtcars$cyl) # 4  6  8

# 연비 vs 무게 : 숫자형 
# 실린더 : 범주형 
# 형식) qplot(x, y, data, col)
qplot(wt, mpg, data = mtcars, col=cyl) # col=숫자형 
qplot(wt, mpg, data = mtcars, col= factor(cyl)) # col=요인형 


# 2) 공분산(covariance) : 두 변량 X,Y의 관계를 나타내는 양
cov(product) # 공분산 행렬

cov2cor(cov(product)) # 공분산 행렬 -> 상관계수 행렬 변환(기존 상관계수와 동일함) 

# 3) 상관계수 vs 공분산
# [1] 공분산 : 두 확률변수 간의 분산(평균에서 퍼짐 정도)를 나타내는 통계
#  - Cov(X,Y) = sum( (X-𝒙_bar) * (Y-𝒚_bar) ) / n
#  - 문제점 : 값이 큰 변수에 영향을 받는다.(값 큰 변수가 상관성 높음) : 

# [2] 상관계수 : 공분산을 각각의 표준편차로 나눈어 정규화한 통계
#   - 공분산 문제점 해결 
#   - 부호는 공분산과 동일, 값은 절대값 1을 넘지 않음(-1 ~ 1)    
#   - Corr(X, Y) = Cov(X,Y) / std(X) * std(Y)

getwd() # C:/ITWILL/3_Rwork/data
score_iq <- read.csv('score_iq.csv')

str(score_iq)

range(score_iq$iq) # 105 140
range(score_iq$academy) # 0 4

cov(score_iq[-1]) # sid 제외 
# score vs iq : 51.33
# score vs academy : 7.11

cor(score_iq[-1]) 
# score vs iq : 0.882
# score vs academy : 0.89


# [공분산 문제점 해결방안] : 데이터변환(표준화, 정규화) : 일정범위로 맞춤  
# 스케일링(scaling) : 척도/규모/범위 맞추기 

# 1. 표준화(standard scaling) : z = (x - x_bar) / sigma
df <- score_iq[-1]
df

# 모든 변수를 평균(0), 표준편차(1) 맞춤 
z_score <- scale(df) # df -> matrix 
summary(z_score) 

sd(z_score[,2])# iq
sd(z_score[,3])# academy

cov(z_score)
# score vs iq : 0.882
# score vs academy : 0.89


# 2. 정규화(min-max scaling)
# - 모든 변수를 최솟값(0), 최댓값(1) 맞춤
# 식 = (x - min(x)) / (max(x) - min(x))

nor_scale <- function(x){
  nor <- (x - min(x)) / (max(x) - min(x))
  return(nor)
}


nor_score <- apply(df, 2, nor_scale)
summary(nor_score)


cov(nor_score)
# score vs iq : 0.058
# score vs academy : 0.071



######################################
# 2. 스피어만(Spearman) 상관계수
######################################
# - 서열척도 변수를 대상으로 단조 증가 또는 하강하는 관계를 나타내는 계수 

# 예) 국어성적 석차와 영어성적 석차의 관계
# cor(국어성적_석차, 영어성적_석차, method = "spearman") 

# 점수 
kor_score <- round(runif(10, min=50, max = 90)) # 50~90
eng_score <- round(runif(10, min=40, max = 75)) # 40~75

# 점수 석차 : 오름차순 정렬 
kor_score_rank <- sort(kor_score)
eng_score_rank <- sort(eng_score)

# 내림차순 순위, 동점 : 낮은 값 기준 정수화  
rank(-kor_score, ties.method = 'min')
# [1]  1  2  4 10  2  6  7  9  8  4


# 스피어만 상관계수 
cor(kor_score_rank, eng_score_rank, method = "spearman") #  0.9939024

plot(kor_score_rank, eng_score_rank) 











Comments