ข้อ 1 : การคำนวณความแปรปรวน (variance)

การคำนวณค่าความแปรปรวนใน R นั้นทำได้ง่าย ๆ ด้วยคำสั่ง var() อย่างไรก็ดีวัตถุประสงค์ของแบบฝึกหัดนี้ คือ แสดงให้เห็นถึงขั้นตอนในการคำนวณค่าความแปรปรวนไปทีละขั้นด้วยคำสั่ง R

เราจะเริ่มต้นด้วยการสร้างตัวแปร (variable) ชื่อ drinks เพื่อบันทึกข้อมูลจำนวนแก้วโอเลี้ยงจากแต่ละโต๊ะ

drinks <- c(2, 4, 3, 1, 1, 2, 1)
drinks
## [1] 2 4 3 1 1 2 1
n <- length(drinks) #ใช้คำสั่ง length() เพื่อหาขนาดของกลุ่มตัวอย่าง
n
## [1] 7

สูตรคำนวณความแปรปรวนคือ \[s^2 = \frac{\sum{(X - \bar{X})^2}}{N -1}\] ในสมการนี้เรารู้ว่า
ค่า \(X\) คือ ค่าของข้อมูลแต่ละตัว
ค่า \(N\) คือ ค่าจำนวนกลุ่มตัวอย่าง
จึงเหลือค่า \(\bar{X}\) ที่ต้องคำนวณำนวณ

mean_drinks <- mean(drinks)
mean_drinks
## [1] 2

นำค่าข้อมูลแต่ละตัวใน drink ไปลบด้วยค่าเฉลี่ยที่คำนวณได้ จากนั้นบันทึกลงในตัวแปรชื่อ deviation_drinks

deviation_drinks <- drinks - mean_drinks 
deviation_drinks
## [1]  0  2  1 -1 -1  0 -1

ค่าความเบี่ยงเบนแบบนี้จะประกอบไปด้วยค่าที่สูงกว่าค่าเฉลี่ย (ติดบวก) หรือค่าที่ต่ำกว่าค่าเฉลี่ย (ติดลบ) และเมื่อรวมกันได้จะได้ 0 ซึ่งไม่สามารถนำไปใช้คำนวณอะไรต่อได้

sum(deviation_drinks)
## [1] 0

เพื่อให้ได้ ขนาด ของความเบี่ยงเบนที่ไม่ติดลบ จึงนำค่าเบี่ยงเบนนี้ไปยกกำลังสอง

sqr_dev <- deviation_drinks ^ 2
sqr_dev
## [1] 0 4 1 1 1 0 1

จากนั้นถึงหาผลรวม (sum) ตามสูตร \(\sum{(X - \bar{X})^2}\)
ค่าผลรวมนี้เรียกว่า sum of squares (SS) หรือที่เรียกเต็ม ๆ ว่า sum of squared deviations

sum(sqr_dev)
## [1] 8

จากนั้นนำไปหารด้วย degrees of freedom (\(N - 1\))จะได้ค่าความแปรปรวน
ซึ่งสามารถคำนวณได้ด้วยคำสั่ง var() (สามารถทดสอบได้ว่าทั้งสองค่าเท่ากันด้วย ==)

sum(sqr_dev)/(n-1)
## [1] 1.333333
var(drinks)
## [1] 1.333333
sum(sqr_dev)/(n-1) == var(drinks)
## [1] TRUE

ค่า SD ก็คือรากที่สองของ variance

sqrt(var(drinks))
## [1] 1.154701
sd(drinks)
## [1] 1.154701

ให้คำนวณค่าความแปรปรวนและส่วนเบี่ยงเบนมาตรฐานของข้อมูลชุด 2

  1. ให้คำนวณโดยแสดงวิธีทำแบบทีละขั้นตอนตามด้านบน
  2. ให้คำนวณโดยใช้คำสั่ง var และ sd
# Insert your code

2.1 นำเข้าข้อมูลและตั้งค่า working directory

ให้ดาวน์โหลดไฟล์ R และข้อมูล (csv) ไว้ใน folder เดียวกัน จากนั้นให้เลือกเมนู Session -> Set working directory -> To source file location เพื่อให้ folder ที่ใช้ทำงานใน R เป็น folder ที่โค้ดและข้อมูลถูกบันทึกเอาไว้ หรือใช้คำสั่ง R ด้านล่าง

# setwd(dirname(rstudioapi::getSourceEditorContext()$path))

