시계열 분석(Timeseries Analysis)      

 

: 어떤 현상에 대해서 시간의 변화에 따라 일정한 간격으로 현상의 변화를 기록한 시계열 데이터를 대상으로 미래의 변화에 대한 추세를 분석하는 방법, 시간 경과에 따른 관측 값의 변화를 패턴으로 인식하여 시계열 모형을 추정하고, 이 모형을 통해서 미래의 변화에 대한 추세를 예측하는 분석방법입니다. (시계열 자료 - 시간의 흐름에 따라 관찰된 데이터)

 

- 과거로 부터 현재까지의 변화를 통해서 향후 미래를 예측 (현상 이해 -> 미래 예측)

 

 

시계열 자료 분류

 

① 정상성(stationary) 시계열 

 

: 어떤 시계열자료의 변화 패턴이 평균값을 중심으로 일정한 변동폭을 갖는 시계열

  (시간의 추이와 관계 없이 평균과 분산이 일정) 

 

- 대부분의 시계열 자료는 다루기 어려운 비정상성 시계열 자료이기 때문에 분석하기 쉬운 정상성 시계열 자료로 변환

 

평균이 일정 : 모든 시점에 대해 일정한 평균을 가진다.

- 평균이 일정하지 않은 시계열은 차분(difference)을 통해 정상화

- 차분은 현시점 자료에서 이전 시점 자료를 빼는 것

- 일반차분 : 바로 전 시점의 자료를 빼는 것

- 계절차분 : 여러 시점 전의 자료를 빼는 것, 주로 계졀성을 갖는 자료를 정상화 하는데 상용 

 

분산도 시점에 의존하지 않음

- 분산이 일정하지 않은 시계열은 변환(transformation)을 통해 정상화

 

공분산도 시차에만 의존하지 않음 

 

 

② 비정상성 (non-stationary) 시계열 

: 대부분 시계열자료

 

- 시간의 추이에 따라서 점진적으로 증가하는 추세


- 분산이 일정하지 않은 경우

 

 

 

시계열 분석 특징


① y변수 존재 : 시간 t를 설명변수(x)로 시계열(Yt)을 반응변수(y)로 사용

                  - 설명변수(=독립변수), 반응변수(=종속변수)


② 미래 추정 : 과거와 현재의 현상을 파악하고 이를 통해서 미래 추정

                 - 현상 이해 -> 미래 예측


③ 계절성 자료 : 시간 축을 기준으로 계절성이 있는 자료를 데이터 셋으로 이용

                    - 계절성의 자료가 내포  


④ 모수 검정 : 선형성, 정규성, 등분산성 가정 만족


⑤ 추론 기능 : 유의수준 판단 기준이 존재하는 추론통계 방식

추론 통계 분석 : 가설설정 -> 유의수준 임계값 정의 -> 측정도구 결정 -> 데이터 수집  -> 데이터 분석

-> 최종결과 유의수준을 기준으로 판단 검증

추론통계 방식을 사용하는 이유 : 추론 통계의 접근 방식이 모집단을 대표하는 샘플 데이터를 통해 전체를 추정


⑥ 활용분야 : 경기예측, 판매예측, 주식시장분석, 예산 및 투자 분석, 교통수요 등

 

 

 

시계열 분석 적용 범위


① 기존 사실에 대한 결과 규명 : 주별, 월별, 분기별, 년도별 분석을 통해서 고객의 구매 패턴을 분석


② 시계열자료 특성 규명 : 시계열에 영향을 주는 일반적인 요소(추세, 계절, 순환, 불규칙)를 분해해서 분석한다.(시계열 요소 분해법)


③ 가까운 미래에 대한 시나리오 규명 : 탄소배출 억제를 성공 했을 때와 실패 했을 때 지구 온난화는 얼마나 심각해질 것인가를 분석한다.


④ 변수와 변수의 관계 규명 : 경기선행지수와 종합주가지수의 관계를 분석한다.(국가 경제와 주가지수 관계)


⑤ 변수 제어 결과 규명 : 입력 변수의 제어(조작)를 통해서 미래의 예측 결과를 통제할 수 있다.(판매 촉진에 영향을 주는 변수 값을 조작할 경우 판매에 어떠한 영향을 미치는가?)

 

 

 

시계열 데이터 특성

 

① 추세 변동(Trend variation: T) 
 - 인구 변동, 지각변동, 기술변화 등 상승과 하락의 영향(장기 변동요인) , 앞으로 나아갈 방향성 

 
② 순환 변동(Cyclical variation: C)
 - 2년~10년의 주기에서 일정한 기간 없는 반복적 요소(중․장기 변동요인)

 

③ 계절 변동(Seasonal variation: S)
 - 일정한 기간(월, 요일, 분기), 1년 단위 반복적 요소(단기 변동요인)

 

④ 불규칙변동(Irregular variation: I)
 - 어떤 규칙 없이 예측 불가능한 변동요인(설명할 수 없는 요인) - white noise 
 - 실제 시계열자료에서 추세, 순환, 계절 요인을 뺀 결과(회귀분석 오차)

 

 

시계열 분석 절차

 

정상성시계열로 변환 

 

비정상 시계열 -> 정상성 시계열 : 평균 정상화 : 차분

비정상 시계열 -> 정상성 시계열 : 분산 정상화 : 로그 -> 차분

 

 

 

 

모형 생성 : 시계열 모형 생성의 대표적인 방법(현재 가장 많이 이용)

 

- 정상성을 가진 시계열 모형
자기회귀모형(AR), 이동평균모형(MA), 자기회귀이동평균모형(ARMA)

 

- 비정상성을 가진 시계열 모형(차수 적용)

자기회귀누적이동평균모형(ARIMA)

 

 

 

 

1. 시계열 자료 확인

비정상성 시계열 -> 정상성 시계열 

 

① 데이터 셋 가져오기

data("AirPassengers") # 12년(1949~1960년)간 매월 항공기 탑승 승객 수를 기록한 시계열 자료.

str(AirPassengers) 
출력값 : Time-Series [1:144] from 1949 to 1961: 112 118 132 129 121 135 148 148 136 119 ...

View(AirPassengers)

< 승객 탑승 수 >

 

② 차분(Differencing) 적용 - 현재 시점에서 이전 시점의 자료를 빼는 연산으로 평균을 정상화하는데 이용 : 평균 정상화

x11()
par(mfrow=c(1,2))
ts.plot(AirPassengers)  - 비정상성 시계열 데이터
log <- diff(log(AirPassengers)) # 로그+차분 수행 
plot(log)

ts.plot( ) : 시계열 시각화 

diff( ) : 차분 적용

             비정상성의 시계열 데이터     ->    정상성의 시계열 데이터(차분+로그) 

 

 

 

 

2. 시계열 자료 시각화 

- 단일 시계열 자료 시각화 

① WWWusage 데이터 셋 가져오기 - R에서 기본 제공 데이터 셋으로 인터넷 사용 시간을 분 단위로 측정한 100개 vector로 구성된 시계열 자료

data("WWWusage")
str(WWWusage) # Time-Series [1:100] from 1 to 100:
출력값 : Time-Series [1:100] from 1 to 100: 88 84 85 85 84 85 83 85 88 89 ...

WWWusage

 

② 시계열 자료 추세선 시각화 


- 추세 : 어떤 현상이 일정한 방향으로 나아가는 경향. 주식시장분석이나 판매예측등에서 어느 기간동안 같은 방향으로 움직이는 경향을 의미


- 추세선 : 추세를 직선이나 곡선 형태로 차트에서 나타내는 선(어느 정도 평균과 분산 확인 가능)

X11()
ts.plot(WWWusage, type="l", col="red")

- 다중 시계열 자료 시각화 

 

①  데이터 셋 가져오기

data("EuStockMarkets") # 유럽(1991~1998년)의 주요 주식의 주가지수 일일 마감 가격.

head(EuStockMarkets) # DAX(독일) SMI(스위스) CAC(프랑스) FTSE(영국)

- 출력값 -
         DAX    SMI    CAC   FTSE
[1,] 1628.75 1678.1 1772.8 2443.6
[2,] 1613.63 1688.5 1750.5 2460.2
[3,] 1606.51 1678.6 1718.0 2448.2
[4,] 1621.04 1684.1 1708.1 2470.4
[5,] 1618.16 1686.6 1723.1 2484.7
[6,] 1610.61 1671.6 1714.3 2466.8

str(EuStockMarkets) - 레코드 : 1860개 , 컬럼 4개 

- 출력값 -
Time-Series [1:1860, 1:4] from 1991 to 1999: 1629 1614 1607 1621 1618 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "DAX" "SMI" "CAC" "FTSE"

 

② 데이터프레임으로 변환

EuStock <- data.frame(EuStockMarkets)

head(EuStock)

- 출력값 -
      DAX    SMI    CAC   FTSE
1 1628.75 1678.1 1772.8 2443.6
2 1613.63 1688.5 1750.5 2460.2
3 1606.51 1678.6 1718.0 2448.2
4 1621.04 1684.1 1708.1 2470.4
5 1618.16 1686.6 1723.1 2484.7
6 1610.61 1671.6 1714.3 2466.8

 

③ 단일 시계열 데이터 추세선

X11()
plot(EuStock$DAX[1:1000], type = "l", col="red") # 선 그래프 시각화 

- 1000개의 데이터를 먼저 가져와서 시각화 

 

④ 다중 시계열 데이터 추세선 

plot.ts(cbind(EuStock$DAX[1:1000], EuStock$SMI[1:1000]), main="주가지수 추세선")

 

 

 

 

3. 시계열 요소 분해 시각화

시계열 요소 분해 시각화 

 

① 시계열 자료 준비 

data <- c(45,56,45,43,69,75,58,59,66,64,62,65,
          55,49,67,55,71,78,71,65,69,43,70,75,
          56,56,65,55,82,85,75,77,77,69,79,89)

length(data) 출력값 : 36

 

② 시계열자료 생성 : 시계열 자료 형식으로 객체 생성 

tsdata <- ts(data, start = c(2016, 1), frequency = 12) #시작 : 2016년 1월, 주기: 12

tsdata # 2016~2018

- 출력값 -
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2016  45  56  45  43  69  75  58  59  66  64  62  65
2017  55  49  67  55  71  78  71  65  69  43  70  75
2018  56  56  65  55  82  85  75  77  77  69  79  89

 

③ 추세선 확인

par(mfrow=c(1,1))
ts.plot(tsdata) # plot(tsdata)와 동일함.

④ 시계열 분해- stl( ) : 계절요소, 추세, 잔차 등 모두 제공

plot(stl(tsdata, "periodic")) # periodic : 주기 

각각의 특징을 시각화 하여 출력 

 

-> 기본 

 

 

-> 계절변동 (Seasonal variation: S)

- 1년 단위의 반복되어지는 특징을 가짐 

 

 

-> 추세변동 (Trend variation: T)) 

- 증가  

 

 

-> 잔차(오차) : 관측치와 예측치 사이의 오차 

 

 

 

 

 

⑤ 시계열 분해와 변동 요인 제거

m <- decompose(tsdata) # decompose()함수 이용 시계열 분해 

attributes(m) # 변수 보기 

- 출력값 -
$names
[1] "x"        "seasonal" "trend"    "random"   "figure"   "type"    

$class
[1] "decomposed.ts

plot(m) # 추세요인, 계절요인, 불규칙 요인이 포함된 그래프.

 

 

 

-> 기본 데이터 셋 

 

 

 

-> 추세 요인 

 

 

-> 계절 요인(년단위 주기의 특징)

 

 

 

-> 불규칙(white noise) 

 

 

 

 

plot(tsdata - m$seasonal) # 계절요인을 제거한 그래프.

                             - 계절요인 제거한 추세선 

 

⑥ 추세요인과 불규칙요인 제거 

plot(tsdata - m$trend) # 추세요인 제거 그래프 

plot(tsdata - m$seasonal - m$trend) # 불규칙 요인만 출력.

 

 

 

 

4. 자기 상관 함수/ 부분 자기 상관 함수

 

자기상관함수(Auto Correlation Function)

부분자기상관함수(Partial Auto Correlation Function)

- 자기상관성 : 자기 상관계수가 유의미한가를 나타내는 특성
- 자기상관계수 : 시계열 자료에서 시차(lag)를 일정하게 주는 경우 얻어지는 상관 계수 

 

- 시계열 변수의 시간에 따른 자기 상관 관계를 나타내는 것입니다. 계열 상관, 교차자기 상관이라고도 합니다. 상관이 특정 시간에 대한 변수간의 상관관계라면, 자기상관은 시간의 변화에 따른 변수 간의 상관관계 변화가 주 관심사입니다.

 

어떤 시계열 데이터가 일정한 패턴을 본인다면, 자기 상관이 있따는 것을 뜻합니다. 시간에 따라 변수의 값이 자기상관성을 가지고 변화하므로, 무작위가 아닌 일정한 패턴을 보여준다고 할 수 있습니다. 

 

- 자기 상관을 어떻게 활용할 수 있을까요? 바로 데이터의 무작위성을 파악할 수 있습니다.

자기상관 데이터가 ( - )에 가까울 수록, 무작위성이 있는 시계열 데이터로 판단할 수 있습니다. 0보다 큰값을 가질수록 자기상관을 강하게 가진다고 할 수 있습니다.

 

① 시계열자료 생성 

input <- c(3180,3000,3200,3100,3300,3200,3400,3550,3200,3400,3300,3700)
length(input) 출력값 : 12

tsdata <- ts(input, start = c(2015, 2), frequency = 12) # Time Series
tsdata

- 출력값 -
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2015      3180 3000 3200 3100 3300 3200 3400 3550 3200 3400 3300
2016 3700           

 

② 자기상관함수 시각화 

acf(na.omit(tsdata), main="자기상관함수", col="red")

 

 

 

 

 

- 첫번째의 값은 자기 자신과의 관계이므로 1이 나올 수 밖에 없다. 

 

- 파란선(임계치) 안에 들어오면 자기상관계에 의해서 데이터셋 자체는 자기 상관성과 관련해서 자기상관성이 없음을 보여준다. 

 

- 일정주기로 체크해봤을 때, 자기상관성이 없다.

 

 

 

 

 

 

③ 부분자기상관함수 시각화 

pacf(na.omit(tsdata), main="부분자기상관함수", col="red")

 

 

파란색 안에 들어오면 자기상관성이 없음. 

 

시계열 데이터 시간의 의존성 여부가 무작위성을 띄느냐 띄지 않느냐를 자기상관함수로 판단할 수 있다. 

 

무작위성을 띈다는 것은 random을 의미하고, 무작위성이 있다는 것을 이야기하고, 파란선(임계치)를 넘어가는 것을 의미한다. 

 

 

 

 

 

 

 

 

 

 

 

5. 추세 패턴 찾기 시각화 

추세패턴

:시계열 자료가 증가 또는 감소하는 경향이 있는지 알아보고, 증가나 감소의 경향이 선형인지 비선형인지를 찾는 과정

 

- 시계열 자료의 추세 패턴 찾기 시각화

 

① 시계열 자료 생성

input <- c(3180,3000,3200,3100,3300,3200,3400,3550,3200,3400,3300,3700)

# Time Series
tsdata <- ts(input, start = c(2015, 2), frequency = 12)

 

② 추세선 시각 

plot(tsdata, type="l", col="red")

