SEM

ch 13 - Reliability

Intro

  • PLS-SEM의 분석과정에서 척도(측정변수와 잠재변수)의 신뢰도와 타당도를 확보하는 것은 매우 중요하며, 신뢰도와 타당도가 확보되지 않으면 모델 추정 결과가 의미가 없기 때문임
  • 즉, 구조모델의 추정을 실행하려면 사전에 반드시 측정모델에 대한 평가과정을 통해 신뢰도와 타당도 확보 필요

I. 주요 개념

(1) 신뢰도

  • 잠재변수의 측정에 있어서 얼마나 일관성이 있는가의 정도 의미
    • 검사도구의 일관성을 말하며, 일관성이란 잠재변수를 여러 번에 걸쳐 측정했을 때 매번 같은 결과를 도출할 수 있는 정도.
    • 내적 일관성 신뢰(Internal Consistency Reliability)로 평가

(2) 타당도

  • 타당도의 기본 정의는 실제 측정하고자 하는 잠재변수를 정확하게 측정하고 있는 정도
    • PLS-SEM에서는 집중타당도(Convergent Validity)와 판별타당도(Discriminant Validity)를 사용한다.
    • 전자는 하나의 잠재변수를 측정하기 위해 사용되는 척도의 구성항목들 간에 상관관계가 높아야 집중타당도가 있다고 볼 수 있고, 후자는 하나의 잠재변수와 다른 잠재변수간 상관관계가 낮을수록 판별 타당도가 높다고 판단함.

(3) PLS-SEM 분석 결과의 쳬계적인 평가 단계

  • 반영적 측정모델: 내적 일관성 신뢰도, 집중타당도, 판별타당도
  • 형성적 측정모델: 집중타당도, 다중공선성, 외부가중치와 외부적재치의 유의성과 적합성
  • 구조모델의 평가기준: 다중공선성, 결정계수 $R^2$, 효과크기 $f^2$, 예측적 적합성 $Q^2$, 경로계수의 유의성과 적합성
  • PLS-SEM의 평가 단계: 제 1단계는 측정모델(Outer Model)을 평가하는 것이며, 제 2단계는 구조모델(Inner Model)을 평가하는 것이다.

II. 설문조사 데이터 분석

  • 이제 설문지를 분석해본다.
  • 필수 패키지를 확인한다.
library(readr) 
library(dplyr)
library(kableExtra) 
library(psy) # 신뢰도
library(corrplot) # 상관계수
library(psychometric) # 타당도 

(1) 데이터 수집

  • 먼저 수집된 설문조사 데이터를 확인한다.
data <- read_csv('data/thesis_mater.csv') %>% 
  distinct() %>% # 중복데이터 제거
  rename(Position = founder_employee, # 출력을 위한 변수명 정리
         Age = age_of_respondent, 
         Education = Education_Level) %>% 
  slice(-c(1:10)) %>% 
  dplyr::select(-c(Firm_Age:Business_Area))

data %>% 
  head() %>% 
  kable() %>% 
  kable_styling("striped") %>% 
  scroll_box(width = "100%")
EI_1 EI_2 EI_3 EP_1 EP_2 EP_3 ER_1 ER_2 ER_3 SS_1 SS_2 SS_3 SC_1 SC_2 SC_3 SR_1 SR_2 SR_3 F1 F2 F3 NF1 NF2 NF3 Firm_Age Firm_Size WE1 WE2 WE3 gender founder_employee age_of_respondent Education_Level Business_Area
2 3 4 3 3 4 3 2 4 1 1 3 3 3 3 2 2 1 2 2 3 3 1 3 5 years above Above 15 members No, I don't have experience Yes Yes Female Employee 30-39 Undergraduate School Others
5 5 2 3 5 3 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 Less than 2 years Less than 5 members No, I don't have experience No Yes Male Employee Younger than 30 Undergraduate School Media and Entertainment
1 2 2 1 1 2 1 2 1 2 2 1 1 2 2 1 2 1 2 1 1 1 1 1 5 years above Less than 5 members As founder or employee, I have startup experiences more than 3 times No Yes Female Founder of Company Younger than 30 Undergraduate School Others
3 3 2 1 2 1 2 1 3 2 1 3 1 1 1 2 3 3 3 3 2 3 2 2 Less than 2 years Less than 5 members No, I don't have experience Yes Yes Male Employee Younger than 30 Undergraduate School Others
5 3 5 2 5 4 4 4 4 4 5 4 5 5 5 5 5 5 4 5 4 4 5 5 3-4 years Less than 5 members As founder or employee, I have startup experiences more than 3 times No Yes Male Founder of Company 30-39 Undergraduate School Others
1 3 3 1 3 3 2 3 1 4 1 2 3 3 1 2 2 1 1 2 3 1 3 1 5 years above 5-9 members As founder or employee, I have startup experience, one time No No Female Employee Younger than 30 Undergraduate School Others