เมื่อ set working directory เป็น folder ที่มีข้อมูลอยู่ เราจะสามารถโหลดข้อมูลเข้า R ได้โดยเรียกชื่อไฟล์นั้นโดยตรง

solar_data <- read.csv("data/RES_STAT_Lab4_Data.csv")
head(solar_data)
##   X user deci sex age kno1 kno2 kno3 kno4 kno5 kno6 kno7 kno8 inno att1 att2 att3 att4 att5 att6 att7 att8 interest
## 1 1    2    2   3  43    1    1    1    1    1    1    1    1    3    2    3    3    1    3    3    3    3        2
## 2 2    2    2   3  51    1    1    1    1    1    1    1    1    5    4    4    3    3    2    2    2    1        1
## 3 3    2    2   2  28    4    4    4    4    2    3    4    2    2    2    5    5    3    4    5    4    4        4
## 4 4    2    2   3  32    1    1    1    1    1    1    1    1    4    3    4    4    4    5    5    4    3        3
## 5 5    2    2   2  38    4    4    4    3    3    3    3    4    1    4    4    4    3    5    5    5    3        4
## 6 6    2    2   2  51    1    1    1    1    1    1    1    1    2    5    5    3    2    5    5    5    4        5

2.2 Data selection

เมื่อเรา import ตัวแปร user มา มันจะมีค่าเป็น numeric และไม่มี label ดังนั้นเราจะให้ประโยชน์จากตรงนี้ในการเลือกกลุ่ม user 1-2 และคัด 3-5 ทิ้ง

solar_data <- solar_data[solar_data$user < 3, ]
table(solar_data$user)
## 
##   1   2 
##  82 222

จากนั้นค่อยแปลง user เป็น factor พร้อมกับใส่ label ให้เรียบร้อย

solar_data$user <- factor(solar_data$user, labels = c("small residence", "regular residence"))
str(solar_data$user)
##  Factor w/ 2 levels "small residence",..: 2 2 2 2 2 2 2 2 2 2 ...

2.3 สร้าง frequency table และ bar graph ของตัวแปร user และ sex

เปลี่ยนตัวแปร sex ให้เป็น factor เหมือนกับ user

solar_data$sex <- factor(solar_data$sex, labels = c("Not answer", "male", "female" ))
str(solar_data$sex)
##  Factor w/ 3 levels "Not answer","male",..: 3 3 2 3 2 2 3 2 3 2 ...

Frequency table

การสร้างตารางความถี่ใช้คำสั่ง table() ซึ่งสามารถใช้ได้กับตัวแปร numeric หรือ factor ก็ได้
แต่ถ้าหากใช้คำสั่ง summary() กับตัวแปร factor ก็จะได้ผลเป็นตารางแจกแจงความถี่เช่นกัน

table(solar_data$user)
## 
##   small residence regular residence 
##                82               222
summary(solar_data$user)
##   small residence regular residence 
##                82               222
table(solar_data$sex)
## 
## Not answer       male     female 
##          2        122        180

Bar graph

การสร้างกราฟจะใช้ package ที่นิยม คือ ggplot2 หากยังไม่เคย install ไว้ในเครื่องให้ใช้คำสั่ง

# install.packages("ggplot2")

เมื่อลง package เสร็จแล้ว จะต้องเปิดการใช้งานทุกครั้งเมื่อมี restart R โดยจะเรียก package นี้ด้วยคำสั่ง

library("ggplot2")

การสร้างกราฟด้วย ggplot มีรูปแบบ คือ ระบุ data และแกน + ระบุ geoms คือลักษณะของแผนภูมิ + coordinat system คือ พิกัดของแกนต่าง ๆ

การระบุ data และค่าบนแกนจะเป็น argument 2 ตัวแรกของคำสั่ง ggplot
aes() เป็นตัวกำหนดว่าตัวแปรที่จะอยู่บนแกน กรณีนี้คือแกน X แทนด้วยค่าของ user
เมื่อต่อบรรทัดใหม่จะใช้เครื่องหมาย + เพื่อให้รู้ว่าโค้ดมีต่อในบรรทัดถัดไป

ggplot(data = solar_data, aes(user)) + 
         geom_bar() + #geom_bar สร้าง bar plot
         theme_classic() #theme นี้ใกล้เคียงกับ APA

สำหรับ sex เราจะเพิ่มสีสันลงใน geom_bar ด้วยคำสั่ง aes(fill = ตัวแปร)

ggplot(data = solar_data, aes(sex)) + 
         geom_bar(aes(fill = sex)) + 
         theme_classic() 

#เขียน code เพื่อแก้โจทย์ข้อนี้