③ 자기상관 함수 시각화 

acf(na.omit(tsdata), main="자기상관함수", col="red")

④ 차분 시각화 

plot(diff(tsdata, differences=1))

 

 

 

 

6. 평활법(Smoothing Method)  

: 수학/통계적 방법의 분석이 아닌 시각화를 통한 직관적 방법의 데이터 분석 방법

 

- 해석에 있어서 차이점이 발생할 수 있고, 주관적인 개입이 발생할 수 있다. 

- 단기 예측용으로, 1개(일변량) 

- 시계열 자료의 체계적인 자료의 흐름을 파악하기 위해서 과거 자료의 불규칙적인 변동을 제거하는 방법

  (불규칙성의 배제) 


- 이동 평균(Moving Average - ma) : 시계열 자료를 대상으로 일정한 기간의 자료를 평균으로 계산하고, 이동 시킨

  추세를 파악하여 추세를 예측하는 분석 기법 

 

- 지수 평활법 : 전체 데이터를 평균을 계산하고, 전체 평균에 가장 최근의 값을 기준으로 일정 가정치를 부여해 가면서    추적해가는 분석 기법 (최근 데이터의 비중이 높음) 

 

이동 평균 vs 지수 평활법 

 

- 모든 관측치에 동일한 가중치를 부여하여 이동평균법은 최근 관측치나 오래된 관측치나 동일한 가중치를 사용하므로    정보를 동리하게 이용하는 단점이 잇고 과거 추세 패턴을 인지함

- 최근 관측치에 가중치, 멀어질수록 지수적으로 가중치 값 감소시키는 방법인 미래 예측에 사용. 

 

① 시계열  자료 생성 

data <- c(45,56,45,43,69,75,58,59,66,64,62,65,
          55,49,67,55,71,78,71,65,69,43,70,75,
          56,56,65,55,82,85,75,77,77,69,79,89)
length(data) 출력값 : 36

tsdata <- ts(data, start = c(2016, 1), frequency = 12)

tsdata

- 출력값 - 
      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2016  45  56  45  43  69  75  58  59  66  64  62  65
2017  55  49  67  55  71  78  71  65  69  43  70  75
2018  56  56  65  55  82  85  75  77  77  69  79  89

 

② 평활 관련 패키지 설치 

install.packages("TTR")
library(TTR)

 

③ 이동평균법으로 평활 및 시각화 

plot(tsdata, main="원 시계열 자료") # 시계열 자료 시각화 
plot(SMA(tsdata, n=1), main="1년 단위 이동평균법으로 평활")
plot(SMA(tsdata, n=2), main="2년 단위 이동평균법으로 평활")
plot(SMA(tsdata, n=3), main="3년 단위 이동평균법으로 평활")

- 1년 단위 : 거의 그대로 유지 

- 2년 단위 : 급격한 변화들이 완만한 형태의 추세선으로 변화

- 3년 단위 : 확연히 차이가 나도록 완만한 형태의 추세선으로 변화 

  (불규칙성의 배제로 인한 완만하게 평균적 의미로 파악) 

 

 

 

 

7. ARIMA(Auto-regressive Integrated  Moving Average) 모형 시계열 예측

 

: ARIMA 모델은 시계열 분석 기법의 한 종류로, 과거의 관측값과 오차를 사용해서 현재의 시계열 값을 설명하는 ARMA 모델을 일반화 한 것입니다.  이는 ARMA 모델이 안정적 시계열(Stationary Series)에만 적용 가능한 것에 비해, 분석 대상이 약간은 비안정적 시계열(Non Stationary Series)의 특징을 보여도 적용이 가능하다는 의미입니다.

 

- 자기회귀누적이동평균모형(ARIMA)
- 형식) ARIMA(p, d, q) : 3개의 인수
- p : AR모형 차수, d : 차분 차수, q : MA모형 차수

[ARIMA(p,d,q) 모형 → 정상성 시계열 모형 식별] 
d=0이면, ARMA(p, q)모형이며, 정상성을 만족한다. 
q=0이면 IAR(p, d)모형이며, d번 차분하면 AR(p) 모형을 따른다. 
p=0이면 IMA(d, q)모형이며, d번 차분하면 MA(q) 모형을 따른다.

 

 정상성시계열의 비계절형 

 

① 시계열자료 특성분석

데이터 준비 
input <- c(3180,3000,3200,3100,3300,3200,3400,3550,3200,3400,3300,3700)


시계열 객체 생성(12개월:2015년 2월 ~ 2016년 1월)
tsdata <- ts(input, start = c(2015, 2), frequency = 12)
tsdata

- 출력값 -
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2015      3180 3000 3200 3100 3300 3200 3400 3550 3200 3400 3300
2016 3700                      


추세선 시각화(정상성시계열 vs 비정상성시계열) 
plot(tsdata, type="l", col='red')

② 정상성시계열 변환 

par(mfrow=c(1,2))
ts.plot(tsdata)
diff <- diff(tsdata)
plot(diff)

③ 모형 식별과 추정 

install.packages('forecast')
library(forecast)

arima <- auto.arima(tsdata) # 시계열 데이터 이용.
arima

auto.arima( ) : 통계학에서 정의하는 모형을 제공(모형에 대한 식별)  - 모형과 차수 제공

 

형식) ARIMA(p, d, q) : 3개의 인수 
p : AR모형 차수, d : 차분 차수, q : MA모형 차수

 

[ARIMA(p,d,q) 모형 → 정상성 시계열 모형 식별]
d=0이면, ARMA(p, q)모형이며, 정상성을 만족한다.
q=0이면 IAR(p, d)모형이며, d번 차분하면 AR(p) 모형을 따른다.
p=0이면 IMA(d, q)모형이며, d번 차분하면 MA(q) 모형을 따른다.

 

= ARIMA(1,1,0) - IAR(p, d)모형, d번 차분하면 AR(p) 모형을 따른다.

(*차분을 한번만 한다고 균일한 값을 찾아가는 것이 아니다)

 

결론 : 1번 차분한 결과가 정상성시계열의 AR(1) 모형으로 식별된 AIC(Akaike’s Information Criterion)/BIC(Bayesian Information Criterion) : 이론적 예측력을 나타내는 지표 

(값이 적은 모형 채택)

 

 

예측을 위한 모형 생성 

- 이전 단계에서 식별된 모형과 파라미터를 이용하여 시계열 모형 생성

model <- arima(tsdata, order=c(1,1,0))
model

 

⑤ 모형 진단(모형 타당성 검정)

잔차가 백색 잡음(white noise) 검정(모형의 잔차가 불규칙적이고, 독립적)

 

- 1)  자기상관함수에 의한 모형 진단

tsdiag(model)

 

 

 

 

 

 

-> 자기상관함수 

모두 파란선(임계치) 안에 들어있음 

= 자기 상관관계가 없음

= 규칙성이 없음 = 불규칙성

= p value값이 0 이상로 분포

(ARIMA모형은 매우 양호한 시계열 모형)

= 모델 적합 

 

 

 

 

 

- 2) Box-Ljung에 의한 잔차항 모형 진단(잔차 값을 통한 모형)

Box.test(model$residuals, lag = 1, type = "Ljung")

Box-Ljung 검정방법은 모형의 잔차를 이용하여 카이제곱검정 방법으로 시계열 모형이 통계적으로 적절한지를 검정하는 방법으로 p-value가 0.05 이상이면 모형이 통계적으로 적절하다고 볼 수 있습니다. 

 

p-value = 0.7252 > 0.05 모델 적합 (모형이 통계적으로 적절)

 

 

⑥ 미래 예측(업무 적용)

- 모형 진단을 통해서 적절한 모형으로 판단되면 이 모형으로 가까운 미래를 예측하는데 이용

- forecast 패키지에서 제공하는 forecast() 함수는 시계열의 예측치를 제공하는 함수로 기본 기간은 2년(24개월)

fore <- forecast(model) # 향후 2년 예측 
fore

par(mfrow=c(1,2))
plot(fore) # 향후 24개월 예측치 시각화 

model2 <- forecast(model, h = 6) # 향후 6개월 예측치 시각화 
plot(model2)

 

 

 

 

8. 정상성 시계열의 계절형

 

① 시계열자료 특성분석

 

1) 시계열자료 생성 

Aripassengers -  # 12년(1949~1960년)간 매월 항공기 탑승 승객 수를 기록한 시계열 자료.

tsdata <- AirPassengers

tsdata

- 측정값 - 

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 112 118 132 129 121 135 148 148 136 119 104 118
1950 115 126 141 135 125 149 170 170 158 133 114 140
1951 145 150 178 163 172 178 199 199 184 162 146 166
1952 171 180 193 181 183 218 230 242 209 191 172 194
1953 196 196 236 235 229 243 264 272 237 211 180 201
1954 204 188 235 227 234 264 302 293 259 229 203 229
1955 242 233 267 269 270 315 364 347 312 274 237 278
1956 284 277 317 313 318 374 413 405 355 306 271 306
1957 315 301 356 348 355 422 465 467 404 347 305 336
1958 340 318 362 348 363 435 491 505 404 359 310 337
1959 360 342 406 396 420 472 548 559 463 407 362 405
1960 417 391 419 461 472 535 622 606 508 461 390 432

 

2) 시계열요소분해 시각화

ts_feature <- stl(tsdata, s.window="periodic")

plot(ts_feature)

 

 

 

 

 

 

-> 계절 요인 

 

 

 

-> 추세 요인 

 

 

-> 잔차 

 

 

 

 

 

 

② 정상성 시계열 변환

par(mfrow=c(1,2))
ts.plot(tsdata)
diff <- diff(tsdata) # 평균값으로 정상화 
plot(diff) # 차분 시각화

 

③ 모형 식별과 추정

library(forecast)
ts_model2 <- auto.arima(tsdata)  
ts_model2 # ARIMA(2,1,1)(0,1,0)[12]

[ARIMA(p,d,q) 모형 → 정상성 시계열 모형 식별]
d=0이면, ARMA(p, q)모형이며, 정상성을 만족한다.
q=0이면 IAR(p, d)모형이며, d번 차분하면 AR(p) 모형을 따른다.
p=0이면 IMA(d, q)모형이며, d번 차분하면 MA(q) 모형을 따른다.

 

④ 모형 생성

model <- arima(tsdata, c(2,1,1), seasonal = list(order = c(0,1,0)))
model

 

⑤ 모형 진단(모형 타당성 검정)

 

1) 자기상관함수에 의한 모형 진단

tsdiag(model)

 

 

 

 

 

 

 

 

-> 자기상관함수

모두 파란선(임계치) 안에 들어있음 

= 자기 상관관계가 없음

= 규칙성이 없음 = 불규칙성

= p value값이 0 이상로 분포

(ARIMA모형은 매우 양호한 시계열 모형)

= 모델 적합 

 

 

 

 

 

 

 

2) Box-Ljung에 의한 잔차항 모형 진단

 

Box-Ljung 검정방법은 모형의 잔차를 이용하여 카이제곱검정 방법으로 시계열 모형이 통계적으로 적절한지를 검정하는 방법으로 p-value가 0.05 이상이면 모형이 통계적으로 적절하다고 볼 수 있습니다.

 

p-value = 0.9879 > 0.05 모델 적합 (모형이 통계적으로 적절)

 

 

⑥ 미래 예측

- 모형 진단을 통해서 적절한 모형으로 판단되면 이 모형으로 가까운 미래를 예측하는데 이용

- forecast 패키지에서 제공하는 forecast() 함수는 시계열의 예측치를 제공하는 함수로 기본 기간은 2년(24개월)

par(mfrow=c(1,2))
fore <- forecast(model, h=24) # 2년 예측 
plot(fore)
fore2 <- forecast(model, h=6) # 6개월 예측 
plot(fore2)

연관분석 (Association Analysis)

 

: 연관분석은 군집분석에 의해서 그룹핑된 cluster를 대상으로 해당 그룹에 대한 특성을 분석하는 방법으로 장바구니 분석이라고 합니다. 즉, 유사한 개체들을 클러스터로 그룹화하여 각 집단의 특성 파악합니다. 예를 들어, 제가 마트에서 ’씨리얼’ 이라는 제품을 샀으면 그와 함께 먹을 우유도 같이 구매할 확률이 높을 것입니다. 이렇게 A라는 제품을 구매하였을 때, B라는 제품도 함께 구매하는 규칙의 패턴을 구하고자 하는 것이 연관규칙 분석의 목적입니다. 유튜브, 넷플릭스 등의 플랫폼들은 모두 이러한 알고리즘들을 기반으로 컨텐츠들을 추천해주고 있습니다.

 

 

연구 분석의 기본 개념

 

지지도(support)

: 전체 데이터에서 관광지 X, Y에 대한 방문을 모두 포함하는 비율 (2개 이상 컬럼) 

 

 - X -> Y 지지도 식 = X, Y 동시에 방문한 관광객 수 / 전체 관광객 수 

                          =  n(A, B) : 두 항목(X, Y)이 동시에 포함 수  / n : 전체 수


신뢰도(confidence) 

: 관광지 X를 방문하였을 때, Y를 같이 방문할 조건부 확률

 

 - X -> Y 신뢰도 식 = X,Y 동시에 방문한 관광객 수 / X 방문 관광객 수

                          = X와 Y를 포함한 수 / X를 포함한 수

 - 값이 클수록 X를 방문하였을 때, Y를 같이 방문하는 비율이 높음 ( X를 방문하였을 때, Y를 방문할 비율 )

 

향상도(Life)

: 관광지 X를 방문하였을 때, Y를 같이 방문하는 경우와 관광지 X의 방문여부에 상관없이 Y를 방문한 경우의 비율 ( 관광지 간의 독립성과 상관성을 나타내는 척도 )

 

 - 하위 항목들이 독립에서 얼마나 벗어나는지의 정도를 측정한 값 

 - 향상도 식 =  X,Y 를 동시에 방문한 관광객 비율 / (X를 방문한 관광객 비율 * Y를 방문한 관광객 비율)

                 = 신뢰도 / Y가 포함될 거래율 

 -  향상도가 1에 가까우면 : 두 상품이 독립
 -  1보다 작으면 : 두 상품이 음의 상관성(감기약과 위장약) - 공통점을 가지지만 다른 기능 
 -  1보다 크면 : 두 상품이 양의 상관성

 -  분자와 분모가 동일한 경우 : Lift == 1, X와 Y가 독립(상관없음)
 -  분자와 분모가 동일한 경우 : Lift != 1, X와 Y가 독립이 아닌 경우(상관있음)

 
- 규칙 생성에서 support 값을 높게 설정할 수록 적은 수의 규칙만이 생성이 됩니다.(즉, 발생빈도가 높은 규칙들만 생성이 된다는 의미입니다.)

- confidence  수치가 높으면 관광지 X를 방문하면 Y를 방문할 확률이 높아지는 것과 같습니다.

= confidence 확률식 

 

 

