1. Read and set up Data Loyalty for SEM

# Read Data directly
t = "E:/NGHIEN CUU SINH/NCS - PHUONG ANH/Part 2-Satisfaction and Loyalty/So lieu/So lieu - PA xu ly-for SEM/SEM-LATS/854-SEM-LATS.csv"
SEM = read.csv(t, header = T, sep = ";")
head(SEM)
##   ID AGE CITY FRE TripPurpose Departure TimeUseonBus TravelTime PSW1 PSW2 PSW3
## 1  3   1    2   1           2         0            4       3.00    4    5    6
## 2  4   1    2   2           4         0            4       2.00    2    5    3
## 3  5   1    2   1           2         1            4       0.17    4    6    6
## 4  6   1    2   1           2         1            1       4.00    5    5    5
## 5  7   1    2   1           2         1            4       2.00    3    2    4
## 6  8   1    2   1           2         1            6       2.00    2    5    6
##   PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1 PSB2 PSB3 PSB4
## 1    4    6    4    5    6    6    6    6    4    6    4    6    6    4    6
## 2    2    4    5    3    2    3    4    2    2    2    2    3    3    4    4
## 3    4    1    4    2    2    6    6    4    2    2    2    2    6    6    4
## 4    2    6    4    2    6    6    4    1    4    4    6    5    6    6    5
## 5    4    2    6    5    3    3    5    2    1    2    2    2    2    5    5
## 6    5    4    4    6    3    4    6    2    1    1    2    2    5    4    4
##   PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQR5 PQP1 PQP2
## 1    5    6    6    6    6    6    4    4    6    4    4    4    6    6    6
## 2    6    6    6    6    4    6    5    4    4    5    6    4    6    6    4
## 3    6    6    4    2    2    2    2    2    2    4    1    2    1    1    1
## 4    5    6    7    6    6    5    4    5    5    5    5    4    4    5    5
## 5    5    6    4    3    6    3    6    3    6    6    4    3    6    4    4
## 6    4    6    4    2    4    4    5    4    5    5    4    3    3    4    4
##   PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQC5 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4 LOY5
## 1    5    6    4    4    6    4    2    6    6    6    4    6    5    7    6
## 2    4    5    4    3    4    3    6    5    5    4    4    5    4    4    4
## 3    6    6    2    6    2    5    2    2    2    2    2    6    6    4    4
## 4    5    5    4    5    5    5    5    5    5    5    5    5    5    5    5
## 5    4    5    5    3    5    3    5    4    4    4    4    5    5    4    4
## 6    4    5    3    3    3    3    4    4    5    5    4    3    2    5    5
##   LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3
## 1    6    6    6    6    6    4    6    6    7    6    7    7    4    4    4
## 2    4    5    4    5    6    5    4    3    4    3    4    6    5    6    6
## 3    2    2    4    2    5    2    2    5    2    6    6    6    6    5    6
## 4    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
## 5    4    6    5    4    5    4    5    5    6    6    6    5    6    6    6
## 6    6    6    4    3    2    2    4    4    6    7    6    4    7    7    5
##   PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 SIM1 SIM2 SIM3 SIM4
## 1    4    3    5    6    4    2    4    6    6    6    6    4    4    4    2
## 2    4    3    5    4    4    4    4    5    4    4    4    4    4    4    4
## 3    6    2    6    4    2    2    4    2    4    2    2    4    4    4    2
## 4    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
## 5    6    3    4    2    2    5    4    3    2    3    4    6    6    5    5
## 6    2    1    4    5    2    1    4    2    5    2    2    2    2    2    2
##   PPA1 PPA2 PPA3 PPA4 SBE1 SBE2 SBE3 SBE4 EXB1 EXB2 EXB3 PVA1 PVA2 PVA3 EC_Stop
## 1    4    6    4    4    4    4    4    4    4    4    3    6    6    6       0
## 2    4    4    4    4    5    4    5    5    4    5    3    5    5    3       0
## 3    4    6    6    2    6    6    6    6    4    6    2    6    2    4       0
## 4    5    5    5    5    5    5    5    5    5    5    5    5    5    5       0
## 5    5    5    5    5    5    5    5    5    5    5    4    6    2    3       0
## 6    2    3    3    2    2    2    2    2    5    5    4    6    5    5       0
##   WC_Stop EC_Bus WC_Bus Gender MarriedStatus Occupation Education Income
## 1       1      0      1      0             1          1         2      1
## 2       0      1      0      0             1          1         2      1
## 3       0      0      0      1             1          1         2      1
## 4       1      0      1      1             1          1         2      1
## 5       1      0      1      1             1          1         2      1
## 6       1      0      1      0             1          1         3      1
names(SEM)
##   [1] "ID"            "AGE"           "CITY"          "FRE"          
##   [5] "TripPurpose"   "Departure"     "TimeUseonBus"  "TravelTime"   
##   [9] "PSW1"          "PSW2"          "PSW3"          "PSW4"         
##  [13] "PSW5"          "PSW6"          "PSW7"          "PSS1"         
##  [17] "PSS2"          "PSS3"          "PSS4"          "PSS5"         
##  [21] "PSS6"          "PSS7"          "PSB1"          "PSB2"         
##  [25] "PSB3"          "PSB4"          "PSB5"          "PSB6"         
##  [29] "PSB7"          "PSB8"          "PQT1"          "PQT2"         
##  [33] "PQT3"          "PQT4"          "PQC1"          "PQC2"         
##  [37] "PQC3"          "PQC4"          "PQR5"          "PQP1"         
##  [41] "PQP2"          "PQP3"          "PQP4"          "PQR1"         
##  [45] "PQR2"          "PQR3"          "PQR4"          "PQC5"         
##  [49] "SAT1"          "SAT2"          "SAT3"          "LOY1"         
##  [53] "LOY2"          "LOY3"          "LOY4"          "LOY5"         
##  [57] "LOY6"          "LOY7"          "IMA1"          "IMA2"         
##  [61] "IMA3"          "IMA4"          "IMA5"          "PHB1"         
##  [65] "PHB2"          "PHB3"          "PHB4"          "PHB5"         
##  [69] "PEB1"          "PEB2"          "PEB3"          "PEB4"         
##  [73] "PDE1"          "PDE2"          "PDE3"          "PDE4"         
##  [77] "PDE5"          "PDE6"          "PDE7"          "PSO1"         
##  [81] "PSO2"          "PSO3"          "SIM1"          "SIM2"         
##  [85] "SIM3"          "SIM4"          "PPA1"          "PPA2"         
##  [89] "PPA3"          "PPA4"          "SBE1"          "SBE2"         
##  [93] "SBE3"          "SBE4"          "EXB1"          "EXB2"         
##  [97] "EXB3"          "PVA1"          "PVA2"          "PVA3"         
## [101] "EC_Stop"       "WC_Stop"       "EC_Bus"        "WC_Bus"       
## [105] "Gender"        "MarriedStatus" "Occupation"    "Education"    
## [109] "Income"
dim(SEM)
## [1] 854 109

2. Desscriptive statistic

# 2.1. Subset Data SEM (6 constructs and 28 items)
SEM <- SEM[, c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,  13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109)]
head(SEM)
##   AGE CITY FRE TripPurpose Departure TimeUseonBus TravelTime PSW1 PSW2 PSW3
## 1   1    2   1           2         0            4       3.00    4    5    6
## 2   1    2   2           4         0            4       2.00    2    5    3
## 3   1    2   1           2         1            4       0.17    4    6    6
## 4   1    2   1           2         1            1       4.00    5    5    5
## 5   1    2   1           2         1            4       2.00    3    2    4
## 6   1    2   1           2         1            6       2.00    2    5    6
##   PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1 PSB2 PSB3 PSB4
## 1    4    6    4    5    6    6    6    6    4    6    4    6    6    4    6
## 2    2    4    5    3    2    3    4    2    2    2    2    3    3    4    4
## 3    4    1    4    2    2    6    6    4    2    2    2    2    6    6    4
## 4    2    6    4    2    6    6    4    1    4    4    6    5    6    6    5
## 5    4    2    6    5    3    3    5    2    1    2    2    2    2    5    5
## 6    5    4    4    6    3    4    6    2    1    1    2    2    5    4    4
##   PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQR5 PQP1 PQP2
## 1    5    6    6    6    6    6    4    4    6    4    4    4    6    6    6
## 2    6    6    6    6    4    6    5    4    4    5    6    4    6    6    4
## 3    6    6    4    2    2    2    2    2    2    4    1    2    1    1    1
## 4    5    6    7    6    6    5    4    5    5    5    5    4    4    5    5
## 5    5    6    4    3    6    3    6    3    6    6    4    3    6    4    4
## 6    4    6    4    2    4    4    5    4    5    5    4    3    3    4    4
##   PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQC5 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4 LOY5
## 1    5    6    4    4    6    4    2    6    6    6    4    6    5    7    6
## 2    4    5    4    3    4    3    6    5    5    4    4    5    4    4    4
## 3    6    6    2    6    2    5    2    2    2    2    2    6    6    4    4
## 4    5    5    4    5    5    5    5    5    5    5    5    5    5    5    5
## 5    4    5    5    3    5    3    5    4    4    4    4    5    5    4    4
## 6    4    5    3    3    3    3    4    4    5    5    4    3    2    5    5
##   LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3
## 1    6    6    6    6    6    4    6    6    7    6    7    7    4    4    4
## 2    4    5    4    5    6    5    4    3    4    3    4    6    5    6    6
## 3    2    2    4    2    5    2    2    5    2    6    6    6    6    5    6
## 4    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
## 5    4    6    5    4    5    4    5    5    6    6    6    5    6    6    6
## 6    6    6    4    3    2    2    4    4    6    7    6    4    7    7    5
##   PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 PVA1 PVA2 PVA3 EC_Stop
## 1    4    3    5    6    4    2    4    6    6    6    6    6    6    6       0
## 2    4    3    5    4    4    4    4    5    4    4    4    5    5    3       0
## 3    6    2    6    4    2    2    4    2    4    2    2    6    2    4       0
## 4    5    5    5    5    5    5    5    5    5    5    5    5    5    5       0
## 5    6    3    4    2    2    5    4    3    2    3    4    6    2    3       0
## 6    2    1    4    5    2    1    4    2    5    2    2    6    5    5       0
##   WC_Stop EC_Bus WC_Bus Gender MarriedStatus Occupation Education Income
## 1       1      0      1      0             1          1         2      1
## 2       0      1      0      0             1          1         2      1
## 3       0      0      0      1             1          1         2      1
## 4       1      0      1      1             1          1         2      1
## 5       1      0      1      1             1          1         2      1
## 6       1      0      1      0             1          1         3      1
names(SEM)
##  [1] "AGE"           "CITY"          "FRE"           "TripPurpose"  
##  [5] "Departure"     "TimeUseonBus"  "TravelTime"    "PSW1"         
##  [9] "PSW2"          "PSW3"          "PSW4"          "PSW5"         
## [13] "PSW6"          "PSW7"          "PSS1"          "PSS2"         
## [17] "PSS3"          "PSS4"          "PSS5"          "PSS6"         
## [21] "PSS7"          "PSB1"          "PSB2"          "PSB3"         
## [25] "PSB4"          "PSB5"          "PSB6"          "PSB7"         
## [29] "PSB8"          "PQT1"          "PQT2"          "PQT3"         
## [33] "PQT4"          "PQC1"          "PQC2"          "PQC3"         
## [37] "PQC4"          "PQR5"          "PQP1"          "PQP2"         
## [41] "PQP3"          "PQP4"          "PQR1"          "PQR2"         
## [45] "PQR3"          "PQR4"          "PQC5"          "SAT1"         
## [49] "SAT2"          "SAT3"          "LOY1"          "LOY2"         
## [53] "LOY3"          "LOY4"          "LOY5"          "LOY6"         
## [57] "LOY7"          "IMA1"          "IMA2"          "IMA3"         
## [61] "IMA4"          "IMA5"          "PHB1"          "PHB2"         
## [65] "PHB3"          "PHB4"          "PHB5"          "PEB1"         
## [69] "PEB2"          "PEB3"          "PEB4"          "PDE1"         
## [73] "PDE2"          "PDE3"          "PDE4"          "PDE5"         
## [77] "PDE6"          "PDE7"          "PSO1"          "PSO2"         
## [81] "PSO3"          "PVA1"          "PVA2"          "PVA3"         
## [85] "EC_Stop"       "WC_Stop"       "EC_Bus"        "WC_Bus"       
## [89] "Gender"        "MarriedStatus" "Occupation"    "Education"    
## [93] "Income"
dim(SEM)
## [1] 854  93
# Data coding
str(SEM)
## 'data.frame':    854 obs. of  93 variables:
##  $ AGE          : int  1 1 1 1 1 1 1 4 1 1 ...
##  $ CITY         : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : int  1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : int  2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : int  0 0 1 1 1 1 1 1 1 1 ...
##  $ TimeUseonBus : int  4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ PSW1         : int  4 2 4 5 3 2 1 2 3 4 ...
##  $ PSW2         : int  5 5 6 5 2 5 1 6 4 4 ...
##  $ PSW3         : int  6 3 6 5 4 6 3 6 4 7 ...
##  $ PSW4         : int  4 2 4 2 4 5 1 3 2 4 ...
##  $ PSW5         : int  6 4 1 6 2 4 5 2 3 7 ...
##  $ PSW6         : int  4 5 4 4 6 4 6 2 5 4 ...
##  $ PSW7         : int  5 3 2 2 5 6 4 6 3 7 ...
##  $ PSS1         : int  6 2 2 6 3 3 1 6 2 1 ...
##  $ PSS2         : int  6 3 6 6 3 4 1 6 3 4 ...
##  $ PSS3         : int  6 4 6 4 5 6 5 6 4 7 ...
##  $ PSS4         : int  6 2 4 1 2 2 1 3 3 7 ...
##  $ PSS5         : int  4 2 2 4 1 1 5 1 2 1 ...
##  $ PSS6         : int  6 2 2 4 2 1 1 1 2 1 ...
##  $ PSS7         : int  4 2 2 6 2 2 3 5 3 1 ...
##  $ PSB1         : int  6 3 2 5 2 2 1 6 2 4 ...
##  $ PSB2         : int  6 3 6 6 2 5 1 6 4 4 ...
##  $ PSB3         : int  4 4 6 6 5 4 5 6 4 7 ...
##  $ PSB4         : int  6 4 4 5 5 4 1 6 4 4 ...
##  $ PSB5         : int  5 6 6 5 5 4 5 1 7 7 ...
##  $ PSB6         : int  6 6 6 6 6 6 6 6 6 7 ...
##  $ PSB7         : int  6 6 4 7 4 4 6 6 6 7 ...
##  $ PSB8         : int  6 6 2 6 3 2 6 5 6 7 ...
##  $ PQT1         : int  6 4 2 6 6 4 2 5 5 7 ...
##  $ PQT2         : int  6 6 2 5 3 4 5 6 4 7 ...
##  $ PQT3         : int  4 5 2 4 6 5 5 4 5 7 ...
##  $ PQT4         : int  4 4 2 5 3 4 2 4 3 7 ...
##  $ PQC1         : int  6 4 2 5 6 5 2 6 3 7 ...
##  $ PQC2         : int  4 5 4 5 6 5 2 6 4 7 ...
##  $ PQC3         : int  4 6 1 5 4 4 2 3 4 7 ...
##  $ PQC4         : int  4 4 2 4 3 3 2 4 4 4 ...
##  $ PQR5         : int  6 6 1 4 6 3 2 3 3 4 ...
##  $ PQP1         : int  6 6 1 5 4 4 4 4 3 4 ...
##  $ PQP2         : int  6 4 1 5 4 4 4 4 4 4 ...
##  $ PQP3         : int  5 4 6 5 4 4 3 4 5 7 ...
##  $ PQP4         : int  6 5 6 5 5 5 4 4 6 7 ...
##  $ PQR1         : int  4 4 2 4 5 3 2 5 3 4 ...
##  $ PQR2         : int  4 3 6 5 3 3 1 3 4 7 ...
##  $ PQR3         : int  6 4 2 5 5 3 1 3 5 4 ...
##  $ PQR4         : int  4 3 5 5 3 3 2 2 4 7 ...
##  $ PQC5         : int  2 6 2 5 5 4 4 6 4 7 ...
##  $ SAT1         : int  6 5 2 5 4 4 2 7 5 7 ...
##  $ SAT2         : int  6 5 2 5 4 5 2 7 6 7 ...
##  $ SAT3         : int  6 4 2 5 4 5 3 6 4 7 ...
##  $ LOY1         : int  4 4 2 5 4 4 2 6 6 6 ...
##  $ LOY2         : int  6 5 6 5 5 3 1 6 5 6 ...
##  $ LOY3         : int  5 4 6 5 5 2 1 6 6 6 ...
##  $ LOY4         : int  7 4 4 5 4 5 2 7 5 6 ...
##  $ LOY5         : int  6 4 4 5 4 5 2 7 5 4 ...
##  $ LOY6         : int  6 4 2 5 4 6 1 7 5 6 ...
##  $ LOY7         : int  6 5 2 5 6 6 2 7 5 7 ...
##  $ IMA1         : int  6 4 4 5 5 4 2 6 5 6 ...
##  $ IMA2         : int  6 5 2 5 4 3 3 6 6 7 ...
##  $ IMA3         : int  6 6 5 5 5 2 2 5 6 7 ...
##  $ IMA4         : int  4 5 2 5 4 2 2 6 6 7 ...
##  $ IMA5         : int  6 4 2 5 5 4 2 6 6 7 ...
##  $ PHB1         : int  6 3 5 5 5 4 3 6 6 7 ...
##  $ PHB2         : int  7 4 2 5 6 6 3 7 5 7 ...
##  $ PHB3         : int  6 3 6 5 6 7 1 4 3 7 ...
##  $ PHB4         : int  7 4 6 5 6 6 4 6 7 7 ...
##  $ PHB5         : int  7 6 6 5 5 4 4 6 7 7 ...
##  $ PEB1         : int  4 5 6 5 6 7 4 6 7 7 ...
##  $ PEB2         : int  4 6 5 5 6 7 2 7 7 7 ...
##  $ PEB3         : int  4 6 6 5 6 5 2 6 6 7 ...
##  $ PEB4         : int  4 4 6 5 6 2 2 6 6 7 ...
##  $ PDE1         : int  3 3 2 5 3 1 4 4 5 4 ...
##  $ PDE2         : int  5 5 6 5 4 4 4 4 5 5 ...
##  $ PDE3         : int  6 4 4 5 2 5 2 4 4 4 ...
##  $ PDE4         : int  4 4 2 5 2 2 2 3 4 4 ...
##  $ PDE5         : int  2 4 2 5 5 1 2 5 4 6 ...
##  $ PDE6         : int  4 4 4 5 4 4 2 4 4 4 ...
##  $ PDE7         : int  6 5 2 5 3 2 1 4 3 4 ...
##  $ PSO1         : int  6 4 4 5 2 5 2 6 1 2 ...
##  $ PSO2         : int  6 4 2 5 3 2 1 6 1 4 ...
##  $ PSO3         : int  6 4 2 5 4 2 1 6 4 4 ...
##  $ PVA1         : int  6 5 6 5 6 6 6 6 6 6 ...
##  $ PVA2         : int  6 5 2 5 2 5 4 5 4 6 ...
##  $ PVA3         : int  6 3 4 5 3 5 5 6 5 6 ...
##  $ EC_Stop      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ WC_Stop      : int  1 0 0 1 1 1 0 0 1 0 ...
##  $ EC_Bus       : int  0 1 0 0 0 0 0 0 0 0 ...
##  $ WC_Bus       : int  1 0 0 1 1 1 0 0 1 0 ...
##  $ Gender       : int  0 0 1 1 1 0 0 0 0 0 ...
##  $ MarriedStatus: int  1 1 1 1 1 1 1 0 1 1 ...
##  $ Occupation   : int  1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : int  2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : int  1 1 1 1 1 1 1 1 1 1 ...
attach(SEM)
SEM = within(SEM, {
  AGE = factor(AGE, labels = c("16-25", "26-35", "36-45", "46-55", ">55"))
  CITY = factor(CITY,labels = c("DaNang", "HoChiMinh"))
  FRE = factor(FRE, labels = c(">=3 days/week", "2days/month-2days/week", "2days/year-1day/month", "<2 days/year"))
  TripPurpose = factor(TripPurpose, labels = c("Working", "Studying", "Shopping", "Entertaining", "Others"))
  Departure = factor(Departure, labels = c("Normal", "Peak-Hour"))
  TimeUseonBus = factor(TimeUseonBus, labels = c("Using.telephone", "Reading", "Listening", "Nothing", "Talking", "Others"))
  EC_Stop = factor(EC_Stop, labels = c("Never", "Ever"))
  WC_Stop = factor(WC_Stop, labels = c("Never", "Ever"))
  EC_Bus = factor(EC_Bus, labels = c("Never", "Ever"))
  WC_Bus = factor(WC_Bus, labels = c("Never", "Ever"))
  Gender = factor(Gender, labels = c("Female", "Male"))
  MarriedStatus = factor(MarriedStatus, labels = c("Married", "Single"))
  Occupation = factor(Occupation, labels = c("Students/Pupils", "Full.time.job", "Part.time.job", "Retirement", "No.job", "Housewife", "Others"))
  Education = factor(Education, labels = c("Secondary.school", "Undergraduate", "High.school", "Postgraduate", "Others"))
  Income = factor(Income, labels = c("<5millions", "5-10millions", "10-15millions", ">15millions"))
    } )
str(SEM)
## 'data.frame':    854 obs. of  93 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ PSW1         : int  4 2 4 5 3 2 1 2 3 4 ...
##  $ PSW2         : int  5 5 6 5 2 5 1 6 4 4 ...
##  $ PSW3         : int  6 3 6 5 4 6 3 6 4 7 ...
##  $ PSW4         : int  4 2 4 2 4 5 1 3 2 4 ...
##  $ PSW5         : int  6 4 1 6 2 4 5 2 3 7 ...
##  $ PSW6         : int  4 5 4 4 6 4 6 2 5 4 ...
##  $ PSW7         : int  5 3 2 2 5 6 4 6 3 7 ...
##  $ PSS1         : int  6 2 2 6 3 3 1 6 2 1 ...
##  $ PSS2         : int  6 3 6 6 3 4 1 6 3 4 ...
##  $ PSS3         : int  6 4 6 4 5 6 5 6 4 7 ...
##  $ PSS4         : int  6 2 4 1 2 2 1 3 3 7 ...
##  $ PSS5         : int  4 2 2 4 1 1 5 1 2 1 ...
##  $ PSS6         : int  6 2 2 4 2 1 1 1 2 1 ...
##  $ PSS7         : int  4 2 2 6 2 2 3 5 3 1 ...
##  $ PSB1         : int  6 3 2 5 2 2 1 6 2 4 ...
##  $ PSB2         : int  6 3 6 6 2 5 1 6 4 4 ...
##  $ PSB3         : int  4 4 6 6 5 4 5 6 4 7 ...
##  $ PSB4         : int  6 4 4 5 5 4 1 6 4 4 ...
##  $ PSB5         : int  5 6 6 5 5 4 5 1 7 7 ...
##  $ PSB6         : int  6 6 6 6 6 6 6 6 6 7 ...
##  $ PSB7         : int  6 6 4 7 4 4 6 6 6 7 ...
##  $ PSB8         : int  6 6 2 6 3 2 6 5 6 7 ...
##  $ PQT1         : int  6 4 2 6 6 4 2 5 5 7 ...
##  $ PQT2         : int  6 6 2 5 3 4 5 6 4 7 ...
##  $ PQT3         : int  4 5 2 4 6 5 5 4 5 7 ...
##  $ PQT4         : int  4 4 2 5 3 4 2 4 3 7 ...
##  $ PQC1         : int  6 4 2 5 6 5 2 6 3 7 ...
##  $ PQC2         : int  4 5 4 5 6 5 2 6 4 7 ...
##  $ PQC3         : int  4 6 1 5 4 4 2 3 4 7 ...
##  $ PQC4         : int  4 4 2 4 3 3 2 4 4 4 ...
##  $ PQR5         : int  6 6 1 4 6 3 2 3 3 4 ...
##  $ PQP1         : int  6 6 1 5 4 4 4 4 3 4 ...
##  $ PQP2         : int  6 4 1 5 4 4 4 4 4 4 ...
##  $ PQP3         : int  5 4 6 5 4 4 3 4 5 7 ...
##  $ PQP4         : int  6 5 6 5 5 5 4 4 6 7 ...
##  $ PQR1         : int  4 4 2 4 5 3 2 5 3 4 ...
##  $ PQR2         : int  4 3 6 5 3 3 1 3 4 7 ...
##  $ PQR3         : int  6 4 2 5 5 3 1 3 5 4 ...
##  $ PQR4         : int  4 3 5 5 3 3 2 2 4 7 ...
##  $ PQC5         : int  2 6 2 5 5 4 4 6 4 7 ...
##  $ SAT1         : int  6 5 2 5 4 4 2 7 5 7 ...
##  $ SAT2         : int  6 5 2 5 4 5 2 7 6 7 ...
##  $ SAT3         : int  6 4 2 5 4 5 3 6 4 7 ...
##  $ LOY1         : int  4 4 2 5 4 4 2 6 6 6 ...
##  $ LOY2         : int  6 5 6 5 5 3 1 6 5 6 ...
##  $ LOY3         : int  5 4 6 5 5 2 1 6 6 6 ...
##  $ LOY4         : int  7 4 4 5 4 5 2 7 5 6 ...
##  $ LOY5         : int  6 4 4 5 4 5 2 7 5 4 ...
##  $ LOY6         : int  6 4 2 5 4 6 1 7 5 6 ...
##  $ LOY7         : int  6 5 2 5 6 6 2 7 5 7 ...
##  $ IMA1         : int  6 4 4 5 5 4 2 6 5 6 ...
##  $ IMA2         : int  6 5 2 5 4 3 3 6 6 7 ...
##  $ IMA3         : int  6 6 5 5 5 2 2 5 6 7 ...
##  $ IMA4         : int  4 5 2 5 4 2 2 6 6 7 ...
##  $ IMA5         : int  6 4 2 5 5 4 2 6 6 7 ...
##  $ PHB1         : int  6 3 5 5 5 4 3 6 6 7 ...
##  $ PHB2         : int  7 4 2 5 6 6 3 7 5 7 ...
##  $ PHB3         : int  6 3 6 5 6 7 1 4 3 7 ...
##  $ PHB4         : int  7 4 6 5 6 6 4 6 7 7 ...
##  $ PHB5         : int  7 6 6 5 5 4 4 6 7 7 ...
##  $ PEB1         : int  4 5 6 5 6 7 4 6 7 7 ...
##  $ PEB2         : int  4 6 5 5 6 7 2 7 7 7 ...
##  $ PEB3         : int  4 6 6 5 6 5 2 6 6 7 ...
##  $ PEB4         : int  4 4 6 5 6 2 2 6 6 7 ...
##  $ PDE1         : int  3 3 2 5 3 1 4 4 5 4 ...
##  $ PDE2         : int  5 5 6 5 4 4 4 4 5 5 ...
##  $ PDE3         : int  6 4 4 5 2 5 2 4 4 4 ...
##  $ PDE4         : int  4 4 2 5 2 2 2 3 4 4 ...
##  $ PDE5         : int  2 4 2 5 5 1 2 5 4 6 ...
##  $ PDE6         : int  4 4 4 5 4 4 2 4 4 4 ...
##  $ PDE7         : int  6 5 2 5 3 2 1 4 3 4 ...
##  $ PSO1         : int  6 4 4 5 2 5 2 6 1 2 ...
##  $ PSO2         : int  6 4 2 5 3 2 1 6 1 4 ...
##  $ PSO3         : int  6 4 2 5 4 2 1 6 4 4 ...
##  $ PVA1         : int  6 5 6 5 6 6 6 6 6 6 ...
##  $ PVA2         : int  6 5 2 5 2 5 4 5 4 6 ...
##  $ PVA3         : int  6 3 4 5 3 5 5 6 5 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
dim(SEM)
## [1] 854  93
# 2.2. Descritive Table
library(tableone)
require(tableone)
library(magrittr)
summary(SEM)
##     AGE             CITY                         FRE            TripPurpose 
##  16-25:414   DaNang   :406   >=3 days/week         :497   Working     :304  
##  26-35:168   HoChiMinh:448   2days/month-2days/week:162   Studying    :294  
##  36-45:100                   2days/year-1day/month : 96   Shopping    : 58  
##  46-55: 78                   <2 days/year          : 99   Entertaining: 95  
##  >55  : 94                                                Others      :103  
##                                                                             
##                                                                             
##      Departure            TimeUseonBus   TravelTime          PSW1      
##  Normal   :215   Using.telephone:197   Min.   : 0.000   Min.   :1.000  
##  Peak-Hour:639   Reading        : 53   1st Qu.: 0.500   1st Qu.:4.000  
##                  Listening      :136   Median : 1.000   Median :5.000  
##                  Nothing        :416   Mean   : 1.276   Mean   :4.763  
##                  Talking        : 33   3rd Qu.: 2.000   3rd Qu.:6.000  
##                  Others         : 19   Max.   :20.000   Max.   :7.000  
##                                                                        
##       PSW2            PSW3            PSW4            PSW5      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:5.000   1st Qu.:3.000   1st Qu.:4.000  
##  Median :6.000   Median :6.000   Median :5.000   Median :5.000  
##  Mean   :4.968   Mean   :5.371   Mean   :4.241   Mean   :4.835  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PSW6            PSW7            PSS1            PSS2      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:2.000   1st Qu.:5.000   1st Qu.:3.000   1st Qu.:4.000  
##  Median :4.000   Median :6.000   Median :5.000   Median :6.000  
##  Mean   :3.907   Mean   :5.149   Mean   :4.493   Mean   :4.941  
##  3rd Qu.:5.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PSS3            PSS4            PSS5            PSS6      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:2.000  
##  Median :6.000   Median :4.000   Median :4.000   Median :4.000  
##  Mean   :5.334   Mean   :4.205   Mean   :3.765   Mean   :3.636  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:5.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PSS7            PSB1            PSB2           PSB3            PSB4      
##  Min.   :1.000   Min.   :1.000   Min.   :1.00   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:3.000   1st Qu.:4.00   1st Qu.:5.000   1st Qu.:4.000  
##  Median :5.000   Median :5.000   Median :6.00   Median :6.000   Median :5.000  
##  Mean   :4.869   Mean   :4.643   Mean   :5.08   Mean   :5.502   Mean   :4.816  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.00   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.00   Max.   :7.000   Max.   :7.000  
##                                                                                
##       PSB5            PSB6            PSB7            PSB8      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:6.000   1st Qu.:6.000   1st Qu.:5.000  
##  Median :6.000   Median :6.000   Median :6.000   Median :6.000  
##  Mean   :5.566   Mean   :5.982   Mean   :5.813   Mean   :5.694  
##  3rd Qu.:6.000   3rd Qu.:7.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PQT1            PQT2            PQT3            PQT4      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000  
##  Median :6.000   Median :6.000   Median :6.000   Median :6.000  
##  Mean   :5.354   Mean   :5.392   Mean   :5.206   Mean   :5.184  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PQC1            PQC2           PQC3            PQC4           PQR5      
##  Min.   :1.000   Min.   :1.00   Min.   :1.000   Min.   :1.00   Min.   :1.000  
##  1st Qu.:4.250   1st Qu.:5.00   1st Qu.:4.000   1st Qu.:4.00   1st Qu.:4.000  
##  Median :6.000   Median :6.00   Median :6.000   Median :5.00   Median :5.000  
##  Mean   :5.142   Mean   :5.58   Mean   :5.123   Mean   :4.77   Mean   :5.033  
##  3rd Qu.:6.000   3rd Qu.:6.00   3rd Qu.:6.000   3rd Qu.:6.00   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.00   Max.   :7.000   Max.   :7.00   Max.   :7.000  
##                                                                               
##       PQP1            PQP2            PQP3            PQP4      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000  
##  Median :6.000   Median :6.000   Median :6.000   Median :6.000  
##  Mean   :5.324   Mean   :5.313   Mean   :5.383   Mean   :5.556  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PQR1            PQR2            PQR3           PQR4            PQC5      
##  Min.   :1.000   Min.   :1.000   Min.   :1.00   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:5.000   1st Qu.:4.00   1st Qu.:4.000   1st Qu.:5.000  
##  Median :5.000   Median :6.000   Median :5.00   Median :5.000   Median :6.000  
##  Mean   :4.953   Mean   :5.233   Mean   :5.02   Mean   :4.852   Mean   :5.535  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.00   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.00   Max.   :7.000   Max.   :7.000  
##                                                                                
##       SAT1            SAT2            SAT3            LOY1      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000  
##  Median :6.000   Median :6.000   Median :6.000   Median :6.000  
##  Mean   :5.341   Mean   :5.508   Mean   :5.502   Mean   :5.495  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       LOY2            LOY3            LOY4            LOY5      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000  
##  Median :6.000   Median :6.000   Median :6.000   Median :6.000  
##  Mean   :5.519   Mean   :5.596   Mean   :5.328   Mean   :5.379  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       LOY6            LOY7            IMA1            IMA2      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000  
##  Median :5.000   Median :6.000   Median :5.000   Median :6.000  
##  Mean   :5.078   Mean   :5.631   Mean   :5.212   Mean   :5.221  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       IMA3            IMA4            IMA5            PHB1      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000  
##  Median :6.000   Median :6.000   Median :6.000   Median :6.000  
##  Mean   :5.368   Mean   :5.369   Mean   :5.416   Mean   :5.303  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PHB2            PHB3            PHB4            PHB5            PEB1     
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.00  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:6.000   1st Qu.:6.000   1st Qu.:5.00  
##  Median :6.000   Median :6.000   Median :6.000   Median :6.000   Median :6.00  
##  Mean   :5.602   Mean   :5.443   Mean   :5.877   Mean   :5.808   Mean   :5.77  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:7.000   3rd Qu.:7.000   3rd Qu.:7.00  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.00  
##                                                                                
##       PEB2            PEB3            PEB4            PDE1      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000   1st Qu.:4.000  
##  Median :6.000   Median :6.000   Median :6.000   Median :5.000  
##  Mean   :5.587   Mean   :5.535   Mean   :5.485   Mean   :4.737  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PDE2            PDE3          PDE4            PDE5            PDE6      
##  Min.   :1.000   Min.   :1.0   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:4.0   1st Qu.:4.000   1st Qu.:5.000   1st Qu.:4.000  
##  Median :6.000   Median :5.0   Median :5.000   Median :6.000   Median :5.000  
##  Mean   :5.351   Mean   :4.9   Mean   :4.752   Mean   :5.193   Mean   :4.936  
##  3rd Qu.:6.000   3rd Qu.:6.0   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.0   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                               
##       PDE7            PSO1            PSO2            PSO3      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:4.000   1st Qu.:3.000   1st Qu.:4.000  
##  Median :5.000   Median :4.000   Median :4.000   Median :5.000  
##  Mean   :4.804   Mean   :4.315   Mean   :4.235   Mean   :4.535  
##  3rd Qu.:6.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       PVA1            PVA2            PVA3        EC_Stop     WC_Stop   
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Never:818   Never:734  
##  1st Qu.:5.000   1st Qu.:5.000   1st Qu.:5.000   Ever : 36   Ever :120  
##  Median :6.000   Median :6.000   Median :6.000                          
##  Mean   :5.851   Mean   :5.446   Mean   :5.718                          
##  3rd Qu.:7.000   3rd Qu.:6.000   3rd Qu.:6.000                          
##  Max.   :7.000   Max.   :7.000   Max.   :7.000                          
##                                                                         
##    EC_Bus      WC_Bus       Gender    MarriedStatus           Occupation 
##  Never:814   Never:739   Female:498   Married:332   Students/Pupils:357  
##  Ever : 40   Ever :115   Male  :356   Single :522   Full.time.job  :304  
##                                                     Part.time.job  : 65  
##                                                     Retirement     : 46  
##                                                     No.job         :  4  
##                                                     Housewife      : 52  
##                                                     Others         : 26  
##             Education             Income   
##  Secondary.school: 59   <5millions   :455  
##  Undergraduate   :277   5-10millions :247  
##  High.school     :359   10-15millions:116  
##  Postgraduate    :103   >15millions  : 36  
##  Others          : 56                      
##                                            
## 
library(table1)
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
Tab1_SEM <- table1(~ PSW1 + PSW2 + PSW3 + PSW4 + PSW5 + PSW6 + PSW7 + PSS1 + PSS2 + PSS3 + PSS4 + PSS5 + PSS6 + PSS7 + PSB1 + PSB2 + PSB3 + PSB4 + PSB5 + PSB6 + PSB7 + PSB8 + PQT1 + PQT2 + PQT3 + PQT4 + PQC1 + PQC2 + PQC3 + PQC4 + PQC5 + PQP1 + PQP2 + PQP3 + PQP4 + PQR1 + PQR2 + PQR3 + PQR4 + PQR5 + SAT1 + SAT2 + SAT3 + LOY1 + LOY2 + LOY3 + LOY4 + LOY5 + LOY6 + LOY7 + IMA1 + IMA2 + IMA3 + IMA4 + IMA5 + PHB1 + PHB2 + PHB3 + PHB4 + PHB5 + PEB1 + PEB2 + PEB3 + PEB4 + PDE1 + PDE2 + PDE3 + PDE4 + PDE5 + PDE6 + PDE7 + PSO1 + PSO2 + PSO3 + PVA1 + PVA2 + PVA3 + EC_Stop + WC_Stop + EC_Bus + WC_Bus + Gender + MarriedStatus + Occupation + Education + Income + AGE + CITY + FRE + TripPurpose + Departure + TimeUseonBus + TravelTime| CITY , data = SEM)
Tab1_SEM
DaNang
(N=406)
HoChiMinh
(N=448)
Overall
(N=854)
PSW1
Mean (SD) 5.51 (1.26) 4.09 (1.86) 4.76 (1.75)
Median [Min, Max] 6.00 [1.00, 7.00] 4.50 [1.00, 7.00] 5.00 [1.00, 7.00]
PSW2
Mean (SD) 5.56 (1.28) 4.43 (1.84) 4.97 (1.69)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSW3
Mean (SD) 5.74 (1.08) 5.03 (1.64) 5.37 (1.44)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSW4
Mean (SD) 4.78 (1.38) 3.75 (1.78) 4.24 (1.68)
Median [Min, Max] 5.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PSW5
Mean (SD) 5.18 (1.28) 4.52 (1.81) 4.83 (1.61)
Median [Min, Max] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PSW6
Mean (SD) 3.95 (1.58) 3.87 (1.66) 3.91 (1.62)
Median [Min, Max] 4.00 [1.00, 7.00] 4.00 [1.00, 7.00] 4.00 [1.00, 7.00]
PSW7
Mean (SD) 5.41 (1.11) 4.91 (1.59) 5.15 (1.40)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSS1
Mean (SD) 5.28 (1.28) 3.78 (1.85) 4.49 (1.77)
Median [Min, Max] 6.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PSS2
Mean (SD) 5.40 (1.22) 4.52 (1.84) 4.94 (1.63)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSS3
Mean (SD) 5.64 (1.05) 5.06 (1.57) 5.33 (1.38)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSS4
Mean (SD) 4.82 (1.44) 3.65 (1.70) 4.20 (1.69)
Median [Min, Max] 5.00 [1.00, 7.00] 4.00 [1.00, 7.00] 4.00 [1.00, 7.00]
PSS5
Mean (SD) 3.83 (1.87) 3.71 (1.93) 3.76 (1.90)
Median [Min, Max] 4.00 [1.00, 7.00] 4.00 [1.00, 7.00] 4.00 [1.00, 7.00]
PSS6
Mean (SD) 3.86 (1.85) 3.43 (1.85) 3.64 (1.86)
Median [Min, Max] 4.00 [1.00, 7.00] 3.00 [1.00, 7.00] 4.00 [1.00, 7.00]
PSS7
Mean (SD) 5.15 (1.41) 4.62 (1.74) 4.87 (1.62)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PSB1
Mean (SD) 5.59 (1.23) 3.79 (1.90) 4.64 (1.85)
Median [Min, Max] 6.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PSB2
Mean (SD) 5.63 (1.17) 4.58 (1.77) 5.08 (1.60)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSB3
Mean (SD) 5.78 (0.955) 5.25 (1.39) 5.50 (1.23)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSB4
Mean (SD) 5.40 (1.21) 4.28 (1.70) 4.82 (1.59)
Median [Min, Max] 6.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PSB5
Mean (SD) 5.96 (1.02) 5.21 (1.54) 5.57 (1.37)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSB6
Mean (SD) 6.13 (0.884) 5.85 (1.09) 5.98 (1.01)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSB7
Mean (SD) 6.01 (0.893) 5.63 (1.22) 5.81 (1.09)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PSB8
Mean (SD) 5.94 (1.04) 5.47 (1.39) 5.69 (1.26)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQT1
Mean (SD) 5.75 (1.06) 5.00 (1.44) 5.35 (1.32)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQT2
Mean (SD) 5.92 (1.07) 4.91 (1.56) 5.39 (1.44)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQT3
Mean (SD) 5.74 (1.17) 4.72 (1.63) 5.21 (1.52)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQT4
Mean (SD) 5.51 (1.14) 4.89 (1.51) 5.18 (1.38)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQC1
Mean (SD) 5.22 (1.26) 5.07 (1.49) 5.14 (1.39)
Median [Min, Max] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQC2
Mean (SD) 5.77 (1.00) 5.41 (1.40) 5.58 (1.24)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQC3
Mean (SD) 5.11 (1.40) 5.14 (1.38) 5.12 (1.39)
Median [Min, Max] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQC4
Mean (SD) 4.81 (1.34) 4.73 (1.40) 4.77 (1.38)
Median [Min, Max] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PQC5
Mean (SD) 5.58 (1.19) 5.49 (1.28) 5.54 (1.24)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQP1
Mean (SD) 5.71 (0.975) 4.97 (1.45) 5.32 (1.30)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQP2
Mean (SD) 5.73 (0.962) 4.94 (1.46) 5.31 (1.31)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQP3
Mean (SD) 5.73 (0.878) 5.07 (1.38) 5.38 (1.22)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQP4
Mean (SD) 5.85 (0.804) 5.29 (1.32) 5.56 (1.14)
Median [Min, Max] 6.00 [3.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQR1
Mean (SD) 5.06 (1.40) 4.85 (1.46) 4.95 (1.44)
Median [Min, Max] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PQR2
Mean (SD) 5.68 (1.02) 4.83 (1.45) 5.23 (1.33)
Median [Min, Max] 6.00 [2.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PQR3
Mean (SD) 5.19 (1.30) 4.86 (1.46) 5.02 (1.40)
Median [Min, Max] 5.50 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PQR4
Mean (SD) 5.30 (1.29) 4.45 (1.72) 4.85 (1.58)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PQR5
Mean (SD) 5.17 (1.29) 4.91 (1.46) 5.03 (1.39)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
SAT1
Mean (SD) 5.55 (1.03) 5.15 (1.35) 5.34 (1.22)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
SAT2
Mean (SD) 5.70 (0.974) 5.33 (1.25) 5.51 (1.14)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
SAT3
Mean (SD) 5.76 (0.928) 5.27 (1.28) 5.50 (1.15)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
LOY1
Mean (SD) 5.76 (0.873) 5.26 (1.24) 5.50 (1.11)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
LOY2
Mean (SD) 5.80 (0.850) 5.26 (1.31) 5.52 (1.14)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
LOY3
Mean (SD) 5.82 (0.877) 5.39 (1.21) 5.60 (1.09)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
LOY4
Mean (SD) 5.55 (1.03) 5.13 (1.38) 5.33 (1.25)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
LOY5
Mean (SD) 5.64 (1.03) 5.14 (1.39) 5.38 (1.25)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
LOY6
Mean (SD) 5.35 (1.32) 4.83 (1.59) 5.08 (1.49)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
LOY7
Mean (SD) 5.92 (0.895) 5.37 (1.38) 5.63 (1.21)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
IMA1
Mean (SD) 5.37 (0.949) 5.07 (1.27) 5.21 (1.14)
Median [Min, Max] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
IMA2
Mean (SD) 5.52 (0.871) 4.95 (1.34) 5.22 (1.18)
Median [Min, Max] 6.00 [2.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
IMA3
Mean (SD) 5.62 (0.846) 5.14 (1.28) 5.37 (1.12)
Median [Min, Max] 6.00 [2.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
IMA4
Mean (SD) 5.69 (0.835) 5.07 (1.34) 5.37 (1.17)
Median [Min, Max] 6.00 [3.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
IMA5
Mean (SD) 5.74 (0.806) 5.13 (1.27) 5.42 (1.12)
Median [Min, Max] 6.00 [2.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PHB1
Mean (SD) 5.43 (1.06) 5.19 (1.53) 5.30 (1.33)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PHB2
Mean (SD) 5.82 (1.01) 5.40 (1.45) 5.60 (1.28)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PHB3
Mean (SD) 5.46 (1.19) 5.42 (1.38) 5.44 (1.29)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PHB4
Mean (SD) 6.08 (0.830) 5.69 (1.33) 5.88 (1.14)
Median [Min, Max] 6.00 [3.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PHB5
Mean (SD) 6.05 (0.819) 5.59 (1.46) 5.81 (1.22)
Median [Min, Max] 6.00 [3.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PEB1
Mean (SD) 5.98 (0.827) 5.58 (1.55) 5.77 (1.28)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PEB2
Mean (SD) 5.79 (0.997) 5.40 (1.60) 5.59 (1.36)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PEB3
Mean (SD) 5.72 (1.05) 5.36 (1.59) 5.54 (1.37)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PEB4
Mean (SD) 5.69 (1.05) 5.29 (1.57) 5.48 (1.36)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PDE1
Mean (SD) 5.11 (1.37) 4.40 (1.71) 4.74 (1.60)
Median [Min, Max] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PDE2
Mean (SD) 5.67 (1.04) 5.06 (1.47) 5.35 (1.32)
Median [Min, Max] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PDE3
Mean (SD) 5.35 (1.16) 4.49 (1.45) 4.90 (1.39)
Median [Min, Max] 6.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PDE4
Mean (SD) 5.26 (1.20) 4.29 (1.46) 4.75 (1.43)
Median [Min, Max] 5.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PDE5
Mean (SD) 5.63 (1.07) 4.80 (1.55) 5.19 (1.40)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PDE6
Mean (SD) 5.33 (1.23) 4.57 (1.42) 4.94 (1.38)
Median [Min, Max] 6.00 [1.00, 7.00] 5.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PDE7
Mean (SD) 5.27 (1.25) 4.38 (1.47) 4.80 (1.44)
Median [Min, Max] 6.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PSO1
Mean (SD) 4.68 (1.32) 3.98 (1.59) 4.31 (1.51)
Median [Min, Max] 5.00 [1.00, 7.00] 4.00 [1.00, 7.00] 4.00 [1.00, 7.00]
PSO2
Mean (SD) 4.66 (1.41) 3.85 (1.56) 4.24 (1.54)
Median [Min, Max] 5.00 [1.00, 7.00] 4.00 [1.00, 7.00] 4.00 [1.00, 7.00]
PSO3
Mean (SD) 5.05 (1.28) 4.07 (1.62) 4.54 (1.54)
Median [Min, Max] 5.00 [1.00, 7.00] 4.00 [1.00, 7.00] 5.00 [1.00, 7.00]
PVA1
Mean (SD) 5.95 (0.913) 5.76 (1.19) 5.85 (1.07)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PVA2
Mean (SD) 5.55 (1.16) 5.35 (1.29) 5.45 (1.24)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
PVA3
Mean (SD) 5.91 (0.810) 5.54 (1.25) 5.72 (1.08)
Median [Min, Max] 6.00 [2.00, 7.00] 6.00 [1.00, 7.00] 6.00 [1.00, 7.00]
EC_Stop
Never 402 (99.0%) 416 (92.9%) 818 (95.8%)
Ever 4 (1.0%) 32 (7.1%) 36 (4.2%)
WC_Stop
Never 385 (94.8%) 349 (77.9%) 734 (85.9%)
Ever 21 (5.2%) 99 (22.1%) 120 (14.1%)
EC_Bus
Never 403 (99.3%) 411 (91.7%) 814 (95.3%)
Ever 3 (0.7%) 37 (8.3%) 40 (4.7%)
WC_Bus
Never 389 (95.8%) 350 (78.1%) 739 (86.5%)
Ever 17 (4.2%) 98 (21.9%) 115 (13.5%)
Gender
Female 226 (55.7%) 272 (60.7%) 498 (58.3%)
Male 180 (44.3%) 176 (39.3%) 356 (41.7%)
MarriedStatus
Married 148 (36.5%) 184 (41.1%) 332 (38.9%)
Single 258 (63.5%) 264 (58.9%) 522 (61.1%)
Occupation
Students/Pupils 197 (48.5%) 160 (35.7%) 357 (41.8%)
Full.time.job 115 (28.3%) 189 (42.2%) 304 (35.6%)
Part.time.job 25 (6.2%) 40 (8.9%) 65 (7.6%)
Retirement 33 (8.1%) 13 (2.9%) 46 (5.4%)
No.job 3 (0.7%) 1 (0.2%) 4 (0.5%)
Housewife 27 (6.7%) 25 (5.6%) 52 (6.1%)
Others 6 (1.5%) 20 (4.5%) 26 (3.0%)
Education
Secondary.school 30 (7.4%) 29 (6.5%) 59 (6.9%)
Undergraduate 129 (31.8%) 148 (33.0%) 277 (32.4%)
High.school 167 (41.1%) 192 (42.9%) 359 (42.0%)
Postgraduate 61 (15.0%) 42 (9.4%) 103 (12.1%)
Others 19 (4.7%) 37 (8.3%) 56 (6.6%)
Income
<5millions 267 (65.8%) 188 (42.0%) 455 (53.3%)
5-10millions 82 (20.2%) 165 (36.8%) 247 (28.9%)
10-15millions 49 (12.1%) 67 (15.0%) 116 (13.6%)
>15millions 8 (2.0%) 28 (6.2%) 36 (4.2%)
AGE
16-25 214 (52.7%) 200 (44.6%) 414 (48.5%)
26-35 75 (18.5%) 93 (20.8%) 168 (19.7%)
36-45 34 (8.4%) 66 (14.7%) 100 (11.7%)
46-55 36 (8.9%) 42 (9.4%) 78 (9.1%)
>55 47 (11.6%) 47 (10.5%) 94 (11.0%)
CITY
DaNang 406 (100%) 0 (0%) 406 (47.5%)
HoChiMinh 0 (0%) 448 (100%) 448 (52.5%)
FRE
>=3 days/week 260 (64.0%) 237 (52.9%) 497 (58.2%)
2days/month-2days/week 82 (20.2%) 80 (17.9%) 162 (19.0%)
2days/year-1day/month 26 (6.4%) 70 (15.6%) 96 (11.2%)
<2 days/year 38 (9.4%) 61 (13.6%) 99 (11.6%)
TripPurpose
Working 115 (28.3%) 189 (42.2%) 304 (35.6%)
Studying 160 (39.4%) 134 (29.9%) 294 (34.4%)
Shopping 45 (11.1%) 13 (2.9%) 58 (6.8%)
Entertaining 48 (11.8%) 47 (10.5%) 95 (11.1%)
Others 38 (9.4%) 65 (14.5%) 103 (12.1%)
Departure
Normal 143 (35.2%) 72 (16.1%) 215 (25.2%)
Peak-Hour 263 (64.8%) 376 (83.9%) 639 (74.8%)
TimeUseonBus
Using.telephone 103 (25.4%) 94 (21.0%) 197 (23.1%)
Reading 22 (5.4%) 31 (6.9%) 53 (6.2%)
Listening 53 (13.1%) 83 (18.5%) 136 (15.9%)
Nothing 200 (49.3%) 216 (48.2%) 416 (48.7%)
Talking 24 (5.9%) 9 (2.0%) 33 (3.9%)
Others 4 (1.0%) 15 (3.3%) 19 (2.2%)
TravelTime
Mean (SD) 1.12 (0.831) 1.41 (1.81) 1.28 (1.44)
Median [Min, Max] 1.00 [0, 6.00] 1.00 [0, 20.0] 1.00 [0, 20.0]
## Loại phân bố dữ liệu không thuộc phân bố chuẩn

3. Perception of bus user 3.1. Tạo dữ liệu biểu đồ likert

# Create data for Likert graph by BS (remove ID and TM =7-Bus) 
head(SEM)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6
## 1       3.00    4    5    6    4    6    4    5    6    6    6    6    4    6
## 2       2.00    2    5    3    2    4    5    3    2    3    4    2    2    2
## 3       0.17    4    6    6    4    1    4    2    2    6    6    4    2    2
## 4       4.00    5    5    5    2    6    4    2    6    6    4    1    4    4
## 5       2.00    3    2    4    4    2    6    5    3    3    5    2    1    2
## 6       2.00    2    5    6    5    4    4    6    3    4    6    2    1    1
##   PSS7 PSB1 PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2
## 1    4    6    6    4    6    5    6    6    6    6    6    4    4    6    4
## 2    2    3    3    4    4    6    6    6    6    4    6    5    4    4    5
## 3    2    2    6    6    4    6    6    4    2    2    2    2    2    2    4
## 4    6    5    6    6    5    5    6    7    6    6    5    4    5    5    5
## 5    2    2    2    5    5    5    6    4    3    6    3    6    3    6    6
## 6    2    2    5    4    4    4    6    4    2    4    4    5    4    5    5
##   PQC3 PQC4 PQR5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQC5 SAT1 SAT2 SAT3
## 1    4    4    6    6    6    5    6    4    4    6    4    2    6    6    6
## 2    6    4    6    6    4    4    5    4    3    4    3    6    5    5    4
## 3    1    2    1    1    1    6    6    2    6    2    5    2    2    2    2
## 4    5    4    4    5    5    5    5    4    5    5    5    5    5    5    5
## 5    4    3    6    4    4    4    5    5    3    5    3    5    4    4    4
## 6    4    3    3    4    4    4    5    3    3    3    3    4    4    5    5
##   LOY1 LOY2 LOY3 LOY4 LOY5 LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3
## 1    4    6    5    7    6    6    6    6    6    6    4    6    6    7    6
## 2    4    5    4    4    4    4    5    4    5    6    5    4    3    4    3
## 3    2    6    6    4    4    2    2    4    2    5    2    2    5    2    6
## 4    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
## 5    4    5    5    4    4    4    6    5    4    5    4    5    5    6    6
## 6    4    3    2    5    5    6    6    4    3    2    2    4    4    6    7
##   PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2
## 1    7    7    4    4    4    4    3    5    6    4    2    4    6    6    6
## 2    4    6    5    6    6    4    3    5    4    4    4    4    5    4    4
## 3    6    6    6    5    6    6    2    6    4    2    2    4    2    4    2
## 4    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
## 5    6    5    6    6    6    6    3    4    2    2    5    4    3    2    3
## 6    6    4    7    7    5    2    1    4    5    2    1    4    2    5    2
##   PSO3 PVA1 PVA2 PVA3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1    6    6    6    6   Never    Ever  Never   Ever Female        Single
## 2    4    5    5    3   Never   Never   Ever  Never Female        Single
## 3    2    6    2    4   Never   Never  Never  Never   Male        Single
## 4    5    5    5    5   Never    Ever  Never   Ever   Male        Single
## 5    4    6    2    3   Never    Ever  Never   Ever   Male        Single
## 6    2    6    5    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
str(SEM)
## 'data.frame':    854 obs. of  93 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ PSW1         : int  4 2 4 5 3 2 1 2 3 4 ...
##  $ PSW2         : int  5 5 6 5 2 5 1 6 4 4 ...
##  $ PSW3         : int  6 3 6 5 4 6 3 6 4 7 ...
##  $ PSW4         : int  4 2 4 2 4 5 1 3 2 4 ...
##  $ PSW5         : int  6 4 1 6 2 4 5 2 3 7 ...
##  $ PSW6         : int  4 5 4 4 6 4 6 2 5 4 ...
##  $ PSW7         : int  5 3 2 2 5 6 4 6 3 7 ...
##  $ PSS1         : int  6 2 2 6 3 3 1 6 2 1 ...
##  $ PSS2         : int  6 3 6 6 3 4 1 6 3 4 ...
##  $ PSS3         : int  6 4 6 4 5 6 5 6 4 7 ...
##  $ PSS4         : int  6 2 4 1 2 2 1 3 3 7 ...
##  $ PSS5         : int  4 2 2 4 1 1 5 1 2 1 ...
##  $ PSS6         : int  6 2 2 4 2 1 1 1 2 1 ...
##  $ PSS7         : int  4 2 2 6 2 2 3 5 3 1 ...
##  $ PSB1         : int  6 3 2 5 2 2 1 6 2 4 ...
##  $ PSB2         : int  6 3 6 6 2 5 1 6 4 4 ...
##  $ PSB3         : int  4 4 6 6 5 4 5 6 4 7 ...
##  $ PSB4         : int  6 4 4 5 5 4 1 6 4 4 ...
##  $ PSB5         : int  5 6 6 5 5 4 5 1 7 7 ...
##  $ PSB6         : int  6 6 6 6 6 6 6 6 6 7 ...
##  $ PSB7         : int  6 6 4 7 4 4 6 6 6 7 ...
##  $ PSB8         : int  6 6 2 6 3 2 6 5 6 7 ...
##  $ PQT1         : int  6 4 2 6 6 4 2 5 5 7 ...
##  $ PQT2         : int  6 6 2 5 3 4 5 6 4 7 ...
##  $ PQT3         : int  4 5 2 4 6 5 5 4 5 7 ...
##  $ PQT4         : int  4 4 2 5 3 4 2 4 3 7 ...
##  $ PQC1         : int  6 4 2 5 6 5 2 6 3 7 ...
##  $ PQC2         : int  4 5 4 5 6 5 2 6 4 7 ...
##  $ PQC3         : int  4 6 1 5 4 4 2 3 4 7 ...
##  $ PQC4         : int  4 4 2 4 3 3 2 4 4 4 ...
##  $ PQR5         : int  6 6 1 4 6 3 2 3 3 4 ...
##  $ PQP1         : int  6 6 1 5 4 4 4 4 3 4 ...
##  $ PQP2         : int  6 4 1 5 4 4 4 4 4 4 ...
##  $ PQP3         : int  5 4 6 5 4 4 3 4 5 7 ...
##  $ PQP4         : int  6 5 6 5 5 5 4 4 6 7 ...
##  $ PQR1         : int  4 4 2 4 5 3 2 5 3 4 ...
##  $ PQR2         : int  4 3 6 5 3 3 1 3 4 7 ...
##  $ PQR3         : int  6 4 2 5 5 3 1 3 5 4 ...
##  $ PQR4         : int  4 3 5 5 3 3 2 2 4 7 ...
##  $ PQC5         : int  2 6 2 5 5 4 4 6 4 7 ...
##  $ SAT1         : int  6 5 2 5 4 4 2 7 5 7 ...
##  $ SAT2         : int  6 5 2 5 4 5 2 7 6 7 ...
##  $ SAT3         : int  6 4 2 5 4 5 3 6 4 7 ...
##  $ LOY1         : int  4 4 2 5 4 4 2 6 6 6 ...
##  $ LOY2         : int  6 5 6 5 5 3 1 6 5 6 ...
##  $ LOY3         : int  5 4 6 5 5 2 1 6 6 6 ...
##  $ LOY4         : int  7 4 4 5 4 5 2 7 5 6 ...
##  $ LOY5         : int  6 4 4 5 4 5 2 7 5 4 ...
##  $ LOY6         : int  6 4 2 5 4 6 1 7 5 6 ...
##  $ LOY7         : int  6 5 2 5 6 6 2 7 5 7 ...
##  $ IMA1         : int  6 4 4 5 5 4 2 6 5 6 ...
##  $ IMA2         : int  6 5 2 5 4 3 3 6 6 7 ...
##  $ IMA3         : int  6 6 5 5 5 2 2 5 6 7 ...
##  $ IMA4         : int  4 5 2 5 4 2 2 6 6 7 ...
##  $ IMA5         : int  6 4 2 5 5 4 2 6 6 7 ...
##  $ PHB1         : int  6 3 5 5 5 4 3 6 6 7 ...
##  $ PHB2         : int  7 4 2 5 6 6 3 7 5 7 ...
##  $ PHB3         : int  6 3 6 5 6 7 1 4 3 7 ...
##  $ PHB4         : int  7 4 6 5 6 6 4 6 7 7 ...
##  $ PHB5         : int  7 6 6 5 5 4 4 6 7 7 ...
##  $ PEB1         : int  4 5 6 5 6 7 4 6 7 7 ...
##  $ PEB2         : int  4 6 5 5 6 7 2 7 7 7 ...
##  $ PEB3         : int  4 6 6 5 6 5 2 6 6 7 ...
##  $ PEB4         : int  4 4 6 5 6 2 2 6 6 7 ...
##  $ PDE1         : int  3 3 2 5 3 1 4 4 5 4 ...
##  $ PDE2         : int  5 5 6 5 4 4 4 4 5 5 ...
##  $ PDE3         : int  6 4 4 5 2 5 2 4 4 4 ...
##  $ PDE4         : int  4 4 2 5 2 2 2 3 4 4 ...
##  $ PDE5         : int  2 4 2 5 5 1 2 5 4 6 ...
##  $ PDE6         : int  4 4 4 5 4 4 2 4 4 4 ...
##  $ PDE7         : int  6 5 2 5 3 2 1 4 3 4 ...
##  $ PSO1         : int  6 4 4 5 2 5 2 6 1 2 ...
##  $ PSO2         : int  6 4 2 5 3 2 1 6 1 4 ...
##  $ PSO3         : int  6 4 2 5 4 2 1 6 4 4 ...
##  $ PVA1         : int  6 5 6 5 6 6 6 6 6 6 ...
##  $ PVA2         : int  6 5 2 5 2 5 4 5 4 6 ...
##  $ PVA3         : int  6 3 4 5 3 5 5 6 5 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
dim(SEM)
## [1] 854  93
names(SEM)
##  [1] "AGE"           "CITY"          "FRE"           "TripPurpose"  
##  [5] "Departure"     "TimeUseonBus"  "TravelTime"    "PSW1"         
##  [9] "PSW2"          "PSW3"          "PSW4"          "PSW5"         
## [13] "PSW6"          "PSW7"          "PSS1"          "PSS2"         
## [17] "PSS3"          "PSS4"          "PSS5"          "PSS6"         
## [21] "PSS7"          "PSB1"          "PSB2"          "PSB3"         
## [25] "PSB4"          "PSB5"          "PSB6"          "PSB7"         
## [29] "PSB8"          "PQT1"          "PQT2"          "PQT3"         
## [33] "PQT4"          "PQC1"          "PQC2"          "PQC3"         
## [37] "PQC4"          "PQR5"          "PQP1"          "PQP2"         
## [41] "PQP3"          "PQP4"          "PQR1"          "PQR2"         
## [45] "PQR3"          "PQR4"          "PQC5"          "SAT1"         
## [49] "SAT2"          "SAT3"          "LOY1"          "LOY2"         
## [53] "LOY3"          "LOY4"          "LOY5"          "LOY6"         
## [57] "LOY7"          "IMA1"          "IMA2"          "IMA3"         
## [61] "IMA4"          "IMA5"          "PHB1"          "PHB2"         
## [65] "PHB3"          "PHB4"          "PHB5"          "PEB1"         
## [69] "PEB2"          "PEB3"          "PEB4"          "PDE1"         
## [73] "PDE2"          "PDE3"          "PDE4"          "PDE5"         
## [77] "PDE6"          "PDE7"          "PSO1"          "PSO2"         
## [81] "PSO3"          "PVA1"          "PVA2"          "PVA3"         
## [85] "EC_Stop"       "WC_Stop"       "EC_Bus"        "WC_Bus"       
## [89] "Gender"        "MarriedStatus" "Occupation"    "Education"    
## [93] "Income"
## Creat dat_PSW1 - cot 3 cua SEM
dat_PSW1 <- SEM [, c(1,2,3,4,5,6,7,8,85,86,87,88,89,90,91,92,93)]
head(dat_PSW1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    2   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSW1)
## [1] 854  17
size <- 854
dat_PSW1$BPE <- rep("PSW1", size = size) # Tạo biến mới BPE
names(dat_PSW1)[names(dat_PSW1) == "PSW1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSW1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW1
## 2 Students/Pupils Undergraduate <5millions PSW1
## 3 Students/Pupils Undergraduate <5millions PSW1
## 4 Students/Pupils Undergraduate <5millions PSW1
## 5 Students/Pupils Undergraduate <5millions PSW1
## 6 Students/Pupils   High.school <5millions PSW1
## Creat dat_PSW2 - cot 3 cua SEM
dat_PSW2 <- SEM [, c(1,2,3,4,5,6,7,9,85,86,87,88,89,90,91,92,93)]
head(dat_PSW2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    5   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSW2)
## [1] 854  17
size <- 854
dat_PSW2$BPE <- rep("PSW2", size = size) # Tạo biến mới BPE
names(dat_PSW2)[names(dat_PSW2) == "PSW2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSW2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   5   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW2
## 2 Students/Pupils Undergraduate <5millions PSW2
## 3 Students/Pupils Undergraduate <5millions PSW2
## 4 Students/Pupils Undergraduate <5millions PSW2
## 5 Students/Pupils Undergraduate <5millions PSW2
## 6 Students/Pupils   High.school <5millions PSW2
# Creat dat_PSW3 - cot 3 cua SEM
dat_PSW3 <- SEM [, c(1,2,3,4,5,6,7,10,85,86,87,88,89,90,91,92,93)]
head(dat_PSW3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSW3)
## [1] 854  17
size <- 854
dat_PSW3$BPE <- rep("PSW3", size = size) # Tạo biến mới BPE
names(dat_PSW3)[names(dat_PSW3) == "PSW3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSW3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW3
## 2 Students/Pupils Undergraduate <5millions PSW3
## 3 Students/Pupils Undergraduate <5millions PSW3
## 4 Students/Pupils Undergraduate <5millions PSW3
## 5 Students/Pupils Undergraduate <5millions PSW3
## 6 Students/Pupils   High.school <5millions PSW3
# Creat dat_PSW4 - cot 3 cua SEM
dat_PSW4 <- SEM [, c(1,2,3,4,5,6,7,11,85,86,87,88,89,90,91,92,93)]
head(dat_PSW4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    2   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    2   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSW4)
## [1] 854  17
size <- 854
dat_PSW4$BPE <- rep("PSW4", size = size) # Tạo biến mới BPE
names(dat_PSW4)[names(dat_PSW4) == "PSW4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSW4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   2   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW4
## 2 Students/Pupils Undergraduate <5millions PSW4
## 3 Students/Pupils Undergraduate <5millions PSW4
## 4 Students/Pupils Undergraduate <5millions PSW4
## 5 Students/Pupils Undergraduate <5millions PSW4
## 6 Students/Pupils   High.school <5millions PSW4
# Creat dat_PSW5 - cot 3 cua SEM
dat_PSW5 <- SEM [, c(1,2,3,4,5,6,7,12,85,86,87,88,89,90,91,92,93)]
head(dat_PSW5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    1   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSW5)
## [1] 854  17
size <- 854
dat_PSW5$BPE <- rep("PSW5", size = size) # Tạo biến mới BPE
names(dat_PSW5)[names(dat_PSW5) == "PSW5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSW5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   1   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW5
## 2 Students/Pupils Undergraduate <5millions PSW5
## 3 Students/Pupils Undergraduate <5millions PSW5
## 4 Students/Pupils Undergraduate <5millions PSW5
## 5 Students/Pupils Undergraduate <5millions PSW5
## 6 Students/Pupils   High.school <5millions PSW5
# Creat dat_PSW6 - cot 3 cua SEM
dat_PSW6 <- SEM [, c(1,2,3,4,5,6,7,13,85,86,87,88,89,90,91,92,93)]
head(dat_PSW6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW6 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSW6)
## [1] 854  17
size <- 854
dat_PSW6$BPE <- rep("PSW6", size = size) # Tạo biến mới BPE
names(dat_PSW6)[names(dat_PSW6) == "PSW6"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSW6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW6
## 2 Students/Pupils Undergraduate <5millions PSW6
## 3 Students/Pupils Undergraduate <5millions PSW6
## 4 Students/Pupils Undergraduate <5millions PSW6
## 5 Students/Pupils Undergraduate <5millions PSW6
## 6 Students/Pupils   High.school <5millions PSW6
# Creat dat_PSW7 - cot 3 cua SEM
dat_PSW7 <- SEM [, c(1,2,3,4,5,6,7,14,85,86,87,88,89,90,91,92,93)]
head(dat_PSW7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSW7 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    5   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    2   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSW7)
## [1] 854  17
size <- 854
dat_PSW7$BPE <- rep("PSW7", size = size) # Tạo biến mới BPE
names(dat_PSW7)[names(dat_PSW7) == "PSW7"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSW7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   5   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   2   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW7
## 2 Students/Pupils Undergraduate <5millions PSW7
## 3 Students/Pupils Undergraduate <5millions PSW7
## 4 Students/Pupils Undergraduate <5millions PSW7
## 5 Students/Pupils Undergraduate <5millions PSW7
## 6 Students/Pupils   High.school <5millions PSW7
## Creat dat_PSS1 - cot 3 cua SEM
dat_PSS1 <- SEM [, c(1,2,3,4,5,6,7,15,85,86,87,88,89,90,91,92,93)]
head(dat_PSS1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSS1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    2   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSS1)
## [1] 854  17
size <- 854
dat_PSS1$BPE <- rep("PSS1", size = size) # Tạo biến mới BPE
names(dat_PSS1)[names(dat_PSS1) == "PSS1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSS1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSS1
## 2 Students/Pupils Undergraduate <5millions PSS1
## 3 Students/Pupils Undergraduate <5millions PSS1
## 4 Students/Pupils Undergraduate <5millions PSS1
## 5 Students/Pupils Undergraduate <5millions PSS1
## 6 Students/Pupils   High.school <5millions PSS1
## Creat dat_PSS2 - cot 3 cua SEM
dat_PSS2 <- SEM [, c(1,2,3,4,5,6,7,16,85,86,87,88,89,90,91,92,93)]
head(dat_PSS2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSS2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSS2)
## [1] 854  17
size <- 854
dat_PSS2$BPE <- rep("PSS2", size = size) # Tạo biến mới BPE
names(dat_PSS2)[names(dat_PSS2) == "PSS2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSS2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSS2
## 2 Students/Pupils Undergraduate <5millions PSS2
## 3 Students/Pupils Undergraduate <5millions PSS2
## 4 Students/Pupils Undergraduate <5millions PSS2
## 5 Students/Pupils Undergraduate <5millions PSS2
## 6 Students/Pupils   High.school <5millions PSS2
# Creat dat_PSS3 - cot 3 cua SEM
dat_PSS3 <- SEM [, c(1,2,3,4,5,6,7,17,85,86,87,88,89,90,91,92,93)]
head(dat_PSS3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSS3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSS3)
## [1] 854  17
size <- 854
dat_PSS3$BPE <- rep("PSS3", size = size) # Tạo biến mới BPE
names(dat_PSS3)[names(dat_PSS3) == "PSS3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSS3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSS3
## 2 Students/Pupils Undergraduate <5millions PSS3
## 3 Students/Pupils Undergraduate <5millions PSS3
## 4 Students/Pupils Undergraduate <5millions PSS3
## 5 Students/Pupils Undergraduate <5millions PSS3
## 6 Students/Pupils   High.school <5millions PSS3
# Creat dat_PSS4 - cot 3 cua SEM
dat_PSS4 <- SEM [, c(1,2,3,4,5,6,7,18,85,86,87,88,89,90,91,92,93)]
head(dat_PSS4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSS4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    2   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    1   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSS4)
## [1] 854  17
size <- 854
dat_PSS4$BPE <- rep("PSS4", size = size) # Tạo biến mới BPE
names(dat_PSS4)[names(dat_PSS4) == "PSS4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSS4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   1   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSS4
## 2 Students/Pupils Undergraduate <5millions PSS4
## 3 Students/Pupils Undergraduate <5millions PSS4
## 4 Students/Pupils Undergraduate <5millions PSS4
## 5 Students/Pupils Undergraduate <5millions PSS4
## 6 Students/Pupils   High.school <5millions PSS4
# Creat dat_PSS5 - cot 3 cua SEM
dat_PSS5 <- SEM [, c(1,2,3,4,5,6,7,19,85,86,87,88,89,90,91,92,93)]
head(dat_PSS5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSS5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    2   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    1   Never    Ever  Never   Ever   Male        Single
## 6       2.00    1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSS5)
## [1] 854  17
size <- 854
dat_PSS5$BPE <- rep("PSS5", size = size) # Tạo biến mới BPE
names(dat_PSS5)[names(dat_PSS5) == "PSS5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSS5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   1   Never    Ever  Never   Ever   Male        Single
## 6       2.00   1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSS5
## 2 Students/Pupils Undergraduate <5millions PSS5
## 3 Students/Pupils Undergraduate <5millions PSS5
## 4 Students/Pupils Undergraduate <5millions PSS5
## 5 Students/Pupils Undergraduate <5millions PSS5
## 6 Students/Pupils   High.school <5millions PSS5
# Creat dat_PSS6 - cot 3 cua SEM
dat_PSS6 <- SEM [, c(1,2,3,4,5,6,7,20,85,86,87,88,89,90,91,92,93)]
head(dat_PSS6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSS6 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    2   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSS6)
## [1] 854  17
size <- 854
dat_PSS6$BPE <- rep("PSS6", size = size) # Tạo biến mới BPE
names(dat_PSS6)[names(dat_PSS6) == "PSS6"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSS6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSS6
## 2 Students/Pupils Undergraduate <5millions PSS6
## 3 Students/Pupils Undergraduate <5millions PSS6
## 4 Students/Pupils Undergraduate <5millions PSS6
## 5 Students/Pupils Undergraduate <5millions PSS6
## 6 Students/Pupils   High.school <5millions PSS6
# Creat dat_PSS7 - cot 3 cua SEM
dat_PSS7 <- SEM [, c(1,2,3,4,5,6,7,21,85,86,87,88,89,90,91,92,93)]
head(dat_PSS7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSS7 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    2   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSS7)
## [1] 854  17
size <- 854
dat_PSS7$BPE <- rep("PSS7", size = size) # Tạo biến mới BPE
names(dat_PSS7)[names(dat_PSS7) == "PSS7"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSS7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSS7
## 2 Students/Pupils Undergraduate <5millions PSS7
## 3 Students/Pupils Undergraduate <5millions PSS7
## 4 Students/Pupils Undergraduate <5millions PSS7
## 5 Students/Pupils Undergraduate <5millions PSS7
## 6 Students/Pupils   High.school <5millions PSS7
## Creat dat_PSB1 - cot 3 cua SEM
dat_PSB1 <- SEM [, c(1,2,3,4,5,6,7,22,85,86,87,88,89,90,91,92,93)]
head(dat_PSB1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB1)
## [1] 854  17
size <- 854
dat_PSB1$BPE <- rep("PSB1", size = size) # Tạo biến mới BPE
names(dat_PSB1)[names(dat_PSB1) == "PSB1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB1
## 2 Students/Pupils Undergraduate <5millions PSB1
## 3 Students/Pupils Undergraduate <5millions PSB1
## 4 Students/Pupils Undergraduate <5millions PSB1
## 5 Students/Pupils Undergraduate <5millions PSB1
## 6 Students/Pupils   High.school <5millions PSB1
## Creat dat_PSB2 - cot 3 cua SEM
dat_PSB2 <- SEM [, c(1,2,3,4,5,6,7,23,85,86,87,88,89,90,91,92,93)]
head(dat_PSB2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB2)
## [1] 854  17
size <- 854
dat_PSB2$BPE <- rep("PSB2", size = size) # Tạo biến mới BPE
names(dat_PSB2)[names(dat_PSB2) == "PSB2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB2
## 2 Students/Pupils Undergraduate <5millions PSB2
## 3 Students/Pupils Undergraduate <5millions PSB2
## 4 Students/Pupils Undergraduate <5millions PSB2
## 5 Students/Pupils Undergraduate <5millions PSB2
## 6 Students/Pupils   High.school <5millions PSB2
# Creat dat_PSB3 - cot 3 cua SEM
dat_PSB3 <- SEM [, c(1,2,3,4,5,6,7,24,85,86,87,88,89,90,91,92,93)]
head(dat_PSB3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB3)
## [1] 854  17
size <- 854
dat_PSB3$BPE <- rep("PSB3", size = size) # Tạo biến mới BPE
names(dat_PSB3)[names(dat_PSB3) == "PSB3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB3
## 2 Students/Pupils Undergraduate <5millions PSB3
## 3 Students/Pupils Undergraduate <5millions PSB3
## 4 Students/Pupils Undergraduate <5millions PSB3
## 5 Students/Pupils Undergraduate <5millions PSB3
## 6 Students/Pupils   High.school <5millions PSB3
# Creat dat_PSB4 - cot 3 cua SEM
dat_PSB4 <- SEM [, c(1,2,3,4,5,6,7,25,85,86,87,88,89,90,91,92,93)]
head(dat_PSB4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB4)
## [1] 854  17
size <- 854
dat_PSB4$BPE <- rep("PSB4", size = size) # Tạo biến mới BPE
names(dat_PSB4)[names(dat_PSB4) == "PSB4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB4
## 2 Students/Pupils Undergraduate <5millions PSB4
## 3 Students/Pupils Undergraduate <5millions PSB4
## 4 Students/Pupils Undergraduate <5millions PSB4
## 5 Students/Pupils Undergraduate <5millions PSB4
## 6 Students/Pupils   High.school <5millions PSB4
# Creat dat_PSB5 - cot 3 cua SEM
dat_PSB5 <- SEM [, c(1,2,3,4,5,6,7,26,85,86,87,88,89,90,91,92,93)]
head(dat_PSB5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    5   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB5)
## [1] 854  17
size <- 854
dat_PSB5$BPE <- rep("PSB5", size = size) # Tạo biến mới BPE
names(dat_PSB5)[names(dat_PSB5) == "PSB5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   5   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB5
## 2 Students/Pupils Undergraduate <5millions PSB5
## 3 Students/Pupils Undergraduate <5millions PSB5
## 4 Students/Pupils Undergraduate <5millions PSB5
## 5 Students/Pupils Undergraduate <5millions PSB5
## 6 Students/Pupils   High.school <5millions PSB5
# Creat dat_PSB6 - cot 3 cua SEM
dat_PSB6 <- SEM [, c(1,2,3,4,5,6,7,27,85,86,87,88,89,90,91,92,93)]
head(dat_PSB6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB6 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB6)
## [1] 854  17
size <- 854
dat_PSB6$BPE <- rep("PSB6", size = size) # Tạo biến mới BPE
names(dat_PSB6)[names(dat_PSB6) == "PSB6"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB6
## 2 Students/Pupils Undergraduate <5millions PSB6
## 3 Students/Pupils Undergraduate <5millions PSB6
## 4 Students/Pupils Undergraduate <5millions PSB6
## 5 Students/Pupils Undergraduate <5millions PSB6
## 6 Students/Pupils   High.school <5millions PSB6
# Creat dat_PSB7 - cot 3 cua SEM
dat_PSB7 <- SEM [, c(1,2,3,4,5,6,7,28,85,86,87,88,89,90,91,92,93)]
head(dat_PSB7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB7 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    7   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB7)
## [1] 854  17
size <- 854
dat_PSB7$BPE <- rep("PSB7", size = size) # Tạo biến mới BPE
names(dat_PSB7)[names(dat_PSB7) == "PSB7"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   7   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB7
## 2 Students/Pupils Undergraduate <5millions PSB7
## 3 Students/Pupils Undergraduate <5millions PSB7
## 4 Students/Pupils Undergraduate <5millions PSB7
## 5 Students/Pupils Undergraduate <5millions PSB7
## 6 Students/Pupils   High.school <5millions PSB7
# Creat dat_PSB8 - cot 3 cua SEM
dat_PSB8 <- SEM [, c(1,2,3,4,5,6,7,29,85,86,87,88,89,90,91,92,93)]
head(dat_PSB8)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSB8 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSB8)
## [1] 854  17
size <- 854
dat_PSB8$BPE <- rep("PSB8", size = size) # Tạo biến mới BPE
names(dat_PSB8)[names(dat_PSB8) == "PSB8"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSB8)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSB8
## 2 Students/Pupils Undergraduate <5millions PSB8
## 3 Students/Pupils Undergraduate <5millions PSB8
## 4 Students/Pupils Undergraduate <5millions PSB8
## 5 Students/Pupils Undergraduate <5millions PSB8
## 6 Students/Pupils   High.school <5millions PSB8
## Creat dat_PQT1 - cot 3 cua SEM
dat_PQT1 <- SEM [, c(1,2,3,4,5,6,7,30,85,86,87,88,89,90,91,92,93)]
head(dat_PQT1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQT1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    6   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQT1)
## [1] 854  17
size <- 854
dat_PQT1$BPE <- rep("PQT1", size = size) # Tạo biến mới BPE
names(dat_PQT1)[names(dat_PQT1) == "PQT1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQT1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQT1
## 2 Students/Pupils Undergraduate <5millions PQT1
## 3 Students/Pupils Undergraduate <5millions PQT1
## 4 Students/Pupils Undergraduate <5millions PQT1
## 5 Students/Pupils Undergraduate <5millions PQT1
## 6 Students/Pupils   High.school <5millions PQT1
## Creat dat_PQT2 - cot 3 cua SEM
dat_PQT2 <- SEM [, c(1,2,3,4,5,6,7,31,85,86,87,88,89,90,91,92,93)]
head(dat_PQT2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQT2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQT2)
## [1] 854  17
size <- 854
dat_PQT2$BPE <- rep("PQT2", size = size) # Tạo biến mới BPE
names(dat_PQT2)[names(dat_PQT2) == "PQT2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQT2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQT2
## 2 Students/Pupils Undergraduate <5millions PQT2
## 3 Students/Pupils Undergraduate <5millions PQT2
## 4 Students/Pupils Undergraduate <5millions PQT2
## 5 Students/Pupils Undergraduate <5millions PQT2
## 6 Students/Pupils   High.school <5millions PQT2
# Creat dat_PQT3 - cot 3 cua SEM
dat_PQT3 <- SEM [, c(1,2,3,4,5,6,7,32,85,86,87,88,89,90,91,92,93)]
head(dat_PQT3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQT3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQT3)
## [1] 854  17
size <- 854
dat_PQT3$BPE <- rep("PQT3", size = size) # Tạo biến mới BPE
names(dat_PQT3)[names(dat_PQT3) == "PQT3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQT3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQT3
## 2 Students/Pupils Undergraduate <5millions PQT3
## 3 Students/Pupils Undergraduate <5millions PQT3
## 4 Students/Pupils Undergraduate <5millions PQT3
## 5 Students/Pupils Undergraduate <5millions PQT3
## 6 Students/Pupils   High.school <5millions PQT3
# Creat dat_PQT4 - cot 3 cua SEM
dat_PQT4 <- SEM [, c(1,2,3,4,5,6,7,33,85,86,87,88,89,90,91,92,93)]
head(dat_PQT4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQT4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQT4)
## [1] 854  17
size <- 854
dat_PQT4$BPE <- rep("PQT4", size = size) # Tạo biến mới BPE
names(dat_PQT4)[names(dat_PQT4) == "PQT4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQT4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQT4
## 2 Students/Pupils Undergraduate <5millions PQT4
## 3 Students/Pupils Undergraduate <5millions PQT4
## 4 Students/Pupils Undergraduate <5millions PQT4
## 5 Students/Pupils Undergraduate <5millions PQT4
## 6 Students/Pupils   High.school <5millions PQT4
## Creat dat_PQC1 - cot 3 cua SEM
dat_PQC1 <- SEM [, c(1,2,3,4,5,6,7,34,85,86,87,88,89,90,91,92,93)]
head(dat_PQC1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQC1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQC1)
## [1] 854  17
size <- 854
dat_PQC1$BPE <- rep("PQC1", size = size) # Tạo biến mới BPE
names(dat_PQC1)[names(dat_PQC1) == "PQC1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQC1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQC1
## 2 Students/Pupils Undergraduate <5millions PQC1
## 3 Students/Pupils Undergraduate <5millions PQC1
## 4 Students/Pupils Undergraduate <5millions PQC1
## 5 Students/Pupils Undergraduate <5millions PQC1
## 6 Students/Pupils   High.school <5millions PQC1
## Creat dat_PQC2 - cot 3 cua SEM
dat_PQC2 <- SEM [, c(1,2,3,4,5,6,7,35,85,86,87,88,89,90,91,92,93)]
head(dat_PQC2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQC2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQC2)
## [1] 854  17
size <- 854
dat_PQC2$BPE <- rep("PQC2", size = size) # Tạo biến mới BPE
names(dat_PQC2)[names(dat_PQC2) == "PQC2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQC2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQC2
## 2 Students/Pupils Undergraduate <5millions PQC2
## 3 Students/Pupils Undergraduate <5millions PQC2
## 4 Students/Pupils Undergraduate <5millions PQC2
## 5 Students/Pupils Undergraduate <5millions PQC2
## 6 Students/Pupils   High.school <5millions PQC2
# Creat dat_PQC3 - cot 3 cua SEM
dat_PQC3 <- SEM [, c(1,2,3,4,5,6,7,36,85,86,87,88,89,90,91,92,93)]
head(dat_PQC3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQC3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    1   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQC3)
## [1] 854  17
size <- 854
dat_PQC3$BPE <- rep("PQC3", size = size) # Tạo biến mới BPE
names(dat_PQC3)[names(dat_PQC3) == "PQC3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQC3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   1   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQC3
## 2 Students/Pupils Undergraduate <5millions PQC3
## 3 Students/Pupils Undergraduate <5millions PQC3
## 4 Students/Pupils Undergraduate <5millions PQC3
## 5 Students/Pupils Undergraduate <5millions PQC3
## 6 Students/Pupils   High.school <5millions PQC3
# Creat dat_PQC4 - cot 3 cua SEM
dat_PQC4 <- SEM [, c(1,2,3,4,5,6,7,37,85,86,87,88,89,90,91,92,93)]
head(dat_PQC4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQC4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQC4)
## [1] 854  17
size <- 854
dat_PQC4$BPE <- rep("PQC4", size = size) # Tạo biến mới BPE
names(dat_PQC4)[names(dat_PQC4) == "PQC4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQC4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQC4
## 2 Students/Pupils Undergraduate <5millions PQC4
## 3 Students/Pupils Undergraduate <5millions PQC4
## 4 Students/Pupils Undergraduate <5millions PQC4
## 5 Students/Pupils Undergraduate <5millions PQC4
## 6 Students/Pupils   High.school <5millions PQC4
# Creat dat_PQC5 - cot 3 cua SEM
dat_PQC5 <- SEM [, c(1,2,3,4,5,6,7,47,85,86,87,88,89,90,91,92,93)]
head(dat_PQC5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQC5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    2   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQC5)
## [1] 854  17
size <- 854
dat_PQC5$BPE <- rep("PQC5", size = size) # Tạo biến mới BPE
names(dat_PQC5)[names(dat_PQC5) == "PQC5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQC5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   2   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQC5
## 2 Students/Pupils Undergraduate <5millions PQC5
## 3 Students/Pupils Undergraduate <5millions PQC5
## 4 Students/Pupils Undergraduate <5millions PQC5
## 5 Students/Pupils Undergraduate <5millions PQC5
## 6 Students/Pupils   High.school <5millions PQC5
## Creat dat_PQP1 - cot 3 cua SEM
dat_PQP1 <- SEM [, c(1,2,3,4,5,6,7,39,85,86,87,88,89,90,91,92,93)]
head(dat_PQP1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQP1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    1   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQP1)
## [1] 854  17
size <- 854
dat_PQP1$BPE <- rep("PQP1", size = size) # Tạo biến mới BPE
names(dat_PQP1)[names(dat_PQP1) == "PQP1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQP1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   1   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQP1
## 2 Students/Pupils Undergraduate <5millions PQP1
## 3 Students/Pupils Undergraduate <5millions PQP1
## 4 Students/Pupils Undergraduate <5millions PQP1
## 5 Students/Pupils Undergraduate <5millions PQP1
## 6 Students/Pupils   High.school <5millions PQP1
## Creat dat_PQP2 - cot 3 cua SEM
dat_PQP2 <- SEM [, c(1,2,3,4,5,6,7,40,85,86,87,88,89,90,91,92,93)]
head(dat_PQP2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQP2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    1   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQP2)
## [1] 854  17
size <- 854
dat_PQP2$BPE <- rep("PQP2", size = size) # Tạo biến mới BPE
names(dat_PQP2)[names(dat_PQP2) == "PQP2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQP2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   1   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQP2
## 2 Students/Pupils Undergraduate <5millions PQP2
## 3 Students/Pupils Undergraduate <5millions PQP2
## 4 Students/Pupils Undergraduate <5millions PQP2
## 5 Students/Pupils Undergraduate <5millions PQP2
## 6 Students/Pupils   High.school <5millions PQP2
# Creat dat_PQP3 - cot 3 cua SEM
dat_PQP3 <- SEM [, c(1,2,3,4,5,6,7,41,85,86,87,88,89,90,91,92,93)]
head(dat_PQP3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQP3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    5   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQP3)
## [1] 854  17
size <- 854
dat_PQP3$BPE <- rep("PQP3", size = size) # Tạo biến mới BPE
names(dat_PQP3)[names(dat_PQP3) == "PQP3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQP3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   5   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQP3
## 2 Students/Pupils Undergraduate <5millions PQP3
## 3 Students/Pupils Undergraduate <5millions PQP3
## 4 Students/Pupils Undergraduate <5millions PQP3
## 5 Students/Pupils Undergraduate <5millions PQP3
## 6 Students/Pupils   High.school <5millions PQP3
# Creat dat_PQP4 - cot 3 cua SEM
dat_PQP4 <- SEM [, c(1,2,3,4,5,6,7,42,85,86,87,88,89,90,91,92,93)]
head(dat_PQP4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQP4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQP4)
## [1] 854  17
size <- 854
dat_PQP4$BPE <- rep("PQP4", size = size) # Tạo biến mới BPE
names(dat_PQP4)[names(dat_PQP4) == "PQP4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQP4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQP4
## 2 Students/Pupils Undergraduate <5millions PQP4
## 3 Students/Pupils Undergraduate <5millions PQP4
## 4 Students/Pupils Undergraduate <5millions PQP4
## 5 Students/Pupils Undergraduate <5millions PQP4
## 6 Students/Pupils   High.school <5millions PQP4
## Creat dat_PQR1 - cot 3 cua SEM
dat_PQR1 <- SEM [, c(1,2,3,4,5,6,7,43,85,86,87,88,89,90,91,92,93)]
head(dat_PQR1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQR1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQR1)
## [1] 854  17
size <- 854
dat_PQR1$BPE <- rep("PQR1", size = size) # Tạo biến mới BPE
names(dat_PQR1)[names(dat_PQR1) == "PQR1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQR1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQR1
## 2 Students/Pupils Undergraduate <5millions PQR1
## 3 Students/Pupils Undergraduate <5millions PQR1
## 4 Students/Pupils Undergraduate <5millions PQR1
## 5 Students/Pupils Undergraduate <5millions PQR1
## 6 Students/Pupils   High.school <5millions PQR1
## Creat dat_PQR2 - cot 3 cua SEM
dat_PQR2 <- SEM [, c(1,2,3,4,5,6,7,44,85,86,87,88,89,90,91,92,93)]
head(dat_PQR2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQR2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQR2)
## [1] 854  17
size <- 854
dat_PQR2$BPE <- rep("PQR2", size = size) # Tạo biến mới BPE
names(dat_PQR2)[names(dat_PQR2) == "PQR2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQR2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQR2
## 2 Students/Pupils Undergraduate <5millions PQR2
## 3 Students/Pupils Undergraduate <5millions PQR2
## 4 Students/Pupils Undergraduate <5millions PQR2
## 5 Students/Pupils Undergraduate <5millions PQR2
## 6 Students/Pupils   High.school <5millions PQR2
# Creat dat_PQR3 - cot 3 cua SEM
dat_PQR3 <- SEM [, c(1,2,3,4,5,6,7,45,85,86,87,88,89,90,91,92,93)]
head(dat_PQR3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQR3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQR3)
## [1] 854  17
size <- 854
dat_PQR3$BPE <- rep("PQR3", size = size) # Tạo biến mới BPE
names(dat_PQR3)[names(dat_PQR3) == "PQR3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQR3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQR3
## 2 Students/Pupils Undergraduate <5millions PQR3
## 3 Students/Pupils Undergraduate <5millions PQR3
## 4 Students/Pupils Undergraduate <5millions PQR3
## 5 Students/Pupils Undergraduate <5millions PQR3
## 6 Students/Pupils   High.school <5millions PQR3
# Creat dat_PQR4 - cot 3 cua SEM
dat_PQR4 <- SEM [, c(1,2,3,4,5,6,7,46,85,86,87,88,89,90,91,92,93)]
head(dat_PQR4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQR4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    5   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQR4)
## [1] 854  17
size <- 854
dat_PQR4$BPE <- rep("PQR4", size = size) # Tạo biến mới BPE
names(dat_PQR4)[names(dat_PQR4) == "PQR4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQR4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   5   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQR4
## 2 Students/Pupils Undergraduate <5millions PQR4
## 3 Students/Pupils Undergraduate <5millions PQR4
## 4 Students/Pupils Undergraduate <5millions PQR4
## 5 Students/Pupils Undergraduate <5millions PQR4
## 6 Students/Pupils   High.school <5millions PQR4
# Creat dat_PQR5 - cot 3 cua SEM
dat_PQR5 <- SEM [, c(1,2,3,4,5,6,7,38,85,86,87,88,89,90,91,92,93)]
head(dat_PQR5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PQR5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    1   Never   Never  Never  Never   Male        Single
## 4       4.00    4   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PQR5)
## [1] 854  17
size <- 854
dat_PQR5$BPE <- rep("PQR5", size = size) # Tạo biến mới BPE
names(dat_PQR5)[names(dat_PQR5) == "PQR5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PQR5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   1   Never   Never  Never  Never   Male        Single
## 4       4.00   4   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQR5
## 2 Students/Pupils Undergraduate <5millions PQR5
## 3 Students/Pupils Undergraduate <5millions PQR5
## 4 Students/Pupils Undergraduate <5millions PQR5
## 5 Students/Pupils Undergraduate <5millions PQR5
## 6 Students/Pupils   High.school <5millions PQR5
## Creat dat_SAT1 - cot 3 cua SEM
dat_SAT1 <- SEM [, c(1,2,3,4,5,6,7,48,85,86,87,88,89,90,91,92,93)]
head(dat_SAT1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime SAT1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_SAT1)
## [1] 854  17
size <- 854
dat_SAT1$BPE <- rep("SAT1", size = size) # Tạo biến mới BPE
names(dat_SAT1)[names(dat_SAT1) == "SAT1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_SAT1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions SAT1
## 2 Students/Pupils Undergraduate <5millions SAT1
## 3 Students/Pupils Undergraduate <5millions SAT1
## 4 Students/Pupils Undergraduate <5millions SAT1
## 5 Students/Pupils Undergraduate <5millions SAT1
## 6 Students/Pupils   High.school <5millions SAT1
## Creat dat_SAT2 - cot 3 cua SEM
dat_SAT2 <- SEM [, c(1,2,3,4,5,6,7,49,85,86,87,88,89,90,91,92,93)]
head(dat_SAT2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime SAT2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_SAT2)
## [1] 854  17
size <- 854
dat_SAT2$BPE <- rep("SAT2", size = size) # Tạo biến mới BPE
names(dat_SAT2)[names(dat_SAT2) == "SAT2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_SAT2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions SAT2
## 2 Students/Pupils Undergraduate <5millions SAT2
## 3 Students/Pupils Undergraduate <5millions SAT2
## 4 Students/Pupils Undergraduate <5millions SAT2
## 5 Students/Pupils Undergraduate <5millions SAT2
## 6 Students/Pupils   High.school <5millions SAT2
# Creat dat_SAT3 - cot 3 cua SEM
dat_SAT3 <- SEM [, c(1,2,3,4,5,6,7,50,85,86,87,88,89,90,91,92,93)]
head(dat_SAT3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime SAT3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_SAT3)
## [1] 854  17
size <- 854
dat_SAT3$BPE <- rep("SAT3", size = size) # Tạo biến mới BPE
names(dat_SAT3)[names(dat_SAT3) == "SAT3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_SAT3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions SAT3
## 2 Students/Pupils Undergraduate <5millions SAT3
## 3 Students/Pupils Undergraduate <5millions SAT3
## 4 Students/Pupils Undergraduate <5millions SAT3
## 5 Students/Pupils Undergraduate <5millions SAT3
## 6 Students/Pupils   High.school <5millions SAT3
## Creat dat_LOY1 - cot 7 cua SEM
dat_LOY1 <- SEM [, c(1,2,3,4,5,6,7,51,85,86,87,88,89,90,91,92,93)]
head(dat_LOY1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime LOY1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_LOY1)
## [1] 854  17
size <- 854
dat_LOY1$BPE <- rep("LOY1", size = size) # Tạo biến mới BPE
names(dat_LOY1)[names(dat_LOY1) == "LOY1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_LOY1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions LOY1
## 2 Students/Pupils Undergraduate <5millions LOY1
## 3 Students/Pupils Undergraduate <5millions LOY1
## 4 Students/Pupils Undergraduate <5millions LOY1
## 5 Students/Pupils Undergraduate <5millions LOY1
## 6 Students/Pupils   High.school <5millions LOY1
## Creat dat_LOY2 - cot 8 cua SEM
dat_LOY2 <- SEM [, c(1,2,3,4,5,6,7,52,85,86,87,88,89,90,91,92,93)]
head(dat_LOY2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime LOY2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_LOY2)
## [1] 854  17
size <- 854
dat_LOY2$BPE <- rep("LOY2", size = size) # Tạo biến mới BPE
names(dat_LOY2)[names(dat_LOY2) == "LOY2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_LOY2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions LOY2
## 2 Students/Pupils Undergraduate <5millions LOY2
## 3 Students/Pupils Undergraduate <5millions LOY2
## 4 Students/Pupils Undergraduate <5millions LOY2
## 5 Students/Pupils Undergraduate <5millions LOY2
## 6 Students/Pupils   High.school <5millions LOY2
## Creat dat_LOY3 - cot 9 cua SEM
dat_LOY3 <- SEM [, c(1,2,3,4,5,6,7,53,85,86,87,88,89,90,91,92,93)]
head(dat_LOY3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime LOY3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    5   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_LOY3)
## [1] 854  17
size <- 854
dat_LOY3$BPE <- rep("LOY3", size = size) # Tạo biến mới BPE
names(dat_LOY3)[names(dat_LOY3) == "LOY3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_LOY3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   5   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions LOY3
## 2 Students/Pupils Undergraduate <5millions LOY3
## 3 Students/Pupils Undergraduate <5millions LOY3
## 4 Students/Pupils Undergraduate <5millions LOY3
## 5 Students/Pupils Undergraduate <5millions LOY3
## 6 Students/Pupils   High.school <5millions LOY3
## Creat dat_LOY4 - cot 10 cua SEM
dat_LOY4 <- SEM [, c(1,2,3,4,5,6,7,54,85,86,87,88,89,90,91,92,93)]
head(dat_LOY4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime LOY4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    7   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_LOY4)
## [1] 854  17
size <- 854
dat_LOY4$BPE <- rep("LOY4", size = size) # Tạo biến mới BPE
names(dat_LOY4)[names(dat_LOY4) == "LOY4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_LOY4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   7   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions LOY4
## 2 Students/Pupils Undergraduate <5millions LOY4
## 3 Students/Pupils Undergraduate <5millions LOY4
## 4 Students/Pupils Undergraduate <5millions LOY4
## 5 Students/Pupils Undergraduate <5millions LOY4
## 6 Students/Pupils   High.school <5millions LOY4
## Creat dat_LOY5 - cot 11 cua SEM
dat_LOY5 <- SEM [, c(1,2,3,4,5,6,7,55,85,86,87,88,89,90,91,92,93)]
head(dat_LOY5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime LOY5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_LOY5)
## [1] 854  17
size <- 854
dat_LOY5$BPE <- rep("LOY5", size = size) # Tạo biến mới BPE
names(dat_LOY5)[names(dat_LOY5) == "LOY5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_LOY5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions LOY5
## 2 Students/Pupils Undergraduate <5millions LOY5
## 3 Students/Pupils Undergraduate <5millions LOY5
## 4 Students/Pupils Undergraduate <5millions LOY5
## 5 Students/Pupils Undergraduate <5millions LOY5
## 6 Students/Pupils   High.school <5millions LOY5
## Creat dat_LOY6 - cot 12 cua SEM
dat_LOY6 <- SEM [, c(1,2,3,4,5,6,7,56,85,86,87,88,89,90,91,92,93)]
head(dat_LOY6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime LOY6 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_LOY6)
## [1] 854  17
size <- 854
dat_LOY6$BPE <- rep("LOY6", size = size) # Tạo biến mới BPE
names(dat_LOY6)[names(dat_LOY6) == "LOY6"] <- "Res" # Đổi tên biến BST thành Res
head(dat_LOY6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions LOY6
## 2 Students/Pupils Undergraduate <5millions LOY6
## 3 Students/Pupils Undergraduate <5millions LOY6
## 4 Students/Pupils Undergraduate <5millions LOY6
## 5 Students/Pupils Undergraduate <5millions LOY6
## 6 Students/Pupils   High.school <5millions LOY6
## Creat dat_LOY7 - cot 13 cua SEM
dat_LOY7 <- SEM [, c(1,2,3,4,5,6,7,57,85,86,87,88,89,90,91,92,93)]
head(dat_LOY7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime LOY7 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_LOY7)
## [1] 854  17
size <- 854
dat_LOY7$BPE <- rep("LOY7", size = size) # Tạo biến mới BPE
names(dat_LOY7)[names(dat_LOY7) == "LOY7"] <- "Res" # Đổi tên biến BST thành Res
head(dat_LOY7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions LOY7
## 2 Students/Pupils Undergraduate <5millions LOY7
## 3 Students/Pupils Undergraduate <5millions LOY7
## 4 Students/Pupils Undergraduate <5millions LOY7
## 5 Students/Pupils Undergraduate <5millions LOY7
## 6 Students/Pupils   High.school <5millions LOY7
## Creat dat_IMA1 - cot 7 cua SEM
dat_IMA1 <- SEM [, c(1,2,3,4,5,6,7,58,85,86,87,88,89,90,91,92,93)]
head(dat_IMA1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime IMA1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_IMA1)
## [1] 854  17
size <- 854
dat_IMA1$BPE <- rep("IMA1", size = size) # Tạo biến mới BPE
names(dat_IMA1)[names(dat_IMA1) == "IMA1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_IMA1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions IMA1
## 2 Students/Pupils Undergraduate <5millions IMA1
## 3 Students/Pupils Undergraduate <5millions IMA1
## 4 Students/Pupils Undergraduate <5millions IMA1
## 5 Students/Pupils Undergraduate <5millions IMA1
## 6 Students/Pupils   High.school <5millions IMA1
## Creat dat_IMA2 - cot 8 cua SEM
dat_IMA2 <- SEM [, c(1,2,3,4,5,6,7,59,85,86,87,88,89,90,91,92,93)]
head(dat_IMA2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime IMA2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_IMA2)
## [1] 854  17
size <- 854
dat_IMA2$BPE <- rep("IMA2", size = size) # Tạo biến mới BPE
names(dat_IMA2)[names(dat_IMA2) == "IMA2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_IMA2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   3   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions IMA2
## 2 Students/Pupils Undergraduate <5millions IMA2
## 3 Students/Pupils Undergraduate <5millions IMA2
## 4 Students/Pupils Undergraduate <5millions IMA2
## 5 Students/Pupils Undergraduate <5millions IMA2
## 6 Students/Pupils   High.school <5millions IMA2
## Creat dat_IMA3 - cot 9 cua SEM
dat_IMA3 <- SEM [, c(1,2,3,4,5,6,7,60,85,86,87,88,89,90,91,92,93)]
head(dat_IMA3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime IMA3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    5   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_IMA3)
## [1] 854  17
size <- 854
dat_IMA3$BPE <- rep("IMA3", size = size) # Tạo biến mới BPE
names(dat_IMA3)[names(dat_IMA3) == "IMA3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_IMA3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   5   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions IMA3
## 2 Students/Pupils Undergraduate <5millions IMA3
## 3 Students/Pupils Undergraduate <5millions IMA3
## 4 Students/Pupils Undergraduate <5millions IMA3
## 5 Students/Pupils Undergraduate <5millions IMA3
## 6 Students/Pupils   High.school <5millions IMA3
## Creat dat_IMA4 - cot 10 cua SEM
dat_IMA4 <- SEM [, c(1,2,3,4,5,6,7,61,85,86,87,88,89,90,91,92,93)]
head(dat_IMA4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime IMA4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_IMA4)
## [1] 854  17
size <- 854
dat_IMA4$BPE <- rep("IMA4", size = size) # Tạo biến mới BPE
names(dat_IMA4)[names(dat_IMA4) == "IMA4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_IMA4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions IMA4
## 2 Students/Pupils Undergraduate <5millions IMA4
## 3 Students/Pupils Undergraduate <5millions IMA4
## 4 Students/Pupils Undergraduate <5millions IMA4
## 5 Students/Pupils Undergraduate <5millions IMA4
## 6 Students/Pupils   High.school <5millions IMA4
## Creat dat_IMA5 - cot 11 cua SEM
dat_IMA5 <- SEM [, c(1,2,3,4,5,6,7,62,85,86,87,88,89,90,91,92,93)]
head(dat_IMA5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime IMA5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_IMA5)
## [1] 854  17
size <- 854
dat_IMA5$BPE <- rep("IMA5", size = size) # Tạo biến mới BPE
names(dat_IMA5)[names(dat_IMA5) == "IMA5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_IMA5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions IMA5
## 2 Students/Pupils Undergraduate <5millions IMA5
## 3 Students/Pupils Undergraduate <5millions IMA5
## 4 Students/Pupils Undergraduate <5millions IMA5
## 5 Students/Pupils Undergraduate <5millions IMA5
## 6 Students/Pupils   High.school <5millions IMA5
## Creat dat_PHB1 - cot 7 cua SEM
dat_PHB1 <- SEM [, c(1,2,3,4,5,6,7,63,85,86,87,88,89,90,91,92,93)]
head(dat_PHB1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PHB1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    5   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PHB1)
## [1] 854  17
size <- 854
dat_PHB1$BPE <- rep("PHB1", size = size) # Tạo biến mới BPE
names(dat_PHB1)[names(dat_PHB1) == "PHB1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PHB1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   5   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PHB1
## 2 Students/Pupils Undergraduate <5millions PHB1
## 3 Students/Pupils Undergraduate <5millions PHB1
## 4 Students/Pupils Undergraduate <5millions PHB1
## 5 Students/Pupils Undergraduate <5millions PHB1
## 6 Students/Pupils   High.school <5millions PHB1
## Creat dat_PHB2 - cot 8 cua SEM
dat_PHB2 <- SEM [, c(1,2,3,4,5,6,7,64,85,86,87,88,89,90,91,92,93)]
head(dat_PHB2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PHB2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    7   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PHB2)
## [1] 854  17
size <- 854
dat_PHB2$BPE <- rep("PHB2", size = size) # Tạo biến mới BPE
names(dat_PHB2)[names(dat_PHB2) == "PHB2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PHB2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   7   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PHB2
## 2 Students/Pupils Undergraduate <5millions PHB2
## 3 Students/Pupils Undergraduate <5millions PHB2
## 4 Students/Pupils Undergraduate <5millions PHB2
## 5 Students/Pupils Undergraduate <5millions PHB2
## 6 Students/Pupils   High.school <5millions PHB2
## Creat dat_PHB3 - cot 9 cua SEM
dat_PHB3 <- SEM [, c(1,2,3,4,5,6,7,65,85,86,87,88,89,90,91,92,93)]
head(dat_PHB3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PHB3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    7   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PHB3)
## [1] 854  17
size <- 854
dat_PHB3$BPE <- rep("PHB3", size = size) # Tạo biến mới BPE
names(dat_PHB3)[names(dat_PHB3) == "PHB3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PHB3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   7   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PHB3
## 2 Students/Pupils Undergraduate <5millions PHB3
## 3 Students/Pupils Undergraduate <5millions PHB3
## 4 Students/Pupils Undergraduate <5millions PHB3
## 5 Students/Pupils Undergraduate <5millions PHB3
## 6 Students/Pupils   High.school <5millions PHB3
## Creat dat_PHB4 - cot 10 cua SEM
dat_PHB4 <- SEM [, c(1,2,3,4,5,6,7,66,85,86,87,88,89,90,91,92,93)]
head(dat_PHB4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PHB4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    7   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PHB4)
## [1] 854  17
size <- 854
dat_PHB4$BPE <- rep("PHB4", size = size) # Tạo biến mới BPE
names(dat_PHB4)[names(dat_PHB4) == "PHB4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PHB4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   7   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PHB4
## 2 Students/Pupils Undergraduate <5millions PHB4
## 3 Students/Pupils Undergraduate <5millions PHB4
## 4 Students/Pupils Undergraduate <5millions PHB4
## 5 Students/Pupils Undergraduate <5millions PHB4
## 6 Students/Pupils   High.school <5millions PHB4
## Creat dat_PHB5 - cot 11 cua SEM
dat_PHB5 <- SEM [, c(1,2,3,4,5,6,7,67,85,86,87,88,89,90,91,92,93)]
head(dat_PHB5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PHB5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    7   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PHB5)
## [1] 854  17
size <- 854
dat_PHB5$BPE <- rep("PHB5", size = size) # Tạo biến mới BPE
names(dat_PHB5)[names(dat_PHB5) == "PHB5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PHB5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   7   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PHB5
## 2 Students/Pupils Undergraduate <5millions PHB5
## 3 Students/Pupils Undergraduate <5millions PHB5
## 4 Students/Pupils Undergraduate <5millions PHB5
## 5 Students/Pupils Undergraduate <5millions PHB5
## 6 Students/Pupils   High.school <5millions PHB5
## Creat dat_PEB1 - cot 7 cua SEM
dat_PEB1 <- SEM [, c(1,2,3,4,5,6,7,68,85,86,87,88,89,90,91,92,93)]
head(dat_PEB1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PEB1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    7   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PEB1)
## [1] 854  17
size <- 854
dat_PEB1$BPE <- rep("PEB1", size = size) # Tạo biến mới BPE
names(dat_PEB1)[names(dat_PEB1) == "PEB1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PEB1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   7   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PEB1
## 2 Students/Pupils Undergraduate <5millions PEB1
## 3 Students/Pupils Undergraduate <5millions PEB1
## 4 Students/Pupils Undergraduate <5millions PEB1
## 5 Students/Pupils Undergraduate <5millions PEB1
## 6 Students/Pupils   High.school <5millions PEB1
## Creat dat_PEB2 - cot 8 cua SEM
dat_PEB2 <- SEM [, c(1,2,3,4,5,6,7,69,85,86,87,88,89,90,91,92,93)]
head(dat_PEB2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PEB2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    5   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    7   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PEB2)
## [1] 854  17
size <- 854
dat_PEB2$BPE <- rep("PEB2", size = size) # Tạo biến mới BPE
names(dat_PEB2)[names(dat_PEB2) == "PEB2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PEB2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   5   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   7   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PEB2
## 2 Students/Pupils Undergraduate <5millions PEB2
## 3 Students/Pupils Undergraduate <5millions PEB2
## 4 Students/Pupils Undergraduate <5millions PEB2
## 5 Students/Pupils Undergraduate <5millions PEB2
## 6 Students/Pupils   High.school <5millions PEB2
## Creat dat_PEB3 - cot 9 cua SEM
dat_PEB3 <- SEM [, c(1,2,3,4,5,6,7,70,85,86,87,88,89,90,91,92,93)]
head(dat_PEB3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PEB3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    6   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PEB3)
## [1] 854  17
size <- 854
dat_PEB3$BPE <- rep("PEB3", size = size) # Tạo biến mới BPE
names(dat_PEB3)[names(dat_PEB3) == "PEB3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PEB3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   6   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PEB3
## 2 Students/Pupils Undergraduate <5millions PEB3
## 3 Students/Pupils Undergraduate <5millions PEB3
## 4 Students/Pupils Undergraduate <5millions PEB3
## 5 Students/Pupils Undergraduate <5millions PEB3
## 6 Students/Pupils   High.school <5millions PEB3
## Creat dat_PEB4 - cot 10 cua SEM
dat_PEB4 <- SEM [, c(1,2,3,4,5,6,7,71,85,86,87,88,89,90,91,92,93)]
head(dat_PEB4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PEB4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PEB4)
## [1] 854  17
size <- 854
dat_PEB4$BPE <- rep("PEB4", size = size) # Tạo biến mới BPE
names(dat_PEB4)[names(dat_PEB4) == "PEB4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PEB4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PEB4
## 2 Students/Pupils Undergraduate <5millions PEB4
## 3 Students/Pupils Undergraduate <5millions PEB4
## 4 Students/Pupils Undergraduate <5millions PEB4
## 5 Students/Pupils Undergraduate <5millions PEB4
## 6 Students/Pupils   High.school <5millions PEB4
## Creat dat_PDE1 - cot 7 cua SEM
dat_PDE1 <- SEM [, c(1,2,3,4,5,6,7,72,85,86,87,88,89,90,91,92,93)]
head(dat_PDE1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PDE1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    3   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PDE1)
## [1] 854  17
size <- 854
dat_PDE1$BPE <- rep("PDE1", size = size) # Tạo biến mới BPE
names(dat_PDE1)[names(dat_PDE1) == "PDE1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PDE1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   3   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PDE1
## 2 Students/Pupils Undergraduate <5millions PDE1
## 3 Students/Pupils Undergraduate <5millions PDE1
## 4 Students/Pupils Undergraduate <5millions PDE1
## 5 Students/Pupils Undergraduate <5millions PDE1
## 6 Students/Pupils   High.school <5millions PDE1
## Creat dat_PDE2 - cot 8 cua SEM
dat_PDE2 <- SEM [, c(1,2,3,4,5,6,7,73,85,86,87,88,89,90,91,92,93)]
head(dat_PDE2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PDE2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    5   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PDE2)
## [1] 854  17
size <- 854
dat_PDE2$BPE <- rep("PDE2", size = size) # Tạo biến mới BPE
names(dat_PDE2)[names(dat_PDE2) == "PDE2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PDE2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   5   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PDE2
## 2 Students/Pupils Undergraduate <5millions PDE2
## 3 Students/Pupils Undergraduate <5millions PDE2
## 4 Students/Pupils Undergraduate <5millions PDE2
## 5 Students/Pupils Undergraduate <5millions PDE2
## 6 Students/Pupils   High.school <5millions PDE2
## Creat dat_PDE3 - cot 9 cua SEM
dat_PDE3 <- SEM [, c(1,2,3,4,5,6,7,74,85,86,87,88,89,90,91,92,93)]
head(dat_PDE3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PDE3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PDE3)
## [1] 854  17
size <- 854
dat_PDE3$BPE <- rep("PDE3", size = size) # Tạo biến mới BPE
names(dat_PDE3)[names(dat_PDE3) == "PDE3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PDE3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PDE3
## 2 Students/Pupils Undergraduate <5millions PDE3
## 3 Students/Pupils Undergraduate <5millions PDE3
## 4 Students/Pupils Undergraduate <5millions PDE3
## 5 Students/Pupils Undergraduate <5millions PDE3
## 6 Students/Pupils   High.school <5millions PDE3
## Creat dat_PDE4 - cot 10 cua SEM
dat_PDE4 <- SEM [, c(1,2,3,4,5,6,7,75,85,86,87,88,89,90,91,92,93)]
head(dat_PDE4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PDE4 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PDE4)
## [1] 854  17
size <- 854
dat_PDE4$BPE <- rep("PDE4", size = size) # Tạo biến mới BPE
names(dat_PDE4)[names(dat_PDE4) == "PDE4"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PDE4)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PDE4
## 2 Students/Pupils Undergraduate <5millions PDE4
## 3 Students/Pupils Undergraduate <5millions PDE4
## 4 Students/Pupils Undergraduate <5millions PDE4
## 5 Students/Pupils Undergraduate <5millions PDE4
## 6 Students/Pupils   High.school <5millions PDE4
## Creat dat_PDE5 - cot 11 cua SEM
dat_PDE5 <- SEM [, c(1,2,3,4,5,6,7,76,85,86,87,88,89,90,91,92,93)]
head(dat_PDE5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PDE5 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    2   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    5   Never    Ever  Never   Ever   Male        Single
## 6       2.00    1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PDE5)
## [1] 854  17
size <- 854
dat_PDE5$BPE <- rep("PDE5", size = size) # Tạo biến mới BPE
names(dat_PDE5)[names(dat_PDE5) == "PDE5"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PDE5)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   2   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   1   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PDE5
## 2 Students/Pupils Undergraduate <5millions PDE5
## 3 Students/Pupils Undergraduate <5millions PDE5
## 4 Students/Pupils Undergraduate <5millions PDE5
## 5 Students/Pupils Undergraduate <5millions PDE5
## 6 Students/Pupils   High.school <5millions PDE5
## Creat dat_PDE6 - cot 12 cua SEM
dat_PDE6 <- SEM [, c(1,2,3,4,5,6,7,77,85,86,87,88,89,90,91,92,93)]
head(dat_PDE6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PDE6 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    4   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PDE6)
## [1] 854  17
size <- 854
dat_PDE6$BPE <- rep("PDE6", size = size) # Tạo biến mới BPE
names(dat_PDE6)[names(dat_PDE6) == "PDE6"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PDE6)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PDE6
## 2 Students/Pupils Undergraduate <5millions PDE6
## 3 Students/Pupils Undergraduate <5millions PDE6
## 4 Students/Pupils Undergraduate <5millions PDE6
## 5 Students/Pupils Undergraduate <5millions PDE6
## 6 Students/Pupils   High.school <5millions PDE6
## Creat dat_PDE7 - cot 13 cua SEM
dat_PDE7 <- SEM [, c(1,2,3,4,5,6,7,78,85,86,87,88,89,90,91,92,93)]
head(dat_PDE7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PDE7 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PDE7)
## [1] 854  17
size <- 854
dat_PDE7$BPE <- rep("PDE7", size = size) # Tạo biến mới BPE
names(dat_PDE7)[names(dat_PDE7) == "PDE7"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PDE7)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PDE7
## 2 Students/Pupils Undergraduate <5millions PDE7
## 3 Students/Pupils Undergraduate <5millions PDE7
## 4 Students/Pupils Undergraduate <5millions PDE7
## 5 Students/Pupils Undergraduate <5millions PDE7
## 6 Students/Pupils   High.school <5millions PDE7
## Creat dat_PSO1 - cot 7 cua SEM
dat_PSO1 <- SEM [, c(1,2,3,4,5,6,7,79,85,86,87,88,89,90,91,92,93)]
head(dat_PSO1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSO1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSO1)
## [1] 854  17
size <- 854
dat_PSO1$BPE <- rep("PSO1", size = size) # Tạo biến mới BPE
names(dat_PSO1)[names(dat_PSO1) == "PSO1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSO1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSO1
## 2 Students/Pupils Undergraduate <5millions PSO1
## 3 Students/Pupils Undergraduate <5millions PSO1
## 4 Students/Pupils Undergraduate <5millions PSO1
## 5 Students/Pupils Undergraduate <5millions PSO1
## 6 Students/Pupils   High.school <5millions PSO1
## Creat dat_PSO2 - cot 8 cua SEM
dat_PSO2 <- SEM [, c(1,2,3,4,5,6,7,80,85,86,87,88,89,90,91,92,93)]
head(dat_PSO2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSO2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSO2)
## [1] 854  17
size <- 854
dat_PSO2$BPE <- rep("PSO2", size = size) # Tạo biến mới BPE
names(dat_PSO2)[names(dat_PSO2) == "PSO2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSO2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSO2
## 2 Students/Pupils Undergraduate <5millions PSO2
## 3 Students/Pupils Undergraduate <5millions PSO2
## 4 Students/Pupils Undergraduate <5millions PSO2
## 5 Students/Pupils Undergraduate <5millions PSO2
## 6 Students/Pupils   High.school <5millions PSO2
## Creat dat_PSO3 - cot 9 cua SEM
dat_PSO3 <- SEM [, c(1,2,3,4,5,6,7,81,85,86,87,88,89,90,91,92,93)]
head(dat_PSO3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PSO3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    4   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    4   Never    Ever  Never   Ever   Male        Single
## 6       2.00    2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PSO3)
## [1] 854  17
size <- 854
dat_PSO3$BPE <- rep("PSO3", size = size) # Tạo biến mới BPE
names(dat_PSO3)[names(dat_PSO3) == "PSO3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PSO3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   4   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSO3
## 2 Students/Pupils Undergraduate <5millions PSO3
## 3 Students/Pupils Undergraduate <5millions PSO3
## 4 Students/Pupils Undergraduate <5millions PSO3
## 5 Students/Pupils Undergraduate <5millions PSO3
## 6 Students/Pupils   High.school <5millions PSO3
## Creat dat_PVA1 - cot 7 cua SEM
dat_PVA1 <- SEM [, c(1,2,3,4,5,6,7,82,85,86,87,88,89,90,91,92,93)]
head(dat_PVA1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PVA1 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    6   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    6   Never    Ever  Never   Ever   Male        Single
## 6       2.00    6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PVA1)
## [1] 854  17
size <- 854
dat_PVA1$BPE <- rep("PVA1", size = size) # Tạo biến mới BPE
names(dat_PVA1)[names(dat_PVA1) == "PVA1"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PVA1)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   6   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   6   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PVA1
## 2 Students/Pupils Undergraduate <5millions PVA1
## 3 Students/Pupils Undergraduate <5millions PVA1
## 4 Students/Pupils Undergraduate <5millions PVA1
## 5 Students/Pupils Undergraduate <5millions PVA1
## 6 Students/Pupils   High.school <5millions PVA1
## Creat dat_PVA2 - cot 8 cua SEM
dat_PVA2 <- SEM [, c(1,2,3,4,5,6,7,83,85,86,87,88,89,90,91,92,93)]
head(dat_PVA2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PVA2 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    5   Never   Never   Ever  Never Female        Single
## 3       0.17    2   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    2   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PVA2)
## [1] 854  17
size <- 854
dat_PVA2$BPE <- rep("PVA2", size = size) # Tạo biến mới BPE
names(dat_PVA2)[names(dat_PVA2) == "PVA2"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PVA2)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   5   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   2   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PVA2
## 2 Students/Pupils Undergraduate <5millions PVA2
## 3 Students/Pupils Undergraduate <5millions PVA2
## 4 Students/Pupils Undergraduate <5millions PVA2
## 5 Students/Pupils Undergraduate <5millions PVA2
## 6 Students/Pupils   High.school <5millions PVA2
## Creat dat_PVA3 - cot 9 cua SEM
dat_PVA3 <- SEM [, c(1,2,3,4,5,6,7,84,85,86,87,88,89,90,91,92,93)]
head(dat_PVA3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime PVA3 EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00    6   Never    Ever  Never   Ever Female        Single
## 2       2.00    3   Never   Never   Ever  Never Female        Single
## 3       0.17    4   Never   Never  Never  Never   Male        Single
## 4       4.00    5   Never    Ever  Never   Ever   Male        Single
## 5       2.00    3   Never    Ever  Never   Ever   Male        Single
## 6       2.00    5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income
## 1 Students/Pupils Undergraduate <5millions
## 2 Students/Pupils Undergraduate <5millions
## 3 Students/Pupils Undergraduate <5millions
## 4 Students/Pupils Undergraduate <5millions
## 5 Students/Pupils Undergraduate <5millions
## 6 Students/Pupils   High.school <5millions
dim(dat_PVA3)
## [1] 854  17
size <- 854
dat_PVA3$BPE <- rep("PVA3", size = size) # Tạo biến mới BPE
names(dat_PVA3)[names(dat_PVA3) == "PVA3"] <- "Res" # Đổi tên biến BST thành Res
head(dat_PVA3)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   5   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PVA3
## 2 Students/Pupils Undergraduate <5millions PVA3
## 3 Students/Pupils Undergraduate <5millions PVA3
## 4 Students/Pupils Undergraduate <5millions PVA3
## 5 Students/Pupils Undergraduate <5millions PVA3
## 6 Students/Pupils   High.school <5millions PVA3
## Tạo dữ liệu likert từ 28 dữ liệu: dat_PSW1-7, dat_PSS1-7, dat_PSB1-8, dat_PQT1-4, dat_PQC1-5, dat_PQP1-4, dat_PQR1-5, dat_SAT1-3, dat_LOY1-7, dat_IMA1-5, dat_PHB1-5, dat_PEB1-4, dat_PDE1-7, dat_PSO1-3, dat_PVA1-3 
B.Per <- rbind(dat_PSW1, dat_PSW2, dat_PSW3, dat_PSW4, dat_PSW5, dat_PSW6, dat_PSW7,dat_PSS1, dat_PSS2, dat_PSS3, dat_PSS4, dat_PSS5, dat_PSS6, dat_PSS7, dat_PSB1, dat_PSB2, dat_PSB3, dat_PSB4, dat_PSB5, dat_PSB6, dat_PSB7, dat_PSB8, dat_PQT1, dat_PQT2, dat_PQT3, dat_PQT4, dat_PQC1, dat_PQC2, dat_PQC3, dat_PQC4, dat_PQC5, dat_PQP1, dat_PQP2, dat_PQP3, dat_PQP4, dat_PQR1, dat_PQR2, dat_PQR3, dat_PQR4, dat_PQR5, dat_SAT1, dat_SAT2, dat_SAT3, dat_LOY1, dat_LOY2, dat_LOY3, dat_LOY4, dat_LOY5, dat_LOY6, dat_LOY7, dat_IMA1, dat_IMA2, dat_IMA3, dat_IMA4, dat_IMA5, dat_PHB1, dat_PHB2, dat_PHB3, dat_PHB4, dat_PHB5, dat_PEB1, dat_PEB2, dat_PEB3, dat_PEB4, dat_PDE1, dat_PDE2, dat_PDE3, dat_PDE4, dat_PDE5, dat_PDE6, dat_PDE7, dat_PSO1, dat_PSO2, dat_PSO3, dat_PVA1, dat_PVA2, dat_PVA3)
head(B.Per)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW1
## 2 Students/Pupils Undergraduate <5millions PSW1
## 3 Students/Pupils Undergraduate <5millions PSW1
## 4 Students/Pupils Undergraduate <5millions PSW1
## 5 Students/Pupils Undergraduate <5millions PSW1
## 6 Students/Pupils   High.school <5millions PSW1
str(B.Per)
## 'data.frame':    65758 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  4 2 4 5 3 2 1 2 3 4 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(B.Per)
## [1] 65758    18
## Tạo dữ liệu likert theo constructs
B.Per_PSA <- rbind(dat_PSW1, dat_PSW2, dat_PSW3, dat_PSW4, dat_PSW5, dat_PSW6, dat_PSW7, dat_PSS1, dat_PSS2, dat_PSS3, dat_PSS4, dat_PSS5, dat_PSS6, dat_PSS7, dat_PSB1, dat_PSB2, dat_PSB3, dat_PSB4, dat_PSB5, dat_PSB6, dat_PSB7, dat_PSB8)
head(B.Per_PSA)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW1
## 2 Students/Pupils Undergraduate <5millions PSW1
## 3 Students/Pupils Undergraduate <5millions PSW1
## 4 Students/Pupils Undergraduate <5millions PSW1
## 5 Students/Pupils Undergraduate <5millions PSW1
## 6 Students/Pupils   High.school <5millions PSW1
str(B.Per_PSA)
## 'data.frame':    18788 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  4 2 4 5 3 2 1 2 3 4 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(B.Per_PSA)
## [1] 18788    18
B.Per_PSQ <- rbind(dat_PQT1, dat_PQT2, dat_PQT3, dat_PQT4, dat_PQC1, dat_PQC2, dat_PQC3, dat_PQC4, dat_PQC5, dat_PQP1, dat_PQP2, dat_PQP3, dat_PQP4, dat_PQR1, dat_PQR2, dat_PQR3, dat_PQR4, dat_PQR5)
head(B.Per_PSQ)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQT1
## 2 Students/Pupils Undergraduate <5millions PQT1
## 3 Students/Pupils Undergraduate <5millions PQT1
## 4 Students/Pupils Undergraduate <5millions PQT1
## 5 Students/Pupils Undergraduate <5millions PQT1
## 6 Students/Pupils   High.school <5millions PQT1
str(B.Per_PSQ)
## 'data.frame':    15372 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  6 4 2 6 6 4 2 5 5 7 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PQT1" "PQT1" "PQT1" "PQT1" ...
dim(B.Per_PSQ)
## [1] 15372    18
B.Per_S <- rbind(dat_PHB1, dat_PHB2, dat_PHB3, dat_PHB4, dat_PHB5, dat_PEB1, dat_PEB2, dat_PEB3, dat_PEB4, dat_PDE1, dat_PDE2, dat_PDE3, dat_PDE4, dat_PDE5, dat_PDE6, dat_PDE7, dat_PSO1, dat_PSO2, dat_PSO3)
head(B.Per_S)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   5   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PHB1
## 2 Students/Pupils Undergraduate <5millions PHB1
## 3 Students/Pupils Undergraduate <5millions PHB1
## 4 Students/Pupils Undergraduate <5millions PHB1
## 5 Students/Pupils Undergraduate <5millions PHB1
## 6 Students/Pupils   High.school <5millions PHB1
str(B.Per_S)
## 'data.frame':    16226 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  6 3 5 5 5 4 3 6 6 7 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PHB1" "PHB1" "PHB1" "PHB1" ...
dim(B.Per_S)
## [1] 16226    18
B.Per_OR <- rbind(dat_IMA1, dat_IMA2, dat_IMA3, dat_IMA4, dat_IMA5, dat_PVA1, dat_PVA2, dat_PVA3, dat_SAT1, dat_SAT2, dat_SAT3, dat_LOY1, dat_LOY2, dat_LOY3, dat_LOY4, dat_LOY5, dat_LOY6, dat_LOY7)
head(B.Per_OR)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions IMA1
## 2 Students/Pupils Undergraduate <5millions IMA1
## 3 Students/Pupils Undergraduate <5millions IMA1
## 4 Students/Pupils Undergraduate <5millions IMA1
## 5 Students/Pupils Undergraduate <5millions IMA1
## 6 Students/Pupils   High.school <5millions IMA1
str(B.Per_OR)
## 'data.frame':    15372 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  6 4 4 5 5 4 2 6 5 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "IMA1" "IMA1" "IMA1" "IMA1" ...
dim(B.Per_OR)
## [1] 15372    18
# Data Bus perception of people in Da Nang
DN_SEM = subset(B.Per, CITY == "DaNang")
head(DN_SEM)
##       AGE   CITY                    FRE TripPurpose Departure    TimeUseonBus
## 449 26-35 DaNang          >=3 days/week     Working    Normal Using.telephone
## 450 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 451 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 452 26-35 DaNang 2days/month-2days/week     Working Peak-Hour Using.telephone
## 453 46-55 DaNang          >=3 days/week     Working Peak-Hour          Others
## 454 16-25 DaNang          >=3 days/week     Working Peak-Hour Using.telephone
##     TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 449        2.0   6   Never   Never  Never  Never   Male       Married
## 450        1.5   6   Never   Never  Never  Never Female       Married
## 451        2.0   6   Never   Never  Never  Never Female       Married
## 452        1.0   1   Never   Never  Never  Never Female       Married
## 453        2.0   6   Never   Never  Never  Never Female       Married
## 454        1.0   6   Never   Never  Never  Never Female        Single
##        Occupation     Education       Income  BPE
## 449 Full.time.job Undergraduate 5-10millions PSW1
## 450 Full.time.job Undergraduate   <5millions PSW1
## 451 Full.time.job Undergraduate   <5millions PSW1
## 452 Full.time.job   High.school 5-10millions PSW1
## 453 Full.time.job   High.school 5-10millions PSW1
## 454 Full.time.job  Postgraduate 5-10millions PSW1
str(DN_SEM)
## 'data.frame':    31262 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 2 4 4 2 4 1 1 2 1 2 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 1 1 1 1 1 1 1 1 1 1 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 1 1 2 1 1 1 1 1 2 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 1 1 1 1 1 1 1 1 2 5 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 2 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 1 4 4 1 6 1 1 1 3 4 ...
##  $ TravelTime   : num  2 1.5 2 1 2 1 1 0.5 1 1.33 ...
##  $ Res          : int  6 6 6 1 6 6 6 7 6 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 2 1 1 1 1 1 1 2 2 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 1 1 1 1 1 2 2 2 2 1 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 2 2 2 2 2 2 2 2 1 2 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 3 3 4 3 4 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 2 1 1 2 2 2 2 4 1 3 ...
##  $ BPE          : chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(DN_SEM)
## [1] 31262    18
DN_SEM = DN_SEM[ , c(8, 18)]
dim(DN_SEM)
## [1] 31262     2
head(DN_SEM)
##     Res  BPE
## 449   6 PSW1
## 450   6 PSW1
## 451   6 PSW1
## 452   1 PSW1
## 453   6 PSW1
## 454   6 PSW1
DN_SEM_PSA = subset(B.Per_PSA, CITY == "DaNang")
head(DN_SEM_PSA)
##       AGE   CITY                    FRE TripPurpose Departure    TimeUseonBus
## 449 26-35 DaNang          >=3 days/week     Working    Normal Using.telephone
## 450 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 451 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 452 26-35 DaNang 2days/month-2days/week     Working Peak-Hour Using.telephone
## 453 46-55 DaNang          >=3 days/week     Working Peak-Hour          Others
## 454 16-25 DaNang          >=3 days/week     Working Peak-Hour Using.telephone
##     TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 449        2.0   6   Never   Never  Never  Never   Male       Married
## 450        1.5   6   Never   Never  Never  Never Female       Married
## 451        2.0   6   Never   Never  Never  Never Female       Married
## 452        1.0   1   Never   Never  Never  Never Female       Married
## 453        2.0   6   Never   Never  Never  Never Female       Married
## 454        1.0   6   Never   Never  Never  Never Female        Single
##        Occupation     Education       Income  BPE
## 449 Full.time.job Undergraduate 5-10millions PSW1
## 450 Full.time.job Undergraduate   <5millions PSW1
## 451 Full.time.job Undergraduate   <5millions PSW1
## 452 Full.time.job   High.school 5-10millions PSW1
## 453 Full.time.job   High.school 5-10millions PSW1
## 454 Full.time.job  Postgraduate 5-10millions PSW1
str(DN_SEM_PSA)
## 'data.frame':    8932 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 2 4 4 2 4 1 1 2 1 2 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 1 1 1 1 1 1 1 1 1 1 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 1 1 2 1 1 1 1 1 2 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 1 1 1 1 1 1 1 1 2 5 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 2 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 1 4 4 1 6 1 1 1 3 4 ...
##  $ TravelTime   : num  2 1.5 2 1 2 1 1 0.5 1 1.33 ...
##  $ Res          : int  6 6 6 1 6 6 6 7 6 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 2 1 1 1 1 1 1 2 2 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 1 1 1 1 1 2 2 2 2 1 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 2 2 2 2 2 2 2 2 1 2 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 3 3 4 3 4 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 2 1 1 2 2 2 2 4 1 3 ...
##  $ BPE          : chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(DN_SEM_PSA)
## [1] 8932   18
DN_SEM_PSA = DN_SEM_PSA[ , c(8, 18)]
dim(DN_SEM_PSA)
## [1] 8932    2
head(DN_SEM_PSA)
##     Res  BPE
## 449   6 PSW1
## 450   6 PSW1
## 451   6 PSW1
## 452   1 PSW1
## 453   6 PSW1
## 454   6 PSW1
DN_SEM_PSQ = subset(B.Per_PSQ, CITY == "DaNang")
head(DN_SEM_PSQ)
##       AGE   CITY                    FRE TripPurpose Departure    TimeUseonBus
## 449 26-35 DaNang          >=3 days/week     Working    Normal Using.telephone
## 450 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 451 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 452 26-35 DaNang 2days/month-2days/week     Working Peak-Hour Using.telephone
## 453 46-55 DaNang          >=3 days/week     Working Peak-Hour          Others
## 454 16-25 DaNang          >=3 days/week     Working Peak-Hour Using.telephone
##     TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 449        2.0   6   Never   Never  Never  Never   Male       Married
## 450        1.5   6   Never   Never  Never  Never Female       Married
## 451        2.0   6   Never   Never  Never  Never Female       Married
## 452        1.0   6   Never   Never  Never  Never Female       Married
## 453        2.0   6   Never   Never  Never  Never Female       Married
## 454        1.0   5   Never   Never  Never  Never Female        Single
##        Occupation     Education       Income  BPE
## 449 Full.time.job Undergraduate 5-10millions PQT1
## 450 Full.time.job Undergraduate   <5millions PQT1
## 451 Full.time.job Undergraduate   <5millions PQT1
## 452 Full.time.job   High.school 5-10millions PQT1
## 453 Full.time.job   High.school 5-10millions PQT1
## 454 Full.time.job  Postgraduate 5-10millions PQT1
str(DN_SEM_PSQ)
## 'data.frame':    7308 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 2 4 4 2 4 1 1 2 1 2 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 1 1 1 1 1 1 1 1 1 1 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 1 1 2 1 1 1 1 1 2 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 1 1 1 1 1 1 1 1 2 5 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 2 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 1 4 4 1 6 1 1 1 3 4 ...
##  $ TravelTime   : num  2 1.5 2 1 2 1 1 0.5 1 1.33 ...
##  $ Res          : int  6 6 6 6 6 5 6 7 6 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 2 1 1 1 1 1 1 2 2 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 1 1 1 1 1 2 2 2 2 1 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 2 2 2 2 2 2 2 2 1 2 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 3 3 4 3 4 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 2 1 1 2 2 2 2 4 1 3 ...
##  $ BPE          : chr  "PQT1" "PQT1" "PQT1" "PQT1" ...
dim(DN_SEM_PSQ)
## [1] 7308   18
DN_SEM_PSQ = DN_SEM_PSQ[ , c(8, 18)]
dim(DN_SEM_PSQ)
## [1] 7308    2
head(DN_SEM_PSQ)
##     Res  BPE
## 449   6 PQT1
## 450   6 PQT1
## 451   6 PQT1
## 452   6 PQT1
## 453   6 PQT1
## 454   5 PQT1
DN_SEM_S = subset(B.Per_S, CITY == "DaNang")
head(DN_SEM_S)
##       AGE   CITY                    FRE TripPurpose Departure    TimeUseonBus
## 449 26-35 DaNang          >=3 days/week     Working    Normal Using.telephone
## 450 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 451 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 452 26-35 DaNang 2days/month-2days/week     Working Peak-Hour Using.telephone
## 453 46-55 DaNang          >=3 days/week     Working Peak-Hour          Others
## 454 16-25 DaNang          >=3 days/week     Working Peak-Hour Using.telephone
##     TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 449        2.0   5   Never   Never  Never  Never   Male       Married
## 450        1.5   5   Never   Never  Never  Never Female       Married
## 451        2.0   5   Never   Never  Never  Never Female       Married
## 452        1.0   5   Never   Never  Never  Never Female       Married
## 453        2.0   6   Never   Never  Never  Never Female       Married
## 454        1.0   6   Never   Never  Never  Never Female        Single
##        Occupation     Education       Income  BPE
## 449 Full.time.job Undergraduate 5-10millions PHB1
## 450 Full.time.job Undergraduate   <5millions PHB1
## 451 Full.time.job Undergraduate   <5millions PHB1
## 452 Full.time.job   High.school 5-10millions PHB1
## 453 Full.time.job   High.school 5-10millions PHB1
## 454 Full.time.job  Postgraduate 5-10millions PHB1
str(DN_SEM_S)
## 'data.frame':    7714 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 2 4 4 2 4 1 1 2 1 2 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 1 1 1 1 1 1 1 1 1 1 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 1 1 2 1 1 1 1 1 2 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 1 1 1 1 1 1 1 1 2 5 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 2 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 1 4 4 1 6 1 1 1 3 4 ...
##  $ TravelTime   : num  2 1.5 2 1 2 1 1 0.5 1 1.33 ...
##  $ Res          : int  5 5 5 5 6 6 5 7 5 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 2 1 1 1 1 1 1 2 2 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 1 1 1 1 1 2 2 2 2 1 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 2 2 2 2 2 2 2 2 1 2 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 3 3 4 3 4 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 2 1 1 2 2 2 2 4 1 3 ...
##  $ BPE          : chr  "PHB1" "PHB1" "PHB1" "PHB1" ...
dim(DN_SEM_S)
## [1] 7714   18
DN_SEM_S = DN_SEM_S[ , c(8, 18)]
dim(DN_SEM_S)
## [1] 7714    2
head(DN_SEM_S)
##     Res  BPE
## 449   5 PHB1
## 450   5 PHB1
## 451   5 PHB1
## 452   5 PHB1
## 453   6 PHB1
## 454   6 PHB1
DN_SEM_OR = subset(B.Per_OR, CITY == "DaNang")
head(DN_SEM_OR)
##       AGE   CITY                    FRE TripPurpose Departure    TimeUseonBus
## 449 26-35 DaNang          >=3 days/week     Working    Normal Using.telephone
## 450 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 451 46-55 DaNang          >=3 days/week     Working Peak-Hour         Nothing
## 452 26-35 DaNang 2days/month-2days/week     Working Peak-Hour Using.telephone
## 453 46-55 DaNang          >=3 days/week     Working Peak-Hour          Others
## 454 16-25 DaNang          >=3 days/week     Working Peak-Hour Using.telephone
##     TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 449        2.0   6   Never   Never  Never  Never   Male       Married
## 450        1.5   6   Never   Never  Never  Never Female       Married
## 451        2.0   6   Never   Never  Never  Never Female       Married
## 452        1.0   5   Never   Never  Never  Never Female       Married
## 453        2.0   6   Never   Never  Never  Never Female       Married
## 454        1.0   6   Never   Never  Never  Never Female        Single
##        Occupation     Education       Income  BPE
## 449 Full.time.job Undergraduate 5-10millions IMA1
## 450 Full.time.job Undergraduate   <5millions IMA1
## 451 Full.time.job Undergraduate   <5millions IMA1
## 452 Full.time.job   High.school 5-10millions IMA1
## 453 Full.time.job   High.school 5-10millions IMA1
## 454 Full.time.job  Postgraduate 5-10millions IMA1
str(DN_SEM_OR)
## 'data.frame':    7308 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 2 4 4 2 4 1 1 2 1 2 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 1 1 1 1 1 1 1 1 1 1 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 1 1 2 1 1 1 1 1 2 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 1 1 1 1 1 1 1 1 2 5 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 2 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 1 4 4 1 6 1 1 1 3 4 ...
##  $ TravelTime   : num  2 1.5 2 1 2 1 1 0.5 1 1.33 ...
##  $ Res          : int  6 6 6 5 6 6 5 6 3 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 2 1 1 1 1 1 1 2 2 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 1 1 1 1 1 2 2 2 2 1 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 2 2 2 2 2 2 2 2 1 2 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 3 3 4 3 4 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 2 1 1 2 2 2 2 4 1 3 ...
##  $ BPE          : chr  "IMA1" "IMA1" "IMA1" "IMA1" ...
dim(DN_SEM_OR)
## [1] 7308   18
DN_SEM_OR = DN_SEM_OR[ , c(8, 18)]
dim(DN_SEM_OR)
## [1] 7308    2
head(DN_SEM_OR)
##     Res  BPE
## 449   6 IMA1
## 450   6 IMA1
## 451   6 IMA1
## 452   5 IMA1
## 453   6 IMA1
## 454   6 IMA1
# Data Bus perception of people in Ho Chi Minh
HCM_SEM = subset(B.Per, CITY == "HoChiMinh")
head(HCM_SEM)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW1
## 2 Students/Pupils Undergraduate <5millions PSW1
## 3 Students/Pupils Undergraduate <5millions PSW1
## 4 Students/Pupils Undergraduate <5millions PSW1
## 5 Students/Pupils Undergraduate <5millions PSW1
## 6 Students/Pupils   High.school <5millions PSW1
str(HCM_SEM)
## 'data.frame':    34496 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  4 2 4 5 3 2 1 2 3 4 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(HCM_SEM)
## [1] 34496    18
HCM_SEM = HCM_SEM[ , c(8, 18)]
dim(HCM_SEM)
## [1] 34496     2
head(HCM_SEM)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
HCM_SEM_PSA = subset(B.Per_PSA, CITY == "HoChiMinh")
head(HCM_SEM_PSA)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   4   Never    Ever  Never   Ever Female        Single
## 2       2.00   2   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   3   Never    Ever  Never   Ever   Male        Single
## 6       2.00   2   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PSW1
## 2 Students/Pupils Undergraduate <5millions PSW1
## 3 Students/Pupils Undergraduate <5millions PSW1
## 4 Students/Pupils Undergraduate <5millions PSW1
## 5 Students/Pupils Undergraduate <5millions PSW1
## 6 Students/Pupils   High.school <5millions PSW1
str(HCM_SEM_PSA)
## 'data.frame':    9856 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  4 2 4 5 3 2 1 2 3 4 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(HCM_SEM_PSA)
## [1] 9856   18
HCM_SEM_PSA = HCM_SEM_PSA[ , c(8, 18)]
dim(HCM_SEM_PSA)
## [1] 9856    2
head(HCM_SEM_PSA)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
HCM_SEM_PSQ = subset(B.Per_PSQ, CITY == "HoChiMinh")
head(HCM_SEM_PSQ)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   2   Never   Never  Never  Never   Male        Single
## 4       4.00   6   Never    Ever  Never   Ever   Male        Single
## 5       2.00   6   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PQT1
## 2 Students/Pupils Undergraduate <5millions PQT1
## 3 Students/Pupils Undergraduate <5millions PQT1
## 4 Students/Pupils Undergraduate <5millions PQT1
## 5 Students/Pupils Undergraduate <5millions PQT1
## 6 Students/Pupils   High.school <5millions PQT1
str(HCM_SEM_PSQ)
## 'data.frame':    8064 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  6 4 2 6 6 4 2 5 5 7 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PQT1" "PQT1" "PQT1" "PQT1" ...
dim(HCM_SEM_PSQ)
## [1] 8064   18
HCM_SEM_PSQ = HCM_SEM_PSQ[ , c(8, 18)]
dim(HCM_SEM_PSQ)
## [1] 8064    2
head(HCM_SEM_PSQ)
##   Res  BPE
## 1   6 PQT1
## 2   4 PQT1
## 3   2 PQT1
## 4   6 PQT1
## 5   6 PQT1
## 6   4 PQT1
HCM_SEM_S = subset(B.Per_S, CITY == "HoChiMinh")
head(HCM_SEM_S)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   3   Never   Never   Ever  Never Female        Single
## 3       0.17   5   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions PHB1
## 2 Students/Pupils Undergraduate <5millions PHB1
## 3 Students/Pupils Undergraduate <5millions PHB1
## 4 Students/Pupils Undergraduate <5millions PHB1
## 5 Students/Pupils Undergraduate <5millions PHB1
## 6 Students/Pupils   High.school <5millions PHB1
str(HCM_SEM_S)
## 'data.frame':    8512 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  6 3 5 5 5 4 3 6 6 7 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "PHB1" "PHB1" "PHB1" "PHB1" ...
dim(HCM_SEM_S)
## [1] 8512   18
HCM_SEM_S = HCM_SEM_S[ , c(8, 18)]
dim(HCM_SEM_S)
## [1] 8512    2
head(HCM_SEM_S)
##   Res  BPE
## 1   6 PHB1
## 2   3 PHB1
## 3   5 PHB1
## 4   5 PHB1
## 5   5 PHB1
## 6   4 PHB1
HCM_SEM_OR = subset(B.Per_OR, CITY == "HoChiMinh")
head(HCM_SEM_OR)
##     AGE      CITY                    FRE  TripPurpose Departure    TimeUseonBus
## 1 16-25 HoChiMinh          >=3 days/week     Studying    Normal         Nothing
## 2 16-25 HoChiMinh 2days/month-2days/week Entertaining    Normal         Nothing
## 3 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 4 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour Using.telephone
## 5 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour         Nothing
## 6 16-25 HoChiMinh          >=3 days/week     Studying Peak-Hour          Others
##   TravelTime Res EC_Stop WC_Stop EC_Bus WC_Bus Gender MarriedStatus
## 1       3.00   6   Never    Ever  Never   Ever Female        Single
## 2       2.00   4   Never   Never   Ever  Never Female        Single
## 3       0.17   4   Never   Never  Never  Never   Male        Single
## 4       4.00   5   Never    Ever  Never   Ever   Male        Single
## 5       2.00   5   Never    Ever  Never   Ever   Male        Single
## 6       2.00   4   Never    Ever  Never   Ever Female        Single
##        Occupation     Education     Income  BPE
## 1 Students/Pupils Undergraduate <5millions IMA1
## 2 Students/Pupils Undergraduate <5millions IMA1
## 3 Students/Pupils Undergraduate <5millions IMA1
## 4 Students/Pupils Undergraduate <5millions IMA1
## 5 Students/Pupils Undergraduate <5millions IMA1
## 6 Students/Pupils   High.school <5millions IMA1
str(HCM_SEM_OR)
## 'data.frame':    8064 obs. of  18 variables:
##  $ AGE          : Factor w/ 5 levels "16-25","26-35",..: 1 1 1 1 1 1 1 3 1 1 ...
##  $ CITY         : Factor w/ 2 levels "DaNang","HoChiMinh": 2 2 2 2 2 2 2 2 2 2 ...
##  $ FRE          : Factor w/ 4 levels ">=3 days/week",..: 1 2 1 1 1 1 4 1 1 1 ...
##  $ TripPurpose  : Factor w/ 5 levels "Working","Studying",..: 2 4 2 2 2 2 4 1 2 2 ...
##  $ Departure    : Factor w/ 2 levels "Normal","Peak-Hour": 1 1 2 2 2 2 2 2 2 2 ...
##  $ TimeUseonBus : Factor w/ 6 levels "Using.telephone",..: 4 4 4 1 4 6 1 4 4 3 ...
##  $ TravelTime   : num  3 2 0.17 4 2 2 1 2 2.5 1.5 ...
##  $ Res          : int  6 4 4 5 5 4 2 6 5 6 ...
##  $ EC_Stop      : Factor w/ 2 levels "Never","Ever": 1 1 1 1 1 1 1 1 1 1 ...
##  $ WC_Stop      : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ EC_Bus       : Factor w/ 2 levels "Never","Ever": 1 2 1 1 1 1 1 1 1 1 ...
##  $ WC_Bus       : Factor w/ 2 levels "Never","Ever": 2 1 1 2 2 2 1 1 2 1 ...
##  $ Gender       : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 1 1 1 1 1 ...
##  $ MarriedStatus: Factor w/ 2 levels "Married","Single": 2 2 2 2 2 2 2 1 2 2 ...
##  $ Occupation   : Factor w/ 7 levels "Students/Pupils",..: 1 1 1 1 1 1 1 2 1 1 ...
##  $ Education    : Factor w/ 5 levels "Secondary.school",..: 2 2 2 2 2 3 5 1 2 3 ...
##  $ Income       : Factor w/ 4 levels "<5millions","5-10millions",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ BPE          : chr  "IMA1" "IMA1" "IMA1" "IMA1" ...
dim(HCM_SEM_OR)
## [1] 8064   18
HCM_SEM_OR = HCM_SEM_OR[ , c(8, 18)]
dim(HCM_SEM_OR)
## [1] 8064    2
head(HCM_SEM_OR)
##   Res  BPE
## 1   6 IMA1
## 2   4 IMA1
## 3   4 IMA1
## 4   5 IMA1
## 5   5 IMA1
## 6   4 IMA1
# Data Bus perception of people in both Da Nang and Ho Chi Minh cities
DN_HCM_SEM = B.Per[, c(8, 18)]
str(DN_HCM_SEM)
## 'data.frame':    65758 obs. of  2 variables:
##  $ Res: int  4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(DN_HCM_SEM)
## [1] 65758     2
head(DN_HCM_SEM)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
DN_HCM_SEM_PSA = B.Per_PSA[, c(8, 18)]
str(DN_HCM_SEM_PSA)
## 'data.frame':    18788 obs. of  2 variables:
##  $ Res: int  4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: chr  "PSW1" "PSW1" "PSW1" "PSW1" ...
dim(DN_HCM_SEM_PSA)
## [1] 18788     2
head(DN_HCM_SEM_PSA)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
DN_HCM_SEM_PSQ = B.Per_PSQ[, c(8, 18)]
str(DN_HCM_SEM_PSQ)
## 'data.frame':    15372 obs. of  2 variables:
##  $ Res: int  6 4 2 6 6 4 2 5 5 7 ...
##  $ BPE: chr  "PQT1" "PQT1" "PQT1" "PQT1" ...
dim(DN_HCM_SEM_PSQ)
## [1] 15372     2
head(DN_HCM_SEM_PSQ)
##   Res  BPE
## 1   6 PQT1
## 2   4 PQT1
## 3   2 PQT1
## 4   6 PQT1
## 5   6 PQT1
## 6   4 PQT1
DN_HCM_SEM_S = B.Per_S[, c(8, 18)]
str(DN_HCM_SEM_S)
## 'data.frame':    16226 obs. of  2 variables:
##  $ Res: int  6 3 5 5 5 4 3 6 6 7 ...
##  $ BPE: chr  "PHB1" "PHB1" "PHB1" "PHB1" ...
dim(DN_HCM_SEM_S)
## [1] 16226     2
head(DN_HCM_SEM_S)
##   Res  BPE
## 1   6 PHB1
## 2   3 PHB1
## 3   5 PHB1
## 4   5 PHB1
## 5   5 PHB1
## 6   4 PHB1
DN_HCM_SEM_OR = B.Per_OR[, c(8, 18)]
str(DN_HCM_SEM_OR)
## 'data.frame':    15372 obs. of  2 variables:
##  $ Res: int  6 4 4 5 5 4 2 6 5 6 ...
##  $ BPE: chr  "IMA1" "IMA1" "IMA1" "IMA1" ...
dim(DN_HCM_SEM_OR)
## [1] 15372     2
head(DN_HCM_SEM_OR)
##   Res  BPE
## 1   6 IMA1
## 2   4 IMA1
## 3   4 IMA1
## 4   5 IMA1
## 5   5 IMA1
## 6   4 IMA1

3.2. Vẽ biểu đồ likert với dữ liệu chung Đà Nẵng và Hồ Chí Minh - Nhãn tiếng anh

# Plot Likert graph for people in both Da Nang and Ho Chi Minh cities
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.4     v dplyr   1.0.2
## v tidyr   1.1.2     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x tidyr::extract()   masks magrittr::extract()
## x dplyr::filter()    masks stats::filter()
## x dplyr::lag()       masks stats::lag()
## x purrr::set_names() masks magrittr::set_names()
library(compareGroups)
head(DN_HCM_SEM)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
dim(DN_HCM_SEM)
## [1] 65758     2
attach(DN_HCM_SEM)
DN_HCM_SEM = within(DN_HCM_SEM, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8", "PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7", "IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3", "PVA1", "PVA2", "PVA3"))
  })
str(DN_HCM_SEM)
## 'data.frame':    65758 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 77 levels "PSW1","PSW2",..: 65 65 65 65 65 65 65 65 65 65 ...
summary(DN_HCM_SEM)
##              Res             BPE       
##  Very Disagree : 1642   PSW1   :  854  
##  Disagree      : 3990   PSW2   :  854  
##  Quite Disagree: 3144   PSW3   :  854  
##  Normal        : 8403   PSW4   :  854  
##  Quite Agree   :12986   PSW5   :  854  
##  Agree         :27133   PSW6   :  854  
##  Very Agree    : 8460   (Other):60634
    ## t <- compareGroups(Res ~ BPE, data = DN_HCM_SEM1)
    ## createTable(t)
DN_HCM_SEM %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  # arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4
## [31] PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQR5 SAT1 SAT2 SAT3 LOY1 LOY2
## [46] LOY3 LOY4 LOY5 LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5
## [61] PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 PVA1
## [76] PVA2 PVA3
## 77 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PVA3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 539 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree      6    0.7  0.7%    
##  2 PSW1  Disagree          18    2.11 2.11%   
##  3 PSW1  Quite Disagree    32    3.75 3.75%   
##  4 PSW1  Normal           154   18.0  18.03%  
##  5 PSW1  Quite Agree      231   27.0  27.05%  
##  6 PSW1  Agree            349   40.9  40.87%  
##  7 PSW1  Very Agree        64    7.49 7.49%   
##  8 PSW2  Very Disagree     11    1.29 1.29%   
##  9 PSW2  Disagree          19    2.22 2.22%   
## 10 PSW2  Quite Disagree    24    2.81 2.81%   
## # ... with 529 more rows
library(extrafont)
## Registering fonts with R
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perception of passengers towards bus systems in urban areas of Viet Nam", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 77 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree     6    0.7  0.7%    
##  2 PSW2  Very Disagree    11    1.29 1.29%   
##  3 PSW3  Very Disagree    11    1.29 1.29%   
##  4 PSW4  Very Disagree    13    1.52 1.52%   
##  5 PSW5  Very Disagree     6    0.7  0.7%    
##  6 PSW6  Very Disagree     4    0.47 0.47%   
##  7 PSW7  Very Disagree     6    0.7  0.7%    
##  8 PSS1  Very Disagree     3    0.35 0.35%   
##  9 PSS2  Very Disagree    13    1.52 1.52%   
## 10 PSS3  Very Disagree    12    1.41 1.41%   
## # ... with 67 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 77 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PSW1  Disagree    18    2.11 2.11%   
##  2 PSW2  Disagree    19    2.22 2.22%   
##  3 PSW3  Disagree    11    1.29 1.29%   
##  4 PSW4  Disagree    14    1.64 1.64%   
##  5 PSW5  Disagree    21    2.46 2.46%   
##  6 PSW6  Disagree    18    2.11 2.11%   
##  7 PSW7  Disagree    22    2.58 2.58%   
##  8 PSS1  Disagree    16    1.87 1.87%   
##  9 PSS2  Disagree    17    1.99 1.99%   
## 10 PSS3  Disagree    23    2.69 2.69%   
## # ... with 67 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 77 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Quite Disagree    32    3.75 3.75%   
##  2 PSW2  Quite Disagree    24    2.81 2.81%   
##  3 PSW3  Quite Disagree    19    2.22 2.22%   
##  4 PSW4  Quite Disagree    25    2.93 2.93%   
##  5 PSW5  Quite Disagree    19    2.22 2.22%   
##  6 PSW6  Quite Disagree    18    2.11 2.11%   
##  7 PSW7  Quite Disagree    15    1.76 1.76%   
##  8 PSS1  Quite Disagree    18    2.11 2.11%   
##  9 PSS2  Quite Disagree    30    3.51 3.51%   
## 10 PSS3  Quite Disagree    25    2.93 2.93%   
## # ... with 67 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 77 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Normal   154    18.0 18.03%  
##  2 PSW2  Normal   157    18.4 18.38%  
##  3 PSW3  Normal   128    15.0 14.99%  
##  4 PSW4  Normal   114    13.4 13.35%  
##  5 PSW5  Normal   104    12.2 12.18%  
##  6 PSW6  Normal   112    13.1 13.11%  
##  7 PSW7  Normal    98    11.5 11.48%  
##  8 PSS1  Normal    91    10.7 10.66%  
##  9 PSS2  Normal   128    15.0 14.99%  
## 10 PSS3  Normal   109    12.8 12.76%  
## # ... with 67 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 77 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Quite Agree   231    27.0 27.05%  
##  2 PSW2  Quite Agree   213    24.9 24.94%  
##  3 PSW3  Quite Agree   206    24.1 24.12%  
##  4 PSW4  Quite Agree   199    23.3 23.3%   
##  5 PSW5  Quite Agree   203    23.8 23.77%  
##  6 PSW6  Quite Agree   166    19.4 19.44%  
##  7 PSW7  Quite Agree   169    19.8 19.79%  
##  8 PSS1  Quite Agree   160    18.7 18.74%  
##  9 PSS2  Quite Agree   212    24.8 24.82%  
## 10 PSS3  Quite Agree   213    24.9 24.94%  
## # ... with 67 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 77 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PSW1  Agree   349    40.9 40.87%  
##  2 PSW2  Agree   365    42.7 42.74%  
##  3 PSW3  Agree   401    47.0 46.96%  
##  4 PSW4  Agree   405    47.4 47.42%  
##  5 PSW5  Agree   418    49.0 48.95%  
##  6 PSW6  Agree   431    50.5 50.47%  
##  7 PSW7  Agree   427    50   50%     
##  8 PSS1  Agree   436    51.0 51.05%  
##  9 PSS2  Agree   337    39.5 39.46%  
## 10 PSS3  Agree   344    40.3 40.28%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    64    7.49 7.49%   
##  2 PSW2  Very Agree    65    7.61 7.61%   
##  3 PSW3  Very Agree    78    9.13 9.13%   
##  4 PSW4  Very Agree    84    9.84 9.84%   
##  5 PSW5  Very Agree    83    9.72 9.72%   
##  6 PSW6  Very Agree   105   12.3  12.3%   
##  7 PSW7  Very Agree   117   13.7  13.7%   
##  8 PSS1  Very Agree   130   15.2  15.22%  
##  9 PSS2  Very Agree   117   13.7  13.7%   
## 10 PSS3  Very Agree   128   15.0  14.99%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    64    7.49 7.49%   
##  2 PSW2  Very Agree    65    7.61 7.61%   
##  3 PSW3  Very Agree    78    9.13 9.13%   
##  4 PSW4  Very Agree    84    9.84 9.84%   
##  5 PSW5  Very Agree    83    9.72 9.72%   
##  6 PSW6  Very Agree   105   12.3  12.3%   
##  7 PSW7  Very Agree   117   13.7  13.7%   
##  8 PSS1  Very Agree   130   15.2  15.22%  
##  9 PSS2  Very Agree   117   13.7  13.7%   
## 10 PSS3  Very Agree   128   15.0  14.99%  
## # ... with 67 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 2, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-35, label = bar_text), size = 2, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 2, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.3. Vẽ biểu đồ likert với dữ liệu chung Đà Nẵng và Hồ Chí Minh - Nhãn tiếng việt

# Nhan tieng viet
DN_HCM_SEM_v = within(DN_HCM_SEM, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8", "PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7", "IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3", "PVA1", "PVA2", "PVA3"))
  })
str(DN_HCM_SEM_v)
## 'data.frame':    65758 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 77 levels "PSW1","PSW2",..: 65 65 65 65 65 65 65 65 65 65 ...
summary(DN_HCM_SEM_v)
##                              Res             BPE       
##  R<U+1EA5>t không d<U+1ED3>ng ý: 1642   PSW1   :  854  
##  Không d<U+1ED3>ng ý           : 3990   PSW2   :  854  
##  Khá không d<U+1ED3>ng ý       : 3144   PSW3   :  854  
##  Bình thu<U+1EDD>ng            : 8403   PSW4   :  854  
##  Khá d<U+1ED3>ng ý             :12986   PSW5   :  854  
##  Ð<U+1ED3>ng ý                 :27133   PSW6   :  854  
##  R<U+1EA5>t d<U+1ED3>ng ý      : 8460   (Other):60634
    ## t <- compareGroups(Res ~ BPE, data = DN_HCM_SEM1)
    ## createTable(t)
DN_HCM_SEM_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  # arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4
## [31] PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQR5 SAT1 SAT2 SAT3 LOY1 LOY2
## [46] LOY3 LOY4 LOY5 LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5
## [61] PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 PVA1
## [76] PVA2 PVA3
## 77 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PVA3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 539 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  2 PSW1  Không d<U+1ED3>ng ý        18    2.11 2.11%   
##  3 PSW1  Khá không d<U+1ED3>ng ý    32    3.75 3.75%   
##  4 PSW1  Bình thu<U+1EDD>ng        154   18.0  18.03%  
##  5 PSW1  Khá d<U+1ED3>ng ý         231   27.0  27.05%  
##  6 PSW1  Ð<U+1ED3>ng ý             349   40.9  40.87%  
##  7 PSW1  R<U+1EA5>t d<U+1ED3>ng ý          64    7.49 7.49%   
##  8 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    11    1.29 1.29%   
##  9 PSW2  Không d<U+1ED3>ng ý        19    2.22 2.22%   
## 10 PSW2  Khá không d<U+1ED3>ng ý    24    2.81 2.81%   
## # ... with 529 more rows
library(extrafont)
theme_set(theme_minimal())
gg_viet <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn c\u1EE7a h\u00E0nh kh\u00E1ch v\u1EC1 h\u1EC7 th\u1ED1ng xe bu\u00FDt \u0111\u00F4 th\u1ECB Vi\u1EC7t Nam", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_viet
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 77 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  2 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    11    1.29 1.29%   
##  3 PSW3  R<U+1EA5>t không d<U+1ED3>ng ý    11    1.29 1.29%   
##  4 PSW4  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
##  5 PSW5  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  6 PSW6  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.47 0.47%   
##  7 PSW7  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  8 PSS1  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.35 0.35%   
##  9 PSS2  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
## 10 PSS3  R<U+1EA5>t không d<U+1ED3>ng ý    12    1.41 1.41%   
## # ... with 67 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 77 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PSW1  Không d<U+1ED3>ng ý    18    2.11 2.11%   
##  2 PSW2  Không d<U+1ED3>ng ý    19    2.22 2.22%   
##  3 PSW3  Không d<U+1ED3>ng ý    11    1.29 1.29%   
##  4 PSW4  Không d<U+1ED3>ng ý    14    1.64 1.64%   
##  5 PSW5  Không d<U+1ED3>ng ý    21    2.46 2.46%   
##  6 PSW6  Không d<U+1ED3>ng ý    18    2.11 2.11%   
##  7 PSW7  Không d<U+1ED3>ng ý    22    2.58 2.58%   
##  8 PSS1  Không d<U+1ED3>ng ý    16    1.87 1.87%   
##  9 PSS2  Không d<U+1ED3>ng ý    17    1.99 1.99%   
## 10 PSS3  Không d<U+1ED3>ng ý    23    2.69 2.69%   
## # ... with 67 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 77 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  Khá không d<U+1ED3>ng ý    32    3.75 3.75%   
##  2 PSW2  Khá không d<U+1ED3>ng ý    24    2.81 2.81%   
##  3 PSW3  Khá không d<U+1ED3>ng ý    19    2.22 2.22%   
##  4 PSW4  Khá không d<U+1ED3>ng ý    25    2.93 2.93%   
##  5 PSW5  Khá không d<U+1ED3>ng ý    19    2.22 2.22%   
##  6 PSW6  Khá không d<U+1ED3>ng ý    18    2.11 2.11%   
##  7 PSW7  Khá không d<U+1ED3>ng ý    15    1.76 1.76%   
##  8 PSS1  Khá không d<U+1ED3>ng ý    18    2.11 2.11%   
##  9 PSS2  Khá không d<U+1ED3>ng ý    30    3.51 3.51%   
## 10 PSS3  Khá không d<U+1ED3>ng ý    25    2.93 2.93%   
## # ... with 67 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 77 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Bình thu<U+1EDD>ng   154    18.0 18.03%  
##  2 PSW2  Bình thu<U+1EDD>ng   157    18.4 18.38%  
##  3 PSW3  Bình thu<U+1EDD>ng   128    15.0 14.99%  
##  4 PSW4  Bình thu<U+1EDD>ng   114    13.4 13.35%  
##  5 PSW5  Bình thu<U+1EDD>ng   104    12.2 12.18%  
##  6 PSW6  Bình thu<U+1EDD>ng   112    13.1 13.11%  
##  7 PSW7  Bình thu<U+1EDD>ng    98    11.5 11.48%  
##  8 PSS1  Bình thu<U+1EDD>ng    91    10.7 10.66%  
##  9 PSS2  Bình thu<U+1EDD>ng   128    15.0 14.99%  
## 10 PSS3  Bình thu<U+1EDD>ng   109    12.8 12.76%  
## # ... with 67 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Khá d<U+1ED3>ng ý   231    27.0 27.05%  
##  2 PSW2  Khá d<U+1ED3>ng ý   213    24.9 24.94%  
##  3 PSW3  Khá d<U+1ED3>ng ý   206    24.1 24.12%  
##  4 PSW4  Khá d<U+1ED3>ng ý   199    23.3 23.3%   
##  5 PSW5  Khá d<U+1ED3>ng ý   203    23.8 23.77%  
##  6 PSW6  Khá d<U+1ED3>ng ý   166    19.4 19.44%  
##  7 PSW7  Khá d<U+1ED3>ng ý   169    19.8 19.79%  
##  8 PSS1  Khá d<U+1ED3>ng ý   160    18.7 18.74%  
##  9 PSS2  Khá d<U+1ED3>ng ý   212    24.8 24.82%  
## 10 PSS3  Khá d<U+1ED3>ng ý   213    24.9 24.94%  
## # ... with 67 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 77 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Ð<U+1ED3>ng ý   349    40.9 40.87%  
##  2 PSW2  Ð<U+1ED3>ng ý   365    42.7 42.74%  
##  3 PSW3  Ð<U+1ED3>ng ý   401    47.0 46.96%  
##  4 PSW4  Ð<U+1ED3>ng ý   405    47.4 47.42%  
##  5 PSW5  Ð<U+1ED3>ng ý   418    49.0 48.95%  
##  6 PSW6  Ð<U+1ED3>ng ý   431    50.5 50.47%  
##  7 PSW7  Ð<U+1ED3>ng ý   427    50   50%     
##  8 PSS1  Ð<U+1ED3>ng ý   436    51.0 51.05%  
##  9 PSS2  Ð<U+1ED3>ng ý   337    39.5 39.46%  
## 10 PSS3  Ð<U+1ED3>ng ý   344    40.3 40.28%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    64    7.49 7.49%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    65    7.61 7.61%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    78    9.13 9.13%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    84    9.84 9.84%   
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    83    9.72 9.72%   
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý   105   12.3  12.3%   
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý   130   15.2  15.22%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý   128   15.0  14.99%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    64    7.49 7.49%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    65    7.61 7.61%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    78    9.13 9.13%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    84    9.84 9.84%   
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    83    9.72 9.72%   
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý   105   12.3  12.3%   
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý   130   15.2  15.22%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý   128   15.0  14.99%  
## # ... with 67 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_viet + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 2, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-35, label = bar_text), size = 2, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 2, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.4. Vẽ biểu đồ likert cho dữ liệu Đà Nẵng - Nhãn tiếng anh

# Plot Likert graph for people in Da Nang 
library(tidyverse)
library(compareGroups)
head(DN_SEM)
##     Res  BPE
## 449   6 PSW1
## 450   6 PSW1
## 451   6 PSW1
## 452   1 PSW1
## 453   6 PSW1
## 454   6 PSW1
dim(DN_SEM)
## [1] 31262     2
attach(DN_SEM)
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_SEM = within(DN_SEM, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8", "PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7", "IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3", "PVA1", "PVA2", "PVA3"))
  })
str(DN_SEM)
## 'data.frame':    31262 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 6 6 1 6 6 6 7 6 6 ...
##  $ BPE: Factor w/ 77 levels "PSW1","PSW2",..: 65 65 65 65 65 65 65 65 65 65 ...
summary(DN_SEM)
##              Res             BPE       
##  Very Disagree :  290   PSW1   :  406  
##  Disagree      :  879   PSW2   :  406  
##  Quite Disagree: 1302   PSW3   :  406  
##  Normal        : 2657   PSW4   :  406  
##  Quite Agree   : 7207   PSW5   :  406  
##  Agree         :13915   PSW6   :  406  
##  Very Agree    : 5012   (Other):28826
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  # arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4
## [31] PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQR5 SAT1 SAT2 SAT3 LOY1 LOY2
## [46] LOY3 LOY4 LOY5 LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5
## [61] PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 PVA1
## [76] PVA2 PVA3
## 77 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PVA3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"

df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 513 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree      1    0.25 0.25%   
##  2 PSW1  Disagree           1    0.25 0.25%   
##  3 PSW1  Quite Disagree    11    2.71 2.71%   
##  4 PSW1  Normal            54   13.3  13.3%   
##  5 PSW1  Quite Agree      138   34.0  33.99%  
##  6 PSW1  Agree            169   41.6  41.63%  
##  7 PSW1  Very Agree        32    7.88 7.88%   
##  8 PSW2  Disagree           1    0.25 0.25%   
##  9 PSW2  Quite Disagree     6    1.48 1.48%   
## 10 PSW2  Normal            46   11.3  11.33%  
## # ... with 503 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perception of passengers towards bus systems in Da Nang", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 58 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree     1    0.25 0.25%   
##  2 PSS2  Very Disagree     1    0.25 0.25%   
##  3 PSS3  Very Disagree     1    0.25 0.25%   
##  4 PSS4  Very Disagree     1    0.25 0.25%   
##  5 PSS5  Very Disagree     1    0.25 0.25%   
##  6 PSS6  Very Disagree     6    1.48 1.48%   
##  7 PSS7  Very Disagree     1    0.25 0.25%   
##  8 PSB1  Very Disagree     3    0.74 0.74%   
##  9 PSB2  Very Disagree     1    0.25 0.25%   
## 10 PSB3  Very Disagree     2    0.49 0.49%   
## # ... with 48 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 70 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PSW1  Disagree     1    0.25 0.25%   
##  2 PSW2  Disagree     1    0.25 0.25%   
##  3 PSW3  Disagree     1    0.25 0.25%   
##  4 PSW5  Disagree     1    0.25 0.25%   
##  5 PSW6  Disagree     2    0.49 0.49%   
##  6 PSW7  Disagree     1    0.25 0.25%   
##  7 PSS1  Disagree     1    0.25 0.25%   
##  8 PSS3  Disagree     2    0.49 0.49%   
##  9 PSS4  Disagree    14    3.45 3.45%   
## 10 PSS5  Disagree     1    0.25 0.25%   
## # ... with 60 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 77 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Quite Disagree    11    2.71 2.71%   
##  2 PSW2  Quite Disagree     6    1.48 1.48%   
##  3 PSW3  Quite Disagree     3    0.74 0.74%   
##  4 PSW4  Quite Disagree     7    1.72 1.72%   
##  5 PSW5  Quite Disagree     4    0.99 0.99%   
##  6 PSW6  Quite Disagree     5    1.23 1.23%   
##  7 PSW7  Quite Disagree     5    1.23 1.23%   
##  8 PSS1  Quite Disagree     4    0.99 0.99%   
##  9 PSS2  Quite Disagree    16    3.94 3.94%   
## 10 PSS3  Quite Disagree    12    2.96 2.96%   
## # ... with 67 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 77 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Normal    54   13.3  13.3%   
##  2 PSW2  Normal    46   11.3  11.33%  
##  3 PSW3  Normal    39    9.61 9.61%   
##  4 PSW4  Normal    26    6.4  6.4%    
##  5 PSW5  Normal    23    5.67 5.67%   
##  6 PSW6  Normal    25    6.16 6.16%   
##  7 PSW7  Normal    23    5.67 5.67%   
##  8 PSS1  Normal    30    7.39 7.39%   
##  9 PSS2  Normal    38    9.36 9.36%   
## 10 PSS3  Normal    31    7.64 7.64%   
## # ... with 67 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 77 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Quite Agree   138    34.0 33.99%  
##  2 PSW2  Quite Agree   113    27.8 27.83%  
##  3 PSW3  Quite Agree   106    26.1 26.11%  
##  4 PSW4  Quite Agree   102    25.1 25.12%  
##  5 PSW5  Quite Agree    96    23.6 23.65%  
##  6 PSW6  Quite Agree    90    22.2 22.17%  
##  7 PSW7  Quite Agree    86    21.2 21.18%  
##  8 PSS1  Quite Agree    74    18.2 18.23%  
##  9 PSS2  Quite Agree   122    30.0 30.05%  
## 10 PSS3  Quite Agree   114    28.1 28.08%  
## # ... with 67 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 77 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PSW1  Agree   169    41.6 41.63%  
##  2 PSW2  Agree   207    51.0 50.99%  
##  3 PSW3  Agree   214    52.7 52.71%  
##  4 PSW4  Agree   220    54.2 54.19%  
##  5 PSW5  Agree   231    56.9 56.9%   
##  6 PSW6  Agree   219    53.9 53.94%  
##  7 PSW7  Agree   221    54.4 54.43%  
##  8 PSS1  Agree   219    53.9 53.94%  
##  9 PSS2  Agree   160    39.4 39.41%  
## 10 PSS3  Agree   167    41.1 41.13%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    32    7.88 7.88%   
##  2 PSW2  Very Agree    33    8.13 8.13%   
##  3 PSW3  Very Agree    43   10.6  10.59%  
##  4 PSW4  Very Agree    51   12.6  12.56%  
##  5 PSW5  Very Agree    51   12.6  12.56%  
##  6 PSW6  Very Agree    65   16.0  16.01%  
##  7 PSW7  Very Agree    70   17.2  17.24%  
##  8 PSS1  Very Agree    78   19.2  19.21%  
##  9 PSS2  Very Agree    69   17    17%     
## 10 PSS3  Very Agree    79   19.5  19.46%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    32    7.88 7.88%   
##  2 PSW2  Very Agree    33    8.13 8.13%   
##  3 PSW3  Very Agree    43   10.6  10.59%  
##  4 PSW4  Very Agree    51   12.6  12.56%  
##  5 PSW5  Very Agree    51   12.6  12.56%  
##  6 PSW6  Very Agree    65   16.0  16.01%  
##  7 PSW7  Very Agree    70   17.2  17.24%  
##  8 PSS1  Very Agree    78   19.2  19.21%  
##  9 PSS2  Very Agree    69   17    17%     
## 10 PSS3  Very Agree    79   19.5  19.46%  
## # ... with 67 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 2, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 2, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 2, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.5. Vẽ biểu đồ likert cho dữ liệu Đà Nẵng - Nhãn tiếng việt

# Nhãm tiếng việt
DN_SEM_viet = within(DN_SEM, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8", "PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7", "IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3", "PVA1", "PVA2", "PVA3"))
  })
str(DN_SEM_viet)
## 'data.frame':    31262 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 6 6 1 6 6 6 7 6 6 ...
##  $ BPE: Factor w/ 77 levels "PSW1","PSW2",..: 65 65 65 65 65 65 65 65 65 65 ...
summary(DN_SEM_viet)
##                              Res             BPE       
##  R<U+1EA5>t không d<U+1ED3>ng ý:  290   PSW1   :  406  
##  Không d<U+1ED3>ng ý           :  879   PSW2   :  406  
##  Khá không d<U+1ED3>ng ý       : 1302   PSW3   :  406  
##  Bình thu<U+1EDD>ng            : 2657   PSW4   :  406  
##  Khá d<U+1ED3>ng ý             : 7207   PSW5   :  406  
##  Ð<U+1ED3>ng ý                 :13915   PSW6   :  406  
##  R<U+1EA5>t d<U+1ED3>ng ý      : 5012   (Other):28826
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_viet %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  # arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4
## [31] PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQR5 SAT1 SAT2 SAT3 LOY1 LOY2
## [46] LOY3 LOY4 LOY5 LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5
## [61] PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 PVA1
## [76] PVA2 PVA3
## 77 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PVA3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 513 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  2 PSW1  Không d<U+1ED3>ng ý         1    0.25 0.25%   
##  3 PSW1  Khá không d<U+1ED3>ng ý    11    2.71 2.71%   
##  4 PSW1  Bình thu<U+1EDD>ng         54   13.3  13.3%   
##  5 PSW1  Khá d<U+1ED3>ng ý         138   34.0  33.99%  
##  6 PSW1  Ð<U+1ED3>ng ý             169   41.6  41.63%  
##  7 PSW1  R<U+1EA5>t d<U+1ED3>ng ý          32    7.88 7.88%   
##  8 PSW2  Không d<U+1ED3>ng ý         1    0.25 0.25%   
##  9 PSW2  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
## 10 PSW2  Bình thu<U+1EDD>ng         46   11.3  11.33%  
## # ... with 503 more rows
library(extrafont)
theme_set(theme_minimal())
gg_viet <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn c\u1EE7a h\u00E0nh kh\u00E1ch v\u1EC1 h\u1EC7 th\u1ED1ng xe bu\u00FDt \u0111\u00F4 th\u1ECB \u0110\u00E0 N\u1EB5ng", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_viet
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 58 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  2 PSS2  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  3 PSS3  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  4 PSS4  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  5 PSS5  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  6 PSS6  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.48 1.48%   
##  7 PSS7  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  8 PSB1  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.74 0.74%   
##  9 PSB2  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 10 PSB3  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
## # ... with 48 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 70 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PSW1  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  2 PSW2  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  3 PSW3  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  4 PSW5  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  5 PSW6  Không d<U+1ED3>ng ý     2    0.49 0.49%   
##  6 PSW7  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  7 PSS1  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  8 PSS3  Không d<U+1ED3>ng ý     2    0.49 0.49%   
##  9 PSS4  Không d<U+1ED3>ng ý    14    3.45 3.45%   
## 10 PSS5  Không d<U+1ED3>ng ý     1    0.25 0.25%   
## # ... with 60 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 77 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  Khá không d<U+1ED3>ng ý    11    2.71 2.71%   
##  2 PSW2  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
##  3 PSW3  Khá không d<U+1ED3>ng ý     3    0.74 0.74%   
##  4 PSW4  Khá không d<U+1ED3>ng ý     7    1.72 1.72%   
##  5 PSW5  Khá không d<U+1ED3>ng ý     4    0.99 0.99%   
##  6 PSW6  Khá không d<U+1ED3>ng ý     5    1.23 1.23%   
##  7 PSW7  Khá không d<U+1ED3>ng ý     5    1.23 1.23%   
##  8 PSS1  Khá không d<U+1ED3>ng ý     4    0.99 0.99%   
##  9 PSS2  Khá không d<U+1ED3>ng ý    16    3.94 3.94%   
## 10 PSS3  Khá không d<U+1ED3>ng ý    12    2.96 2.96%   
## # ... with 67 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 77 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Bình thu<U+1EDD>ng    54   13.3  13.3%   
##  2 PSW2  Bình thu<U+1EDD>ng    46   11.3  11.33%  
##  3 PSW3  Bình thu<U+1EDD>ng    39    9.61 9.61%   
##  4 PSW4  Bình thu<U+1EDD>ng    26    6.4  6.4%    
##  5 PSW5  Bình thu<U+1EDD>ng    23    5.67 5.67%   
##  6 PSW6  Bình thu<U+1EDD>ng    25    6.16 6.16%   
##  7 PSW7  Bình thu<U+1EDD>ng    23    5.67 5.67%   
##  8 PSS1  Bình thu<U+1EDD>ng    30    7.39 7.39%   
##  9 PSS2  Bình thu<U+1EDD>ng    38    9.36 9.36%   
## 10 PSS3  Bình thu<U+1EDD>ng    31    7.64 7.64%   
## # ... with 67 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Khá d<U+1ED3>ng ý   138    34.0 33.99%  
##  2 PSW2  Khá d<U+1ED3>ng ý   113    27.8 27.83%  
##  3 PSW3  Khá d<U+1ED3>ng ý   106    26.1 26.11%  
##  4 PSW4  Khá d<U+1ED3>ng ý   102    25.1 25.12%  
##  5 PSW5  Khá d<U+1ED3>ng ý    96    23.6 23.65%  
##  6 PSW6  Khá d<U+1ED3>ng ý    90    22.2 22.17%  
##  7 PSW7  Khá d<U+1ED3>ng ý    86    21.2 21.18%  
##  8 PSS1  Khá d<U+1ED3>ng ý    74    18.2 18.23%  
##  9 PSS2  Khá d<U+1ED3>ng ý   122    30.0 30.05%  
## 10 PSS3  Khá d<U+1ED3>ng ý   114    28.1 28.08%  
## # ... with 67 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 77 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Ð<U+1ED3>ng ý   169    41.6 41.63%  
##  2 PSW2  Ð<U+1ED3>ng ý   207    51.0 50.99%  
##  3 PSW3  Ð<U+1ED3>ng ý   214    52.7 52.71%  
##  4 PSW4  Ð<U+1ED3>ng ý   220    54.2 54.19%  
##  5 PSW5  Ð<U+1ED3>ng ý   231    56.9 56.9%   
##  6 PSW6  Ð<U+1ED3>ng ý   219    53.9 53.94%  
##  7 PSW7  Ð<U+1ED3>ng ý   221    54.4 54.43%  
##  8 PSS1  Ð<U+1ED3>ng ý   219    53.9 53.94%  
##  9 PSS2  Ð<U+1ED3>ng ý   160    39.4 39.41%  
## 10 PSS3  Ð<U+1ED3>ng ý   167    41.1 41.13%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.88 7.88%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    33    8.13 8.13%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    43   10.6  10.59%  
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý    70   17.2  17.24%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý    78   19.2  19.21%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    69   17    17%     
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    79   19.5  19.46%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.88 7.88%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    33    8.13 8.13%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    43   10.6  10.59%  
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý    70   17.2  17.24%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý    78   19.2  19.21%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    69   17    17%     
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    79   19.5  19.46%  
## # ... with 67 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_viet + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 2, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 2, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 2, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.6. Vẽ biểu đồ likert cho dữ liệu Hồ Chí Minh-Nhãn tiếng anh

# Plot Likert graph for people in Ho Chi Minh 
library(tidyverse)
library(compareGroups)
head(HCM_SEM)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
dim(HCM_SEM)
## [1] 34496     2
attach(HCM_SEM)
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
HCM_SEM = within(HCM_SEM, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8", "PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7", "IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3", "PVA1", "PVA2", "PVA3"))
  })
str(HCM_SEM)
## 'data.frame':    34496 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 77 levels "PSW1","PSW2",..: 65 65 65 65 65 65 65 65 65 65 ...
summary(HCM_SEM)
##              Res             BPE       
##  Very Disagree : 1352   PSW1   :  448  
##  Disagree      : 3111   PSW2   :  448  
##  Quite Disagree: 1842   PSW3   :  448  
##  Normal        : 5746   PSW4   :  448  
##  Quite Agree   : 5779   PSW5   :  448  
##  Agree         :13218   PSW6   :  448  
##  Very Agree    : 3448   (Other):31808
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  # arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4
## [31] PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQR5 SAT1 SAT2 SAT3 LOY1 LOY2
## [46] LOY3 LOY4 LOY5 LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5
## [61] PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 PVA1
## [76] PVA2 PVA3
## 77 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PVA3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 539 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree      5    1.12 1.12%   
##  2 PSW1  Disagree          17    3.79 3.79%   
##  3 PSW1  Quite Disagree    21    4.69 4.69%   
##  4 PSW1  Normal           100   22.3  22.32%  
##  5 PSW1  Quite Agree       93   20.8  20.76%  
##  6 PSW1  Agree            180   40.2  40.18%  
##  7 PSW1  Very Agree        32    7.14 7.14%   
##  8 PSW2  Very Disagree     11    2.46 2.46%   
##  9 PSW2  Disagree          18    4.02 4.02%   
## 10 PSW2  Quite Disagree    18    4.02 4.02%   
## # ... with 529 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perception of passengers towards bus systems in Ho Chi Minh", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 77 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree     5    1.12 1.12%   
##  2 PSW2  Very Disagree    11    2.46 2.46%   
##  3 PSW3  Very Disagree    11    2.46 2.46%   
##  4 PSW4  Very Disagree    13    2.9  2.9%    
##  5 PSW5  Very Disagree     6    1.34 1.34%   
##  6 PSW6  Very Disagree     4    0.89 0.89%   
##  7 PSW7  Very Disagree     6    1.34 1.34%   
##  8 PSS1  Very Disagree     3    0.67 0.67%   
##  9 PSS2  Very Disagree    12    2.68 2.68%   
## 10 PSS3  Very Disagree    11    2.46 2.46%   
## # ... with 67 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 77 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PSW1  Disagree    17    3.79 3.79%   
##  2 PSW2  Disagree    18    4.02 4.02%   
##  3 PSW3  Disagree    10    2.23 2.23%   
##  4 PSW4  Disagree    14    3.12 3.12%   
##  5 PSW5  Disagree    20    4.46 4.46%   
##  6 PSW6  Disagree    16    3.57 3.57%   
##  7 PSW7  Disagree    21    4.69 4.69%   
##  8 PSS1  Disagree    15    3.35 3.35%   
##  9 PSS2  Disagree    17    3.79 3.79%   
## 10 PSS3  Disagree    21    4.69 4.69%   
## # ... with 67 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 77 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Quite Disagree    21    4.69 4.69%   
##  2 PSW2  Quite Disagree    18    4.02 4.02%   
##  3 PSW3  Quite Disagree    16    3.57 3.57%   
##  4 PSW4  Quite Disagree    18    4.02 4.02%   
##  5 PSW5  Quite Disagree    15    3.35 3.35%   
##  6 PSW6  Quite Disagree    13    2.9  2.9%    
##  7 PSW7  Quite Disagree    10    2.23 2.23%   
##  8 PSS1  Quite Disagree    14    3.12 3.12%   
##  9 PSS2  Quite Disagree    14    3.12 3.12%   
## 10 PSS3  Quite Disagree    13    2.9  2.9%    
## # ... with 67 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 77 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Normal   100    22.3 22.32%  
##  2 PSW2  Normal   111    24.8 24.78%  
##  3 PSW3  Normal    89    19.9 19.87%  
##  4 PSW4  Normal    88    19.6 19.64%  
##  5 PSW5  Normal    81    18.1 18.08%  
##  6 PSW6  Normal    87    19.4 19.42%  
##  7 PSW7  Normal    75    16.7 16.74%  
##  8 PSS1  Normal    61    13.6 13.62%  
##  9 PSS2  Normal    90    20.1 20.09%  
## 10 PSS3  Normal    78    17.4 17.41%  
## # ... with 67 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 77 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Quite Agree    93    20.8 20.76%  
##  2 PSW2  Quite Agree   100    22.3 22.32%  
##  3 PSW3  Quite Agree   100    22.3 22.32%  
##  4 PSW4  Quite Agree    97    21.6 21.65%  
##  5 PSW5  Quite Agree   107    23.9 23.88%  
##  6 PSW6  Quite Agree    76    17.0 16.96%  
##  7 PSW7  Quite Agree    83    18.5 18.53%  
##  8 PSS1  Quite Agree    86    19.2 19.2%   
##  9 PSS2  Quite Agree    90    20.1 20.09%  
## 10 PSS3  Quite Agree    99    22.1 22.1%   
## # ... with 67 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 77 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PSW1  Agree   180    40.2 40.18%  
##  2 PSW2  Agree   158    35.3 35.27%  
##  3 PSW3  Agree   187    41.7 41.74%  
##  4 PSW4  Agree   185    41.3 41.29%  
##  5 PSW5  Agree   187    41.7 41.74%  
##  6 PSW6  Agree   212    47.3 47.32%  
##  7 PSW7  Agree   206    46.0 45.98%  
##  8 PSS1  Agree   217    48.4 48.44%  
##  9 PSS2  Agree   177    39.5 39.51%  
## 10 PSS3  Agree   177    39.5 39.51%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    32    7.14 7.14%   
##  2 PSW2  Very Agree    32    7.14 7.14%   
##  3 PSW3  Very Agree    35    7.81 7.81%   
##  4 PSW4  Very Agree    33    7.37 7.37%   
##  5 PSW5  Very Agree    32    7.14 7.14%   
##  6 PSW6  Very Agree    40    8.93 8.93%   
##  7 PSW7  Very Agree    47   10.5  10.49%  
##  8 PSS1  Very Agree    52   11.6  11.61%  
##  9 PSS2  Very Agree    48   10.7  10.71%  
## 10 PSS3  Very Agree    49   10.9  10.94%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    32    7.14 7.14%   
##  2 PSW2  Very Agree    32    7.14 7.14%   
##  3 PSW3  Very Agree    35    7.81 7.81%   
##  4 PSW4  Very Agree    33    7.37 7.37%   
##  5 PSW5  Very Agree    32    7.14 7.14%   
##  6 PSW6  Very Agree    40    8.93 8.93%   
##  7 PSW7  Very Agree    47   10.5  10.49%  
##  8 PSS1  Very Agree    52   11.6  11.61%  
##  9 PSS2  Very Agree    48   10.7  10.71%  
## 10 PSS3  Very Agree    49   10.9  10.94%  
## # ... with 67 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 4, label = bar_text), size = 2, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 2, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 2, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.7. Vẽ biểu đồ likert cho dữ liệu Hồ Chí Minh-Nhãn tiếng việt

HCM_SEM_viet = within(HCM_SEM, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8", "PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7", "IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3", "PVA1", "PVA2", "PVA3"))
  })
str(HCM_SEM_viet)
## 'data.frame':    34496 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 77 levels "PSW1","PSW2",..: 65 65 65 65 65 65 65 65 65 65 ...
summary(HCM_SEM_viet)
##                              Res             BPE       
##  R<U+1EA5>t không d<U+1ED3>ng ý: 1352   PSW1   :  448  
##  Không d<U+1ED3>ng ý           : 3111   PSW2   :  448  
##  Khá không d<U+1ED3>ng ý       : 1842   PSW3   :  448  
##  Bình thu<U+1EDD>ng            : 5746   PSW4   :  448  
##  Khá d<U+1ED3>ng ý             : 5779   PSW5   :  448  
##  Ð<U+1ED3>ng ý                 :13218   PSW6   :  448  
##  R<U+1EA5>t d<U+1ED3>ng ý      : 3448   (Other):31808
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_viet %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  # arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8 PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4
## [31] PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2 PQR3 PQR4 PQR5 SAT1 SAT2 SAT3 LOY1 LOY2
## [46] LOY3 LOY4 LOY5 LOY6 LOY7 IMA1 IMA2 IMA3 IMA4 IMA5 PHB1 PHB2 PHB3 PHB4 PHB5
## [61] PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6 PDE7 PSO1 PSO2 PSO3 PVA1
## [76] PVA2 PVA3
## 77 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PVA3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 539 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.12 1.12%   
##  2 PSW1  Không d<U+1ED3>ng ý        17    3.79 3.79%   
##  3 PSW1  Khá không d<U+1ED3>ng ý    21    4.69 4.69%   
##  4 PSW1  Bình thu<U+1EDD>ng        100   22.3  22.32%  
##  5 PSW1  Khá d<U+1ED3>ng ý          93   20.8  20.76%  
##  6 PSW1  Ð<U+1ED3>ng ý             180   40.2  40.18%  
##  7 PSW1  R<U+1EA5>t d<U+1ED3>ng ý          32    7.14 7.14%   
##  8 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  9 PSW2  Không d<U+1ED3>ng ý        18    4.02 4.02%   
## 10 PSW2  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
## # ... with 529 more rows
library(extrafont)
theme_set(theme_minimal())
gg_viet <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn c\u1EE7a h\u00E0nh kh\u00E1ch v\u1EC1 h\u1EC7 th\u1ED1ng xe bu\u00FDt \u0111\u00F4 th\u1ECB Th\u00E0nh ph\u1ED1 H\u1ED3 Ch\u00ED Minh", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_viet
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 77 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.12 1.12%   
##  2 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  3 PSW3  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  4 PSW4  R<U+1EA5>t không d<U+1ED3>ng ý    13    2.9  2.9%    
##  5 PSW5  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.34 1.34%   
##  6 PSW6  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.89 0.89%   
##  7 PSW7  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.34 1.34%   
##  8 PSS1  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.67 0.67%   
##  9 PSS2  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
## 10 PSS3  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
## # ... with 67 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 77 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PSW1  Không d<U+1ED3>ng ý    17    3.79 3.79%   
##  2 PSW2  Không d<U+1ED3>ng ý    18    4.02 4.02%   
##  3 PSW3  Không d<U+1ED3>ng ý    10    2.23 2.23%   
##  4 PSW4  Không d<U+1ED3>ng ý    14    3.12 3.12%   
##  5 PSW5  Không d<U+1ED3>ng ý    20    4.46 4.46%   
##  6 PSW6  Không d<U+1ED3>ng ý    16    3.57 3.57%   
##  7 PSW7  Không d<U+1ED3>ng ý    21    4.69 4.69%   
##  8 PSS1  Không d<U+1ED3>ng ý    15    3.35 3.35%   
##  9 PSS2  Không d<U+1ED3>ng ý    17    3.79 3.79%   
## 10 PSS3  Không d<U+1ED3>ng ý    21    4.69 4.69%   
## # ... with 67 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 77 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  Khá không d<U+1ED3>ng ý    21    4.69 4.69%   
##  2 PSW2  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
##  3 PSW3  Khá không d<U+1ED3>ng ý    16    3.57 3.57%   
##  4 PSW4  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
##  5 PSW5  Khá không d<U+1ED3>ng ý    15    3.35 3.35%   
##  6 PSW6  Khá không d<U+1ED3>ng ý    13    2.9  2.9%    
##  7 PSW7  Khá không d<U+1ED3>ng ý    10    2.23 2.23%   
##  8 PSS1  Khá không d<U+1ED3>ng ý    14    3.12 3.12%   
##  9 PSS2  Khá không d<U+1ED3>ng ý    14    3.12 3.12%   
## 10 PSS3  Khá không d<U+1ED3>ng ý    13    2.9  2.9%    
## # ... with 67 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 77 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Bình thu<U+1EDD>ng   100    22.3 22.32%  
##  2 PSW2  Bình thu<U+1EDD>ng   111    24.8 24.78%  
##  3 PSW3  Bình thu<U+1EDD>ng    89    19.9 19.87%  
##  4 PSW4  Bình thu<U+1EDD>ng    88    19.6 19.64%  
##  5 PSW5  Bình thu<U+1EDD>ng    81    18.1 18.08%  
##  6 PSW6  Bình thu<U+1EDD>ng    87    19.4 19.42%  
##  7 PSW7  Bình thu<U+1EDD>ng    75    16.7 16.74%  
##  8 PSS1  Bình thu<U+1EDD>ng    61    13.6 13.62%  
##  9 PSS2  Bình thu<U+1EDD>ng    90    20.1 20.09%  
## 10 PSS3  Bình thu<U+1EDD>ng    78    17.4 17.41%  
## # ... with 67 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Khá d<U+1ED3>ng ý    93    20.8 20.76%  
##  2 PSW2  Khá d<U+1ED3>ng ý   100    22.3 22.32%  
##  3 PSW3  Khá d<U+1ED3>ng ý   100    22.3 22.32%  
##  4 PSW4  Khá d<U+1ED3>ng ý    97    21.6 21.65%  
##  5 PSW5  Khá d<U+1ED3>ng ý   107    23.9 23.88%  
##  6 PSW6  Khá d<U+1ED3>ng ý    76    17.0 16.96%  
##  7 PSW7  Khá d<U+1ED3>ng ý    83    18.5 18.53%  
##  8 PSS1  Khá d<U+1ED3>ng ý    86    19.2 19.2%   
##  9 PSS2  Khá d<U+1ED3>ng ý    90    20.1 20.09%  
## 10 PSS3  Khá d<U+1ED3>ng ý    99    22.1 22.1%   
## # ... with 67 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 77 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Ð<U+1ED3>ng ý   180    40.2 40.18%  
##  2 PSW2  Ð<U+1ED3>ng ý   158    35.3 35.27%  
##  3 PSW3  Ð<U+1ED3>ng ý   187    41.7 41.74%  
##  4 PSW4  Ð<U+1ED3>ng ý   185    41.3 41.29%  
##  5 PSW5  Ð<U+1ED3>ng ý   187    41.7 41.74%  
##  6 PSW6  Ð<U+1ED3>ng ý   212    47.3 47.32%  
##  7 PSW7  Ð<U+1ED3>ng ý   206    46.0 45.98%  
##  8 PSS1  Ð<U+1ED3>ng ý   217    48.4 48.44%  
##  9 PSS2  Ð<U+1ED3>ng ý   177    39.5 39.51%  
## 10 PSS3  Ð<U+1ED3>ng ý   177    39.5 39.51%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    35    7.81 7.81%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    33    7.37 7.37%   
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý    40    8.93 8.93%   
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý    47   10.5  10.49%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý    52   11.6  11.61%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    48   10.7  10.71%  
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    49   10.9  10.94%  
## # ... with 67 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 77 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    35    7.81 7.81%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    33    7.37 7.37%   
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý    40    8.93 8.93%   
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý    47   10.5  10.49%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý    52   11.6  11.61%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    48   10.7  10.71%  
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    49   10.9  10.94%  
## # ... with 67 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_viet + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 4, label = bar_text), size = 2, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 2, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 2, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.8. Vẽ biểu đồ likert cho dữ liệu của 2 thành phố theo từng nhóm constructs-Nhãn tiếng anh 3.8.1. Construct PSA - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSA
library(tidyverse)
library(compareGroups)
head(DN_HCM_SEM_PSA)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
dim(DN_HCM_SEM_PSA)
## [1] 18788     2
attach(DN_HCM_SEM_PSA)
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_HCM_SEM_PSA = within(DN_HCM_SEM_PSA, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8"))
  })
str(DN_HCM_SEM_PSA)
## 'data.frame':    18788 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 22 levels "PSW1","PSW2",..: 16 16 16 16 16 16 16 16 16 16 ...
summary(DN_HCM_SEM_PSA)
##              Res            BPE       
##  Very Disagree : 787   PSW1   :  854  
##  Disagree      :2107   PSW2   :  854  
##  Quite Disagree:1133   PSW3   :  854  
##  Normal        :2094   PSW4   :  854  
##  Quite Agree   :2916   PSW5   :  854  
##  Agree         :7745   PSW6   :  854  
##  Very Agree    :2006   (Other):13664
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_PSA %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8
## 22 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PSB8
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 154 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree     57    6.67 6.67%   
##  2 PSW1  Disagree         129   15.1  15.11%  
##  3 PSW1  Quite Disagree    52    6.09 6.09%   
##  4 PSW1  Normal            79    9.25 9.25%   
##  5 PSW1  Quite Agree      126   14.8  14.75%  
##  6 PSW1  Agree            329   38.5  38.52%  
##  7 PSW1  Very Agree        82    9.6  9.6%    
##  8 PSW2  Very Disagree     35    4.1  4.1%    
##  9 PSW2  Disagree          64    7.49 7.49%   
## 10 PSW2  Quite Disagree    50    5.85 5.85%   
## # ... with 144 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived safety (PSA) of bus users in urban areas of Viet Nam", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 22 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree    57    6.67 6.67%   
##  2 PSW2  Very Disagree    35    4.1  4.1%    
##  3 PSW3  Very Disagree    15    1.76 1.76%   
##  4 PSW4  Very Disagree    31    3.63 3.63%   
##  5 PSW5  Very Disagree    20    2.34 2.34%   
##  6 PSW6  Very Disagree    10    1.17 1.17%   
##  7 PSW7  Very Disagree    13    1.52 1.52%   
##  8 PSS1  Very Disagree    10    1.17 1.17%   
##  9 PSS2  Very Disagree    47    5.5  5.5%    
## 10 PSS3  Very Disagree    36    4.22 4.22%   
## # ... with 12 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 18 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PSW1  Disagree   129   15.1  15.11%  
##  2 PSW2  Disagree    64    7.49 7.49%   
##  3 PSW4  Disagree    78    9.13 9.13%   
##  4 PSW5  Disagree    31    3.63 3.63%   
##  5 PSS2  Disagree   140   16.4  16.39%  
##  6 PSS3  Disagree    84    9.84 9.84%   
##  7 PSS4  Disagree    35    4.1  4.1%    
##  8 PSS5  Disagree   140   16.4  16.39%  
##  9 PSS6  Disagree   249   29.2  29.16%  
## 10 PSS7  Disagree   270   31.6  31.62%  
## 11 PSB1  Disagree   100   11.7  11.71%  
## 12 PSB2  Disagree   113   13.2  13.23%  
## 13 PSB3  Disagree    83    9.72 9.72%   
## 14 PSB4  Disagree    38    4.45 4.45%   
## 15 PSB5  Disagree   139   16.3  16.28%  
## 16 PSB6  Disagree    92   10.8  10.77%  
## 17 PSB7  Disagree   215   25.2  25.18%  
## 18 PSB8  Disagree    50    5.85 5.85%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 22 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Quite Disagree    52    6.09 6.09%   
##  2 PSW2  Quite Disagree    50    5.85 5.85%   
##  3 PSW3  Quite Disagree    29    3.4  3.4%    
##  4 PSW4  Quite Disagree    57    6.67 6.67%   
##  5 PSW5  Quite Disagree    22    2.58 2.58%   
##  6 PSW6  Quite Disagree     9    1.05 1.05%   
##  7 PSW7  Quite Disagree    18    2.11 2.11%   
##  8 PSS1  Quite Disagree    29    3.4  3.4%    
##  9 PSS2  Quite Disagree    67    7.85 7.85%   
## 10 PSS3  Quite Disagree    48    5.62 5.62%   
## # ... with 12 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 22 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Normal    79    9.25 9.25%   
##  2 PSW2  Normal    86   10.1  10.07%  
##  3 PSW3  Normal    65    7.61 7.61%   
##  4 PSW4  Normal   144   16.9  16.86%  
##  5 PSW5  Normal    75    8.78 8.78%   
##  6 PSW6  Normal    39    4.57 4.57%   
##  7 PSW7  Normal    50    5.85 5.85%   
##  8 PSS1  Normal    60    7.03 7.03%   
##  9 PSS2  Normal    97   11.4  11.36%  
## 10 PSS3  Normal    84    9.84 9.84%   
## # ... with 12 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 22 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Quite Agree   126   14.8  14.75%  
##  2 PSW2  Quite Agree   126   14.8  14.75%  
##  3 PSW3  Quite Agree   148   17.3  17.33%  
##  4 PSW4  Quite Agree   161   18.8  18.85%  
##  5 PSW5  Quite Agree   101   11.8  11.83%  
##  6 PSW6  Quite Agree    68    7.96 7.96%   
##  7 PSW7  Quite Agree    92   10.8  10.77%  
##  8 PSS1  Quite Agree   102   11.9  11.94%  
##  9 PSS2  Quite Agree   153   17.9  17.92%  
## 10 PSS3  Quite Agree   149   17.4  17.45%  
## # ... with 12 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 22 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PSW1  Agree   329    38.5 38.52%  
##  2 PSW2  Agree   400    46.8 46.84%  
##  3 PSW3  Agree   472    55.3 55.27%  
##  4 PSW4  Agree   307    36.0 35.95%  
##  5 PSW5  Agree   435    50.9 50.94%  
##  6 PSW6  Agree   495    58.0 57.96%  
##  7 PSW7  Agree   500    58.6 58.55%  
##  8 PSS1  Agree   435    50.9 50.94%  
##  9 PSS2  Agree   294    34.4 34.43%  
## 10 PSS3  Agree   380    44.5 44.5%   
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    82    9.6  9.6%    
##  2 PSW2  Very Agree    93   10.9  10.89%  
##  3 PSW3  Very Agree   103   12.1  12.06%  
##  4 PSW4  Very Agree    76    8.9  8.9%    
##  5 PSW5  Very Agree   170   19.9  19.91%  
##  6 PSW6  Very Agree   228   26.7  26.7%   
##  7 PSW7  Very Agree   175   20.5  20.49%  
##  8 PSS1  Very Agree   194   22.7  22.72%  
##  9 PSS2  Very Agree    56    6.56 6.56%   
## 10 PSS3  Very Agree    73    8.55 8.55%   
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    82    9.6  9.6%    
##  2 PSW2  Very Agree    93   10.9  10.89%  
##  3 PSW3  Very Agree   103   12.1  12.06%  
##  4 PSW4  Very Agree    76    8.9  8.9%    
##  5 PSW5  Very Agree   170   19.9  19.91%  
##  6 PSW6  Very Agree   228   26.7  26.7%   
##  7 PSW7  Very Agree   175   20.5  20.49%  
##  8 PSS1  Very Agree   194   22.7  22.72%  
##  9 PSS2  Very Agree    56    6.56 6.56%   
## 10 PSS3  Very Agree    73    8.55 8.55%   
## # ... with 12 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.8.2. Construct PSQ - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSA
library(tidyverse)
library(compareGroups)
head(DN_HCM_SEM_PSQ)
##   Res  BPE
## 1   6 PQT1
## 2   4 PQT1
## 3   2 PQT1
## 4   6 PQT1
## 5   6 PQT1
## 6   4 PQT1
dim(DN_HCM_SEM_PSQ)
## [1] 15372     2
attach(DN_HCM_SEM_PSQ)
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_HCM_SEM_PSQ = within(DN_HCM_SEM_PSQ, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5"))
  })
str(DN_HCM_SEM_PSQ)
## 'data.frame':    15372 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 4 2 6 6 4 2 5 5 7 ...
##  $ BPE: Factor w/ 18 levels "PQT1","PQT2",..: 15 15 15 15 15 15 15 15 15 15 ...
summary(DN_HCM_SEM_PSQ)
##              Res            BPE       
##  Very Disagree : 290   PQT1   :  854  
##  Disagree      : 702   PQT2   :  854  
##  Quite Disagree: 808   PQT3   :  854  
##  Normal        :1917   PQT4   :  854  
##  Quite Agree   :3304   PQC1   :  854  
##  Agree         :6527   PQC2   :  854  
##  Very Agree    :1824   (Other):10248
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_PSQ %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2
## [16] PQR3 PQR4 PQR5
## 18 Levels: PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 ... PQR5
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PQT1  Very Disagree     17    1.99 1.99%   
##  2 PQT1  Disagree          39    4.57 4.57%   
##  3 PQT1  Quite Disagree    59    6.91 6.91%   
##  4 PQT1  Normal            99   11.6  11.59%  
##  5 PQT1  Quite Agree      204   23.9  23.89%  
##  6 PQT1  Agree            349   40.9  40.87%  
##  7 PQT1  Very Agree        87   10.2  10.19%  
##  8 PQT2  Very Disagree     10    1.17 1.17%   
##  9 PQT2  Disagree          33    3.86 3.86%   
## 10 PQT2  Quite Disagree    15    1.76 1.76%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived service quality (PSQ) of bus passengers in urban areas of Viet Nam", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PQT1  Very Disagree    17    1.99 1.99%   
##  2 PQT2  Very Disagree    10    1.17 1.17%   
##  3 PQT3  Very Disagree    16    1.87 1.87%   
##  4 PQT4  Very Disagree    16    1.87 1.87%   
##  5 PQC1  Very Disagree    10    1.17 1.17%   
##  6 PQC2  Very Disagree    14    1.64 1.64%   
##  7 PQC3  Very Disagree    13    1.52 1.52%   
##  8 PQC4  Very Disagree    11    1.29 1.29%   
##  9 PQC5  Very Disagree     9    1.05 1.05%   
## 10 PQP1  Very Disagree    23    2.69 2.69%   
## 11 PQP2  Very Disagree    12    1.41 1.41%   
## 12 PQP3  Very Disagree    19    2.22 2.22%   
## 13 PQP4  Very Disagree    29    3.4  3.4%    
## 14 PQR1  Very Disagree    14    1.64 1.64%   
## 15 PQR2  Very Disagree    13    1.52 1.52%   
## 16 PQR3  Very Disagree    18    2.11 2.11%   
## 17 PQR4  Very Disagree    30    3.51 3.51%   
## 18 PQR5  Very Disagree    16    1.87 1.87%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 16 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PQT1  Disagree    39    4.57 4.57%   
##  2 PQT2  Disagree    33    3.86 3.86%   
##  3 PQT3  Disagree    43    5.04 5.04%   
##  4 PQT4  Disagree    50    5.85 5.85%   
##  5 PQC2  Disagree    27    3.16 3.16%   
##  6 PQC3  Disagree    31    3.63 3.63%   
##  7 PQC4  Disagree    26    3.04 3.04%   
##  8 PQP1  Disagree    47    5.5  5.5%    
##  9 PQP2  Disagree    31    3.63 3.63%   
## 10 PQP3  Disagree    42    4.92 4.92%   
## 11 PQP4  Disagree    75    8.78 8.78%   
## 12 PQR1  Disagree    48    5.62 5.62%   
## 13 PQR2  Disagree    32    3.75 3.75%   
## 14 PQR3  Disagree    45    5.27 5.27%   
## 15 PQR4  Disagree    44    5.15 5.15%   
## 16 PQR5  Disagree    44    5.15 5.15%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PQT1  Quite Disagree    59    6.91 6.91%   
##  2 PQT2  Quite Disagree    15    1.76 1.76%   
##  3 PQT3  Quite Disagree    59    6.91 6.91%   
##  4 PQT4  Quite Disagree    53    6.21 6.21%   
##  5 PQC1  Quite Disagree    31    3.63 3.63%   
##  6 PQC2  Quite Disagree    40    4.68 4.68%   
##  7 PQC3  Quite Disagree    40    4.68 4.68%   
##  8 PQC4  Quite Disagree    25    2.93 2.93%   
##  9 PQC5  Quite Disagree    12    1.41 1.41%   
## 10 PQP1  Quite Disagree    75    8.78 8.78%   
## 11 PQP2  Quite Disagree    56    6.56 6.56%   
## 12 PQP3  Quite Disagree    61    7.14 7.14%   
## 13 PQP4  Quite Disagree    75    8.78 8.78%   
## 14 PQR1  Quite Disagree    42    4.92 4.92%   
## 15 PQR2  Quite Disagree    37    4.33 4.33%   
## 16 PQR3  Quite Disagree    31    3.63 3.63%   
## 17 PQR4  Quite Disagree    50    5.85 5.85%   
## 18 PQR5  Quite Disagree    47    5.5  5.5%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PQT1  Normal    99   11.6  11.59%  
##  2 PQT2  Normal    68    7.96 7.96%   
##  3 PQT3  Normal   101   11.8  11.83%  
##  4 PQT4  Normal   252   29.5  29.51%  
##  5 PQC1  Normal    66    7.73 7.73%   
##  6 PQC2  Normal   107   12.5  12.53%  
##  7 PQC3  Normal    98   11.5  11.48%  
##  8 PQC4  Normal    98   11.5  11.48%  
##  9 PQC5  Normal    85    9.95 9.95%   
## 10 PQP1  Normal    97   11.4  11.36%  
## 11 PQP2  Normal   107   12.5  12.53%  
## 12 PQP3  Normal   124   14.5  14.52%  
## 13 PQP4  Normal    98   11.5  11.48%  
## 14 PQR1  Normal   180   21.1  21.08%  
## 15 PQR2  Normal    91   10.7  10.66%  
## 16 PQR3  Normal    85    9.95 9.95%   
## 17 PQR4  Normal    75    8.78 8.78%   
## 18 PQR5  Normal    86   10.1  10.07%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PQT1  Quite Agree   204    23.9 23.89%  
##  2 PQT2  Quite Agree   139    16.3 16.28%  
##  3 PQT3  Quite Agree   203    23.8 23.77%  
##  4 PQT4  Quite Agree   163    19.1 19.09%  
##  5 PQC1  Quite Agree   169    19.8 19.79%  
##  6 PQC2  Quite Agree   166    19.4 19.44%  
##  7 PQC3  Quite Agree   188    22.0 22.01%  
##  8 PQC4  Quite Agree   187    21.9 21.9%   
##  9 PQC5  Quite Agree   158    18.5 18.5%   
## 10 PQP1  Quite Agree   240    28.1 28.1%   
## 11 PQP2  Quite Agree   187    21.9 21.9%   
## 12 PQP3  Quite Agree   216    25.3 25.29%  
## 13 PQP4  Quite Agree   194    22.7 22.72%  
## 14 PQR1  Quite Agree   150    17.6 17.56%  
## 15 PQR2  Quite Agree   193    22.6 22.6%   
## 16 PQR3  Quite Agree   143    16.7 16.74%  
## 17 PQR4  Quite Agree   180    21.1 21.08%  
## 18 PQR5  Quite Agree   224    26.2 26.23%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PQT1  Agree   349    40.9 40.87%  
##  2 PQT2  Agree   446    52.2 52.22%  
##  3 PQT3  Agree   347    40.6 40.63%  
##  4 PQT4  Agree   264    30.9 30.91%  
##  5 PQC1  Agree   411    48.1 48.13%  
##  6 PQC2  Agree   399    46.7 46.72%  
##  7 PQC3  Agree   378    44.3 44.26%  
##  8 PQC4  Agree   417    48.8 48.83%  
##  9 PQC5  Agree   455    53.3 53.28%  
## 10 PQP1  Agree   304    35.6 35.6%   
## 11 PQP2  Agree   363    42.5 42.51%  
## 12 PQP3  Agree   319    37.4 37.35%  
## 13 PQP4  Agree   303    35.5 35.48%  
## 14 PQR1  Agree   348    40.8 40.75%  
## 15 PQR2  Agree   361    42.3 42.27%  
## 16 PQR3  Agree   375    43.9 43.91%  
## 17 PQR4  Agree   347    40.6 40.63%  
## 18 PQR5  Agree   341    39.9 39.93%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Very Agree    87   10.2  10.19%  
##  2 PQT2  Very Agree   143   16.7  16.74%  
##  3 PQT3  Very Agree    85    9.95 9.95%   
##  4 PQT4  Very Agree    56    6.56 6.56%   
##  5 PQC1  Very Agree   143   16.7  16.74%  
##  6 PQC2  Very Agree   101   11.8  11.83%  
##  7 PQC3  Very Agree   106   12.4  12.41%  
##  8 PQC4  Very Agree    90   10.5  10.54%  
##  9 PQC5  Very Agree   114   13.4  13.35%  
## 10 PQP1  Very Agree    68    7.96 7.96%   
## 11 PQP2  Very Agree    98   11.5  11.48%  
## 12 PQP3  Very Agree    73    8.55 8.55%   
## 13 PQP4  Very Agree    80    9.37 9.37%   
## 14 PQR1  Very Agree    72    8.43 8.43%   
## 15 PQR2  Very Agree   127   14.9  14.87%  
## 16 PQR3  Very Agree   157   18.4  18.38%  
## 17 PQR4  Very Agree   128   15.0  14.99%  
## 18 PQR5  Very Agree    96   11.2  11.24%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Very Agree    87   10.2  10.19%  
##  2 PQT2  Very Agree   143   16.7  16.74%  
##  3 PQT3  Very Agree    85    9.95 9.95%   
##  4 PQT4  Very Agree    56    6.56 6.56%   
##  5 PQC1  Very Agree   143   16.7  16.74%  
##  6 PQC2  Very Agree   101   11.8  11.83%  
##  7 PQC3  Very Agree   106   12.4  12.41%  
##  8 PQC4  Very Agree    90   10.5  10.54%  
##  9 PQC5  Very Agree   114   13.4  13.35%  
## 10 PQP1  Very Agree    68    7.96 7.96%   
## 11 PQP2  Very Agree    98   11.5  11.48%  
## 12 PQP3  Very Agree    73    8.55 8.55%   
## 13 PQP4  Very Agree    80    9.37 9.37%   
## 14 PQR1  Very Agree    72    8.43 8.43%   
## 15 PQR2  Very Agree   127   14.9  14.87%  
## 16 PQR3  Very Agree   157   18.4  18.38%  
## 17 PQR4  Very Agree   128   15.0  14.99%  
## 18 PQR5  Very Agree    96   11.2  11.24%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.8.3. Nhom các contructs thuộc stimulus - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSA
library(tidyverse)
library(compareGroups)
head(DN_HCM_SEM_S)
##   Res  BPE
## 1   6 PHB1
## 2   3 PHB1
## 3   5 PHB1
## 4   5 PHB1
## 5   5 PHB1
## 6   4 PHB1
dim(DN_HCM_SEM_S)
## [1] 16226     2
attach(DN_HCM_SEM_S)
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_HCM_SEM_S = within(DN_HCM_SEM_S, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3"))
  })
str(DN_HCM_SEM_S)
## 'data.frame':    16226 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 3 5 5 5 4 3 6 6 7 ...
##  $ BPE: Factor w/ 19 levels "PHB1","PHB2",..: 12 12 12 12 12 12 12 12 12 12 ...
summary(DN_HCM_SEM_S)
##              Res            BPE       
##  Very Disagree : 419   PHB1   :  854  
##  Disagree      : 830   PHB2   :  854  
##  Quite Disagree: 750   PHB3   :  854  
##  Normal        :2467   PHB4   :  854  
##  Quite Agree   :3366   PHB5   :  854  
##  Agree         :5949   PEB1   :  854  
##  Very Agree    :2445   (Other):11102
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_S %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6
## [16] PDE7 PSO1 PSO2 PSO3
## 19 Levels: PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 ... PSO3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 133 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PHB1  Very Disagree     39    4.57 4.57%   
##  2 PHB1  Disagree          65    7.61 7.61%   
##  3 PHB1  Quite Disagree    81    9.48 9.48%   
##  4 PHB1  Normal           134   15.7  15.69%  
##  5 PHB1  Quite Agree      188   22.0  22.01%  
##  6 PHB1  Agree            272   31.8  31.85%  
##  7 PHB1  Very Agree        75    8.78 8.78%   
##  8 PHB2  Very Disagree     18    2.11 2.11%   
##  9 PHB2  Disagree          26    3.04 3.04%   
## 10 PHB2  Quite Disagree    35    4.1  4.1%    
## # ... with 123 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived health (PHB), perceived environmental benefits (BEB), perceived social benefits (PSO), perceived design (PDE) of bus passengers in urban areas of Viet Nam", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 19 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PHB1  Very Disagree    39    4.57 4.57%   
##  2 PHB2  Very Disagree    18    2.11 2.11%   
##  3 PHB3  Very Disagree    17    1.99 1.99%   
##  4 PHB4  Very Disagree    17    1.99 1.99%   
##  5 PHB5  Very Disagree    21    2.46 2.46%   
##  6 PEB1  Very Disagree    16    1.87 1.87%   
##  7 PEB2  Very Disagree    20    2.34 2.34%   
##  8 PEB3  Very Disagree    24    2.81 2.81%   
##  9 PEB4  Very Disagree    25    2.93 2.93%   
## 10 PDE1  Very Disagree    25    2.93 2.93%   
## 11 PDE2  Very Disagree    24    2.81 2.81%   
## 12 PDE3  Very Disagree    24    2.81 2.81%   
## 13 PDE4  Very Disagree    13    1.52 1.52%   
## 14 PDE5  Very Disagree    15    1.76 1.76%   
## 15 PDE6  Very Disagree    13    1.52 1.52%   
## 16 PDE7  Very Disagree    22    2.58 2.58%   
## 17 PSO1  Very Disagree    28    3.28 3.28%   
## 18 PSO2  Very Disagree    29    3.4  3.4%    
## 19 PSO3  Very Disagree    29    3.4  3.4%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 10 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PHB1  Disagree    65    7.61 7.61%   
##  2 PHB2  Disagree    26    3.04 3.04%   
##  3 PHB3  Disagree    50    5.85 5.85%   
##  4 PHB4  Disagree    63    7.38 7.38%   
##  5 PHB5  Disagree    46    5.39 5.39%   
##  6 PEB1  Disagree    44    5.15 5.15%   
##  7 PEB2  Disagree    56    6.56 6.56%   
##  8 PSO1  Disagree   119   13.9  13.93%  
##  9 PSO2  Disagree   133   15.6  15.57%  
## 10 PSO3  Disagree    92   10.8  10.77%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 19 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PHB1  Quite Disagree    81    9.48 9.48%   
##  2 PHB2  Quite Disagree    35    4.1  4.1%    
##  3 PHB3  Quite Disagree    42    4.92 4.92%   
##  4 PHB4  Quite Disagree    58    6.79 6.79%   
##  5 PHB5  Quite Disagree    34    3.98 3.98%   
##  6 PEB1  Quite Disagree    49    5.74 5.74%   
##  7 PEB2  Quite Disagree    59    6.91 6.91%   
##  8 PEB3  Quite Disagree    12    1.41 1.41%   
##  9 PEB4  Quite Disagree    20    2.34 2.34%   
## 10 PDE1  Quite Disagree    22    2.58 2.58%   
## 11 PDE2  Quite Disagree    22    2.58 2.58%   
## 12 PDE3  Quite Disagree    35    4.1  4.1%    
## 13 PDE4  Quite Disagree    25    2.93 2.93%   
## 14 PDE5  Quite Disagree    39    4.57 4.57%   
## 15 PDE6  Quite Disagree     9    1.05 1.05%   
## 16 PDE7  Quite Disagree     5    0.59 0.59%   
## 17 PSO1  Quite Disagree    64    7.49 7.49%   
## 18 PSO2  Quite Disagree    76    8.9  8.9%    
## 19 PSO3  Quite Disagree    63    7.38 7.38%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 19 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PHB1  Normal   134   15.7  15.69%  
##  2 PHB2  Normal    96   11.2  11.24%  
##  3 PHB3  Normal   200   23.4  23.42%  
##  4 PHB4  Normal   214   25.1  25.06%  
##  5 PHB5  Normal    99   11.6  11.59%  
##  6 PEB1  Normal   192   22.5  22.48%  
##  7 PEB2  Normal   196   23.0  22.95%  
##  8 PEB3  Normal    59    6.91 6.91%   
##  9 PEB4  Normal    67    7.85 7.85%   
## 10 PDE1  Normal    77    9.02 9.02%   
## 11 PDE2  Normal    93   10.9  10.89%  
## 12 PDE3  Normal    98   11.5  11.48%  
## 13 PDE4  Normal    68    7.96 7.96%   
## 14 PDE5  Normal    87   10.2  10.19%  
## 15 PDE6  Normal    53    6.21 6.21%   
## 16 PDE7  Normal    62    7.26 7.26%   
## 17 PSO1  Normal   227   26.6  26.58%  
## 18 PSO2  Normal   227   26.6  26.58%  
## 19 PSO3  Normal   218   25.5  25.53%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 19 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PHB1  Quite Agree   188    22.0 22.01%  
##  2 PHB2  Quite Agree   173    20.3 20.26%  
##  3 PHB3  Quite Agree   200    23.4 23.42%  
##  4 PHB4  Quite Agree   194    22.7 22.72%  
##  5 PHB5  Quite Agree   187    21.9 21.9%   
##  6 PEB1  Quite Agree   206    24.1 24.12%  
##  7 PEB2  Quite Agree   200    23.4 23.42%  
##  8 PEB3  Quite Agree   126    14.8 14.75%  
##  9 PEB4  Quite Agree   170    19.9 19.91%  
## 10 PDE1  Quite Agree   167    19.6 19.56%  
## 11 PDE2  Quite Agree   166    19.4 19.44%  
## 12 PDE3  Quite Agree   215    25.2 25.18%  
## 13 PDE4  Quite Agree   163    19.1 19.09%  
## 14 PDE5  Quite Agree   173    20.3 20.26%  
## 15 PDE6  Quite Agree   131    15.3 15.34%  
## 16 PDE7  Quite Agree   116    13.6 13.58%  
## 17 PSO1  Quite Agree   223    26.1 26.11%  
## 18 PSO2  Quite Agree   197    23.1 23.07%  
## 19 PSO3  Quite Agree   171    20.0 20.02%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 19 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PHB1  Agree   272    31.8 31.85%  
##  2 PHB2  Agree   396    46.4 46.37%  
##  3 PHB3  Agree   273    32.0 31.97%  
##  4 PHB4  Agree   241    28.2 28.22%  
##  5 PHB5  Agree   380    44.5 44.5%   
##  6 PEB1  Agree   263    30.8 30.8%   
##  7 PEB2  Agree   251    29.4 29.39%  
##  8 PEB3  Agree   389    45.6 45.55%  
##  9 PEB4  Agree   351    41.1 41.1%   
## 10 PDE1  Agree   353    41.3 41.33%  
## 11 PDE2  Agree   356    41.7 41.69%  
## 12 PDE3  Agree   351    41.1 41.1%   
## 13 PDE4  Agree   376    44.0 44.03%  
## 14 PDE5  Agree   382    44.7 44.73%  
## 15 PDE6  Agree   389    45.6 45.55%  
## 16 PDE7  Agree   413    48.4 48.36%  
## 17 PSO1  Agree   147    17.2 17.21%  
## 18 PSO2  Agree   143    16.7 16.74%  
## 19 PSO3  Agree   223    26.1 26.11%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  Very Agree    75    8.78 8.78%   
##  2 PHB2  Very Agree   110   12.9  12.88%  
##  3 PHB3  Very Agree    72    8.43 8.43%   
##  4 PHB4  Very Agree    67    7.85 7.85%   
##  5 PHB5  Very Agree    87   10.2  10.19%  
##  6 PEB1  Very Agree    84    9.84 9.84%   
##  7 PEB2  Very Agree    72    8.43 8.43%   
##  8 PEB3  Very Agree   236   27.6  27.63%  
##  9 PEB4  Very Agree   204   23.9  23.89%  
## 10 PDE1  Very Agree   191   22.4  22.37%  
## 11 PDE2  Very Agree   174   20.4  20.37%  
## 12 PDE3  Very Agree   113   13.2  13.23%  
## 13 PDE4  Very Agree   187   21.9  21.9%   
## 14 PDE5  Very Agree   139   16.3  16.28%  
## 15 PDE6  Very Agree   252   29.5  29.51%  
## 16 PDE7  Very Agree   229   26.8  26.81%  
## 17 PSO1  Very Agree    46    5.39 5.39%   
## 18 PSO2  Very Agree    49    5.74 5.74%   
## 19 PSO3  Very Agree    58    6.79 6.79%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  Very Agree    75    8.78 8.78%   
##  2 PHB2  Very Agree   110   12.9  12.88%  
##  3 PHB3  Very Agree    72    8.43 8.43%   
##  4 PHB4  Very Agree    67    7.85 7.85%   
##  5 PHB5  Very Agree    87   10.2  10.19%  
##  6 PEB1  Very Agree    84    9.84 9.84%   
##  7 PEB2  Very Agree    72    8.43 8.43%   
##  8 PEB3  Very Agree   236   27.6  27.63%  
##  9 PEB4  Very Agree   204   23.9  23.89%  
## 10 PDE1  Very Agree   191   22.4  22.37%  
## 11 PDE2  Very Agree   174   20.4  20.37%  
## 12 PDE3  Very Agree   113   13.2  13.23%  
## 13 PDE4  Very Agree   187   21.9  21.9%   
## 14 PDE5  Very Agree   139   16.3  16.28%  
## 15 PDE6  Very Agree   252   29.5  29.51%  
## 16 PDE7  Very Agree   229   26.8  26.81%  
## 17 PSO1  Very Agree    46    5.39 5.39%   
## 18 PSO2  Very Agree    49    5.74 5.74%   
## 19 PSO3  Very Agree    58    6.79 6.79%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.8.4. Nhóm các Constructs thuộc Organism and response - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSA
library(tidyverse)
library(compareGroups)
head(DN_HCM_SEM_OR)
##   Res  BPE
## 1   6 IMA1
## 2   4 IMA1
## 3   4 IMA1
## 4   5 IMA1
## 5   5 IMA1
## 6   4 IMA1
dim(DN_HCM_SEM_OR)
## [1] 15372     2
attach(DN_HCM_SEM_OR)
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_HCM_SEM_OR = within(DN_HCM_SEM_OR, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PVA1", "PVA2", "PVA3", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7"))
  })
str(DN_HCM_SEM_OR)
## 'data.frame':    15372 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 4 4 5 5 4 2 6 5 6 ...
##  $ BPE: Factor w/ 18 levels "IMA1","IMA2",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(DN_HCM_SEM_OR)
##              Res            BPE       
##  Very Disagree : 146   IMA1   :  854  
##  Disagree      : 351   IMA2   :  854  
##  Quite Disagree: 453   IMA3   :  854  
##  Normal        :1925   IMA4   :  854  
##  Quite Agree   :3400   IMA5   :  854  
##  Agree         :6912   PVA1   :  854  
##  Very Agree    :2185   (Other):10248
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_OR %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4
## [16] LOY5 LOY6 LOY7
## 18 Levels: IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 ... LOY7
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 IMA1  Very Disagree      6    0.7  0.7%    
##  2 IMA1  Disagree          18    2.11 2.11%   
##  3 IMA1  Quite Disagree    32    3.75 3.75%   
##  4 IMA1  Normal           154   18.0  18.03%  
##  5 IMA1  Quite Agree      231   27.0  27.05%  
##  6 IMA1  Agree            349   40.9  40.87%  
##  7 IMA1  Very Agree        64    7.49 7.49%   
##  8 IMA2  Very Disagree     11    1.29 1.29%   
##  9 IMA2  Disagree          19    2.22 2.22%   
## 10 IMA2  Quite Disagree    24    2.81 2.81%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived image (IMA), perceived value (PVA), satisfation (SAT), loyalty (LOY) towards urban bus systems in Viet Nam", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 IMA1  Very Disagree     6    0.7  0.7%    
##  2 IMA2  Very Disagree    11    1.29 1.29%   
##  3 IMA3  Very Disagree    11    1.29 1.29%   
##  4 IMA4  Very Disagree    13    1.52 1.52%   
##  5 IMA5  Very Disagree     6    0.7  0.7%    
##  6 PVA1  Very Disagree     4    0.47 0.47%   
##  7 PVA2  Very Disagree     6    0.7  0.7%    
##  8 PVA3  Very Disagree     3    0.35 0.35%   
##  9 SAT1  Very Disagree    13    1.52 1.52%   
## 10 SAT2  Very Disagree    12    1.41 1.41%   
## 11 SAT3  Very Disagree    15    1.76 1.76%   
## 12 LOY1  Very Disagree    13    1.52 1.52%   
## 13 LOY2  Very Disagree     5    0.59 0.59%   
## 14 LOY3  Very Disagree     3    0.35 0.35%   
## 15 LOY4  Very Disagree     2    0.23 0.23%   
## 16 LOY5  Very Disagree     9    1.05 1.05%   
## 17 LOY6  Very Disagree     6    0.7  0.7%    
## 18 LOY7  Very Disagree     8    0.94 0.94%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 1 x 5
##   BPE   Res          n percent bar_text
##   <fct> <fct>    <int>   <dbl> <chr>   
## 1 SAT3  Disagree    58    6.79 6.79%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 IMA1  Quite Disagree    32    3.75 3.75%   
##  2 IMA2  Quite Disagree    24    2.81 2.81%   
##  3 IMA3  Quite Disagree    19    2.22 2.22%   
##  4 IMA4  Quite Disagree    25    2.93 2.93%   
##  5 IMA5  Quite Disagree    19    2.22 2.22%   
##  6 PVA1  Quite Disagree    18    2.11 2.11%   
##  7 PVA2  Quite Disagree    15    1.76 1.76%   
##  8 PVA3  Quite Disagree    18    2.11 2.11%   
##  9 SAT1  Quite Disagree    30    3.51 3.51%   
## 10 SAT2  Quite Disagree    25    2.93 2.93%   
## 11 SAT3  Quite Disagree    51    5.97 5.97%   
## 12 LOY1  Quite Disagree    15    1.76 1.76%   
## 13 LOY2  Quite Disagree    18    2.11 2.11%   
## 14 LOY3  Quite Disagree    39    4.57 4.57%   
## 15 LOY4  Quite Disagree    21    2.46 2.46%   
## 16 LOY5  Quite Disagree    34    3.98 3.98%   
## 17 LOY6  Quite Disagree    24    2.81 2.81%   
## 18 LOY7  Quite Disagree    26    3.04 3.04%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 IMA1  Normal   154   18.0  18.03%  
##  2 IMA2  Normal   157   18.4  18.38%  
##  3 IMA3  Normal   128   15.0  14.99%  
##  4 IMA4  Normal   114   13.4  13.35%  
##  5 IMA5  Normal   104   12.2  12.18%  
##  6 PVA1  Normal   112   13.1  13.11%  
##  7 PVA2  Normal    98   11.5  11.48%  
##  8 PVA3  Normal    91   10.7  10.66%  
##  9 SAT1  Normal   128   15.0  14.99%  
## 10 SAT2  Normal   109   12.8  12.76%  
## 11 SAT3  Normal   140   16.4  16.39%  
## 12 LOY1  Normal    79    9.25 9.25%   
## 13 LOY2  Normal    56    6.56 6.56%   
## 14 LOY3  Normal    99   11.6  11.59%  
## 15 LOY4  Normal    69    8.08 8.08%   
## 16 LOY5  Normal   110   12.9  12.88%  
## 17 LOY6  Normal    99   11.6  11.59%  
## 18 LOY7  Normal    78    9.13 9.13%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 IMA1  Quite Agree   231    27.0 27.05%  
##  2 IMA2  Quite Agree   213    24.9 24.94%  
##  3 IMA3  Quite Agree   206    24.1 24.12%  
##  4 IMA4  Quite Agree   199    23.3 23.3%   
##  5 IMA5  Quite Agree   203    23.8 23.77%  
##  6 PVA1  Quite Agree   166    19.4 19.44%  
##  7 PVA2  Quite Agree   169    19.8 19.79%  
##  8 PVA3  Quite Agree   160    18.7 18.74%  
##  9 SAT1  Quite Agree   212    24.8 24.82%  
## 10 SAT2  Quite Agree   213    24.9 24.94%  
## 11 SAT3  Quite Agree   172    20.1 20.14%  
## 12 LOY1  Quite Agree   156    18.3 18.27%  
## 13 LOY2  Quite Agree   129    15.1 15.11%  
## 14 LOY3  Quite Agree   194    22.7 22.72%  
## 15 LOY4  Quite Agree   157    18.4 18.38%  
## 16 LOY5  Quite Agree   213    24.9 24.94%  
## 17 LOY6  Quite Agree   196    23.0 22.95%  
## 18 LOY7  Quite Agree   211    24.7 24.71%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 IMA1  Agree   349    40.9 40.87%  
##  2 IMA2  Agree   365    42.7 42.74%  
##  3 IMA3  Agree   401    47.0 46.96%  
##  4 IMA4  Agree   405    47.4 47.42%  
##  5 IMA5  Agree   418    49.0 48.95%  
##  6 PVA1  Agree   431    50.5 50.47%  
##  7 PVA2  Agree   427    50   50%     
##  8 PVA3  Agree   436    51.0 51.05%  
##  9 SAT1  Agree   337    39.5 39.46%  
## 10 SAT2  Agree   344    40.3 40.28%  
## 11 SAT3  Agree   293    34.3 34.31%  
## 12 LOY1  Agree   402    47.1 47.07%  
## 13 LOY2  Agree   413    48.4 48.36%  
## 14 LOY3  Agree   343    40.2 40.16%  
## 15 LOY4  Agree   413    48.4 48.36%  
## 16 LOY5  Agree   361    42.3 42.27%  
## 17 LOY6  Agree   383    44.8 44.85%  
## 18 LOY7  Agree   391    45.8 45.78%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Very Agree    64    7.49 7.49%   
##  2 IMA2  Very Agree    65    7.61 7.61%   
##  3 IMA3  Very Agree    78    9.13 9.13%   
##  4 IMA4  Very Agree    84    9.84 9.84%   
##  5 IMA5  Very Agree    83    9.72 9.72%   
##  6 PVA1  Very Agree   105   12.3  12.3%   
##  7 PVA2  Very Agree   117   13.7  13.7%   
##  8 PVA3  Very Agree   130   15.2  15.22%  
##  9 SAT1  Very Agree   117   13.7  13.7%   
## 10 SAT2  Very Agree   128   15.0  14.99%  
## 11 SAT3  Very Agree   125   14.6  14.64%  
## 12 LOY1  Very Agree   173   20.3  20.26%  
## 13 LOY2  Very Agree   225   26.4  26.35%  
## 14 LOY3  Very Agree   151   17.7  17.68%  
## 15 LOY4  Very Agree   179   21.0  20.96%  
## 16 LOY5  Very Agree   105   12.3  12.3%   
## 17 LOY6  Very Agree   132   15.5  15.46%  
## 18 LOY7  Very Agree   124   14.5  14.52%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Very Agree    64    7.49 7.49%   
##  2 IMA2  Very Agree    65    7.61 7.61%   
##  3 IMA3  Very Agree    78    9.13 9.13%   
##  4 IMA4  Very Agree    84    9.84 9.84%   
##  5 IMA5  Very Agree    83    9.72 9.72%   
##  6 PVA1  Very Agree   105   12.3  12.3%   
##  7 PVA2  Very Agree   117   13.7  13.7%   
##  8 PVA3  Very Agree   130   15.2  15.22%  
##  9 SAT1  Very Agree   117   13.7  13.7%   
## 10 SAT2  Very Agree   128   15.0  14.99%  
## 11 SAT3  Very Agree   125   14.6  14.64%  
## 12 LOY1  Very Agree   173   20.3  20.26%  
## 13 LOY2  Very Agree   225   26.4  26.35%  
## 14 LOY3  Very Agree   151   17.7  17.68%  
## 15 LOY4  Very Agree   179   21.0  20.96%  
## 16 LOY5  Very Agree   105   12.3  12.3%   
## 17 LOY6  Very Agree   132   15.5  15.46%  
## 18 LOY7  Very Agree   124   14.5  14.52%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.9. Vẽ biểu đồ likert cho dữ liệu của 2 thành phố theo từng nhóm constructs-Nhãn tiếng việt 3.9.1. Construct PSA - Nhãn tiếng việt

DN_HCM_SEM_PSA_v = within(DN_HCM_SEM_PSA, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8"))
  })
str(DN_HCM_SEM_PSA_v)
## 'data.frame':    18788 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 22 levels "PSW1","PSW2",..: 16 16 16 16 16 16 16 16 16 16 ...
summary(DN_HCM_SEM_PSA_v)
##                              Res            BPE       
##  R<U+1EA5>t không d<U+1ED3>ng ý: 787   PSW1   :  854  
##  Không d<U+1ED3>ng ý           :2107   PSW2   :  854  
##  Khá không d<U+1ED3>ng ý       :1133   PSW3   :  854  
##  Bình thu<U+1EDD>ng            :2094   PSW4   :  854  
##  Khá d<U+1ED3>ng ý             :2916   PSW5   :  854  
##  Ð<U+1ED3>ng ý                 :7745   PSW6   :  854  
##  R<U+1EA5>t d<U+1ED3>ng ý      :2006   (Other):13664
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_PSA_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8
## 22 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PSB8
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 154 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý    57    6.67 6.67%   
##  2 PSW1  Không d<U+1ED3>ng ý       129   15.1  15.11%  
##  3 PSW1  Khá không d<U+1ED3>ng ý    52    6.09 6.09%   
##  4 PSW1  Bình thu<U+1EDD>ng         79    9.25 9.25%   
##  5 PSW1  Khá d<U+1ED3>ng ý         126   14.8  14.75%  
##  6 PSW1  Ð<U+1ED3>ng ý             329   38.5  38.52%  
##  7 PSW1  R<U+1EA5>t d<U+1ED3>ng ý          82    9.6  9.6%    
##  8 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    35    4.1  4.1%    
##  9 PSW2  Không d<U+1ED3>ng ý        64    7.49 7.49%   
## 10 PSW2  Khá không d<U+1ED3>ng ý    50    5.85 5.85%   
## # ... with 144 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn v\u1EC1 an to\u00E0n (PSA) c\u1EE7a h\u00E0nh kh\u00E1ch \u0111\u1ED1i v\u1EDBi h\u1EC7 th\u1ED1ng xe bu\u00FDt \u0111\u00F4 thi Vi\u1EC7t Nam ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 22 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý    57    6.67 6.67%   
##  2 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    35    4.1  4.1%    
##  3 PSW3  R<U+1EA5>t không d<U+1ED3>ng ý    15    1.76 1.76%   
##  4 PSW4  R<U+1EA5>t không d<U+1ED3>ng ý    31    3.63 3.63%   
##  5 PSW5  R<U+1EA5>t không d<U+1ED3>ng ý    20    2.34 2.34%   
##  6 PSW6  R<U+1EA5>t không d<U+1ED3>ng ý    10    1.17 1.17%   
##  7 PSW7  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
##  8 PSS1  R<U+1EA5>t không d<U+1ED3>ng ý    10    1.17 1.17%   
##  9 PSS2  R<U+1EA5>t không d<U+1ED3>ng ý    47    5.5  5.5%    
## 10 PSS3  R<U+1EA5>t không d<U+1ED3>ng ý    36    4.22 4.22%   
## # ... with 12 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 22 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PSW1  Không d<U+1ED3>ng ý   129   15.1  15.11%  
##  2 PSW2  Không d<U+1ED3>ng ý    64    7.49 7.49%   
##  3 PSW3  Không d<U+1ED3>ng ý    22    2.58 2.58%   
##  4 PSW4  Không d<U+1ED3>ng ý    78    9.13 9.13%   
##  5 PSW5  Không d<U+1ED3>ng ý    31    3.63 3.63%   
##  6 PSW6  Không d<U+1ED3>ng ý     5    0.59 0.59%   
##  7 PSW7  Không d<U+1ED3>ng ý     6    0.7  0.7%    
##  8 PSS1  Không d<U+1ED3>ng ý    24    2.81 2.81%   
##  9 PSS2  Không d<U+1ED3>ng ý   140   16.4  16.39%  
## 10 PSS3  Không d<U+1ED3>ng ý    84    9.84 9.84%   
## # ... with 12 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 22 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  Khá không d<U+1ED3>ng ý    52    6.09 6.09%   
##  2 PSW2  Khá không d<U+1ED3>ng ý    50    5.85 5.85%   
##  3 PSW3  Khá không d<U+1ED3>ng ý    29    3.4  3.4%    
##  4 PSW4  Khá không d<U+1ED3>ng ý    57    6.67 6.67%   
##  5 PSW5  Khá không d<U+1ED3>ng ý    22    2.58 2.58%   
##  6 PSW6  Khá không d<U+1ED3>ng ý     9    1.05 1.05%   
##  7 PSW7  Khá không d<U+1ED3>ng ý    18    2.11 2.11%   
##  8 PSS1  Khá không d<U+1ED3>ng ý    29    3.4  3.4%    
##  9 PSS2  Khá không d<U+1ED3>ng ý    67    7.85 7.85%   
## 10 PSS3  Khá không d<U+1ED3>ng ý    48    5.62 5.62%   
## # ... with 12 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 22 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Bình thu<U+1EDD>ng    79    9.25 9.25%   
##  2 PSW2  Bình thu<U+1EDD>ng    86   10.1  10.07%  
##  3 PSW3  Bình thu<U+1EDD>ng    65    7.61 7.61%   
##  4 PSW4  Bình thu<U+1EDD>ng   144   16.9  16.86%  
##  5 PSW5  Bình thu<U+1EDD>ng    75    8.78 8.78%   
##  6 PSW6  Bình thu<U+1EDD>ng    39    4.57 4.57%   
##  7 PSW7  Bình thu<U+1EDD>ng    50    5.85 5.85%   
##  8 PSS1  Bình thu<U+1EDD>ng    60    7.03 7.03%   
##  9 PSS2  Bình thu<U+1EDD>ng    97   11.4  11.36%  
## 10 PSS3  Bình thu<U+1EDD>ng    84    9.84 9.84%   
## # ... with 12 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Khá d<U+1ED3>ng ý   126   14.8  14.75%  
##  2 PSW2  Khá d<U+1ED3>ng ý   126   14.8  14.75%  
##  3 PSW3  Khá d<U+1ED3>ng ý   148   17.3  17.33%  
##  4 PSW4  Khá d<U+1ED3>ng ý   161   18.8  18.85%  
##  5 PSW5  Khá d<U+1ED3>ng ý   101   11.8  11.83%  
##  6 PSW6  Khá d<U+1ED3>ng ý    68    7.96 7.96%   
##  7 PSW7  Khá d<U+1ED3>ng ý    92   10.8  10.77%  
##  8 PSS1  Khá d<U+1ED3>ng ý   102   11.9  11.94%  
##  9 PSS2  Khá d<U+1ED3>ng ý   153   17.9  17.92%  
## 10 PSS3  Khá d<U+1ED3>ng ý   149   17.4  17.45%  
## # ... with 12 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 22 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Ð<U+1ED3>ng ý   329    38.5 38.52%  
##  2 PSW2  Ð<U+1ED3>ng ý   400    46.8 46.84%  
##  3 PSW3  Ð<U+1ED3>ng ý   472    55.3 55.27%  
##  4 PSW4  Ð<U+1ED3>ng ý   307    36.0 35.95%  
##  5 PSW5  Ð<U+1ED3>ng ý   435    50.9 50.94%  
##  6 PSW6  Ð<U+1ED3>ng ý   495    58.0 57.96%  
##  7 PSW7  Ð<U+1ED3>ng ý   500    58.6 58.55%  
##  8 PSS1  Ð<U+1ED3>ng ý   435    50.9 50.94%  
##  9 PSS2  Ð<U+1ED3>ng ý   294    34.4 34.43%  
## 10 PSS3  Ð<U+1ED3>ng ý   380    44.5 44.5%   
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    82    9.6  9.6%    
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    93   10.9  10.89%  
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý   103   12.1  12.06%  
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    76    8.9  8.9%    
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý   170   19.9  19.91%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý   228   26.7  26.7%   
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý   175   20.5  20.49%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý   194   22.7  22.72%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    56    6.56 6.56%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    73    8.55 8.55%   
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    82    9.6  9.6%    
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    93   10.9  10.89%  
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý   103   12.1  12.06%  
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    76    8.9  8.9%    
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý   170   19.9  19.91%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý   228   26.7  26.7%   
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý   175   20.5  20.49%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý   194   22.7  22.72%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    56    6.56 6.56%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    73    8.55 8.55%   
## # ... with 12 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.9.2. Construct PSQ-Nhãn tiếng việt

DN_HCM_SEM_PSQ_v = within(DN_HCM_SEM_PSQ, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5"))
  })
str(DN_HCM_SEM_PSQ_v)
## 'data.frame':    15372 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 4 2 6 6 4 2 5 5 7 ...
##  $ BPE: Factor w/ 18 levels "PQT1","PQT2",..: 15 15 15 15 15 15 15 15 15 15 ...
summary(DN_HCM_SEM_PSQ_v)
##                              Res            BPE       
##  R<U+1EA5>t không d<U+1ED3>ng ý: 290   PQT1   :  854  
##  Không d<U+1ED3>ng ý           : 702   PQT2   :  854  
##  Khá không d<U+1ED3>ng ý       : 808   PQT3   :  854  
##  Bình thu<U+1EDD>ng            :1917   PQT4   :  854  
##  Khá d<U+1ED3>ng ý             :3304   PQC1   :  854  
##  Ð<U+1ED3>ng ý                 :6527   PQC2   :  854  
##  R<U+1EA5>t d<U+1ED3>ng ý      :1824   (Other):10248
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_PSQ_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2
## [16] PQR3 PQR4 PQR5
## 18 Levels: PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 ... PQR5
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t không d<U+1ED3>ng ý    17    1.99 1.99%   
##  2 PQT1  Không d<U+1ED3>ng ý        39    4.57 4.57%   
##  3 PQT1  Khá không d<U+1ED3>ng ý    59    6.91 6.91%   
##  4 PQT1  Bình thu<U+1EDD>ng         99   11.6  11.59%  
##  5 PQT1  Khá d<U+1ED3>ng ý         204   23.9  23.89%  
##  6 PQT1  Ð<U+1ED3>ng ý             349   40.9  40.87%  
##  7 PQT1  R<U+1EA5>t d<U+1ED3>ng ý          87   10.2  10.19%  
##  8 PQT2  R<U+1EA5>t không d<U+1ED3>ng ý    10    1.17 1.17%   
##  9 PQT2  Không d<U+1ED3>ng ý        33    3.86 3.86%   
## 10 PQT2  Khá không d<U+1ED3>ng ý    15    1.76 1.76%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn v\u1EC1 ch\u1EA5t l\u01B0\u1EE3ng d\u1ECBch v\u1EE5 (PSQ) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB Vi\u1EC7t Nam", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t không d<U+1ED3>ng ý    17    1.99 1.99%   
##  2 PQT2  R<U+1EA5>t không d<U+1ED3>ng ý    10    1.17 1.17%   
##  3 PQT3  R<U+1EA5>t không d<U+1ED3>ng ý    16    1.87 1.87%   
##  4 PQT4  R<U+1EA5>t không d<U+1ED3>ng ý    16    1.87 1.87%   
##  5 PQC1  R<U+1EA5>t không d<U+1ED3>ng ý    10    1.17 1.17%   
##  6 PQC2  R<U+1EA5>t không d<U+1ED3>ng ý    14    1.64 1.64%   
##  7 PQC3  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
##  8 PQC4  R<U+1EA5>t không d<U+1ED3>ng ý    11    1.29 1.29%   
##  9 PQC5  R<U+1EA5>t không d<U+1ED3>ng ý     9    1.05 1.05%   
## 10 PQP1  R<U+1EA5>t không d<U+1ED3>ng ý    23    2.69 2.69%   
## 11 PQP2  R<U+1EA5>t không d<U+1ED3>ng ý    12    1.41 1.41%   
## 12 PQP3  R<U+1EA5>t không d<U+1ED3>ng ý    19    2.22 2.22%   
## 13 PQP4  R<U+1EA5>t không d<U+1ED3>ng ý    29    3.4  3.4%    
## 14 PQR1  R<U+1EA5>t không d<U+1ED3>ng ý    14    1.64 1.64%   
## 15 PQR2  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
## 16 PQR3  R<U+1EA5>t không d<U+1ED3>ng ý    18    2.11 2.11%   
## 17 PQR4  R<U+1EA5>t không d<U+1ED3>ng ý    30    3.51 3.51%   
## 18 PQR5  R<U+1EA5>t không d<U+1ED3>ng ý    16    1.87 1.87%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 18 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PQT1  Không d<U+1ED3>ng ý    39    4.57 4.57%   
##  2 PQT2  Không d<U+1ED3>ng ý    33    3.86 3.86%   
##  3 PQT3  Không d<U+1ED3>ng ý    43    5.04 5.04%   
##  4 PQT4  Không d<U+1ED3>ng ý    50    5.85 5.85%   
##  5 PQC1  Không d<U+1ED3>ng ý    24    2.81 2.81%   
##  6 PQC2  Không d<U+1ED3>ng ý    27    3.16 3.16%   
##  7 PQC3  Không d<U+1ED3>ng ý    31    3.63 3.63%   
##  8 PQC4  Không d<U+1ED3>ng ý    26    3.04 3.04%   
##  9 PQC5  Không d<U+1ED3>ng ý    21    2.46 2.46%   
## 10 PQP1  Không d<U+1ED3>ng ý    47    5.5  5.5%    
## 11 PQP2  Không d<U+1ED3>ng ý    31    3.63 3.63%   
## 12 PQP3  Không d<U+1ED3>ng ý    42    4.92 4.92%   
## 13 PQP4  Không d<U+1ED3>ng ý    75    8.78 8.78%   
## 14 PQR1  Không d<U+1ED3>ng ý    48    5.62 5.62%   
## 15 PQR2  Không d<U+1ED3>ng ý    32    3.75 3.75%   
## 16 PQR3  Không d<U+1ED3>ng ý    45    5.27 5.27%   
## 17 PQR4  Không d<U+1ED3>ng ý    44    5.15 5.15%   
## 18 PQR5  Không d<U+1ED3>ng ý    44    5.15 5.15%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  Khá không d<U+1ED3>ng ý    59    6.91 6.91%   
##  2 PQT2  Khá không d<U+1ED3>ng ý    15    1.76 1.76%   
##  3 PQT3  Khá không d<U+1ED3>ng ý    59    6.91 6.91%   
##  4 PQT4  Khá không d<U+1ED3>ng ý    53    6.21 6.21%   
##  5 PQC1  Khá không d<U+1ED3>ng ý    31    3.63 3.63%   
##  6 PQC2  Khá không d<U+1ED3>ng ý    40    4.68 4.68%   
##  7 PQC3  Khá không d<U+1ED3>ng ý    40    4.68 4.68%   
##  8 PQC4  Khá không d<U+1ED3>ng ý    25    2.93 2.93%   
##  9 PQC5  Khá không d<U+1ED3>ng ý    12    1.41 1.41%   
## 10 PQP1  Khá không d<U+1ED3>ng ý    75    8.78 8.78%   
## 11 PQP2  Khá không d<U+1ED3>ng ý    56    6.56 6.56%   
## 12 PQP3  Khá không d<U+1ED3>ng ý    61    7.14 7.14%   
## 13 PQP4  Khá không d<U+1ED3>ng ý    75    8.78 8.78%   
## 14 PQR1  Khá không d<U+1ED3>ng ý    42    4.92 4.92%   
## 15 PQR2  Khá không d<U+1ED3>ng ý    37    4.33 4.33%   
## 16 PQR3  Khá không d<U+1ED3>ng ý    31    3.63 3.63%   
## 17 PQR4  Khá không d<U+1ED3>ng ý    50    5.85 5.85%   
## 18 PQR5  Khá không d<U+1ED3>ng ý    47    5.5  5.5%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PQT1  Bình thu<U+1EDD>ng    99   11.6  11.59%  
##  2 PQT2  Bình thu<U+1EDD>ng    68    7.96 7.96%   
##  3 PQT3  Bình thu<U+1EDD>ng   101   11.8  11.83%  
##  4 PQT4  Bình thu<U+1EDD>ng   252   29.5  29.51%  
##  5 PQC1  Bình thu<U+1EDD>ng    66    7.73 7.73%   
##  6 PQC2  Bình thu<U+1EDD>ng   107   12.5  12.53%  
##  7 PQC3  Bình thu<U+1EDD>ng    98   11.5  11.48%  
##  8 PQC4  Bình thu<U+1EDD>ng    98   11.5  11.48%  
##  9 PQC5  Bình thu<U+1EDD>ng    85    9.95 9.95%   
## 10 PQP1  Bình thu<U+1EDD>ng    97   11.4  11.36%  
## 11 PQP2  Bình thu<U+1EDD>ng   107   12.5  12.53%  
## 12 PQP3  Bình thu<U+1EDD>ng   124   14.5  14.52%  
## 13 PQP4  Bình thu<U+1EDD>ng    98   11.5  11.48%  
## 14 PQR1  Bình thu<U+1EDD>ng   180   21.1  21.08%  
## 15 PQR2  Bình thu<U+1EDD>ng    91   10.7  10.66%  
## 16 PQR3  Bình thu<U+1EDD>ng    85    9.95 9.95%   
## 17 PQR4  Bình thu<U+1EDD>ng    75    8.78 8.78%   
## 18 PQR5  Bình thu<U+1EDD>ng    86   10.1  10.07%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Khá d<U+1ED3>ng ý   204    23.9 23.89%  
##  2 PQT2  Khá d<U+1ED3>ng ý   139    16.3 16.28%  
##  3 PQT3  Khá d<U+1ED3>ng ý   203    23.8 23.77%  
##  4 PQT4  Khá d<U+1ED3>ng ý   163    19.1 19.09%  
##  5 PQC1  Khá d<U+1ED3>ng ý   169    19.8 19.79%  
##  6 PQC2  Khá d<U+1ED3>ng ý   166    19.4 19.44%  
##  7 PQC3  Khá d<U+1ED3>ng ý   188    22.0 22.01%  
##  8 PQC4  Khá d<U+1ED3>ng ý   187    21.9 21.9%   
##  9 PQC5  Khá d<U+1ED3>ng ý   158    18.5 18.5%   
## 10 PQP1  Khá d<U+1ED3>ng ý   240    28.1 28.1%   
## 11 PQP2  Khá d<U+1ED3>ng ý   187    21.9 21.9%   
## 12 PQP3  Khá d<U+1ED3>ng ý   216    25.3 25.29%  
## 13 PQP4  Khá d<U+1ED3>ng ý   194    22.7 22.72%  
## 14 PQR1  Khá d<U+1ED3>ng ý   150    17.6 17.56%  
## 15 PQR2  Khá d<U+1ED3>ng ý   193    22.6 22.6%   
## 16 PQR3  Khá d<U+1ED3>ng ý   143    16.7 16.74%  
## 17 PQR4  Khá d<U+1ED3>ng ý   180    21.1 21.08%  
## 18 PQR5  Khá d<U+1ED3>ng ý   224    26.2 26.23%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PQT1  Ð<U+1ED3>ng ý   349    40.9 40.87%  
##  2 PQT2  Ð<U+1ED3>ng ý   446    52.2 52.22%  
##  3 PQT3  Ð<U+1ED3>ng ý   347    40.6 40.63%  
##  4 PQT4  Ð<U+1ED3>ng ý   264    30.9 30.91%  
##  5 PQC1  Ð<U+1ED3>ng ý   411    48.1 48.13%  
##  6 PQC2  Ð<U+1ED3>ng ý   399    46.7 46.72%  
##  7 PQC3  Ð<U+1ED3>ng ý   378    44.3 44.26%  
##  8 PQC4  Ð<U+1ED3>ng ý   417    48.8 48.83%  
##  9 PQC5  Ð<U+1ED3>ng ý   455    53.3 53.28%  
## 10 PQP1  Ð<U+1ED3>ng ý   304    35.6 35.6%   
## 11 PQP2  Ð<U+1ED3>ng ý   363    42.5 42.51%  
## 12 PQP3  Ð<U+1ED3>ng ý   319    37.4 37.35%  
## 13 PQP4  Ð<U+1ED3>ng ý   303    35.5 35.48%  
## 14 PQR1  Ð<U+1ED3>ng ý   348    40.8 40.75%  
## 15 PQR2  Ð<U+1ED3>ng ý   361    42.3 42.27%  
## 16 PQR3  Ð<U+1ED3>ng ý   375    43.9 43.91%  
## 17 PQR4  Ð<U+1ED3>ng ý   347    40.6 40.63%  
## 18 PQR5  Ð<U+1ED3>ng ý   341    39.9 39.93%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t d<U+1ED3>ng ý    87   10.2  10.19%  
##  2 PQT2  R<U+1EA5>t d<U+1ED3>ng ý   143   16.7  16.74%  
##  3 PQT3  R<U+1EA5>t d<U+1ED3>ng ý    85    9.95 9.95%   
##  4 PQT4  R<U+1EA5>t d<U+1ED3>ng ý    56    6.56 6.56%   
##  5 PQC1  R<U+1EA5>t d<U+1ED3>ng ý   143   16.7  16.74%  
##  6 PQC2  R<U+1EA5>t d<U+1ED3>ng ý   101   11.8  11.83%  
##  7 PQC3  R<U+1EA5>t d<U+1ED3>ng ý   106   12.4  12.41%  
##  8 PQC4  R<U+1EA5>t d<U+1ED3>ng ý    90   10.5  10.54%  
##  9 PQC5  R<U+1EA5>t d<U+1ED3>ng ý   114   13.4  13.35%  
## 10 PQP1  R<U+1EA5>t d<U+1ED3>ng ý    68    7.96 7.96%   
## 11 PQP2  R<U+1EA5>t d<U+1ED3>ng ý    98   11.5  11.48%  
## 12 PQP3  R<U+1EA5>t d<U+1ED3>ng ý    73    8.55 8.55%   
## 13 PQP4  R<U+1EA5>t d<U+1ED3>ng ý    80    9.37 9.37%   
## 14 PQR1  R<U+1EA5>t d<U+1ED3>ng ý    72    8.43 8.43%   
## 15 PQR2  R<U+1EA5>t d<U+1ED3>ng ý   127   14.9  14.87%  
## 16 PQR3  R<U+1EA5>t d<U+1ED3>ng ý   157   18.4  18.38%  
## 17 PQR4  R<U+1EA5>t d<U+1ED3>ng ý   128   15.0  14.99%  
## 18 PQR5  R<U+1EA5>t d<U+1ED3>ng ý    96   11.2  11.24%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t d<U+1ED3>ng ý    87   10.2  10.19%  
##  2 PQT2  R<U+1EA5>t d<U+1ED3>ng ý   143   16.7  16.74%  
##  3 PQT3  R<U+1EA5>t d<U+1ED3>ng ý    85    9.95 9.95%   
##  4 PQT4  R<U+1EA5>t d<U+1ED3>ng ý    56    6.56 6.56%   
##  5 PQC1  R<U+1EA5>t d<U+1ED3>ng ý   143   16.7  16.74%  
##  6 PQC2  R<U+1EA5>t d<U+1ED3>ng ý   101   11.8  11.83%  
##  7 PQC3  R<U+1EA5>t d<U+1ED3>ng ý   106   12.4  12.41%  
##  8 PQC4  R<U+1EA5>t d<U+1ED3>ng ý    90   10.5  10.54%  
##  9 PQC5  R<U+1EA5>t d<U+1ED3>ng ý   114   13.4  13.35%  
## 10 PQP1  R<U+1EA5>t d<U+1ED3>ng ý    68    7.96 7.96%   
## 11 PQP2  R<U+1EA5>t d<U+1ED3>ng ý    98   11.5  11.48%  
## 12 PQP3  R<U+1EA5>t d<U+1ED3>ng ý    73    8.55 8.55%   
## 13 PQP4  R<U+1EA5>t d<U+1ED3>ng ý    80    9.37 9.37%   
## 14 PQR1  R<U+1EA5>t d<U+1ED3>ng ý    72    8.43 8.43%   
## 15 PQR2  R<U+1EA5>t d<U+1ED3>ng ý   127   14.9  14.87%  
## 16 PQR3  R<U+1EA5>t d<U+1ED3>ng ý   157   18.4  18.38%  
## 17 PQR4  R<U+1EA5>t d<U+1ED3>ng ý   128   15.0  14.99%  
## 18 PQR5  R<U+1EA5>t d<U+1ED3>ng ý    96   11.2  11.24%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text2, aes(x = BPE, y = 9, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.9.3. Construct thuộc nhóm Stimulus-Nhãn tiếng việt

DN_HCM_SEM_S_v = within(DN_HCM_SEM_S, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3"))
  })
str(DN_HCM_SEM_S_v)
## 'data.frame':    16226 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 3 5 5 5 4 3 6 6 7 ...
##  $ BPE: Factor w/ 19 levels "PHB1","PHB2",..: 12 12 12 12 12 12 12 12 12 12 ...
summary(DN_HCM_SEM_S_v)
##                              Res            BPE       
##  R<U+1EA5>t không d<U+1ED3>ng ý: 419   PHB1   :  854  
##  Không d<U+1ED3>ng ý           : 830   PHB2   :  854  
##  Khá không d<U+1ED3>ng ý       : 750   PHB3   :  854  
##  Bình thu<U+1EDD>ng            :2467   PHB4   :  854  
##  Khá d<U+1ED3>ng ý             :3366   PHB5   :  854  
##  Ð<U+1ED3>ng ý                 :5949   PEB1   :  854  
##  R<U+1EA5>t d<U+1ED3>ng ý      :2445   (Other):11102
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_S_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6
## [16] PDE7 PSO1 PSO2 PSO3
## 19 Levels: PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 ... PSO3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 133 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t không d<U+1ED3>ng ý    39    4.57 4.57%   
##  2 PHB1  Không d<U+1ED3>ng ý        65    7.61 7.61%   
##  3 PHB1  Khá không d<U+1ED3>ng ý    81    9.48 9.48%   
##  4 PHB1  Bình thu<U+1EDD>ng        134   15.7  15.69%  
##  5 PHB1  Khá d<U+1ED3>ng ý         188   22.0  22.01%  
##  6 PHB1  Ð<U+1ED3>ng ý             272   31.8  31.85%  
##  7 PHB1  R<U+1EA5>t d<U+1ED3>ng ý          75    8.78 8.78%   
##  8 PHB2  R<U+1EA5>t không d<U+1ED3>ng ý    18    2.11 2.11%   
##  9 PHB2  Không d<U+1ED3>ng ý        26    3.04 3.04%   
## 10 PHB2  Khá không d<U+1ED3>ng ý    35    4.1  4.1%    
## # ... with 123 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn v\u1EC1 s\u1EE9c kh\u1ECFe (PHB), m\u00F4i tr\u01B0\u1EDDng (PEB), thi\u1EBFt k\u1EBF (PDE), l\u1EE3i \u00EDch x\u00E3 h\u1ED9i (PSO) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB Vi\u1EC7t Nam ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 19 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t không d<U+1ED3>ng ý    39    4.57 4.57%   
##  2 PHB2  R<U+1EA5>t không d<U+1ED3>ng ý    18    2.11 2.11%   
##  3 PHB3  R<U+1EA5>t không d<U+1ED3>ng ý    17    1.99 1.99%   
##  4 PHB4  R<U+1EA5>t không d<U+1ED3>ng ý    17    1.99 1.99%   
##  5 PHB5  R<U+1EA5>t không d<U+1ED3>ng ý    21    2.46 2.46%   
##  6 PEB1  R<U+1EA5>t không d<U+1ED3>ng ý    16    1.87 1.87%   
##  7 PEB2  R<U+1EA5>t không d<U+1ED3>ng ý    20    2.34 2.34%   
##  8 PEB3  R<U+1EA5>t không d<U+1ED3>ng ý    24    2.81 2.81%   
##  9 PEB4  R<U+1EA5>t không d<U+1ED3>ng ý    25    2.93 2.93%   
## 10 PDE1  R<U+1EA5>t không d<U+1ED3>ng ý    25    2.93 2.93%   
## 11 PDE2  R<U+1EA5>t không d<U+1ED3>ng ý    24    2.81 2.81%   
## 12 PDE3  R<U+1EA5>t không d<U+1ED3>ng ý    24    2.81 2.81%   
## 13 PDE4  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
## 14 PDE5  R<U+1EA5>t không d<U+1ED3>ng ý    15    1.76 1.76%   
## 15 PDE6  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
## 16 PDE7  R<U+1EA5>t không d<U+1ED3>ng ý    22    2.58 2.58%   
## 17 PSO1  R<U+1EA5>t không d<U+1ED3>ng ý    28    3.28 3.28%   
## 18 PSO2  R<U+1EA5>t không d<U+1ED3>ng ý    29    3.4  3.4%    
## 19 PSO3  R<U+1EA5>t không d<U+1ED3>ng ý    29    3.4  3.4%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 19 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PHB1  Không d<U+1ED3>ng ý    65    7.61 7.61%   
##  2 PHB2  Không d<U+1ED3>ng ý    26    3.04 3.04%   
##  3 PHB3  Không d<U+1ED3>ng ý    50    5.85 5.85%   
##  4 PHB4  Không d<U+1ED3>ng ý    63    7.38 7.38%   
##  5 PHB5  Không d<U+1ED3>ng ý    46    5.39 5.39%   
##  6 PEB1  Không d<U+1ED3>ng ý    44    5.15 5.15%   
##  7 PEB2  Không d<U+1ED3>ng ý    56    6.56 6.56%   
##  8 PEB3  Không d<U+1ED3>ng ý     8    0.94 0.94%   
##  9 PEB4  Không d<U+1ED3>ng ý    17    1.99 1.99%   
## 10 PDE1  Không d<U+1ED3>ng ý    19    2.22 2.22%   
## 11 PDE2  Không d<U+1ED3>ng ý    19    2.22 2.22%   
## 12 PDE3  Không d<U+1ED3>ng ý    18    2.11 2.11%   
## 13 PDE4  Không d<U+1ED3>ng ý    22    2.58 2.58%   
## 14 PDE5  Không d<U+1ED3>ng ý    19    2.22 2.22%   
## 15 PDE6  Không d<U+1ED3>ng ý     7    0.82 0.82%   
## 16 PDE7  Không d<U+1ED3>ng ý     7    0.82 0.82%   
## 17 PSO1  Không d<U+1ED3>ng ý   119   13.9  13.93%  
## 18 PSO2  Không d<U+1ED3>ng ý   133   15.6  15.57%  
## 19 PSO3  Không d<U+1ED3>ng ý    92   10.8  10.77%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 19 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  Khá không d<U+1ED3>ng ý    81    9.48 9.48%   
##  2 PHB2  Khá không d<U+1ED3>ng ý    35    4.1  4.1%    
##  3 PHB3  Khá không d<U+1ED3>ng ý    42    4.92 4.92%   
##  4 PHB4  Khá không d<U+1ED3>ng ý    58    6.79 6.79%   
##  5 PHB5  Khá không d<U+1ED3>ng ý    34    3.98 3.98%   
##  6 PEB1  Khá không d<U+1ED3>ng ý    49    5.74 5.74%   
##  7 PEB2  Khá không d<U+1ED3>ng ý    59    6.91 6.91%   
##  8 PEB3  Khá không d<U+1ED3>ng ý    12    1.41 1.41%   
##  9 PEB4  Khá không d<U+1ED3>ng ý    20    2.34 2.34%   
## 10 PDE1  Khá không d<U+1ED3>ng ý    22    2.58 2.58%   
## 11 PDE2  Khá không d<U+1ED3>ng ý    22    2.58 2.58%   
## 12 PDE3  Khá không d<U+1ED3>ng ý    35    4.1  4.1%    
## 13 PDE4  Khá không d<U+1ED3>ng ý    25    2.93 2.93%   
## 14 PDE5  Khá không d<U+1ED3>ng ý    39    4.57 4.57%   
## 15 PDE6  Khá không d<U+1ED3>ng ý     9    1.05 1.05%   
## 16 PDE7  Khá không d<U+1ED3>ng ý     5    0.59 0.59%   
## 17 PSO1  Khá không d<U+1ED3>ng ý    64    7.49 7.49%   
## 18 PSO2  Khá không d<U+1ED3>ng ý    76    8.9  8.9%    
## 19 PSO3  Khá không d<U+1ED3>ng ý    63    7.38 7.38%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 19 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PHB1  Bình thu<U+1EDD>ng   134   15.7  15.69%  
##  2 PHB2  Bình thu<U+1EDD>ng    96   11.2  11.24%  
##  3 PHB3  Bình thu<U+1EDD>ng   200   23.4  23.42%  
##  4 PHB4  Bình thu<U+1EDD>ng   214   25.1  25.06%  
##  5 PHB5  Bình thu<U+1EDD>ng    99   11.6  11.59%  
##  6 PEB1  Bình thu<U+1EDD>ng   192   22.5  22.48%  
##  7 PEB2  Bình thu<U+1EDD>ng   196   23.0  22.95%  
##  8 PEB3  Bình thu<U+1EDD>ng    59    6.91 6.91%   
##  9 PEB4  Bình thu<U+1EDD>ng    67    7.85 7.85%   
## 10 PDE1  Bình thu<U+1EDD>ng    77    9.02 9.02%   
## 11 PDE2  Bình thu<U+1EDD>ng    93   10.9  10.89%  
## 12 PDE3  Bình thu<U+1EDD>ng    98   11.5  11.48%  
## 13 PDE4  Bình thu<U+1EDD>ng    68    7.96 7.96%   
## 14 PDE5  Bình thu<U+1EDD>ng    87   10.2  10.19%  
## 15 PDE6  Bình thu<U+1EDD>ng    53    6.21 6.21%   
## 16 PDE7  Bình thu<U+1EDD>ng    62    7.26 7.26%   
## 17 PSO1  Bình thu<U+1EDD>ng   227   26.6  26.58%  
## 18 PSO2  Bình thu<U+1EDD>ng   227   26.6  26.58%  
## 19 PSO3  Bình thu<U+1EDD>ng   218   25.5  25.53%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  Khá d<U+1ED3>ng ý   188    22.0 22.01%  
##  2 PHB2  Khá d<U+1ED3>ng ý   173    20.3 20.26%  
##  3 PHB3  Khá d<U+1ED3>ng ý   200    23.4 23.42%  
##  4 PHB4  Khá d<U+1ED3>ng ý   194    22.7 22.72%  
##  5 PHB5  Khá d<U+1ED3>ng ý   187    21.9 21.9%   
##  6 PEB1  Khá d<U+1ED3>ng ý   206    24.1 24.12%  
##  7 PEB2  Khá d<U+1ED3>ng ý   200    23.4 23.42%  
##  8 PEB3  Khá d<U+1ED3>ng ý   126    14.8 14.75%  
##  9 PEB4  Khá d<U+1ED3>ng ý   170    19.9 19.91%  
## 10 PDE1  Khá d<U+1ED3>ng ý   167    19.6 19.56%  
## 11 PDE2  Khá d<U+1ED3>ng ý   166    19.4 19.44%  
## 12 PDE3  Khá d<U+1ED3>ng ý   215    25.2 25.18%  
## 13 PDE4  Khá d<U+1ED3>ng ý   163    19.1 19.09%  
## 14 PDE5  Khá d<U+1ED3>ng ý   173    20.3 20.26%  
## 15 PDE6  Khá d<U+1ED3>ng ý   131    15.3 15.34%  
## 16 PDE7  Khá d<U+1ED3>ng ý   116    13.6 13.58%  
## 17 PSO1  Khá d<U+1ED3>ng ý   223    26.1 26.11%  
## 18 PSO2  Khá d<U+1ED3>ng ý   197    23.1 23.07%  
## 19 PSO3  Khá d<U+1ED3>ng ý   171    20.0 20.02%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 19 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PHB1  Ð<U+1ED3>ng ý   272    31.8 31.85%  
##  2 PHB2  Ð<U+1ED3>ng ý   396    46.4 46.37%  
##  3 PHB3  Ð<U+1ED3>ng ý   273    32.0 31.97%  
##  4 PHB4  Ð<U+1ED3>ng ý   241    28.2 28.22%  
##  5 PHB5  Ð<U+1ED3>ng ý   380    44.5 44.5%   
##  6 PEB1  Ð<U+1ED3>ng ý   263    30.8 30.8%   
##  7 PEB2  Ð<U+1ED3>ng ý   251    29.4 29.39%  
##  8 PEB3  Ð<U+1ED3>ng ý   389    45.6 45.55%  
##  9 PEB4  Ð<U+1ED3>ng ý   351    41.1 41.1%   
## 10 PDE1  Ð<U+1ED3>ng ý   353    41.3 41.33%  
## 11 PDE2  Ð<U+1ED3>ng ý   356    41.7 41.69%  
## 12 PDE3  Ð<U+1ED3>ng ý   351    41.1 41.1%   
## 13 PDE4  Ð<U+1ED3>ng ý   376    44.0 44.03%  
## 14 PDE5  Ð<U+1ED3>ng ý   382    44.7 44.73%  
## 15 PDE6  Ð<U+1ED3>ng ý   389    45.6 45.55%  
## 16 PDE7  Ð<U+1ED3>ng ý   413    48.4 48.36%  
## 17 PSO1  Ð<U+1ED3>ng ý   147    17.2 17.21%  
## 18 PSO2  Ð<U+1ED3>ng ý   143    16.7 16.74%  
## 19 PSO3  Ð<U+1ED3>ng ý   223    26.1 26.11%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t d<U+1ED3>ng ý    75    8.78 8.78%   
##  2 PHB2  R<U+1EA5>t d<U+1ED3>ng ý   110   12.9  12.88%  
##  3 PHB3  R<U+1EA5>t d<U+1ED3>ng ý    72    8.43 8.43%   
##  4 PHB4  R<U+1EA5>t d<U+1ED3>ng ý    67    7.85 7.85%   
##  5 PHB5  R<U+1EA5>t d<U+1ED3>ng ý    87   10.2  10.19%  
##  6 PEB1  R<U+1EA5>t d<U+1ED3>ng ý    84    9.84 9.84%   
##  7 PEB2  R<U+1EA5>t d<U+1ED3>ng ý    72    8.43 8.43%   
##  8 PEB3  R<U+1EA5>t d<U+1ED3>ng ý   236   27.6  27.63%  
##  9 PEB4  R<U+1EA5>t d<U+1ED3>ng ý   204   23.9  23.89%  
## 10 PDE1  R<U+1EA5>t d<U+1ED3>ng ý   191   22.4  22.37%  
## 11 PDE2  R<U+1EA5>t d<U+1ED3>ng ý   174   20.4  20.37%  
## 12 PDE3  R<U+1EA5>t d<U+1ED3>ng ý   113   13.2  13.23%  
## 13 PDE4  R<U+1EA5>t d<U+1ED3>ng ý   187   21.9  21.9%   
## 14 PDE5  R<U+1EA5>t d<U+1ED3>ng ý   139   16.3  16.28%  
## 15 PDE6  R<U+1EA5>t d<U+1ED3>ng ý   252   29.5  29.51%  
## 16 PDE7  R<U+1EA5>t d<U+1ED3>ng ý   229   26.8  26.81%  
## 17 PSO1  R<U+1EA5>t d<U+1ED3>ng ý    46    5.39 5.39%   
## 18 PSO2  R<U+1EA5>t d<U+1ED3>ng ý    49    5.74 5.74%   
## 19 PSO3  R<U+1EA5>t d<U+1ED3>ng ý    58    6.79 6.79%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t d<U+1ED3>ng ý    75    8.78 8.78%   
##  2 PHB2  R<U+1EA5>t d<U+1ED3>ng ý   110   12.9  12.88%  
##  3 PHB3  R<U+1EA5>t d<U+1ED3>ng ý    72    8.43 8.43%   
##  4 PHB4  R<U+1EA5>t d<U+1ED3>ng ý    67    7.85 7.85%   
##  5 PHB5  R<U+1EA5>t d<U+1ED3>ng ý    87   10.2  10.19%  
##  6 PEB1  R<U+1EA5>t d<U+1ED3>ng ý    84    9.84 9.84%   
##  7 PEB2  R<U+1EA5>t d<U+1ED3>ng ý    72    8.43 8.43%   
##  8 PEB3  R<U+1EA5>t d<U+1ED3>ng ý   236   27.6  27.63%  
##  9 PEB4  R<U+1EA5>t d<U+1ED3>ng ý   204   23.9  23.89%  
## 10 PDE1  R<U+1EA5>t d<U+1ED3>ng ý   191   22.4  22.37%  
## 11 PDE2  R<U+1EA5>t d<U+1ED3>ng ý   174   20.4  20.37%  
## 12 PDE3  R<U+1EA5>t d<U+1ED3>ng ý   113   13.2  13.23%  
## 13 PDE4  R<U+1EA5>t d<U+1ED3>ng ý   187   21.9  21.9%   
## 14 PDE5  R<U+1EA5>t d<U+1ED3>ng ý   139   16.3  16.28%  
## 15 PDE6  R<U+1EA5>t d<U+1ED3>ng ý   252   29.5  29.51%  
## 16 PDE7  R<U+1EA5>t d<U+1ED3>ng ý   229   26.8  26.81%  
## 17 PSO1  R<U+1EA5>t d<U+1ED3>ng ý    46    5.39 5.39%   
## 18 PSO2  R<U+1EA5>t d<U+1ED3>ng ý    49    5.74 5.74%   
## 19 PSO3  R<U+1EA5>t d<U+1ED3>ng ý    58    6.79 6.79%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text4, aes(x = BPE, y = 13, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.9.4. Construct thuộc nhóm Organism-Response - Nhãn tiếng việt

# Plot Likert graph for people in both cities for construct PHB
DN_HCM_SEM_OR_v = within(DN_HCM_SEM_OR, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PVA1", "PVA2", "PVA3", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7"))
  })
str(DN_HCM_SEM_OR_v)
## 'data.frame':    15372 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 4 4 5 5 4 2 6 5 6 ...
##  $ BPE: Factor w/ 18 levels "IMA1","IMA2",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(DN_HCM_SEM_OR_v)
##                              Res            BPE       
##  R<U+1EA5>t không d<U+1ED3>ng ý: 146   IMA1   :  854  
##  Không d<U+1ED3>ng ý           : 351   IMA2   :  854  
##  Khá không d<U+1ED3>ng ý       : 453   IMA3   :  854  
##  Bình thu<U+1EDD>ng            :1925   IMA4   :  854  
##  Khá d<U+1ED3>ng ý             :3400   IMA5   :  854  
##  Ð<U+1ED3>ng ý                 :6912   PVA1   :  854  
##  R<U+1EA5>t d<U+1ED3>ng ý      :2185   (Other):10248
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_HCM_SEM_OR_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4
## [16] LOY5 LOY6 LOY7
## 18 Levels: IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 ... LOY7
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  2 IMA1  Không d<U+1ED3>ng ý        18    2.11 2.11%   
##  3 IMA1  Khá không d<U+1ED3>ng ý    32    3.75 3.75%   
##  4 IMA1  Bình thu<U+1EDD>ng        154   18.0  18.03%  
##  5 IMA1  Khá d<U+1ED3>ng ý         231   27.0  27.05%  
##  6 IMA1  Ð<U+1ED3>ng ý             349   40.9  40.87%  
##  7 IMA1  R<U+1EA5>t d<U+1ED3>ng ý          64    7.49 7.49%   
##  8 IMA2  R<U+1EA5>t không d<U+1ED3>ng ý    11    1.29 1.29%   
##  9 IMA2  Không d<U+1ED3>ng ý        19    2.22 2.22%   
## 10 IMA2  Khá không d<U+1ED3>ng ý    24    2.81 2.81%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn gi\u00E1 tr\u1ECB (PVA), h\u00ECnh \u1EA3nh (IMA), s\u1EF1 h\u00E0i l\u00F2ng (SAT) v\u00E0 l\u00F2ng trung th\u00E0nh (LOY) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB Vi\u1EC7t Nam", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  2 IMA2  R<U+1EA5>t không d<U+1ED3>ng ý    11    1.29 1.29%   
##  3 IMA3  R<U+1EA5>t không d<U+1ED3>ng ý    11    1.29 1.29%   
##  4 IMA4  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
##  5 IMA5  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  6 PVA1  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.47 0.47%   
##  7 PVA2  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
##  8 PVA3  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.35 0.35%   
##  9 SAT1  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
## 10 SAT2  R<U+1EA5>t không d<U+1ED3>ng ý    12    1.41 1.41%   
## 11 SAT3  R<U+1EA5>t không d<U+1ED3>ng ý    15    1.76 1.76%   
## 12 LOY1  R<U+1EA5>t không d<U+1ED3>ng ý    13    1.52 1.52%   
## 13 LOY2  R<U+1EA5>t không d<U+1ED3>ng ý     5    0.59 0.59%   
## 14 LOY3  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.35 0.35%   
## 15 LOY4  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.23 0.23%   
## 16 LOY5  R<U+1EA5>t không d<U+1ED3>ng ý     9    1.05 1.05%   
## 17 LOY6  R<U+1EA5>t không d<U+1ED3>ng ý     6    0.7  0.7%    
## 18 LOY7  R<U+1EA5>t không d<U+1ED3>ng ý     8    0.94 0.94%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 18 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 IMA1  Không d<U+1ED3>ng ý    18    2.11 2.11%   
##  2 IMA2  Không d<U+1ED3>ng ý    19    2.22 2.22%   
##  3 IMA3  Không d<U+1ED3>ng ý    11    1.29 1.29%   
##  4 IMA4  Không d<U+1ED3>ng ý    14    1.64 1.64%   
##  5 IMA5  Không d<U+1ED3>ng ý    21    2.46 2.46%   
##  6 PVA1  Không d<U+1ED3>ng ý    18    2.11 2.11%   
##  7 PVA2  Không d<U+1ED3>ng ý    22    2.58 2.58%   
##  8 PVA3  Không d<U+1ED3>ng ý    16    1.87 1.87%   
##  9 SAT1  Không d<U+1ED3>ng ý    17    1.99 1.99%   
## 10 SAT2  Không d<U+1ED3>ng ý    23    2.69 2.69%   
## 11 SAT3  Không d<U+1ED3>ng ý    58    6.79 6.79%   
## 12 LOY1  Không d<U+1ED3>ng ý    16    1.87 1.87%   
## 13 LOY2  Không d<U+1ED3>ng ý     8    0.94 0.94%   
## 14 LOY3  Không d<U+1ED3>ng ý    25    2.93 2.93%   
## 15 LOY4  Không d<U+1ED3>ng ý    13    1.52 1.52%   
## 16 LOY5  Không d<U+1ED3>ng ý    22    2.58 2.58%   
## 17 LOY6  Không d<U+1ED3>ng ý    14    1.64 1.64%   
## 18 LOY7  Không d<U+1ED3>ng ý    16    1.87 1.87%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  Khá không d<U+1ED3>ng ý    32    3.75 3.75%   
##  2 IMA2  Khá không d<U+1ED3>ng ý    24    2.81 2.81%   
##  3 IMA3  Khá không d<U+1ED3>ng ý    19    2.22 2.22%   
##  4 IMA4  Khá không d<U+1ED3>ng ý    25    2.93 2.93%   
##  5 IMA5  Khá không d<U+1ED3>ng ý    19    2.22 2.22%   
##  6 PVA1  Khá không d<U+1ED3>ng ý    18    2.11 2.11%   
##  7 PVA2  Khá không d<U+1ED3>ng ý    15    1.76 1.76%   
##  8 PVA3  Khá không d<U+1ED3>ng ý    18    2.11 2.11%   
##  9 SAT1  Khá không d<U+1ED3>ng ý    30    3.51 3.51%   
## 10 SAT2  Khá không d<U+1ED3>ng ý    25    2.93 2.93%   
## 11 SAT3  Khá không d<U+1ED3>ng ý    51    5.97 5.97%   
## 12 LOY1  Khá không d<U+1ED3>ng ý    15    1.76 1.76%   
## 13 LOY2  Khá không d<U+1ED3>ng ý    18    2.11 2.11%   
## 14 LOY3  Khá không d<U+1ED3>ng ý    39    4.57 4.57%   
## 15 LOY4  Khá không d<U+1ED3>ng ý    21    2.46 2.46%   
## 16 LOY5  Khá không d<U+1ED3>ng ý    34    3.98 3.98%   
## 17 LOY6  Khá không d<U+1ED3>ng ý    24    2.81 2.81%   
## 18 LOY7  Khá không d<U+1ED3>ng ý    26    3.04 3.04%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 IMA1  Bình thu<U+1EDD>ng   154   18.0  18.03%  
##  2 IMA2  Bình thu<U+1EDD>ng   157   18.4  18.38%  
##  3 IMA3  Bình thu<U+1EDD>ng   128   15.0  14.99%  
##  4 IMA4  Bình thu<U+1EDD>ng   114   13.4  13.35%  
##  5 IMA5  Bình thu<U+1EDD>ng   104   12.2  12.18%  
##  6 PVA1  Bình thu<U+1EDD>ng   112   13.1  13.11%  
##  7 PVA2  Bình thu<U+1EDD>ng    98   11.5  11.48%  
##  8 PVA3  Bình thu<U+1EDD>ng    91   10.7  10.66%  
##  9 SAT1  Bình thu<U+1EDD>ng   128   15.0  14.99%  
## 10 SAT2  Bình thu<U+1EDD>ng   109   12.8  12.76%  
## 11 SAT3  Bình thu<U+1EDD>ng   140   16.4  16.39%  
## 12 LOY1  Bình thu<U+1EDD>ng    79    9.25 9.25%   
## 13 LOY2  Bình thu<U+1EDD>ng    56    6.56 6.56%   
## 14 LOY3  Bình thu<U+1EDD>ng    99   11.6  11.59%  
## 15 LOY4  Bình thu<U+1EDD>ng    69    8.08 8.08%   
## 16 LOY5  Bình thu<U+1EDD>ng   110   12.9  12.88%  
## 17 LOY6  Bình thu<U+1EDD>ng    99   11.6  11.59%  
## 18 LOY7  Bình thu<U+1EDD>ng    78    9.13 9.13%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Khá d<U+1ED3>ng ý   231    27.0 27.05%  
##  2 IMA2  Khá d<U+1ED3>ng ý   213    24.9 24.94%  
##  3 IMA3  Khá d<U+1ED3>ng ý   206    24.1 24.12%  
##  4 IMA4  Khá d<U+1ED3>ng ý   199    23.3 23.3%   
##  5 IMA5  Khá d<U+1ED3>ng ý   203    23.8 23.77%  
##  6 PVA1  Khá d<U+1ED3>ng ý   166    19.4 19.44%  
##  7 PVA2  Khá d<U+1ED3>ng ý   169    19.8 19.79%  
##  8 PVA3  Khá d<U+1ED3>ng ý   160    18.7 18.74%  
##  9 SAT1  Khá d<U+1ED3>ng ý   212    24.8 24.82%  
## 10 SAT2  Khá d<U+1ED3>ng ý   213    24.9 24.94%  
## 11 SAT3  Khá d<U+1ED3>ng ý   172    20.1 20.14%  
## 12 LOY1  Khá d<U+1ED3>ng ý   156    18.3 18.27%  
## 13 LOY2  Khá d<U+1ED3>ng ý   129    15.1 15.11%  
## 14 LOY3  Khá d<U+1ED3>ng ý   194    22.7 22.72%  
## 15 LOY4  Khá d<U+1ED3>ng ý   157    18.4 18.38%  
## 16 LOY5  Khá d<U+1ED3>ng ý   213    24.9 24.94%  
## 17 LOY6  Khá d<U+1ED3>ng ý   196    23.0 22.95%  
## 18 LOY7  Khá d<U+1ED3>ng ý   211    24.7 24.71%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 IMA1  Ð<U+1ED3>ng ý   349    40.9 40.87%  
##  2 IMA2  Ð<U+1ED3>ng ý   365    42.7 42.74%  
##  3 IMA3  Ð<U+1ED3>ng ý   401    47.0 46.96%  
##  4 IMA4  Ð<U+1ED3>ng ý   405    47.4 47.42%  
##  5 IMA5  Ð<U+1ED3>ng ý   418    49.0 48.95%  
##  6 PVA1  Ð<U+1ED3>ng ý   431    50.5 50.47%  
##  7 PVA2  Ð<U+1ED3>ng ý   427    50   50%     
##  8 PVA3  Ð<U+1ED3>ng ý   436    51.0 51.05%  
##  9 SAT1  Ð<U+1ED3>ng ý   337    39.5 39.46%  
## 10 SAT2  Ð<U+1ED3>ng ý   344    40.3 40.28%  
## 11 SAT3  Ð<U+1ED3>ng ý   293    34.3 34.31%  
## 12 LOY1  Ð<U+1ED3>ng ý   402    47.1 47.07%  
## 13 LOY2  Ð<U+1ED3>ng ý   413    48.4 48.36%  
## 14 LOY3  Ð<U+1ED3>ng ý   343    40.2 40.16%  
## 15 LOY4  Ð<U+1ED3>ng ý   413    48.4 48.36%  
## 16 LOY5  Ð<U+1ED3>ng ý   361    42.3 42.27%  
## 17 LOY6  Ð<U+1ED3>ng ý   383    44.8 44.85%  
## 18 LOY7  Ð<U+1ED3>ng ý   391    45.8 45.78%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t d<U+1ED3>ng ý    64    7.49 7.49%   
##  2 IMA2  R<U+1EA5>t d<U+1ED3>ng ý    65    7.61 7.61%   
##  3 IMA3  R<U+1EA5>t d<U+1ED3>ng ý    78    9.13 9.13%   
##  4 IMA4  R<U+1EA5>t d<U+1ED3>ng ý    84    9.84 9.84%   
##  5 IMA5  R<U+1EA5>t d<U+1ED3>ng ý    83    9.72 9.72%   
##  6 PVA1  R<U+1EA5>t d<U+1ED3>ng ý   105   12.3  12.3%   
##  7 PVA2  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
##  8 PVA3  R<U+1EA5>t d<U+1ED3>ng ý   130   15.2  15.22%  
##  9 SAT1  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
## 10 SAT2  R<U+1EA5>t d<U+1ED3>ng ý   128   15.0  14.99%  
## 11 SAT3  R<U+1EA5>t d<U+1ED3>ng ý   125   14.6  14.64%  
## 12 LOY1  R<U+1EA5>t d<U+1ED3>ng ý   173   20.3  20.26%  
## 13 LOY2  R<U+1EA5>t d<U+1ED3>ng ý   225   26.4  26.35%  
## 14 LOY3  R<U+1EA5>t d<U+1ED3>ng ý   151   17.7  17.68%  
## 15 LOY4  R<U+1EA5>t d<U+1ED3>ng ý   179   21.0  20.96%  
## 16 LOY5  R<U+1EA5>t d<U+1ED3>ng ý   105   12.3  12.3%   
## 17 LOY6  R<U+1EA5>t d<U+1ED3>ng ý   132   15.5  15.46%  
## 18 LOY7  R<U+1EA5>t d<U+1ED3>ng ý   124   14.5  14.52%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t d<U+1ED3>ng ý    64    7.49 7.49%   
##  2 IMA2  R<U+1EA5>t d<U+1ED3>ng ý    65    7.61 7.61%   
##  3 IMA3  R<U+1EA5>t d<U+1ED3>ng ý    78    9.13 9.13%   
##  4 IMA4  R<U+1EA5>t d<U+1ED3>ng ý    84    9.84 9.84%   
##  5 IMA5  R<U+1EA5>t d<U+1ED3>ng ý    83    9.72 9.72%   
##  6 PVA1  R<U+1EA5>t d<U+1ED3>ng ý   105   12.3  12.3%   
##  7 PVA2  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
##  8 PVA3  R<U+1EA5>t d<U+1ED3>ng ý   130   15.2  15.22%  
##  9 SAT1  R<U+1EA5>t d<U+1ED3>ng ý   117   13.7  13.7%   
## 10 SAT2  R<U+1EA5>t d<U+1ED3>ng ý   128   15.0  14.99%  
## 11 SAT3  R<U+1EA5>t d<U+1ED3>ng ý   125   14.6  14.64%  
## 12 LOY1  R<U+1EA5>t d<U+1ED3>ng ý   173   20.3  20.26%  
## 13 LOY2  R<U+1EA5>t d<U+1ED3>ng ý   225   26.4  26.35%  
## 14 LOY3  R<U+1EA5>t d<U+1ED3>ng ý   151   17.7  17.68%  
## 15 LOY4  R<U+1EA5>t d<U+1ED3>ng ý   179   21.0  20.96%  
## 16 LOY5  R<U+1EA5>t d<U+1ED3>ng ý   105   12.3  12.3%   
## 17 LOY6  R<U+1EA5>t d<U+1ED3>ng ý   132   15.5  15.46%  
## 18 LOY7  R<U+1EA5>t d<U+1ED3>ng ý   124   14.5  14.52%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text4, aes(x = BPE, y = 13, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.10. Vẽ biểu đồ likert cho dữ liệu của Đà Nẵng theo từng nhóm constructs-Nhãn tiếng anh 3.10.1. Construct PSA - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PEV
library(tidyverse)
library(compareGroups)
head(DN_SEM_PSA)
##     Res  BPE
## 449   6 PSW1
## 450   6 PSW1
## 451   6 PSW1
## 452   1 PSW1
## 453   6 PSW1
## 454   6 PSW1
dim(DN_SEM_PSA)
## [1] 8932    2
attach(DN_SEM_PSA)
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_SEM_PSA = within(DN_SEM_PSA, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8"))
  })
str(DN_SEM_PSA)
## 'data.frame':    8932 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 6 6 1 6 6 6 7 6 6 ...
##  $ BPE: Factor w/ 22 levels "PSW1","PSW2",..: 16 16 16 16 16 16 16 16 16 16 ...
summary(DN_SEM_PSA)
##              Res            BPE      
##  Very Disagree : 182   PSW1   : 406  
##  Disagree      : 497   PSW2   : 406  
##  Quite Disagree: 440   PSW3   : 406  
##  Normal        : 813   PSW4   : 406  
##  Quite Agree   :1745   PSW5   : 406  
##  Agree         :3936   PSW6   : 406  
##  Very Agree    :1319   (Other):6496
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_PSA %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8
## 22 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PSB8
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 154 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree      7    1.72 1.72%   
##  2 PSW1  Disagree           8    1.97 1.97%   
##  3 PSW1  Quite Disagree    15    3.69 3.69%   
##  4 PSW1  Normal            26    6.4  6.4%    
##  5 PSW1  Quite Agree       71   17.5  17.49%  
##  6 PSW1  Agree            212   52.2  52.22%  
##  7 PSW1  Very Agree        67   16.5  16.5%   
##  8 PSW2  Very Disagree      4    0.99 0.99%   
##  9 PSW2  Disagree           9    2.22 2.22%   
## 10 PSW2  Quite Disagree    14    3.45 3.45%   
## # ... with 144 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived safety (PSA) of bus passengers in Da Nang", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 22 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree     7    1.72 1.72%   
##  2 PSW2  Very Disagree     4    0.99 0.99%   
##  3 PSW3  Very Disagree     1    0.25 0.25%   
##  4 PSW4  Very Disagree     3    0.74 0.74%   
##  5 PSW5  Very Disagree     2    0.49 0.49%   
##  6 PSW6  Very Disagree     3    0.74 0.74%   
##  7 PSW7  Very Disagree     2    0.49 0.49%   
##  8 PSS1  Very Disagree     2    0.49 0.49%   
##  9 PSS2  Very Disagree     6    1.48 1.48%   
## 10 PSS3  Very Disagree     5    1.23 1.23%   
## # ... with 12 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 7 x 5
##   BPE   Res          n percent bar_text
##   <fct> <fct>    <int>   <dbl> <chr>   
## 1 PSS5  Disagree    25    6.16 6.16%   
## 2 PSS6  Disagree   117   28.8  28.82%  
## 3 PSS7  Disagree   102   25.1  25.12%  
## 4 PSB1  Disagree    21    5.17 5.17%   
## 5 PSB5  Disagree    27    6.65 6.65%   
## 6 PSB6  Disagree    15    3.69 3.69%   
## 7 PSB7  Disagree    92   22.7  22.66%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 22 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Quite Disagree    15    3.69 3.69%   
##  2 PSW2  Quite Disagree    14    3.45 3.45%   
##  3 PSW3  Quite Disagree     8    1.97 1.97%   
##  4 PSW4  Quite Disagree    17    4.19 4.19%   
##  5 PSW5  Quite Disagree     6    1.48 1.48%   
##  6 PSW6  Quite Disagree     2    0.49 0.49%   
##  7 PSW7  Quite Disagree     4    0.99 0.99%   
##  8 PSS1  Quite Disagree     8    1.97 1.97%   
##  9 PSS2  Quite Disagree    28    6.9  6.9%    
## 10 PSS3  Quite Disagree    20    4.93 4.93%   
## # ... with 12 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 22 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Normal    26    6.4  6.4%    
##  2 PSW2  Normal    26    6.4  6.4%    
##  3 PSW3  Normal    19    4.68 4.68%   
##  4 PSW4  Normal    48   11.8  11.82%  
##  5 PSW5  Normal    21    5.17 5.17%   
##  6 PSW6  Normal    10    2.46 2.46%   
##  7 PSW7  Normal    15    3.69 3.69%   
##  8 PSS1  Normal    20    4.93 4.93%   
##  9 PSS2  Normal    40    9.85 9.85%   
## 10 PSS3  Normal    31    7.64 7.64%   
## # ... with 12 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 22 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Quite Agree    71   17.5  17.49%  
##  2 PSW2  Quite Agree    69   17    17%     
##  3 PSW3  Quite Agree    69   17    17%     
##  4 PSW4  Quite Agree    97   23.9  23.89%  
##  5 PSW5  Quite Agree    50   12.3  12.32%  
##  6 PSW6  Quite Agree    38    9.36 9.36%   
##  7 PSW7  Quite Agree    50   12.3  12.32%  
##  8 PSS1  Quite Agree    53   13.0  13.05%  
##  9 PSS2  Quite Agree    95   23.4  23.4%   
## 10 PSS3  Quite Agree    97   23.9  23.89%  
## # ... with 12 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 22 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PSW1  Agree   212    52.2 52.22%  
##  2 PSW2  Agree   215    53.0 52.96%  
##  3 PSW3  Agree   237    58.4 58.37%  
##  4 PSW4  Agree   174    42.9 42.86%  
##  5 PSW5  Agree   204    50.2 50.25%  
##  6 PSW6  Agree   215    53.0 52.96%  
##  7 PSW7  Agree   223    54.9 54.93%  
##  8 PSS1  Agree   200    49.3 49.26%  
##  9 PSS2  Agree   185    45.6 45.57%  
## 10 PSS3  Agree   197    48.5 48.52%  
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    67    16.5 16.5%   
##  2 PSW2  Very Agree    69    17   17%     
##  3 PSW3  Very Agree    67    16.5 16.5%   
##  4 PSW4  Very Agree    57    14.0 14.04%  
##  5 PSW5  Very Agree   119    29.3 29.31%  
##  6 PSW6  Very Agree   137    33.7 33.74%  
##  7 PSW7  Very Agree   111    27.3 27.34%  
##  8 PSS1  Very Agree   119    29.3 29.31%  
##  9 PSS2  Very Agree    41    10.1 10.1%   
## 10 PSS3  Very Agree    45    11.1 11.08%  
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    67    16.5 16.5%   
##  2 PSW2  Very Agree    69    17   17%     
##  3 PSW3  Very Agree    67    16.5 16.5%   
##  4 PSW4  Very Agree    57    14.0 14.04%  
##  5 PSW5  Very Agree   119    29.3 29.31%  
##  6 PSW6  Very Agree   137    33.7 33.74%  
##  7 PSW7  Very Agree   111    27.3 27.34%  
##  8 PSS1  Very Agree   119    29.3 29.31%  
##  9 PSS2  Very Agree    41    10.1 10.1%   
## 10 PSS3  Very Agree    45    11.1 11.08%  
## # ... with 12 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 22, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.10.2. Construct PSQ - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSQ
library(tidyverse)
library(compareGroups)
head(DN_SEM_PSQ)
##     Res  BPE
## 449   6 PQT1
## 450   6 PQT1
## 451   6 PQT1
## 452   6 PQT1
## 453   6 PQT1
## 454   5 PQT1
dim(DN_SEM_PSQ)
## [1] 7308    2
attach(DN_SEM_PSQ)
## The following objects are masked from DN_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_SEM_PSQ = within(DN_SEM_PSQ, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5"))
  })
str(DN_SEM_PSQ)
## 'data.frame':    7308 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 6 6 6 6 5 6 7 6 6 ...
##  $ BPE: Factor w/ 18 levels "PQT1","PQT2",..: 15 15 15 15 15 15 15 15 15 15 ...
summary(DN_SEM_PSQ)
##              Res            BPE      
##  Very Disagree :  68   PQT1   : 406  
##  Disagree      : 141   PQT2   : 406  
##  Quite Disagree: 331   PQT3   : 406  
##  Normal        : 643   PQT4   : 406  
##  Quite Agree   :1706   PQC1   : 406  
##  Agree         :3253   PQC2   : 406  
##  Very Agree    :1166   (Other):4872
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_PSQ %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2
## [16] PQR3 PQR4 PQR5
## 18 Levels: PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 ... PQR5
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 122 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PQT1  Very Disagree      4    0.99 0.99%   
##  2 PQT1  Disagree          10    2.46 2.46%   
##  3 PQT1  Quite Disagree    35    8.62 8.62%   
##  4 PQT1  Normal            38    9.36 9.36%   
##  5 PQT1  Quite Agree      123   30.3  30.3%   
##  6 PQT1  Agree            150   37.0  36.95%  
##  7 PQT1  Very Agree        46   11.3  11.33%  
##  8 PQT2  Very Disagree      3    0.74 0.74%   
##  9 PQT2  Disagree           2    0.49 0.49%   
## 10 PQT2  Quite Disagree     7    1.72 1.72%   
## # ... with 112 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived service quality (PSQ) of bus users in Danang city", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 16 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PQT1  Very Disagree     4    0.99 0.99%   
##  2 PQT2  Very Disagree     3    0.74 0.74%   
##  3 PQT3  Very Disagree     9    2.22 2.22%   
##  4 PQT4  Very Disagree     5    1.23 1.23%   
##  5 PQC1  Very Disagree     2    0.49 0.49%   
##  6 PQC2  Very Disagree     2    0.49 0.49%   
##  7 PQC3  Very Disagree     1    0.25 0.25%   
##  8 PQC4  Very Disagree     1    0.25 0.25%   
##  9 PQP1  Very Disagree    11    2.71 2.71%   
## 10 PQP3  Very Disagree     7    1.72 1.72%   
## 11 PQP4  Very Disagree     1    0.25 0.25%   
## 12 PQR1  Very Disagree     6    1.48 1.48%   
## 13 PQR2  Very Disagree     4    0.99 0.99%   
## 14 PQR3  Very Disagree     4    0.99 0.99%   
## 15 PQR4  Very Disagree     4    0.99 0.99%   
## 16 PQR5  Very Disagree     4    0.99 0.99%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 6 x 5
##   BPE   Res          n percent bar_text
##   <fct> <fct>    <int>   <dbl> <chr>   
## 1 PQT3  Disagree    17    4.19 4.19%   
## 2 PQT4  Disagree    21    5.17 5.17%   
## 3 PQP1  Disagree    16    3.94 3.94%   
## 4 PQP3  Disagree    13    3.2  3.2%    
## 5 PQP4  Disagree    18    4.43 4.43%   
## 6 PQR1  Disagree    16    3.94 3.94%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PQT1  Quite Disagree    35    8.62 8.62%   
##  2 PQT2  Quite Disagree     7    1.72 1.72%   
##  3 PQT3  Quite Disagree    36    8.87 8.87%   
##  4 PQT4  Quite Disagree    27    6.65 6.65%   
##  5 PQC1  Quite Disagree    18    4.43 4.43%   
##  6 PQC2  Quite Disagree     8    1.97 1.97%   
##  7 PQC3  Quite Disagree    10    2.46 2.46%   
##  8 PQC4  Quite Disagree     6    1.48 1.48%   
##  9 PQC5  Quite Disagree     3    0.74 0.74%   
## 10 PQP1  Quite Disagree    38    9.36 9.36%   
## 11 PQP2  Quite Disagree    17    4.19 4.19%   
## 12 PQP3  Quite Disagree    27    6.65 6.65%   
## 13 PQP4  Quite Disagree    30    7.39 7.39%   
## 14 PQR1  Quite Disagree    16    3.94 3.94%   
## 15 PQR2  Quite Disagree    10    2.46 2.46%   
## 16 PQR3  Quite Disagree     7    1.72 1.72%   
## 17 PQR4  Quite Disagree    16    3.94 3.94%   
## 18 PQR5  Quite Disagree    20    4.93 4.93%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PQT1  Normal    38    9.36 9.36%   
##  2 PQT2  Normal    31    7.64 7.64%   
##  3 PQT3  Normal    38    9.36 9.36%   
##  4 PQT4  Normal   120   29.6  29.56%  
##  5 PQC1  Normal    28    6.9  6.9%    
##  6 PQC2  Normal    28    6.9  6.9%    
##  7 PQC3  Normal    23    5.67 5.67%   
##  8 PQC4  Normal    31    7.64 7.64%   
##  9 PQC5  Normal    24    5.91 5.91%   
## 10 PQP1  Normal    29    7.14 7.14%   
## 11 PQP2  Normal    24    5.91 5.91%   
## 12 PQP3  Normal    42   10.3  10.34%  
## 13 PQP4  Normal    29    7.14 7.14%   
## 14 PQR1  Normal    69   17    17%     
## 15 PQR2  Normal    24    5.91 5.91%   
## 16 PQR3  Normal    20    4.93 4.93%   
## 17 PQR4  Normal    23    5.67 5.67%   
## 18 PQR5  Normal    22    5.42 5.42%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PQT1  Quite Agree   123    30.3 30.3%   
##  2 PQT2  Quite Agree    62    15.3 15.27%  
##  3 PQT3  Quite Agree   106    26.1 26.11%  
##  4 PQT4  Quite Agree    87    21.4 21.43%  
##  5 PQC1  Quite Agree    94    23.2 23.15%  
##  6 PQC2  Quite Agree    85    20.9 20.94%  
##  7 PQC3  Quite Agree    94    23.2 23.15%  
##  8 PQC4  Quite Agree    82    20.2 20.2%   
##  9 PQC5  Quite Agree    76    18.7 18.72%  
## 10 PQP1  Quite Agree   126    31.0 31.03%  
## 11 PQP2  Quite Agree    94    23.2 23.15%  
## 12 PQP3  Quite Agree   114    28.1 28.08%  
## 13 PQP4  Quite Agree   117    28.8 28.82%  
## 14 PQR1  Quite Agree    93    22.9 22.91%  
## 15 PQR2  Quite Agree    91    22.4 22.41%  
## 16 PQR3  Quite Agree    59    14.5 14.53%  
## 17 PQR4  Quite Agree    79    19.5 19.46%  
## 18 PQR5  Quite Agree   124    30.5 30.54%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PQT1  Agree   150    37.0 36.95%  
##  2 PQT2  Agree   227    55.9 55.91%  
##  3 PQT3  Agree   159    39.2 39.16%  
##  4 PQT4  Agree   112    27.6 27.59%  
##  5 PQC1  Agree   175    43.1 43.1%   
##  6 PQC2  Agree   214    52.7 52.71%  
##  7 PQC3  Agree   204    50.2 50.25%  
##  8 PQC4  Agree   229    56.4 56.4%   
##  9 PQC5  Agree   231    56.9 56.9%   
## 10 PQP1  Agree   149    36.7 36.7%   
## 11 PQP2  Agree   194    47.8 47.78%  
## 12 PQP3  Agree   164    40.4 40.39%  
## 13 PQP4  Agree   154    37.9 37.93%  
## 14 PQR1  Agree   170    41.9 41.87%  
## 15 PQR2  Agree   186    45.8 45.81%  
## 16 PQR3  Agree   193    47.5 47.54%  
## 17 PQR4  Agree   175    43.1 43.1%   
## 18 PQR5  Agree   167    41.1 41.13%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Very Agree    46   11.3  11.33%  
##  2 PQT2  Very Agree    74   18.2  18.23%  
##  3 PQT3  Very Agree    41   10.1  10.1%   
##  4 PQT4  Very Agree    34    8.37 8.37%   
##  5 PQC1  Very Agree    80   19.7  19.7%   
##  6 PQC2  Very Agree    67   16.5  16.5%   
##  7 PQC3  Very Agree    72   17.7  17.73%  
##  8 PQC4  Very Agree    57   14.0  14.04%  
##  9 PQC5  Very Agree    72   17.7  17.73%  
## 10 PQP1  Very Agree    37    9.11 9.11%   
## 11 PQP2  Very Agree    74   18.2  18.23%  
## 12 PQP3  Very Agree    39    9.61 9.61%   
## 13 PQP4  Very Agree    57   14.0  14.04%  
## 14 PQR1  Very Agree    36    8.87 8.87%   
## 15 PQR2  Very Agree    90   22.2  22.17%  
## 16 PQR3  Very Agree   120   29.6  29.56%  
## 17 PQR4  Very Agree   105   25.9  25.86%  
## 18 PQR5  Very Agree    65   16.0  16.01%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Very Agree    46   11.3  11.33%  
##  2 PQT2  Very Agree    74   18.2  18.23%  
##  3 PQT3  Very Agree    41   10.1  10.1%   
##  4 PQT4  Very Agree    34    8.37 8.37%   
##  5 PQC1  Very Agree    80   19.7  19.7%   
##  6 PQC2  Very Agree    67   16.5  16.5%   
##  7 PQC3  Very Agree    72   17.7  17.73%  
##  8 PQC4  Very Agree    57   14.0  14.04%  
##  9 PQC5  Very Agree    72   17.7  17.73%  
## 10 PQP1  Very Agree    37    9.11 9.11%   
## 11 PQP2  Very Agree    74   18.2  18.23%  
## 12 PQP3  Very Agree    39    9.61 9.61%   
## 13 PQP4  Very Agree    57   14.0  14.04%  
## 14 PQR1  Very Agree    36    8.87 8.87%   
## 15 PQR2  Very Agree    90   22.2  22.17%  
## 16 PQR3  Very Agree   120   29.6  29.56%  
## 17 PQR4  Very Agree   105   25.9  25.86%  
## 18 PQR5  Very Agree    65   16.0  16.01%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 23, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.10.3. Construct thuộc nhóm Stimulus - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSQ
library(tidyverse)
library(compareGroups)
head(DN_SEM_S)
##     Res  BPE
## 449   5 PHB1
## 450   5 PHB1
## 451   5 PHB1
## 452   5 PHB1
## 453   6 PHB1
## 454   6 PHB1
dim(DN_SEM_S)
## [1] 7714    2
attach(DN_SEM_S)
## The following objects are masked from DN_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_SEM_S = within(DN_SEM_S, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PBH1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3"))
  })
str(DN_SEM_S)
## 'data.frame':    7714 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 5 5 5 5 6 6 5 7 5 6 ...
##  $ BPE: Factor w/ 19 levels "PBH1","PHB2",..: 12 12 12 12 12 12 12 12 12 12 ...
summary(DN_SEM_S)
##              Res            BPE      
##  Very Disagree :  33   PBH1   : 406  
##  Disagree      : 198   PHB2   : 406  
##  Quite Disagree: 344   PHB3   : 406  
##  Normal        : 691   PHB4   : 406  
##  Quite Agree   :1971   PHB5   : 406  
##  Agree         :3169   PEB1   : 406  
##  Very Agree    :1308   (Other):5278
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_S %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PBH1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6
## [16] PDE7 PSO1 PSO2 PSO3
## 19 Levels: PBH1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 ... PSO3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 124 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PBH1  Very Disagree      6    1.48 1.48%   
##  2 PBH1  Disagree          14    3.45 3.45%   
##  3 PBH1  Quite Disagree    40    9.85 9.85%   
##  4 PBH1  Normal            47   11.6  11.58%  
##  5 PBH1  Quite Agree      112   27.6  27.59%  
##  6 PBH1  Agree            137   33.7  33.74%  
##  7 PBH1  Very Agree        50   12.3  12.32%  
##  8 PHB2  Very Disagree      1    0.25 0.25%   
##  9 PHB2  Disagree           4    0.99 0.99%   
## 10 PHB2  Quite Disagree    12    2.96 2.96%   
## # ... with 114 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived health (PHB), perceived environmental benefits (BEB), perceived social benefits (PSO), perceived design (PDE) of bus passengers in Da Nang", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 13 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PBH1  Very Disagree     6    1.48 1.48%   
##  2 PHB2  Very Disagree     1    0.25 0.25%   
##  3 PHB3  Very Disagree     3    0.74 0.74%   
##  4 PHB4  Very Disagree     1    0.25 0.25%   
##  5 PHB5  Very Disagree     2    0.49 0.49%   
##  6 PEB1  Very Disagree     2    0.49 0.49%   
##  7 PEB2  Very Disagree     6    1.48 1.48%   
##  8 PEB3  Very Disagree     1    0.25 0.25%   
##  9 PEB4  Very Disagree     1    0.25 0.25%   
## 10 PDE3  Very Disagree     1    0.25 0.25%   
## 11 PSO1  Very Disagree     3    0.74 0.74%   
## 12 PSO2  Very Disagree     4    0.99 0.99%   
## 13 PSO3  Very Disagree     2    0.49 0.49%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 4 x 5
##   BPE   Res          n percent bar_text
##   <fct> <fct>    <int>   <dbl> <chr>   
## 1 PBH1  Disagree    14    3.45 3.45%   
## 2 PSO1  Disagree    39    9.61 9.61%   
## 3 PSO2  Disagree    44   10.8  10.84%  
## 4 PSO3  Disagree    20    4.93 4.93%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 19 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PBH1  Quite Disagree    40    9.85 9.85%   
##  2 PHB2  Quite Disagree    12    2.96 2.96%   
##  3 PHB3  Quite Disagree    19    4.68 4.68%   
##  4 PHB4  Quite Disagree    25    6.16 6.16%   
##  5 PHB5  Quite Disagree    16    3.94 3.94%   
##  6 PEB1  Quite Disagree    30    7.39 7.39%   
##  7 PEB2  Quite Disagree    23    5.67 5.67%   
##  8 PEB3  Quite Disagree     2    0.49 0.49%   
##  9 PEB4  Quite Disagree     8    1.97 1.97%   
## 10 PDE1  Quite Disagree    14    3.45 3.45%   
## 11 PDE2  Quite Disagree    15    3.69 3.69%   
## 12 PDE3  Quite Disagree    15    3.69 3.69%   
## 13 PDE4  Quite Disagree     7    1.72 1.72%   
## 14 PDE5  Quite Disagree    25    6.16 6.16%   
## 15 PDE6  Quite Disagree     2    0.49 0.49%   
## 16 PDE7  Quite Disagree     1    0.25 0.25%   
## 17 PSO1  Quite Disagree    25    6.16 6.16%   
## 18 PSO2  Quite Disagree    36    8.87 8.87%   
## 19 PSO3  Quite Disagree    29    7.14 7.14%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 19 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PBH1  Normal    47   11.6  11.58%  
##  2 PHB2  Normal    31    7.64 7.64%   
##  3 PHB3  Normal    49   12.1  12.07%  
##  4 PHB4  Normal    53   13.0  13.05%  
##  5 PHB5  Normal    28    6.9  6.9%    
##  6 PEB1  Normal    38    9.36 9.36%   
##  7 PEB2  Normal    46   11.3  11.33%  
##  8 PEB3  Normal    13    3.2  3.2%    
##  9 PEB4  Normal    17    4.19 4.19%   
## 10 PDE1  Normal    25    6.16 6.16%   
## 11 PDE2  Normal    26    6.4  6.4%    
## 12 PDE3  Normal    35    8.62 8.62%   
## 13 PDE4  Normal    17    4.19 4.19%   
## 14 PDE5  Normal    30    7.39 7.39%   
## 15 PDE6  Normal    13    3.2  3.2%    
## 16 PDE7  Normal    17    4.19 4.19%   
## 17 PSO1  Normal    78   19.2  19.21%  
## 18 PSO2  Normal    62   15.3  15.27%  
## 19 PSO3  Normal    66   16.3  16.26%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 19 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PBH1  Quite Agree   112    27.6 27.59%  
##  2 PHB2  Quite Agree    85    20.9 20.94%  
##  3 PHB3  Quite Agree   115    28.3 28.33%  
##  4 PHB4  Quite Agree   118    29.1 29.06%  
##  5 PHB5  Quite Agree    87    21.4 21.43%  
##  6 PEB1  Quite Agree   115    28.3 28.33%  
##  7 PEB2  Quite Agree   117    28.8 28.82%  
##  8 PEB3  Quite Agree    76    18.7 18.72%  
##  9 PEB4  Quite Agree    98    24.1 24.14%  
## 10 PDE1  Quite Agree    85    20.9 20.94%  
## 11 PDE2  Quite Agree    88    21.7 21.67%  
## 12 PDE3  Quite Agree   139    34.2 34.24%  
## 13 PDE4  Quite Agree    95    23.4 23.4%   
## 14 PDE5  Quite Agree   104    25.6 25.62%  
## 15 PDE6  Quite Agree    73    18.0 17.98%  
## 16 PDE7  Quite Agree    69    17   17%     
## 17 PSO1  Quite Agree   152    37.4 37.44%  
## 18 PSO2  Quite Agree   139    34.2 34.24%  
## 19 PSO3  Quite Agree   104    25.6 25.62%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 19 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PBH1  Agree   137    33.7 33.74%  
##  2 PHB2  Agree   201    49.5 49.51%  
##  3 PHB3  Agree   164    40.4 40.39%  
##  4 PHB4  Agree   149    36.7 36.7%   
##  5 PHB5  Agree   204    50.2 50.25%  
##  6 PEB1  Agree   155    38.2 38.18%  
##  7 PEB2  Agree   158    38.9 38.92%  
##  8 PEB3  Agree   208    51.2 51.23%  
##  9 PEB4  Agree   185    45.6 45.57%  
## 10 PDE1  Agree   192    47.3 47.29%  
## 11 PDE2  Agree   191    47.0 47.04%  
## 12 PDE3  Agree   158    38.9 38.92%  
## 13 PDE4  Agree   179    44.1 44.09%  
## 14 PDE5  Agree   171    42.1 42.12%  
## 15 PDE6  Agree   179    44.1 44.09%  
## 16 PDE7  Agree   192    47.3 47.29%  
## 17 PSO1  Agree    90    22.2 22.17%  
## 18 PSO2  Agree    98    24.1 24.14%  
## 19 PSO3  Agree   158    38.9 38.92%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PBH1  Very Agree    50   12.3  12.32%  
##  2 PHB2  Very Agree    72   17.7  17.73%  
##  3 PHB3  Very Agree    49   12.1  12.07%  
##  4 PHB4  Very Agree    49   12.1  12.07%  
##  5 PHB5  Very Agree    65   16.0  16.01%  
##  6 PEB1  Very Agree    57   14.0  14.04%  
##  7 PEB2  Very Agree    47   11.6  11.58%  
##  8 PEB3  Very Agree   106   26.1  26.11%  
##  9 PEB4  Very Agree    93   22.9  22.91%  
## 10 PDE1  Very Agree    85   20.9  20.94%  
## 11 PDE2  Very Agree    81   20.0  19.95%  
## 12 PDE3  Very Agree    52   12.8  12.81%  
## 13 PDE4  Very Agree   102   25.1  25.12%  
## 14 PDE5  Very Agree    65   16.0  16.01%  
## 15 PDE6  Very Agree   139   34.2  34.24%  
## 16 PDE7  Very Agree   127   31.3  31.28%  
## 17 PSO1  Very Agree    19    4.68 4.68%   
## 18 PSO2  Very Agree    23    5.67 5.67%   
## 19 PSO3  Very Agree    27    6.65 6.65%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PBH1  Very Agree    50   12.3  12.32%  
##  2 PHB2  Very Agree    72   17.7  17.73%  
##  3 PHB3  Very Agree    49   12.1  12.07%  
##  4 PHB4  Very Agree    49   12.1  12.07%  
##  5 PHB5  Very Agree    65   16.0  16.01%  
##  6 PEB1  Very Agree    57   14.0  14.04%  
##  7 PEB2  Very Agree    47   11.6  11.58%  
##  8 PEB3  Very Agree   106   26.1  26.11%  
##  9 PEB4  Very Agree    93   22.9  22.91%  
## 10 PDE1  Very Agree    85   20.9  20.94%  
## 11 PDE2  Very Agree    81   20.0  19.95%  
## 12 PDE3  Very Agree    52   12.8  12.81%  
## 13 PDE4  Very Agree   102   25.1  25.12%  
## 14 PDE5  Very Agree    65   16.0  16.01%  
## 15 PDE6  Very Agree   139   34.2  34.24%  
## 16 PDE7  Very Agree   127   31.3  31.28%  
## 17 PSO1  Very Agree    19    4.68 4.68%   
## 18 PSO2  Very Agree    23    5.67 5.67%   
## 19 PSO3  Very Agree    27    6.65 6.65%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 23, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.10.4. Construct thuộc nhóm Organism-Response - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSQ
library(tidyverse)
library(compareGroups)
head(DN_SEM_OR)
##     Res  BPE
## 449   6 IMA1
## 450   6 IMA1
## 451   6 IMA1
## 452   5 IMA1
## 453   6 IMA1
## 454   6 IMA1
dim(DN_SEM_OR)
## [1] 7308    2
attach(DN_SEM_OR)
## The following objects are masked from DN_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
DN_SEM_OR = within(DN_SEM_OR, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PVA1", "PVA2", "PVA3", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7"))
  })
str(DN_SEM_OR)
## 'data.frame':    7308 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 6 6 5 6 6 5 6 3 6 ...
##  $ BPE: Factor w/ 18 levels "IMA1","IMA2",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(DN_SEM_OR)
##              Res            BPE      
##  Very Disagree :   7   IMA1   : 406  
##  Disagree      :  43   IMA2   : 406  
##  Quite Disagree: 187   IMA3   : 406  
##  Normal        : 510   IMA4   : 406  
##  Quite Agree   :1785   IMA5   : 406  
##  Agree         :3557   PVA1   : 406  
##  Very Agree    :1219   (Other):4872
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_OR %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4
## [16] LOY5 LOY6 LOY7
## 18 Levels: IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 ... LOY7
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 113 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 IMA1  Very Disagree      1    0.25 0.25%   
##  2 IMA1  Disagree           1    0.25 0.25%   
##  3 IMA1  Quite Disagree    11    2.71 2.71%   
##  4 IMA1  Normal            54   13.3  13.3%   
##  5 IMA1  Quite Agree      138   34.0  33.99%  
##  6 IMA1  Agree            169   41.6  41.63%  
##  7 IMA1  Very Agree        32    7.88 7.88%   
##  8 IMA2  Disagree           1    0.25 0.25%   
##  9 IMA2  Quite Disagree     6    1.48 1.48%   
## 10 IMA2  Normal            46   11.3  11.33%  
## # ... with 103 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived image (IMA), perceived value (PVA), satisfation (SAT), loyalty (LOY) towards urban bus systems in Da Nang", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 7 x 5
##   BPE   Res               n percent bar_text
##   <fct> <fct>         <int>   <dbl> <chr>   
## 1 IMA1  Very Disagree     1    0.25 0.25%   
## 2 SAT1  Very Disagree     1    0.25 0.25%   
## 3 SAT2  Very Disagree     1    0.25 0.25%   
## 4 SAT3  Very Disagree     1    0.25 0.25%   
## 5 LOY1  Very Disagree     1    0.25 0.25%   
## 6 LOY6  Very Disagree     1    0.25 0.25%   
## 7 LOY7  Very Disagree     1    0.25 0.25%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 1 x 5
##   BPE   Res          n percent bar_text
##   <fct> <fct>    <int>   <dbl> <chr>   
## 1 SAT3  Disagree    14    3.45 3.45%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 IMA1  Quite Disagree    11    2.71 2.71%   
##  2 IMA2  Quite Disagree     6    1.48 1.48%   
##  3 IMA3  Quite Disagree     3    0.74 0.74%   
##  4 IMA4  Quite Disagree     7    1.72 1.72%   
##  5 IMA5  Quite Disagree     4    0.99 0.99%   
##  6 PVA1  Quite Disagree     5    1.23 1.23%   
##  7 PVA2  Quite Disagree     5    1.23 1.23%   
##  8 PVA3  Quite Disagree     4    0.99 0.99%   
##  9 SAT1  Quite Disagree    16    3.94 3.94%   
## 10 SAT2  Quite Disagree    12    2.96 2.96%   
## 11 SAT3  Quite Disagree    32    7.88 7.88%   
## 12 LOY1  Quite Disagree     6    1.48 1.48%   
## 13 LOY2  Quite Disagree    10    2.46 2.46%   
## 14 LOY3  Quite Disagree    22    5.42 5.42%   
## 15 LOY4  Quite Disagree     6    1.48 1.48%   
## 16 LOY5  Quite Disagree    19    4.68 4.68%   
## 17 LOY6  Quite Disagree    10    2.46 2.46%   
## 18 LOY7  Quite Disagree     9    2.22 2.22%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 IMA1  Normal    54   13.3  13.3%   
##  2 IMA2  Normal    46   11.3  11.33%  
##  3 IMA3  Normal    39    9.61 9.61%   
##  4 IMA4  Normal    26    6.4  6.4%    
##  5 IMA5  Normal    23    5.67 5.67%   
##  6 PVA1  Normal    25    6.16 6.16%   
##  7 PVA2  Normal    23    5.67 5.67%   
##  8 PVA3  Normal    30    7.39 7.39%   
##  9 SAT1  Normal    38    9.36 9.36%   
## 10 SAT2  Normal    31    7.64 7.64%   
## 11 SAT3  Normal    41   10.1  10.1%   
## 12 LOY1  Normal    18    4.43 4.43%   
## 13 LOY2  Normal    12    2.96 2.96%   
## 14 LOY3  Normal    25    6.16 6.16%   
## 15 LOY4  Normal     4    0.99 0.99%   
## 16 LOY5  Normal    31    7.64 7.64%   
## 17 LOY6  Normal    28    6.9  6.9%    
## 18 LOY7  Normal    16    3.94 3.94%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 IMA1  Quite Agree   138    34.0 33.99%  
##  2 IMA2  Quite Agree   113    27.8 27.83%  
##  3 IMA3  Quite Agree   106    26.1 26.11%  
##  4 IMA4  Quite Agree   102    25.1 25.12%  
##  5 IMA5  Quite Agree    96    23.6 23.65%  
##  6 PVA1  Quite Agree    90    22.2 22.17%  
##  7 PVA2  Quite Agree    86    21.2 21.18%  
##  8 PVA3  Quite Agree    74    18.2 18.23%  
##  9 SAT1  Quite Agree   122    30.0 30.05%  
## 10 SAT2  Quite Agree   114    28.1 28.08%  
## 11 SAT3  Quite Agree   102    25.1 25.12%  
## 12 LOY1  Quite Agree    65    16.0 16.01%  
## 13 LOY2  Quite Agree    64    15.8 15.76%  
## 14 LOY3  Quite Agree   100    24.6 24.63%  
## 15 LOY4  Quite Agree    95    23.4 23.4%   
## 16 LOY5  Quite Agree   118    29.1 29.06%  
## 17 LOY6  Quite Agree   101    24.9 24.88%  
## 18 LOY7  Quite Agree    99    24.4 24.38%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 IMA1  Agree   169    41.6 41.63%  
##  2 IMA2  Agree   207    51.0 50.99%  
##  3 IMA3  Agree   214    52.7 52.71%  
##  4 IMA4  Agree   220    54.2 54.19%  
##  5 IMA5  Agree   231    56.9 56.9%   
##  6 PVA1  Agree   219    53.9 53.94%  
##  7 PVA2  Agree   221    54.4 54.43%  
##  8 PVA3  Agree   219    53.9 53.94%  
##  9 SAT1  Agree   160    39.4 39.41%  
## 10 SAT2  Agree   167    41.1 41.13%  
## 11 SAT3  Agree   140    34.5 34.48%  
## 12 LOY1  Agree   220    54.2 54.19%  
## 13 LOY2  Agree   213    52.5 52.46%  
## 14 LOY3  Agree   176    43.4 43.35%  
## 15 LOY4  Agree   212    52.2 52.22%  
## 16 LOY5  Agree   173    42.6 42.61%  
## 17 LOY6  Agree   189    46.6 46.55%  
## 18 LOY7  Agree   207    51.0 50.99%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Very Agree    32    7.88 7.88%   
##  2 IMA2  Very Agree    33    8.13 8.13%   
##  3 IMA3  Very Agree    43   10.6  10.59%  
##  4 IMA4  Very Agree    51   12.6  12.56%  
##  5 IMA5  Very Agree    51   12.6  12.56%  
##  6 PVA1  Very Agree    65   16.0  16.01%  
##  7 PVA2  Very Agree    70   17.2  17.24%  
##  8 PVA3  Very Agree    78   19.2  19.21%  
##  9 SAT1  Very Agree    69   17    17%     
## 10 SAT2  Very Agree    79   19.5  19.46%  
## 11 SAT3  Very Agree    76   18.7  18.72%  
## 12 LOY1  Very Agree    95   23.4  23.4%   
## 13 LOY2  Very Agree   105   25.9  25.86%  
## 14 LOY3  Very Agree    73   18.0  17.98%  
## 15 LOY4  Very Agree    88   21.7  21.67%  
## 16 LOY5  Very Agree    63   15.5  15.52%  
## 17 LOY6  Very Agree    76   18.7  18.72%  
## 18 LOY7  Very Agree    72   17.7  17.73%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Very Agree    32    7.88 7.88%   
##  2 IMA2  Very Agree    33    8.13 8.13%   
##  3 IMA3  Very Agree    43   10.6  10.59%  
##  4 IMA4  Very Agree    51   12.6  12.56%  
##  5 IMA5  Very Agree    51   12.6  12.56%  
##  6 PVA1  Very Agree    65   16.0  16.01%  
##  7 PVA2  Very Agree    70   17.2  17.24%  
##  8 PVA3  Very Agree    78   19.2  19.21%  
##  9 SAT1  Very Agree    69   17    17%     
## 10 SAT2  Very Agree    79   19.5  19.46%  
## 11 SAT3  Very Agree    76   18.7  18.72%  
## 12 LOY1  Very Agree    95   23.4  23.4%   
## 13 LOY2  Very Agree   105   25.9  25.86%  
## 14 LOY3  Very Agree    73   18.0  17.98%  
## 15 LOY4  Very Agree    88   21.7  21.67%  
## 16 LOY5  Very Agree    63   15.5  15.52%  
## 17 LOY6  Very Agree    76   18.7  18.72%  
## 18 LOY7  Very Agree    72   17.7  17.73%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 23, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.11. Vẽ biểu đồ likert cho dữ liệu của Đà Nẵng theo từng nhóm constructs-Nhãn tiếng việt 3.11.1. Construct PSA - Nhãn tiếng việt

DN_SEM_PSA_v = within(DN_SEM_PSA, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8"))
  })
str(DN_SEM_PSA_v)
## 'data.frame':    8932 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 6 6 1 6 6 6 7 6 6 ...
##  $ BPE: Factor w/ 22 levels "PSW1","PSW2",..: 16 16 16 16 16 16 16 16 16 16 ...
summary(DN_SEM_PSA_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý: 182   PSW1   : 406  
##  Không d<U+1ED3>ng ý           : 497   PSW2   : 406  
##  Khá không d<U+1ED3>ng ý       : 440   PSW3   : 406  
##  Bình thu<U+1EDD>ng            : 813   PSW4   : 406  
##  Khá d<U+1ED3>ng ý             :1745   PSW5   : 406  
##  Ð<U+1ED3>ng ý                 :3936   PSW6   : 406  
##  R<U+1EA5>t d<U+1ED3>ng ý      :1319   (Other):6496
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_PSA_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8
## 22 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PSB8
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 154 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.72 1.72%   
##  2 PSW1  Không d<U+1ED3>ng ý         8    1.97 1.97%   
##  3 PSW1  Khá không d<U+1ED3>ng ý    15    3.69 3.69%   
##  4 PSW1  Bình thu<U+1EDD>ng         26    6.4  6.4%    
##  5 PSW1  Khá d<U+1ED3>ng ý          71   17.5  17.49%  
##  6 PSW1  Ð<U+1ED3>ng ý             212   52.2  52.22%  
##  7 PSW1  R<U+1EA5>t d<U+1ED3>ng ý          67   16.5  16.5%   
##  8 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
##  9 PSW2  Không d<U+1ED3>ng ý         9    2.22 2.22%   
## 10 PSW2  Khá không d<U+1ED3>ng ý    14    3.45 3.45%   
## # ... with 144 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn an to\u00E0n (PSA) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB \u0110\u00E0 N\u1EB5ng\r\n", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 22 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.72 1.72%   
##  2 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
##  3 PSW3  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  4 PSW4  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.74 0.74%   
##  5 PSW5  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
##  6 PSW6  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.74 0.74%   
##  7 PSW7  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
##  8 PSS1  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
##  9 PSS2  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.48 1.48%   
## 10 PSS3  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.23 1.23%   
## # ... with 12 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 22 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PSW1  Không d<U+1ED3>ng ý     8    1.97 1.97%   
##  2 PSW2  Không d<U+1ED3>ng ý     9    2.22 2.22%   
##  3 PSW3  Không d<U+1ED3>ng ý     5    1.23 1.23%   
##  4 PSW4  Không d<U+1ED3>ng ý    10    2.46 2.46%   
##  5 PSW5  Không d<U+1ED3>ng ý     4    0.99 0.99%   
##  6 PSW6  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  7 PSW7  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  8 PSS1  Không d<U+1ED3>ng ý     4    0.99 0.99%   
##  9 PSS2  Không d<U+1ED3>ng ý    11    2.71 2.71%   
## 10 PSS3  Không d<U+1ED3>ng ý    11    2.71 2.71%   
## # ... with 12 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 22 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  Khá không d<U+1ED3>ng ý    15    3.69 3.69%   
##  2 PSW2  Khá không d<U+1ED3>ng ý    14    3.45 3.45%   
##  3 PSW3  Khá không d<U+1ED3>ng ý     8    1.97 1.97%   
##  4 PSW4  Khá không d<U+1ED3>ng ý    17    4.19 4.19%   
##  5 PSW5  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
##  6 PSW6  Khá không d<U+1ED3>ng ý     2    0.49 0.49%   
##  7 PSW7  Khá không d<U+1ED3>ng ý     4    0.99 0.99%   
##  8 PSS1  Khá không d<U+1ED3>ng ý     8    1.97 1.97%   
##  9 PSS2  Khá không d<U+1ED3>ng ý    28    6.9  6.9%    
## 10 PSS3  Khá không d<U+1ED3>ng ý    20    4.93 4.93%   
## # ... with 12 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 22 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Bình thu<U+1EDD>ng    26    6.4  6.4%    
##  2 PSW2  Bình thu<U+1EDD>ng    26    6.4  6.4%    
##  3 PSW3  Bình thu<U+1EDD>ng    19    4.68 4.68%   
##  4 PSW4  Bình thu<U+1EDD>ng    48   11.8  11.82%  
##  5 PSW5  Bình thu<U+1EDD>ng    21    5.17 5.17%   
##  6 PSW6  Bình thu<U+1EDD>ng    10    2.46 2.46%   
##  7 PSW7  Bình thu<U+1EDD>ng    15    3.69 3.69%   
##  8 PSS1  Bình thu<U+1EDD>ng    20    4.93 4.93%   
##  9 PSS2  Bình thu<U+1EDD>ng    40    9.85 9.85%   
## 10 PSS3  Bình thu<U+1EDD>ng    31    7.64 7.64%   
## # ... with 12 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Khá d<U+1ED3>ng ý    71   17.5  17.49%  
##  2 PSW2  Khá d<U+1ED3>ng ý    69   17    17%     
##  3 PSW3  Khá d<U+1ED3>ng ý    69   17    17%     
##  4 PSW4  Khá d<U+1ED3>ng ý    97   23.9  23.89%  
##  5 PSW5  Khá d<U+1ED3>ng ý    50   12.3  12.32%  
##  6 PSW6  Khá d<U+1ED3>ng ý    38    9.36 9.36%   
##  7 PSW7  Khá d<U+1ED3>ng ý    50   12.3  12.32%  
##  8 PSS1  Khá d<U+1ED3>ng ý    53   13.0  13.05%  
##  9 PSS2  Khá d<U+1ED3>ng ý    95   23.4  23.4%   
## 10 PSS3  Khá d<U+1ED3>ng ý    97   23.9  23.89%  
## # ... with 12 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 22 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Ð<U+1ED3>ng ý   212    52.2 52.22%  
##  2 PSW2  Ð<U+1ED3>ng ý   215    53.0 52.96%  
##  3 PSW3  Ð<U+1ED3>ng ý   237    58.4 58.37%  
##  4 PSW4  Ð<U+1ED3>ng ý   174    42.9 42.86%  
##  5 PSW5  Ð<U+1ED3>ng ý   204    50.2 50.25%  
##  6 PSW6  Ð<U+1ED3>ng ý   215    53.0 52.96%  
##  7 PSW7  Ð<U+1ED3>ng ý   223    54.9 54.93%  
##  8 PSS1  Ð<U+1ED3>ng ý   200    49.3 49.26%  
##  9 PSS2  Ð<U+1ED3>ng ý   185    45.6 45.57%  
## 10 PSS3  Ð<U+1ED3>ng ý   197    48.5 48.52%  
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    67    16.5 16.5%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    69    17   17%     
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    67    16.5 16.5%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    57    14.0 14.04%  
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý   119    29.3 29.31%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý   137    33.7 33.74%  
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý   111    27.3 27.34%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý   119    29.3 29.31%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    41    10.1 10.1%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    45    11.1 11.08%  
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    67    16.5 16.5%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    69    17   17%     
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    67    16.5 16.5%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    57    14.0 14.04%  
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý   119    29.3 29.31%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý   137    33.7 33.74%  
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý   111    27.3 27.34%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý   119    29.3 29.31%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    41    10.1 10.1%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    45    11.1 11.08%  
## # ... with 12 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.11.2. Construct PSQ-Nhãn tiếng việt

DN_SEM_PSQ_v = within(DN_SEM_PSQ, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5"))
  })
str(DN_SEM_PSQ_v)
## 'data.frame':    7308 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 6 6 6 6 5 6 7 6 6 ...
##  $ BPE: Factor w/ 18 levels "PQT1","PQT2",..: 15 15 15 15 15 15 15 15 15 15 ...
summary(DN_SEM_PSQ_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý:  68   PQT1   : 406  
##  Không d<U+1ED3>ng ý           : 141   PQT2   : 406  
##  Khá không d<U+1ED3>ng ý       : 331   PQT3   : 406  
##  Bình thu<U+1EDD>ng            : 643   PQT4   : 406  
##  Khá d<U+1ED3>ng ý             :1706   PQC1   : 406  
##  Ð<U+1ED3>ng ý                 :3253   PQC2   : 406  
##  R<U+1EA5>t d<U+1ED3>ng ý      :1166   (Other):4872
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_PSQ_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2
## [16] PQR3 PQR4 PQR5
## 18 Levels: PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 ... PQR5
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 122 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
##  2 PQT1  Không d<U+1ED3>ng ý        10    2.46 2.46%   
##  3 PQT1  Khá không d<U+1ED3>ng ý    35    8.62 8.62%   
##  4 PQT1  Bình thu<U+1EDD>ng         38    9.36 9.36%   
##  5 PQT1  Khá d<U+1ED3>ng ý         123   30.3  30.3%   
##  6 PQT1  Ð<U+1ED3>ng ý             150   37.0  36.95%  
##  7 PQT1  R<U+1EA5>t d<U+1ED3>ng ý          46   11.3  11.33%  
##  8 PQT2  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.74 0.74%   
##  9 PQT2  Không d<U+1ED3>ng ý         2    0.49 0.49%   
## 10 PQT2  Khá không d<U+1ED3>ng ý     7    1.72 1.72%   
## # ... with 112 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn ch\u1EA5t l\u01B0\u1EE3ng d\u1ECBch v\u1EE5 (PSQ) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB \u0110\u00E0 N\u1EB5ng\r\n ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 16 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
##  2 PQT2  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.74 0.74%   
##  3 PQT3  R<U+1EA5>t không d<U+1ED3>ng ý     9    2.22 2.22%   
##  4 PQT4  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.23 1.23%   
##  5 PQC1  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
##  6 PQC2  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
##  7 PQC3  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  8 PQC4  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  9 PQP1  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.71 2.71%   
## 10 PQP3  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.72 1.72%   
## 11 PQP4  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 12 PQR1  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.48 1.48%   
## 13 PQR2  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
## 14 PQR3  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
## 15 PQR4  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
## 16 PQR5  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 16 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PQT1  Không d<U+1ED3>ng ý    10    2.46 2.46%   
##  2 PQT2  Không d<U+1ED3>ng ý     2    0.49 0.49%   
##  3 PQT3  Không d<U+1ED3>ng ý    17    4.19 4.19%   
##  4 PQT4  Không d<U+1ED3>ng ý    21    5.17 5.17%   
##  5 PQC1  Không d<U+1ED3>ng ý     9    2.22 2.22%   
##  6 PQC2  Không d<U+1ED3>ng ý     2    0.49 0.49%   
##  7 PQC3  Không d<U+1ED3>ng ý     2    0.49 0.49%   
##  8 PQP1  Không d<U+1ED3>ng ý    16    3.94 3.94%   
##  9 PQP2  Không d<U+1ED3>ng ý     3    0.74 0.74%   
## 10 PQP3  Không d<U+1ED3>ng ý    13    3.2  3.2%    
## 11 PQP4  Không d<U+1ED3>ng ý    18    4.43 4.43%   
## 12 PQR1  Không d<U+1ED3>ng ý    16    3.94 3.94%   
## 13 PQR2  Không d<U+1ED3>ng ý     1    0.25 0.25%   
## 14 PQR3  Không d<U+1ED3>ng ý     3    0.74 0.74%   
## 15 PQR4  Không d<U+1ED3>ng ý     4    0.99 0.99%   
## 16 PQR5  Không d<U+1ED3>ng ý     4    0.99 0.99%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  Khá không d<U+1ED3>ng ý    35    8.62 8.62%   
##  2 PQT2  Khá không d<U+1ED3>ng ý     7    1.72 1.72%   
##  3 PQT3  Khá không d<U+1ED3>ng ý    36    8.87 8.87%   
##  4 PQT4  Khá không d<U+1ED3>ng ý    27    6.65 6.65%   
##  5 PQC1  Khá không d<U+1ED3>ng ý    18    4.43 4.43%   
##  6 PQC2  Khá không d<U+1ED3>ng ý     8    1.97 1.97%   
##  7 PQC3  Khá không d<U+1ED3>ng ý    10    2.46 2.46%   
##  8 PQC4  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
##  9 PQC5  Khá không d<U+1ED3>ng ý     3    0.74 0.74%   
## 10 PQP1  Khá không d<U+1ED3>ng ý    38    9.36 9.36%   
## 11 PQP2  Khá không d<U+1ED3>ng ý    17    4.19 4.19%   
## 12 PQP3  Khá không d<U+1ED3>ng ý    27    6.65 6.65%   
## 13 PQP4  Khá không d<U+1ED3>ng ý    30    7.39 7.39%   
## 14 PQR1  Khá không d<U+1ED3>ng ý    16    3.94 3.94%   
## 15 PQR2  Khá không d<U+1ED3>ng ý    10    2.46 2.46%   
## 16 PQR3  Khá không d<U+1ED3>ng ý     7    1.72 1.72%   
## 17 PQR4  Khá không d<U+1ED3>ng ý    16    3.94 3.94%   
## 18 PQR5  Khá không d<U+1ED3>ng ý    20    4.93 4.93%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PQT1  Bình thu<U+1EDD>ng    38    9.36 9.36%   
##  2 PQT2  Bình thu<U+1EDD>ng    31    7.64 7.64%   
##  3 PQT3  Bình thu<U+1EDD>ng    38    9.36 9.36%   
##  4 PQT4  Bình thu<U+1EDD>ng   120   29.6  29.56%  
##  5 PQC1  Bình thu<U+1EDD>ng    28    6.9  6.9%    
##  6 PQC2  Bình thu<U+1EDD>ng    28    6.9  6.9%    
##  7 PQC3  Bình thu<U+1EDD>ng    23    5.67 5.67%   
##  8 PQC4  Bình thu<U+1EDD>ng    31    7.64 7.64%   
##  9 PQC5  Bình thu<U+1EDD>ng    24    5.91 5.91%   
## 10 PQP1  Bình thu<U+1EDD>ng    29    7.14 7.14%   
## 11 PQP2  Bình thu<U+1EDD>ng    24    5.91 5.91%   
## 12 PQP3  Bình thu<U+1EDD>ng    42   10.3  10.34%  
## 13 PQP4  Bình thu<U+1EDD>ng    29    7.14 7.14%   
## 14 PQR1  Bình thu<U+1EDD>ng    69   17    17%     
## 15 PQR2  Bình thu<U+1EDD>ng    24    5.91 5.91%   
## 16 PQR3  Bình thu<U+1EDD>ng    20    4.93 4.93%   
## 17 PQR4  Bình thu<U+1EDD>ng    23    5.67 5.67%   
## 18 PQR5  Bình thu<U+1EDD>ng    22    5.42 5.42%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Khá d<U+1ED3>ng ý   123    30.3 30.3%   
##  2 PQT2  Khá d<U+1ED3>ng ý    62    15.3 15.27%  
##  3 PQT3  Khá d<U+1ED3>ng ý   106    26.1 26.11%  
##  4 PQT4  Khá d<U+1ED3>ng ý    87    21.4 21.43%  
##  5 PQC1  Khá d<U+1ED3>ng ý    94    23.2 23.15%  
##  6 PQC2  Khá d<U+1ED3>ng ý    85    20.9 20.94%  
##  7 PQC3  Khá d<U+1ED3>ng ý    94    23.2 23.15%  
##  8 PQC4  Khá d<U+1ED3>ng ý    82    20.2 20.2%   
##  9 PQC5  Khá d<U+1ED3>ng ý    76    18.7 18.72%  
## 10 PQP1  Khá d<U+1ED3>ng ý   126    31.0 31.03%  
## 11 PQP2  Khá d<U+1ED3>ng ý    94    23.2 23.15%  
## 12 PQP3  Khá d<U+1ED3>ng ý   114    28.1 28.08%  
## 13 PQP4  Khá d<U+1ED3>ng ý   117    28.8 28.82%  
## 14 PQR1  Khá d<U+1ED3>ng ý    93    22.9 22.91%  
## 15 PQR2  Khá d<U+1ED3>ng ý    91    22.4 22.41%  
## 16 PQR3  Khá d<U+1ED3>ng ý    59    14.5 14.53%  
## 17 PQR4  Khá d<U+1ED3>ng ý    79    19.5 19.46%  
## 18 PQR5  Khá d<U+1ED3>ng ý   124    30.5 30.54%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PQT1  Ð<U+1ED3>ng ý   150    37.0 36.95%  
##  2 PQT2  Ð<U+1ED3>ng ý   227    55.9 55.91%  
##  3 PQT3  Ð<U+1ED3>ng ý   159    39.2 39.16%  
##  4 PQT4  Ð<U+1ED3>ng ý   112    27.6 27.59%  
##  5 PQC1  Ð<U+1ED3>ng ý   175    43.1 43.1%   
##  6 PQC2  Ð<U+1ED3>ng ý   214    52.7 52.71%  
##  7 PQC3  Ð<U+1ED3>ng ý   204    50.2 50.25%  
##  8 PQC4  Ð<U+1ED3>ng ý   229    56.4 56.4%   
##  9 PQC5  Ð<U+1ED3>ng ý   231    56.9 56.9%   
## 10 PQP1  Ð<U+1ED3>ng ý   149    36.7 36.7%   
## 11 PQP2  Ð<U+1ED3>ng ý   194    47.8 47.78%  
## 12 PQP3  Ð<U+1ED3>ng ý   164    40.4 40.39%  
## 13 PQP4  Ð<U+1ED3>ng ý   154    37.9 37.93%  
## 14 PQR1  Ð<U+1ED3>ng ý   170    41.9 41.87%  
## 15 PQR2  Ð<U+1ED3>ng ý   186    45.8 45.81%  
## 16 PQR3  Ð<U+1ED3>ng ý   193    47.5 47.54%  
## 17 PQR4  Ð<U+1ED3>ng ý   175    43.1 43.1%   
## 18 PQR5  Ð<U+1ED3>ng ý   167    41.1 41.13%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t d<U+1ED3>ng ý    46   11.3  11.33%  
##  2 PQT2  R<U+1EA5>t d<U+1ED3>ng ý    74   18.2  18.23%  
##  3 PQT3  R<U+1EA5>t d<U+1ED3>ng ý    41   10.1  10.1%   
##  4 PQT4  R<U+1EA5>t d<U+1ED3>ng ý    34    8.37 8.37%   
##  5 PQC1  R<U+1EA5>t d<U+1ED3>ng ý    80   19.7  19.7%   
##  6 PQC2  R<U+1EA5>t d<U+1ED3>ng ý    67   16.5  16.5%   
##  7 PQC3  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%  
##  8 PQC4  R<U+1EA5>t d<U+1ED3>ng ý    57   14.0  14.04%  
##  9 PQC5  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%  
## 10 PQP1  R<U+1EA5>t d<U+1ED3>ng ý    37    9.11 9.11%   
## 11 PQP2  R<U+1EA5>t d<U+1ED3>ng ý    74   18.2  18.23%  
## 12 PQP3  R<U+1EA5>t d<U+1ED3>ng ý    39    9.61 9.61%   
## 13 PQP4  R<U+1EA5>t d<U+1ED3>ng ý    57   14.0  14.04%  
## 14 PQR1  R<U+1EA5>t d<U+1ED3>ng ý    36    8.87 8.87%   
## 15 PQR2  R<U+1EA5>t d<U+1ED3>ng ý    90   22.2  22.17%  
## 16 PQR3  R<U+1EA5>t d<U+1ED3>ng ý   120   29.6  29.56%  
## 17 PQR4  R<U+1EA5>t d<U+1ED3>ng ý   105   25.9  25.86%  
## 18 PQR5  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t d<U+1ED3>ng ý    46   11.3  11.33%  
##  2 PQT2  R<U+1EA5>t d<U+1ED3>ng ý    74   18.2  18.23%  
##  3 PQT3  R<U+1EA5>t d<U+1ED3>ng ý    41   10.1  10.1%   
##  4 PQT4  R<U+1EA5>t d<U+1ED3>ng ý    34    8.37 8.37%   
##  5 PQC1  R<U+1EA5>t d<U+1ED3>ng ý    80   19.7  19.7%   
##  6 PQC2  R<U+1EA5>t d<U+1ED3>ng ý    67   16.5  16.5%   
##  7 PQC3  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%  
##  8 PQC4  R<U+1EA5>t d<U+1ED3>ng ý    57   14.0  14.04%  
##  9 PQC5  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%  
## 10 PQP1  R<U+1EA5>t d<U+1ED3>ng ý    37    9.11 9.11%   
## 11 PQP2  R<U+1EA5>t d<U+1ED3>ng ý    74   18.2  18.23%  
## 12 PQP3  R<U+1EA5>t d<U+1ED3>ng ý    39    9.61 9.61%   
## 13 PQP4  R<U+1EA5>t d<U+1ED3>ng ý    57   14.0  14.04%  
## 14 PQR1  R<U+1EA5>t d<U+1ED3>ng ý    36    8.87 8.87%   
## 15 PQR2  R<U+1EA5>t d<U+1ED3>ng ý    90   22.2  22.17%  
## 16 PQR3  R<U+1EA5>t d<U+1ED3>ng ý   120   29.6  29.56%  
## 17 PQR4  R<U+1EA5>t d<U+1ED3>ng ý   105   25.9  25.86%  
## 18 PQR5  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text2, aes(x = BPE, y = 9, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.11.3. Construct thuộc nhóm Stimulus-Nhãn tiếng việt

DN_SEM_S_v = within(DN_SEM_S, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3"))
  })
str(DN_SEM_S_v)
## 'data.frame':    7714 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 5 5 5 5 6 6 5 7 5 6 ...
##  $ BPE: Factor w/ 19 levels "PHB1","PHB2",..: 12 12 12 12 12 12 12 12 12 12 ...
summary(DN_SEM_S_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý:  33   PHB1   : 406  
##  Không d<U+1ED3>ng ý           : 198   PHB2   : 406  
##  Khá không d<U+1ED3>ng ý       : 344   PHB3   : 406  
##  Bình thu<U+1EDD>ng            : 691   PHB4   : 406  
##  Khá d<U+1ED3>ng ý             :1971   PHB5   : 406  
##  Ð<U+1ED3>ng ý                 :3169   PEB1   : 406  
##  R<U+1EA5>t d<U+1ED3>ng ý      :1308   (Other):5278
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_S_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6
## [16] PDE7 PSO1 PSO2 PSO3
## 19 Levels: PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 ... PSO3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 124 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.48 1.48%   
##  2 PHB1  Không d<U+1ED3>ng ý        14    3.45 3.45%   
##  3 PHB1  Khá không d<U+1ED3>ng ý    40    9.85 9.85%   
##  4 PHB1  Bình thu<U+1EDD>ng         47   11.6  11.58%  
##  5 PHB1  Khá d<U+1ED3>ng ý         112   27.6  27.59%  
##  6 PHB1  Ð<U+1ED3>ng ý             137   33.7  33.74%  
##  7 PHB1  R<U+1EA5>t d<U+1ED3>ng ý          50   12.3  12.32%  
##  8 PHB2  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  9 PHB2  Không d<U+1ED3>ng ý         4    0.99 0.99%   
## 10 PHB2  Khá không d<U+1ED3>ng ý    12    2.96 2.96%   
## # ... with 114 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn l\u1EE3i \u00EDch s\u1EE9c kh\u1ECFe (PHB), m\u00F4i tr\u01B0\u1EDDng (PEB), c\u1EA3m nh\u1EADn thi\u1EBFt k\u1EBF (PDE) v\u00E0 l\u1EE3i \u00EDch x\u00E3 h\u1ED9i (PSO) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB \u0110\u00E0 N\u1EB5ng\r\n ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 13 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.48 1.48%   
##  2 PHB2  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  3 PHB3  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.74 0.74%   
##  4 PHB4  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  5 PHB5  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
##  6 PEB1  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%   
##  7 PEB2  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.48 1.48%   
##  8 PEB3  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  9 PEB4  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 10 PDE3  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 11 PSO1  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.74 0.74%   
## 12 PSO2  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.99 0.99%   
## 13 PSO3  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.49 0.49%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 16 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PHB1  Không d<U+1ED3>ng ý    14    3.45 3.45%   
##  2 PHB2  Không d<U+1ED3>ng ý     4    0.99 0.99%   
##  3 PHB3  Không d<U+1ED3>ng ý     7    1.72 1.72%   
##  4 PHB4  Không d<U+1ED3>ng ý    11    2.71 2.71%   
##  5 PHB5  Không d<U+1ED3>ng ý     4    0.99 0.99%   
##  6 PEB1  Không d<U+1ED3>ng ý     9    2.22 2.22%   
##  7 PEB2  Không d<U+1ED3>ng ý     9    2.22 2.22%   
##  8 PEB4  Không d<U+1ED3>ng ý     4    0.99 0.99%   
##  9 PDE1  Không d<U+1ED3>ng ý     5    1.23 1.23%   
## 10 PDE2  Không d<U+1ED3>ng ý     5    1.23 1.23%   
## 11 PDE3  Không d<U+1ED3>ng ý     6    1.48 1.48%   
## 12 PDE4  Không d<U+1ED3>ng ý     6    1.48 1.48%   
## 13 PDE5  Không d<U+1ED3>ng ý    11    2.71 2.71%   
## 14 PSO1  Không d<U+1ED3>ng ý    39    9.61 9.61%   
## 15 PSO2  Không d<U+1ED3>ng ý    44   10.8  10.84%  
## 16 PSO3  Không d<U+1ED3>ng ý    20    4.93 4.93%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 19 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  Khá không d<U+1ED3>ng ý    40    9.85 9.85%   
##  2 PHB2  Khá không d<U+1ED3>ng ý    12    2.96 2.96%   
##  3 PHB3  Khá không d<U+1ED3>ng ý    19    4.68 4.68%   
##  4 PHB4  Khá không d<U+1ED3>ng ý    25    6.16 6.16%   
##  5 PHB5  Khá không d<U+1ED3>ng ý    16    3.94 3.94%   
##  6 PEB1  Khá không d<U+1ED3>ng ý    30    7.39 7.39%   
##  7 PEB2  Khá không d<U+1ED3>ng ý    23    5.67 5.67%   
##  8 PEB3  Khá không d<U+1ED3>ng ý     2    0.49 0.49%   
##  9 PEB4  Khá không d<U+1ED3>ng ý     8    1.97 1.97%   
## 10 PDE1  Khá không d<U+1ED3>ng ý    14    3.45 3.45%   
## 11 PDE2  Khá không d<U+1ED3>ng ý    15    3.69 3.69%   
## 12 PDE3  Khá không d<U+1ED3>ng ý    15    3.69 3.69%   
## 13 PDE4  Khá không d<U+1ED3>ng ý     7    1.72 1.72%   
## 14 PDE5  Khá không d<U+1ED3>ng ý    25    6.16 6.16%   
## 15 PDE6  Khá không d<U+1ED3>ng ý     2    0.49 0.49%   
## 16 PDE7  Khá không d<U+1ED3>ng ý     1    0.25 0.25%   
## 17 PSO1  Khá không d<U+1ED3>ng ý    25    6.16 6.16%   
## 18 PSO2  Khá không d<U+1ED3>ng ý    36    8.87 8.87%   
## 19 PSO3  Khá không d<U+1ED3>ng ý    29    7.14 7.14%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 19 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PHB1  Bình thu<U+1EDD>ng    47   11.6  11.58%  
##  2 PHB2  Bình thu<U+1EDD>ng    31    7.64 7.64%   
##  3 PHB3  Bình thu<U+1EDD>ng    49   12.1  12.07%  
##  4 PHB4  Bình thu<U+1EDD>ng    53   13.0  13.05%  
##  5 PHB5  Bình thu<U+1EDD>ng    28    6.9  6.9%    
##  6 PEB1  Bình thu<U+1EDD>ng    38    9.36 9.36%   
##  7 PEB2  Bình thu<U+1EDD>ng    46   11.3  11.33%  
##  8 PEB3  Bình thu<U+1EDD>ng    13    3.2  3.2%    
##  9 PEB4  Bình thu<U+1EDD>ng    17    4.19 4.19%   
## 10 PDE1  Bình thu<U+1EDD>ng    25    6.16 6.16%   
## 11 PDE2  Bình thu<U+1EDD>ng    26    6.4  6.4%    
## 12 PDE3  Bình thu<U+1EDD>ng    35    8.62 8.62%   
## 13 PDE4  Bình thu<U+1EDD>ng    17    4.19 4.19%   
## 14 PDE5  Bình thu<U+1EDD>ng    30    7.39 7.39%   
## 15 PDE6  Bình thu<U+1EDD>ng    13    3.2  3.2%    
## 16 PDE7  Bình thu<U+1EDD>ng    17    4.19 4.19%   
## 17 PSO1  Bình thu<U+1EDD>ng    78   19.2  19.21%  
## 18 PSO2  Bình thu<U+1EDD>ng    62   15.3  15.27%  
## 19 PSO3  Bình thu<U+1EDD>ng    66   16.3  16.26%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  Khá d<U+1ED3>ng ý   112    27.6 27.59%  
##  2 PHB2  Khá d<U+1ED3>ng ý    85    20.9 20.94%  
##  3 PHB3  Khá d<U+1ED3>ng ý   115    28.3 28.33%  
##  4 PHB4  Khá d<U+1ED3>ng ý   118    29.1 29.06%  
##  5 PHB5  Khá d<U+1ED3>ng ý    87    21.4 21.43%  
##  6 PEB1  Khá d<U+1ED3>ng ý   115    28.3 28.33%  
##  7 PEB2  Khá d<U+1ED3>ng ý   117    28.8 28.82%  
##  8 PEB3  Khá d<U+1ED3>ng ý    76    18.7 18.72%  
##  9 PEB4  Khá d<U+1ED3>ng ý    98    24.1 24.14%  
## 10 PDE1  Khá d<U+1ED3>ng ý    85    20.9 20.94%  
## 11 PDE2  Khá d<U+1ED3>ng ý    88    21.7 21.67%  
## 12 PDE3  Khá d<U+1ED3>ng ý   139    34.2 34.24%  
## 13 PDE4  Khá d<U+1ED3>ng ý    95    23.4 23.4%   
## 14 PDE5  Khá d<U+1ED3>ng ý   104    25.6 25.62%  
## 15 PDE6  Khá d<U+1ED3>ng ý    73    18.0 17.98%  
## 16 PDE7  Khá d<U+1ED3>ng ý    69    17   17%     
## 17 PSO1  Khá d<U+1ED3>ng ý   152    37.4 37.44%  
## 18 PSO2  Khá d<U+1ED3>ng ý   139    34.2 34.24%  
## 19 PSO3  Khá d<U+1ED3>ng ý   104    25.6 25.62%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 19 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PHB1  Ð<U+1ED3>ng ý   137    33.7 33.74%  
##  2 PHB2  Ð<U+1ED3>ng ý   201    49.5 49.51%  
##  3 PHB3  Ð<U+1ED3>ng ý   164    40.4 40.39%  
##  4 PHB4  Ð<U+1ED3>ng ý   149    36.7 36.7%   
##  5 PHB5  Ð<U+1ED3>ng ý   204    50.2 50.25%  
##  6 PEB1  Ð<U+1ED3>ng ý   155    38.2 38.18%  
##  7 PEB2  Ð<U+1ED3>ng ý   158    38.9 38.92%  
##  8 PEB3  Ð<U+1ED3>ng ý   208    51.2 51.23%  
##  9 PEB4  Ð<U+1ED3>ng ý   185    45.6 45.57%  
## 10 PDE1  Ð<U+1ED3>ng ý   192    47.3 47.29%  
## 11 PDE2  Ð<U+1ED3>ng ý   191    47.0 47.04%  
## 12 PDE3  Ð<U+1ED3>ng ý   158    38.9 38.92%  
## 13 PDE4  Ð<U+1ED3>ng ý   179    44.1 44.09%  
## 14 PDE5  Ð<U+1ED3>ng ý   171    42.1 42.12%  
## 15 PDE6  Ð<U+1ED3>ng ý   179    44.1 44.09%  
## 16 PDE7  Ð<U+1ED3>ng ý   192    47.3 47.29%  
## 17 PSO1  Ð<U+1ED3>ng ý    90    22.2 22.17%  
## 18 PSO2  Ð<U+1ED3>ng ý    98    24.1 24.14%  
## 19 PSO3  Ð<U+1ED3>ng ý   158    38.9 38.92%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t d<U+1ED3>ng ý    50   12.3  12.32%  
##  2 PHB2  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%  
##  3 PHB3  R<U+1EA5>t d<U+1ED3>ng ý    49   12.1  12.07%  
##  4 PHB4  R<U+1EA5>t d<U+1ED3>ng ý    49   12.1  12.07%  
##  5 PHB5  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
##  6 PEB1  R<U+1EA5>t d<U+1ED3>ng ý    57   14.0  14.04%  
##  7 PEB2  R<U+1EA5>t d<U+1ED3>ng ý    47   11.6  11.58%  
##  8 PEB3  R<U+1EA5>t d<U+1ED3>ng ý   106   26.1  26.11%  
##  9 PEB4  R<U+1EA5>t d<U+1ED3>ng ý    93   22.9  22.91%  
## 10 PDE1  R<U+1EA5>t d<U+1ED3>ng ý    85   20.9  20.94%  
## 11 PDE2  R<U+1EA5>t d<U+1ED3>ng ý    81   20.0  19.95%  
## 12 PDE3  R<U+1EA5>t d<U+1ED3>ng ý    52   12.8  12.81%  
## 13 PDE4  R<U+1EA5>t d<U+1ED3>ng ý   102   25.1  25.12%  
## 14 PDE5  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
## 15 PDE6  R<U+1EA5>t d<U+1ED3>ng ý   139   34.2  34.24%  
## 16 PDE7  R<U+1EA5>t d<U+1ED3>ng ý   127   31.3  31.28%  
## 17 PSO1  R<U+1EA5>t d<U+1ED3>ng ý    19    4.68 4.68%   
## 18 PSO2  R<U+1EA5>t d<U+1ED3>ng ý    23    5.67 5.67%   
## 19 PSO3  R<U+1EA5>t d<U+1ED3>ng ý    27    6.65 6.65%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t d<U+1ED3>ng ý    50   12.3  12.32%  
##  2 PHB2  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%  
##  3 PHB3  R<U+1EA5>t d<U+1ED3>ng ý    49   12.1  12.07%  
##  4 PHB4  R<U+1EA5>t d<U+1ED3>ng ý    49   12.1  12.07%  
##  5 PHB5  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
##  6 PEB1  R<U+1EA5>t d<U+1ED3>ng ý    57   14.0  14.04%  
##  7 PEB2  R<U+1EA5>t d<U+1ED3>ng ý    47   11.6  11.58%  
##  8 PEB3  R<U+1EA5>t d<U+1ED3>ng ý   106   26.1  26.11%  
##  9 PEB4  R<U+1EA5>t d<U+1ED3>ng ý    93   22.9  22.91%  
## 10 PDE1  R<U+1EA5>t d<U+1ED3>ng ý    85   20.9  20.94%  
## 11 PDE2  R<U+1EA5>t d<U+1ED3>ng ý    81   20.0  19.95%  
## 12 PDE3  R<U+1EA5>t d<U+1ED3>ng ý    52   12.8  12.81%  
## 13 PDE4  R<U+1EA5>t d<U+1ED3>ng ý   102   25.1  25.12%  
## 14 PDE5  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
## 15 PDE6  R<U+1EA5>t d<U+1ED3>ng ý   139   34.2  34.24%  
## 16 PDE7  R<U+1EA5>t d<U+1ED3>ng ý   127   31.3  31.28%  
## 17 PSO1  R<U+1EA5>t d<U+1ED3>ng ý    19    4.68 4.68%   
## 18 PSO2  R<U+1EA5>t d<U+1ED3>ng ý    23    5.67 5.67%   
## 19 PSO3  R<U+1EA5>t d<U+1ED3>ng ý    27    6.65 6.65%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text4, aes(x = BPE, y = 13, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.11.4. Construct thuộc nhóm Organism-Response - Nhãn tiếng việt

# Plot Likert graph for people in both cities for construct PHB
DN_SEM_OR_v = within(DN_SEM_OR, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PVA1", "PVA2", "PVA3", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7"))
  })
str(DN_SEM_OR_v)
## 'data.frame':    7308 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 6 6 5 6 6 5 6 3 6 ...
##  $ BPE: Factor w/ 18 levels "IMA1","IMA2",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(DN_SEM_OR_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý:   7   IMA1   : 406  
##  Không d<U+1ED3>ng ý           :  43   IMA2   : 406  
##  Khá không d<U+1ED3>ng ý       : 187   IMA3   : 406  
##  Bình thu<U+1EDD>ng            : 510   IMA4   : 406  
##  Khá d<U+1ED3>ng ý             :1785   IMA5   : 406  
##  Ð<U+1ED3>ng ý                 :3557   PVA1   : 406  
##  R<U+1EA5>t d<U+1ED3>ng ý      :1219   (Other):4872
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
DN_SEM_OR_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4
## [16] LOY5 LOY6 LOY7
## 18 Levels: IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 ... LOY7
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 113 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
##  2 IMA1  Không d<U+1ED3>ng ý         1    0.25 0.25%   
##  3 IMA1  Khá không d<U+1ED3>ng ý    11    2.71 2.71%   
##  4 IMA1  Bình thu<U+1EDD>ng         54   13.3  13.3%   
##  5 IMA1  Khá d<U+1ED3>ng ý         138   34.0  33.99%  
##  6 IMA1  Ð<U+1ED3>ng ý             169   41.6  41.63%  
##  7 IMA1  R<U+1EA5>t d<U+1ED3>ng ý          32    7.88 7.88%   
##  8 IMA2  Không d<U+1ED3>ng ý         1    0.25 0.25%   
##  9 IMA2  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
## 10 IMA2  Bình thu<U+1EDD>ng         46   11.3  11.33%  
## # ... with 103 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn h\u00ECnh \u1EA3nh (IMA), gi\u00E1 tr\u1ECB (PVA), s\u1EF1 h\u00E0i l\u00F2ng (SAT) v\u00E0 l\u00F2ng trung th\u00E0nh (LOY) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB \u0110\u00E0 N\u1EB5ng\r\n ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 7 x 5
##   BPE   Res                  n percent bar_text
##   <fct> <fct>            <int>   <dbl> <chr>   
## 1 IMA1  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 2 SAT1  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 3 SAT2  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 4 SAT3  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 5 LOY1  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 6 LOY6  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%   
## 7 LOY7  R<U+1EA5>t không d<U+1ED3>ng ý     1    0.25 0.25%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 16 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 IMA1  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  2 IMA2  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  3 IMA3  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  4 IMA5  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  5 PVA1  Không d<U+1ED3>ng ý     2    0.49 0.49%   
##  6 PVA2  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  7 PVA3  Không d<U+1ED3>ng ý     1    0.25 0.25%   
##  8 SAT2  Không d<U+1ED3>ng ý     2    0.49 0.49%   
##  9 SAT3  Không d<U+1ED3>ng ý    14    3.45 3.45%   
## 10 LOY1  Không d<U+1ED3>ng ý     1    0.25 0.25%   
## 11 LOY2  Không d<U+1ED3>ng ý     2    0.49 0.49%   
## 12 LOY3  Không d<U+1ED3>ng ý    10    2.46 2.46%   
## 13 LOY4  Không d<U+1ED3>ng ý     1    0.25 0.25%   
## 14 LOY5  Không d<U+1ED3>ng ý     2    0.49 0.49%   
## 15 LOY6  Không d<U+1ED3>ng ý     1    0.25 0.25%   
## 16 LOY7  Không d<U+1ED3>ng ý     2    0.49 0.49%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  Khá không d<U+1ED3>ng ý    11    2.71 2.71%   
##  2 IMA2  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
##  3 IMA3  Khá không d<U+1ED3>ng ý     3    0.74 0.74%   
##  4 IMA4  Khá không d<U+1ED3>ng ý     7    1.72 1.72%   
##  5 IMA5  Khá không d<U+1ED3>ng ý     4    0.99 0.99%   
##  6 PVA1  Khá không d<U+1ED3>ng ý     5    1.23 1.23%   
##  7 PVA2  Khá không d<U+1ED3>ng ý     5    1.23 1.23%   
##  8 PVA3  Khá không d<U+1ED3>ng ý     4    0.99 0.99%   
##  9 SAT1  Khá không d<U+1ED3>ng ý    16    3.94 3.94%   
## 10 SAT2  Khá không d<U+1ED3>ng ý    12    2.96 2.96%   
## 11 SAT3  Khá không d<U+1ED3>ng ý    32    7.88 7.88%   
## 12 LOY1  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
## 13 LOY2  Khá không d<U+1ED3>ng ý    10    2.46 2.46%   
## 14 LOY3  Khá không d<U+1ED3>ng ý    22    5.42 5.42%   
## 15 LOY4  Khá không d<U+1ED3>ng ý     6    1.48 1.48%   
## 16 LOY5  Khá không d<U+1ED3>ng ý    19    4.68 4.68%   
## 17 LOY6  Khá không d<U+1ED3>ng ý    10    2.46 2.46%   
## 18 LOY7  Khá không d<U+1ED3>ng ý     9    2.22 2.22%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 IMA1  Bình thu<U+1EDD>ng    54   13.3  13.3%   
##  2 IMA2  Bình thu<U+1EDD>ng    46   11.3  11.33%  
##  3 IMA3  Bình thu<U+1EDD>ng    39    9.61 9.61%   
##  4 IMA4  Bình thu<U+1EDD>ng    26    6.4  6.4%    
##  5 IMA5  Bình thu<U+1EDD>ng    23    5.67 5.67%   
##  6 PVA1  Bình thu<U+1EDD>ng    25    6.16 6.16%   
##  7 PVA2  Bình thu<U+1EDD>ng    23    5.67 5.67%   
##  8 PVA3  Bình thu<U+1EDD>ng    30    7.39 7.39%   
##  9 SAT1  Bình thu<U+1EDD>ng    38    9.36 9.36%   
## 10 SAT2  Bình thu<U+1EDD>ng    31    7.64 7.64%   
## 11 SAT3  Bình thu<U+1EDD>ng    41   10.1  10.1%   
## 12 LOY1  Bình thu<U+1EDD>ng    18    4.43 4.43%   
## 13 LOY2  Bình thu<U+1EDD>ng    12    2.96 2.96%   
## 14 LOY3  Bình thu<U+1EDD>ng    25    6.16 6.16%   
## 15 LOY4  Bình thu<U+1EDD>ng     4    0.99 0.99%   
## 16 LOY5  Bình thu<U+1EDD>ng    31    7.64 7.64%   
## 17 LOY6  Bình thu<U+1EDD>ng    28    6.9  6.9%    
## 18 LOY7  Bình thu<U+1EDD>ng    16    3.94 3.94%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Khá d<U+1ED3>ng ý   138    34.0 33.99%  
##  2 IMA2  Khá d<U+1ED3>ng ý   113    27.8 27.83%  
##  3 IMA3  Khá d<U+1ED3>ng ý   106    26.1 26.11%  
##  4 IMA4  Khá d<U+1ED3>ng ý   102    25.1 25.12%  
##  5 IMA5  Khá d<U+1ED3>ng ý    96    23.6 23.65%  
##  6 PVA1  Khá d<U+1ED3>ng ý    90    22.2 22.17%  
##  7 PVA2  Khá d<U+1ED3>ng ý    86    21.2 21.18%  
##  8 PVA3  Khá d<U+1ED3>ng ý    74    18.2 18.23%  
##  9 SAT1  Khá d<U+1ED3>ng ý   122    30.0 30.05%  
## 10 SAT2  Khá d<U+1ED3>ng ý   114    28.1 28.08%  
## 11 SAT3  Khá d<U+1ED3>ng ý   102    25.1 25.12%  
## 12 LOY1  Khá d<U+1ED3>ng ý    65    16.0 16.01%  
## 13 LOY2  Khá d<U+1ED3>ng ý    64    15.8 15.76%  
## 14 LOY3  Khá d<U+1ED3>ng ý   100    24.6 24.63%  
## 15 LOY4  Khá d<U+1ED3>ng ý    95    23.4 23.4%   
## 16 LOY5  Khá d<U+1ED3>ng ý   118    29.1 29.06%  
## 17 LOY6  Khá d<U+1ED3>ng ý   101    24.9 24.88%  
## 18 LOY7  Khá d<U+1ED3>ng ý    99    24.4 24.38%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 IMA1  Ð<U+1ED3>ng ý   169    41.6 41.63%  
##  2 IMA2  Ð<U+1ED3>ng ý   207    51.0 50.99%  
##  3 IMA3  Ð<U+1ED3>ng ý   214    52.7 52.71%  
##  4 IMA4  Ð<U+1ED3>ng ý   220    54.2 54.19%  
##  5 IMA5  Ð<U+1ED3>ng ý   231    56.9 56.9%   
##  6 PVA1  Ð<U+1ED3>ng ý   219    53.9 53.94%  
##  7 PVA2  Ð<U+1ED3>ng ý   221    54.4 54.43%  
##  8 PVA3  Ð<U+1ED3>ng ý   219    53.9 53.94%  
##  9 SAT1  Ð<U+1ED3>ng ý   160    39.4 39.41%  
## 10 SAT2  Ð<U+1ED3>ng ý   167    41.1 41.13%  
## 11 SAT3  Ð<U+1ED3>ng ý   140    34.5 34.48%  
## 12 LOY1  Ð<U+1ED3>ng ý   220    54.2 54.19%  
## 13 LOY2  Ð<U+1ED3>ng ý   213    52.5 52.46%  
## 14 LOY3  Ð<U+1ED3>ng ý   176    43.4 43.35%  
## 15 LOY4  Ð<U+1ED3>ng ý   212    52.2 52.22%  
## 16 LOY5  Ð<U+1ED3>ng ý   173    42.6 42.61%  
## 17 LOY6  Ð<U+1ED3>ng ý   189    46.6 46.55%  
## 18 LOY7  Ð<U+1ED3>ng ý   207    51.0 50.99%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.88 7.88%   
##  2 IMA2  R<U+1EA5>t d<U+1ED3>ng ý    33    8.13 8.13%   
##  3 IMA3  R<U+1EA5>t d<U+1ED3>ng ý    43   10.6  10.59%  
##  4 IMA4  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  5 IMA5  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  6 PVA1  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
##  7 PVA2  R<U+1EA5>t d<U+1ED3>ng ý    70   17.2  17.24%  
##  8 PVA3  R<U+1EA5>t d<U+1ED3>ng ý    78   19.2  19.21%  
##  9 SAT1  R<U+1EA5>t d<U+1ED3>ng ý    69   17    17%     
## 10 SAT2  R<U+1EA5>t d<U+1ED3>ng ý    79   19.5  19.46%  
## 11 SAT3  R<U+1EA5>t d<U+1ED3>ng ý    76   18.7  18.72%  
## 12 LOY1  R<U+1EA5>t d<U+1ED3>ng ý    95   23.4  23.4%   
## 13 LOY2  R<U+1EA5>t d<U+1ED3>ng ý   105   25.9  25.86%  
## 14 LOY3  R<U+1EA5>t d<U+1ED3>ng ý    73   18.0  17.98%  
## 15 LOY4  R<U+1EA5>t d<U+1ED3>ng ý    88   21.7  21.67%  
## 16 LOY5  R<U+1EA5>t d<U+1ED3>ng ý    63   15.5  15.52%  
## 17 LOY6  R<U+1EA5>t d<U+1ED3>ng ý    76   18.7  18.72%  
## 18 LOY7  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.88 7.88%   
##  2 IMA2  R<U+1EA5>t d<U+1ED3>ng ý    33    8.13 8.13%   
##  3 IMA3  R<U+1EA5>t d<U+1ED3>ng ý    43   10.6  10.59%  
##  4 IMA4  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  5 IMA5  R<U+1EA5>t d<U+1ED3>ng ý    51   12.6  12.56%  
##  6 PVA1  R<U+1EA5>t d<U+1ED3>ng ý    65   16.0  16.01%  
##  7 PVA2  R<U+1EA5>t d<U+1ED3>ng ý    70   17.2  17.24%  
##  8 PVA3  R<U+1EA5>t d<U+1ED3>ng ý    78   19.2  19.21%  
##  9 SAT1  R<U+1EA5>t d<U+1ED3>ng ý    69   17    17%     
## 10 SAT2  R<U+1EA5>t d<U+1ED3>ng ý    79   19.5  19.46%  
## 11 SAT3  R<U+1EA5>t d<U+1ED3>ng ý    76   18.7  18.72%  
## 12 LOY1  R<U+1EA5>t d<U+1ED3>ng ý    95   23.4  23.4%   
## 13 LOY2  R<U+1EA5>t d<U+1ED3>ng ý   105   25.9  25.86%  
## 14 LOY3  R<U+1EA5>t d<U+1ED3>ng ý    73   18.0  17.98%  
## 15 LOY4  R<U+1EA5>t d<U+1ED3>ng ý    88   21.7  21.67%  
## 16 LOY5  R<U+1EA5>t d<U+1ED3>ng ý    63   15.5  15.52%  
## 17 LOY6  R<U+1EA5>t d<U+1ED3>ng ý    76   18.7  18.72%  
## 18 LOY7  R<U+1EA5>t d<U+1ED3>ng ý    72   17.7  17.73%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text4, aes(x = BPE, y = 13, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.12. Vẽ biểu đồ likert cho dữ liệu của HCM theo từng nhóm constructs-Nhãn tiếng anh 3.12.1. Construct PSA - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PEV
library(tidyverse)
library(compareGroups)
head(HCM_SEM_PSA)
##   Res  BPE
## 1   4 PSW1
## 2   2 PSW1
## 3   4 PSW1
## 4   5 PSW1
## 5   3 PSW1
## 6   2 PSW1
dim(HCM_SEM_PSA)
## [1] 9856    2
attach(HCM_SEM_PSA)
## The following objects are masked from DN_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
HCM_SEM_PSA = within(HCM_SEM_PSA, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8"))
  })
str(HCM_SEM_PSA)
## 'data.frame':    9856 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 22 levels "PSW1","PSW2",..: 16 16 16 16 16 16 16 16 16 16 ...
summary(HCM_SEM_PSA)
##              Res            BPE      
##  Very Disagree : 605   PSW1   : 448  
##  Disagree      :1610   PSW2   : 448  
##  Quite Disagree: 693   PSW3   : 448  
##  Normal        :1281   PSW4   : 448  
##  Quite Agree   :1171   PSW5   : 448  
##  Agree         :3809   PSW6   : 448  
##  Very Agree    : 687   (Other):7168
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_PSA %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8
## 22 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PSB8
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 154 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree     50   11.2  11.16%  
##  2 PSW1  Disagree         121   27.0  27.01%  
##  3 PSW1  Quite Disagree    37    8.26 8.26%   
##  4 PSW1  Normal            53   11.8  11.83%  
##  5 PSW1  Quite Agree       55   12.3  12.28%  
##  6 PSW1  Agree            117   26.1  26.12%  
##  7 PSW1  Very Agree        15    3.35 3.35%   
##  8 PSW2  Very Disagree     31    6.92 6.92%   
##  9 PSW2  Disagree          55   12.3  12.28%  
## 10 PSW2  Quite Disagree    36    8.04 8.04%   
## # ... with 144 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived safety (PSA) of bus passengers in Ho Chi Minh city", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 22 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PSW1  Very Disagree    50   11.2  11.16%  
##  2 PSW2  Very Disagree    31    6.92 6.92%   
##  3 PSW3  Very Disagree    14    3.12 3.12%   
##  4 PSW4  Very Disagree    28    6.25 6.25%   
##  5 PSW5  Very Disagree    18    4.02 4.02%   
##  6 PSW6  Very Disagree     7    1.56 1.56%   
##  7 PSW7  Very Disagree    11    2.46 2.46%   
##  8 PSS1  Very Disagree     8    1.79 1.79%   
##  9 PSS2  Very Disagree    41    9.15 9.15%   
## 10 PSS3  Very Disagree    31    6.92 6.92%   
## # ... with 12 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 20 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PSW1  Disagree   121   27.0  27.01%  
##  2 PSW2  Disagree    55   12.3  12.28%  
##  3 PSW3  Disagree    17    3.79 3.79%   
##  4 PSW4  Disagree    68   15.2  15.18%  
##  5 PSW5  Disagree    27    6.03 6.03%   
##  6 PSS1  Disagree    20    4.46 4.46%   
##  7 PSS2  Disagree   129   28.8  28.79%  
##  8 PSS3  Disagree    73   16.3  16.29%  
##  9 PSS4  Disagree    32    7.14 7.14%   
## 10 PSS5  Disagree   115   25.7  25.67%  
## 11 PSS6  Disagree   132   29.5  29.46%  
## 12 PSS7  Disagree   168   37.5  37.5%   
## 13 PSB1  Disagree    79   17.6  17.63%  
## 14 PSB2  Disagree   104   23.2  23.21%  
## 15 PSB3  Disagree    72   16.1  16.07%  
## 16 PSB4  Disagree    33    7.37 7.37%   
## 17 PSB5  Disagree   112   25    25%     
## 18 PSB6  Disagree    77   17.2  17.19%  
## 19 PSB7  Disagree   123   27.5  27.46%  
## 20 PSB8  Disagree    44    9.82 9.82%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 22 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PSW1  Quite Disagree    37    8.26 8.26%   
##  2 PSW2  Quite Disagree    36    8.04 8.04%   
##  3 PSW3  Quite Disagree    21    4.69 4.69%   
##  4 PSW4  Quite Disagree    40    8.93 8.93%   
##  5 PSW5  Quite Disagree    16    3.57 3.57%   
##  6 PSW6  Quite Disagree     7    1.56 1.56%   
##  7 PSW7  Quite Disagree    14    3.12 3.12%   
##  8 PSS1  Quite Disagree    21    4.69 4.69%   
##  9 PSS2  Quite Disagree    39    8.71 8.71%   
## 10 PSS3  Quite Disagree    28    6.25 6.25%   
## # ... with 12 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 22 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Normal    53   11.8  11.83%  
##  2 PSW2  Normal    60   13.4  13.39%  
##  3 PSW3  Normal    46   10.3  10.27%  
##  4 PSW4  Normal    96   21.4  21.43%  
##  5 PSW5  Normal    54   12.0  12.05%  
##  6 PSW6  Normal    29    6.47 6.47%   
##  7 PSW7  Normal    35    7.81 7.81%   
##  8 PSS1  Normal    40    8.93 8.93%   
##  9 PSS2  Normal    57   12.7  12.72%  
## 10 PSS3  Normal    53   11.8  11.83%  
## # ... with 12 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 22 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Quite Agree    55   12.3  12.28%  
##  2 PSW2  Quite Agree    57   12.7  12.72%  
##  3 PSW3  Quite Agree    79   17.6  17.63%  
##  4 PSW4  Quite Agree    64   14.3  14.29%  
##  5 PSW5  Quite Agree    51   11.4  11.38%  
##  6 PSW6  Quite Agree    30    6.7  6.7%    
##  7 PSW7  Quite Agree    42    9.38 9.38%   
##  8 PSS1  Quite Agree    49   10.9  10.94%  
##  9 PSS2  Quite Agree    58   13.0  12.95%  
## 10 PSS3  Quite Agree    52   11.6  11.61%  
## # ... with 12 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 22 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PSW1  Agree   117    26.1 26.12%  
##  2 PSW2  Agree   185    41.3 41.29%  
##  3 PSW3  Agree   235    52.5 52.46%  
##  4 PSW4  Agree   133    29.7 29.69%  
##  5 PSW5  Agree   231    51.6 51.56%  
##  6 PSW6  Agree   280    62.5 62.5%   
##  7 PSW7  Agree   277    61.8 61.83%  
##  8 PSS1  Agree   235    52.5 52.46%  
##  9 PSS2  Agree   109    24.3 24.33%  
## 10 PSS3  Agree   183    40.8 40.85%  
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    15    3.35 3.35%   
##  2 PSW2  Very Agree    24    5.36 5.36%   
##  3 PSW3  Very Agree    36    8.04 8.04%   
##  4 PSW4  Very Agree    19    4.24 4.24%   
##  5 PSW5  Very Agree    51   11.4  11.38%  
##  6 PSW6  Very Agree    91   20.3  20.31%  
##  7 PSW7  Very Agree    64   14.3  14.29%  
##  8 PSS1  Very Agree    75   16.7  16.74%  
##  9 PSS2  Very Agree    15    3.35 3.35%   
## 10 PSS3  Very Agree    28    6.25 6.25%   
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Very Agree    15    3.35 3.35%   
##  2 PSW2  Very Agree    24    5.36 5.36%   
##  3 PSW3  Very Agree    36    8.04 8.04%   
##  4 PSW4  Very Agree    19    4.24 4.24%   
##  5 PSW5  Very Agree    51   11.4  11.38%  
##  6 PSW6  Very Agree    91   20.3  20.31%  
##  7 PSW7  Very Agree    64   14.3  14.29%  
##  8 PSS1  Very Agree    75   16.7  16.74%  
##  9 PSS2  Very Agree    15    3.35 3.35%   
## 10 PSS3  Very Agree    28    6.25 6.25%   
## # ... with 12 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 22, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.12.2. Construct PSQ - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSQ
library(tidyverse)
library(compareGroups)
head(HCM_SEM_PSQ)
##   Res  BPE
## 1   6 PQT1
## 2   4 PQT1
## 3   2 PQT1
## 4   6 PQT1
## 5   6 PQT1
## 6   4 PQT1
dim(HCM_SEM_PSQ)
## [1] 8064    2
attach(HCM_SEM_PSQ)
## The following objects are masked from HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
HCM_SEM_PSQ = within(HCM_SEM_PSQ, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5"))
  })
str(HCM_SEM_PSQ)
## 'data.frame':    8064 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 4 2 6 6 4 2 5 5 7 ...
##  $ BPE: Factor w/ 18 levels "PQT1","PQT2",..: 15 15 15 15 15 15 15 15 15 15 ...
summary(HCM_SEM_PSQ)
##              Res            BPE      
##  Very Disagree : 222   PQT1   : 448  
##  Disagree      : 561   PQT2   : 448  
##  Quite Disagree: 477   PQT3   : 448  
##  Normal        :1274   PQT4   : 448  
##  Quite Agree   :1598   PQC1   : 448  
##  Agree         :3274   PQC2   : 448  
##  Very Agree    : 658   (Other):5376
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_PSQ %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2
## [16] PQR3 PQR4 PQR5
## 18 Levels: PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 ... PQR5
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PQT1  Very Disagree     13    2.9  2.9%    
##  2 PQT1  Disagree          29    6.47 6.47%   
##  3 PQT1  Quite Disagree    24    5.36 5.36%   
##  4 PQT1  Normal            61   13.6  13.62%  
##  5 PQT1  Quite Agree       81   18.1  18.08%  
##  6 PQT1  Agree            199   44.4  44.42%  
##  7 PQT1  Very Agree        41    9.15 9.15%   
##  8 PQT2  Very Disagree      7    1.56 1.56%   
##  9 PQT2  Disagree          31    6.92 6.92%   
## 10 PQT2  Quite Disagree     8    1.79 1.79%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived service quality (PSQ) of bus pasengers in Ho Chi Minh city", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PQT1  Very Disagree    13    2.9  2.9%    
##  2 PQT2  Very Disagree     7    1.56 1.56%   
##  3 PQT3  Very Disagree     7    1.56 1.56%   
##  4 PQT4  Very Disagree    11    2.46 2.46%   
##  5 PQC1  Very Disagree     8    1.79 1.79%   
##  6 PQC2  Very Disagree    12    2.68 2.68%   
##  7 PQC3  Very Disagree    12    2.68 2.68%   
##  8 PQC4  Very Disagree    10    2.23 2.23%   
##  9 PQC5  Very Disagree     9    2.01 2.01%   
## 10 PQP1  Very Disagree    12    2.68 2.68%   
## 11 PQP2  Very Disagree    12    2.68 2.68%   
## 12 PQP3  Very Disagree    12    2.68 2.68%   
## 13 PQP4  Very Disagree    28    6.25 6.25%   
## 14 PQR1  Very Disagree     8    1.79 1.79%   
## 15 PQR2  Very Disagree     9    2.01 2.01%   
## 16 PQR3  Very Disagree    14    3.12 3.12%   
## 17 PQR4  Very Disagree    26    5.8  5.8%    
## 18 PQR5  Very Disagree    12    2.68 2.68%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 18 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PQT1  Disagree    29    6.47 6.47%   
##  2 PQT2  Disagree    31    6.92 6.92%   
##  3 PQT3  Disagree    26    5.8  5.8%    
##  4 PQT4  Disagree    29    6.47 6.47%   
##  5 PQC1  Disagree    15    3.35 3.35%   
##  6 PQC2  Disagree    25    5.58 5.58%   
##  7 PQC3  Disagree    29    6.47 6.47%   
##  8 PQC4  Disagree    26    5.8  5.8%    
##  9 PQC5  Disagree    21    4.69 4.69%   
## 10 PQP1  Disagree    31    6.92 6.92%   
## 11 PQP2  Disagree    28    6.25 6.25%   
## 12 PQP3  Disagree    29    6.47 6.47%   
## 13 PQP4  Disagree    57   12.7  12.72%  
## 14 PQR1  Disagree    32    7.14 7.14%   
## 15 PQR2  Disagree    31    6.92 6.92%   
## 16 PQR3  Disagree    42    9.38 9.38%   
## 17 PQR4  Disagree    40    8.93 8.93%   
## 18 PQR5  Disagree    40    8.93 8.93%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PQT1  Quite Disagree    24    5.36 5.36%   
##  2 PQT2  Quite Disagree     8    1.79 1.79%   
##  3 PQT3  Quite Disagree    23    5.13 5.13%   
##  4 PQT4  Quite Disagree    26    5.8  5.8%    
##  5 PQC1  Quite Disagree    13    2.9  2.9%    
##  6 PQC2  Quite Disagree    32    7.14 7.14%   
##  7 PQC3  Quite Disagree    30    6.7  6.7%    
##  8 PQC4  Quite Disagree    19    4.24 4.24%   
##  9 PQC5  Quite Disagree     9    2.01 2.01%   
## 10 PQP1  Quite Disagree    37    8.26 8.26%   
## 11 PQP2  Quite Disagree    39    8.71 8.71%   
## 12 PQP3  Quite Disagree    34    7.59 7.59%   
## 13 PQP4  Quite Disagree    45   10.0  10.04%  
## 14 PQR1  Quite Disagree    26    5.8  5.8%    
## 15 PQR2  Quite Disagree    27    6.03 6.03%   
## 16 PQR3  Quite Disagree    24    5.36 5.36%   
## 17 PQR4  Quite Disagree    34    7.59 7.59%   
## 18 PQR5  Quite Disagree    27    6.03 6.03%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PQT1  Normal    61   13.6  13.62%  
##  2 PQT2  Normal    37    8.26 8.26%   
##  3 PQT3  Normal    63   14.1  14.06%  
##  4 PQT4  Normal   132   29.5  29.46%  
##  5 PQC1  Normal    38    8.48 8.48%   
##  6 PQC2  Normal    79   17.6  17.63%  
##  7 PQC3  Normal    75   16.7  16.74%  
##  8 PQC4  Normal    67   15.0  14.96%  
##  9 PQC5  Normal    61   13.6  13.62%  
## 10 PQP1  Normal    68   15.2  15.18%  
## 11 PQP2  Normal    83   18.5  18.53%  
## 12 PQP3  Normal    82   18.3  18.3%   
## 13 PQP4  Normal    69   15.4  15.4%   
## 14 PQR1  Normal   111   24.8  24.78%  
## 15 PQR2  Normal    67   15.0  14.96%  
## 16 PQR3  Normal    65   14.5  14.51%  
## 17 PQR4  Normal    52   11.6  11.61%  
## 18 PQR5  Normal    64   14.3  14.29%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PQT1  Quite Agree    81    18.1 18.08%  
##  2 PQT2  Quite Agree    77    17.2 17.19%  
##  3 PQT3  Quite Agree    97    21.6 21.65%  
##  4 PQT4  Quite Agree    76    17.0 16.96%  
##  5 PQC1  Quite Agree    75    16.7 16.74%  
##  6 PQC2  Quite Agree    81    18.1 18.08%  
##  7 PQC3  Quite Agree    94    21.0 20.98%  
##  8 PQC4  Quite Agree   105    23.4 23.44%  
##  9 PQC5  Quite Agree    82    18.3 18.3%   
## 10 PQP1  Quite Agree   114    25.4 25.45%  
## 11 PQP2  Quite Agree    93    20.8 20.76%  
## 12 PQP3  Quite Agree   102    22.8 22.77%  
## 13 PQP4  Quite Agree    77    17.2 17.19%  
## 14 PQR1  Quite Agree    57    12.7 12.72%  
## 15 PQR2  Quite Agree   102    22.8 22.77%  
## 16 PQR3  Quite Agree    84    18.8 18.75%  
## 17 PQR4  Quite Agree   101    22.5 22.54%  
## 18 PQR5  Quite Agree   100    22.3 22.32%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PQT1  Agree   199    44.4 44.42%  
##  2 PQT2  Agree   219    48.9 48.88%  
##  3 PQT3  Agree   188    42.0 41.96%  
##  4 PQT4  Agree   152    33.9 33.93%  
##  5 PQC1  Agree   236    52.7 52.68%  
##  6 PQC2  Agree   185    41.3 41.29%  
##  7 PQC3  Agree   174    38.8 38.84%  
##  8 PQC4  Agree   188    42.0 41.96%  
##  9 PQC5  Agree   224    50   50%     
## 10 PQP1  Agree   155    34.6 34.6%   
## 11 PQP2  Agree   169    37.7 37.72%  
## 12 PQP3  Agree   155    34.6 34.6%   
## 13 PQP4  Agree   149    33.3 33.26%  
## 14 PQR1  Agree   178    39.7 39.73%  
## 15 PQR2  Agree   175    39.1 39.06%  
## 16 PQR3  Agree   182    40.6 40.62%  
## 17 PQR4  Agree   172    38.4 38.39%  
## 18 PQR5  Agree   174    38.8 38.84%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Very Agree    41    9.15 9.15%   
##  2 PQT2  Very Agree    69   15.4  15.4%   
##  3 PQT3  Very Agree    44    9.82 9.82%   
##  4 PQT4  Very Agree    22    4.91 4.91%   
##  5 PQC1  Very Agree    63   14.1  14.06%  
##  6 PQC2  Very Agree    34    7.59 7.59%   
##  7 PQC3  Very Agree    34    7.59 7.59%   
##  8 PQC4  Very Agree    33    7.37 7.37%   
##  9 PQC5  Very Agree    42    9.38 9.38%   
## 10 PQP1  Very Agree    31    6.92 6.92%   
## 11 PQP2  Very Agree    24    5.36 5.36%   
## 12 PQP3  Very Agree    34    7.59 7.59%   
## 13 PQP4  Very Agree    23    5.13 5.13%   
## 14 PQR1  Very Agree    36    8.04 8.04%   
## 15 PQR2  Very Agree    37    8.26 8.26%   
## 16 PQR3  Very Agree    37    8.26 8.26%   
## 17 PQR4  Very Agree    23    5.13 5.13%   
## 18 PQR5  Very Agree    31    6.92 6.92%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Very Agree    41    9.15 9.15%   
##  2 PQT2  Very Agree    69   15.4  15.4%   
##  3 PQT3  Very Agree    44    9.82 9.82%   
##  4 PQT4  Very Agree    22    4.91 4.91%   
##  5 PQC1  Very Agree    63   14.1  14.06%  
##  6 PQC2  Very Agree    34    7.59 7.59%   
##  7 PQC3  Very Agree    34    7.59 7.59%   
##  8 PQC4  Very Agree    33    7.37 7.37%   
##  9 PQC5  Very Agree    42    9.38 9.38%   
## 10 PQP1  Very Agree    31    6.92 6.92%   
## 11 PQP2  Very Agree    24    5.36 5.36%   
## 12 PQP3  Very Agree    34    7.59 7.59%   
## 13 PQP4  Very Agree    23    5.13 5.13%   
## 14 PQR1  Very Agree    36    8.04 8.04%   
## 15 PQR2  Very Agree    37    8.26 8.26%   
## 16 PQR3  Very Agree    37    8.26 8.26%   
## 17 PQR4  Very Agree    23    5.13 5.13%   
## 18 PQR5  Very Agree    31    6.92 6.92%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 23, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.12.3. Construct thuộc nhóm Stimulus - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSQ
library(tidyverse)
library(compareGroups)
head(HCM_SEM_S)
##   Res  BPE
## 1   6 PHB1
## 2   3 PHB1
## 3   5 PHB1
## 4   5 PHB1
## 5   5 PHB1
## 6   4 PHB1
dim(HCM_SEM_S)
## [1] 8512    2
attach(HCM_SEM_S)
## The following objects are masked from HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
HCM_SEM_S = within(HCM_SEM_S, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("PBH1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3"))
  })
str(HCM_SEM_S)
## 'data.frame':    8512 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 3 5 5 5 4 3 6 6 7 ...
##  $ BPE: Factor w/ 19 levels "PBH1","PHB2",..: 12 12 12 12 12 12 12 12 12 12 ...
summary(HCM_SEM_S)
##              Res            BPE      
##  Very Disagree : 386   PBH1   : 448  
##  Disagree      : 632   PHB2   : 448  
##  Quite Disagree: 406   PHB3   : 448  
##  Normal        :1776   PHB4   : 448  
##  Quite Agree   :1395   PHB5   : 448  
##  Agree         :2780   PEB1   : 448  
##  Very Agree    :1137   (Other):5824
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_S %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PBH1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6
## [16] PDE7 PSO1 PSO2 PSO3
## 19 Levels: PBH1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 ... PSO3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 133 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PBH1  Very Disagree     33    7.37 7.37%   
##  2 PBH1  Disagree          51   11.4  11.38%  
##  3 PBH1  Quite Disagree    41    9.15 9.15%   
##  4 PBH1  Normal            87   19.4  19.42%  
##  5 PBH1  Quite Agree       76   17.0  16.96%  
##  6 PBH1  Agree            135   30.1  30.13%  
##  7 PBH1  Very Agree        25    5.58 5.58%   
##  8 PHB2  Very Disagree     17    3.79 3.79%   
##  9 PHB2  Disagree          22    4.91 4.91%   
## 10 PHB2  Quite Disagree    23    5.13 5.13%   
## # ... with 123 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived health (PHB), perceived environmental benefits (BEB), perceived social benefits (PSO), perceived design (PDE) of bus passengers in Ho Chi Minh", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 19 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 PBH1  Very Disagree    33    7.37 7.37%   
##  2 PHB2  Very Disagree    17    3.79 3.79%   
##  3 PHB3  Very Disagree    14    3.12 3.12%   
##  4 PHB4  Very Disagree    16    3.57 3.57%   
##  5 PHB5  Very Disagree    19    4.24 4.24%   
##  6 PEB1  Very Disagree    14    3.12 3.12%   
##  7 PEB2  Very Disagree    14    3.12 3.12%   
##  8 PEB3  Very Disagree    23    5.13 5.13%   
##  9 PEB4  Very Disagree    24    5.36 5.36%   
## 10 PDE1  Very Disagree    25    5.58 5.58%   
## 11 PDE2  Very Disagree    24    5.36 5.36%   
## 12 PDE3  Very Disagree    23    5.13 5.13%   
## 13 PDE4  Very Disagree    13    2.9  2.9%    
## 14 PDE5  Very Disagree    15    3.35 3.35%   
## 15 PDE6  Very Disagree    13    2.9  2.9%    
## 16 PDE7  Very Disagree    22    4.91 4.91%   
## 17 PSO1  Very Disagree    25    5.58 5.58%   
## 18 PSO2  Very Disagree    25    5.58 5.58%   
## 19 PSO3  Very Disagree    27    6.03 6.03%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 13 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 PBH1  Disagree    51   11.4  11.38%  
##  2 PHB2  Disagree    22    4.91 4.91%   
##  3 PHB3  Disagree    43    9.6  9.6%    
##  4 PHB4  Disagree    52   11.6  11.61%  
##  5 PHB5  Disagree    42    9.38 9.38%   
##  6 PEB1  Disagree    35    7.81 7.81%   
##  7 PEB2  Disagree    47   10.5  10.49%  
##  8 PDE1  Disagree    14    3.12 3.12%   
##  9 PDE2  Disagree    14    3.12 3.12%   
## 10 PDE4  Disagree    16    3.57 3.57%   
## 11 PSO1  Disagree    80   17.9  17.86%  
## 12 PSO2  Disagree    89   19.9  19.87%  
## 13 PSO3  Disagree    72   16.1  16.07%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 19 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 PBH1  Quite Disagree    41    9.15 9.15%   
##  2 PHB2  Quite Disagree    23    5.13 5.13%   
##  3 PHB3  Quite Disagree    23    5.13 5.13%   
##  4 PHB4  Quite Disagree    33    7.37 7.37%   
##  5 PHB5  Quite Disagree    18    4.02 4.02%   
##  6 PEB1  Quite Disagree    19    4.24 4.24%   
##  7 PEB2  Quite Disagree    36    8.04 8.04%   
##  8 PEB3  Quite Disagree    10    2.23 2.23%   
##  9 PEB4  Quite Disagree    12    2.68 2.68%   
## 10 PDE1  Quite Disagree     8    1.79 1.79%   
## 11 PDE2  Quite Disagree     7    1.56 1.56%   
## 12 PDE3  Quite Disagree    20    4.46 4.46%   
## 13 PDE4  Quite Disagree    18    4.02 4.02%   
## 14 PDE5  Quite Disagree    14    3.12 3.12%   
## 15 PDE6  Quite Disagree     7    1.56 1.56%   
## 16 PDE7  Quite Disagree     4    0.89 0.89%   
## 17 PSO1  Quite Disagree    39    8.71 8.71%   
## 18 PSO2  Quite Disagree    40    8.93 8.93%   
## 19 PSO3  Quite Disagree    34    7.59 7.59%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 19 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PBH1  Normal    87   19.4  19.42%  
##  2 PHB2  Normal    65   14.5  14.51%  
##  3 PHB3  Normal   151   33.7  33.71%  
##  4 PHB4  Normal   161   35.9  35.94%  
##  5 PHB5  Normal    71   15.8  15.85%  
##  6 PEB1  Normal   154   34.4  34.38%  
##  7 PEB2  Normal   150   33.5  33.48%  
##  8 PEB3  Normal    46   10.3  10.27%  
##  9 PEB4  Normal    50   11.2  11.16%  
## 10 PDE1  Normal    52   11.6  11.61%  
## 11 PDE2  Normal    67   15.0  14.96%  
## 12 PDE3  Normal    63   14.1  14.06%  
## 13 PDE4  Normal    51   11.4  11.38%  
## 14 PDE5  Normal    57   12.7  12.72%  
## 15 PDE6  Normal    40    8.93 8.93%   
## 16 PDE7  Normal    45   10.0  10.04%  
## 17 PSO1  Normal   149   33.3  33.26%  
## 18 PSO2  Normal   165   36.8  36.83%  
## 19 PSO3  Normal   152   33.9  33.93%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 19 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PBH1  Quite Agree    76    17.0 16.96%  
##  2 PHB2  Quite Agree    88    19.6 19.64%  
##  3 PHB3  Quite Agree    85    19.0 18.97%  
##  4 PHB4  Quite Agree    76    17.0 16.96%  
##  5 PHB5  Quite Agree   100    22.3 22.32%  
##  6 PEB1  Quite Agree    91    20.3 20.31%  
##  7 PEB2  Quite Agree    83    18.5 18.53%  
##  8 PEB3  Quite Agree    50    11.2 11.16%  
##  9 PEB4  Quite Agree    72    16.1 16.07%  
## 10 PDE1  Quite Agree    82    18.3 18.3%   
## 11 PDE2  Quite Agree    78    17.4 17.41%  
## 12 PDE3  Quite Agree    76    17.0 16.96%  
## 13 PDE4  Quite Agree    68    15.2 15.18%  
## 14 PDE5  Quite Agree    69    15.4 15.4%   
## 15 PDE6  Quite Agree    58    13.0 12.95%  
## 16 PDE7  Quite Agree    47    10.5 10.49%  
## 17 PSO1  Quite Agree    71    15.8 15.85%  
## 18 PSO2  Quite Agree    58    13.0 12.95%  
## 19 PSO3  Quite Agree    67    15.0 14.96%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 19 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 PBH1  Agree   135    30.1 30.13%  
##  2 PHB2  Agree   195    43.5 43.53%  
##  3 PHB3  Agree   109    24.3 24.33%  
##  4 PHB4  Agree    92    20.5 20.54%  
##  5 PHB5  Agree   176    39.3 39.29%  
##  6 PEB1  Agree   108    24.1 24.11%  
##  7 PEB2  Agree    93    20.8 20.76%  
##  8 PEB3  Agree   181    40.4 40.4%   
##  9 PEB4  Agree   166    37.0 37.05%  
## 10 PDE1  Agree   161    35.9 35.94%  
## 11 PDE2  Agree   165    36.8 36.83%  
## 12 PDE3  Agree   193    43.1 43.08%  
## 13 PDE4  Agree   197    44.0 43.97%  
## 14 PDE5  Agree   211    47.1 47.1%   
## 15 PDE6  Agree   210    46.9 46.88%  
## 16 PDE7  Agree   221    49.3 49.33%  
## 17 PSO1  Agree    57    12.7 12.72%  
## 18 PSO2  Agree    45    10.0 10.04%  
## 19 PSO3  Agree    65    14.5 14.51%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PBH1  Very Agree    25    5.58 5.58%   
##  2 PHB2  Very Agree    38    8.48 8.48%   
##  3 PHB3  Very Agree    23    5.13 5.13%   
##  4 PHB4  Very Agree    18    4.02 4.02%   
##  5 PHB5  Very Agree    22    4.91 4.91%   
##  6 PEB1  Very Agree    27    6.03 6.03%   
##  7 PEB2  Very Agree    25    5.58 5.58%   
##  8 PEB3  Very Agree   130   29.0  29.02%  
##  9 PEB4  Very Agree   111   24.8  24.78%  
## 10 PDE1  Very Agree   106   23.7  23.66%  
## 11 PDE2  Very Agree    93   20.8  20.76%  
## 12 PDE3  Very Agree    61   13.6  13.62%  
## 13 PDE4  Very Agree    85   19.0  18.97%  
## 14 PDE5  Very Agree    74   16.5  16.52%  
## 15 PDE6  Very Agree   113   25.2  25.22%  
## 16 PDE7  Very Agree   102   22.8  22.77%  
## 17 PSO1  Very Agree    27    6.03 6.03%   
## 18 PSO2  Very Agree    26    5.8  5.8%    
## 19 PSO3  Very Agree    31    6.92 6.92%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PBH1  Very Agree    25    5.58 5.58%   
##  2 PHB2  Very Agree    38    8.48 8.48%   
##  3 PHB3  Very Agree    23    5.13 5.13%   
##  4 PHB4  Very Agree    18    4.02 4.02%   
##  5 PHB5  Very Agree    22    4.91 4.91%   
##  6 PEB1  Very Agree    27    6.03 6.03%   
##  7 PEB2  Very Agree    25    5.58 5.58%   
##  8 PEB3  Very Agree   130   29.0  29.02%  
##  9 PEB4  Very Agree   111   24.8  24.78%  
## 10 PDE1  Very Agree   106   23.7  23.66%  
## 11 PDE2  Very Agree    93   20.8  20.76%  
## 12 PDE3  Very Agree    61   13.6  13.62%  
## 13 PDE4  Very Agree    85   19.0  18.97%  
## 14 PDE5  Very Agree    74   16.5  16.52%  
## 15 PDE6  Very Agree   113   25.2  25.22%  
## 16 PDE7  Very Agree   102   22.8  22.77%  
## 17 PSO1  Very Agree    27    6.03 6.03%   
## 18 PSO2  Very Agree    26    5.8  5.8%    
## 19 PSO3  Very Agree    31    6.92 6.92%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 23, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.12.4. Construct thuộc nhóm Organism-Response - Nhãn tiếng anh

# Plot Likert graph for people in both cities for construct PSQ
library(tidyverse)
library(compareGroups)
head(HCM_SEM_OR)
##   Res  BPE
## 1   6 IMA1
## 2   4 IMA1
## 3   4 IMA1
## 4   5 IMA1
## 5   5 IMA1
## 6   4 IMA1
dim(HCM_SEM_OR)
## [1] 8064    2
attach(HCM_SEM_OR)
## The following objects are masked from HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_OR:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_S:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSQ:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM_PSA:
## 
##     BPE, Res
## The following objects are masked from HCM_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_SEM:
## 
##     BPE, Res
## The following objects are masked from DN_HCM_SEM:
## 
##     BPE, Res
HCM_SEM_OR = within(HCM_SEM_OR, {
  Res = factor(Res, labels = c("Very Disagree", "Disagree", "Quite Disagree", "Normal", "Quite Agree", "Agree", "Very Agree"))
  BPE = factor(BPE, labels = c("IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PVA1", "PVA2", "PVA3", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7"))
  })
str(HCM_SEM_OR)
## 'data.frame':    8064 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "Very Disagree",..: 6 4 4 5 5 4 2 6 5 6 ...
##  $ BPE: Factor w/ 18 levels "IMA1","IMA2",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(HCM_SEM_OR)
##              Res            BPE      
##  Very Disagree : 139   IMA1   : 448  
##  Disagree      : 308   IMA2   : 448  
##  Quite Disagree: 266   IMA3   : 448  
##  Normal        :1415   IMA4   : 448  
##  Quite Agree   :1615   IMA5   : 448  
##  Agree         :3355   PVA1   : 448  
##  Very Agree    : 966   (Other):5376
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_OR %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4
## [16] LOY5 LOY6 LOY7
## 18 Levels: IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 ... LOY7
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 IMA1  Very Disagree      5    1.12 1.12%   
##  2 IMA1  Disagree          17    3.79 3.79%   
##  3 IMA1  Quite Disagree    21    4.69 4.69%   
##  4 IMA1  Normal           100   22.3  22.32%  
##  5 IMA1  Quite Agree       93   20.8  20.76%  
##  6 IMA1  Agree            180   40.2  40.18%  
##  7 IMA1  Very Agree        32    7.14 7.14%   
##  8 IMA2  Very Disagree     11    2.46 2.46%   
##  9 IMA2  Disagree          18    4.02 4.02%   
## 10 IMA2  Quite Disagree    18    4.02 4.02%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "Perceived image (IMA), perceived value (PVA), satisfation (SAT), loyalty (LOY) towards urban bus systems in Ho Chi Minh", 
       subtitle = "Likert scale is a type of rating scale commonly used in surveys. When responding to a Likert type question,\nrespondents simply state their level of agreement or disagreement on a symmetric agree-disagree scale.")
gg
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "Very Disagree") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res               n percent bar_text
##    <fct> <fct>         <int>   <dbl> <chr>   
##  1 IMA1  Very Disagree     5    1.12 1.12%   
##  2 IMA2  Very Disagree    11    2.46 2.46%   
##  3 IMA3  Very Disagree    11    2.46 2.46%   
##  4 IMA4  Very Disagree    13    2.9  2.9%    
##  5 IMA5  Very Disagree     6    1.34 1.34%   
##  6 PVA1  Very Disagree     4    0.89 0.89%   
##  7 PVA2  Very Disagree     6    1.34 1.34%   
##  8 PVA3  Very Disagree     3    0.67 0.67%   
##  9 SAT1  Very Disagree    12    2.68 2.68%   
## 10 SAT2  Very Disagree    11    2.46 2.46%   
## 11 SAT3  Very Disagree    14    3.12 3.12%   
## 12 LOY1  Very Disagree    12    2.68 2.68%   
## 13 LOY2  Very Disagree     5    1.12 1.12%   
## 14 LOY3  Very Disagree     3    0.67 0.67%   
## 15 LOY4  Very Disagree     2    0.45 0.45%   
## 16 LOY5  Very Disagree     9    2.01 2.01%   
## 17 LOY6  Very Disagree     5    1.12 1.12%   
## 18 LOY7  Very Disagree     7    1.56 1.56%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Disagree") %>% 
  filter(percent >= 3) -> df_for_text2
df_for_text2
## # A tibble: 14 x 5
##    BPE   Res          n percent bar_text
##    <fct> <fct>    <int>   <dbl> <chr>   
##  1 IMA1  Disagree    17    3.79 3.79%   
##  2 IMA2  Disagree    18    4.02 4.02%   
##  3 IMA4  Disagree    14    3.12 3.12%   
##  4 IMA5  Disagree    20    4.46 4.46%   
##  5 PVA1  Disagree    16    3.57 3.57%   
##  6 PVA2  Disagree    21    4.69 4.69%   
##  7 PVA3  Disagree    15    3.35 3.35%   
##  8 SAT1  Disagree    17    3.79 3.79%   
##  9 SAT2  Disagree    21    4.69 4.69%   
## 10 SAT3  Disagree    44    9.82 9.82%   
## 11 LOY1  Disagree    15    3.35 3.35%   
## 12 LOY3  Disagree    15    3.35 3.35%   
## 13 LOY5  Disagree    20    4.46 4.46%   
## 14 LOY7  Disagree    14    3.12 3.12%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Quite Disagree") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                n percent bar_text
##    <fct> <fct>          <int>   <dbl> <chr>   
##  1 IMA1  Quite Disagree    21    4.69 4.69%   
##  2 IMA2  Quite Disagree    18    4.02 4.02%   
##  3 IMA3  Quite Disagree    16    3.57 3.57%   
##  4 IMA4  Quite Disagree    18    4.02 4.02%   
##  5 IMA5  Quite Disagree    15    3.35 3.35%   
##  6 PVA1  Quite Disagree    13    2.9  2.9%    
##  7 PVA2  Quite Disagree    10    2.23 2.23%   
##  8 PVA3  Quite Disagree    14    3.12 3.12%   
##  9 SAT1  Quite Disagree    14    3.12 3.12%   
## 10 SAT2  Quite Disagree    13    2.9  2.9%    
## 11 SAT3  Quite Disagree    19    4.24 4.24%   
## 12 LOY1  Quite Disagree     9    2.01 2.01%   
## 13 LOY2  Quite Disagree     8    1.79 1.79%   
## 14 LOY3  Quite Disagree    17    3.79 3.79%   
## 15 LOY4  Quite Disagree    15    3.35 3.35%   
## 16 LOY5  Quite Disagree    15    3.35 3.35%   
## 17 LOY6  Quite Disagree    14    3.12 3.12%   
## 18 LOY7  Quite Disagree    17    3.79 3.79%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "Normal") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 IMA1  Normal   100   22.3  22.32%  
##  2 IMA2  Normal   111   24.8  24.78%  
##  3 IMA3  Normal    89   19.9  19.87%  
##  4 IMA4  Normal    88   19.6  19.64%  
##  5 IMA5  Normal    81   18.1  18.08%  
##  6 PVA1  Normal    87   19.4  19.42%  
##  7 PVA2  Normal    75   16.7  16.74%  
##  8 PVA3  Normal    61   13.6  13.62%  
##  9 SAT1  Normal    90   20.1  20.09%  
## 10 SAT2  Normal    78   17.4  17.41%  
## 11 SAT3  Normal    99   22.1  22.1%   
## 12 LOY1  Normal    61   13.6  13.62%  
## 13 LOY2  Normal    44    9.82 9.82%   
## 14 LOY3  Normal    74   16.5  16.52%  
## 15 LOY4  Normal    65   14.5  14.51%  
## 16 LOY5  Normal    79   17.6  17.63%  
## 17 LOY6  Normal    71   15.8  15.85%  
## 18 LOY7  Normal    62   13.8  13.84%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Quite Agree") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 IMA1  Quite Agree    93    20.8 20.76%  
##  2 IMA2  Quite Agree   100    22.3 22.32%  
##  3 IMA3  Quite Agree   100    22.3 22.32%  
##  4 IMA4  Quite Agree    97    21.6 21.65%  
##  5 IMA5  Quite Agree   107    23.9 23.88%  
##  6 PVA1  Quite Agree    76    17.0 16.96%  
##  7 PVA2  Quite Agree    83    18.5 18.53%  
##  8 PVA3  Quite Agree    86    19.2 19.2%   
##  9 SAT1  Quite Agree    90    20.1 20.09%  
## 10 SAT2  Quite Agree    99    22.1 22.1%   
## 11 SAT3  Quite Agree    70    15.6 15.62%  
## 12 LOY1  Quite Agree    91    20.3 20.31%  
## 13 LOY2  Quite Agree    65    14.5 14.51%  
## 14 LOY3  Quite Agree    94    21.0 20.98%  
## 15 LOY4  Quite Agree    62    13.8 13.84%  
## 16 LOY5  Quite Agree    95    21.2 21.21%  
## 17 LOY6  Quite Agree    95    21.2 21.21%  
## 18 LOY7  Quite Agree   112    25   25%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "Agree") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res       n percent bar_text
##    <fct> <fct> <int>   <dbl> <chr>   
##  1 IMA1  Agree   180    40.2 40.18%  
##  2 IMA2  Agree   158    35.3 35.27%  
##  3 IMA3  Agree   187    41.7 41.74%  
##  4 IMA4  Agree   185    41.3 41.29%  
##  5 IMA5  Agree   187    41.7 41.74%  
##  6 PVA1  Agree   212    47.3 47.32%  
##  7 PVA2  Agree   206    46.0 45.98%  
##  8 PVA3  Agree   217    48.4 48.44%  
##  9 SAT1  Agree   177    39.5 39.51%  
## 10 SAT2  Agree   177    39.5 39.51%  
## 11 SAT3  Agree   153    34.2 34.15%  
## 12 LOY1  Agree   182    40.6 40.62%  
## 13 LOY2  Agree   200    44.6 44.64%  
## 14 LOY3  Agree   167    37.3 37.28%  
## 15 LOY4  Agree   201    44.9 44.87%  
## 16 LOY5  Agree   188    42.0 41.96%  
## 17 LOY6  Agree   194    43.3 43.3%   
## 18 LOY7  Agree   184    41.1 41.07%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") %>% 
  filter(percent >= 0) -> df_for_text7 # Chỉ thể hiện giá trị có % lựa chọn >0
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Very Agree    32    7.14 7.14%   
##  2 IMA2  Very Agree    32    7.14 7.14%   
##  3 IMA3  Very Agree    35    7.81 7.81%   
##  4 IMA4  Very Agree    33    7.37 7.37%   
##  5 IMA5  Very Agree    32    7.14 7.14%   
##  6 PVA1  Very Agree    40    8.93 8.93%   
##  7 PVA2  Very Agree    47   10.5  10.49%  
##  8 PVA3  Very Agree    52   11.6  11.61%  
##  9 SAT1  Very Agree    48   10.7  10.71%  
## 10 SAT2  Very Agree    49   10.9  10.94%  
## 11 SAT3  Very Agree    49   10.9  10.94%  
## 12 LOY1  Very Agree    78   17.4  17.41%  
## 13 LOY2  Very Agree   120   26.8  26.79%  
## 14 LOY3  Very Agree    78   17.4  17.41%  
## 15 LOY4  Very Agree    91   20.3  20.31%  
## 16 LOY5  Very Agree    42    9.38 9.38%   
## 17 LOY6  Very Agree    56   12.5  12.5%   
## 18 LOY7  Very Agree    52   11.6  11.61%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "Very Agree") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Very Agree    32    7.14 7.14%   
##  2 IMA2  Very Agree    32    7.14 7.14%   
##  3 IMA3  Very Agree    35    7.81 7.81%   
##  4 IMA4  Very Agree    33    7.37 7.37%   
##  5 IMA5  Very Agree    32    7.14 7.14%   
##  6 PVA1  Very Agree    40    8.93 8.93%   
##  7 PVA2  Very Agree    47   10.5  10.49%  
##  8 PVA3  Very Agree    52   11.6  11.61%  
##  9 SAT1  Very Agree    48   10.7  10.71%  
## 10 SAT2  Very Agree    49   10.9  10.94%  
## 11 SAT3  Very Agree    49   10.9  10.94%  
## 12 LOY1  Very Agree    78   17.4  17.41%  
## 13 LOY2  Very Agree   120   26.8  26.79%  
## 14 LOY3  Very Agree    78   17.4  17.41%  
## 15 LOY4  Very Agree    91   20.3  20.31%  
## 16 LOY5  Very Agree    42    9.38 9.38%   
## 17 LOY6  Very Agree    56   12.5  12.5%   
## 18 LOY7  Very Agree    52   11.6  11.61%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text5, aes(x = BPE, y = 23, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-40, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.13. Vẽ biểu đồ likert cho dữ liệu của Hồ Chí Minh theo từng nhóm constructs-Nhãn tiếng việt 3.13.1. Construct PSA - Nhãn tiếng việt

HCM_SEM_PSA_v = within(HCM_SEM_PSA, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PSW1", "PSW2", "PSW3", "PSW4", "PSW5", "PSW6", "PSW7", "PSS1", "PSS2", "PSS3", "PSS4", "PSS5", "PSS6", "PSS7", "PSB1", "PSB2", "PSB3", "PSB4", "PSB5", "PSB6", "PSB7", "PSB8"))
  })
str(HCM_SEM_PSA_v)
## 'data.frame':    9856 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 4 2 4 5 3 2 1 2 3 4 ...
##  $ BPE: Factor w/ 22 levels "PSW1","PSW2",..: 16 16 16 16 16 16 16 16 16 16 ...
summary(HCM_SEM_PSA_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý: 605   PSW1   : 448  
##  Không d<U+1ED3>ng ý           :1610   PSW2   : 448  
##  Khá không d<U+1ED3>ng ý       : 693   PSW3   : 448  
##  Bình thu<U+1EDD>ng            :1281   PSW4   : 448  
##  Khá d<U+1ED3>ng ý             :1171   PSW5   : 448  
##  Ð<U+1ED3>ng ý                 :3809   PSW6   : 448  
##  R<U+1EA5>t d<U+1ED3>ng ý      : 687   (Other):7168
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_PSA_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 PSS6 PSS7 PSB1
## [16] PSB2 PSB3 PSB4 PSB5 PSB6 PSB7 PSB8
## 22 Levels: PSW1 PSW2 PSW3 PSW4 PSW5 PSW6 PSW7 PSS1 PSS2 PSS3 PSS4 PSS5 ... PSB8
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 154 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý    50   11.2  11.16%  
##  2 PSW1  Không d<U+1ED3>ng ý       121   27.0  27.01%  
##  3 PSW1  Khá không d<U+1ED3>ng ý    37    8.26 8.26%   
##  4 PSW1  Bình thu<U+1EDD>ng         53   11.8  11.83%  
##  5 PSW1  Khá d<U+1ED3>ng ý          55   12.3  12.28%  
##  6 PSW1  Ð<U+1ED3>ng ý             117   26.1  26.12%  
##  7 PSW1  R<U+1EA5>t d<U+1ED3>ng ý          15    3.35 3.35%   
##  8 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    31    6.92 6.92%   
##  9 PSW2  Không d<U+1ED3>ng ý        55   12.3  12.28%  
## 10 PSW2  Khá không d<U+1ED3>ng ý    36    8.04 8.04%   
## # ... with 144 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn an to\u00E0n (PSA) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB th\u00E0nh ph\u1ED1 H\u1ED3 Ch\u00ED Minh\r\n ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 22 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t không d<U+1ED3>ng ý    50   11.2  11.16%  
##  2 PSW2  R<U+1EA5>t không d<U+1ED3>ng ý    31    6.92 6.92%   
##  3 PSW3  R<U+1EA5>t không d<U+1ED3>ng ý    14    3.12 3.12%   
##  4 PSW4  R<U+1EA5>t không d<U+1ED3>ng ý    28    6.25 6.25%   
##  5 PSW5  R<U+1EA5>t không d<U+1ED3>ng ý    18    4.02 4.02%   
##  6 PSW6  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.56 1.56%   
##  7 PSW7  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  8 PSS1  R<U+1EA5>t không d<U+1ED3>ng ý     8    1.79 1.79%   
##  9 PSS2  R<U+1EA5>t không d<U+1ED3>ng ý    41    9.15 9.15%   
## 10 PSS3  R<U+1EA5>t không d<U+1ED3>ng ý    31    6.92 6.92%   
## # ... with 12 more rows
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 22 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PSW1  Không d<U+1ED3>ng ý   121   27.0  27.01%  
##  2 PSW2  Không d<U+1ED3>ng ý    55   12.3  12.28%  
##  3 PSW3  Không d<U+1ED3>ng ý    17    3.79 3.79%   
##  4 PSW4  Không d<U+1ED3>ng ý    68   15.2  15.18%  
##  5 PSW5  Không d<U+1ED3>ng ý    27    6.03 6.03%   
##  6 PSW6  Không d<U+1ED3>ng ý     4    0.89 0.89%   
##  7 PSW7  Không d<U+1ED3>ng ý     5    1.12 1.12%   
##  8 PSS1  Không d<U+1ED3>ng ý    20    4.46 4.46%   
##  9 PSS2  Không d<U+1ED3>ng ý   129   28.8  28.79%  
## 10 PSS3  Không d<U+1ED3>ng ý    73   16.3  16.29%  
## # ... with 12 more rows
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 22 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PSW1  Khá không d<U+1ED3>ng ý    37    8.26 8.26%   
##  2 PSW2  Khá không d<U+1ED3>ng ý    36    8.04 8.04%   
##  3 PSW3  Khá không d<U+1ED3>ng ý    21    4.69 4.69%   
##  4 PSW4  Khá không d<U+1ED3>ng ý    40    8.93 8.93%   
##  5 PSW5  Khá không d<U+1ED3>ng ý    16    3.57 3.57%   
##  6 PSW6  Khá không d<U+1ED3>ng ý     7    1.56 1.56%   
##  7 PSW7  Khá không d<U+1ED3>ng ý    14    3.12 3.12%   
##  8 PSS1  Khá không d<U+1ED3>ng ý    21    4.69 4.69%   
##  9 PSS2  Khá không d<U+1ED3>ng ý    39    8.71 8.71%   
## 10 PSS3  Khá không d<U+1ED3>ng ý    28    6.25 6.25%   
## # ... with 12 more rows
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 22 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PSW1  Bình thu<U+1EDD>ng    53   11.8  11.83%  
##  2 PSW2  Bình thu<U+1EDD>ng    60   13.4  13.39%  
##  3 PSW3  Bình thu<U+1EDD>ng    46   10.3  10.27%  
##  4 PSW4  Bình thu<U+1EDD>ng    96   21.4  21.43%  
##  5 PSW5  Bình thu<U+1EDD>ng    54   12.0  12.05%  
##  6 PSW6  Bình thu<U+1EDD>ng    29    6.47 6.47%   
##  7 PSW7  Bình thu<U+1EDD>ng    35    7.81 7.81%   
##  8 PSS1  Bình thu<U+1EDD>ng    40    8.93 8.93%   
##  9 PSS2  Bình thu<U+1EDD>ng    57   12.7  12.72%  
## 10 PSS3  Bình thu<U+1EDD>ng    53   11.8  11.83%  
## # ... with 12 more rows
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  Khá d<U+1ED3>ng ý    55   12.3  12.28%  
##  2 PSW2  Khá d<U+1ED3>ng ý    57   12.7  12.72%  
##  3 PSW3  Khá d<U+1ED3>ng ý    79   17.6  17.63%  
##  4 PSW4  Khá d<U+1ED3>ng ý    64   14.3  14.29%  
##  5 PSW5  Khá d<U+1ED3>ng ý    51   11.4  11.38%  
##  6 PSW6  Khá d<U+1ED3>ng ý    30    6.7  6.7%    
##  7 PSW7  Khá d<U+1ED3>ng ý    42    9.38 9.38%   
##  8 PSS1  Khá d<U+1ED3>ng ý    49   10.9  10.94%  
##  9 PSS2  Khá d<U+1ED3>ng ý    58   13.0  12.95%  
## 10 PSS3  Khá d<U+1ED3>ng ý    52   11.6  11.61%  
## # ... with 12 more rows
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 22 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PSW1  Ð<U+1ED3>ng ý   117    26.1 26.12%  
##  2 PSW2  Ð<U+1ED3>ng ý   185    41.3 41.29%  
##  3 PSW3  Ð<U+1ED3>ng ý   235    52.5 52.46%  
##  4 PSW4  Ð<U+1ED3>ng ý   133    29.7 29.69%  
##  5 PSW5  Ð<U+1ED3>ng ý   231    51.6 51.56%  
##  6 PSW6  Ð<U+1ED3>ng ý   280    62.5 62.5%   
##  7 PSW7  Ð<U+1ED3>ng ý   277    61.8 61.83%  
##  8 PSS1  Ð<U+1ED3>ng ý   235    52.5 52.46%  
##  9 PSS2  Ð<U+1ED3>ng ý   109    24.3 24.33%  
## 10 PSS3  Ð<U+1ED3>ng ý   183    40.8 40.85%  
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    15    3.35 3.35%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    24    5.36 5.36%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    36    8.04 8.04%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    19    4.24 4.24%   
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    51   11.4  11.38%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý    91   20.3  20.31%  
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý    64   14.3  14.29%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý    75   16.7  16.74%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    15    3.35 3.35%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    28    6.25 6.25%   
## # ... with 12 more rows
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 22 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PSW1  R<U+1EA5>t d<U+1ED3>ng ý    15    3.35 3.35%   
##  2 PSW2  R<U+1EA5>t d<U+1ED3>ng ý    24    5.36 5.36%   
##  3 PSW3  R<U+1EA5>t d<U+1ED3>ng ý    36    8.04 8.04%   
##  4 PSW4  R<U+1EA5>t d<U+1ED3>ng ý    19    4.24 4.24%   
##  5 PSW5  R<U+1EA5>t d<U+1ED3>ng ý    51   11.4  11.38%  
##  6 PSW6  R<U+1EA5>t d<U+1ED3>ng ý    91   20.3  20.31%  
##  7 PSW7  R<U+1EA5>t d<U+1ED3>ng ý    64   14.3  14.29%  
##  8 PSS1  R<U+1EA5>t d<U+1ED3>ng ý    75   16.7  16.74%  
##  9 PSS2  R<U+1EA5>t d<U+1ED3>ng ý    15    3.35 3.35%   
## 10 PSS3  R<U+1EA5>t d<U+1ED3>ng ý    28    6.25 6.25%   
## # ... with 12 more rows
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 2, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-2, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.13.2. Construct PSQ-Nhãn tiếng việt

HCM_SEM_PSQ_v = within(HCM_SEM_PSQ, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PQT1", "PQT2", "PQT3", "PQT4", "PQC1", "PQC2", "PQC3", "PQC4", "PQC5", "PQP1", "PQP2", "PQP3", "PQP4", "PQR1", "PQR2", "PQR3", "PQR4", "PQR5"))
  })
str(HCM_SEM_PSQ_v)
## 'data.frame':    8064 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 4 2 6 6 4 2 5 5 7 ...
##  $ BPE: Factor w/ 18 levels "PQT1","PQT2",..: 15 15 15 15 15 15 15 15 15 15 ...
summary(HCM_SEM_PSQ_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý: 222   PQT1   : 448  
##  Không d<U+1ED3>ng ý           : 561   PQT2   : 448  
##  Khá không d<U+1ED3>ng ý       : 477   PQT3   : 448  
##  Bình thu<U+1EDD>ng            :1274   PQT4   : 448  
##  Khá d<U+1ED3>ng ý             :1598   PQC1   : 448  
##  Ð<U+1ED3>ng ý                 :3274   PQC2   : 448  
##  R<U+1EA5>t d<U+1ED3>ng ý      : 658   (Other):5376
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_PSQ_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 PQP4 PQR1 PQR2
## [16] PQR3 PQR4 PQR5
## 18 Levels: PQT1 PQT2 PQT3 PQT4 PQC1 PQC2 PQC3 PQC4 PQC5 PQP1 PQP2 PQP3 ... PQR5
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t không d<U+1ED3>ng ý    13    2.9  2.9%    
##  2 PQT1  Không d<U+1ED3>ng ý        29    6.47 6.47%   
##  3 PQT1  Khá không d<U+1ED3>ng ý    24    5.36 5.36%   
##  4 PQT1  Bình thu<U+1EDD>ng         61   13.6  13.62%  
##  5 PQT1  Khá d<U+1ED3>ng ý          81   18.1  18.08%  
##  6 PQT1  Ð<U+1ED3>ng ý             199   44.4  44.42%  
##  7 PQT1  R<U+1EA5>t d<U+1ED3>ng ý          41    9.15 9.15%   
##  8 PQT2  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.56 1.56%   
##  9 PQT2  Không d<U+1ED3>ng ý        31    6.92 6.92%   
## 10 PQT2  Khá không d<U+1ED3>ng ý     8    1.79 1.79%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn ch\u1EA5t l\u01B0\u1EE3ng d\u1ECBch v\u1EE5 (PSQ) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB th\u00E0nh ph\u1ED1 H\u1ED3 Ch\u00ED Minh\r\n ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t không d<U+1ED3>ng ý    13    2.9  2.9%    
##  2 PQT2  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.56 1.56%   
##  3 PQT3  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.56 1.56%   
##  4 PQT4  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  5 PQC1  R<U+1EA5>t không d<U+1ED3>ng ý     8    1.79 1.79%   
##  6 PQC2  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
##  7 PQC3  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
##  8 PQC4  R<U+1EA5>t không d<U+1ED3>ng ý    10    2.23 2.23%   
##  9 PQC5  R<U+1EA5>t không d<U+1ED3>ng ý     9    2.01 2.01%   
## 10 PQP1  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
## 11 PQP2  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
## 12 PQP3  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
## 13 PQP4  R<U+1EA5>t không d<U+1ED3>ng ý    28    6.25 6.25%   
## 14 PQR1  R<U+1EA5>t không d<U+1ED3>ng ý     8    1.79 1.79%   
## 15 PQR2  R<U+1EA5>t không d<U+1ED3>ng ý     9    2.01 2.01%   
## 16 PQR3  R<U+1EA5>t không d<U+1ED3>ng ý    14    3.12 3.12%   
## 17 PQR4  R<U+1EA5>t không d<U+1ED3>ng ý    26    5.8  5.8%    
## 18 PQR5  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 18 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PQT1  Không d<U+1ED3>ng ý    29    6.47 6.47%   
##  2 PQT2  Không d<U+1ED3>ng ý    31    6.92 6.92%   
##  3 PQT3  Không d<U+1ED3>ng ý    26    5.8  5.8%    
##  4 PQT4  Không d<U+1ED3>ng ý    29    6.47 6.47%   
##  5 PQC1  Không d<U+1ED3>ng ý    15    3.35 3.35%   
##  6 PQC2  Không d<U+1ED3>ng ý    25    5.58 5.58%   
##  7 PQC3  Không d<U+1ED3>ng ý    29    6.47 6.47%   
##  8 PQC4  Không d<U+1ED3>ng ý    26    5.8  5.8%    
##  9 PQC5  Không d<U+1ED3>ng ý    21    4.69 4.69%   
## 10 PQP1  Không d<U+1ED3>ng ý    31    6.92 6.92%   
## 11 PQP2  Không d<U+1ED3>ng ý    28    6.25 6.25%   
## 12 PQP3  Không d<U+1ED3>ng ý    29    6.47 6.47%   
## 13 PQP4  Không d<U+1ED3>ng ý    57   12.7  12.72%  
## 14 PQR1  Không d<U+1ED3>ng ý    32    7.14 7.14%   
## 15 PQR2  Không d<U+1ED3>ng ý    31    6.92 6.92%   
## 16 PQR3  Không d<U+1ED3>ng ý    42    9.38 9.38%   
## 17 PQR4  Không d<U+1ED3>ng ý    40    8.93 8.93%   
## 18 PQR5  Không d<U+1ED3>ng ý    40    8.93 8.93%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PQT1  Khá không d<U+1ED3>ng ý    24    5.36 5.36%   
##  2 PQT2  Khá không d<U+1ED3>ng ý     8    1.79 1.79%   
##  3 PQT3  Khá không d<U+1ED3>ng ý    23    5.13 5.13%   
##  4 PQT4  Khá không d<U+1ED3>ng ý    26    5.8  5.8%    
##  5 PQC1  Khá không d<U+1ED3>ng ý    13    2.9  2.9%    
##  6 PQC2  Khá không d<U+1ED3>ng ý    32    7.14 7.14%   
##  7 PQC3  Khá không d<U+1ED3>ng ý    30    6.7  6.7%    
##  8 PQC4  Khá không d<U+1ED3>ng ý    19    4.24 4.24%   
##  9 PQC5  Khá không d<U+1ED3>ng ý     9    2.01 2.01%   
## 10 PQP1  Khá không d<U+1ED3>ng ý    37    8.26 8.26%   
## 11 PQP2  Khá không d<U+1ED3>ng ý    39    8.71 8.71%   
## 12 PQP3  Khá không d<U+1ED3>ng ý    34    7.59 7.59%   
## 13 PQP4  Khá không d<U+1ED3>ng ý    45   10.0  10.04%  
## 14 PQR1  Khá không d<U+1ED3>ng ý    26    5.8  5.8%    
## 15 PQR2  Khá không d<U+1ED3>ng ý    27    6.03 6.03%   
## 16 PQR3  Khá không d<U+1ED3>ng ý    24    5.36 5.36%   
## 17 PQR4  Khá không d<U+1ED3>ng ý    34    7.59 7.59%   
## 18 PQR5  Khá không d<U+1ED3>ng ý    27    6.03 6.03%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PQT1  Bình thu<U+1EDD>ng    61   13.6  13.62%  
##  2 PQT2  Bình thu<U+1EDD>ng    37    8.26 8.26%   
##  3 PQT3  Bình thu<U+1EDD>ng    63   14.1  14.06%  
##  4 PQT4  Bình thu<U+1EDD>ng   132   29.5  29.46%  
##  5 PQC1  Bình thu<U+1EDD>ng    38    8.48 8.48%   
##  6 PQC2  Bình thu<U+1EDD>ng    79   17.6  17.63%  
##  7 PQC3  Bình thu<U+1EDD>ng    75   16.7  16.74%  
##  8 PQC4  Bình thu<U+1EDD>ng    67   15.0  14.96%  
##  9 PQC5  Bình thu<U+1EDD>ng    61   13.6  13.62%  
## 10 PQP1  Bình thu<U+1EDD>ng    68   15.2  15.18%  
## 11 PQP2  Bình thu<U+1EDD>ng    83   18.5  18.53%  
## 12 PQP3  Bình thu<U+1EDD>ng    82   18.3  18.3%   
## 13 PQP4  Bình thu<U+1EDD>ng    69   15.4  15.4%   
## 14 PQR1  Bình thu<U+1EDD>ng   111   24.8  24.78%  
## 15 PQR2  Bình thu<U+1EDD>ng    67   15.0  14.96%  
## 16 PQR3  Bình thu<U+1EDD>ng    65   14.5  14.51%  
## 17 PQR4  Bình thu<U+1EDD>ng    52   11.6  11.61%  
## 18 PQR5  Bình thu<U+1EDD>ng    64   14.3  14.29%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  Khá d<U+1ED3>ng ý    81    18.1 18.08%  
##  2 PQT2  Khá d<U+1ED3>ng ý    77    17.2 17.19%  
##  3 PQT3  Khá d<U+1ED3>ng ý    97    21.6 21.65%  
##  4 PQT4  Khá d<U+1ED3>ng ý    76    17.0 16.96%  
##  5 PQC1  Khá d<U+1ED3>ng ý    75    16.7 16.74%  
##  6 PQC2  Khá d<U+1ED3>ng ý    81    18.1 18.08%  
##  7 PQC3  Khá d<U+1ED3>ng ý    94    21.0 20.98%  
##  8 PQC4  Khá d<U+1ED3>ng ý   105    23.4 23.44%  
##  9 PQC5  Khá d<U+1ED3>ng ý    82    18.3 18.3%   
## 10 PQP1  Khá d<U+1ED3>ng ý   114    25.4 25.45%  
## 11 PQP2  Khá d<U+1ED3>ng ý    93    20.8 20.76%  
## 12 PQP3  Khá d<U+1ED3>ng ý   102    22.8 22.77%  
## 13 PQP4  Khá d<U+1ED3>ng ý    77    17.2 17.19%  
## 14 PQR1  Khá d<U+1ED3>ng ý    57    12.7 12.72%  
## 15 PQR2  Khá d<U+1ED3>ng ý   102    22.8 22.77%  
## 16 PQR3  Khá d<U+1ED3>ng ý    84    18.8 18.75%  
## 17 PQR4  Khá d<U+1ED3>ng ý   101    22.5 22.54%  
## 18 PQR5  Khá d<U+1ED3>ng ý   100    22.3 22.32%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PQT1  Ð<U+1ED3>ng ý   199    44.4 44.42%  
##  2 PQT2  Ð<U+1ED3>ng ý   219    48.9 48.88%  
##  3 PQT3  Ð<U+1ED3>ng ý   188    42.0 41.96%  
##  4 PQT4  Ð<U+1ED3>ng ý   152    33.9 33.93%  
##  5 PQC1  Ð<U+1ED3>ng ý   236    52.7 52.68%  
##  6 PQC2  Ð<U+1ED3>ng ý   185    41.3 41.29%  
##  7 PQC3  Ð<U+1ED3>ng ý   174    38.8 38.84%  
##  8 PQC4  Ð<U+1ED3>ng ý   188    42.0 41.96%  
##  9 PQC5  Ð<U+1ED3>ng ý   224    50   50%     
## 10 PQP1  Ð<U+1ED3>ng ý   155    34.6 34.6%   
## 11 PQP2  Ð<U+1ED3>ng ý   169    37.7 37.72%  
## 12 PQP3  Ð<U+1ED3>ng ý   155    34.6 34.6%   
## 13 PQP4  Ð<U+1ED3>ng ý   149    33.3 33.26%  
## 14 PQR1  Ð<U+1ED3>ng ý   178    39.7 39.73%  
## 15 PQR2  Ð<U+1ED3>ng ý   175    39.1 39.06%  
## 16 PQR3  Ð<U+1ED3>ng ý   182    40.6 40.62%  
## 17 PQR4  Ð<U+1ED3>ng ý   172    38.4 38.39%  
## 18 PQR5  Ð<U+1ED3>ng ý   174    38.8 38.84%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t d<U+1ED3>ng ý    41    9.15 9.15%   
##  2 PQT2  R<U+1EA5>t d<U+1ED3>ng ý    69   15.4  15.4%   
##  3 PQT3  R<U+1EA5>t d<U+1ED3>ng ý    44    9.82 9.82%   
##  4 PQT4  R<U+1EA5>t d<U+1ED3>ng ý    22    4.91 4.91%   
##  5 PQC1  R<U+1EA5>t d<U+1ED3>ng ý    63   14.1  14.06%  
##  6 PQC2  R<U+1EA5>t d<U+1ED3>ng ý    34    7.59 7.59%   
##  7 PQC3  R<U+1EA5>t d<U+1ED3>ng ý    34    7.59 7.59%   
##  8 PQC4  R<U+1EA5>t d<U+1ED3>ng ý    33    7.37 7.37%   
##  9 PQC5  R<U+1EA5>t d<U+1ED3>ng ý    42    9.38 9.38%   
## 10 PQP1  R<U+1EA5>t d<U+1ED3>ng ý    31    6.92 6.92%   
## 11 PQP2  R<U+1EA5>t d<U+1ED3>ng ý    24    5.36 5.36%   
## 12 PQP3  R<U+1EA5>t d<U+1ED3>ng ý    34    7.59 7.59%   
## 13 PQP4  R<U+1EA5>t d<U+1ED3>ng ý    23    5.13 5.13%   
## 14 PQR1  R<U+1EA5>t d<U+1ED3>ng ý    36    8.04 8.04%   
## 15 PQR2  R<U+1EA5>t d<U+1ED3>ng ý    37    8.26 8.26%   
## 16 PQR3  R<U+1EA5>t d<U+1ED3>ng ý    37    8.26 8.26%   
## 17 PQR4  R<U+1EA5>t d<U+1ED3>ng ý    23    5.13 5.13%   
## 18 PQR5  R<U+1EA5>t d<U+1ED3>ng ý    31    6.92 6.92%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PQT1  R<U+1EA5>t d<U+1ED3>ng ý    41    9.15 9.15%   
##  2 PQT2  R<U+1EA5>t d<U+1ED3>ng ý    69   15.4  15.4%   
##  3 PQT3  R<U+1EA5>t d<U+1ED3>ng ý    44    9.82 9.82%   
##  4 PQT4  R<U+1EA5>t d<U+1ED3>ng ý    22    4.91 4.91%   
##  5 PQC1  R<U+1EA5>t d<U+1ED3>ng ý    63   14.1  14.06%  
##  6 PQC2  R<U+1EA5>t d<U+1ED3>ng ý    34    7.59 7.59%   
##  7 PQC3  R<U+1EA5>t d<U+1ED3>ng ý    34    7.59 7.59%   
##  8 PQC4  R<U+1EA5>t d<U+1ED3>ng ý    33    7.37 7.37%   
##  9 PQC5  R<U+1EA5>t d<U+1ED3>ng ý    42    9.38 9.38%   
## 10 PQP1  R<U+1EA5>t d<U+1ED3>ng ý    31    6.92 6.92%   
## 11 PQP2  R<U+1EA5>t d<U+1ED3>ng ý    24    5.36 5.36%   
## 12 PQP3  R<U+1EA5>t d<U+1ED3>ng ý    34    7.59 7.59%   
## 13 PQP4  R<U+1EA5>t d<U+1ED3>ng ý    23    5.13 5.13%   
## 14 PQR1  R<U+1EA5>t d<U+1ED3>ng ý    36    8.04 8.04%   
## 15 PQR2  R<U+1EA5>t d<U+1ED3>ng ý    37    8.26 8.26%   
## 16 PQR3  R<U+1EA5>t d<U+1ED3>ng ý    37    8.26 8.26%   
## 17 PQR4  R<U+1EA5>t d<U+1ED3>ng ý    23    5.13 5.13%   
## 18 PQR5  R<U+1EA5>t d<U+1ED3>ng ý    31    6.92 6.92%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text2, aes(x = BPE, y = 9, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.13.3. Construct thuộc nhóm Stimulus-Nhãn tiếng việt

HCM_SEM_S_v = within(HCM_SEM_S, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("PHB1", "PHB2", "PHB3", "PHB4", "PHB5", "PEB1", "PEB2", "PEB3", "PEB4", "PDE1", "PDE2", "PDE3", "PDE4", "PDE5", "PDE6", "PDE7", "PSO1", "PSO2", "PSO3"))
  })
str(HCM_SEM_S_v)
## 'data.frame':    8512 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 3 5 5 5 4 3 6 6 7 ...
##  $ BPE: Factor w/ 19 levels "PHB1","PHB2",..: 12 12 12 12 12 12 12 12 12 12 ...
summary(HCM_SEM_S_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý: 386   PHB1   : 448  
##  Không d<U+1ED3>ng ý           : 632   PHB2   : 448  
##  Khá không d<U+1ED3>ng ý       : 406   PHB3   : 448  
##  Bình thu<U+1EDD>ng            :1776   PHB4   : 448  
##  Khá d<U+1ED3>ng ý             :1395   PHB5   : 448  
##  Ð<U+1ED3>ng ý                 :2780   PEB1   : 448  
##  R<U+1EA5>t d<U+1ED3>ng ý      :1137   (Other):5824
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_S_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 PDE4 PDE5 PDE6
## [16] PDE7 PSO1 PSO2 PSO3
## 19 Levels: PHB1 PHB2 PHB3 PHB4 PHB5 PEB1 PEB2 PEB3 PEB4 PDE1 PDE2 PDE3 ... PSO3
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 133 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t không d<U+1ED3>ng ý    33    7.37 7.37%   
##  2 PHB1  Không d<U+1ED3>ng ý        51   11.4  11.38%  
##  3 PHB1  Khá không d<U+1ED3>ng ý    41    9.15 9.15%   
##  4 PHB1  Bình thu<U+1EDD>ng         87   19.4  19.42%  
##  5 PHB1  Khá d<U+1ED3>ng ý          76   17.0  16.96%  
##  6 PHB1  Ð<U+1ED3>ng ý             135   30.1  30.13%  
##  7 PHB1  R<U+1EA5>t d<U+1ED3>ng ý          25    5.58 5.58%   
##  8 PHB2  R<U+1EA5>t không d<U+1ED3>ng ý    17    3.79 3.79%   
##  9 PHB2  Không d<U+1ED3>ng ý        22    4.91 4.91%   
## 10 PHB2  Khá không d<U+1ED3>ng ý    23    5.13 5.13%   
## # ... with 123 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn l\u1EE3i \u00EDch s\u1EE9c kh\u1ECFe (PHB), m\u00F4i tr\u01B0\u1EDDng (PEB), c\u1EA3m nh\u1EADn thi\u1EBFt k\u1EBF (PDE) v\u00E0 l\u1EE3i \u00EDch x\u00E3 h\u1ED9i (PSO) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB th\u00E0nh ph\u1ED1 H\u1ED3 Ch\u00ED Minh\r\n ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 19 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t không d<U+1ED3>ng ý    33    7.37 7.37%   
##  2 PHB2  R<U+1EA5>t không d<U+1ED3>ng ý    17    3.79 3.79%   
##  3 PHB3  R<U+1EA5>t không d<U+1ED3>ng ý    14    3.12 3.12%   
##  4 PHB4  R<U+1EA5>t không d<U+1ED3>ng ý    16    3.57 3.57%   
##  5 PHB5  R<U+1EA5>t không d<U+1ED3>ng ý    19    4.24 4.24%   
##  6 PEB1  R<U+1EA5>t không d<U+1ED3>ng ý    14    3.12 3.12%   
##  7 PEB2  R<U+1EA5>t không d<U+1ED3>ng ý    14    3.12 3.12%   
##  8 PEB3  R<U+1EA5>t không d<U+1ED3>ng ý    23    5.13 5.13%   
##  9 PEB4  R<U+1EA5>t không d<U+1ED3>ng ý    24    5.36 5.36%   
## 10 PDE1  R<U+1EA5>t không d<U+1ED3>ng ý    25    5.58 5.58%   
## 11 PDE2  R<U+1EA5>t không d<U+1ED3>ng ý    24    5.36 5.36%   
## 12 PDE3  R<U+1EA5>t không d<U+1ED3>ng ý    23    5.13 5.13%   
## 13 PDE4  R<U+1EA5>t không d<U+1ED3>ng ý    13    2.9  2.9%    
## 14 PDE5  R<U+1EA5>t không d<U+1ED3>ng ý    15    3.35 3.35%   
## 15 PDE6  R<U+1EA5>t không d<U+1ED3>ng ý    13    2.9  2.9%    
## 16 PDE7  R<U+1EA5>t không d<U+1ED3>ng ý    22    4.91 4.91%   
## 17 PSO1  R<U+1EA5>t không d<U+1ED3>ng ý    25    5.58 5.58%   
## 18 PSO2  R<U+1EA5>t không d<U+1ED3>ng ý    25    5.58 5.58%   
## 19 PSO3  R<U+1EA5>t không d<U+1ED3>ng ý    27    6.03 6.03%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 19 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 PHB1  Không d<U+1ED3>ng ý    51   11.4  11.38%  
##  2 PHB2  Không d<U+1ED3>ng ý    22    4.91 4.91%   
##  3 PHB3  Không d<U+1ED3>ng ý    43    9.6  9.6%    
##  4 PHB4  Không d<U+1ED3>ng ý    52   11.6  11.61%  
##  5 PHB5  Không d<U+1ED3>ng ý    42    9.38 9.38%   
##  6 PEB1  Không d<U+1ED3>ng ý    35    7.81 7.81%   
##  7 PEB2  Không d<U+1ED3>ng ý    47   10.5  10.49%  
##  8 PEB3  Không d<U+1ED3>ng ý     8    1.79 1.79%   
##  9 PEB4  Không d<U+1ED3>ng ý    13    2.9  2.9%    
## 10 PDE1  Không d<U+1ED3>ng ý    14    3.12 3.12%   
## 11 PDE2  Không d<U+1ED3>ng ý    14    3.12 3.12%   
## 12 PDE3  Không d<U+1ED3>ng ý    12    2.68 2.68%   
## 13 PDE4  Không d<U+1ED3>ng ý    16    3.57 3.57%   
## 14 PDE5  Không d<U+1ED3>ng ý     8    1.79 1.79%   
## 15 PDE6  Không d<U+1ED3>ng ý     7    1.56 1.56%   
## 16 PDE7  Không d<U+1ED3>ng ý     7    1.56 1.56%   
## 17 PSO1  Không d<U+1ED3>ng ý    80   17.9  17.86%  
## 18 PSO2  Không d<U+1ED3>ng ý    89   19.9  19.87%  
## 19 PSO3  Không d<U+1ED3>ng ý    72   16.1  16.07%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 19 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 PHB1  Khá không d<U+1ED3>ng ý    41    9.15 9.15%   
##  2 PHB2  Khá không d<U+1ED3>ng ý    23    5.13 5.13%   
##  3 PHB3  Khá không d<U+1ED3>ng ý    23    5.13 5.13%   
##  4 PHB4  Khá không d<U+1ED3>ng ý    33    7.37 7.37%   
##  5 PHB5  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
##  6 PEB1  Khá không d<U+1ED3>ng ý    19    4.24 4.24%   
##  7 PEB2  Khá không d<U+1ED3>ng ý    36    8.04 8.04%   
##  8 PEB3  Khá không d<U+1ED3>ng ý    10    2.23 2.23%   
##  9 PEB4  Khá không d<U+1ED3>ng ý    12    2.68 2.68%   
## 10 PDE1  Khá không d<U+1ED3>ng ý     8    1.79 1.79%   
## 11 PDE2  Khá không d<U+1ED3>ng ý     7    1.56 1.56%   
## 12 PDE3  Khá không d<U+1ED3>ng ý    20    4.46 4.46%   
## 13 PDE4  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
## 14 PDE5  Khá không d<U+1ED3>ng ý    14    3.12 3.12%   
## 15 PDE6  Khá không d<U+1ED3>ng ý     7    1.56 1.56%   
## 16 PDE7  Khá không d<U+1ED3>ng ý     4    0.89 0.89%   
## 17 PSO1  Khá không d<U+1ED3>ng ý    39    8.71 8.71%   
## 18 PSO2  Khá không d<U+1ED3>ng ý    40    8.93 8.93%   
## 19 PSO3  Khá không d<U+1ED3>ng ý    34    7.59 7.59%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 19 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 PHB1  Bình thu<U+1EDD>ng    87   19.4  19.42%  
##  2 PHB2  Bình thu<U+1EDD>ng    65   14.5  14.51%  
##  3 PHB3  Bình thu<U+1EDD>ng   151   33.7  33.71%  
##  4 PHB4  Bình thu<U+1EDD>ng   161   35.9  35.94%  
##  5 PHB5  Bình thu<U+1EDD>ng    71   15.8  15.85%  
##  6 PEB1  Bình thu<U+1EDD>ng   154   34.4  34.38%  
##  7 PEB2  Bình thu<U+1EDD>ng   150   33.5  33.48%  
##  8 PEB3  Bình thu<U+1EDD>ng    46   10.3  10.27%  
##  9 PEB4  Bình thu<U+1EDD>ng    50   11.2  11.16%  
## 10 PDE1  Bình thu<U+1EDD>ng    52   11.6  11.61%  
## 11 PDE2  Bình thu<U+1EDD>ng    67   15.0  14.96%  
## 12 PDE3  Bình thu<U+1EDD>ng    63   14.1  14.06%  
## 13 PDE4  Bình thu<U+1EDD>ng    51   11.4  11.38%  
## 14 PDE5  Bình thu<U+1EDD>ng    57   12.7  12.72%  
## 15 PDE6  Bình thu<U+1EDD>ng    40    8.93 8.93%   
## 16 PDE7  Bình thu<U+1EDD>ng    45   10.0  10.04%  
## 17 PSO1  Bình thu<U+1EDD>ng   149   33.3  33.26%  
## 18 PSO2  Bình thu<U+1EDD>ng   165   36.8  36.83%  
## 19 PSO3  Bình thu<U+1EDD>ng   152   33.9  33.93%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  Khá d<U+1ED3>ng ý    76    17.0 16.96%  
##  2 PHB2  Khá d<U+1ED3>ng ý    88    19.6 19.64%  
##  3 PHB3  Khá d<U+1ED3>ng ý    85    19.0 18.97%  
##  4 PHB4  Khá d<U+1ED3>ng ý    76    17.0 16.96%  
##  5 PHB5  Khá d<U+1ED3>ng ý   100    22.3 22.32%  
##  6 PEB1  Khá d<U+1ED3>ng ý    91    20.3 20.31%  
##  7 PEB2  Khá d<U+1ED3>ng ý    83    18.5 18.53%  
##  8 PEB3  Khá d<U+1ED3>ng ý    50    11.2 11.16%  
##  9 PEB4  Khá d<U+1ED3>ng ý    72    16.1 16.07%  
## 10 PDE1  Khá d<U+1ED3>ng ý    82    18.3 18.3%   
## 11 PDE2  Khá d<U+1ED3>ng ý    78    17.4 17.41%  
## 12 PDE3  Khá d<U+1ED3>ng ý    76    17.0 16.96%  
## 13 PDE4  Khá d<U+1ED3>ng ý    68    15.2 15.18%  
## 14 PDE5  Khá d<U+1ED3>ng ý    69    15.4 15.4%   
## 15 PDE6  Khá d<U+1ED3>ng ý    58    13.0 12.95%  
## 16 PDE7  Khá d<U+1ED3>ng ý    47    10.5 10.49%  
## 17 PSO1  Khá d<U+1ED3>ng ý    71    15.8 15.85%  
## 18 PSO2  Khá d<U+1ED3>ng ý    58    13.0 12.95%  
## 19 PSO3  Khá d<U+1ED3>ng ý    67    15.0 14.96%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 19 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 PHB1  Ð<U+1ED3>ng ý   135    30.1 30.13%  
##  2 PHB2  Ð<U+1ED3>ng ý   195    43.5 43.53%  
##  3 PHB3  Ð<U+1ED3>ng ý   109    24.3 24.33%  
##  4 PHB4  Ð<U+1ED3>ng ý    92    20.5 20.54%  
##  5 PHB5  Ð<U+1ED3>ng ý   176    39.3 39.29%  
##  6 PEB1  Ð<U+1ED3>ng ý   108    24.1 24.11%  
##  7 PEB2  Ð<U+1ED3>ng ý    93    20.8 20.76%  
##  8 PEB3  Ð<U+1ED3>ng ý   181    40.4 40.4%   
##  9 PEB4  Ð<U+1ED3>ng ý   166    37.0 37.05%  
## 10 PDE1  Ð<U+1ED3>ng ý   161    35.9 35.94%  
## 11 PDE2  Ð<U+1ED3>ng ý   165    36.8 36.83%  
## 12 PDE3  Ð<U+1ED3>ng ý   193    43.1 43.08%  
## 13 PDE4  Ð<U+1ED3>ng ý   197    44.0 43.97%  
## 14 PDE5  Ð<U+1ED3>ng ý   211    47.1 47.1%   
## 15 PDE6  Ð<U+1ED3>ng ý   210    46.9 46.88%  
## 16 PDE7  Ð<U+1ED3>ng ý   221    49.3 49.33%  
## 17 PSO1  Ð<U+1ED3>ng ý    57    12.7 12.72%  
## 18 PSO2  Ð<U+1ED3>ng ý    45    10.0 10.04%  
## 19 PSO3  Ð<U+1ED3>ng ý    65    14.5 14.51%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t d<U+1ED3>ng ý    25    5.58 5.58%   
##  2 PHB2  R<U+1EA5>t d<U+1ED3>ng ý    38    8.48 8.48%   
##  3 PHB3  R<U+1EA5>t d<U+1ED3>ng ý    23    5.13 5.13%   
##  4 PHB4  R<U+1EA5>t d<U+1ED3>ng ý    18    4.02 4.02%   
##  5 PHB5  R<U+1EA5>t d<U+1ED3>ng ý    22    4.91 4.91%   
##  6 PEB1  R<U+1EA5>t d<U+1ED3>ng ý    27    6.03 6.03%   
##  7 PEB2  R<U+1EA5>t d<U+1ED3>ng ý    25    5.58 5.58%   
##  8 PEB3  R<U+1EA5>t d<U+1ED3>ng ý   130   29.0  29.02%  
##  9 PEB4  R<U+1EA5>t d<U+1ED3>ng ý   111   24.8  24.78%  
## 10 PDE1  R<U+1EA5>t d<U+1ED3>ng ý   106   23.7  23.66%  
## 11 PDE2  R<U+1EA5>t d<U+1ED3>ng ý    93   20.8  20.76%  
## 12 PDE3  R<U+1EA5>t d<U+1ED3>ng ý    61   13.6  13.62%  
## 13 PDE4  R<U+1EA5>t d<U+1ED3>ng ý    85   19.0  18.97%  
## 14 PDE5  R<U+1EA5>t d<U+1ED3>ng ý    74   16.5  16.52%  
## 15 PDE6  R<U+1EA5>t d<U+1ED3>ng ý   113   25.2  25.22%  
## 16 PDE7  R<U+1EA5>t d<U+1ED3>ng ý   102   22.8  22.77%  
## 17 PSO1  R<U+1EA5>t d<U+1ED3>ng ý    27    6.03 6.03%   
## 18 PSO2  R<U+1EA5>t d<U+1ED3>ng ý    26    5.8  5.8%    
## 19 PSO3  R<U+1EA5>t d<U+1ED3>ng ý    31    6.92 6.92%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 19 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 PHB1  R<U+1EA5>t d<U+1ED3>ng ý    25    5.58 5.58%   
##  2 PHB2  R<U+1EA5>t d<U+1ED3>ng ý    38    8.48 8.48%   
##  3 PHB3  R<U+1EA5>t d<U+1ED3>ng ý    23    5.13 5.13%   
##  4 PHB4  R<U+1EA5>t d<U+1ED3>ng ý    18    4.02 4.02%   
##  5 PHB5  R<U+1EA5>t d<U+1ED3>ng ý    22    4.91 4.91%   
##  6 PEB1  R<U+1EA5>t d<U+1ED3>ng ý    27    6.03 6.03%   
##  7 PEB2  R<U+1EA5>t d<U+1ED3>ng ý    25    5.58 5.58%   
##  8 PEB3  R<U+1EA5>t d<U+1ED3>ng ý   130   29.0  29.02%  
##  9 PEB4  R<U+1EA5>t d<U+1ED3>ng ý   111   24.8  24.78%  
## 10 PDE1  R<U+1EA5>t d<U+1ED3>ng ý   106   23.7  23.66%  
## 11 PDE2  R<U+1EA5>t d<U+1ED3>ng ý    93   20.8  20.76%  
## 12 PDE3  R<U+1EA5>t d<U+1ED3>ng ý    61   13.6  13.62%  
## 13 PDE4  R<U+1EA5>t d<U+1ED3>ng ý    85   19.0  18.97%  
## 14 PDE5  R<U+1EA5>t d<U+1ED3>ng ý    74   16.5  16.52%  
## 15 PDE6  R<U+1EA5>t d<U+1ED3>ng ý   113   25.2  25.22%  
## 16 PDE7  R<U+1EA5>t d<U+1ED3>ng ý   102   22.8  22.77%  
## 17 PSO1  R<U+1EA5>t d<U+1ED3>ng ý    27    6.03 6.03%   
## 18 PSO2  R<U+1EA5>t d<U+1ED3>ng ý    26    5.8  5.8%    
## 19 PSO3  R<U+1EA5>t d<U+1ED3>ng ý    31    6.92 6.92%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text4, aes(x = BPE, y = 13, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.13.4. Construct thuộc nhóm Organism-Response - Nhãn tiếng việt

# Plot Likert graph for people in both cities for construct PHB
HCM_SEM_OR_v = within(HCM_SEM_OR, {
  Res = factor(Res, labels = c("R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00F4ng \u0111\u1ED3ng \u00FD", "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD", "B\u00ECnh th\u01B0\u1EDDng", "Kh\u00E1 \u0111\u1ED3ng \u00FD", "\u0110\u1ED3ng \u00FD", "R\u1EA5t \u0111\u1ED3ng \u00FD"))
  BPE = factor(BPE, labels = c("IMA1", "IMA2", "IMA3", "IMA4", "IMA5", "PVA1", "PVA2", "PVA3", "SAT1", "SAT2", "SAT3", "LOY1", "LOY2", "LOY3", "LOY4", "LOY5", "LOY6", "LOY7"))
  })
str(HCM_SEM_OR_v)
## 'data.frame':    8064 obs. of  2 variables:
##  $ Res: Factor w/ 7 levels "R<U+1EA5>t không d<U+1ED3>ng ý",..: 6 4 4 5 5 4 2 6 5 6 ...
##  $ BPE: Factor w/ 18 levels "IMA1","IMA2",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(HCM_SEM_OR_v)
##                              Res            BPE      
##  R<U+1EA5>t không d<U+1ED3>ng ý: 139   IMA1   : 448  
##  Không d<U+1ED3>ng ý           : 308   IMA2   : 448  
##  Khá không d<U+1ED3>ng ý       : 266   IMA3   : 448  
##  Bình thu<U+1EDD>ng            :1415   IMA4   : 448  
##  Khá d<U+1ED3>ng ý             :1615   IMA5   : 448  
##  Ð<U+1ED3>ng ý                 :3355   PVA1   : 448  
##  R<U+1EA5>t d<U+1ED3>ng ý      : 966   (Other):5376
    ## t <- compareGroups(Res ~ BPE, data = DN_SEM1)
    ## createTable(t)
HCM_SEM_OR_v %>% 
  group_by(BPE, Res) %>% 
  count() %>% 
  ungroup() %>% 
  group_by(BPE) %>% 
  mutate(percent = 100*n / sum(n)) %>% 
  mutate(percent = round(percent, 2)) %>% 
  mutate(bar_text = paste0(percent, "%")) %>% 
  ungroup() -> df_for_ploting
df_for_ploting %>% 
  filter(Res == Res[7]) %>% 
  #arrange(percent) %>% # sắp xếp theo %
  pull(BPE) -> order_x
order_x
##  [1] IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 LOY2 LOY3 LOY4
## [16] LOY5 LOY6 LOY7
## 18 Levels: IMA1 IMA2 IMA3 IMA4 IMA5 PVA1 PVA2 PVA3 SAT1 SAT2 SAT3 LOY1 ... LOY7
# Make a draft plot: 
my_colors <- c("#3e6487", "#829cb2", "pink", "pink3", "palevioletred", "rosybrown2", "rosybrown3")
my_font <- "Roboto Condensed"
df_for_ploting %>% 
  mutate(BPE = factor(BPE, levels = order_x), Res = factor(Res, levels = Res[7:1])) -> df_odered
df_odered
## # A tibble: 126 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.12 1.12%   
##  2 IMA1  Không d<U+1ED3>ng ý        17    3.79 3.79%   
##  3 IMA1  Khá không d<U+1ED3>ng ý    21    4.69 4.69%   
##  4 IMA1  Bình thu<U+1EDD>ng        100   22.3  22.32%  
##  5 IMA1  Khá d<U+1ED3>ng ý          93   20.8  20.76%  
##  6 IMA1  Ð<U+1ED3>ng ý             180   40.2  40.18%  
##  7 IMA1  R<U+1EA5>t d<U+1ED3>ng ý          32    7.14 7.14%   
##  8 IMA2  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  9 IMA2  Không d<U+1ED3>ng ý        18    4.02 4.02%   
## 10 IMA2  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
## # ... with 116 more rows
library(extrafont)
theme_set(theme_minimal())
gg_v <- df_odered %>% 
  ggplot(aes(x = BPE, y = percent, fill = Res)) + 
  geom_col(width = 0.8) + 
  coord_flip() + 
  scale_fill_manual(values = my_colors[7:1], name = "") + 
  theme(legend.position = "top") + 
  theme(text = element_text(family = my_font)) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  scale_y_continuous(labels = paste0(seq(0, 100, 25), "%"), expand = c(0, 0)) + 
  theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 11, color = "grey20")) + 
  theme(axis.text = element_text(color = "grey20", size = 10.2)) + 
  theme(plot.margin = unit(rep(0.7, 4), "cm")) + 
  theme(panel.grid.major.y = element_blank(), panel.grid.minor.x = element_blank()) + 
  theme(legend.key.height = unit(0.15, "mm")) + 
  labs(x = NULL, y = NULL, 
       title = "C\u1EA3m nh\u1EADn h\u00ECnh \u1EA3nh (IMA), gi\u00E1 tr\u1ECB (PVA), s\u1EF1 h\u00E0i l\u00F2ng (SAT) v\u00E0 l\u00F2ng trung th\u00E0nh (LOY) c\u1EE7a h\u00E0nh kh\u00E1ch s\u1EED d\u1EE5ng xe bu\u00FDt \u0111\u00F4 th\u1ECB th\u00E0nh ph\u1ED1 H\u1ED3 Ch\u00ED Minh\r\n ", 
       subtitle = "Thang \u0111o Likert l\u00E0 lo\u1EA1i thang \u0111o \u0111i\u1EC3m \u0111\u00E1nh gi\u00E1 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng ph\u1ED5 bi\u1EBFn trong kh\u1EA3o s\u00E1t. Nghi\u00EAn c\u1EE9u s\u1EED d\u1EE5ng thang \u0111o 7 m\u1EE9c \u0111\u1ED9 t\u01B0\u01A1ng \u1EE9ng v\u1EDBi 1 - R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD \u0111\u1EBFn 7 - R\u1EA5t \u0111\u1ED3ng \u00FD.")
gg_v
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

# For displaying percent of "Very Disagree": Điều chỉnh percent để thể hiện giá trị của %
df_odered %>% 
  filter(Res == "R\u1EA5t kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text1
df_for_text1
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.12 1.12%   
##  2 IMA2  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  3 IMA3  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
##  4 IMA4  R<U+1EA5>t không d<U+1ED3>ng ý    13    2.9  2.9%    
##  5 IMA5  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.34 1.34%   
##  6 PVA1  R<U+1EA5>t không d<U+1ED3>ng ý     4    0.89 0.89%   
##  7 PVA2  R<U+1EA5>t không d<U+1ED3>ng ý     6    1.34 1.34%   
##  8 PVA3  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.67 0.67%   
##  9 SAT1  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
## 10 SAT2  R<U+1EA5>t không d<U+1ED3>ng ý    11    2.46 2.46%   
## 11 SAT3  R<U+1EA5>t không d<U+1ED3>ng ý    14    3.12 3.12%   
## 12 LOY1  R<U+1EA5>t không d<U+1ED3>ng ý    12    2.68 2.68%   
## 13 LOY2  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.12 1.12%   
## 14 LOY3  R<U+1EA5>t không d<U+1ED3>ng ý     3    0.67 0.67%   
## 15 LOY4  R<U+1EA5>t không d<U+1ED3>ng ý     2    0.45 0.45%   
## 16 LOY5  R<U+1EA5>t không d<U+1ED3>ng ý     9    2.01 2.01%   
## 17 LOY6  R<U+1EA5>t không d<U+1ED3>ng ý     5    1.12 1.12%   
## 18 LOY7  R<U+1EA5>t không d<U+1ED3>ng ý     7    1.56 1.56%
# For displaying percent of "Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text2
df_for_text2
## # A tibble: 18 x 5
##    BPE   Res              n percent bar_text
##    <fct> <fct>        <int>   <dbl> <chr>   
##  1 IMA1  Không d<U+1ED3>ng ý    17    3.79 3.79%   
##  2 IMA2  Không d<U+1ED3>ng ý    18    4.02 4.02%   
##  3 IMA3  Không d<U+1ED3>ng ý    10    2.23 2.23%   
##  4 IMA4  Không d<U+1ED3>ng ý    14    3.12 3.12%   
##  5 IMA5  Không d<U+1ED3>ng ý    20    4.46 4.46%   
##  6 PVA1  Không d<U+1ED3>ng ý    16    3.57 3.57%   
##  7 PVA2  Không d<U+1ED3>ng ý    21    4.69 4.69%   
##  8 PVA3  Không d<U+1ED3>ng ý    15    3.35 3.35%   
##  9 SAT1  Không d<U+1ED3>ng ý    17    3.79 3.79%   
## 10 SAT2  Không d<U+1ED3>ng ý    21    4.69 4.69%   
## 11 SAT3  Không d<U+1ED3>ng ý    44    9.82 9.82%   
## 12 LOY1  Không d<U+1ED3>ng ý    15    3.35 3.35%   
## 13 LOY2  Không d<U+1ED3>ng ý     6    1.34 1.34%   
## 14 LOY3  Không d<U+1ED3>ng ý    15    3.35 3.35%   
## 15 LOY4  Không d<U+1ED3>ng ý    12    2.68 2.68%   
## 16 LOY5  Không d<U+1ED3>ng ý    20    4.46 4.46%   
## 17 LOY6  Không d<U+1ED3>ng ý    13    2.9  2.9%    
## 18 LOY7  Không d<U+1ED3>ng ý    14    3.12 3.12%
# For displaying percent of "Quite Disagree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 kh\u00F4ng \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text3
df_for_text3
## # A tibble: 18 x 5
##    BPE   Res                  n percent bar_text
##    <fct> <fct>            <int>   <dbl> <chr>   
##  1 IMA1  Khá không d<U+1ED3>ng ý    21    4.69 4.69%   
##  2 IMA2  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
##  3 IMA3  Khá không d<U+1ED3>ng ý    16    3.57 3.57%   
##  4 IMA4  Khá không d<U+1ED3>ng ý    18    4.02 4.02%   
##  5 IMA5  Khá không d<U+1ED3>ng ý    15    3.35 3.35%   
##  6 PVA1  Khá không d<U+1ED3>ng ý    13    2.9  2.9%    
##  7 PVA2  Khá không d<U+1ED3>ng ý    10    2.23 2.23%   
##  8 PVA3  Khá không d<U+1ED3>ng ý    14    3.12 3.12%   
##  9 SAT1  Khá không d<U+1ED3>ng ý    14    3.12 3.12%   
## 10 SAT2  Khá không d<U+1ED3>ng ý    13    2.9  2.9%    
## 11 SAT3  Khá không d<U+1ED3>ng ý    19    4.24 4.24%   
## 12 LOY1  Khá không d<U+1ED3>ng ý     9    2.01 2.01%   
## 13 LOY2  Khá không d<U+1ED3>ng ý     8    1.79 1.79%   
## 14 LOY3  Khá không d<U+1ED3>ng ý    17    3.79 3.79%   
## 15 LOY4  Khá không d<U+1ED3>ng ý    15    3.35 3.35%   
## 16 LOY5  Khá không d<U+1ED3>ng ý    15    3.35 3.35%   
## 17 LOY6  Khá không d<U+1ED3>ng ý    14    3.12 3.12%   
## 18 LOY7  Khá không d<U+1ED3>ng ý    17    3.79 3.79%
# For displaying percent of "Normal": 
df_odered %>% 
  filter(Res == "B\u00ECnh th\u01B0\u1EDDng") %>% 
  filter(percent >= 0) -> df_for_text4
df_for_text4
## # A tibble: 18 x 5
##    BPE   Res             n percent bar_text
##    <fct> <fct>       <int>   <dbl> <chr>   
##  1 IMA1  Bình thu<U+1EDD>ng   100   22.3  22.32%  
##  2 IMA2  Bình thu<U+1EDD>ng   111   24.8  24.78%  
##  3 IMA3  Bình thu<U+1EDD>ng    89   19.9  19.87%  
##  4 IMA4  Bình thu<U+1EDD>ng    88   19.6  19.64%  
##  5 IMA5  Bình thu<U+1EDD>ng    81   18.1  18.08%  
##  6 PVA1  Bình thu<U+1EDD>ng    87   19.4  19.42%  
##  7 PVA2  Bình thu<U+1EDD>ng    75   16.7  16.74%  
##  8 PVA3  Bình thu<U+1EDD>ng    61   13.6  13.62%  
##  9 SAT1  Bình thu<U+1EDD>ng    90   20.1  20.09%  
## 10 SAT2  Bình thu<U+1EDD>ng    78   17.4  17.41%  
## 11 SAT3  Bình thu<U+1EDD>ng    99   22.1  22.1%   
## 12 LOY1  Bình thu<U+1EDD>ng    61   13.6  13.62%  
## 13 LOY2  Bình thu<U+1EDD>ng    44    9.82 9.82%   
## 14 LOY3  Bình thu<U+1EDD>ng    74   16.5  16.52%  
## 15 LOY4  Bình thu<U+1EDD>ng    65   14.5  14.51%  
## 16 LOY5  Bình thu<U+1EDD>ng    79   17.6  17.63%  
## 17 LOY6  Bình thu<U+1EDD>ng    71   15.8  15.85%  
## 18 LOY7  Bình thu<U+1EDD>ng    62   13.8  13.84%
# For displaying percent of "Quite Agree": 
df_odered %>% 
  filter(Res == "Kh\u00E1 \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text5
df_for_text5
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  Khá d<U+1ED3>ng ý    93    20.8 20.76%  
##  2 IMA2  Khá d<U+1ED3>ng ý   100    22.3 22.32%  
##  3 IMA3  Khá d<U+1ED3>ng ý   100    22.3 22.32%  
##  4 IMA4  Khá d<U+1ED3>ng ý    97    21.6 21.65%  
##  5 IMA5  Khá d<U+1ED3>ng ý   107    23.9 23.88%  
##  6 PVA1  Khá d<U+1ED3>ng ý    76    17.0 16.96%  
##  7 PVA2  Khá d<U+1ED3>ng ý    83    18.5 18.53%  
##  8 PVA3  Khá d<U+1ED3>ng ý    86    19.2 19.2%   
##  9 SAT1  Khá d<U+1ED3>ng ý    90    20.1 20.09%  
## 10 SAT2  Khá d<U+1ED3>ng ý    99    22.1 22.1%   
## 11 SAT3  Khá d<U+1ED3>ng ý    70    15.6 15.62%  
## 12 LOY1  Khá d<U+1ED3>ng ý    91    20.3 20.31%  
## 13 LOY2  Khá d<U+1ED3>ng ý    65    14.5 14.51%  
## 14 LOY3  Khá d<U+1ED3>ng ý    94    21.0 20.98%  
## 15 LOY4  Khá d<U+1ED3>ng ý    62    13.8 13.84%  
## 16 LOY5  Khá d<U+1ED3>ng ý    95    21.2 21.21%  
## 17 LOY6  Khá d<U+1ED3>ng ý    95    21.2 21.21%  
## 18 LOY7  Khá d<U+1ED3>ng ý   112    25   25%
# For displaying percent of "Agree": 
df_odered %>% 
  filter(Res == "\u0110\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text6
df_for_text6
## # A tibble: 18 x 5
##    BPE   Res        n percent bar_text
##    <fct> <fct>  <int>   <dbl> <chr>   
##  1 IMA1  Ð<U+1ED3>ng ý   180    40.2 40.18%  
##  2 IMA2  Ð<U+1ED3>ng ý   158    35.3 35.27%  
##  3 IMA3  Ð<U+1ED3>ng ý   187    41.7 41.74%  
##  4 IMA4  Ð<U+1ED3>ng ý   185    41.3 41.29%  
##  5 IMA5  Ð<U+1ED3>ng ý   187    41.7 41.74%  
##  6 PVA1  Ð<U+1ED3>ng ý   212    47.3 47.32%  
##  7 PVA2  Ð<U+1ED3>ng ý   206    46.0 45.98%  
##  8 PVA3  Ð<U+1ED3>ng ý   217    48.4 48.44%  
##  9 SAT1  Ð<U+1ED3>ng ý   177    39.5 39.51%  
## 10 SAT2  Ð<U+1ED3>ng ý   177    39.5 39.51%  
## 11 SAT3  Ð<U+1ED3>ng ý   153    34.2 34.15%  
## 12 LOY1  Ð<U+1ED3>ng ý   182    40.6 40.62%  
## 13 LOY2  Ð<U+1ED3>ng ý   200    44.6 44.64%  
## 14 LOY3  Ð<U+1ED3>ng ý   167    37.3 37.28%  
## 15 LOY4  Ð<U+1ED3>ng ý   201    44.9 44.87%  
## 16 LOY5  Ð<U+1ED3>ng ý   188    42.0 41.96%  
## 17 LOY6  Ð<U+1ED3>ng ý   194    43.3 43.3%   
## 18 LOY7  Ð<U+1ED3>ng ý   184    41.1 41.07%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") %>% 
  filter(percent >= 0) -> df_for_text7
df_for_text7
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  2 IMA2  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  3 IMA3  R<U+1EA5>t d<U+1ED3>ng ý    35    7.81 7.81%   
##  4 IMA4  R<U+1EA5>t d<U+1ED3>ng ý    33    7.37 7.37%   
##  5 IMA5  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  6 PVA1  R<U+1EA5>t d<U+1ED3>ng ý    40    8.93 8.93%   
##  7 PVA2  R<U+1EA5>t d<U+1ED3>ng ý    47   10.5  10.49%  
##  8 PVA3  R<U+1EA5>t d<U+1ED3>ng ý    52   11.6  11.61%  
##  9 SAT1  R<U+1EA5>t d<U+1ED3>ng ý    48   10.7  10.71%  
## 10 SAT2  R<U+1EA5>t d<U+1ED3>ng ý    49   10.9  10.94%  
## 11 SAT3  R<U+1EA5>t d<U+1ED3>ng ý    49   10.9  10.94%  
## 12 LOY1  R<U+1EA5>t d<U+1ED3>ng ý    78   17.4  17.41%  
## 13 LOY2  R<U+1EA5>t d<U+1ED3>ng ý   120   26.8  26.79%  
## 14 LOY3  R<U+1EA5>t d<U+1ED3>ng ý    78   17.4  17.41%  
## 15 LOY4  R<U+1EA5>t d<U+1ED3>ng ý    91   20.3  20.31%  
## 16 LOY5  R<U+1EA5>t d<U+1ED3>ng ý    42    9.38 9.38%   
## 17 LOY6  R<U+1EA5>t d<U+1ED3>ng ý    56   12.5  12.5%   
## 18 LOY7  R<U+1EA5>t d<U+1ED3>ng ý    52   11.6  11.61%
# For displaying percent of "Very Agree": 
df_odered %>% 
  filter(Res == "R\u1EA5t \u0111\u1ED3ng \u00FD") -> df_for_text
df_for_text
## # A tibble: 18 x 5
##    BPE   Res            n percent bar_text
##    <fct> <fct>      <int>   <dbl> <chr>   
##  1 IMA1  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  2 IMA2  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  3 IMA3  R<U+1EA5>t d<U+1ED3>ng ý    35    7.81 7.81%   
##  4 IMA4  R<U+1EA5>t d<U+1ED3>ng ý    33    7.37 7.37%   
##  5 IMA5  R<U+1EA5>t d<U+1ED3>ng ý    32    7.14 7.14%   
##  6 PVA1  R<U+1EA5>t d<U+1ED3>ng ý    40    8.93 8.93%   
##  7 PVA2  R<U+1EA5>t d<U+1ED3>ng ý    47   10.5  10.49%  
##  8 PVA3  R<U+1EA5>t d<U+1ED3>ng ý    52   11.6  11.61%  
##  9 SAT1  R<U+1EA5>t d<U+1ED3>ng ý    48   10.7  10.71%  
## 10 SAT2  R<U+1EA5>t d<U+1ED3>ng ý    49   10.9  10.94%  
## 11 SAT3  R<U+1EA5>t d<U+1ED3>ng ý    49   10.9  10.94%  
## 12 LOY1  R<U+1EA5>t d<U+1ED3>ng ý    78   17.4  17.41%  
## 13 LOY2  R<U+1EA5>t d<U+1ED3>ng ý   120   26.8  26.79%  
## 14 LOY3  R<U+1EA5>t d<U+1ED3>ng ý    78   17.4  17.41%  
## 15 LOY4  R<U+1EA5>t d<U+1ED3>ng ý    91   20.3  20.31%  
## 16 LOY5  R<U+1EA5>t d<U+1ED3>ng ý    42    9.38 9.38%   
## 17 LOY6  R<U+1EA5>t d<U+1ED3>ng ý    56   12.5  12.5%   
## 18 LOY7  R<U+1EA5>t d<U+1ED3>ng ý    52   11.6  11.61%
# Ad text layers-thay đổi giá trị y để thể hiện vị trí ghi text phù hợp
gg_v + 
  geom_text(data = df_for_text1, aes(x = BPE, y = 3, label = bar_text), size = 4, color = "white", family = my_font) + 
  geom_text(data = df_for_text4, aes(x = BPE, y = 13, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text5, aes(x = BPE, y = 32, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text6, aes(x = BPE, y = 100-30, label = bar_text), size = 4, color = "white", family = my_font) +
  geom_text(data = df_for_text7, aes(x = BPE, y = 100-4, label = bar_text), size = 4, color = "white", family = my_font)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database