(2) 상관관계 확인

  • 각 척도(Item)에서의 상관관계를 확인해본다.
M <- cor(data)

corrplot(M, type="upper", order="hclust", 
         col=RColorBrewer::brewer.pal(n=8, name="RdBu"))

ch 12 - Demographic of Respondent in R

Intro

  • 지난 시간에 설문조사 전처리에 대해 배웠다면 이번에는 경영/사회과학 논문에서 필수적으로 기재해야 하는 표본의 특성을 간단한 프로그램으로 요약하는 것을 코딩한다.

(1) 주요 패키지

  • 이번 포스트부터 gt 패키지를 사용하려고 한다.
    • gt: ggplot2와 같이 Table를 문법으로 컨트롤 할 수 있도록 구현된 패키지이다.
    • kableExtra: HTML로 출력할 수 있도록 도와주는 패키지이다.
library(readr)
library(dplyr)
library(gt)
library(gtsummary)

I. 데이터 가져오기

  • 우선 데이터를 불러온다.
data <- read_csv('data/thesis_mater.csv') %>% 
  distinct() %>% # 중복데이터 제거
  rename(Position = founder_employee, # 출력을 위한 변수명 정리
         Age = age_of_respondent, 
         Education = Education_Level)
glimpse(data %>% select(Firm_Age:Business_Area))
  • 전체 34개의 변수 중에서, 문자열 관련 데이터만 추출하였다.
  • 어떤 데이터를 표본의 특성으로 삼아야 할까?
    • 위 10개의 데이터에는 통제변수1가 들어가 있다.
    • 통제변수는 표본의 특징이 아니기 때문에 통제변인을 제외한 나머지 변수들을 추출한다.
## Rows: 103
## Columns: 10
## $ Firm_Age      <chr> "5 years above", "Less than 2 years", "5 years above", …
## $ Firm_Size     <chr> "Above 15 members", "Less than 5 members", "Less than 5…
## $ WE1           <chr> "No, I don't have experience", "No, I don't have experi…
## $ WE2           <chr> "Yes", "No", "No", "Yes", "No", "No", "No", "No", "No",…
## $ WE3           <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "No", "…
## $ gender        <chr> "Female", "Male", "Female", "Male", "Male", "Female", "…
## $ Position      <chr> "Employee", "Employee", "Founder of Company", "Employee…
## $ Age           <chr> "30-39", "Younger than 30", "Younger than 30", "Younger…
## $ Education     <chr> "Undergraduate School", "Undergraduate School", "Underg…
## $ Business_Area <chr> "Others", "Media and Entertainment", "Others", "Others"…
  • 표본의 특성을 기술하는 데이터는 아래와 같이 추출한다.
    • gender, founder_employee, age_of_respondent, educational_level, business_area
data2 <- data %>% 
  select(gender, Position, Age, Education, Business_Area)

glimpse(data2)
## Rows: 103
## Columns: 5
## $ gender        <chr> "Female", "Male", "Female", "Male", "Male", "Female", "…
## $ Position      <chr> "Employee", "Employee", "Founder of Company", "Employee…
## $ Age           <chr> "30-39", "Younger than 30", "Younger than 30", "Younger…
## $ Education     <chr> "Undergraduate School", "Undergraduate School", "Underg…
## $ Business_Area <chr> "Others", "Media and Entertainment", "Others", "Others"…

II. 표본 특성 표 출력

  • 보통 논문에 들어가는 표본의 특징은 Category, Frequency, and Percentage(%) 정도만 필요하다.
  • 이 때, Table을 가공해줄 수 있는 gtsummary 패키지를 활용한다.
set_gtsummary_theme(theme_gtsummary_journal(journal = "jama"))

data2 %>% 
  tbl_summary(by = gender) %>% 
  add_overall() %>% 
  add_n() %>% 
  modify_header(label = "**Variable**") %>% # update the column header
  bold_labels()
Variable N Overall, N = 103 Female, N = 621 Male, N = 411
Position 103
Employee 68 (66) 35 (56) 33 (80)
Founder of Company 35 (34) 27 (44) 8 (20)
Age 103
30-39 37 (36) 19 (31) 18 (44)
40-49 8 (7.8) 4 (6.5) 4 (9.8)
50 or above 2 (1.9) 2 (3.2) 0 (0)
Younger than 30 56 (54) 37 (60) 19 (46)
Education 103
Graduate School 25 (24) 15 (24) 10 (24)
High School 7 (6.8) 6 (9.7) 1 (2.4)
Undergraduate School 71 (69) 41 (66) 30 (73)
Business_Area 103
E-Commerce 16 (16) 11 (18) 5 (12)
Education 4 (3.9) 2 (3.2) 2 (4.9)
Energy 1 (1.0) 0 (0) 1 (2.4)
Enterprise Services 4 (3.9) 2 (3.2) 2 (4.9)
Fintech 9 (8.7) 6 (9.7) 3 (7.3)
Logistics 5 (4.9) 1 (1.6) 4 (9.8)
Manufacturing 3 (2.9) 2 (3.2) 1 (2.4)
Media and Entertainment 7 (6.8) 4 (6.5) 3 (7.3)
Medical and Healthcare 1 (1.0) 1 (1.6) 0 (0)
Online to Offline Commerce 2 (1.9) 1 (1.6) 1 (2.4)
Others 45 (44) 31 (50) 14 (34)
Real Estate and Household 1 (1.0) 0 (0) 1 (2.4)
Transportation/Automotive 4 (3.9) 0 (0) 4 (9.8)
Travel 1 (1.0) 1 (1.6) 0 (0)