연관분석 추가 설명 

 

 - 데이터베이스에서 사건의 연관규칙을 찾는 무방향성 데이터마이닝 기법        

 

 - 마케팅에서 고객의 장바구니에 들어있는 품목 간의 관계 탐구

 

 - 어떤 사건이 얼마나 자주 동시에 발생하는가를 표현하는 규칙 또는 조건

 

 - y변수가 없는 비지도 학습에 의한 패턴 분석

     무방향성(x -> y변수 없음)

 

 - 사건과 사건 간 연관성(관계)를 찾는 방법 (예 : 기저귀와 맥주)
    예) 장바구니 분석 : 장바구니 정보를 트랜잭션이라고 하며, 트랜잭션 내의 연관성을 살펴보는 분석기법

 

 - 분석절차 : 거래내역 -> 품목 관찰 -> 규칙(Rule) 발견

 

 - 관련분야 : 대형 마트, 백화점, 쇼핑몰 판매자 -> 고객 대상 상품추천 

    1. 고객들은 어떤 상품들을 동시에 구매하는가?
    2. 라면을 구매한 고객은 주로 다른 어떤 상품을 구매하는가?


 - 활용방안 : 위와 같은 질문에 대한 분석을 토대로 고객들에게
    1) 상품정보 발송
    2) 텔레마케팅를 통해서 패키지 상품 판매 기획,
    3) 마트의 상품진열

 

 

1. 연관규칙 평가 척도

 

실습)  트랜잭션 객체를 대상으로 연관규칙 생성 

 

① 연관분석을 위한 패키지 설치 

install.packages("arules")
library(arules) #read.transactions()함수 제공

 

 

② 트랜잭션(transaction) 객체 생성

tran<- read.transactions("tran.txt", format="basket", sep=",") # 트랜잭션 객체 생성.
tran # 6개의 트랜잭션과 5개의 항목(상품) 생성

- 출력값 -
transactions in sparse format with
 6 transactions (rows) and
 5 items (columns)

read.transactions : 트랜잭션의 형태로 변형 - 필수 

 

 

③ 트랜잭션 데이터 보기 

inspect(tran) 

- 출력값 -
     items           
[1] {라면,맥주,우유}
[2] {고기,라면,우유}
[3] {고기,과일,라면}
[4] {고기,맥주,우유}
[5] {고기,라면,우유}
[6] {과일,우유}  

insect : 트랜잭션을 배열의 형태로 출력

 

 

④ 규칙(rule) 발견 - apriori 

rule<- apriori(tran, parameter = list(supp=0.3, conf=0.1)) # 16 rule
inspect(rule) # 규칙 보기

- supp, conf 가 높을수록 규칙성은 적어질 것이고, 낮을수록 규칙성은 많아질 것 입니다. 

맥주 -> 우유 vs 우유 -> 맥주 : 지지도는 같지만 신뢰도는 조건부 확률이므로 다르게 나타납니다. 

 

rule<- apriori(tran, parameter = list(supp=0.1, conf=0.1)) # 35 rule
inspect(rule) # 규칙 보기

 

2. 트랜잭션 객체 생성 

실습)  single 트랜잭션 객체 생성 

stran <- read.transactions("demo_single",format="single",cols=c(1,2)) 

inspect(stran)

- 출력값 -
    items         transactionID
[1] {item1}       trans1       
[2] {item1,item2} trans2       
 

single : 트랜잭션 구분자(Transaction ID)에 의해서 상품(item)이 대응된 경우

basket : 여러 개의 상품(item)으로 구성된 경우(Transaction ID 없이 여러 상품으로만 구성된 경우)
cols : single인 경우 읽을 컬럼 수 지정(basket은 생략)

 

- demo_single

 

실습) 중복 트랜잭션 제거

 

① 트랜잭션 데이터 가져오기

stran2<- read.transactions("single_format.csv", format="single", sep=",", 
                            cols=c(1,2), rm.duplicates=T) 

sep : 각 상품(item)을 구분하는 구분자 지정.
rm.duplicates=T : 중복되는 트랜잭션은 제외하고 출력.

 

② 트랜잭션과 상품 수 확인

stran2

- 출력값 -
transactions in sparse format with
 248 transactions (rows) and
 68 items (columns)

 

 

③ 요약 통계 제공

summary(stran2) # 248개 트랜잭션에 대한 기술통계 제공
inspect(stran2) # 트랜잭션 확인 

 

- inspect(stran2) 

 

 

실습) 규칙 발견(생성)

 

① 규칙 생성하기 

astran2 <- apriori(stran2) # supp=0.1, conf=0.8와 동일함 
astran2 <- apriori(stran2, parameter = list(supp=0.1, conf=0.8)) # 위의 코드와 동일

astran2 출력값 : set of 102 rules

attributes(astran2)

.

.

.

 

②  상위 6개 향상도 내림차순으로 정렬하여 출력 

inspect(head(sort(astran2, by="lift"))) # sort : 정렬 

 

실습) basket 트랜잭션 객체 생성

btran <- read.transactions("demo_basket",format="basket",sep=",")

inspect(btran) # 트랜잭션 데이터 보기

- 출력값 - 
     items        
[1] {item1,item2}
[2] {item1}      
[3] {item2,item3}

트랜잭션 구분자(Transaction ID) 없이 상품으로만 구성된 데이터 셋을 대상으로 트랜잭션 객체를 생성할 경우 format="basket" 속성 지정

 

- demo_basket

 3. 연관규칙 시각화

 

Adult 데이터 셋 

더보기

Adult 데이터 셋
arules 패키지에서 제공되는 Adult는 성인을 대상으로 인구소득에 관한 설문 조사 데이터를 포함하고 있는 AdultUCI 데이터셋을 트랜잭션 객체로 변환하여 준비된 데이터 셋이다. AdultUCI 데이터 셋은 전체 48,842개의 관측치와 15개 변수로 구성된 데이터 프레임이다.
Adult 데이터셋은 종속 변수(Class)에 의해서 년간 개인 수입이 $5만 이상인지를 예측하는 데이터 셋으로 transactions 데이터로 읽어 온 경우 48,842개의 transaction 과 115 개의 item 으로 구성된다.

위의 데이터 셋을 활용하여 살펴보도록 하겠습니다. 

 

 

실습) 다양한 신뢰도와 지지도 적용  

지지도를 20%로 높인 경우 1,306개 규칙 발견
ar1<- apriori(Adult, parameter = list(supp=0.2))  

지지도 20%, 신뢰도 95% 높인 경우 348개 규칙 발견
ar2<- apriori(Adult, parameter = list(supp=0.2, conf=0.95)) # 신뢰도 높임

지지도 30%, 신뢰도 95% 높인 경우 124개 규칙 발견
ar3<- apriori(Adult, parameter = list(supp=0.3, conf=0.95)) # 신뢰도 높임

지지도 35%, 신뢰도 95% 높인 경우 67 규칙 발견
ar4<- apriori(Adult, parameter = list(supp=0.35, conf=0.95)) # 신뢰도 높임

지지도 40%, 신뢰도 95% 높인 경우 36 규칙 발견
ar5<- apriori(Adult, parameter = list(supp=0.4, conf=0.95)) # 신뢰도 높임

 

 

실습) 규칙 결과보기

 

① 상위 6개 규칙 보기

inspect(head(ar5)) 

 

② confidence(신뢰도) 기준 내림차순 정렬 상위 6개 출력

inspect(head(sort(ar5, decreasing=T, by="confidence")))

 

③ lift(향상도) 기준 내림차순 정렬 상위 6개 출력

inspect(head(sort(ar5, by="lift"))) 

 

 

실습) 연관규칙 시각화

 

① 패키지 설치 

install.packages("arulesViz") 
library(arulesViz) 

 

② 연관규칙 시각화

plot(ar3, method='graph', control=list(type='items'))

 

 

실습) Groceries 데이터 셋으로 연관분석하기

 

Groceries 데이터 셋 

더보기

Groceries 데이터 셋
arules 패키지에서 제공되는 Groceries 데이터 셋은 1개월 동안 실제 로컬 식료품 매장에서 판매되는 트랜잭션 데이터를 포함하고 있다. 전체 9,835개의 트랜잭션(transaction)과 항목(item) 169 범주를 포함하고 있다.

위의 데이터를 활용하여 살펴보도록 하겠습니다.

 

 

① data.frame으로 형 변환

Groceries.df<- as(Groceries, "data.frame")
head(Groceries.df)

- 출력값 -
                                                                  items
1              {citrus fruit,semi-finished bread,margarine,ready soups}
2                                        {tropical fruit,yogurt,coffee}
3                                                          {whole milk}
4                         {pip fruit,yogurt,cream cheese ,meat spreads}
5 {other vegetables,whole milk,condensed milk,long life bakery product}
6                      {whole milk,butter,yogurt,rice,abrasive cleaner}

 

② 지지도 0.001, 신뢰도 0.8 적용 규칙 발견(410 rule(s))

rules <- apriori(Groceries, parameter=list(supp=0.001, conf=0.8))
inspect(rules) -> 410개 

 

③ 규칙을 구성하는 왼쪽(LHS) -> 오른쪽(RHS)의 item 빈도수 보기 

library(arulesViz)
plot(rules, method="grouped")

 

비지도 학습(Unsupervised Learning) 

: 사람 없이 컴퓨터가 스스로 레이블 되어 있지 않은 데이터에 대해 학습하는 것으로 y없이 x만 이용해서 학습하는 것 입니다. 정답이 없는 문제를 푸는 것이므로 학습이 맞게 됐는지 확인할 길은 없지만, 인터넷에 있는 거의 모든 데이터가 레이블이 없는 형태로 있으므로 앞으로 기계학습이 나아갈 방향으로 설정되어 있습니다. 통계학의 군집화와 분포 추정 등의 분야와 밀접한 관련이 있습니다.

 

– 컴퓨터 기계학습에 의한 분석 방법 
– 종속변수(y) 없음 : 입력 데이터에 정답 없음 
– 분석방법 : 규칙(패턴분석) → 공학.자연과학 계열(100년) 
– 분석유형 : 연관분석, 군집분석 → 데이터마이닝 기반

 

 

군집화(Clustering)  -  군집분석(Clustering Analysis) : 그룹화를 통한 예측(그룹 특성 차이 분석-고객집단 이해)

: 데이터가 쭉 뿌려져 있을 때 레이블이 없다고 해도 데이터간 거리에 따라 대충 두 세개의 군집으로 이렇게 x만 가지고 군집을 학습하는 것을 군집화 라고 합니다. 

 

 

군집 분석

– 종속변수(y변수)가 없는 데이터 마이닝 기법
– 유클리드 거리 기반 유사 객체 묶음
– 고객 DB -> 알고리즘 적용 -> 패턴 추출(rule) -> 근거리 모형으로 군집형성
– 계층적 군집분석(탐색적), 비계층적 군집분석(확인적)
– 주요 알고리즘 : k-means, hierarchical

 

 

군집분석 특징


– 전체적인 데이터 구조를 파악하는데 이용
관측대상 간 유사성을 기초로 비슷한 것 끼리 그룹화(Clustering)
– 유사성 = 유클리드 거리

 

유크리드 거리

: 유클리디안 거리(Euclidean distance)는 두 점 사이의 거리를 계산하는 방법으로, 이 거리를 이용하여 유클리드 공간을 정의

 

유클리드 거리 계산식

관측대상 p와 q의 대응하는 변량값의 차가 작으면, 두 관측대상은 유사하다고 정의하는 식


– 분석결과에 대한 가설 검정 없음(타당성 검증 방법 없음)
– 분야 : 사회과학, 자연과학, 공학 분야
– 척도 : 등간, 비율척도(연속적인 양)

 

 

군집 구성법


– 그룹간의 유사성 계산 방법
– 최단거리법, 최장거리법, 메디안법, 중심법, 그룹평균법

 


군집화방법


– 계층 군집화 : 가장 가까운 대상끼리 순차적으로 묶음
– 비계층 군집화 : k-평균 군집법

 

 

 

 

1. 유클리디안 거리

 

실습) 유클리디안 거리 계산법

 

 

① matrix 객체 생성

x <- matrix(1:9, nrow=3, byrow = T)  # nrow=3 : 3행으로 만듬, byrow = T : 열 중심 -> 행 중심
x

- 출력값 -
      [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

 

 

② 유클리디안 거리 생성

dist <- dist(x, method="euclidean") # method 생략가능 / euclidean : 유클리디안 거리 생성 
dist

- 출력값 - 
          1         2
2  5.196152          
3 10.392305  5.196152

       
5.196152 : 전체 루트 (2행 - 1행 = x^2 + 2행 - 1행 = x^2 + 2행 - 1행 = x^2) 
10.392305 : 전체 루트 (3행 - 1행 = x^2 + 3행 - 1행 = x^2 + 3행 - 1행 = x^2)
5.196152 : 전체 루트 (3행 - 2행 = x^2 + 3행 - 2행 = x^2 + 3행 - 2행 = x^2)

 

 

③ 유클리드 거리 계산식의 R코드

# 1행과 2행 변량의 유클리드 거리 구하기
sqrt(sum((x[1,] - x[2, ])^2))  출력값 :  5.196152
# 1행과 3행 변량의 유클리드 거리 구하기
sqrt(sum((x[1,] - x[3, ])^2)) 출력값 :  10.3923

 

2. 계층적 군집분석(탐색적 분석)

 

실습) 유클리디안 거리를 이용한 군집화

 

 

① 군집분석(Clustering)분석을 위한 패키지 설치

install.packages("cluster") 
library(cluster) 

 

 

② 데이터 셋 생성

x <- matrix(1:9, nrow=3, by=T) 
x

- 출력값 -
      [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

 

 

③ matrix 대상 유클리드 거리 생성 함수

dist <- dist(x, method="euclidean") # method 생략가능
dist

- 출력값 - 
    1         2
2  5.196152          
3 10.392305  5.196152

 

 

④ 유클리드 거리 matrix를 이용한 클러스터링

hc <- hclust(dist) # 클러스터링 적용
hc

 

 

⑤ 클러스터 시각화 

x11()
plot(hc) # 1과2 군집(클러스터) 형성

- 1 과 2 는 같은 레벨임을 보여주고, 3번은 값의 차이가 월등히 높음을 보여줍니다. 

- 1 과 2 유사성을 가진 가까운 것 먼저 그룹핑을 해줍니다. 

 

 

 

실습)  신입사원 면접시험 결과 군집분석

 

 

① 데이터 셋 가져오기

interview <- read.csv("interview.csv", header=TRUE)

names(interview)

- 출력값 - 
[1] "no"       "가치관"   "전문지식" "발표력"   "인성"     "창의력"   "자격증"   "종합점수"
[9] "합격여부"

View(interview)

 

 

② 유클리디안 거리 계산 

interview_df <- interview[c(2:7)]  # 2~7 열까지만 선택(가치관~자격증 점수)

idist<- dist(interview_df) # no, 종합점수, 합격여부 제거 

head(idist) 출력값 : [1]  3.464102 11.445523  2.449490 15.524175  3.741657 14.142136

 

 

③ 계층적 군집분석

hc <- hclust(idist)
hc

15개의 object 유클리드 거리법으로 출력

 

 

④ 군집분석 시각화

x11()
plot(hc, hang=-1) # 덴드로그램에서 음수값을 제거할 수 있음.

 거리의 계산을 통해서 크기의 값을 시각화해서 보여주는데 15개를 어떻게 군집화 할 수 있을지 보여주고 있습니다.

 

 

⑤ 군집 단위 테두리 생성

rect.hclust(hc, k=3, border="red") # 3개 그룹 선정, 선 색 지정

위의 결과를 통해서 예상했던 결과가 추가적인 코드를 통해서 출력되었습니다. 

 

 

 