2.4 Contingency table

ใช้คำสั่ง table() เพื่อสร้างตารางไขว้แบบ contingency table ระหว่างตัวแปรจัดประเภท

table(solar_data$user, solar_data$sex)
##                    
##                     Not answer male female
##   small residence            0   28     54
##   regular residence          2   94    126
#เขียน code เพื่อแก้โจทย์ข้อนี้

2.5 Cronbach’s alpha

การหาค่าความเที่ยงแบบสอดคล้องภายในด้วยสูตร Cronbach’s alpha นั้น เราจะใช้คำสั่งของ package สำหรับการวิเคราะห์ข้อมูลทางจิตวิทยา psych

# install.packages("psych") #หากมีแล้วสามารถข้ามขั้นนี้ไปได้
library("psych") #เรียกใช้งาน

จะเห็นข้อความขึ้นเตือนว่าคำสั่ง alpha นอกจากใน package psych ก็ยังมีใช้งานใน package ggplot2 ด้วย เพื่อป้องกันโปรแกรมอ่านคำสั่งสับสน ควรจะต้องระบุชื่อ package ต่อด้วย colon 2 ตัวและตามด้วยชื่อคำสั่ง เช่น psych::alpha()

ต่อไปเราจะต้องเตรียมตัวแปร KNO1 - KNO8 ให้พร้อม
หากดูให้ละเอียดเราจะพบว่าตัวแปร KNO ในแบบสอบถามนั้นมีคะแนนตั้งแต่ 0-4 แต่ในข้อมูลนั้นมีคะแนน 1-5 ทั้งนี้เนื่องจากระบบเก็บแบบสอบถามได้เข้ารหัสคะแนนมาแบบนั้น
ดังนั้นเราจึงต้องปรับคะแนน KNO ทั้งหมดลงไป 1 คะแนน

kno <- subset(solar_data, select = kno1:kno8)
head(kno)
##   kno1 kno2 kno3 kno4 kno5 kno6 kno7 kno8
## 1    1    1    1    1    1    1    1    1
## 2    1    1    1    1    1    1    1    1
## 3    4    4    4    4    2    3    4    2
## 4    1    1    1    1    1    1    1    1
## 5    4    4    4    3    3    3    3    4
## 6    1    1    1    1    1    1    1    1
re_kno <- kno - 1
head(re_kno)
##   kno1 kno2 kno3 kno4 kno5 kno6 kno7 kno8
## 1    0    0    0    0    0    0    0    0
## 2    0    0    0    0    0    0    0    0
## 3    3    3    3    3    1    2    3    1
## 4    0    0    0    0    0    0    0    0
## 5    3    3    3    2    2    2    2    3
## 6    0    0    0    0    0    0    0    0

การคำนวณค่าความเที่ยงใช้คำสั่ง alpha จาก package psych
โดยเลือกเฉพาะข้อคำถามในมาตรวัดความรู้ที่แก้คะแนนแล้วมาวิเคราะห์

psych::alpha(re_kno)
## 
## Reliability analysis   
## Call: psych::alpha(x = re_kno)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean sd median_r
##       0.96      0.96    0.96      0.76  25 0.0033 0.84  1     0.76
## 
##  lower alpha upper     95% confidence boundaries
## 0.96 0.96 0.97 
## 
##  Reliability if an item is dropped:
##      raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
## kno1      0.96      0.96    0.96      0.78  24   0.0035 0.0017  0.78
## kno2      0.96      0.96    0.95      0.76  23   0.0037 0.0024  0.77
## kno3      0.95      0.95    0.95      0.75  21   0.0040 0.0018  0.74
## kno4      0.95      0.96    0.95      0.75  21   0.0040 0.0021  0.74
## kno5      0.96      0.96    0.96      0.77  23   0.0037 0.0025  0.77
## kno6      0.95      0.96    0.95      0.75  21   0.0040 0.0021  0.75
## kno7      0.96      0.96    0.96      0.76  22   0.0039 0.0024  0.76
## kno8      0.96      0.96    0.96      0.76  23   0.0037 0.0024  0.76
## 
##  Item statistics 
##        n raw.r std.r r.cor r.drop mean  sd
## kno1 304  0.84  0.84  0.81   0.79 0.95 1.2
## kno2 304  0.87  0.88  0.86   0.84 0.67 1.1
## kno3 304  0.92  0.92  0.91   0.89 0.86 1.1
## kno4 304  0.92  0.91  0.91   0.89 0.82 1.1
## kno5 304  0.88  0.87  0.85   0.83 1.00 1.2
## kno6 304  0.91  0.91  0.90   0.88 0.82 1.1
## kno7 304  0.90  0.90  0.88   0.86 0.88 1.2
## kno8 304  0.87  0.88  0.86   0.84 0.72 1.0
## 
## Non missing response frequency for each item
##         0    1    2    3    4 miss
## kno1 0.51 0.20 0.17 0.09 0.04    0
## kno2 0.64 0.14 0.13 0.06 0.02    0
## kno3 0.56 0.17 0.15 0.10 0.02    0
## kno4 0.58 0.15 0.17 0.08 0.02    0
## kno5 0.50 0.17 0.19 0.10 0.04    0
## kno6 0.58 0.16 0.15 0.08 0.03    0
## kno7 0.57 0.17 0.12 0.11 0.04    0
## kno8 0.59 0.21 0.12 0.07 0.02    0

