library(dplyr)
library(tidyr)
library(haven)
library(ggplot2)
library(ggalluvial)
library(kableExtra)
library(knitr)
library(writexl)
  1. He & von Davier (2016) Temelli Ağırlıklı Davranış Modeli
library(haven)
library(dplyr)

df <- read_sav("C:/Users/Lenovo/Desktop/long_data_clean_updated.sav")

df <- df %>%
  mutate(
    # 1. Davranış örüntüsü kodlama
    DavranisOruntusu = paste0(
      ifelse(QuickFirst == 1, "Q", ""),
      ifelse(HighReview == 1, "R", ""),
      ifelse(SolutionBehavior == 1, "S", "")
    ),
    DavranisOruntusu = ifelse(DavranisOruntusu == "", "None", DavranisOruntusu),

    # 2. Ağırlıklı işlem çabası skoru
    DavranisSkoru_Agirlikli = QuickFirst * 0.3 + HighReview * 1.0 + SolutionBehavior * 1.5,

    # 3. Ortalama skor
    OrtalamaSkor = mean(DavranisSkoru_Agirlikli, na.rm = TRUE),

    # 4. PET sınıflaması (Yetkin, Tahmin, YanlışAnladi, Dikkatsiz)
    PET = case_when(
      !is.na(Correctness) & !is.na(DavranisSkoru_Agirlikli) & Correctness == 1 & DavranisSkoru_Agirlikli >= OrtalamaSkor ~ "Yetkin",
      !is.na(Correctness) & !is.na(DavranisSkoru_Agirlikli) & Correctness == 1 & DavranisSkoru_Agirlikli < OrtalamaSkor ~ "Tahmin",
      !is.na(Correctness) & !is.na(DavranisSkoru_Agirlikli) & Correctness == 0 & DavranisSkoru_Agirlikli >= OrtalamaSkor ~ "YanlisAnladi",
      !is.na(Correctness) & !is.na(DavranisSkoru_Agirlikli) & Correctness == 0 & DavranisSkoru_Agirlikli < OrtalamaSkor ~ "Dikkatsiz",
      TRUE ~ NA_character_
    ),

    # 5. Tutarsiz profil kodlama
    Tahmin = ifelse(Correctness == 1 & QuickFirst == 1 & HighReview == 0 & SolutionBehavior == 0, 1, 0),
    SansliTahmin = ifelse(Correctness == 1 & QuickFirst == 1 & (HighReview == 1 | SolutionBehavior == 1), 1, 0),
    YanlisAnlama = ifelse(Correctness == 0 & DavranisSkoru_Agirlikli >= OrtalamaSkor, 1, 0),
    CevapYok = ifelse(ResponseGiven == 0, 1, 0),

    ProfilKodu = case_when(
      CevapYok == 1 ~ 4,
      Tahmin == 1 ~ 1,
      YanlisAnlama == 1 ~ 2,
      SansliTahmin == 1 ~ 3,
      TRUE ~ 0
    ),
    ProfilEtiketi = case_when(
      ProfilKodu == 0 ~ "Tutarsiz Degil",
      ProfilKodu == 1 ~ "Tahmin",
      ProfilKodu == 2 ~ "Yanlis Anlama",
      ProfilKodu == 3 ~ "Sansli Tahmin",
      ProfilKodu == 4 ~ "Cevap Yok"
    ),

    # 6. DDI Skoru ve etiketi
    DDI = abs(Correctness - (DavranisSkoru_Agirlikli / 3)),
    DDI_Etiket = case_when(
      DDI <= 0.25 ~ "Tutarsiz Degil",
      DDI > 0.25 & DDI <= 0.60 ~ "Kismi Tutarsizlik",
      DDI > 0.60 ~ "Yuksek Tutarsizlik"
    )
  )

Frekans ve Örüntü Dağılımı

Profil etiketi

df %>%
  count(ProfilEtiketi) %>%
  arrange(desc(n))

PET (Performance/Effort Typology)

Öğrencilerin sınav performansları ile işlem çabalarını birlikte değerlendirip 4 kategoride topladım.

Tahmin: Öğrenciler doğru cevap vermiş ancak işlem çabası düşük. Bu durum, doğru cevabın şans eseri verilmiş olabileceğini ya da öğrencinin konu hakkında yüzeysel bilgiye sahip olduğunu düşündürür.