실습) 군집별 특징 보기 

 

① 각 그룹별 서브셋 만들기

g1<- subset(interview, no==108| no==110| no==107| no==112 | no==115)
g2<- subset(interview, no==102| no==101| no==104| no==106 | no==113)
g3<- subset(interview, no==105| no==114| no==109| no==103 | no==111)

 

② 그룹 요약통계량  - 공통점 : 자격증 

summary(g1) # 불합격:5, 자격증 없음

summary(g2) # 합격:5, 자격증 있음

ummary(g3) # 불합격:5, 자격증 없음+있음.

table(g3$자격증)

- 출력값 -
 0 1 
 3 2 
 

- 자격증을 가지고 있어도 불합격 하는 사람들이 존재합니다.

 

 

3. 군집 수 자르기

 

실습) iris 데이터 셋을 대상으로 군집 수 자르기 

 

 

iris 데이터 셋 

더보기

iris 데이터 셋 
R에서 제공되는 기본 데이터 셋으로 3가지 꽃의 종류별로 50개씩 전체 150개의 관측치로 구성된다. iris는 붓꽃에 관한 데이터를 5개의 변수로 제공하며, 각 변수의 내용은 다음과 같다.

Sepal.Length(꽃받침 길이)

Sepal.Width(꽃받침 너비)

Petal.Length(꽃잎 길이)

Petal.Width(꽃잎 너비)

Species(꽃의 종류) : 3가지 종류별 50개 (전체 150개 관측치)

 

 

① 유클리드안 거리 계산 

idist<- dist(iris[1:4]) # dist(iris[, -5])

# 계층형 군집분석(클러스터링)
hc <- hclust(idist)
hc
plot(hc, hang=-1)

rect.hclust(hc, k=4, border="red") # 4개 그룹수 

 

 

 

② 군집 수 자르기

ghc<- cutree(hc, k=3) # stats 패키지 제공 - 3개로 그룹핑
ghc #  150개(그룹을 의미하는 숫자(1~3) 출력)

 

 

③ iris에서 ghc 컬럼 추가

iris$ghc <- ghc

head(iris)

- 출력값 - 
Sepal.Length Sepal.Width Petal.Length Petal.Width Species ghc
1          5.1         3.5          1.4         0.2  setosa   1
2          4.9         3.0          1.4         0.2  setosa   1
3          4.7         3.2          1.3         0.2  setosa   1
4          4.6         3.1          1.5         0.2  setosa   1
5          5.0         3.6          1.4         0.2  setosa   1
6          5.4         3.9          1.7         0.4  setosa   1

table(iris$ghc) # ghc 빈도수

- 출력값 - 
1  2  3 
50 72 28 

versicolor 와 virginica 의 돤벽하게 구분이 되지 않습니다. ( 공통 되어지는 부분 존재 ) 

 

 

④ 요약통계량 구하기 

g1 <- subset(iris, ghc==1)
summary(g1[1:4])

g2 <- subset(iris, ghc==2)
summary(g2[1:4])

g3 <- subset(iris, ghc==3)
summary(g3[1:4])

 

 

4. 비계층적 군집분석 

:  데이터 셋을 대상으로 계층적으로 군집분석 시각화하는 군집 수를 파악한 후 k-means 알고리즘에 군집수를 적용하여 군집별로 시각화하는 방법

 

실습) ggplot2 패키지에서 제공되는 diamonds 데이터 사용 

 

 

diamonds 데이터 셋 

더보기

diamonds 데이터 셋
ggplot2 패키지에서 제공하는 데이터 셋으로, 약 5만4천개의 다이아몬드에 관한 속성을 기록한 데이터 셋으로 53,940개의 관측치와 10개의 변수로 구성되어 있다. 주요 변수에 대한 설명은 다음과 같다.

- 주요 변수 - 

price : 다이아몬드 가격($326 ~ $18,823)
carat : 다이아몬드 무게(0.2 ~ 5.01)
cut : 컷의 품질(Fair, Good, Very Good, Premium, Ideal)
color : 색상(J : 가장 나쁨 ~ D : 가장 좋음)
clarity : 선명도(I1 : 가장 나쁨, SI1, SI2, VS1, VS2, VVS1, VVS2, IF : 가장 좋음)
x : 길이(0~10.74mm), y : 폭(0~58.9mm), z : 깊이(0~31.8mm),
depth : 깊이 비율 = z / mean(x, y)

 

① 군집분석에 사용할 변수 추출 

install.packages("ggplot2", dependencies = T)

library(ggplot2)

data(diamonds)

dim(diamonds) 출력값 : [1] 53940    10

t <- sample(1 : nrow(diamonds),1000) # 1000개 데이터 샘플링  

test <- diamonds[t, ] # 1000개 표본 추출
dim(test) 출력값 : 1000 10

head(test) # 검정 데이터

mydia <- test[c("price","carat", "depth", "table")] # 4개 칼럼만 선정
head(mydia)

 

 

 

② 계층적 군집분석(탐색적 분석)

result <- hclust(dist(mydia), method="average") # 평균거리 이용 
result


plot(result, hang=-1) # hang : -1 이하 값 제거

 

 

군집 방법(Cluster method) 
 method = "complete" : 완전결합기준(최대거리 이용) <- default(생략시)
 method = "single" : 단순결합기준(최소거리 이용) 
 method = "average" : 평균결합기준(평균거리 이용)

 

 

③ 비계층적 군집분석

result2 <- kmeans(mydia, 3) # 3개 군집 수 적용.

names(result2) # cluster 칼럼 확인 

- 출력값 -
[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"   

result2$cluster # 각 케이스에 대한 소속 군집수(1,2,3)

result2$centers # 각 군집 중앙값

- 출력값 -
     price     carat    depth    table
1  5923.048 1.1164384 61.83801 57.79007
2  1579.091 0.5119504 61.60182 57.35521
3 13368.243 1.7415534 61.93010 58.17476

# 원형데이터에 군집수 추가
mydia$cluster <- result2$cluster # 1 ~ 3 중 하나의 분주에 들어가 있음
head(mydia) # cluster 칼럼 확인 

 

 

④ 변수 간의 상관계수 보기 

cor(mydia[,-5], method="pearson") # 상관계수 보기 

- 출력값 - 
         price      carat       depth       table
price 1.00000000 0.91936804  0.06374813  0.09980938
carat 0.91936804 1.00000000  0.07630058  0.15321267
depth 0.06374813 0.07630058  1.00000000 -0.25949149
table 0.09980938 0.15321267 -0.25949149  1.00000000

plot(mydia[,-5])

 

- 상관계수 색상 시각화 

install.packages('mclust')
install.packages('corrgram')
library(mclust)
library(corrgram) # 상관성 시각화 
corrgram(mydia[,-5]) # 색상 적용 - 동일 색상으로 그룹화 표시

 

corrgram(mydia[,-5], upper.panel=panel.conf) # 수치(상관계수) 추가(위쪽)

 

 

⑤ 비계층적 군집시각화

 

plot(mydia$carat, mydia$price, col=mydia$cluster)

- 중심점 표시 추가 

points(result2$centers[,c("carat", "price")], col=c(3,1,2), pch=8, cex=5)

 

지도학습(Supervised Learning)


– 인간 개입에 의한 분석 방법
– 종속 변수(y) 존재 : 입력 데이터에 정답 포함
– 분석 방법 : 가설검정(확률/통계) → 인문.사회.심리 계열(300년)
– 분석 유형 : 회귀분석, 분류분석, 시계열 분석 → 추론통계 기반

 

 

 

 

분류분석(Decision Tree)

: 다수의 속성(attribute) 또는 변수를 갖는 객체를 사전에 정해진 그룹 또는 범주(class, category) 중의 하나로 분류하여 분석하는 방법입니다. 

 

- 의사결정나무 (Decision Tree)

: 분류 모델링에 의해서 만들어진 규칙(rule)를 나무 모양으로 그리는 방법으로, 의사결정이 이뤄지는 시점과 성과를 한눈에 볼 수 있습니다.

 

의사결정나무(Decision Tree) 활용

- 세분화/분류 : 데이터를 비슷한 특성을 갖는 몇 개의 그룹 또는 몇 개의 등급으로 분할

- 예측 : 데이터에서 규칙을 찾아낸 후 이를 이용하여 미래의 사건을 예측

- 차원 축소 및 변수 선택 : 목표 변수에 큰 영향을 미치는 변수를 골라냄

- 변수들 간의 교호작용 (interaction effect) 파악 - 목표 변수의 범주를 병합하거나 연속형 목표 변수를 이산화(binning)

- 활용분야 고객을 분류하는 변수, 규칙, 특성들을 찾아내고, 이를 토대로 미래 잠재 고객의 행동이나 반응을 예측하거나    유도하는데 활용

 

의사결정나무(Decision Tree) 특징 

- 결과를 설명하기 쉽다.

- 모형을 만드는 방법이 계산적으로 복잡하지 않다.

- 대용량 데이터도 빠르게 처리할 수 있다.

- 비정상 잡음 데이터에 대해서 민감하지 않다.

- 불필요한 변수가 있어도 크게 영향받지 않는다.

 

 

의사결정나무(Decision Tree) 알고리즘

 

a. CART (Classification and Regression Tree)

- 가장 많이 활용되는 알고리즘.

- 목표 변수가 범주형, 연속형 모두 가능. 이진 분리.

- 불순도 측도는 범주형일 경우 지니 지수, 연속형인 경우 분산을 사용.

- 개별 입력변수 뿐만 아니라 입력변수들의 선형결합드 중에서 최적의 분리를 찾을 수 있다.

 

b. C4.5 & C5.0

- 다지 분리(multiple split) 가능.

- 명목형 목표 변수.

- 불순도 측도는 엔트로피 지수 사용.

 

c. CHAID (Chi-squared Automatic Interaction Detection)

- 적당한 크기에서 나무모형의 성장을 중지.

- 연속형 목표변수.

- 불순도 측도는 카이제곱 통계량 사용.

 

 

분류분석의 특징 

 - 종속변수(y변수) 존재
 - 종속변수 : 예측에 Focus을 두는 변수
 - 비모수 검정 : 선형성, 정규성, 등분산성 가정 필요없음
 - 단점 : 유의수준 판단 기준 없음(추론 기능 없음)
 - 규칙(Rule)을 기반으로 의사결정트리 생성

 

 분류 분석 vs 군집 분석 - 분류 분석은 이미 각 계급(클러스터)이 어떻게 정의 되는지 알고 있음

 

분류분석 테스트 환경
– 전수 데이터를 대상으로 할 경우 error를 감안해서 학습데이터와 검정데이터로 분리 하여 테스트
– 학습데이터(전수데이터의 70%) -> 알고리즘 적용 -> rule 발견
– rule 적용 -> 검정데이터(전수데이터의 30%) -> 검정(validate)

 

표본의 통계량으로 모집단의 모수 추론 과정과 유사

구분 추론동계 데이터마이닝
데이터 표본 전수테이터
검정방법 통계량/추론 Rule/검증 

 

 

의․생명분야에서 분류분석 사례

 

 

< 실습내용 >

: iris 데이터셋의 4개변수(Sepal Length,Sepal Width,Petal Length,Petal Width)값에 따라서 꽃의 종류(Species)가 분류되는 과정 알아보기

 

< 테스트 환경 >
전수 데이터를 대상으로 할 경우 error를 감안해서 학습데이터와 검증데이터로 분리 하여 테스트 한다.
학습데이터(훈련데이터) - (70%) -> 알고리즘 적용
rule 추출 -> 검정 테스트 (30%) -> 확인(validate) 데이터
표본의 통계량으로 모집단의 모수 추론과 유사함

 

iris 데이터 셋 

더보기

iris 데이터 셋
R에서 제공되는 기본 데이터 셋으로 3가지 꽃의 종류별로 50개씩 전체 150개의 관측치로 구성된다. iris는 붓꽃에 관한 데이터를 5개의 변수로 제공하며, 각 변수의 내용은 다음과 같다.

Sepal.Length(꽃받침 길이)

Sepal.Width(꽃받침 너비)

Petal.Length(꽃잎 길이)

Petal.Width(꽃잎 너비)

Species(꽃의 종류) : 3가지 종류별 50개 (전체 150개 관측치)

 

 

1. party 패키지 적용 분류분석

 

실습1 ctree 함수 이용 의사결정트리 생성하기

 

① part패키지 설치

install.packages("party")
library(party) # ctree() 제공

 

② airquality 데이터 셋 로딩

library(datasets)

str(airquality)

- 출력값 -
'data.frame':	153 obs. of  6 variables:
 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...

airqulity 데이터 셋 

더보기

airquality  데이터 셋
airquality 데이터 셋은 R에서 기본으로 제공되는 데이터 셋으로 New York시의 대기에 대한 질을 측정한 데이터 셋이다. 전체 153개의 관측치와 6개의 변수로 구성되어 있다.

주요 변수:

Ozone(오존 수치)

Solar.R(태양열)

Wind(바람)

Temp(온도)
Month(측정 월 5~9)

Day( 측정 날짜 1~31 일

 

③ formula 생성

formula <-  Temp ~ Solar.R +  Wind + Ozone
종속변수 : 온도, 독립변수 : 태양열, 바람, 오존 수치

 

④ 분류모델 생성 : formula를 이용하여 분류모델 생성 

air_ctree <- ctree(formula, data=airquality)
air_ctree

 

⑤ 분류분석 결과

plot(air_ctree)

오존 수치가 가장 많은 영향을 준다

 

1) 오존 37 이상 

 

- 오존 65 이상 : Node 9

- 오존 65 이하 : Node 8

 

2) 오존 37 이하는 바람의 영향을 받음. 

 

- 바람 15.5 이상 : Node 6

 

3) 바람 15.5 이하는 오존의 영향을 받음.

 

- 오존 19 이상 : Node 5

- 오존 19 이하 : Node 4

 

 

- 분류조건 subset 작성/확인 

result <- subset(airquality, Ozone <= 37 & Wind > 15.5) # 오존 수치: 37 미만, 바람: 15.5 이상 

summary(result$Temp)

- 출력값 - 
  Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  57.0    61.0    63.0    65.2    72.0    73.0 

 

실습2 학습데이터와 검정데이터 샘플링으로 분류분석하기

 

① 학습데이터와 검증데이터 샘플링

set.seed(1234) # 메모리에 시드값 적용 - 동일값 생성 
idx <- sample(1:nrow(iris), nrow(iris) * 0.7) 
train <- iris[idx,] # 70프로
test <- iris[-idx,] # 30프로 

 

iris 데이터 셋 

더보기

iris 데이터 셋 
R에서 제공되는 기본 데이터 셋으로 3가지 꽃의 종류별로 50개씩 전체 150개의 관측치로 구성된다. iris는 붓꽃에 관한 데이터를 5개의 변수로 제공하며, 각 변수의 내용은 다음과 같다.

Sepal.Length(꽃받침 길이)

Sepal.Width(꽃받침 너비)

Petal.Length(꽃잎 길이)

Petal.Width(꽃잎 너비)

Species(꽃의 종류) : 3가지 종류별 50개 (전체 150개 관측치)

 

 

② formula 생성 

-> 형식) 변수 <- 종속변수 ~ 독립변수

formula <- Species ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width 

 

③ 학습데이터 이용 분류모델 생성(ctree()함수 이용)