1 Statistics presented: n (%)

ch 11 - Data Import & Label Encoding in R

Intro

  • 설문조사가 끝났으면 이제 정리를 해야 한다.
  • 일련의 과정은 보통 코딩이라 부른다.

(1) 주요 패키지

  • 이번 포스트부터 gt 패키지를 사용하려고 한다.
    • gt: ggplot2와 같이 Table를 문법으로 컨트롤 할 수 있도록 구현된 패키지이다.
    • kableExtra: HTML로 출력할 수 있도록 도와주는 패키지이다.

문제점

  • SmartPLS 프로그램을 쓴다 하더라도 기본적으로 모든 데이터의 entry는 수치형으로 일단 바뀌어 있어야 한다.
  • 우선 데이터를 불러와서 확인해보자.
library(tidyverse)
library(gt)
library(kableExtra)


# 데이터 불러오기
data <- read_csv("data/thesis_mater.csv")

data %>% 
  head() %>% 
  kable() %>% 
  kable_styling("striped") %>% 
  scroll_box(width = "100%")
EI_1 EI_2 EI_3 EP_1 EP_2 EP_3 ER_1 ER_2 ER_3 SS_1 SS_2 SS_3 SC_1 SC_2 SC_3 SR_1 SR_2 SR_3 F1 F2 F3 NF1 NF2 NF3 Firm_Age Firm_Size WE1 WE2 WE3 gender founder_employee age_of_respondent Education_Level Business_Area
2 3 4 3 3 4 3 2 4 1 1 3 3 3 3 2 2 1 2 2 3 3 1 3 5 years above Above 15 members No, I don't have experience Yes Yes Female Employee 30-39 Undergraduate School Others
5 5 2 3 5 3 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 Less than 2 years Less than 5 members No, I don't have experience No Yes Male Employee Younger than 30 Undergraduate School Media and Entertainment
1 2 2 1 1 2 1 2 1 2 2 1 1 2 2 1 2 1 2 1 1 1 1 1 5 years above Less than 5 members As founder or employee, I have startup experiences more than 3 times No Yes Female Founder of Company Younger than 30 Undergraduate School Others
3 3 2 1 2 1 2 1 3 2 1 3 1 1 1 2 3 3 3 3 2 3 2 2 Less than 2 years Less than 5 members No, I don't have experience Yes Yes Male Employee Younger than 30 Undergraduate School Others
5 3 5 2 5 4 4 4 4 4 5 4 5 5 5 5 5 5 4 5 4 4 5 5 3-4 years Less than 5 members As founder or employee, I have startup experiences more than 3 times No Yes Male Founder of Company 30-39 Undergraduate School Others
1 3 3 1 3 3 2 3 1 4 1 2 3 3 1 2 2 1 1 2 3 1 3 1 5 years above 5-9 members As founder or employee, I have startup experience, one time No No Female Employee Younger than 30 Undergraduate School Others
  • 위 데이터에서 보면 알 수 있듯이, WE1 ~ Business_Area 까지의 데이터는 모두 문자로 되어 있다.
  • Python에서는 LabelEncoder라는 것이 있다.
  • R에서는 기본 문법인 factor만 있어도 가능하다.

Factor의 활용

  • 이제 본격적으로 코딩을 시작한다.
  • 데이터 전처리에서 쉬운 방법은 없다.

(1) 기본

  • 가상의 데이터를 만든 후 factor를 활용하자.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"))
temp
##   x gender
## 1 1 Female
## 2 1   Male
## 3 2   Male
  • 이제 gender를 변환하자.
temp$gender <- as.numeric(factor(temp$gender))
temp
##   x gender
## 1 1      1
## 2 1      2
## 3 2      2
  • factor로 변환한 뒤, as.numeric으로 형 변환을 하면 쉽게 바꿀수는 있다.
  • 위와 같이 형변환을 하면 1이 무엇을 의미하는지, 2는 무엇을 의미하는지 알 수 없게 된다. (즉, 정보의 손실이 올 수 있다.)

(2) 응용

  • 이제 factor를 조금 더 활용해 본다.
  • 같은 가상의 데이터를 사용한다.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"))

