# Simulate student features
simulate_student_features <- function(n = 100) {
# Set the random seed
set.seed(260923)
# Generate unique student IDs
student_ids <- seq(1, n)
# Simulate student engagement
student_engagement <- rnorm(n, mean = 50, sd = 10)
# Simulate student performance
student_performance <- rnorm(n, mean = 60, sd = 15)
# Combine the data into a data frame
student_features <- data.frame(
student_id = student_ids,
student_engagement = student_engagement,
student_performance = student_performance
)
# Return the data frame
return(student_features)
}
# Generate the dataset
student_data <- simulate_student_features()
# View the dataset
print(student_data)
## student_id student_engagement student_performance
## 1 1 35.47855 50.52231
## 2 2 51.79512 58.88396
## 3 3 62.41012 40.56755
## 4 4 35.20679 62.46033
## 5 5 59.37552 54.69326
## 6 6 57.00109 54.09745
## 7 7 34.81908 51.59185
## 8 8 66.43009 71.66933
## 9 9 53.12224 53.38812
## 10 10 58.66933 77.51403
## 11 11 64.61152 66.60144
## 12 12 64.73720 42.54982
## 13 13 61.38786 81.60053
## 14 14 43.46833 71.08870
## 15 15 60.90687 65.14477
## 16 16 62.31512 96.92023
## 17 17 30.19917 59.56755
## 18 18 62.71153 45.28098
## 19 19 53.46864 54.77840
## 20 20 43.16863 73.15011
## 21 21 47.79988 57.94230
## 22 22 32.86718 64.51376
## 23 23 48.43080 44.12915
## 24 24 44.64360 81.96037
## 25 25 59.37263 67.10083
## 26 26 40.14190 57.07313
## 27 27 52.05290 33.93715
## 28 28 58.53192 66.30623
## 29 29 46.85526 60.08155
## 30 30 40.57498 83.21472
## 31 31 48.27392 68.24131
## 32 32 63.40857 64.74623
## 33 33 42.63505 74.19713
## 34 34 49.50695 36.55820
## 35 35 39.64492 63.26139
## 36 36 58.16632 42.53282
## 37 37 46.85609 77.93879
## 38 38 53.21176 71.84144
## 39 39 24.56077 72.83616
## 40 40 47.94104 72.70324
## 41 41 54.54657 57.30181
## 42 42 65.36895 64.50104
## 43 43 63.35530 43.93461
## 44 44 38.06179 40.12883
## 45 45 52.79802 70.87511
## 46 46 53.09701 57.98622
## 47 47 52.26786 75.90067
## 48 48 60.27817 65.06789
## 49 49 49.96451 35.62894
## 50 50 62.85455 53.86589
## 51 51 61.18422 35.28333
## 52 52 73.07623 72.12643
## 53 53 62.47065 81.81560
## 54 54 55.20634 46.58676
## 55 55 50.93514 36.66812
## 56 56 55.74387 72.98336
## 57 57 56.41645 80.03891
## 58 58 50.67616 64.95174
## 59 59 42.12485 72.70400
## 60 60 33.46542 63.30804
## 61 61 45.10251 73.36602
## 62 62 47.66047 64.39439
## 63 63 53.12859 46.91366
## 64 64 49.11046 61.00457
## 65 65 45.98572 66.17874
## 66 66 53.55687 70.29459
## 67 67 59.53438 68.26805
## 68 68 71.76380 50.57808
## 69 69 42.81577 70.02416
## 70 70 34.62981 60.46338
## 71 71 43.46502 43.93160
## 72 72 59.06670 56.56050
## 73 73 53.00539 60.76549
## 74 74 43.51405 67.50167
## 75 75 54.59768 71.64025
## 76 76 43.57840 79.52546
## 77 77 29.80201 57.75304
## 78 78 45.01510 55.98704
## 79 79 48.30114 37.44258
## 80 80 45.19776 97.40030
## 81 81 54.44051 52.26339
## 82 82 56.73032 66.93843
## 83 83 46.66086 54.04959
## 84 84 33.72874 51.90589
## 85 85 32.07322 74.45711
## 86 86 53.97599 57.86733
## 87 87 33.15555 40.26646
## 88 88 50.55680 43.10695
## 89 89 33.68189 71.96778
## 90 90 45.95642 72.64398
## 91 91 51.90072 83.01396
## 92 92 50.25869 46.90754
## 93 93 62.41476 62.63873
## 94 94 44.93745 80.00130
## 95 95 61.23368 69.66618
## 96 96 50.22648 82.94298
## 97 97 62.92548 67.67482
## 98 98 57.15390 90.19502
## 99 99 39.31421 65.78667
## 100 100 52.15625 62.67658
# Summary of the dataset
summary(student_data)
## student_id student_engagement student_performance
## Min. : 1.00 Min. :24.56 Min. :33.94
## 1st Qu.: 25.75 1st Qu.:43.56 1st Qu.:53.75
## Median : 50.50 Median :51.37 Median :64.45
## Mean : 50.50 Mean :50.43 Mean :62.42
## 3rd Qu.: 75.25 3rd Qu.:58.57 3rd Qu.:72.01
## Max. :100.00 Max. :73.08 Max. :97.40
# Perform K-means Clustering
# Perform K-means clustering
kmeans_result <- kmeans(student_data[, -1], centers = 3) # Exclude student_id column
# Dimensional reduction using PCA
student_pca <- prcomp(student_data[, -c(1, 4)], scale. = TRUE)
print(student_pca)
## Standard deviations (1, .., p=2):
## [1] 1.0103856 0.9895054
##
## Rotation (n x k) = (2 x 2):
## PC1 PC2
## student_engagement 0.7071068 0.7071068
## student_performance -0.7071068 0.7071068
# Add Cluster Assignments
# Add cluster assignments to the dataset
cluster_assignments <- kmeans_result$cluster
student_data$cluster <- cluster_assignments
# Display cluster assignments
head(cluster_assignments)
## [1] 2 2 1 2 1 1
# Plot the Clusters
# Load the required library
library(ggplot2)
# Plot the data points and centroids
ggplot(student_data, aes(x = student_engagement, y = student_performance)) +
geom_point(aes(color = factor(kmeans_result$cluster)), size = 2) +
geom_point(data = as.data.frame(kmeans_result$centers), aes(x = student_engagement, y = student_performance), color = "black", size = 10, shape = 20) +
labs(title = "K-means Clustering of the Student Data", x = "Student Engagement", y = "Student Performance", color = "Cluster") +
theme_minimal()
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
You can also embed plots, for example:
`` ```
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.