iris_ctree <- ctree(formula, data=train) # 학습데이터로 분류모델(tree) 생성
iris_ctree # Petal.Length,Petal.Width 중요변수

 

④ 분류모델 플로팅

 plot() 이용 - 의사결정 트리로 결과 플로팅

plot(iris_ctree, type="simple") 

 

plot(iris_ctree) # 의사결정트리 해석

 

종은 3개인데 결과가 4갱인 이유 

 

Node 2 , Petal.Length 1.9 이하 = setosa

Node 5, Petal.Length 1.9 이상, Petal.Width 1.6이하,  Petal.Length 4.6 이하 = versicolor 

Node 6, Petal.Length 1.9 이상, Petal.Width 1.6이하,  Petal.Length 4.6 이상 = versicolor  or virginica (불명확)

Node 7, Petal.Length 1.9 이상, Petal.Width 1.6이상 = virginica

 

result <- subset(train, Petal.Length > 1.9 & Petal.Width <= 1.6 & Petal.Length > 4.6)

result$Species 

- 출력값 -
virginica  versicolor versicolor versicolor virginica  versicolor virginica  versicolor
Levels: setosa versicolor virginica

length(result$Species) 출력값 :  8

table(result$Species)

- 출력값 -
setosa versicolor  virginica 
     0          5          3 

 

⑤ 분류 모델 평가 

모델 예측치 생성과 혼돈 매트릭스 생성 
pred <- predict(iris_ctree, test) # 45

pred # Y변수의 변수값으로 예측 

- 출력값 -
 [1] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
 [9] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
[17] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
[25] versicolor virginica  versicolor versicolor versicolor versicolor versicolor versicolor
[33] virginica  virginica  versicolor virginica  virginica  virginica  virginica  virginica 
[41] virginica  virginica  virginica  virginica  virginica 
Levels: setosa versicolor virginica

table(pred, test$Species)

- 출력값 - 
pred         setosa versicolor virginica
setosa         16          0         0   <- missing : 0
versicolor      0         15         1   <- missing : 1
virginica       0          1        12   <- missing : 1


분류정확도 
(16+15+12) / nrow(test) 출력값 :  0.956

 

지도학습(Supervised Learning)


– 인간 개입에 의한 분석 방법
– 종속 변수(y) 존재 : 입력 데이터에 정답 포함
– 분석 방법 : 가설검정(확률/통계) → 인문.사회.심리 계열(300년)
– 분석 유형 : 회귀분석, 분류분석, 시계열 분석 → 추론통계 기반

 

 

회귀분석(Regression Analysis) - 인과 관계 

 

: 여러 자료들 간의 관계성을 수학적으로 추정, 설명한다. 흔히들 통계학의 꽃이라고 합니다. 독립변인이 종속변인에 영향을 미치는지 알아보고자 할 때 실시하는 분석 방법입니다. 선형 회귀법, 로지스틱 회귀법이 대표적이며, 로지스틱 회귀법을 앙상블했다는 관점으로 보면 인공신경망도 여기에 해당한다고 합니다. 선형 회귀법은 지도학습의 회귀문제를 푸는 데에 쓰이고(새로운 값의 예측), 로지스틱 회귀법과 인공신경망은 지도학습의 분류문제를 푸는데에 주로 사용합니다. 

 

-  결과값을 알려주고, 가설을 일차 함수로 정의한 것으로 데이터(독립변수)를 넣어서 분석 시킴 

    ex) y = ax + b    / x( 독립 변수 : 영향을 주는 변수) , y ( 종속 변수 : 영향을 받는 변수 )

                            - 원인을 일으키는 x변수와 결과를 보여주는 y 변수의 관계

 

-  모든 데이터들은 선형성을 띈다. 

 

y = ax + b  : 입력받은 x와 y 값을 가지고 오차를 최소화하는 a와 b의 값 찾는 과정 

 

회귀분석의 역사 - 평균으로의 회귀

더보기

회귀분석(regression analysis)은 생물학자 프랜시스 골턴(Francis Galton)이 '평균으로의 회귀'(regression to the mean / regression towards mediocrity) 현상을 증명하기 위해 만든 것으로 알려져 있다. '평균으로의 회귀'는 부모와 아이의 키를 측정했을 때 쉽게 상상할 수 없는 극단적인 값이 되어도, 그 다음에 새로 측정을 했을 때에는 평균에 더 가까워지는 (평균으로 회귀하는) 경향성을 보고 골턴이 일반화하기 위해서 쓴 용어다.

골턴은 부모와 그 자식의 키에 대한 자료를 만들어 205명의 부모와 그들의 자식 930명의 키에 대한 자료를 분석하여 회귀계수가 2/3임을 밝혔다. 가우스의 최소제곱법을 쓰지 않고 타원으로 적합시켜 회귀계수가 2/3임을 찾아낸 것이 특이하다. 즉, 키는 유전적인 요소가 강력하게 작용한다는 것을 밝힌 것이다. 골턴은 산점도에 최초로 선형식을 표현하여 오늘날의 회귀분석을 성립하는 데 지대한 공을 세웠다.

현대에 와서는 회귀(regress), 즉 평균으로 돌아간다는 의미는 거의 사라졌다. 요즘에는 독립변수와 종속변수를 설정 [1]하고 이들의 관계를 통계적으로 살펴보는 대부분의 방법론을 다 회귀분석이라고 부르기도 한다. 시계열 데이터를 사용하면 시계열 회귀분석이고 패널 자료를 사용하면 패널 회귀 분석인 식이다.

 

회귀 분석 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권�

namu.wiki

 

 

 

특징) 

- 변수들 사이의 인과관계를 규명하고자 하는 분석방법이기 때문에 변수의 역할설정이 중요합니다. 

 

(주의)

신문을 보는 시간이 TV를 시청하는 시간에 어떤 영향을 미치는가?’라는 물음에서 ‘신문을 보는 시간’은 원인변수에 해당하고 ‘TV를 시청하는 시간’은 결과변수입니다. 이를 뒤바꾸어 ‘TV를 시청하는 시간’을 원인변수 로 하고 ‘신문을 보는 시간’을 결과변수로 한다면 원래 의도했던 연구목적에 위배되는 것입니다. 

 

특정 변수(독립변수)가 다른 변수(종속변수)에 어떠한 영향을 미치는가 (인과관계 분석)
 예) 가격은 제품 만족도에 영향을 미치는가?


- 한 변수의 값으로 다른 변수의 값 예언

인과관계(因果關係) : 변수A가 변수B의 값이 변하는 원인이 되는 관계(변수A : 독립변수, 변수B : 종속변수)

 

 

- 회귀 방정식(Y=a+βX → Y:종속변수, a:상수, β:회귀계수, X:독립변수)을 도출하여 회귀선 추정

  선형 회귀 방정식(1차 함수) : 회귀선 추정

  회귀계수(β) : 단위시간에 따라 변하는 양(기울기)이며, 회귀선을 추정함에 있어 최소자승법 이용

 

Y= a + b*X  (Y : 종속변수, a : 절편, b : 기울기, X : 독립변수)

 

회귀방정식에 의해서 x가 10일 때 y는 20 예측 -> 회귀분석은 수치 예측

 

 

- 최소자승법 적용 회귀선

: 회귀방정식에 의해서 그려진 y의 추세선, 산포도 각 점의 위치를 기준으로 정중앙 통과하는 회귀선 추정 방법

- 산포도에 위치한 각 점에서 회귀선에 수직으로 이르는 값의 제곱의 합 최소가 되는 선(정중앙을 통과하는 직선)을 

  최적의 회귀선으로 추정

 

- 독립변수와 종속변수가 모두 등간척도 또는 비율척도 구성

 

- 상관 관계 분석 : 변수 간의 관련성 분석

- 회귀 분석 : 변수 간의 인과관계 분석

 

 

- 회귀분석의 기본 가정 충족

 

  ① 선형성 : 독립변수와 종속변수가 선형적 이어야한다. (회귀선 확인)


  ② 오차(잔차)의 정규성 : 오차(잔차) 란 종속변수의 관측값과 예측값 간의 차이를 말하며, 오차(잔차)의 기대값은 0이며,

                                  정규분포를 이루어야한다. (정규성 검정 확인)


  ③ 오차의 독립성 : 오차들은 서로 독립적 이어야한다. (더빈-왓슨 값 확인)


  ④ 오차의 등분산성 : 오차들의 분산이 일정해야한다. (표준잔차와 표준예측치 도표) 


  ⑤ 다중공선성 : 다중 회귀분석을 수행할 경우 3개 이상의 독립변수들 간의 강한 상관관계로 인한 문제가 발생되지

                       않아야 한다.(분산팽창요인(VIF) 확인)

                    - 입력으로 사용되어지는 독립변수의 독립성이 상호의존성이 높을 때 회기 분석의 결과를

                      신뢰할 수 없는 피드백이 나온다. 

 

 

회귀모형의 형태

 

1) 단순(단일) 회귀 분석(Simple Regression Analysis) : 하나의 종속변수에 대해 독립변수가 하나인 경우

2) 다중 회귀 분석(Multiple Regression Analysis) : 하나의 종속변수에 대해 독립변수가 둘 이상인 경우

3) 로지스틱 회귀분석(Logistic Regression) : 분류 분석, 독립변수 -> 종속변수(분류) 

 

 

회귀분석을 통해 알 수 있는 것 

 

1) 종속변수와 독립변수 간에 선형관계가 존재하는지 알 수 있습니다. 

2) 종속변수에 영향을 미치는 독립변수가 유의 한지와 영향력의 정도를 알 수 있습니다. 

3) 추정된 회귀모형을 통해 종속변수의 예측치를 알 수 있습니다. 

 

*경사하강법 :  실체 관찰치 값과 예측 값 사이의 값의 오차 = (관측치 - 예측값 = 잔차(제곱하여 음수 제거)) , 그 값의 최소의 값을 찾는 것 = 경사하강법(2차 함수 형태 = 최소값 기울기 0일 때)

 

 

 

 

① 단순(단일) 회귀 분석(Simple Regression Analysis)

 

   – 독립변수와 종속변수 각각 1개
   – 독립변수(원인 제공자)가 종속변수(영향을 받는 자)에 미치는 인과관계 분석

 

 

< 연구 가설 > 

- 연구가설(H1) : 음료수 제품의 당도와 가격수준을 결정하는 제품 적절성(독립변수)은 제품 만족도(종속변수)에 정(正)의 영향을 미친다.

- 귀무가설(H0) : 음료수 제품의 당도와 가격수준을 결정하는 제품 적절성은 제품의 만족도에 영향을 미치지 않는다.

 

 연구모델 : 제품 적절성(독립변수) -> 제품 만족도(종속변수)

 

위의 데이터를 통해서 살펴보도록 하겠습니다. 

 

- 데이터 전처리 (data.frame 데이터 생성)

str(product) # 'data.frame':  264 obs. of  3 variables:

- 출력값 - 
'data.frame':	264 obs. of  3 variables:
 $ 제품_친밀도: int  3 3 4 2 2 3 4 2 3 4 ...
 $ 제품_적절성: int  4 3 4 2 2 3 4 2 2 2 ...
 $ 제품_만족도: int  3 2 4 2 2 3 4 2 3 3 ...

y = product$제품_만족도 # 종속변수
x = product$제품_적절성 # 독립변수
df <- data.frame(x, y)

- 출력값 -
  x y
1 4 3
2 3 2
3 4 4
4 2 2
5 2 2
6 3 3

 

 

- 회귀모델 생성 

result.lm <- lm(formula=y ~ x, data=df)

 #lm(leaning machine) = lm ( formuly= 종속변수 ~ 독립변수 , data = 데이타 셋 ) 
 
 result.lm # 회귀계수 ( 절편과 기울기 ) 

lm : 회귀 모델 생성  ( * 알고리즘 관련 함수 저장 pakage = stats )

 

오차가 최소가 되어지는 값을 lm 을 통해서 출력준 값입니다. 

- 오차를 최소화 해주는 기울기 :  0.7393 , 절편 : 0.7789

 

결과 : y = 0.7393x + 0.7789 

 

 

- 모델의 적합값과 잔차 보기

names(result.lm)

- 출력값 - 
[1] "coefficients"  "residuals"     "effects"       "rank"          "fitted.values" "assign"       
[7] "qr"            "df.residual"   "xlevels"       "call"          "terms"         "model"        

fitted.values(result.lm)[1:2]

- 출력값 -
       1        2 
3.735963 2.996687 

head(df, 1)

- 출력값 - 
  x y
1 4 3

Y = 0.7789 + 0.7393 * 4  
Y 출력값 :  3.7361 - 회귀방정식에 의해서 계산된 적합값 

# 오차(잔차:error) = Y관측값 - Y적합값 
3-3.735963  출력값 :  -0.735963

residuals(result.lm)[1:2] # 모델의 잔차 출력 

- 출력값 -  
        1          2  
-0.7359630 -0.9966869 

-0.7359630 + 3.735963 출력값 : 3 # 잔차 + 적합값 = 관측값 

 

 

-  선형회귀분석 모델 시각화[오류 확인]

 

① x, y 산점도 그리기 

x11()
plot(formula=y ~ x, data=df)

 

② 회귀분석 + 회귀선 

result.lm <- lm(formula=y ~ x, data=df) 

abline(result.lm, col='red') # 회귀선 

 

- 선형회귀 분석 결과 보기 

summary(result.lm)

<회귀분석 결과 해석>

 결정계수(Coefficients) : R-squared -> 0 ~ 1 사이의 값을 갖는다.
 Multiple R-squared: 0.5881: 독립변수에 의해서 종속변수가 얼마만큼 설명되었는가?
 설명력 -> 상관(결정)계수 : 58.8% 설명력
 1에 가까울 수록 설명변수(독립변수)가 설명을 잘한다고 판단
 모형의 변수 선정이 우수하다는 의미.
 Adjusted R-squared: 0.5865 : 조정된 R값(오차를 감안한 값)<- 이것으로 분석

 

최종 결론 : 제품 적절성은 제품 만족도에 정(正)의 영향을 미친다. 

 

 

 

② 다중 회귀 분석(Multiple Regression Analysis)

: 여러 개 독립변수가 1개의 종속변수에 미치는 영향 분석

 

< 연구 가설 > 

연구가설1(H1) : 음료수 제품의 적절성(독립변수1)은 제품 만족도(종속변수)에 정(正)의 영향을 미친다.

연구가설2(H1) : 음료수 제품의 친밀도(독립변수2)는 제품 만족도(종속변수)에 정(正)의 영향을 미친다.

 

연구모델 : 제품 적절성(x1), 제품 친밀도(x2) -> 제품 만족도(y)

 

위의 데이터를 활용하여 살펴보도록 하겠습니다.

 

 

- 데이터 전처리 ( 적절성 + 친밀도 -> 만족도 )

y = product$제품_만족도 # 종속변수
x1 = product$제품_친밀도 # 독립변수2
x2 = product$제품_적절성 # 독립변수1
df <- data.frame(x1, x2, y)

head(df)

- 출력값 - 
> head(df)
  x1 x2 y
1  3  4 3
2  3  3 2
3  4  4 4
4  2  2 2
5  2  2 2
6  3  3 3

result.lm <- lm(formula=y ~ x1 + x2, data=df) # (+) 사용하여 추가 

