초보자의 빅데이터 정복기
22-08-31 chap12_CorrelationAnalysis 본문
# 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)
'아이티월 수업일지(R)' 카테고리의 다른 글
22-08-31chap13_1_Eigenvalue, chap13_2_PrincipalComponent (0) | 2022.08.31 |
---|---|
22-08-31 chap19_AssociationAnalysis (0) | 2022.08.31 |
22-08-30 chap18_ClusteringAnalysis (0) | 2022.08.31 |
22-08-26 chap17_RandomForest (0) | 2022.08.29 |
22-08-25 chap16_DecisionTree (0) | 2022.08.29 |