Knowledge Structure Mapping: a Comprehensive Report

An in-depth exploration of knowledge structure mapping using Factor Analysis, K-Means clustering, and PCA to uncover latent skills in an eight-item test dataset
Published

November 20, 2024

Modified

December 2, 2024

Abstract

This study aims to identify the underlying knowledge structure of an eight-item test dataset by applying Factor Analysis, K-Means clustering, and Principal Component Analysis (PCA). Factor Analysis was utilized to uncover latent skills, with results cross-validated using K-Means clustering (simulating Barnes’s Q-Matrix method) and PCA. Models with two to four components were compared to determine the optimal skill representation. The findings indicate that a three-component Factor Analysis model best captures the relationships among test items, effectively identifying three distinct skills. The final Q-matrix balances complexity and interpretability, providing a robust mapping of items to latent skills and enhancing the understanding of the dataset’s knowledge structure.

Keywords

knowledge structure mapping, factor analysis, q-matrix, latent skills, pca

Introduction

Knowledge structure mapping is a powerful tool that allows educators to uncover hidden connections between what students know and what they are tested on. By revealing the relationships between test items and the underlying skills they measure, knowledge structure mapping provides crucial insights for developing targeted educational interventions and improving student outcomes. This understanding is essential for creating effective assessments, personalizing instruction, and ensuring that all students have the opportunity to succeed.

However, identifying the optimal representation of latent skills within educational data is a complex challenge. Traditional methods often rely on assumptions that may not generalize across diverse contexts or assessment types. To address this issue, researchers have developed a range of data-driven approaches that aim to uncover skill structures in a more flexible and robust manner.

This study presents a comprehensive methodology for identifying the latent skill structure underlying an eight-item test dataset. By leveraging the complementary strengths of Factor Analysis, K-Means Clustering, and Principal Component Analysis (PCA), I aim to derive a robust and interpretable model of the key skills assessed by the test items. My approach involves iteratively testing models with varying numbers of components to determine the optimal balance between model complexity and explanatory power.

The resulting three-skill model offers a clear and actionable framework for understanding student performance on the test items. The model’s interpretability and strong empirical foundation make it a valuable tool for informing assessment design, instructional planning, and student support initiatives. By aligning educational practices with the identified skill structure, educators can more effectively foster student learning and achievement.

Moreover, this study contributes to the broader field of educational data mining and learning analytics by demonstrating the value of a multi-method, data-driven approach to knowledge structure mapping. The methodology presented here can serve as a template for future research aimed at uncovering the hidden skills and competencies that underlie student performance across a wide range of educational contexts and assessment types.

In the following sections, I provide an overview of relevant background literature, describe my methodological approach in detail, present the key findings of my analysis, and discuss the implications of my work for educational practice and future research.

Methods Used

Overview

To uncover the latent skills underlying the eight-item test dataset, I employed a multi-method approach that combines Factor Analysis, K-Means Clustering, and PCA. Each method offers unique strengths and limitations, and by leveraging their complementary perspectives, I aimed to develop a more robust and comprehensive understanding of the knowledge structure underlying the data.

Factor Analysis served as the primary method for identifying latent skills, as it is specifically designed to uncover hidden constructs that explain the patterns of correlations among observed variables (Beavers et al. 2019). K-Means Clustering provided a complementary perspective by grouping items based on their response patterns, allowing me to explore potential skill clusters without imposing strong assumptions about the number or nature of the underlying skills (Kargupta et al. 2001). Finally, PCA was used as a validation technique to assess the stability and robustness of the latent skill structure identified by the other methods (Chen et al. 2018).

By comparing the results of these three methods and exploring models with varying levels of complexity, I sought to identify the optimal balance between model fit and interpretability. My goal was to develop a parsimonious and actionable representation of the latent skills that could inform assessment design, instructional planning, and student support initiatives.

Factor Analysis

Factor Analysis was selected as the primary method for identifying latent skills due to its ability to uncover hidden constructs that explain the patterns of correlations among test items (Beavers et al. 2019).

To determine the optimal number of factors to retain, I used a combination of statistical criteria and substantive considerations. Specifically, I examined the scree plot of eigenvalues, the percentage of variance explained by each factor, and the interpretability of the resulting factor solutions (Beavers et al. 2019). I also compared models with varying numbers of factors (ranging from two to four) to assess their relative fit and interpretability.

While Factor Analysis is a powerful tool for uncovering latent constructs, it is important to acknowledge its assumptions and limitations. Factor Analysis assumes that the observed variables are continuous and normally distributed, which may not hold for binary or ordinal data (such as the correct or incorrect responses in the present dataset). However, research has shown that Factor Analysis can still provide useful insights when applied to binary data, particularly when the sample size is large and the factor loadings are strong (Watkins 2018).

K-Means Clustering

K-Means Clustering was used as a complementary method to explore potential skill clusters based on item response patterns (Kargupta et al. 2001). Unlike Factor Analysis, K-Means Clustering does not impose strong assumptions about the structure of the data or the nature of the underlying constructs. Instead, it aims to partition the data into a specified number of clusters based on the similarity of their response patterns.

To apply K-Means Clustering, I first transformed the data to represent each item as a vector of binary responses across all students. I then used the elbow method to determine the optimal number of clusters, which involves plotting the within-cluster sum of squares (WCSS) against the number of clusters and identifying the “elbow” point where the rate of decrease in WCSS begins to level off (Kargupta et al. 2001). Based on this analysis, I selected a three-cluster solution as the most parsimonious and interpretable representation of the data.

While K-Means Clustering can provide valuable insights into the structure of the data, it, too, has limitations. K-Means Clustering assumes that the clusters are spherical and of equal size, which may not hold in practice (Gordon and Jorgensen 2003). Additionally, the resulting clusters are sensitive to the initial placement of the cluster centroids, which can lead to different solutions across multiple runs of the algorithm (Kargupta et al. 2001). To mitigate these issues, I used multiple random initializations and selected the solution with the lowest WCSS.

Principal Component Analysis (PCA)

PCA was employed as a validation technique to assess the stability and robustness of the latent skill structure identified by Factor Analysis and K-Means Clustering (Chen et al. 2018). PCA is a dimensionality reduction technique that aims to identify the principal components that explain the maximum amount of variance in the data.

To apply PCA, the data was initially standardized to ensure all items were on a consistent scale. The scree plot of eigenvalues was then examined to identify the optimal number of components for the analysis. PCA was subsequently conducted on the standardized item response data to evaluate the stability and robustness of the underlying skill structure (Chen et al. 2018).

PCA provides a useful complement to Factor Analysis and K-Means Clustering, as it does not impose strong assumptions about the structure of the data or the nature of the underlying constructs. Instead, it identifies the key dimensions of variation in the data, which can be used to validate the stability and robustness of the latent skill structure identified by the other methods (Chen et al. 2018).

However, it is important to recognize that PCA is a purely data-driven technique and does not necessarily identify constructs that are substantively meaningful or interpretable (Gordon and Jorgensen 2003). Additionally, PCA assumes that the relationships among the observed variables are linear, which may not hold in practice (Chen et al. 2018). Despite these limitations, PCA can still provide valuable insights into the overall structure of the data and inform the interpretation of the latent skill structure.

Implementation Details

Data Preparation

Loading the Data

The first step in my analysis was to load and preprocess the eight-item test dataset. The dataset consisted of binary responses (correct or incorrect) from 1,920 students on eight test items. I used the pandas library in Python to load the data into a data frame and perform initial data exploration

```{python}
# Import necessary libraries
import pandas as pd

# Load the dataset
data = pd.read_csv('data/8items.csv')

# Display the first few rows of the dataset
data.head()
```
Table 1: First few rows of the dataset
student item1 item2 item3 item4 item5 item6 item7 item8
0 1 1 0 0 0 1 0 0 0
1 2 0 1 0 0 1 0 0 0
2 3 0 1 1 0 0 0 1 1
3 4 0 1 0 0 0 0 1 0
4 5 1 1 0 0 0 1 1 0

To prepare the data for analysis, I examined the structure of the data frame and checked for missing values.

```{python}
# Check the dimensions of the dataset
print(f"Dataset dimensions: {data.shape}")

# Check for missing values
print("Missing values in each column:")
print(data.isnull().sum())
```
Dataset dimensions: (1920, 9)
Missing values in each column:
student    0
item1      0
item2      0
item3      0
item4      0
item5      0
item6      0
item7      0
item8      0
dtype: int64