ค่า alpha ดูจาก raw_alpha = .96 ค่า CITC ดูจาก std.r ในตาราง Item statistics

#เขียน code เพื่อแก้โจทย์ข้อนี้

2.6 Average score of a scale

มาตรวัดทางจิตวิทยาจะถามคำถามหลายข้อเพื่อวัด construct เดียวกันเพื่อให้ได้ข้อมูลที่มีความเที่ยงสูงขึ้น
การคำนวณคะแนนของมาตรวัดจึงนิยมใช้ค่าเฉลี่ยหรือคะแนนรวมจากข้อคำถามในมาตรวัดนั้น ๆ

คำนวณคะแนนมาตรวัดความรู้ เป็นการหาค่าเฉลี่ยตามแนวนอนของตาราง ผลที่ได้คือ column ใหม่ที่มีค่าเฉลี่ยคะแนนความรู้ของผู้เข้าร่วมการวิจัยแต่ละคน

solar_data$knowledge <- rowMeans(re_kno)
head(solar_data)
##   X              user deci    sex age kno1 kno2 kno3 kno4 kno5 kno6 kno7 kno8 inno att1 att2 att3 att4 att5 att6 att7 att8 interest knowledge
## 1 1 regular residence    2 female  43    1    1    1    1    1    1    1    1    3    2    3    3    1    3    3    3    3        2     0.000
## 2 2 regular residence    2 female  51    1    1    1    1    1    1    1    1    5    4    4    3    3    2    2    2    1        1     0.000
## 3 3 regular residence    2   male  28    4    4    4    4    2    3    4    2    2    2    5    5    3    4    5    4    4        4     2.375
## 4 4 regular residence    2 female  32    1    1    1    1    1    1    1    1    4    3    4    4    4    5    5    4    3        3     0.000
## 5 5 regular residence    2   male  38    4    4    4    3    3    3    3    4    1    4    4    4    3    5    5    5    3        4     2.500
## 6 6 regular residence    2   male  51    1    1    1    1    1    1    1    1    2    5    5    3    2    5    5    5    4        5     0.000
#เขียน code เพื่อแก้โจทย์ข้อนี้

2.7 Histogram

Histrogram เป็นแผนภูมิที่เหมาะสำหรับแสดงการแจกแจงความถี่ (distribution) ของข้อมูล Q-Q Plot เป็นแผนภูมิที่เหมาะสำหรับตรวจสอบการแจกแจงตามโค้งปกติ (normal distribution) หากข้อมูลกระจายตัวเป็นปกติ ข้อมูลจะเรียงตัวอยู่ตรงแนวเส้นแทยงอ้างอิง ของข้อมูล

hist(solar_data$knowledge)

qqnorm(solar_data$knowledge)
qqline(solar_data$knowledge)

2.8 Descriptive Statistics

คำสั่งจากแต่ละ package จะให้ค่าสถิติเชิงพรรณาบางตัว เช่น summary จะให้ค่าที่เน้นตำแหน่งต่าง ๆ เช่น mode, median, mean, quartile, min, max psych::describe จะให้ข้อมูลที่เกี่ยวข้องกับการกระจายตัวของข้อมูลมากกว่า เช่น sd, range, skewness, kurtosis

summary(solar_data$knowledge)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  0.3750  0.8392  1.4062  4.0000
psych::describe(solar_data$knowledge)
##    vars   n mean sd median trimmed  mad min max range skew kurtosis   se
## X1    1 304 0.84  1   0.38    0.68 0.56   0   4     4  1.1     0.22 0.06
#เขียน code เพื่อแก้โจทย์ข้อนี้