Yanlış Anlama: Bu kategoriye giren öğrenciler yanlış cevap vermiş fakat yüksek düzeyde çaba göstermiş. Bu durum, öğrencinin soruya dikkatle yaklaştığını ancak konuyu kavrayamadığını ya da yanlış anladığını gösterir.

Dikkatsiz: Öğrenciler hem yanlış cevap vermiş hem de düşük çaba göstermiştir. Bu, öğrencinin motivasyon eksikliği yaşadığı ya da dikkatsiz davrandığı anlamına gelir.

df %>%
  count(PET) %>%
  arrange(desc(n))

Davranış Örüntüsü (Q, R, S) Dağılımı

Öğrencilerin sınav sırasında sergiledikleri işlem süreci temelli davranış örüntüleri incelendi. Davranış örüntüleri; hızlı yanıt verme (Q: QuickFirst), gözden geçirme yapma (R: HighReview) ve anlamlı çözüm üretme (S: SolutionBehavior) olmak üzere üç temel bileşenin varlığına göre tanımlandı. Her öğrenci, bu davranışların kombinasyonuna göre bir örüntü etiketi aldı.

df %>%
  count(DavranisOruntusu) %>%
  arrange(desc(n))

Elde edilen frekans dağılımına göre:

. S (n = 42.012): En yaygın örüntü, yalnızca anlamlı çözüm davranışı gösteren öğrencilerdir. Bu durum, öğrencilerin önemli bir kısmının sorulara bilişsel çaba harcayarak yaklaştığını göstermektedir.

. None (n = 22.002): İkinci en yaygın örüntü, hiçbir stratejik davranış göstermeyen öğrencilerden oluşmaktadır. Bu gruptakiler ne hızlı yanıt vermiş ne gözden geçirme yapmış ne de anlamlı çözüm üretmiştir. Bu durum, düşük çaba veya motivasyon eksikliği ile ilişkili olabilir.

. Q (n = 16.579) ve R (n = 16.578): Sadece hızlı yanıt veren ya da yalnızca gözden geçirme yapan öğrenciler neredeyse eşit sayıda yer almıştır. Bu bulgu, öğrenciler arasında belirli stratejilerin tek başına kullanımının oldukça yaygın olduğunu göstermektedir.

. QR (n = 10.284): Hem hızlı yanıt verip hem de gözden geçirme yapan öğrenciler daha sınırlı sayıdadır. Bu örüntü, hızlı karar alıp sonrasında yanıtını gözden geçirme eğilimini yansıtabilir.

. NANANA (n = 1.667): Bu değer, eksik veri veya kodlama hatasından mı kaynaklandı? neden oldu anlamadım.

Grafik: Profil Etiketi Dağılımı

ggplot(df, aes(x = ProfilEtiketi)) +
  geom_bar(fill = "skyblue") +
  labs(title = "Discrepant Profil Etiketi Dağılımı", x = "Profil", y = "Frekans")

Doğruluk (Correctness) ile Ağırlıklı Skor İlişkisi