Factor Analysis

Preparing Data for Factor Analysis

I extracted the item response data, excluding any non-item columns such as student identifiers. This step ensured that my analyses focused solely on the patterns of student responses across the eight test items.

```{python}
# Extract item data (excluding the 'student' column if present)
item_data = data.drop(columns=['student'], errors='ignore')
```

Determining the Number of Factors Using Scree Plot

To determine the optimal number of factors to retain, I examined a scree plot of eigenvalues.

```{python}
# Import necessary modules
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from factor_analyzer import FactorAnalyzer

# Standardize the data
scaler = StandardScaler()
item_data_scaled = scaler.fit_transform(item_data)

# Perform factor analysis with maximum factors
fa_model = FactorAnalyzer(rotation=None)
fa_model.fit(item_data_scaled)
```
FactorAnalyzer(rotation=None, rotation_kwargs={})
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
```{python}
# Get eigenvalues and variance explained
ev, v = fa_model.get_eigenvalues()
variance = fa_model.get_factor_variance()

# Extract variance explained and cumulative variance
variance_explained = variance[1]
cumulative_variance_explained = variance[2]

# Total variance explained by the factors
total_variance_explained = cumulative_variance_explained[-1]
print(f"Total Variance Explained by Factors: {total_variance_explained}")
```
Total Variance Explained by Factors: 0.5554629091890351
```{python}
# Plot the scree plot
plt.figure(figsize=(8, 5))
plt.plot(range(1, len(ev) + 1), ev, 'o-', color='blue')
_ = plt.title('Scree Plot for Factor Analysis')
_ = plt.xlabel('Factor Number')
_ = plt.ylabel('Eigenvalue')
plt.grid(True)
plt.show()
```
Figure 1: Scree Plot for Factor Analysis

The scree plot shows a clear “elbow” after the second factor, where the eigenvalues drop sharply initially and then level off. This “elbow” suggests that the first two factors capture most of the meaningful variance, with subsequent factors contributing relatively little.

Performing Factor Analysis

I applied Factor Analysis with three components to identify latent skills in the dataset.

```{python}
# Retrieve the factor loadings
factor_loadings = fa_model.loadings_

# Dynamically determine the number of factors extracted
n_factors_extracted = factor_loadings.shape[1]

# Create a data frame for the factor loadings
factor_loadings_df = pd.DataFrame(
    factor_loadings,
    index=item_data.columns,
    columns=[f'Skill_{i+1}' for i in range(n_factors_extracted)]
)

# Display the factor loadings
factor_loadings_df
```
Table 2: Factor Loadings
Skill_1 Skill_2 Skill_3
item1 0.039341 -0.063724 0.986007
item2 -0.099743 0.299886 -0.010651
item3 0.806481 0.044630 -0.084003
item4 -0.017268 0.327678 0.044305
item5 0.483557 -0.001616 0.331988
item6 -0.069649 1.004075 0.063035
item7 0.778050 0.028228 -0.084929
item8 0.782307 0.064981 -0.078495

The Factor Analysis revealed three distinct latent skills underlying the eight test items. The first skill was characterized by high loadings on Items 3, 5, 7, and 8. The second skill was defined by high loadings on Items 2, 4, and 6. The third skill was primarily associated with Item 1.

K-Means Clustering

Transposing Item Data

I transposed the item data to cluster items based on their response patterns.

