Final Project Research

Author

Alfred Machingambi

Quarto

Quarto enables you to weave together content and executable code into a finished document. To learn more about Quarto see https://quarto.org.

Running Code

When you click the Render button a document will be generated that includes both content and the output of embedded code. You can embed code like this:

Preparing the data

library(readr)
visual_comm <- read_csv("visual_comm.csv")
Rows: 3000 Columns: 20
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (5): Gender, Previous_Art_Experience, Teaching_Method, Feedback_Receive...
dbl (15): Student_ID, Age, Assignment_Completion_Time_Min, Participation_Rat...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(visual_comm)

You can add options to executable code like this

library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
visual_comm <- read_csv("visual_comm.csv")
Rows: 3000 Columns: 20
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (5): Gender, Previous_Art_Experience, Teaching_Method, Feedback_Receive...
dbl (15): Student_ID, Age, Assignment_Completion_Time_Min, Participation_Rat...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

You can add options to executable code like this

str(visual_comm)
spc_tbl_ [3,000 × 20] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Student_ID                    : num [1:3000] 1802 1191 1818 252 2506 ...
 $ Age                           : num [1:3000] 29 26 21 27 27 29 20 29 26 22 ...
 $ Gender                        : chr [1:3000] "Female" "Male" "Female" "Male" ...
 $ Previous_Art_Experience       : chr [1:3000] "Yes" "No" "No" "Yes" ...
 $ Teaching_Method               : chr [1:3000] "Traditional" "Traditional" "AIGC" "AIGC" ...
 $ Assignment_Completion_Time_Min: num [1:3000] 40.1 42 44.8 56.9 26.3 ...
 $ Participation_Rate_%          : num [1:3000] 78.9 77.1 75.7 55.4 94.1 ...
 $ Engagement_Score              : num [1:3000] 78 75.8 74.5 54.8 93.7 ...
 $ Creativity_Score_%            : num [1:3000] 70.5 75.2 75.7 64.1 94.6 ...
 $ Design_Assessment_Score       : num [1:3000] 70.1 75.2 74.2 62.4 92.8 ...
 $ Quiz_Score                    : num [1:3000] 73.2 75 79.9 68.8 98 ...
 $ Artistic_Style_Mastery        : num [1:3000] 68.4 76.3 74.7 62.1 96.2 ...
 $ Feedback_Received             : chr [1:3000] "Yes" "Yes" "Yes" "Yes" ...
 $ Feedback_Satisfaction_Score   : num [1:3000] 5 5 5 5 5 5 5 5 5 5 ...
 $ Adaptive_Content_Used         : chr [1:3000] "Yes" "No" "No" "No" ...
 $ Visual_Quality_Rating         : num [1:3000] 5 5 5 5 5.37 5 5 5.53 5 5.89 ...
 $ Skill_Improvement_%           : num [1:3000] 32.6 37 38.4 26.8 57 ...
 $ Motivation_Increase_%         : num [1:3000] 39.4 38.7 35.9 17.8 55.3 ...
 $ Perceived_Content_Relevance   : num [1:3000] 5 5 5 5 5.37 5 5 5.53 5 5.89 ...
 $ Teaching_Effectiveness_Label  : num [1:3000] 1 1 1 0 2 1 1 2 0 2 ...
 - attr(*, "spec")=
  .. cols(
  ..   Student_ID = col_double(),
  ..   Age = col_double(),
  ..   Gender = col_character(),
  ..   Previous_Art_Experience = col_character(),
  ..   Teaching_Method = col_character(),
  ..   Assignment_Completion_Time_Min = col_double(),
  ..   `Participation_Rate_%` = col_double(),
  ..   Engagement_Score = col_double(),
  ..   `Creativity_Score_%` = col_double(),
  ..   Design_Assessment_Score = col_double(),
  ..   Quiz_Score = col_double(),
  ..   Artistic_Style_Mastery = col_double(),
  ..   Feedback_Received = col_character(),
  ..   Feedback_Satisfaction_Score = col_double(),
  ..   Adaptive_Content_Used = col_character(),
  ..   Visual_Quality_Rating = col_double(),
  ..   `Skill_Improvement_%` = col_double(),
  ..   `Motivation_Increase_%` = col_double(),
  ..   Perceived_Content_Relevance = col_double(),
  ..   Teaching_Effectiveness_Label = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 

Converting categorical variables to factors:

visual_comm <- visual_comm %>%
  mutate(
    Gender = as.factor(Gender),
    Teaching_Method = as.factor(Teaching_Method),
    Feedback_Received = as.factor(Feedback_Received),
    Adaptive_Content_Used = as.factor(Adaptive_Content_Used)
  )
names(visual_comm)
 [1] "Student_ID"                     "Age"                           
 [3] "Gender"                         "Previous_Art_Experience"       
 [5] "Teaching_Method"                "Assignment_Completion_Time_Min"
 [7] "Participation_Rate_%"           "Engagement_Score"              
 [9] "Creativity_Score_%"             "Design_Assessment_Score"       
[11] "Quiz_Score"                     "Artistic_Style_Mastery"        
[13] "Feedback_Received"              "Feedback_Satisfaction_Score"   
[15] "Adaptive_Content_Used"          "Visual_Quality_Rating"         
[17] "Skill_Improvement_%"            "Motivation_Increase_%"         
[19] "Perceived_Content_Relevance"    "Teaching_Effectiveness_Label"  
visual_comm$`Participation_Rate_%` <- as.numeric(visual_comm$`Participation_Rate_%`)
names(visual_comm) <- gsub("%", "Percent", names(visual_comm))

Confirming the key variables being numeric

visual_comm$Engagement_Score <- as.numeric(visual_comm$Engagement_Score)
visual_comm$Participation_Rate_Percent <- as.numeric(visual_comm$Participation_Rate_Percent)
visual_comm$Feedback_Satisfaction_Score <- as.numeric(visual_comm$Feedback_Satisfaction_Score)

RQ1: Engagement → Satisfaction

Descriptive statistics

summary(visual_comm$Engagement_Score)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  50.03   57.61   74.98   75.04   92.66  100.00 
summary(visual_comm$Feedback_Satisfaction_Score)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   3.000   2.906   5.000   5.000 
sd(visual_comm$Engagement_Score, na.rm = TRUE)
[1] 16.56031
sd(visual_comm$Feedback_Satisfaction_Score, na.rm = TRUE)
[1] 1.530212

Correlation (RQ1 main relationship)

cor.test(
  visual_comm$Engagement_Score,
  visual_comm$Feedback_Satisfaction_Score,
  use = "complete.obs"
)

    Pearson's product-moment correlation

data:  visual_comm$Engagement_Score and visual_comm$Feedback_Satisfaction_Score
t = -1.2604, df = 2998, p-value = 0.2076
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.05875077  0.01278438
sample estimates:
        cor 
-0.02301265 

Regression Model as a way to tests the effect of engagement and of receiving feedback

model_rq1 <- lm(
  Feedback_Satisfaction_Score ~ Engagement_Score + Feedback_Received,
  data = visual_comm
)
summary(model_rq1)

Call:
lm(formula = Feedback_Satisfaction_Score ~ Engagement_Score + 
    Feedback_Received, data = visual_comm)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.05293 -0.94868  0.04596  2.05377  2.15228 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)           3.160086   0.179563  17.599   <2e-16 ***