Öğrencinin doğru cevap verip vermemesi, davranış skoru ile ilişkili mi? (He & von Davier (2016), Goldhammer & Naumann (2011)

ggplot(df, aes(x = as.factor(Correctness), y = DavranisSkoru_Agirlikli)) +
  geom_violin(trim = FALSE, fill = "lightblue") +
  stat_summary(fun = "mean", geom = "point", shape = 21, size = 3, fill = "red") +
  labs(x = "Doğruluk (0 = Yanlış, 1 = Doğru)", y = "Ağırlıklı Davranış Skoru",
       title = "Correctness'e Göre Davranış Skoru Dağılımı (Violin Plot)")
## Warning: Removed 1667 rows containing non-finite outside the scale range
## (`stat_ydensity()`).
## Warning: Removed 1667 rows containing non-finite outside the scale range
## (`stat_summary()`).

df %>%
  group_by(Correctness) %>%
  summarise(Ortalama_Skor = mean(DavranisSkoru_Agirlikli, na.rm = TRUE)) %>%
  ggplot(aes(x = as.factor(Correctness), y = Ortalama_Skor, fill = as.factor(Correctness))) +
  geom_bar(stat = "identity") +
  labs(x = "Doğruluk", y = "Ortalama Davranış Skoru",
       title = "Doğru ve Yanlış Yanıtlarda Ortalama Davranış Skoru") +
  theme_minimal()

t.test(DavranisSkoru_Agirlikli ~ Correctness, data = df)
## 
##  Welch Two Sample t-test
## 
## data:  DavranisSkoru_Agirlikli by Correctness
## t = -10.889, df = 88854, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -0.05084307 -0.03533138
## sample estimates:
## mean in group 0 mean in group 1 
##       0.9052720       0.9483592

PET ve Profil Etiketinin Uyum Analizi

PET sınıflaması ile davranış temelli profiller örtüşüyor mu? (Shin et al. (2022), Kroehne & Goldhammer (2018)

# Çapraz Tablo
table(df$PET, df$ProfilEtiketi)
##               
##                Cevap Yok Sansli Tahmin Tahmin Tutarsiz Degil Yanlis Anlama
##   Dikkatsiz            0             0      0          21557             0
##   Tahmin               0             0   5858           7110             0
##   YanlisAnladi         0             0      0              0         37244
##   Yetkin               0          4060      0          22923             0
# Mozaik Grafik
ggplot(df, aes(x = PET, fill = ProfilEtiketi)) +
  geom_bar(position = "fill") +
  labs(y = "Oran", title = "PET vs. Profil Etiketi") +
  theme_minimal()

DDI Tutarsızlık Seviyesi Dağılımı

DDI değerlerine göre öğrenci dağılımı ve yayılımı (He et al. (2014); Naumann (2019)

df %>%
  filter(!is.na(DDI)) %>%
  ggplot(aes(x = as.factor(Correctness), y = DDI)) +
  geom_boxplot() +
  labs(x = "Doğruluk (0=Yanlış, 1=Doğru)", y = "DDI", title = "Doğruluk Bazında DDI Dağılımı")

df %>%
  filter(!is.na(DDI)) %>%
  ggplot(aes(x = DDI)) +
  geom_histogram(bins = 30, fill = "gray") +
  labs(title = "DDI (Tutarsızlık Endeksi) Dağılımı", x = "DDI Skoru", y = "Frekans")

# DDI Etiket frekansı
df %>%
  count(DDI_Etiket)

PET Gruplarında Davranış Skoru Karşılaştırması

PET grupları süreç skorunda farklılık gösteriyor mu?

# Boxplot: PET'e göre Davranış Skoru
# Eksik değerleri filtreleyerek boxplot çiz
df %>%
  filter(!is.na(DavranisSkoru_Agirlikli), !is.na(PET)) %>%
  ggplot(aes(x = PET, y = DavranisSkoru_Agirlikli)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "PET Gruplarına Göre İşlem Skoru", x = "PET Grubu", y = "Ağırlıklı Skor")

# ANOVA testi
anova_model <- aov(DavranisSkoru_Agirlikli ~ PET, data = df)
summary(anova_model)
##                Df Sum Sq Mean Sq F value Pr(>F)    
## PET             3  34096   11365  318725 <2e-16 ***
## Residuals   98748   3521       0                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 10370 observations deleted due to missingness
  1. Dagilim Tablolari
library(dplyr)
library(knitr)
library(kableExtra)

df %>%
  filter(!is.na(DDI_Etiket)) %>%
  count(DDI_Etiket) %>%
  mutate(
    Yuzde = round(100 * n / sum(n), 1),
    DDI_Etiket = factor(DDI_Etiket, levels = c("Tutarsiz Degil", "Kismi Tutarsizlik", "Yuksek Tutarsizlik"))
  ) %>%
  arrange(DDI_Etiket) %>%
  kable(
    caption = "Tablo 1. Dual Discrepancy Index (DDI) Etiket Dagilimi",
    col.names = c("DDI Seviyesi", "Frekans", "Yuzde (%)"),
    format = "html"
  ) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tablo 1. Dual Discrepancy Index (DDI) Etiket Dagilimi
DDI Seviyesi Frekans Yuzde (%)
Tutarsiz Degil 21557 21.8
Kismi Tutarsizlik 57163 57.9
Yuksek Tutarsizlik 20032 20.3

Profil Dagilimi

df %>%
  filter(!is.na(ProfilEtiketi)) %>%
  count(ProfilEtiketi) %>%
  mutate(
    Yuzde = round(100 * n / sum(n), 1),
    ProfilEtiketi = factor(ProfilEtiketi,
                           levels = c("Tutarsiz Degil", "Tahmin", "Yanlis Anlama", "Sansli Tahmin", "Cevap Yok"))
  ) %>%
  arrange(ProfilEtiketi) %>%
  kable(
    caption = "Tablo 2. Davranissal Profil Etiketlerinin Dagilimi",
    col.names = c("Profil", "Frekans", "Yuzde (%)"),
    format = "html"
  ) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tablo 2. Davranissal Profil Etiketlerinin Dagilimi
Profil Frekans Yuzde (%)
Tutarsiz Degil 51590 47.3
Tahmin 5858 5.4
Yanlis Anlama 37244 34.1
Sansli Tahmin 4060 3.7
Cevap Yok 10370 9.5
  1. Geçiş ve Cinsiyet Analizleri

PET × Profil

df %>%
  filter(!is.na(PET), !is.na(ProfilEtiketi)) %>%
  count(PET, ProfilEtiketi) %>%
  pivot_wider(names_from = ProfilEtiketi, values_from = n, values_fill = 0) %>%
  kable(
    caption = "Tablo 3. PET × Profil Etiketleri Geçiş Tablosu",
    format = "html"
  ) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tablo 3. PET × Profil Etiketleri Geçiş Tablosu
PET Tutarsiz Degil Tahmin Yanlis Anlama Sansli Tahmin
Dikkatsiz 21557 0 0 0
Tahmin 7110 5858 0 0
YanlisAnladi 0 0 37244 0
Yetkin 22923 0 0 4060

DDI x Cinsiyet

library(dplyr)
library(tidyr)
library(knitr)
library(kableExtra)

df %>%
  filter(!is.na(DDI_Etiket), !is.na(ITSEX), ITSEX %in% c(1, 2)) %>%
  mutate(
    DDI_Etiket = factor(DDI_Etiket, levels = c("Tutarsiz Degil", "Kismi Tutarsizlik", "Yuksek Tutarsizlik"))
  ) %>%
  count(ITSEX, DDI_Etiket) %>%
  group_by(ITSEX) %>%
  mutate(Yuzde = round(100 * n / sum(n), 1)) %>%
  ungroup() %>%
  pivot_wider(names_from = DDI_Etiket, values_from = Yuzde, values_fill = 0) %>%
  mutate(Cinsiyet = recode(ITSEX, `1` = "Erkek", `2` = "Kadin")) %>%
  select(Cinsiyet, `Tutarsiz Degil`, `Kismi Tutarsizlik`, `Yuksek Tutarsizlik`) %>%
  kable(
    caption = "Tablo 4. Cinsiyete Göre DDI Dagilimi (Yüzde)",
    col.names = c("Cinsiyet", "Tutarsiz Degil (%)", "Kismi Tutarsizlik (%)", "Yuksek Tutarsizlik (%)"),
    format = "html"
  ) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tablo 4. Cinsiyete Göre DDI Dagilimi (Yüzde)
Cinsiyet Tutarsiz Degil (%) Kismi Tutarsizlik (%) Yuksek Tutarsizlik (%)
Erkek 22.3 0.0 0.0
Erkek 0.0 58.4 0.0
Erkek 0.0 0.0 19.4
Kadin 21.4 0.0 0.0
Kadin 0.0 57.4 0.0
Kadin 0.0 0.0 21.2
  1. Alluvial / Sankey Grafikleri

PET → Profil

library(ggalluvial)
library(ggplot2)

df %>%
  filter(!is.na(PET), !is.na(ProfilEtiketi)) %>%
  count(PET, ProfilEtiketi) %>%
  ggplot(aes(axis1 = PET, axis2 = ProfilEtiketi, y = n)) +
  geom_alluvium(aes(fill = PET), width = 1/12) +
  geom_stratum(width = 1/12, fill = "gray90", color = "black") +
  geom_text(stat = "stratum", aes(label = after_stat(stratum)), size = 3) +
  scale_x_discrete(limits = c("PET", "Profil"), expand = c(.1, .1)) +
  labs(title = "Sekil 1. PET → Profil Etiketleri Sankey Grafigi",
       x = NULL, y = "Frekans") +
  theme_minimal()
## Warning in to_lodes_form(data = data, axes = axis_ind, discern =
## params$discern): Some strata appear at multiple axes.
## Warning in to_lodes_form(data = data, axes = axis_ind, discern =
## params$discern): Some strata appear at multiple axes.
## Warning in to_lodes_form(data = data, axes = axis_ind, discern =
## params$discern): Some strata appear at multiple axes.