temp$gender <- as.numeric(factor(temp$gender), 
                          levels = c("Female", "Male"), 
                          labels = c(1, 2))

temp
##   x gender
## 1 1      1
## 2 1      2
## 3 2      2
  • 결과는 똑같다. 그러나, 각 label에 대한 해석이 보다 명확해지기 때문에 추후 분석결과보고서를 작성할 때 보다 쉽게 작성할 수 있다.

(3) 적용

  • 이제 내 데이터에 적용해보자.
  • 적용해야 할 변수는 모두 Firm_Age ~ Business_Area 까지이다.
  • 여기에서 하나의 Rule을 만들어야 한다.
    • 각 범주마다 하나씩 맞추는 노가다는 지양해야 한다.
    • 따라서, 범주의 값은 모두 알파벳순으로 정렬한다.
    • 이를 프로그래밍으로 해결한다.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"),
                   grade = c("A", "B", "C"))

temp
##   x gender grade
## 1 1 Female     A
## 2 1   Male     B
## 3 2   Male     C
  • 데이터가 하나 더 생겼다. 다음과 같은 함수를 만든다.
factor2numeric <- function(x) {
  # input 변수가 문자형인지 확인하여 다음 코드를 실행한다. 
  # 만약 문자가 아니면 `else` 코드로 넘어간다. 
  if(is.character(x) == TRUE) { 
      # levels 함수를 사용하면 알파벳으로 자동 정렬해준다.
      char_levels <- levels(factor(x)) 
      
      # 변환되기 전 factor의 `level`를 확인한다.
      print("----변환 시작 전----")
      print(char_levels)   
      
      # factor형으로 변환했다. 
      x <- factor(x, 
                  levels = char_levels, 
                  labels = c(1:length(char_levels))) # 이 코드는 labels 숫자로 정의한다. 
     
       # 변환되기 전 factor의 `level`를 확인한다.
      print(levels(x)) 
      print("----변환 종료----")
  } else {
    # 에러 메시지를 출력한다
    print("This is not character!!")
  } 
  return(x)
}

# 전체 데이터에서 character인 데이터를 사용자 정의 함수를 적용하였다. 
data2 <- data %>% 
  mutate_if(is.character, factor2numeric)
## [1] "----변환 시작 전----"
## [1] "3-4 years"         "5 years above"     "Less than 2 years"
## [1] "1" "2" "3"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "10-14 members"       "5-9 members"         "Above 15 members"   
## [4] "Less than 5 members"
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "As founder or employee,  I have startup experience, one time"        
## [2] "As founder or employee, I have startup experiences more than 3 times"
## [3] "As founder or employee, I have startup experiences, two times"       
## [4] "No, I don't have experience"                                         
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "No"  "Yes"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "No"  "Yes"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Female" "Male"  
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Employee"           "Founder of Company"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "30-39"           "40-49"           "50 or above"     "Younger than 30"
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Graduate School"      "High School"          "Undergraduate School"
## [1] "1" "2" "3"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
##  [1] "E-Commerce"                 "Education"                 
##  [3] "Energy"                     "Enterprise Services"       
##  [5] "Fintech"                    "Logistics"                 
##  [7] "Manufacturing"              "Media and Entertainment"   
##  [9] "Medical and Healthcare"     "Online to Offline Commerce"
## [11] "Others"                     "Real Estate and Household" 
## [13] "Transportation/Automotive"  "Travel"                    
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14"
## [1] "----변환 종료----"

(4) 중복치와 결측치 확인

  • 모든 것을 온라인으로 받다보니, 중복치와 결측치가 발생할 수 있다.
  • 따라서 해당 내용이 있는지 확인한다.
sum(duplicated(data2))
## [1] 5
  • 중복치가 5개 인것으로 확인이 된다.
  • 중복치를 제거하는 것은 간단하다.
data3 <- data2 %>% distinct()
  • 이번에는 결측치를 확인한다.
colSums(is.na(data3))
##              EI_1              EI_2              EI_3              EP_1 
##                 0                 0                 0                 0 
##              EP_2              EP_3              ER_1              ER_2 
##                 0                 0                 0                 0 
##              ER_3              SS_1              SS_2              SS_3 
##                 0                 0                 0                 0 
##              SC_1              SC_2              SC_3              SR_1 
##                 0                 0                 0                 0 
##              SR_2              SR_3                F1                F2 
##                 0                 0                 0                 0 
##                F3               NF1               NF2               NF3 
##                 0                 0                 0                 0 
##          Firm_Age         Firm_Size               WE1               WE2 
##                 0                 0                 0                 0 
##               WE3            gender  founder_employee age_of_respondent 
##                 0                 0                 0                 0 
##   Education_Level     Business_Area 
##                 0                 0
  • column마다 결측치를 확인한 결과 모두 0인 것을 확인할 수 있다.

(5) 결과 확인

  • 이제 변환된 결과를 확인한다.