Engagement_Score     -0.002129   0.001687  -1.262    0.207    
Feedback_ReceivedYes -0.099459   0.130261  -0.764    0.445    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.53 on 2997 degrees of freedom
Multiple R-squared:  0.000724,  Adjusted R-squared:  5.712e-05 
F-statistic: 1.086 on 2 and 2997 DF,  p-value: 0.3378

Correlation for RQ2: Participation (Login proxy) → Satisfaction

cor.test(
  visual_comm$Participation_Rate_Percent,
  visual_comm$Feedback_Satisfaction_Score,
  use = "complete.obs"
)

    Pearson's product-moment correlation

data:  visual_comm$Participation_Rate_Percent and visual_comm$Feedback_Satisfaction_Score
t = -1.3334, df = 2998, p-value = 0.1825
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.06007947  0.01145117
sample estimates:
        cor 
-0.02434531 

You can add options to executable code like this

model_rq2 <- lm(
  Feedback_Satisfaction_Score ~ Participation_Rate_Percent,
  data = visual_comm
)

summary(model_rq2)

Call:
lm(formula = Feedback_Satisfaction_Score ~ Participation_Rate_Percent, 
    data = visual_comm)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.96493 -0.95209  0.03972  2.04968  2.15483 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 3.079163   0.133081  23.138   <2e-16 ***
Participation_Rate_Percent -0.002239   0.001679  -1.333    0.183    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.53 on 2998 degrees of freedom
Multiple R-squared:  0.0005927, Adjusted R-squared:  0.0002593 
F-statistic: 1.778 on 1 and 2998 DF,  p-value: 0.1825

Combined Model

final_model <- lm(
  Feedback_Satisfaction_Score ~ 
    Engagement_Score + 
    Participation_Rate_Percent + 
    Feedback_Received +
    Age + Gender,
  data = visual_comm
)
summary(final_model)

Call:
lm(formula = Feedback_Satisfaction_Score ~ Engagement_Score + 
    Participation_Rate_Percent + Feedback_Received + Age + Gender, 
    data = visual_comm)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.12646 -0.98234 -0.01379  2.02538  2.26850 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 3.401985   0.262123  12.979   <2e-16 ***
Engagement_Score            0.015155   0.019602   0.773    0.440    
Participation_Rate_Percent -0.017323   0.019505  -0.888    0.375    
Feedback_ReceivedYes       -0.102195   0.130340  -0.784    0.433    
Age                        -0.007111   0.007414  -0.959    0.338    
GenderMale                 -0.077689   0.068641  -1.132    0.258    
GenderOther                 0.008574   0.068362   0.125    0.900    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.53 on 2993 degrees of freedom
Multiple R-squared:  0.001958,  Adjusted R-squared:  -4.302e-05 
F-statistic: 0.9785 on 6 and 2993 DF,  p-value: 0.438

Checking for linearity, normality & homoscedasticity

par(mfrow = c(2,2))
plot(final_model)

Effect Size & Model Fit

summary(final_model)$r.squared
[1] 0.001957729
summary(final_model)$adj.r.squared
[1] -4.302351e-05