```{python}
# Import K-Means module
from sklearn.cluster import KMeans

# Transpose the item data to have items as rows and students as columns
item_data_transposed = item_data_scaled.T

# Specify the number of clusters (skills)
n_clusters = 3

# Initialize the K-Means model
kmeans = KMeans(n_clusters=n_clusters, random_state=42)

# Fit the model to the transposed item data
kmeans.fit(item_data_transposed)
```
KMeans(n_clusters=3, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
```{python}
# Retrieve the cluster labels for each item
cluster_labels = kmeans.labels_

# Create a data frame to display the item-cluster mapping
kmeans_q_matrix_df = pd.DataFrame({
    'Item': item_data.columns,
    'Mapped_Skill': [f'Skill_{label+1}' for label in cluster_labels]
})
```

Determining the Number of Clusters Using Elbow Method

To determine the optimal number of clusters, I used the elbow method, which involved plotting the within-cluster sum of squares (WCSS) against the number of clusters and identifying the “elbow” point where the rate of decrease in WCSS began to level off.

```{python}
# Import necessary module
import numpy as np

# Calculate WCSS for different number of clusters
wcss = []
for i in range(1, 7):
    kmeans_elbow = KMeans(n_clusters=i, random_state=42)
    kmeans_elbow.fit(item_data_transposed)
    wcss.append(kmeans_elbow.inertia_)
```
KMeans(n_clusters=1, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KMeans(n_clusters=2, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KMeans(n_clusters=3, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KMeans(n_clusters=4, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KMeans(n_clusters=5, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KMeans(n_clusters=6, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
```{python}
# Plot the elbow graph
plt.figure(figsize=(8, 5))
plt.plot(range(1, 7), wcss, 'o-', color='red')
_ = plt.title('Elbow Method for K-Means Clustering')
_ = plt.xlabel('Number of Clusters')
_ = plt.ylabel('Within-Cluster Sum of Squares (WCSS)')
plt.grid(True)
plt.show()
```
Figure 2: Elbow Method for K-Means Clustering

Based on the elbow plot, I decided a three-cluster solution is the most parsimonious and interpretable representation of the data.

Applying K-Means Clustering

I applied K-Means Clustering to the transformed item response data to explore potential skill clusters based on the similarity of item response patterns (Kargupta et al. 2001).

```{python}
# Get unique clusters (skills) from the kmeans_q_matrix_df
unique_skills = kmeans_q_matrix_df['Mapped_Skill'].unique()
n_clusters = len(unique_skills)

# Create a binary Q-matrix based on the kmeans clustering results
# Create an empty matrix of zeros
binary_matrix = np.zeros((len(kmeans_q_matrix_df), n_clusters), dtype=int)

# Iterate through the rows of kmeans_q_matrix_df and fill in the appropriate cluster assignment
for index, row in kmeans_q_matrix_df.iterrows():
    skill_index = int(row['Mapped_Skill'].split('_')[1]) - 1  # Extract the skill number and convert to zero-indexed
    binary_matrix[index, skill_index] = 1

# Create a DataFrame for the binary Q-matrix
q_matrix_kmeans_binary_df = pd.DataFrame(
    binary_matrix,
    index=kmeans_q_matrix_df['Item'],
    columns=[f'Skill_{i+1}' for i in range(n_clusters)]
)

# Reset index
q_matrix_kmeans_binary_df.reset_index(inplace=True)
q_matrix_kmeans_binary_df.rename(columns={'index': 'Item'}, inplace=True)

# Display the Q-matrix
q_matrix_kmeans_binary_df
```
Table 3: Item-Cluster Mapping
Item Skill_1 Skill_2 Skill_3
0 item1 0 0 1
1 item2 0 1 0
2 item3 1 0 0
3 item4 0 1 0
4 item5 1 0 0
5 item6 0 1 0
6 item7 1 0 0
7 item8 1 0 0

The resulting clusters closely aligned with the latent skills identified by the Factor Analysis, providing convergent evidence for the three-skill structure underlying the test items.

Principal Component Analysis (PCA)

Determining the Number of Components Using Scree Plot

I generated another scree plot to help determine the optimal number of components.

```{python}
# Import necessary module
from sklearn.decomposition import PCA

# Initialize PCA to get all components
pca = PCA()
pca.fit(item_data_scaled)
```
PCA()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
```{python}
# Calculate explained variance
explained_variance = pca.explained_variance_

# Plot the scree plot
plt.figure(figsize=(8, 5))
plt.plot(range(1, len(explained_variance) + 1), explained_variance, 'o-', color='green')
_ = plt.title('Scree Plot for PCA')
_ = plt.xlabel('Principal Component Number')
_ = plt.ylabel('Eigenvalue')
plt.grid(True)
plt.show()
```
Figure 3: Scree Plot for PCA

Similar to the scree plot used in Factor Analysis, this plot indicates that the majority of significant variance is explained by the first two factors, while the remaining factors contribute comparatively little additional information.

Performing PCA

I conducted PCA on the standardized item response data to assess the stability and robustness of the latent skill structure identified by Factor Analysis and K-Means Clustering (Chen et al. 2018).

```{python}
# Initialize the PCA model with three components
pca_model = PCA(n_components=3)

# Fit the PCA model to the item data
pca_model.fit(item_data_scaled)
```
PCA(n_components=3)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
```{python}
# Retrieve the PCA loadings
pca_loadings = pca_model.components_.T

# Create a data frame for the PCA loadings
pca_loadings_df = pd.DataFrame(
    pca_loadings,
    index=item_data.columns,
    columns=[f'Skill_{i+1}' for i in range(3)]
)

# Display the PCA loadings
pca_loadings_df
```
Table 4: PCA Loadings
Skill_1 Skill_2 Skill_3
item1 0.032759 -0.017652 0.809766
item2 -0.089362 0.467578 -0.076462
item3 0.535527 0.044483 -0.140383
item4 -0.013661 0.517393 0.094851
item5 0.380393 0.015493 0.517176
item6 -0.040435 0.711481 0.017382
item7 0.527706 0.026847 -0.148140
item8 0.528353 0.064950 -0.141454

The PCA results largely confirmed the three-skill structure identified by the other methods.

Results

Mapping Items to Skills Using PCA

To understand the item-skill relationships further, I created a Q-matrix based on the PCA loadings. Each item is assigned to the skill (principal component) with which it has the highest loading.

```{python}
# Convert the PCA loadings to a Q-matrix format (binary)
# Set a threshold to determine if the item is associated with a skill
threshold = 0.2

# Create a binary Q-matrix based on the loadings and the threshold
q_matrix_binary = (np.abs(pca_loadings_df) > threshold).astype(int)

# Display the Q-matrix
q_matrix_binary.index.name = 'Item'
q_matrix_binary.columns = [f'Skill_{i+1}' for i in range(q_matrix_binary.shape[1])]

# Reset the index to display it like a table
q_matrix_binary_df = q_matrix_binary.reset_index()

# Display the Q-matrix
q_matrix_binary_df
```
Table 5: PCA Q-Matrix
Item Skill_1 Skill_2 Skill_3
0 item1 0 0 1
1 item2 0 1 0
2 item3 1 0 0
3 item4 0 1 0
4 item5 1 0 1
5 item6 0 1 0
6 item7 1 0 0
7 item8 1 0 0

Comparison Across Methods

The mappings obtained from Factor Analysis, K-Means Clustering, and PCA show considerable agreement, suggesting the presence of three distinct latent skills assessed by the test items.

Testing Alternative Factor Analysis Models

I tested Factor Analysis models with two-, three-, and four-factor models to determine the optimal number of latent skills.

Factor Analysis with Four Components

```{python}
# Performing Factor Analysis with four components to explore the potential presence of additional latent skills
n_factors_extended = 4
fa_model_extended = FactorAnalyzer(n_factors=n_factors_extended, rotation=None)
fa_model_extended.fit(item_data_scaled)
```
FactorAnalyzer(n_factors=4, rotation=None, rotation_kwargs={})
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
```{python}
# Get the factor loadings for the 4-component model
factor_loadings_extended = fa_model_extended.loadings_

# Create a data frame to visualize the factor loadings for the four-component model
factor_loadings_extended_df = pd.DataFrame(
    factor_loadings_extended,
    index=item_data.columns,
    columns=[f'Skill_{i+1}' for i in range(n_factors_extended)]
)

# Reset the index to properly align the "Item" column with the factor loadings
factor_loadings_extended_df.reset_index(inplace=True)
factor_loadings_extended_df.rename(columns={'index': 'Item'}, inplace=True)

# Display the extended factor loadings
factor_loadings_extended_df
```
Table 6: Factor Analysis with Four Components
Item Skill_1 Skill_2 Skill_3 Skill_4
0 item1 0.058296 -0.001032 0.425385 -0.033357
1 item2 -0.113564 0.444694 -0.018753 0.494151
2 item3 0.776272 0.032031 -0.228715 0.011729
3 item4 -0.015773 0.481321 0.018040 -0.462656
4 item5 0.681866 0.033105 0.725587 0.050257
5 item6 -0.051020 0.760484 -0.002363 -0.000564
6 item7 0.750738 0.011458 -0.233651 -0.018004
7 item8 0.754160 0.054250 -0.223509 0.027685

Observations from the Four-Component Model:

  • Complexity and Overfitting: The four-component model introduces additional complexity without significant gains in explained variance. Some items load significantly on multiple factors, making interpretation challenging.
  • Item Loadings:
    • Item2 and Item4 have substantial loadings on both Skill_2 and Skill_4, indicating overlapping skills.
    • Item5 loads highly on both Skill_1 and Skill_3, suggesting it may be measuring a combination of skills.
  • Interpretability: The overlapping loadings reduce the model’s interpretability, making it less practical for educational applications.

Factor Analysis with Two Components

```{python}
# Performing Factor Analysis with two components to explore if a simpler model might explain the relationships
n_factors_simpler = 2
fa_model_simpler = FactorAnalyzer(n_factors=n_factors_simpler, rotation=None)
fa_model_simpler.fit(item_data_scaled)
```
FactorAnalyzer(n_factors=2, rotation=None, rotation_kwargs={})
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
```{python}
# Get the factor loadings for the two-component model
factor_loadings_simpler = fa_model_simpler.loadings_

# Create a data frame to visualize the factor loadings for the two-component model
factor_loadings_simpler_df = pd.DataFrame(
    factor_loadings_simpler,
    index=item_data.columns,
    columns=[f'Skill_{i+1}' for i in range(n_factors_simpler)]
)

# Reset the index and rename it to align with the desired table format
factor_loadings_simpler_df.reset_index(inplace=True)
factor_loadings_simpler_df.rename(columns={'index': 'Item'}, inplace=True)

factor_loadings_simpler_df
```
Table 7: Factor Analysis with Two Components
Item Skill_1 Skill_2
0 item1 0.015398 -0.007536
1 item2 -0.099736 0.298751
2 item3 0.809990 0.040807
3 item4 -0.017753 0.329312
4 item5 0.449164 0.013942
5 item6 -0.070497 1.006000
6 item7 0.781571 0.024412
7 item8 0.786056 0.061425
  • Simplicity vs. Variance Explained: The two-component model is simpler but explains less variance compared to the three-component model.
  • Item Loadings:
    • Item3, Item5, Item7, and Item8 load highly on Skill_1.
    • Item2, Item4, and Item6 load on Skill_2.
    • Item1 has very low loadings on both factors, suggesting it may not be well-represented in this model.
  • Loss of Detail: The two-component model may be too simplistic, failing to capture nuances in the data, particularly the unique contribution of Item1.

Visualizations

Diagrams

I created a couple Mermaid diagrams to gain further insight.

```{mermaid}
graph TB
    subgraph PCA
        PCA_S1[Skill_1] --- PCA_I3[Item 3]
        PCA_S1 --- PCA_I7[Item 7]
        PCA_S1 --- PCA_I8[Item 8]
        
        PCA_S2[Skill_2] --- PCA_I2[Item 2]
        PCA_S2 --- PCA_I4[Item 4]
        PCA_S2 --- PCA_I6[Item 6]
        
        PCA_S3[Skill_3] --- PCA_I1[Item 1]
        PCA_S3 --- PCA_I5[Item 5]
    end
    
    subgraph KMeans
        KM_S1[Skill_1] --- KM_I3[Item 3]
        KM_S1 --- KM_I5[Item 5]
        KM_S1 --- KM_I7[Item 7]
        KM_S1 --- KM_I8[Item 8]
        
        KM_S2[Skill_2] --- KM_I2[Item 2]
        KM_S2 --- KM_I4[Item 4]
        KM_S2 --- KM_I6[Item 6]
        
        KM_S3[Skill_3] --- KM_I1[Item 1]
    end
    
    subgraph Factor_Analysis
        FA_S1[Skill_1] --- FA_I3[Item 3]
        FA_S1 --- FA_I5[Item 5]
        FA_S1 --- FA_I7[Item 7]
        FA_S1 --- FA_I8[Item 8]
        
        FA_S2[Skill_2] --- FA_I2[Item 2]
        FA_S2 --- FA_I4[Item 4]
        FA_S2 --- FA_I6[Item 6]
        
        FA_S3[Skill_3] --- FA_I1[Item 1]
    end

    style PCA fill:#f9f,stroke:#333,stroke-width:2px
    style KMeans fill:#bbf,stroke:#333,stroke-width:2px
    style Factor_Analysis fill:#bfb,stroke:#333,stroke-width:2px
```
graph TB
    subgraph PCA
        PCA_S1[Skill_1] --- PCA_I3[Item 3]
        PCA_S1 --- PCA_I7[Item 7]
        PCA_S1 --- PCA_I8[Item 8]
        
        PCA_S2[Skill_2] --- PCA_I2[Item 2]
        PCA_S2 --- PCA_I4[Item 4]
        PCA_S2 --- PCA_I6[Item 6]
        
        PCA_S3[Skill_3] --- PCA_I1[Item 1]
        PCA_S3 --- PCA_I5[Item 5]
    end
    
    subgraph KMeans
        KM_S1[Skill_1] --- KM_I3[Item 3]
        KM_S1 --- KM_I5[Item 5]
        KM_S1 --- KM_I7[Item 7]
        KM_S1 --- KM_I8[Item 8]
        
        KM_S2[Skill_2] --- KM_I2[Item 2]
        KM_S2 --- KM_I4[Item 4]
        KM_S2 --- KM_I6[Item 6]
        
        KM_S3[Skill_3] --- KM_I1[Item 1]
    end
    
    subgraph Factor_Analysis
        FA_S1[Skill_1] --- FA_I3[Item 3]
        FA_S1 --- FA_I5[Item 5]
        FA_S1 --- FA_I7[Item 7]
        FA_S1 --- FA_I8[Item 8]
        
        FA_S2[Skill_2] --- FA_I2[Item 2]
        FA_S2 --- FA_I4[Item 4]
        FA_S2 --- FA_I6[Item 6]
        
        FA_S3[Skill_3] --- FA_I1[Item 1]
    end

    style PCA fill:#f9f,stroke:#333,stroke-width:2px
    style KMeans fill:#bbf,stroke:#333,stroke-width:2px
    style Factor_Analysis fill:#bfb,stroke:#333,stroke-width:2px
Figure 4: Comparison Across the Three Methods
Method Comparison (Factor Analysis, K-Means, PCA)
  • Key Observations:
    1. Consistency Across Methods: Many items (e.g., Item 3 and Item 7) align similarly across Factor Analysis, K-Means, and PCA, reinforcing the robustness of these mappings.
    2. Item Overlap: The clustering of items (e.g., Items 3, 7, and 8 under Skill_1) consistently suggests a strong latent skill grouping.
    3. Discrepancies: While most items map consistently, some differences (e.g., Item 5 under Factor Analysis vs. PCA) suggest subtle differences in how these methods interpret data structures.
    4. Skill 3 Representation: This skill emerges consistently across methods but captures fewer items, which might indicate a niche or less represented skill.

The visual comparison highlights overlaps and outliers more effectively than numerical tables, making it easier to identify items that contribute ambiguously to multiple skills or are method-dependent.

```{mermaid}
graph TB
    subgraph Four_Component_Model
        FC_S1[Skill_1] --- FC_I3[Item 3]
        FC_S1 --- FC_I7[Item 7]
        FC_S1 --- FC_I8[Item 8]
        FC_S1 -.-> FC_I5[Item 5]
        
        FC_S2[Skill_2] --- FC_I6[Item 6]
        FC_S2 -.-> FC_I2[Item 2]
        FC_S2 -.-> FC_I4[Item 4]
        
        FC_S3[Skill_3] --- FC_I1[Item 1]
        FC_S3 --- FC_I5
        
        FC_S4[Skill_4] -.-> FC_I2
        FC_S4 -.-> FC_I4
    end
    
    subgraph Three_Component_Model
        TH_S1[Skill_1] --- TH_I3[Item 3]
        TH_S1 --- TH_I7[Item 7]
        TH_S1 --- TH_I8[Item 8]
        TH_S1 --- TH_I5[Item 5]
        
        TH_S2[Skill_2] --- TH_I2[Item 2]
        TH_S2 --- TH_I4[Item 4]
        TH_S2 --- TH_I6[Item 6]
        
        TH_S3[Skill_3] --- TH_I1[Item 1]
        TH_S3 -.-> TH_I5
    end
    
    subgraph Two_Component_Model
        TC_S1[Skill_1] --- TC_I3[Item 3]
        TC_S1 --- TC_I5[Item 5]
        TC_S1 --- TC_I7[Item 7]
        TC_S1 --- TC_I8[Item 8]
        
        TC_S2[Skill_2] --- TC_I2[Item 2]
        TC_S2 --- TC_I4[Item 4]
        TC_S2 --- TC_I6[Item 6]
        
        TC_I1[Item 1<br/>Weak Loadings] -..- TC_S1
        TC_I1 -..- TC_S2
    end

    style Two_Component_Model fill:#bfb,stroke:#333,stroke-width:2px
    style Three_Component_Model fill:#bbf,stroke:#333,stroke-width:2px
    style Four_Component_Model fill:#f9f,stroke:#333,stroke-width:2px
```
graph TB
    subgraph Four_Component_Model
        FC_S1[Skill_1] --- FC_I3[Item 3]
        FC_S1 --- FC_I7[Item 7]
        FC_S1 --- FC_I8[Item 8]
        FC_S1 -.-> FC_I5[Item 5]
        
        FC_S2[Skill_2] --- FC_I6[Item 6]
        FC_S2 -.-> FC_I2[Item 2]
        FC_S2 -.-> FC_I4[Item 4]
        
        FC_S3[Skill_3] --- FC_I1[Item 1]
        FC_S3 --- FC_I5
        
        FC_S4[Skill_4] -.-> FC_I2
        FC_S4 -.-> FC_I4
    end
    
    subgraph Three_Component_Model
        TH_S1[Skill_1] --- TH_I3[Item 3]
        TH_S1 --- TH_I7[Item 7]
        TH_S1 --- TH_I8[Item 8]
        TH_S1 --- TH_I5[Item 5]
        
        TH_S2[Skill_2] --- TH_I2[Item 2]
        TH_S2 --- TH_I4[Item 4]
        TH_S2 --- TH_I6[Item 6]
        
        TH_S3[Skill_3] --- TH_I1[Item 1]
        TH_S3 -.-> TH_I5
    end
    
    subgraph Two_Component_Model
        TC_S1[Skill_1] --- TC_I3[Item 3]
        TC_S1 --- TC_I5[Item 5]
        TC_S1 --- TC_I7[Item 7]
        TC_S1 --- TC_I8[Item 8]
        
        TC_S2[Skill_2] --- TC_I2[Item 2]
        TC_S2 --- TC_I4[Item 4]
        TC_S2 --- TC_I6[Item 6]
        
        TC_I1[Item 1<br/>Weak Loadings] -..- TC_S1
        TC_I1 -..- TC_S2
    end

    style Two_Component_Model fill:#bfb,stroke:#333,stroke-width:2px
    style Three_Component_Model fill:#bbf,stroke:#333,stroke-width:2px
    style Four_Component_Model fill:#f9f,stroke:#333,stroke-width:2px
Figure 5: Comparison Across the Three Models
Model Comparison (Two-, Three-, and Four-Component Models)
  • Key Observations:
    1. Two-Component Model: Simpler but lacks granularity, as evident in fewer distinct mappings and the merging of certain skills.
    2. Three-Component Model: Balanced in complexity and interpretability, with clear item-skill relationships (e.g., Items 3, 7, and 8 consistently linked to Skill 1).
    3. Four-Component Model: Overcomplicates relationships with multiple cross-loadings (e.g., Item 5 linked to both Skill 1 and Skill 3), making the model harder to interpret.
    4. Weak Loadings (Item 1): Visualizing weak loadings in the two-component model underscores its limited ability to represent all test items adequately.

The diagrams provide a clear visual distinction between the interpretability trade-offs of different models. For instance, they highlight how additional components in the four-component model lead to more overlap, supporting the conclusion that the three-component model is optimal.

Broader Insights:
  • Support for Prior Work: The diagrams reinforce the findings that a three-component model is the most interpretable and aligns well across methods.
  • New Learnings:
    • Item-Specific Trends: Items like Item 5 show variability across methods and models, suggesting they may assess complex or multiple skills.
    • Skill Coverage: Skills identified in PCA seem broader, potentially capturing more nuanced relationships, while K-Means provides a stricter clustering.
    • Cross-Method Validation: The diagrams visually validate the multi-method approach, showing where methods agree or diverge.

Heatmap of Factor Loadings (Three Components)

Using a heatmap, I visualized the factor loadings from the three-component Factor Analysis model.

```{python}
import seaborn as sns

# Create a heatmap to visualize item-skill relationships from Factor Analysis
plt.figure(figsize=(10, 6))
sns.heatmap(factor_loadings_df, annot=True, cmap='coolwarm', linewidths=0.5, linecolor='black', cbar=True)
_ = plt.title('Item-Skill Relationships (Factor Analysis with Three Components)')
plt.show()
```
Figure 6: Factor Analysis with Three Components
Key Observations:
  1. Dominant Item-Skill Relationships:
    • Item 1 strongly loads on Skill 3 (0.99), indicating that it is almost exclusively associated with this latent skill.
    • Item 3, Item 7, and Item 8 have high loadings on Skill 1 (0.81, 0.78, and 0.78, respectively), showing that they are closely related to this skill.
    • Item 6 is strongly associated with Skill 2 (1.00), suggesting it is a clear indicator of this skill.
  2. Cross-Skill Contributions:
    • Item 5 has moderate loadings on both Skill 1 (0.48) and Skill 3 (0.33), indicating that it measures a mix of these skills.
    • Item 2 has a moderate loading on Skill 2 (0.30), with negligible contributions to other skills, suggesting it is moderately representative of this skill but not a strong indicator.
  3. Weak Loadings:
    • Item 4 shows relatively weak loadings across all skills, with the highest on Skill 2 (0.33). This suggests that it may not align well with any single skill or may be ambiguously measuring multiple skills.
    • Similarly, Item 2 and Item 5 exhibit weak or mixed relationships across skills, warranting further investigation.
  4. Distinct Skills:
    • Skill 1: Clearly defined by Item 3, Item 7, and Item 8.
    • Skill 2: Dominated by Item 6, with some contributions from Item 2 and Item 4.
    • Skill 3: Clearly represented by Item 1, with partial contributions from Item 5.
Insights:
  • Item-Skill Assignment: The heatmap visually confirms the appropriateness of assigning items to the skills based on their dominant factor loadings.
  • Complex or Ambiguous Items: Items like Item 5 and Item 4 exhibit weaker or mixed relationships, suggesting potential challenges in their interpretation or measurement of a specific skill.
  • Skill Coverage: Each skill appears to have at least one strongly associated item, ensuring that all skills are represented in the model.

Bar Charts for Individual Items

I generated bar charts to illustrate the factor loadings of each item across the three skills.

```{python}
# Create bar charts for each item to show its relationship across skills
num_items = len(factor_loadings_df.index)
fig, axes = plt.subplots(num_items, 1, figsize=(9, num_items * 2))

for i, item in enumerate(factor_loadings_df.index):
    axes[i].bar(factor_loadings_df.columns, factor_loadings_df.loc[item], color='skyblue')
    _ = axes[i].set_title(f'Relationship of {item} with Skills')
    _ = axes[i].set_ylabel('Loading Value')
    _ = axes[i].set_ylim(-1, 1)

plt.tight_layout()

plt.show()
```
Figure 7: Bar Charts for Individual Items
Key Insights:
  1. Dominant Item-Skill Relationships:
    • Item 1: Almost exclusively associated with Skill 3, with a very high loading value (~0.99). It does not meaningfully load on Skill 1 or Skill 2.
    • Item 3, Item 7, and Item 8: Strongly associated with Skill 1, with high positive loadings (~0.81 and ~0.78). These items clearly represent this latent skill.
    • Item 6: Solely aligned with Skill 2 (loading ~1.00), making it the clearest representative of this skill.
  2. Mixed and Moderate Relationships:
    • Item 5: Shows moderate loadings on both Skill 1 (~0.48) and Skill 3 (~0.33), indicating that it may measure a combination of these skills.
    • Item 2: Moderately aligned with Skill 2 (~0.30) but has negligible loadings on the other skills, making it a less prominent representative of any single skill.
  3. Ambiguous or Weak Relationships:
    • Item 4: Has low to moderate loadings across the board, with the highest (~0.33) on Skill 2. This indicates that the item may be ambiguous or weakly related to the latent skills in this model.
    • Item 2: Although moderately associated with Skill 2, its low loadings suggest it does not strongly differentiate itself in measuring this skill.
  4. Distinct Skills:
    • Skill 1: Clearly defined by Item 3, Item 7, and Item 8.
    • Skill 2: Primarily represented by Item 6, with minor contributions from Item 2 and Item 4.
    • Skill 3: Dominated by Item 1, with partial contributions from Item 5.
Further Insight:
  1. Support for Factor Analysis Findings:
    • The charts confirm that the three-component model successfully captures distinct latent skills, with most items showing strong associations with a single skill.
    • The visualization highlights items that load cleanly on one skill (e.g., Item 6 for Skill 2, Item 1 for Skill 3).
  2. Ambiguous Items:
    • Items like Item 4 and Item 5 demonstrate weaker or mixed relationships, indicating potential issues with their design or alignment with specific skills.
    • These items may require revision or could indicate the need for further exploration of an additional component.
  3. Strength of Representation:
    • Certain skills (e.g., Skill 1 and Skill 3) have multiple items with high loadings, providing strong representation.
    • Skill 2 is highly dependent on a single dominant item (Item 6), which could make it more vulnerable to measurement error.

Creating the Final Q-Matrix

Based on the consistency of results across methods, I developed a final Q-matrix that maps each item to its primary associated skill based on the three-factor model. Table 8 presents the final Q-matrix, which shows a clear and interpretable mapping of items to skills.

```{python}
# Creating the final Q-matrix based on the visualization and analysis findings
# Assigning each item to the skill with the highest loading from the Factor Analysis with three components
final_q_matrix = factor_loadings_df.idxmax(axis=1)

# Create a data frame to visualize the final Q-matrix, showing the mapping between items and skills
final_q_matrix_df = pd.DataFrame({'Item': item_data.columns, 'Mapped_Skill': final_q_matrix.values})

# Set a threshold to determine the significant loading
threshold = 0.2

# Create a binary Q-matrix based on the factor loadings and the threshold
q_matrix_binary = (np.abs(factor_loadings_df) > threshold).astype(int)

# Rename index and columns for better readability in the Q-matrix
q_matrix_binary.index.name = 'Item'
q_matrix_binary.columns = [f'Skill_{i+1}' for i in range(q_matrix_binary.shape[1])]

# Reset the index to present it as a table
q_matrix_binary_df = q_matrix_binary.reset_index()

# Display the final Q-matrix
q_matrix_binary_df
```
Table 8: Final Q-Matrix
Item Skill_1 Skill_2 Skill_3
0 item1 0 0 1
1 item2 0 1 0
2 item3 1 0 0
3 item4 0 1 0
4 item5 1 0 1
5 item6 0 1 0
6 item7 1 0 0
7 item8 1 0 0

I also developed another diagram to support the final Q-Matrix.

```{mermaid}
graph LR
    subgraph Final_Q_Matrix_Mappings
        S1[Skill_1] --- I3[Item 3]
        S1 --- I5[Item 5]
        S1 --- I7[Item 7]
        S1 --- I8[Item 8]
        
        S2[Skill_2] --- I2[Item 2]
        S2 --- I4[Item 4]
        S2 --- I6[Item 6]
        
        S3[Skill_3] --- I1[Item 1]
    end
    
    style Final_Q_Matrix_Mappings fill:#bfb,stroke:#333,stroke-width:2px
```
graph LR
    subgraph Final_Q_Matrix_Mappings
        S1[Skill_1] --- I3[Item 3]
        S1 --- I5[Item 5]
        S1 --- I7[Item 7]
        S1 --- I8[Item 8]
        
        S2[Skill_2] --- I2[Item 2]
        S2 --- I4[Item 4]
        S2 --- I6[Item 6]
        
        S3[Skill_3] --- I1[Item 1]
    end
    
    style Final_Q_Matrix_Mappings fill:#bfb,stroke:#333,stroke-width:2px
Figure 8: Final Q-Matirx

Key Strengths of the Final Q-Matrix and Diagram

  1. Clear Mapping:
    • Each item is assigned to the skill with the highest loading, ensuring that the relationships are driven by the statistical analysis.
    • The diagram visually highlights these relationships, making it easy to understand and communicate the structure.
  2. Skill Representation:
    • Skill 1: Represented by four items (Item 3, Item 5, Item 7, and Item 8), providing robust coverage and reliability for assessing this skill.
    • Skill 2: Supported by three items (Item 2, Item 4, and Item 6), with Item 6 being the strongest indicator.
    • Skill 3: Represented by Item 1, a highly specific item exclusively aligned with this skill.
  3. Alignment with Analyses:
    • The Q-matrix directly reflects the findings from the Factor Analysis heatmap and bar charts, ensuring consistency and validation of the mappings.
  4. Balanced Complexity:
    • By selecting three components, the Q-matrix strikes a balance between interpretability and detail, avoiding the over-complexity of a four-component model while capturing nuances missed in a two-component model.

Observations and Recommendations

  1. Strength of Item Representation:
    • Skill 3 relies on a single item (Item 1). While Item 1 has a strong loading, additional items (e.g., Item 5) may be needed to ensure the skill is robustly assessed.
    • Skill 2 shows moderate contributions from Item 2 and Item 4, which might require review to ensure their alignment with this skill.
  2. Ambiguous Items:
    • Item 5 has a mixed loading (moderate on Skill 1 and Skill 3), but its assignment to Skill 1 aligns well with the overall structure.
    • Item 4 has weaker loadings but is still included under Skill 2, reflecting its statistical alignment while acknowledging its relative ambiguity.

Model Evaluation Metrics

Calculating Proportion of Variance Explained (\(R^2\))

For Factor Analysis:

```{python}
# Compute the communalities
communalities = fa_model.get_communalities()

# Total variance explained
total_variance_explained = np.sum(communalities)

# Total variance (number of variables)
total_variance = item_data_scaled.shape[1]

# Proportion of variance explained
r_squared_fa = total_variance_explained / total_variance

print(f"Factor Analysis R^2: {r_squared_fa:.2f}")
```
Factor Analysis R^2: 0.56

Interpretation:

  • The \(R^2\) value of 0.56 indicates that the three-factor model explains 56% of the total variance in the data.
  • Implications:
    • A proportion of variance explained greater than 50% is generally considered acceptable in exploratory Factor Analysis, especially with psychological or educational data where constructs are often complex.
    • However, it also suggests that 44% of the variance is not explained by the model, which may be due to measurement error, unique variance of items, or additional latent factors not captured by the model.

For PCA:

```{python}
# Calculate cumulative variance explained
cumulative_variance = np.cumsum(pca_model.explained_variance_ratio_)
print(f"PCA cumulative variance explained by first 3 components: {cumulative_variance[2]:.2f}")
```
PCA cumulative variance explained by first 3 components: 0.66

Interpretation:

  • The first three principal components explain 66% of the total variance in the data.
  • Implications:
    • This indicates a slightly better variance explanation than the Factor Analysis model.
    • PCA aims to capture the maximum variance with the fewest components, so a higher cumulative variance explained is desirable.
    • However, PCA components may not be as interpretable as factors from Factor Analysis, since PCA components are linear combinations that maximize variance without considering underlying latent constructs.

Comparison:

  • The PCA model explains more variance (66%) compared to the Factor Analysis model (56%).
  • This difference may be due to the methodological differences between PCA and Factor Analysis:
    • PCA focuses on capturing variance and is sensitive to the scale of the data.
    • Factor Analysis models the underlying latent constructs and accounts for measurement error.

Considerations:

  • Adequacy of Variance Explained:
    • In social sciences, cumulative variance explained between 50% and 75% is generally acceptable.
    • Both models fall within this range, but there is room for improvement.
  • Unexplained Variance:
    • The unexplained variance suggests that additional factors or components might exist, or that some items do not fit well within the identified latent skills.

Calculating Cohen’s Kappa Coefficient

I also examined the consistency of item assignments across methods using Cohen’s kappa coefficient (Cohen 1960).

```{python}
from sklearn.metrics import confusion_matrix
from scipy.optimize import linear_sum_assignment

# Map skill labels to numeric codes for Factor Analysis
fa_skill_codes = final_q_matrix_df['Mapped_Skill'].map({'Skill_1': 0, 'Skill_2': 1, 'Skill_3': 2}).values

# K-Means cluster labels
kmeans_labels = kmeans.labels_

# Compute confusion matrix
confusion = confusion_matrix(fa_skill_codes, kmeans_labels)
print("Confusion Matrix:")
print(confusion)

# Align clusters with skills using the Hungarian algorithm
row_ind, col_ind = linear_sum_assignment(-confusion)
mapping = dict(zip(col_ind, row_ind))

# Map K-Means labels to Factor Analysis skill codes
kmeans_labels_mapped = np.array([mapping[label] for label in kmeans_labels])

# Compute Cohen's kappa
from sklearn.metrics import cohen_kappa_score

kappa = cohen_kappa_score(fa_skill_codes, kmeans_labels_mapped)
print(f"Cohen's kappa after alignment: {kappa:.2f}")
```
Confusion Matrix:
[[4 0 0]
 [0 3 0]
 [0 0 1]]
Cohen's kappa after alignment: 1.00

Interpretation:

  • Confusion Matrix:
    • The confusion matrix shows perfect agreement between the methods after alignment:
      • All items assigned to Skill 1 in Factor Analysis are also assigned to the corresponding cluster in K-Means.
      • The same applies to Skills 2 and 3.
  • Cohen’s Kappa Value:
    • A Kappa value of 1.00 indicates perfect agreement between the two methods after alignment.
  • Implications:
    • This high level of agreement suggests that both methods are consistently identifying the same underlying item-skill structures.
    • It provides strong validation for the robustness of your item-skill mappings.

Considerations:

  • Alignment Step:
    • The necessity of aligning clusters to skills underscores that cluster labels are arbitrary.
    • It’s important to perform this alignment to make meaningful comparisons.
  • Cohen’s Kappa Interpretation:
    • Kappa values range from -1 to 1, where:
      • < 0: Less than chance agreement.
      • 0–0.20: Slight agreement.
      • 0.21–0.40: Fair agreement.
      • 0.41–0.60: Moderate agreement.
      • 0.61–0.80: Substantial agreement.
      • 0.81–1.00: Almost perfect agreement.
    • A value of 1.00 confirms that the two methods are in complete concordance post-alignment.

Overall Evaluation

Strengths:

  • Converging Evidence:
    • The high Cohen’s Kappa value indicates that different analytical methods converge on the same item-skill mappings, enhancing confidence in the results.
  • Variance Explained:
    • Both Factor Analysis and PCA explain a substantial portion of the variance, supporting the validity of the three-component model.
  • Methodological Rigor:
    • My approach of using multiple methods and comparing them through quantitative metrics strengthens the robustness of the findings.

Limitations:

  • Variance Not Explained:
    • Approximately 34% to 44% of the variance remains unexplained, which could be due to:
      • Measurement error.
      • Additional latent skills not captured by the model.
      • Unique variances of items.
  • Assumptions of Methods:
    • Factor Analysis and PCA assumptions may not be fully met with binary data, which could affect the variance explained.

Verifying Item-Skill Mappings

```{python}
final_q_matrix_df
```
Table 9: Factor Analysis Mappings
Item Mapped_Skill
0 item1 Skill_3
1 item2 Skill_2
2 item3 Skill_1
3 item4 Skill_2
4 item5 Skill_1
5 item6 Skill_2
6 item7 Skill_1
7 item8 Skill_1

Interpretation:

  • Item Assignments: Each item is assigned to the skill with which it has the highest factor loading from the final Q-matrix.
  • Skill Representation:
    • Skill_1: Items 3, 5, 7, 8
    • Skill_2: Items 2, 4, 6
    • Skill_3: Item 1

Significance:

  • Consistent Mapping: The assignments reflect the conclusions drawn from my Factor Analysis.
  • Foundation for Comparison: These mappings serve as the reference point for comparing with the K-Means Clustering results.
```{python}
kmeans_q_matrix_df
```
Table 10: K-Means Clustering Mappings (before alignment)
Item Mapped_Skill
0 item1 Skill_3
1 item2 Skill_2
2 item3 Skill_1
3 item4 Skill_2
4 item5 Skill_1
5 item6 Skill_2
6 item7 Skill_1
7 item8 Skill_1

Interpretation:

  • Cluster Assignments: Items are assigned to clusters labeled as Skill_1, Skill_2, or Skill_3, based on the K-Means Clustering algorithm.
  • Arbitrary Labels: The cluster labels (e.g., Skill_1, Skill_2) are assigned by the algorithm and do not necessarily correspond to the skills identified in Factor Analysis.

Significance:

  • Initial Comparison: At first glance, the mappings appear similar to the Factor Analysis mappings, but due to arbitrary labeling, a direct comparison isn’t meaningful yet.
  • Need for Alignment: To accurately compare the item-skill assignments, cluster labels must be aligned with the skills from Factor Analysis.
```{python}
# Map clusters to skills after alignment
kmeans_skill_names_aligned = ['Skill_' + str(mapping[label] + 1) for label in kmeans_labels]
kmeans_q_matrix_df_aligned = kmeans_q_matrix_df.copy()
kmeans_q_matrix_df_aligned['Mapped_Skill'] = kmeans_skill_names_aligned
```

Process:

  • Alignment Using the Hungarian Algorithm:
    • Since cluster labels are arbitrary, I used the Hungarian algorithm (also known as the linear sum assignment method) to find the optimal one-to-one mapping between clusters and skills.
    • This algorithm minimizes the total disagreement between the two sets of labels.
  • Mapping Clusters to Skills:
    • I created a mapping dictionary (mapping) that aligns each cluster label with the corresponding skill from Factor Analysis.
    • This ensures that clusters are correctly interpreted in the context of the identified skills.
```{python}
kmeans_q_matrix_df_aligned
```
Table 11: K-Means Clustering Mappings (after alignment)
Item Mapped_Skill
0 item1 Skill_3
1 item2 Skill_2
2 item3 Skill_1
3 item4 Skill_2
4 item5 Skill_1
5 item6 Skill_2
6 item7 Skill_1
7 item8 Skill_1

Interpretation:

  • Aligned Assignments: After alignment, the cluster labels now correspond to the same skills as in the Factor Analysis mappings.
  • Perfect Agreement: The item-skill assignments from K-Means Clustering match exactly with those from Factor Analysis.

Significance:

  • Validation of Consistency: The perfect match indicates strong agreement between the two methods.
  • Robustness of Findings: The consistency across methods reinforces the reliability of the item-skill mappings.

Discussion

Overview of Model Comparison and Selection

Model Complexity and Interpretability

After comparing models with two, three, and four components, the three-component Factor Analysis model emerged as the most suitable representation of the latent skills in the dataset.

Two-Component Model

  • Simplicity: The two-component model is the simplest, reducing the latent skills to two factors.
  • Interpretability:
    • Some items showed weak loadings or ambiguous associations.
    • Item 1, for example, had very low loadings on both factors, suggesting it doesn’t fit well within this model.
  • Implications:
    • The model may be too simplistic, failing to capture important nuances in the data.
    • It potentially merges distinct skills into broader categories, which could obscure meaningful distinctions.

Three-Component Model

  • Balance: Offers a middle ground between simplicity and complexity.
  • Interpretability:
    • Provides clear and distinct latent skills.
    • Most items load strongly on a single factor, enhancing interpretability.
  • Findings:
    • The model captures the nuances in the data without unnecessary complexity.
    • Item 5 shows moderate loadings on two skills, indicating split influences but remains interpretable.

Four-Component Model

  • Complexity: Introduces additional complexity with a fourth factor.
  • Interpretability:
    • Overlapping loadings make the model harder to interpret.
    • Some items load significantly on multiple factors, causing ambiguity.
  • Implications:
    • The added complexity doesn’t substantially increase explained variance.
    • May overfit the data, capturing noise rather than meaningful structure.

Trade-Offs:

  • The two-component model may underfit, missing key distinctions between skills.
  • The four-component model may overfit, adding unnecessary complexity without practical benefits.

Optimal Complexity:

  • The three-component model strikes a balance, capturing essential structures while maintaining interpretability.

Variance Explained and Model Fit

Factor Analysis Variance Explained

  • Two-Component Model:
    • Lower proportion of variance explained (less than 56%).
    • Indicates insufficient capture of the data’s variability.
  • Three-Component Model:
    • Explains approximately 56% of the total variance.
    • Represents a reasonable fit for exploratory purposes.
  • Four-Component Model:
    • Slight increase in variance explained.
    • Not significant enough to justify added complexity.

PCA Variance Explained

  • Three-Component Model:
    • Cumulative variance explained is 66%.
    • Indicates a substantial capture of data variability.
  • Comparison:
    • PCA generally explains more variance than Factor Analysis in your findings.
    • However, PCA components may not be as interpretable in terms of latent skills.

Thresholds: In social sciences, explaining around 50-75% variance is acceptable.

Diminishing Returns: The variance explained by adding a fourth component doesn’t justify the increased complexity.

Model Fit: The three-component model provides an acceptable fit with reasonable simplicity.

Consistency Across Methods

Agreement Among Methods

  • Three-Component Model:
    • High consistency in item-skill mappings across Factor Analysis, K-Means Clustering, and PCA.
    • Cohen’s Kappa Coefficient of 1.00 after alignment indicates perfect agreement.
  • Two- and Four-Component Models:
    • Less consistent across methods.
    • Ambiguities in item assignments due to overlapping loadings.

Reinforcement:

  • Different methods converging on the same solution supports the robustness of the three-component model.

Practical Implications:

  • A consistent model is more reliable for educational applications, such as test design and interpretation.

Model Evaluation Metrics

Proportion of Variance Explained (\(R^2\))

  • Factor Analysis:
    • Three-Component Model (\(R^2\)): Approximately 0.56.
    • Indicates that 56% of the variance is captured by the model.
  • PCA:
    • Three-Component Model Cumulative Variance: 66%.
    • Suggests a better variance capture, but PCA components may be less interpretable.

Cohen’s Kappa Coefficient

  • Value: 1.00 after alignment.
  • Interpretation:
    • Indicates perfect agreement between item-skill mappings from Factor Analysis and K-Means Clustering.
  • Significance:
    • Validates the consistency and reliability of the three-component model.

Balance of Metrics:

  • The three-component model provides a good balance between variance explained and interpretability.

Limitations:

  • Acknowledge that a portion of variance remains unexplained.
  • Suggests potential areas for further investigation or alternative modeling approaches.

Final Model Selection

Reasons for Selecting the Three-Component Model

  • Optimal Balance:
    • Captures essential structures without overcomplicating the model.
  • High Interpretability:
    • Clear item-skill relationships make it practical for educational use.
  • Strong Validation:
    • Consistent findings across multiple methods reinforce its selection.
  • Model Performance:
    • Satisfactory variance explained and perfect agreement in item assignments.

Implications for the Q-Matrix

  • Robust Mapping:
    • The final Q-matrix derived from the three-component model provides a reliable item-skill mapping.
  • Educational Utility:
    • Enhances interpretability of test results.
    • Aids in identifying areas for instructional focus and intervention.

Justification for the Final Q-Matrix

Derivation from Multiple Methods

Integration of Analytical Findings

  • Factor Analysis: The Final Q-Matrix is primarily based on the results of the three-component Factor Analysis, where each item is assigned to the skill with the highest factor loading.

  • K-Means Clustering and PCA: The item-skill mappings derived from these methods align closely with the Factor Analysis results, reinforcing the assignments in the Final Q-Matrix.

    • Consistency in Item Groupings: Items that cluster together in K-Means and load on the same principal components in PCA correspond to the same skills identified in Factor Analysis.
  • Converging Evidence: The consistent findings across multiple methods provide strong evidence that the item-skill assignments in the Final Q-Matrix accurately reflect the underlying knowledge structure.

  • Robustness: Using different analytical techniques reduces the likelihood that the results are artifacts of a specific method, increasing confidence in the Q-Matrix.

Support from Model Evaluation Metrics

Variance Explained

  • Factor Analysis (\(R^2\)): The three-component model explains approximately 56% of the total variance.

  • PCA Variance: The first three principal components account for 66% of the variance.

Cohen’s Kappa Coefficient

  • Value of 1.00: Indicates perfect agreement between the item-skill mappings from Factor Analysis and K-Means Clustering after alignment.

  • Adequate Model Fit: The proportion of variance explained suggests that the model captures a substantial amount of the data’s variability, which is acceptable in exploratory analyses.

  • Validation of Mappings: The perfect Cohen’s Kappa score confirms that different methods agree on the item-skill assignments, supporting the validity of the Final Q-Matrix.

Balance of Complexity and Interpretability

Model Selection

  • Three-Component Model: Chosen for providing the best balance between capturing sufficient detail and maintaining simplicity.

  • Avoiding Overfitting: The four-component model introduced complexity without significant gains in variance explained, making it less interpretable.

  • Preventing Oversimplification: The two-component model failed to capture important nuances, with some items not fitting well.

  • Practical Interpretability: The three-component model allows for clear and distinct item-skill relationships, making the Q-Matrix practical for educational purposes.

Consistency Across Analytical Methods

Alignment of Results

  • Factor Analysis, K-Means Clustering, and PCA all indicate similar item-skill groupings.

  • Mermaid Diagrams and Heatmaps: Provide visual confirmation of the consistent item-skill relationships across methods.

  • Cross-Method Validation: Consistency across methods strengthens the argument that the Final Q-Matrix accurately represents the latent skills.

  • Reinforcement of Findings: Visual tools help illustrate the robustness of the mappings, making the justification more compelling.

Educational Relevance and Practicality

Actionable Insights: The Q-Matrix provides educators with clear information about which items assess which skills, facilitating targeted instruction and remediation.

Test Design Improvement: Understanding item-skill relationships helps in refining assessments to better measure the intended skills.

By understanding the relationships between items and skills, test designers can create assessments that more effectively target specific skills, ensuring a balanced coverage of the identified latent skills. The item-skill mappings can also help identify potentially redundant or less informative items, allowing for more efficient and focused assessments.

Moreover, educators can leverage the findings to diagnose student strengths and weaknesses at the skill level. The identification of specific skills associated with each item enables targeted remediation or enrichment activities, focusing on the areas where students may need additional support. This information can also guide the development of instructional materials and resources, ensuring that students have ample opportunities to practice and master the identified skills.

Limitations and Future Work

Despite the insights provided by this study, there are limitations to consider.

Acknowledging Split Influences

  • Item 5: Exhibits moderate loadings on both Skill 1 and Skill 3.

Justification:

  • Assignment Based on Dominant Loading: Despite the split influence, Item 5 is assigned to Skill 1 due to its higher loading, aligning with the overall structure.

  • Consideration for Revision: Recognizing the split influence allows for potential item revision to enhance its alignment with a single skill.

Ensuring Skill Representation

  • Skill 3: Currently represented by a single item (Item 1).

Justification:

  • Recognition of Limitations: Acknowledging that Skill 3 relies on a single item highlights an area for potential expansion in future assessments.

  • Maintaining Integrity: Despite the limited representation, the strong loading of Item 1 on Skill 3 justifies its inclusion in the Q-Matrix.

  • Binary Data Consideration:

    • The use of Factor Analysis and PCA on binary data may not fully meet the assumptions of these methods. Future research could explore the application of Item Response Theory (IRT) models specifically designed for analyzing binary response data (Van der Linden and Hambleton 2015).
  • Sample Size and Generalizability:

    • The small sample size of eight items limits the generalizability of the findings. Replicating the study with a larger set of items and a more diverse student population would help validate the identified skill structure and its applicability to different educational contexts.

Conclusion

This study significantly contributes to the field of educational assessment and learning analytics by demonstrating the effectiveness of a comprehensive, multi-method approach to uncovering latent skill structures in an eight-item test dataset. By leveraging the complementary strengths of Factor Analysis, K-Means Clustering, and Principal Component Analysis (PCA), I identified a robust and interpretable three-skill model that best represents the underlying knowledge structure.

Key findings of this study include:

  1. Identification of Three Distinct Latent Skills: These skills capture the essential relationships among the test items, providing a clearer understanding of the knowledge assessed.

  2. Development of a Final Q-Matrix: The Q-matrix offers a precise and empirically derived mapping of items to skills, consistent across multiple analytical methods, enhancing the reliability of skill assessment.

  3. Validation of Item-Skill Relationships: Cross-validation using multiple methods supports the interpretability of the identified skill structure, confirming the robustness of the findings.

The practical significance of this work lies in its potential to inform and enhance educational assessment and instructional practices. By providing a more precise understanding of the skills assessed by individual test items, this study enables educators and test designers to:

  • Develop Targeted Assessments: Create more focused and efficient assessments that effectively measure specific skills.
  • Identify Student Needs: Pinpoint areas where students may require additional support or remediation based on their performance on skill-related items.
  • Design Aligned Instructional Interventions: Develop instructional resources that align with the identified skill structure, promoting more personalized and adaptive learning experiences.

Moreover, the multi-method approach presented in this study serves as a valuable template for future research in educational data mining and learning analytics. Researchers can build upon this methodology to investigate knowledge structures underlying different types of assessments, learning materials, and educational contexts.

Future research should address this study’s limitations and explore new avenues for extending its findings. Specific opportunities include:

  1. Applying Item Response Theory (IRT) Models: Utilize IRT models, which are specifically designed to analyze binary response data, to validate and refine the identified skill structure.
  2. Expanding the Dataset: Replicate the study with larger and more diverse datasets, including assessments with a greater number of items and student populations from various educational backgrounds, to enhance generalizability.
  3. Exploring Generalizability Across Contexts: Investigate the applicability of the identified skill structure across different domains, grade levels, and assessment formats.
  4. Integrating with Adaptive Learning Systems: Explore the integration of the derived Q-matrix with adaptive learning systems and intelligent tutoring platforms to enable real-time, skill-based feedback and personalized learning paths.

By addressing these challenges and opportunities, future research can further advance our understanding of knowledge structure mapping and its applications in educational settings, ultimately contributing to the development of more effective and equitable learning experiences for all students.

Submission Guidelines

This document includes all required explanations. The code and data are organized to facilitate replication and further analysis. Please let me know if additional information is needed.

Back to top

References

Anthropic. 2024a. “Claude 3 Opus.” Large language model. https://claude.ai/.
———. 2024b. “Claude 3.5 Sonnet.” Large language model. https://claude.ai/.
Baker, Ryan Shaun Joazeiro de, Tiffany Barnes, and Joseph E Beck. 2008. “Educational Data Mining 2008.” In The 1st International Conference on Educational Data Mining Montréal.
Barnes, Tiffany. 2005. “The q-Matrix Method: Mining Student Response Data for Knowledge.” In American Association for Artificial Intelligence 2005 Educational Data Mining Workshop, 1–8. AAAI Press, Pittsburgh, PA, USA.
Beavers, Amy S, John W Lounsbury, Jennifer K Richards, Schuyler W Huck, Gary J Skolits, and Shelley L Esquivel. 2019. “Practical Considerations for Using Exploratory Factor Analysis in Educational Research.” Practical Assessment, Research, and Evaluation 18 (1): 6.
Chen, Penghe, Yu Lu, Vincent W Zheng, Xiyang Chen, and Boda Yang. 2018. “Knowedu: A System to Construct Knowledge Graph for Education.” Ieee Access 6: 31553–63.
Cohen, Jacob. 1960. “A Coefficient of Agreement for Nominal Scales.” Educational and Psychological Measurement 20 (1): 37–46.
Cukurova, Mutlu, Madiha Khan-Galaria, Eva Millán, and Rose Luckin. 2022. “A Learning Analytics Approach to Monitoring the Quality of Online One-to-One Tutoring.” Journal of Learning Analytics 9 (2): 105–20.
Google. 2024. “Gemini 1.5.” Large language model. https://gemini.google.com/.
Gordon, John L, and Lee Jorgensen. 2003. “Learning Support Using Knowledge Structure Maps.” In Meeting of Annual Conference 2003 Forum for the Advancement of Continuing Education, UK: University of Stirling. Citeseer.
Kargupta, Hillol, Weiyun Huang, Krishnamoorthy Sivakumar, and Erik Johnson. 2001. “Distributed Clustering Using Collective Principal Component Analysis.” Knowledge and Information Systems 3: 422–48.
OpenAI. 2024a. “GPT-4o.” Large language model. https://chatgpt.com/.
———. 2024b. “O1-Preview.” Large language model. https://chatgpt.com/.
Van der Linden, Wim J, and Ronald K Hambleton. 2015. Handbook of Item Response Theory. CRC press.
Watkins, Marley W. 2018. “Exploratory Factor Analysis: A Guide to Best Practice.” Journal of Black Psychology 44 (3): 219–46.