# 결과값을 확인한다. 
data3 %>% 
  head() %>% 
  kable() %>% 
  kable_styling("striped") %>% 
  scroll_box(width = "100%")
EI_1 EI_2 EI_3 EP_1 EP_2 EP_3 ER_1 ER_2 ER_3 SS_1 SS_2 SS_3 SC_1 SC_2 SC_3 SR_1 SR_2 SR_3 F1 F2 F3 NF1 NF2 NF3 Firm_Age Firm_Size WE1 WE2 WE3 gender founder_employee age_of_respondent Education_Level Business_Area
2 3 4 3 3 4 3 2 4 1 1 3 3 3 3 2 2 1 2 2 3 3 1 3 2 3 4 2 2 1 1 1 3 11
5 5 2 3 5 3 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 3 4 4 1 2 2 1 4 3 8
1 2 2 1 1 2 1 2 1 2 2 1 1 2 2 1 2 1 2 1 1 1 1 1 2 4 2 1 2 1 2 4 3 11
3 3 2 1 2 1 2 1 3 2 1 3 1 1 1 2 3 3 3 3 2 3 2 2 3 4 4 2 2 2 1 4 3 11
5 3 5 2 5 4 4 4 4 4 5 4 5 5 5 5 5 5 4 5 4 4 5 5 1 4 2 1 2 2 2 1 3 11
1 3 3 1 3 3 2 3 1 4 1 2 3 3 1 2 2 1 1 2 3 1 3 1 2 2 1 1 1 1 1 4 3 11

파일 내보내기

  • 이제 SmartPLS에서 사용할 수 있도록 csv 파일 형태로 내보낸다.
write_csv(data3, "~/Desktop/thesis_master2.csv")

소결론

  • 데이터 전처리는 중요하다. 그러나, 시간이 조금 걸린다.
  • 설문조사에서 특히 문제가 되는 부분은 문자열 데이터를 수치형 데이터로 변환해주는 문제가 있다.
    • 이를 프로그래밍으로 해결하면 보다 쉽게 접근할 수 있다.
  • 이제 본격적으로 분석을 해보자.

ch 10 - 연구모델 개발과 가설 설정

I. 연구모델 개발과 가설 설정

  • 교재에서는 스마트폰 프로젝트의 연구모델 데이터를 기반으로 작성하였지만, 이번 포스트 이후 부터는 필자의 학위논문 데이터를 기반으로 책 내용과 병행하려고 한다.

(1) 연구모델 개요

  • 학위논문 주제: The Mediating Effect of Entrepreneurial Performance on the Relationship between Entrepre-neurial Orientation and Social Capital: The cases from the Philippines
  • 주요요인은 기업가적지향성, 사회적자본이며, 종속변수는 기업의 성과로 구성되어 있다. png
  • 설문지 공개관련:
    • 설문지 Sample이 필요하신 분들은 2021년 2월 이후에 요청하기를 바란다. (졸업이후)
    • 교재는 스마트폰 프로젝트의 연구 모델이라는 주제로 Sample 설문지 문항에 대한 내용이 있다. (p 127)

(2) 연구모델 개발

  • 연구모델은 아래와 같다. png

ch 09 - PLS-SEM 통계 분석기법(2)

I. PLS-SEM 통계 기초

  • 교재를 참고하여 통계 기초에 대한 간단한 설명을 서술한다.
    • 이는 다른 통계 책에도 있는 내용이기는 하다.
    • 지난 시간에, PLS-SEM의 분포, 유의 수준과 신뢰수준의 관계, 신뢰도와 타당도, 탐색적 요인분석과 확인적 요인분석, 회귀분석에 대해 설명함

(1) 추정과 신뢰구간

  • 추정(estimation)이란 모집단에 대한 어떠한 정보도 없는 상태에서 모집단을 대표할 수 있는 표본 추출하여 표본의 통계량을 구한 다음 이를 이용해서 모집단의 모수 예측
    • 점추정(Point Estimation): 추정하고자 하는 모수를 하나의 수치로 추정
    • 신뢰구간 추정(Confidence Interval Estimation): 추정하고자 하는 모수가 존재하리라고 예상되는 신뢰구간을 정하여 추정하는 방법
      • 신뢰구간에서는 보통 t분포 이용.
  • 신뢰구간의 결정방법은 다음과 같음
    • 첫째, 추출된 표본평균($\bar{x}$)를 구한다.
    • 둘째, 표본평균($\bar{x}$)의 표준편차인 표준오차(standard error)를 산출한다.
    • 셋째, 신뢰수준($1-\alpha$)에 따른 $t$값을 구한다.
    • 마지막으로, 표본평균($\bar{x}$)을 중심으로 표준오차와 $t$값을 곱한 값만큼 좌우($\pm$)로 떨어진 값$\bar{x}\pm t\left (\alpha/2, n-1\right)S/\sqrt{n}$으로 이루어진 구간이 신뢰구간이 됨