lm(formula=종속변수 ~ 독립변수1 + 독립변수2, data=데이터 셋)

result.lm

(잔차가 최저가 되는 기울기)결과 :  y = 0.09593 * x1 +  0.68522 * x2 + 0.66731; ( y = ax1 +bx2 +c )

 

 

- 다중공선성 문제 체크 

(입력으로 사용되어지는 독립변수의 독립성이 상호의존성이 높을 때 회기 분석의 결과를 신뢰할 수 없는 피드백이 나온다. )

install.packages("car")
library(car)

vif(result.lm) # x1, x2 < 10 미만인지 체크.

- 출력값 -
      x1       x2 
1.331929 1.331929 

 vif (car 패키지에서 제공하는 함수) : 입력으로 전달된 데이터 셋의 다중공선성의 문제가 발생하는지 발생하지 않는지

                                                결과를 체크 할 수 있도록 합니다. 

 

 vif < 10미만은 독립적인 관계를 가지고 간다. ( 1.331929 , 1.331929 < 10 ) 

 

 

- 다중회귀 분석 결과 보기 

summary(result.lm)

t=15.684, p < 2e-16으로 유의수준 하에서 연구가설1이 채택되었으며, 제품 친밀도가 제품 만족도에 미치는 영향은 t=2.478, p=0.0138로 유의수준하에서 연구가설2가 채택되었습니다. 

 

Multiple R-squared: 0.5975: 독립변수에 의해서 종속변수가 얼마만큼 설명되었는가? 

설명력 -> 상관(결정)계수 : 59.7% 설명력, 1에 가까울 수록 설명변수(독립변수)가 설명을 잘한다고 판단할 수 있습니다.
(모형의 변수 선정이 우수)

 

최종 결과 : 유의수준 0.05에서 연구가설이 채택되었다. 따라서 제품 적절성과 제품 친밀도가 높을 수록 제품 만족도가 높아지는 경향을 보이고 있다.

 

 

-  다중공선성 문제 해결과 모델 성능평가 

 

iris 데이터를 사용하여 살펴보겠습니다. 

더보기

iris
R에서 제공되는 기본 데이터 셋으로 3가지 꽃의 종류별로 50개씩 전체 150개의 관측치로 구성된다. iris는 붓꽃에 관한 데이터를 5개의 변수로 제공하며, 각 변수의 내용은 다음과 같다.

 

Sepal.Length(꽃받침 길이) 

Sepal.Width(꽃바침 너비)

Petal.Length(꽃잎 길이)

Petal.Wodth(꽃잎 너비)

Species(꽃의 종류) : 3가지 종류별 50개(전체 150개 관측치) 

 

 

실습 ① 다중공선성 문제 확인

 

- iris 데이터 셋으로 다중회귀분석

fit <- lm(formula=Sepal.Length ~ Sepal.Width+Petal.Length+Petal.Width, data=iris)
vif(fit)

- 출력값 - 
 Sepal.Width Petal.Length  Petal.Width 
    1.270815    15.097572    14.234335 
    
    
sqrt(vif(fit))>2 # root(VIF)가 2 이상인 것은 다중공선성 문제 의심 

- 출력값 - 
 Sepal.Width Petal.Length  Petal.Width 
       FALSE         TRUE         TRUE 

 

- iris 변수 간의 상관계수 구하기

cor(iris[,-5]) # 변수간의 상관계수 보기(Species 제외) 

- 출력값 -
              Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

x변수들끼리 계수값이 높을 수도 있다. -> 해당 변수 제거(모형 수정) <- Petal.width

 

 

실습 ② 데이터 셋 생성과 회귀모델 생성

 

- 학습데이터와 검정데이터 분류

x <- sample(1:nrow(iris), 0.7*nrow(iris)) # 전체중 70%만 추출 (1~150개 중에서 70%만 랜덤으로 출력)
train <- iris[x, ] # 학습데이터 추출(70%)
test <- iris[-x, ] # 검정데이터 추출(30%)

 

- 변수 제거 및 다중회귀분석 - Petal.width 변수를 제거한 후 회귀 분석 ( 학습데이터 이용 모델 생성 )

model <- lm(formula=Sepal.Length ~ Sepal.Width + Petal.Length, data=train)

 

- 회귀방정식 도출 

model 

head(train, 1)

- 출력값 - 
        Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
70          5.6         2.5          3.9         1.1       versicolor


Y = 1.8347 + 0.7065 * 2.5 + 0.4890 * 3.9

Y 출력값 :  5.50805

 

 

- 예측치 생성 - predict()함수

pred <- predict(model, test) # x변수만 test에서 찾아서 값 예측
pred # test 데이터 셋의 y 예측치(회귀방정식 적용) 
test$Sepal.Length # test 데이터 셋의 y 관측치  
length(pred) 출력값 :  45 (개 벡터)

 

 

- 회귀모델 평가 

cor(pred, test$Sepal.Length) 출력값 : 0.9346613

summary(pred); summary(test$Sepal.Length)

- 출력값 -
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.095   5.068   6.133   5.966   6.687   7.796 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.500   5.100   6.100   6.002   6.700   7.700 

 

 

③ 로지스틱 회귀분석(Logistic Regression) - 분류 분석 

 

목적 : 일반 회귀분석과 동일하게 종속변수와 독립변수 간의 관계를 나타내어 향후 예측 모델을 생성하는데 있습니다. 

 

차이점 : 종속변수가 범주형 데이터를 대상으로 하며 입력 데이터가 주어졌을 때 해당 데이터의 결과가 특정 분류로 나눠지기 때문에 분류분석 방법으로 분류됩니다.

(종속변수(y)를 범주군으로 분류군으로 결과가 피드백 되어지는 분석법) 


유형 : 이항형(종속변수가 2개 범주-Yes/No), 다항형(종속변수가 3개 이상 범주-iris 꽃 종류)

다항형 로지스틱 회귀분석 : nnet, rpart 패키지 이용 
a : 0.6,  b:0.3,  c:0.1 -> a 분류 

분야 : 의료, 통신, 기타 데이터마이닝

 

- 결과는 0이 아니면 1의 값으로, 두가지 분류군으로 구분지어서 어느 영역에 해당되는지 출력합니다. 

선형회귀분석 vs 로지스틱 회귀분석 
1. 로지스틱 회귀분석 결과는 0과 1로 나타난다.(이항형)
2. 정규분포(연속형) 대신에 이항분포(범주형)를 따른다.
3. 로직스틱 모형 적용 : 변수[-무한대, +무한대] -> 변수[0,1]사이에 있도록 하는 모형 
   -> 로짓변환 : 출력범위를 [0,1]로 조정
4. 종속변수가 2개 이상인 경우 더미 변수(dummy variable)로 변환하여 0과 1를 갖도록한다.
   예) 혈액형 A인 경우 -> [1,0,0,0] AB(1) -> A,B,O(0)  

 

 

위의 데이터를 활용하여 살펴보도록 하겠습니다. 

 

- 데이터 확인 

dim(weather) 출력값 : 366  15

str(weather)

- 출력값 - 
data.frame':	366 obs. of  15 variables:
 $ Date         : chr  "2014-11-01" "2014-11-02" "2014-11-03" "2014-11-04" ...
 $ MinTemp      : num  8 14 13.7 13.3 7.6 6.2 6.1 8.3 8.8 8.4 ...
 $ MaxTemp      : num  24.3 26.9 23.4 15.5 16.1 16.9 18.2 17 19.5 22.8 ...
 $ Rainfall     : num  0 3.6 3.6 39.8 2.8 0 0.2 0 0 16.2 ...
 $ Sunshine     : num  6.3 9.7 3.3 9.1 10.6 8.2 8.4 4.6 4.1 7.7 ...
 $ WindGustDir  : chr  "NW" "ENE" "NW" "NW" ...
 $ WindGustSpeed: int  30 39 85 54 50 44 43 41 48 31 ...
 $ WindDir      : chr  "NW" "W" "NNE" "W" ...
 $ WindSpeed    : int  20 17 6 24 28 24 26 24 17 6 ...
 $ Humidity     : int  29 36 69 56 49 57 47 57 48 32 ...
 $ Pressure     : num  1015 1008 1007 1007 1018 ...
 $ Cloud        : int  7 3 7 7 7 5 6 7 7 1 ...
 $ Temp         : num  23.6 25.7 20.2 14.1 15.4 14.8 17.3 15.5 18.9 21.7 ...
 $ RainToday    : chr  "No" "Yes" "Yes" "Yes" ...
 $ RainTomorrow : chr  "Yes" "Yes" "Yes" "Yes" ...

head(weather)

 

- 데이터 전처리 

Date, RainToday 칼럼 제거

weather_df <- weather[, c(-1, -6, -8, -14)]
str(weather_df)

- 출력값 -
str(weather_df)
'data.frame':	366 obs. of  11 variables:
 $ MinTemp      : num  8 14 13.7 13.3 7.6 6.2 6.1 8.3 8.8 8.4 ...
 $ MaxTemp      : num  24.3 26.9 23.4 15.5 16.1 16.9 18.2 17 19.5 22.8 ...
 $ Rainfall     : num  0 3.6 3.6 39.8 2.8 0 0.2 0 0 16.2 ...
 $ Sunshine     : num  6.3 9.7 3.3 9.1 10.6 8.2 8.4 4.6 4.1 7.7 ...
 $ WindGustSpeed: int  30 39 85 54 50 44 43 41 48 31 ...
 $ WindSpeed    : int  20 17 6 24 28 24 26 24 17 6 ...
 $ Humidity     : int  29 36 69 56 49 57 47 57 48 32 ...
 $ Pressure     : num  1015 1008 1007 1007 1018 ...
 $ Cloud        : int  7 3 7 7 7 5 6 7 7 1 ...
 $ Temp         : num  23.6 25.7 20.2 14.1 15.4 14.8 17.3 15.5 18.9 21.7 ...
 $ RainTomorrow : chr  "Yes" "Yes" "Yes" "Yes" ...
 
 
 
 
RainTomorrow 칼럼 -> 로지스틱 회귀분석 결과(0,1)에 맞게 더미변수 생성   

weather_df$RainTomorrow[weather_df$RainTomorrow=='Yes'] <- 1
weather_df$RainTomorrow[weather_df$RainTomorrow=='No'] <- 0
weather_df$RainTomorrow <- as.numeric(weather_df$RainTomorrow)

str(weather_df)

- 출력값 -
'data.frame':	366 obs. of  11 variables:
 $ MinTemp      : num  8 14 13.7 13.3 7.6 6.2 6.1 8.3 8.8 8.4 ...
 $ MaxTemp      : num  24.3 26.9 23.4 15.5 16.1 16.9 18.2 17 19.5 22.8 ...
 $ Rainfall     : num  0 3.6 3.6 39.8 2.8 0 0.2 0 0 16.2 ...
 $ Sunshine     : num  6.3 9.7 3.3 9.1 10.6 8.2 8.4 4.6 4.1 7.7 ...
 $ WindGustSpeed: int  30 39 85 54 50 44 43 41 48 31 ...
 $ WindSpeed    : int  20 17 6 24 28 24 26 24 17 6 ...
 $ Humidity     : int  29 36 69 56 49 57 47 57 48 32 ...
 $ Pressure     : num  1015 1008 1007 1007 1018 ...
 $ Cloud        : int  7 3 7 7 7 5 6 7 7 1 ...
 $ Temp         : num  23.6 25.7 20.2 14.1 15.4 14.8 17.3 15.5 18.9 21.7 ...
 $ RainTomorrow : chr  "Yes" "Yes" "Yes" "Yes" ...
 
View(weather_df) # head(weather_df) 

 

- 로지스틱 회귀분석(Logistic Regression) -> 7:3 비율 

idx <- sample(1:nrow(weather_df), nrow(weather_df)*0.7) # 랜덤으로 70% 출력 
train <- weather_df[idx, ] # 70%
test <- weather_df[-idx, ] # 30%

 

- 로지스틱  회귀모델 생성 : 학습데이터 

weater_model <- glm(RainTomorrow ~ ., data = train, family = 'binomial')
weater_model 
summary(weater_model) 

 

 

- 로지스틱  회귀모델 예측치 생성  

newdata=test : 새로운 데이터 셋, type="response" : 0~1 확률값으로 예측 

pred <- predict(weater_model, newdata=test, type="response")  
pred 

summary(pred)

- 출력값 -
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
0.001244 0.019221 0.081876 0.225368 0.385520 0.975289        2 

str(pred)

- 출력값 -
Named num [1:110] 0.1094 0.0109 0.0193 0.0502 0.0594 ...
 - attr(*, "names")= chr [1:110] "2" "11" "15" "19" ...

 

- 예측치 : 0과 1로 변환(0.5)

result_pred <- ifelse(pred >= 0.5, 1, 0) # 비가올 활률 50% 이상 : 1, 비가올 활률 50% 이하 : 0
result_pred

table(result_pred)

- 출력값 - 
result_pred  0  1
          0 86 11
          1  1 10

 

 

- 모델 평가 : 분류정확도  

table(result_pred, test$RainTomorrow)

- 출력값 -
result_pred  0  1
          0 86 11
          1  1 10
         
모델의 분류정확도 
(80+13) / (86+11+1+10) #  0.8611111 = 86.11%         

 

- ROC(Receiver Operating Characteristic) Curve를 이용한 모델 평가

install.packages("ROCR")
library(ROCR)

 

- ROCR 패키지 제공 함수 : prediction() -> performance

pr <- prediction(pred, test$RainTomorrow)

pr

-출력값- 
A prediction instance
  with 110 data points
  
prf <- performance(pr, measure = "tpr", x.measure = "fpr")

plot(prf)

 

머신러닝(Machine Learning)

: 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구로 인공지능의 한 분야로 간주합니다. 또한 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야입니다. 가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있습니다. 

 

- 머신러닝 에서의 일반화는 훈련 이후 새롭게 들어온 데이터를 정확히 처리할 수 있는 능력을 말하기도 합니다. 

 

알고리즘의 유형 

 

① 지도 학습(Supervised Learning) 

: 사람이 교사로서 각각의 입력(x)에 대해 레이블(y)을 달아놓은 데이터를 컴퓨터에 주면 컴퓨터가 그것을 학습하는 것 입니다. 사람이 직접 개입하므로 정확도가 높은 데이터를 사용할 수 있다는 장점이 있지만, 대신에 사람이 직접 레이블을 달아야 하므로 인건비 문제가 있습니다. 따라서 구할 수 있는 데이터양도 적다는 문제가 있습니다. 

 

– 인간 개입에 의한 분석 방법
– 종속변수(y) 존재 : 입력 데이터에 정답 포함
– 분석방법 : 가설검정(확률/통계) → 인문.사회.심리 계열(300년)
– 분석유형 : 회귀분석, 분류분석, 시계열 분석 → 추론통계 기반(모집단에 대한 결과 분석)

 

 

- 분류(Classification)

: 레이블 y가 이산적(Discrete)인 경우 즉, y가 가질 수 있는 값이 [0,1,2 ..]와 같이 유한한 경우 분류, 혹은 인식 문제라고 합니다 일상에서 가장 접하기 쉬우며, 연구가 많이 되어있고, 기업들이 가장 관심을 가지는 문제 중 하나 입니다. 이런 문제들을 해결하기 위한 대표적인 기법들로는 로지스틱 회귀법, KNN, 서포트 벡터 머신 (SVM), 의사 결정 트리 등이 있습니다. 