(2) SmartPLS에서 PLS 알고리즘

  • PLS Algorithm을 실행 시, 잠재변수 점수는 물론 이를 이용해 측정모델의 외부가중치(outer weights), 외부적재치(outer loadings)와 구조모델의 경로계수(path coefficients), 내생잠재변수의 $R^2$ 등의 추정이 가능함.

(3) 부트스트래핑

  • PLS-SEM은 데이터가 정규분포를 이룬다고 가정하지 않음
  • 무소적 검증을 통해 유의성을 검증하지 않음
  • 대신, 부트스트래핑을 통해 계수의 유의성 검증 진행
    • 비모수적 접근을 통해서 각 계수들에 대한 검증통계량인 t값을 추정.
  • 절차는 원데이터(raw data)로부터 많은 수의 부표본(subsamples)인 부트스트랩 표본을 복원추출하여 반복적인 회귀분석과정을 통해 t값 산출
    • 보통 부트스트랩 표본은 5,000개 필요
  • 예를 들면, 산출된 t값을 이용하여 계수의 유의성을 판단할 수 있음.
    • 5% 유의수준(양측검증)에서 특정 경로계수에 대해 산출된 t값이 $\pm1.96$보다 크면 통계적으로 유의한 차이를 나타낸다고 해석 가능

(4) 외부가중치, 외부적재치 및 경로계수

  • 경로계수(path coefficient)는 $P_{12}, P_{23}$와 같이 표시되며, 이는 표준화된 회귀계수
  • 외부가중치(outer weight)는 잠재변수와 형성적 측정변수 간 표준화 회귀계수 의미
    • ($W_{11},W_{12}$)와 같이 표시됨
  • 외부적재치(outer loading)는 잠재변수와 반영적 측정변수 간 표준화 회귀계수 의미
    • ($L_{35},W_{36}$)와 같이 표시됨
  • 모든 표준화 계수는 -1+1사이의 값을 가짐

(5) 블라인드 폴딩과 예측적 적합성

  • 예측적 적합성(predictive relevance)에 대한 기준으로 $R^2$과 함께 Stone-Geisser의 $Q^2$값을 확인할 필요가 있다.
    • 이 값은 누락거리 D(omission distance)에 의한 블라인드폴딩(Blindfolding) 절차를 통해 얻을 수 있다.
    • 0보다 큰 $Q^2$은 외생잠재변수가 내생잠재변수에 대해 예측적 적합성을 가지고 있음 의미
    • 반대로 0보다 작다면, 예측적 적합성이 부족하다고 봄

(6) 효과크기($f^2$)

  • 효과크기 $f^2$은 외생잠재변수의 내생잠재변수에 대한 $R^2$에 기여하는 정도를 평가하는 척도
  • 효과크기 $f^2$에 대한 평가는 다음과 같다.
    • 0.02: 작은 효과
    • 0.15: 중간 효과
    • 0.35: 큰 효과
  • 효과크기에 대한 수치는 다음과 같다.

$f^{2}=\frac{R_{선택된\ 외생잠재변수\ 포함}^{2}-R_{선택된\ 외생잠재변수\ 제거}^{2}}{1-R_{선택된\ 외생잠재변수\ 포함}^{2}}$

ch 09 - PLS-SEM 통계 분석기법(1)

I. PLS-SEM 통계 기초

  • 교재를 참고하여 통계 기초에 대한 간단한 설명을 서술한다.
    • 이는 다른 통계 책에도 있는 내용이기는 하다.

(1) PLS-SEM의 분포

  • PLS-SEM은 검증 통계량으로 t분포t값을 활용함.
    • t분포는 평균이 0, 표준편차가 1인 종모양의 좌우대칭인 분포
    • 유의수준 확인 지표는 p값을 활용함. (사회과학 분야에서는 유의수준 5% 이내)

(2) 유의수준과 신뢰수준의 관계

  • 유의수준이 $\alpha$ 이면 신뢰수준은 $1−\alpha$ 가 됨.
    • 즉, 신뢰수준은 허용오차수준인 유의수준에 따라 결정됨.

(3) 신뢰도(Reliability)와 타당도(Validity)

  • PLS-SEM은 측정모델과 구조모델을 동시에 분석함.
    • 반영적 측정모델과 형성적 측정모델에 대한 신뢰도와 타당도검증이 이루어져야 함.
    • 측정 모델에 대한 검증 결과 신뢰도와 타당도가 입증되지 않으면 구조모델의 결과도 신뢰할 수 없음

ch 08 - SmartPLS 소프트웨어 소개

I. SmartPLS 설치

  • SmartPLS는 구조방정식모델링을 위한 전용 통계분석 프로그램으로 다양한 학문 분야에서 광범위하게 사용됨.
  • 편이성, 친숙성, 안정성 면에서 매우 우수함.
  • 매우 적은 소표본에서도 활용할 수 있음.
  • 정규분포 등의 엄격한 가정 조건에 구애받지 않고 사용할 수 있음.
  • 프로그램 설치는 아래 링크를 클릭한다.
  • 학생용 버전은 평생 무료이며, 약간의 사용상 제약이 존재한다.