- 분류분석 : 고객 이탈분석(번호이동, 반응고객 대상 정보 제공)

 

 

- 회귀(Regression)

: 레이블 y가 실수인 경우 회귀문제라고 부릅니다. 데이터들을 쭉 뿌려놓고 이것을 가장 잘 설명하는 직선 하나 혹은 이차함수 곡선 하나를 그리고 싶을 때 회귀기능을 사용합니다. 잘 생각해보면 데이터는 입력(x)와 실수 레이블(y)의 짝으로 이루어져있고, 새로운 임의의 입력(x)에 대해 y를 맞추는 것이 바로 직선 혹은 곡선이므로 기계학습 문제입니다. 통계학의 회귀분석 기법 중 선형회귀 기법이 이에 해당하는 대표적인 예입니다. 

- 회귀분석 : 인과관계 예측(회귀분석 - p값 제공)

 

 

 

② 비지도 학습(Unsupervised Learning) 

: 사람 없이 컴퓨터가 스스로 레이블 되어 있지 않은 데이터에 대해 학습하는 것으로 y없이 x만 이용해서 학습하는 것 입니다. 정답이 없는 문제를 푸는 것이므로 학습이 맞게 됐는지 확인할 길은 없지만, 인터넷에 있는 거의 모든 데이터가 레이블이 없는 형태로 있으므로 앞으로 기계학습이 나아갈 방향으로 설정되어 있습니다. 통계학의 군집화와 분포 추정 등의 분야와 밀접한 관련이 있습니다 .

 

– 컴퓨터 기계학습에 의한 분석 방법 
– 종속변수(y) 없음 : 입력 데이터에 정답 없음 
– 분석방법 : 규칙(패턴분석) → 공학.자연과학 계열(100년) 
– 분석유형 : 연관분석, 군집분석 → 데이터마이닝 기반

 

 

- 군집화(Clustering)

: 데이터가 쭉 뿌려져 있을 때 레이블이 없다고 해도 데이터간 거리에 따라 대충 두 세개의 군집으로 이렇게 x만 가지고 군집을 학습하는 것을 군집화 라고 합니다. 

- 군집분석 : 그룹화를 통한 예측(그룹 특성 차이 분석-고객집단 이해)

 

 

분포 추정(Underlying Probability Density Estimation)

: 군집화에서 더 나아가서, 데이터들이 쭉 뿌려져 있을 때 얘네들이 어떤 확률 분포에서 나온 샘플들인지 추정하는 문제를 분포 추정이라고 합니다. 

 

 

지도 학습 vs 비지도 학습 

분류 지도 학습 비지도 학습
주관 사람의 개입에 의한 학습 컴퓨터에 의한 기계학습
기법 확률과 통계 기반 추론 통계 패턴분석 기반 데이터 마이닝 
유형 회귀분석, 분류분석(y변수 존재) 군집분석, 연관분석(y변수 없음)
분야  인문, 상회 계열 공학, 자연 계열

 

 

③ 준지도 학습(Semisupervised learning)

: 레이블이 있는 데이터와 없는 데이터 모두를 활용해서 학습하는 것인데, 대개의 경우는 다수의 레이블 없는 데이터를 약간의 레이블 있는 데이터로 보충해서 학습하는 종류의 문제를 다룬다.

 

 

④ 강화 학습(Reinforcement Learning)

: 강화학습은 현재의 상태(State)에서 어떤 행동(Action)을 취하는 것이 최적인지를 학습하는 것입니다. 

 

상관관계 분석(Correlation Analysis) - 관련성 

: 변수 간 관련성 분석 방법으로 하나의 변수가 다른 변수와 관련성 분석하는 방법입니다.

  ex) 광고비와 매출액 사이의 관련성 등 분석

 

 

 

* 상관분석 자세한 설명 

더보기

확률론과 통계학에서 두 변수간에 어떤 선형적 관계를 갖고 있는 지를 분석하는 방법이다. 두변수는 서로 독립적인 관계로부터 서로 상관된 관계일 수 있으며, 이때 두 변수간의 관계의 강도를 상관관계(Correlation, Correlation coefficient)라 한다. 상관분석에서는 상관관계의 정도를 나타내는 단위로 모상관계수 ρ를 사용한다. 상관관계의 정도를 파악하는 상관계수(Correlation coefficient)는 두 변수간의 연관된 정도를 나타낼 뿐 인과관계를 설명하는 것은 아니다. 두 변수간에 원인과 결과의 인과관계가 있는지에 대한 것은 회귀분석을 통해 인과관계의 방향, 정도와 수학적 모델을 확인해 볼 수 있다.


상관 관계 분석 중요사항

– 회귀분석 전 변수 간 관련성 분석(가설 검정 전 수행)
– 상관계수 -> 피어슨(Pearson) R계수 이용 관련성 유무

 

 

상관관계 분석척도 :
피어슨 상관계수(Pearson correlation coefficient : r)

- 상관계수 r과 상관관계 정도

 

기술 통계량 구하기 

 

- 데이터 가져오기 

result <- read.csv("C:/workspaces/R/data/product.csv", header=TRUE)
head(result) # 친밀도 적절성 만족도(등간척도 - 5점 척도)

- 출력값 - 
       제품_친밀도 제품_적절성 제품_만족도
1           3           4           3
2           3           3           2
3           4           4           4
4           2           2           2
5           2           2           2
6           3           3           3

 

- 기술 통계량

summary(result) # 요약통계량

- 출력값 - 
 제품_친밀도     제품_적절성     제품_만족도   
 Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.:2.000   1st Qu.:3.000   1st Qu.:3.000  
 Median :3.000   Median :3.000   Median :3.000  
 Mean   :2.928   Mean   :3.133   Mean   :3.095  
 3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:4.000  
 Max.   :5.000   Max.   :5.000   Max.   :5.000  
 
 sd(result$제품_친밀도); sd(result$제품_적절성); sd(result$제품_만족도)
 
 - 출력값 - 
[1] 0.9703446
[1] 0.8596574
[1] 0.8287436

sd 표준편차 : 평균을 기준으로 분포되어있는 정도를 보여줍니다. 

 

 

상관계수(coefficient of correlation) : 두 변량 X,Y 사이의 상관관계 정도를 나타내는 수치(계수)

cor(result$제품_친밀도, result$제품_적절성) 출력값 :  0.4992086 -> 다소 높은 양의 상관관계
cor(result$제품_친밀도, result$제품_만족도) 출력값 :  0.467145 -> 다소 높은 양의 상관관계

 

 전체 변수 간 상관계수 보기

cor(result, method="pearson") 

 

방향성 있는 색상으로 표현

install.packages("corrgram")   
library(corrgram)
corrgram(result) # 색상 적용 - 동일 색상으로 그룹화 표시

 

수치(상관계수) 추가(위쪽) 

corrgram(result, upper.panel=panel.conf)

 

수치(상관계수) 추가(아래쪽)

corrgram(result, lower.panel=panel.conf)

 

차트에 밀도 곡선, 상관성, 유의확률(별표) 추가 

install.packages("PerformanceAnalytics") 
library(PerformanceAnalytics)

 

- 상관성, p값(*), 정규분포 시각화 - 모수 검정 조건 

chart.Correlation(result, histogram=, pch="+") 

 

 spearman : 서열척도 대상 상관계수

cor(result, method="spearman") 

 

https://link.coupang.com/a/bsbQYm

 

햇반 백미밥, 200g, 15개

COUPANG

www.coupang.com

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

요인분석(Factor Analysis) - 예측분석

: 여러개의 서로 관련이 있는 변수들로 측정된 자료에서 그 변수들을 설명할 수 있는 새로운 공통변수를 파악하는 통계적 분석방법입니다. 유사성을 띈 데이터의 축약을 목적으로 하는 분석방법이라고 할 수 있습니다. 

 

 

 

 요인분석의 특징 

 

1) 다수의 변수들을 대상으로 변수들 간의 관계 분석(타당성 분석) 

 

2) 공통 차원으로 축약하는 통계기법(변수 축소) - 데이터 축소 

    - 유사성을 가진 데이터들을 하나로 묶음. 

 

 

 요인분석의 종류(개입의 여부로 나눔)


1) 탐색적 요인분석 : 요인분석을 할 때 사전에 어떤 변수들끼리 묶어야 한다는 전제를 두지 않고 분석하는 방법(개입X)

                          - 변수 압축이 목적(주성분분석, 주요인분석, 최대우도요인분석 ...)


2) 확인적 요인분석 : 요인분석을 할 때 사전에 묶여질 것으로 기대되는 항목끼리 묶여지는지를 분석하는 방법(개입O)

                          - 어떤 가설이나 모델의 검증이 목적

 

 

요인분석의 방법

 

1) 변수간의 상관행렬로부터 공통요인을 도출

2) 도출된 공통요인을 이용해서 변수간의 상관관계를 설명

3) 요인부하량(factor loading)은 ±0.3 이상이면 유의하다고 봄.

 

 

● 요인의 수와 유의성 판단 기준

 

- 상관 계수 행렬 R의 고유값이 1이상인 경우 채택하며, 요인의 유의성은 다음의 기준을 따른다.

- 수학적 근거 보다는 통상적으로 개체수 n>= 50인 경우 절대값 기준으로

   요인부하값 > 0.3 : 유의함  

   요인부하값 > 0.4 : 좀 더 유의함

   요인부하값 > 0.5 : 아주 유의함

 

 

요인분석의 목적 


1) 자료의 요약 : 변인을 몇 개의 공통된 변인으로 묶음 (주성분 분석과 비슷)

                    - 같은 개념을 측정하는 변수들이 동일한 요인으로 묶이는지 확인


2) 변인 구조 파악 : 변인들의 상호관계 파악(독립성 등) 


3) 불필요한 변인 제거 : 중요도가 떨어진 변수 제거 


4) 측정도구 타당성 검증 : 변인들이 동일한 요인으로 묶이는지 여부를 확인 / ex ) 설문의 질문의 타당성 

                                 - 회귀분석이나 판별분석의 설명변수 선택

 

 

전제조건 

 

- 등간척도 or 비율척도, 정규분포, 관찰치 상호독립적/분산 동일  

- 하위요인으로 구성되는 데이터 셋이 준비되어 있어야 함.

- 분석에 사용되는 변수는 등간척도나 비율척도이여야 하며, 표본의 크기는 최소 50개 이상이 바람직함 【중심극한정리】

- 요인분석은 상관관계가 높은 변수들끼리 그룹화하는 것이므로 변수들 간의 상관관계가 매우 낮다면(보통 ±3 이하)

  그 자료는 요인 분석에 적합하지 않음. 

- 변수간에 높은 상관관계가 있어야 함.

- 최초 요인 추출 단계에서 얻은 고유치를 스크리 차트로 표시했을 때 한 군데 이상 꺽이는 곳이 있어야 함.

- 모상관 행렬이 단위 행렬이라는 가설이 기각되어야 함. (KMO and Bartleet's 검정)

 

 

요인분석 결과에 대한 활용 방안 


- 서로 밀접하게 관련된 변수들을 합치거나 중복된 변수를 제거하여 변수를 축소
- 변수들 간의 연관성 또는 공통점 탐색 
- 요인점수 계산으로 상관분석, 회귀분석의 설명변수로 이용 

 

 

* 요인 추가정보 

더보기

요인

factor 범주형 변수(요인형 변수)에서 가질 수 있는 값을 범주라고 합니다. . 

ex) 성별 - 남, 여 

 

- factor의 자료형 = numeric 

why :  요인이 가지는 개수를 요인이라는 자료형에서 관리하고 그것을 자료형인 numeric(값이 가질 수 있는 범위) 으로보여줍니다. 

 

ex ) factor의 자료형(=numeric) 

 

gender <- c('man','woman','woman','man','woman')
mode(gender) 출력값 : character

요인형 변환 

as.factor() 함수 이용 범주(요인)형 변환

Ngender <- as.factor(gender)

mode(Ngender) 출력값 :  "numeric"

 

대표적인 요인형으로 관리하는 요소  : 명목척도, 서열척도 

+ 요인 ) 순서를 부여할 수 있다. ( default  = 순서 x (알파벳 순서) ) 

 

1. 공통요인으로 변수 정제 

 

- 변수와 데이터프레임 생성 

s1 <- c(1, 2, 1, 2, 3, 4, 2, 3, 4, 5) # s1 : 자연과학
s2 <- c(1, 3, 1, 2, 3, 4, 2, 4, 3, 4) # s2 : 물리화학
s3 <- c(2, 3, 2, 3, 2, 3, 5, 3, 4, 2) # s3 : 인문사회 
s4 <- c(2, 4, 2, 3, 2, 3, 5, 3, 4, 1) # s4 : 신문방송
s5 <- c(4, 5, 4, 5, 2, 1, 5, 2, 4, 3) # s5 : 응용수학
s6 <- c(4, 3, 4, 4, 2, 1, 5, 2, 4, 2) # s6 : 추론통계

name <-1:10 # 각 과목 문항 이름

subject <- data.frame(s1, s2, s3, s4, s5, s6)

subject

-출력값- 
  s1 s2 s3 s4 s5 s6
1   1  1  2  2  4  4
2   2  3  3  4  5  3
3   1  1  2  2  4  4
4   2  2  3  3  5  4
5   3  3  2  2  2  2
6   4  4  3  3  1  1
7   2  2  5  5  5  5
8   3  4  3  3  2  2
9   4  3  4  4  4  4
10  5  4  2  1  3  2

str(subject) 

- 출력값 - 
'data.frame':	10 obs. of  6 variables:
 $ s1: num  1 2 1 2 3 4 2 3 4 5
 $ s2: num  1 3 1 2 3 4 2 4 3 4
 $ s3: num  2 3 2 3 2 3 5 3 4 2
 $ s4: num  2 4 2 3 2 3 5 3 4 1
 $ s5: num  4 5 4 5 2 1 5 2 4 3
 $ s6: num  4 3 4 4 2 1 5 2 4 2
 
summary(subject)

- 출력값 -
 s1             s2             s3            s4             s5             s6     
 Min.   :1.00   Min.   :1.00   Min.   :2.0   Min.   :1.00   Min.   :1.00   Min.   :1.0  
 1st Qu.:2.00   1st Qu.:2.00   1st Qu.:2.0   1st Qu.:2.00   1st Qu.:2.25   1st Qu.:2.0  
 Median :2.50   Median :3.00   Median :3.0   Median :3.00   Median :4.00   Median :3.5  
 Mean   :2.70   Mean   :2.70   Mean   :2.9   Mean   :2.90   Mean   :3.50   Mean   :3.1  
 3rd Qu.:3.75   3rd Qu.:3.75   3rd Qu.:3.0   3rd Qu.:3.75   3rd Qu.:4.75   3rd Qu.:4.0  
 Max.   :5.00   Max.   :4.00   Max.   :5.0   Max.   :5.00   Max.   :5.00   Max.   :5.0  
 
 View(subject)

-- R은 4.0, 3.0, 4.0, 4.0, 2.0 으로 저장, 자료형 = numeric 

 

 

- 변수의 주요 성분분석 

pc <- prcomp(subject) 
summary(pc)

-출력값- 
                                   PC1    PC2     PC3     PC4     PC5     PC6