II. SmartPLS 관련 자료

  • 교제 추천

    • 원서 - A Primer on Partial Least Squares Structural Equation Modeling(PLS-SEM) (2013)
    • 번역서 - PLS 구조모델의 이해 (2014)
    • 국내저서 - 석박사학위 및 학술논문 작성 중심의 SmartPLS 3.0 구조방정식모델링 (2018)
  • 온라인 강의도 존재하지만, 무료는 아니다.

ch 07 - 데이터 검토

개요

  • 수집된 데이터에 대해 정규성 검증을 하는 것은 중요하다.
  • 그런데, CB-SEMPLS-SEM의 기준 조건은 조금 상이하다.

정규성 분포 확인

  • Kolmogorov-Smirnov Test 또는 Shapiro-Wilk Test를 통해서 검증한다.
    • 귀무가설: 데이터분포를 정규분포를 이룬다, p-value > 0.05
  • 데이터가 치우쳐 있는 정도를 나타내는 왜도(skewness: S)와 첨도(Kurtosis: K)를 검토한다.
    • 첨도와 왜도가 -1보다 작거나 또는 +1 보다 크지 않으면 변수는 정규분포를 하고 있다고 판단한다.
  • 그러나, 이 부분은 분석 방법에 대해 조금 상이하다.
    • 회귀 분석: 엄밀하게는 2, 관용적으로 3을 사용함. (이일현, 2014)
    • SEM: 왜도가 2 이상이고, 첨도가 7 이상이면 비졍규분포로 봄 (West, Finch & Curran, 1995)

결측치

  • 설문문항에 의도적으로 혹은 부주의로 하나 이상의 문항에 대한 답을 하지 않았을 때 발생함.
  • PLS-SEM에서는 (1) 평균값대체(mean value replacement)와 (2) 사례별 제거 등이 있다.
    • 측정변수(지표변수)별로 5% 미만인 경우에는 평균값 대체를, 5% 초과시에는 사례별 제거방법을 사용한다.
    • 사례별 제거 방법은 권장하지 않는다. 설문지가 많으면 상관이 없지만, 대개의 경우 그렇지 못하기 때문에, 가급적이면 삭제는 권장하지 않는다.
    • 단, 결측치가 사례별로 15%를 초과하는 경우에는 데이터 파일에서 삭제하는 것이 좋다.

이상치

  • 이상치는 특정 설문 혹은 모든 설문에 대한 극단적인 응답값을 말한다.
    • 일반적인 기준으로는 표준화 변량값인 Z값과 표준편차가 $\pm$ 3 이상인 경우는 극단치에 해당한다.
    • 마할라노비스 거리 통계량$D^2$을 이용하여 판단할 수 있음. 만약, $D^2$값이 유의수준 0.01보다 작으면 해당 관측변수는 다변량 이상치로 판단할 수 있다.
    • 이상치는 PLS-SEM을 시행하기 전에 반드시 확인하고 문제가 되는 응답치가 포함되어 있는 경우네느 데이터 파일에서 삭제해야 한다.
    • 가장 일반적인 경우는 이상치가 소수인 경우로 이 때는 해당 이상치를 데이터 파일에서 제거한다.
    • 영향력이 큰 이상치가 있는 경우에는 PLS-SEM에서 OLS 회귀에 영향을 미치기 때문에 면밀한 검토와 평가가 필요하며 조치해야 한다.

다중공선성

  • 측정변수(지표)들 간에 다중공선성(Multicollinearity)가 있는지를 확인한다.
  • 완벽한 공선성(Collinearity)가 나타나는 경우는 거의 없으며 일반적으로 높은 공선성이 나타난다.
  • SmartPLS에서는 분산팽창인자(Variance Inflation Factor: VIF)를 이용하여 평가한다.
    • 모든 측정변수에 대해 VIF값이 임계치인 5보다 작으면 공선성은 존재하지 않는다.
    • VIF값이 5 이상인 경우 잠재적인 공선성 문제(Collinearity Problem)를 지니게 된다.

PLS-SEM vs. CB-SEM

  • PLS-SEMCB-SEM의 차이점은 아래와 같이 서술 할 수 있다.