표준편차 : Standard deviation     2.389 1.5532 0.87727 0.56907 0.19315 0.12434
분산비율 : Proportion of Variance 0.616 0.2603 0.08305 0.03495 0.00403 0.00167
누적비율 : Cumulative Proportion  0.616 0.8763 0.95936 0.99431 0.99833 1.00000

plot(pc)

누적 비율(Cumulative Proportion) :

pc1 = 1개 그룹(분산 비율 : pc1) = 62% - 손실 38%

pc2 = 2개 그룹(분산 비율 : pc1 + pc2) = 88% - 12% 

pc3 = 3개 그룹(분산 비율 : pc1 + pc2 + pc3) = 96% - 손실 4%

pc4 = 4개 그룹(분산 비율 : pc1 + pc2 + pc3 + pc4) = 99.4% - 손실 0.6%

pc5 = 5개 그룹(분산 비율 : pc1 + pc2 + pc3 + pc4 + pc5) = 99.8% - 손실 0.2% 

pc6 = 6개 그룹(분산 비율 : pc1 + pc2 + pc3 + pc4 + pc5 + pc6) = 100% - 손실 0%

 

3개의 구룹으로 묶음 - (자연과학+물리화학) + (인문사회+신문방송) + 응용수학+추론통계) = 96%

 

해석 : 3개의 그룹으로 묶으면 96% 의미를 가져갈 수 있다(절대성의 의미X - 무조건 3그룹으로 묶을 필요X) 

- 분산비율 : Proportion of Variance 시각화 

 

 

- 고유값으로 요인 수 분석 

en <- eigen(cor(subject))
# $values : 고유값, $vectors : 고유벡터 , cor : 상관 변수간에 상관 계수를 계산 - 상관분석

names(en) 출력값 :  "values"  "vectors"

en$values # $values : 고유값(스칼라) 보기 - 선택의 근거를 만듦
출력값 : [1] 3.44393944 1.88761725 0.43123968 0.19932073 0.02624961 0.01163331

plot(en$values, typ="o") # 고유값을 이용한 시각화 

결론 : index 3까지 급현한 변화를 가지는데, 3개의 요인으로 remodeling 하면 최소의 오차를 가져가면서 성분에 대한 것을 가져갈 수 있을 것이다. 

 

- 무조건 이렇게 설정할 필요 x , 판단은 사람에 따라 다를 수 있습니다. 

 

 

- 변수 간의 상관관계 분석과 요인분석   

cor(subject) # 상관계수의 값을 피드백 

cor : 상관 변수간에 상관 계수를 계산

 

- 연관성에 대한 수치화 ( 값이 1에 가까울수록 연관성이 크다 ) 

상관도(유사성)가 높은 그룹 : s1 - s2 = 86.6% , s3 - s4 = 92.3% , s5 - s6 = 87.3% 

 

결론 : 3개의 그룹으로 합치는 것이 좋을 것이다. 

 

 

요인분석 : 요인회전법 적용(varimax is the default) 

 

① 주성분분석의 가정에 의해서 2개 요인으로 분석

result <- factanal(subject, factors = 2, rotation = "varimax")
result # p-value is 0.0232  < 0.05 # 요인수가 부족.

유의 확률 값 = 0.0232 < 0.05  = 기각 

 

결과 : 2개로 결합하는 것은 적합하지 않다. 많은 성분들이 손실한다. 

 

 

② 고유값으로 가정한 3개 요인으로 분석

result <- factanal(subject, factors = 3, # 요인 개수 지정 
                   rotation = "varimax", # 회전방법 지정("varimax", "promax", "none")
                   scores="regression") # 요인점수 계산 방법
result

적절할 때는 유의 확률 값을 축출하지 않습니다. = 적절함

 

해설: 

 

요인 적재량 보기  

names(result)
result$loadings

 

③ 다양한 방법으로 요인적재량 보기

 

print(result, digits = 2, cutoff=0.5) 
print(result$loadings, cutoff=0) # display every loadings

- print(result, digits = 2, cutoff=0.5) 

 

 

- print(result$loadings, cutoff=0) # display every loadings

 

 

 요인점수 
- 관측치의 동작을 살펴보는데 사용되며, 상관분석이나 회귀분석의 독립변수로 사용
- 각 변수(표준화값)와 요인 간의 관계(요인부하량)를 통해서 구해진 점수

 

요인점수를 이용한 요인적재량 시각화  

- Factor1, Factor2 요인지표 시각화 

plot(result$scores[, c(1:2)], main="Factor1과 Factor2 요인점수 행렬")
text(result$scores[, 1], result$scores[,2], 
     labels = name, cex = 0.7, pos = 3, col = "blue")

 

- Factor1, Factor2 요인지표 시각화 + 요인적재량 plotting

points(result$loadings[, c(1:2)], pch=19, col = "red")
text(result$loadings[, 1], result$loadings[,2], 
     labels = rownames(result$loadings), 
     cex = 0.8, pos = 3, col = "red")

 

- Factor1, Factor3 요인지표 시각화

plot(result$scores[,c(1,3)], main="Factor1과 Factor3 요인점수 행렬")
text(result$scores[,1], result$scores[,3], 
     labels = name, cex = 0.7, pos = 3, col = "blue")

 

- Factor1, Factor3 요인지표 시각화 + 요인적재량 plotting

points(result$loadings[,c(1,3)], pch=19, col = "red")
text(result$loadings[,1], result$loadings[,3], 
     labels = rownames(result$loadings), 
     cex = 0.8, pos = 3, col = "red")

 

 

3차원 산점도로 요인적재량 시각화

 

install.packages("scatterplot3d")
library(scatterplot3d)

Factor1 <- result$scores[,1]
Factor2 <- result$scores[,2]
Factor3 <- result$scores[,3] 
# scatterplot3d(밑변, 오른쪽변, 왼쪽변, type='p') # type='p' : 기본산점도 표시 
d3 <- scatterplot3d(Factor1, Factor2, Factor3)

- 요인적재량 표시 

loadings1 <- result$loadings[,1]
loadings2 <- result$loadings[,2]
loadings3 <- result$loadings[,3] 
d3$points3d(loadings1, loadings2, loadings3, bg='red',pch=21, cex=2, type='h')

 

 

요인별 변수 묶기 

 

① 요인별 과목변수 이용 데이터프레임 생성

app <- data.frame(subject$s5, subject$s6) # 응용과학 
soc <- data.frame(subject$s3, subject$s4) # 사회과학 
net <- data.frame(subject$s1, subject$s2) # 자연과학 

 

② 산술평균 계산 - 3개의 파생변수 생성 : 가독성과 설득력이 높다.

app_science <- round( (app$subject.s5 + app$subject.s6) / ncol(app), 2)
soc_science <- round( (soc$subject.s3 + soc$subject.s4) / ncol(soc), 2)
net_science <- round( (net$subject.s1 + net$subject.s2) / ncol(net), 2)

 

③ 상관관계 분석 - 요인분석을 통해서 만들어진 파생변수는 상관분석이나 회귀분석에서 독립변수로 사용할 수 있다.

subject_factor_df <- data.frame(app_science, soc_science, net_science)
cor(subject_factor_df)

 

 

2. 잘못 분류된 요인 제거로 변수 정제

 

- 요인분석에 사용될 데이터 셋 가져오기 

 

① 데이터 가져오기

install.packages('memisc') # spss tool 포맷 파일 읽어오기
library(memisc)
setwd("C:/workspaces/R/data/")
data.spss <- as.data.set(spss.system.file('drinking_water.sav', , encoded = 'utf-8'))

head(data.spss)

 - 출력값 - 
Data set with 20 observations and 15 variables

   Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 성별 연령 지역     학력
 1  3  2  3  3  4  3  4  3  4   3   4 32@Z 204k 4k18 @|9.4kA9
 2  3  3  3  3  3  3  2  3  3   2   3    2 204k 4k18 @|9.4kA9
 3  3  3  3  4  3  4  3  4  4   4   4 32@Z 204k 4k18     0mA9
 4  3  3  3  1  3  2  3  2  2   2   2    2 204k 4k18 @|9.4kA9
 5  3  3  2  2  3  3  2  2  2   2   2    2 204k 4k18 @|9.4kA9
 6  1  1  1  1  1  1  1  3  3   3   3 32@Z 304k 4k18 @|9.4kA9
 7  2  2  2  3  2  3  5  4  4   4   4    2 204k 4k18     4kA9
 8  2  2  1  2  1  2  1  2  2   2   2    2 204k 4k18 @|9.4kA9
 9  2  2  1  2  3  3  1  3  2   3   1    2 204k 4k18     4kA9
10  4  3  3  3  4  3  3  4  2   3   4    2 204k 4k18        5
11  3  4  4  3  4  4  4  5  5   5   5    2 204k 4k18     4kA9
12  2  1  1  2  2  2  1  4  4   5   5 32@Z 204k 4k18     0mA9
13  1  1  1  2  1  1  1  1  1   1   1    2 204k 4k18 @|9.4kA9
14  2  3  2  2  3  1  2  3  2   2   2    2 204k 4k18 @|9.4kA9
15  1  2  2  1  1  1  1  2  2   2   2 32@Z 304k 4k18 @|9.4kA9
16  3  2  2  2  3  2  2  2  2   2   1 32@Z 204k 4k18 @|9.4kA9
17  3  3  3  3  2  3  2  3  3   3   3    2 204k 4k18 @|9.4kA9
18  3  3  3  3  2  2  2  2  3   3   2    2 204k 4k18 @|9.4kA9
19  3  3  2  2  3  2  2  3  3   3   3    2 204k 4k18 @|9.4kA9
20  4  4  4  4  4  4  3  4  4   4   4    2 204k 4k18 @|9.4kA9

View(data.spss)

 

 

②  데이터프레임으로 변경

drinking_water <- data.spss[1:11]

drinking_water

- 출력값 -

Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11
 1  3  2  3  3  4  3  4  3  4   3   4
 2  3  3  3  3  3  3  2  3  3   2   3
 3  3  3  3  4  3  4  3  4  4   4   4
 4  3  3  3  1  3  2  3  2  2   2   2
 5  3  3  2  2  3  3  2  2  2   2   2
 6  1  1  1  1  1  1  1  3  3   3   3
 7  2  2  2  3  2  3  5  4  4   4   4
 8  2  2  1  2  1  2  1  2  2   2   2
 9  2  2  1  2  3  3  1  3  2   3   1
10  4  3  3  3  4  3  3  4  2   3   4
11  3  4  4  3  4  4  4  5  5   5   5
12  2  1  1  2  2  2  1  4  4   5   5
13  1  1  1  2  1  1  1  1  1   1   1
14  2  3  2  2  3  1  2  3  2   2   2
15  1  2  2  1  1  1  1  2  2   2   2
16  3  2  2  2  3  2  2  2  2   2   1
17  3  3  3  3  2  3  2  3  3   3   3
18  3  3  3  3  2  2  2  2  3   3   2
19  3  3  2  2  3  2  2  3  3   3   3
20  4  4  4  4  4  4  3  4  4   4   4
21  3  4  2  1  1  1  1  3  2   3   1
22  4  2  2  1  1  1  1  3  4   4   1
23  3  3  2  2  2  2  3  2  3   3   3
24  2  2  2  2  2  3  1  4  4   4   2
25  2  2  2  2  2  2  3  4  3   3   3
.. .. .. .. .. .. .. .. .. .. ... ...
(25 of 380 observations shown)

drinking_water_df <- as.data.frame(drinking_water) 

str(drinking_water_df)

- 출력값 - 
'data.frame':	380 obs. of  11 variables:
 $ Q1 : num  3 3 3 3 3 1 2 2 2 4 ...
 $ Q2 : num  2 3 3 3 3 1 2 2 2 3 ...
 $ Q3 : num  3 3 3 3 2 1 2 1 1 3 ...
 $ Q4 : num  3 3 4 1 2 1 3 2 2 3 ...
 $ Q5 : num  4 3 3 3 3 1 2 1 3 4 ...
 $ Q6 : num  3 3 4 2 3 1 3 2 3 3 ...
 $ Q7 : num  4 2 3 3 2 1 5 1 1 3 ...
 $ Q8 : num  3 3 4 2 2 3 4 2 3 4 ...
 $ Q9 : num  4 3 4 2 2 3 4 2 2 2 ...
 $ Q10: num  3 2 4 2 2 3 4 2 3 3 ...
 $ Q11: num  4 3 4 2 2 3 4 2 1 4 ...

 

③ 요인수를 3개로 지정하여 요인분석 수행

result2 <- factanal(drinking_water_df, factors = 3, rotation = "varimax",
                    scores = "regression")

print(result2, cutoff=0.5)

result2

- print(result2, cutoff=0.5)

Q4의 값이 파악한 바와 알고리즘으로 도출된 것이 다를 때, 이러한 요인의 변수값은 제거해서 처리해서 하는 것이 정확한 값을 피드백 받을 수 있습니다. 

 

요인별 변수 묶기 

① q4 칼럼 제외하여 데이터프레임 생성

dw_df <- drinking_water_df[-4] - 4번째열 제외 (Q4)

str(dw_df)

- 출력값 -
'data.frame':	380 obs. of  10 variables:
 $ Q1 : num  3 3 3 3 3 1 2 2 2 4 ...
 $ Q2 : num  2 3 3 3 3 1 2 2 2 3 ...
 $ Q3 : num  3 3 3 3 2 1 2 1 1 3 ...
 $ Q5 : num  4 3 3 3 3 1 2 1 3 4 ...
 $ Q6 : num  3 3 4 2 3 1 3 2 3 3 ...
 $ Q7 : num  4 2 3 3 2 1 5 1 1 3 ...
 $ Q8 : num  3 3 4 2 2 3 4 2 3 4 ...
 $ Q9 : num  4 3 4 2 2 3 4 2 2 2 ...
 $ Q10: num  3 2 4 2 2 3 4 2 3 3 ...
 $ Q11: num  4 3 4 2 2 3 4 2 1 4 ...

dim(dw_df) 출력값 :  [1] 380  10

cor(dw_df)

Q1~3(제품 친밀도) , Q5~7(제품적절성) , Q8~11(제품만족도)

 

 

② 요인에 속하는 입력변수별 데이터프레임 구성

제품만족도 저장 데이터프레임  
s <- data.frame(dw_df$Q8, dw_df$Q9, dw_df$Q10, dw_df$Q11) 

제품친밀도 저장 데이터프레임  
c <- data.frame(dw_df$Q1, dw_df$Q2, dw_df$Q3)

제품적절성 저장 데이터프레임 
p <- data.frame(dw_df$Q5, dw_df$Q6, dw_df$Q7)   

 

③ 요인별 산술평균 계산

satisfaction <- round( (s$dw_df.Q8 + s$dw_df.Q9 + s$dw_df.Q10 + s$dw_df.Q11) / ncol(s), 2)
closeness <- round( (c$dw_df.Q1 + c$dw_df.Q2 + c$dw_df.Q3) / ncol(c), 2)
pertinence <- round( (p$dw_df.Q5 + p$dw_df.Q6 + p$dw_df.Q7) / ncol(p), 2)

 

④ 상관관계 분석 

drinking_water_factor_df <- data.frame(satisfaction, closeness, pertinence)
colnames(drinking_water_factor_df) <- c("제품만족도","제품친밀도","제품적절성")
cor(drinking_water_factor_df)

 

+ Recent posts