구분 PLS-SEM CB-SEM
사용목적 예측 이론 검증
표본 수 30-100개 가능 200-800개
데이터 파일 CSV 파일 모든 파일 가능
분포 가정 분포 가정이 없음, 비모수적 기법 엄격한 분포 가정(다변량 정규성이 있어야 함)
모델 복잡성 수백 개의 측정 변수 있어도 가능 측정변수의 수가 100개 미만
잠재변수당 측정변수 의 수 1개 이상 3~4개 이상
반영적 지표 + 형성적 지표 매우 용이(모두 사용) 주로 반영적 지표 사용
반영적 지표 + 형성적 지표 매우 용이(모두 사용) 주로 반영적 지표 사용
모델 적합도 모델 적합도 보고 없음 상세한 모델 적합도 보고 필요
오차항의 고려 모델 구축 시 오차항(측정오차와 구조 오차)를 표시하지 않음 오차항(측정오차와 구조오차)을 모델 구축 시 표시함
재귀모델과 비재귀모델 재귀모델(일방향 인과관계)만 가능 재귀모델과 비재귀모델 가능
잠재변수 산출 잠재변수 점수의 산출 가능, 이 점수를 후속연구에 사용 잠재변수 점수의 직접적인 추정이 불가능
모델 평가 측정모델과 구조모델 동시에 설정하고 평가(동시분석법) 측정모델을 이용해 개별 측정변수와 잠재변수의 신뢰도와 타당도를 분석한 후 구조모델을 통해 가설검증을 시행 (2단계 분석법)

Reference

신건권. (2018). 석박사학위 및 학술논문 작성 중심의 SmartPLS 3.0 구조방정식모델링. 서울: 청람.

ch 06 - 표본의 크기

개요

  • PLS-SEM작은 표본 크기에 의해 식별 문제가 발생하지 않으며 모델이 복잡하고 표본크기가 작은 상황에서도 높은 수준의 통게적 검증력을 가짐

  • 일반적으로 CB-SEM의 경우 표본 크기가 200개 이상이 필요한 것으로 알려짐

  • 반대로 PLS-SEM30-100개 정도의 소표본인 경우에도 적용할 수 있다.

    • 표본크기를 증가시키면 모델 추정의 정확성이 높아지나 표본이 250개 이상이 넘어가면 CB-SEM과 차이점이 없어진다.

최소 표본 크기

Chin(1988)Barclay, Higgins & Thompson(1995)는 최소표본크기 결정에 있어서 10배수 규칙(10 times rule)을 제안함.

  • 단일 잠재변수(구성개념)을 측정하는 데 사용된 형성적 지표 최대수의 10보다 커야 함
  • 구조모델에서 특정 잠재변수(구성개념)로 향하는 경로 최대수의 10배 보다 커야 함
  • 이러한 10배수 규칙에 의하면 PLS-SEM을 사용하는 데 있어서 최소한의 표본크기는 형성적 측정 모델과 반영적 측정모델이 모두 구조모델 속에 포함되어 있는 경우에는 두 기준 모두 적용해 판단한다.

ch 05 - 측정척도의 유형과 내용

개요

  • 데이터의 유형에는 크게 4가지가 있다.
    • 명목척도, 서열척도, 등간척도, 비율척도
  • 그중에서 PLS-SEM 분석 시에 필요한 척도는 등간척도와 비율척도이다.
    • 간혹, 범주형 변수의 경우 더미변수(Dummy Variable)로 변환하여 투입하기도 한다.

데이터의 유형

(1) 명목척도

  • 범주형 데이터로 측정된 측정대상으로 단순히 범주로 분류하기 위한 목적으로 숫자를 부여한 척도
    • 예시: 성별, 종교, 직업, 혈액형, 만족여부(예/아니오)

(2) 서열척도

  • 범주형 데이터로 명목척도의 기능뿐 아니라 각 범주 간의 대소관계, 순위(서열성)에 관하여 숫자를 부여한 척도(수학적 가감승제 계산 안 됨)
    • 예시: 학력, 건강상태 등

(3) 등간척도

  • 연속형 데이터로 절대적 영점(Absolute Zero)이 없으며 대상이 갖는 양적인 정도의 차이에 따라 등간격으로 숫자를 부여한 척도(수학적 가감승제 계산 가능)
    • 예시: 온도, 만족도(리커트척도), 충성도(리커트척도), 물가지수, 생산지수 등

(4) 비율척도

  • 연속형 데이터로 절대적 영점이 존재하며, 비율계산이 가능한 숫자를 부여한 척도(수학적 가감승제 계산 가능)
    • 매출액, 무게, 가격, 소득, 길이, 부피 등

통계기법의 선택

  • 변수의 성격에 따라 다른 통계기법이 선택될 수 있다.

(1) 범주형(종속변수) + 범주형 변수(독립변수)

  • 교차분석(카이제곱검증)

(2) 범주형(종속변수) + 연속형 변수(독립변수)

  • 판별분석, 군집분석, 로지스틱회귀분석

(3) 연속형(종속변수) + 범주형 변수(독립변수)

  • t-검증, 분산분석, 다변량분산분석

(4) 연속형(종속변수) + 연속형 변수(독립변수)

  • 상관분석, 회귀분석, 경로분석/구조방정식모델링분석

Reference

신건권. (2018). 석박사학위 및 학술논문 작성 중심의 SmartPLS 3.0 구조방정식모델링. 서울: 청람.