PROJEKT

Përpunimi i të dhënave mbi performancën e studentëve.

Amanda Buzhiqi, Helga Metra.

Departamenti i Matematikës së Aplikuar, Fakulteti i Shkencave të Natyrës,

Universiteti i Tiranës, Shqipëri.

e-mail- amanda.buzhiqi@fshnstudent.infohelga.metra@fshnstudent.info

Ne kete projekt kemi studiuar performancen e  266 studenteve. Secili prej studenteve eshte pergjigjur mbi disa pyetje per moshen, gjinine, oret e studimit ne jave etj. Databaza permban 3 ndryshore cilesore dhe 3 ndryshore sasiore. Ndryshoret cilesore perfshijne gjinine, nivelin e arsimit te prinderve, aksin ne internet, kurrikulen plus te studenteve dhe nese ato kane kaluar vitin apo jo. Ndryshoret sasiore perfshijne moshen, oret e studimit ne jave, pjesemarrjen ne mesim, rezultatet e meparshme dhe rezultatet finale te studenteve. Nje pjese permbledhese e te dhenave paraqitet me poshte.

Importimi i te dhenave:

library(readxl)
student_performance <- read_excel("C:/Users/Lenovo/Downloads/student_performance.xlsx")
head(student_performance)
## # A tibble: 6 × 11
##   student_id gender   age study_hours_per_week attendance_rate parent_education
##   <chr>      <chr>  <dbl>                <dbl>           <dbl> <chr>           
## 1 STU0001    Male      15                   25            63.8 Bachelor        
## 2 STU0002    Female    15                    2            54.7 Bachelor        
## 3 STU0003    Female    19                   10            90.5 High School     
## 4 STU0004    Male      16                   26            66.8 High School     
## 5 STU0005    Female    15                   25            73   High School     
## 6 STU0006    Female    19                    8            85.2 High School     
## # ℹ 5 more variables: internet_access <chr>, extracurricular <chr>,
## #   previous_score <dbl>, final_score <dbl>, passed <chr>

Per te pare karakteristikat e seciles ndryshore perdorim funksionin e meposhtem dhe rezultatet paraqiten si ne vijim ku veme re ndryshoret cilesore dhe ato sasiore.

str(student_performance)
## tibble [266 × 11] (S3: tbl_df/tbl/data.frame)
##  $ student_id          : chr [1:266] "STU0001" "STU0002" "STU0003" "STU0004" ...
##  $ gender              : chr [1:266] "Male" "Female" "Female" "Male" ...
##  $ age                 : num [1:266] 15 15 19 16 15 19 18 15 19 15 ...
##  $ study_hours_per_week: num [1:266] 25 2 10 26 25 8 10 21 9 8 ...
##  $ attendance_rate     : num [1:266] 63.8 54.7 90.5 66.8 73 85.2 72.7 81.7 84.2 95.7 ...
##  $ parent_education    : chr [1:266] "Bachelor" "Bachelor" "High School" "High School" ...
##  $ internet_access     : chr [1:266] "Yes" "Yes" "Yes" "No" ...
##  $ extracurricular     : chr [1:266] "Yes" "Yes" "No" "Yes" ...
##  $ previous_score      : num [1:266] 41 83 73 75 67 40 75 89 70 93 ...
##  $ final_score         : num [1:266] 67 28 49 70 77 37 42 70 49 56 ...
##  $ passed              : chr [1:266] "Yes" "No" "No" "Yes" ...

Analiza e ndryshoreve:

Gjinia = student_performance$gender
length(which(Gjinia == "Female")) #Sa persona jane vajza
## [1] 146
length(which(Gjinia == "Male")) #Sa persona jane djem
## [1] 120

Nga rezultati veme re se 146 studente jane vajza dhe 120 studente jane djem.

Mosha = student_performance$age #shenoj te dhenat e ndryshores mosha te databazes ne nje vektor te ri
summary(Mosha) #karakteristikat numerike te moshes
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   15.00   16.00   17.00   17.02   18.00   19.00

Veme re se mosha mesatare eshte 17, minimumi eshte 15, ndersa mosha maksimale eshte 19.

Oret_e_studimit_ne_jave = student_performance$study_hours_per_week
summary(Oret_e_studimit_ne_jave) #karakteristikat numerike
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    9.00   16.00   15.84   23.00   30.00

Sipas te dhenave oret mesatare te studimit ne jave jane 16, minimumi eshte 2, ndersa maximumi eshte 30 ore.

pjesemarrja = student_performance$attendance_rate
summary(pjesemarrja) #karakteristikat numerike
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   50.20   64.42   75.75   76.10   88.00   99.90

Pjesemarrja mesatare e studenteve eshte 76%, minimumi eshte 50% dhe maximumi eshte 100%.

arsimi_i_prindit = student_performance$parent_education
length(which(arsimi_i_prindit == "None"))
## [1] 58
length(which(arsimi_i_prindit == "High School"))
## [1] 52
length(which(arsimi_i_prindit == "Bachelor"))
## [1] 49
length(which(arsimi_i_prindit == "Master"))
## [1] 49
length(which(arsimi_i_prindit == "PhD"))
## [1] 58

Nga rezultati veme re se 58 prinder nuk kane mbaruar asnje arsim, 52 kane mbaruar shkollen e mesme, 49 kane mbaruar bachelor, 49 kane mbaruar master dhe 58 kane mbaruar doktoraturen.

aksesi_ne_internet = student_performance$internet_access
table(aksesi_ne_internet)
## aksesi_ne_internet
##  No Yes 
## 131 135

Ne tabelen e mesiperme vihet re qe 131 studente nuk kane akses ne internet, ndersa 135 studente kane akses ne internet.

kurrikul_plus = student_performance$extracurricular
table(kurrikul_plus)
## kurrikul_plus
##  No Yes 
## 135 131

Ne tabelen e treguar me siper tregohet qe 135 studente nuk kane kurrikul plus, ndersa 131 studente kane kurrikule plus.

rezultat_i_meparshem = student_performance$previous_score 
summary(rezultat_i_meparshem) #karakteristikat numerike
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   30.00   46.00   65.00   62.85   79.00   95.00

Sipas te dhenave te mesiperme, rezultatet e meparshme jane mesatarisht 63%, minimumi 30%, maksimumi 95%.

rezultati_final = student_performance$final_score
summary(rezultati_final) #karakteristikat numerike
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   20.00   44.25   57.00   56.33   69.00   91.00

Sipas te dhenave te siperpermendura, rezultati final eshte mesatarisht 56%, minimumi 20%, maksimumi 91%.

kalues = student_performance$passed
table(kalues)
## kalues
##  No Yes 
##  91 175

Ne tabelen e mesiperme, 91 studente nuk kane kaluar, ndersa 175 studente kane kaluar.

Analiza e ndryshoreve ne teresi mund te realizohet dhe me ane te funksionit summary(student_performance). Rezultatet paraqiten me poshte:

summary(student_performance) #karakteristikat numerike
##      student_id        gender         age        study_hours_per_week
##  Length   :266   Length   :266   Min.   :15.00   Min.   : 2.00       
##  N.unique :266   N.unique :  2   1st Qu.:16.00   1st Qu.: 9.00       
##  N.blank  :  0   N.blank  :  0   Median :17.00   Median :16.00       
##  Min.nchar:  7   Min.nchar:  4   Mean   :17.02   Mean   :15.84       
##  Max.nchar:  7   Max.nchar:  6   3rd Qu.:18.00   3rd Qu.:23.00       
##                                  Max.   :19.00   Max.   :30.00       
##  attendance_rate  parent_education  internet_access  extracurricular
##  Min.   :50.20   Length   :266     Length   :266    Length   :266   
##  1st Qu.:64.42   N.unique :  5     N.unique :  2    N.unique :  2   
##  Median :75.75   N.blank  :  0     N.blank  :  0    N.blank  :  0   
##  Mean   :76.10   Min.nchar:  3     Min.nchar:  2    Min.nchar:  2   
##  3rd Qu.:88.00   Max.nchar: 11     Max.nchar:  3    Max.nchar:  3   
##  Max.   :99.90                                                      
##  previous_score   final_score          passed   
##  Min.   :30.00   Min.   :20.00   Length   :266  
##  1st Qu.:46.00   1st Qu.:44.25   N.unique :  2  
##  Median :65.00   Median :57.00   N.blank  :  0  
##  Mean   :62.85   Mean   :56.33   Min.nchar:  2  
##  3rd Qu.:79.00   3rd Qu.:69.00   Max.nchar:  3  
##  Max.   :95.00   Max.   :91.00

Grafiket dhe tabelat statistikore.

Per ndryshoret e databazes mund te ndertojme grafike te efektivave, frekuencave si dhe tabelat statistikore.

barplot(sort(table(Gjinia)),col=c("deepskyblue","pink"),xlab = "Gjinia", ylab = "Efektivat", main = "Grafiku i efektivave per gjinine")

Ne grafikun e mesiperm veme re se shumica e studenteve jane vajza, megjithate diferenca mes vajzave dhe djemve nuk eshte shume e madhe.

barplot(sort(table(arsimi_i_prindit)),col=c ("purple", "orchid","violet","plum","thistle"), xlab = "Arsimi i prindit", ylab = "Efektivat", main = "Grafiku i efektivave per nivelin e arsimit te prindit")

Ne grafikun e mesiperm eshte dhene qe prindrit e studenteve pa arsim dhe ato me PhD jane ne te njejtin numer.

barplot(sort(table(aksesi_ne_internet)),col=c("red","darkred"),xlab = "Aksesi ne internet", ylab = "Efektivat", main = "Grafiku i efektivave per aksesin ne internet")

Shumica e studenteve kane akses ne internet, megjithate ka nje perqindje te madhe te atyre qe nuk kane akses ne internet.

barplot(sort.default(table(kurrikul_plus)),col=c("bisque4","bisque"),xlab = "Kurrikul plus", ylab = "Efektivat", main = "Grafiku i efektivave per kurrikulin plus")

Ne grafikun e siper permendur shfaqet qe shumica e studenteve nuk kane kurrikul plus, por perqindja e atyre qe kane kurrikul plus eshte e larte.

barplot(sort.default(table(kalues)),col=c("aquamarine","aquamarine4"),xlab = "Kalues", ylab = "Efektivat", main = "Grafiku i efektivave per studentet kalues")

Ne grafikun e mesiperm vihet re se 2/3 e studenteve jane kalues.

Per te ndertuar tabela statistikore per ndryshore sasiore te vazhdueshme sic eshte rezultati i meparshem ne duhet te krijojme fillimisht intervalet ose klasat. Duke ditur qe rezultati minimal eshte 30 dhe rezultati maksimal eshte 100, atehere fillojme intervalet nga 30 me gjatesi 10. Ne total do te kemi 7 klasa.

Tab=table(cut(student_performance$previous_score ,breaks = c(30,40,50,60,70,80,90,100)))
V=c(Tab)
df=data.frame(Efektivat=V,Efektivat_grumbulluar=cumsum(V),Freq=V/sum(V),Freq_grumbulluar=cumsum(V/sum(V)))
df
##          Efektivat Efektivat_grumbulluar       Freq Freq_grumbulluar
## (30,40]         43                    43 0.16287879        0.1628788
## (40,50]         45                    88 0.17045455        0.3333333
## (50,60]         30                   118 0.11363636        0.4469697
## (60,70]         52                   170 0.19696970        0.6439394
## (70,80]         29                   199 0.10984848        0.7537879
## (80,90]         43                   242 0.16287879        0.9166667
## (90,100]        22                   264 0.08333333        1.0000000

Duke u bazuar ne ndertimin e klasave per ndryshoren sasiore te vazhdueshme (rezultatin e meparshem) mund te ndertojme nje grafik rrethor per frekuencat.

V <- c(Tab)
names(V) <- c("30-40","40-50","50-60","60-70","70-80","80-90","90-100")
rezultat_i_meparshem <- round(V/sum(V)*100,1)
rezultat_i_meparshem <- paste(rezultat_i_meparshem,"%",sep="")
ngjyrat=rainbow(length(V))
pie(V, main = "Ndarja e studenteve sipas rezultateve te meparshme", col=ngjyrat,labels=rezultat_i_meparshem)
legend("bottomleft", names(V),fill = ngjyrat)

Nga grafiku veme re se shumica e studenteve e kane rezultatin nga 60 ne 70. Perafersisht 8% kane rezultatet nga 90 deri ne 100 dhe 16% jane studentet qe kane rezultatet 30-40.

Per ndryshoret gjinia dhe nivelin e arsimit te prindit paraqiten me poshte tabelat statistikore qe permbajne efektivat, efektivat e grumbulluar, frekuencat dhe frekuencat e grumbulluar.

Tab=table(Gjinia)
V=c(Tab)
df=data.frame(Efektivat=V,Efektivat_grumbulluar=cumsum(V),Freq=V/sum(V),Freq_grumbulluar=cumsum(V/sum(V)))
df
##        Efektivat Efektivat_grumbulluar      Freq Freq_grumbulluar
## Female       146                   146 0.5488722        0.5488722
## Male         120                   266 0.4511278        1.0000000
Tab=table(arsimi_i_prindit)
V=c(Tab)
df=data.frame(Efektivat=V,Efektivat_grumbulluar=cumsum(V),Freq=V/sum(V),Freq_grumbulluar=cumsum(V/sum(V)))
df 
##             Efektivat Efektivat_grumbulluar      Freq Freq_grumbulluar
## Bachelor           49                    49 0.1842105        0.1842105
## High School        52                   101 0.1954887        0.3796992
## Master             49                   150 0.1842105        0.5639098
## None               58                   208 0.2180451        0.7819549
## PhD                58                   266 0.2180451        1.0000000

Tabelat statistikore mund te ndertohen dhe me ane te funksionit freq() te paketes summarytools.

library(summarytools)
freq(Gjinia)
## Frequencies  
## Gjinia  
## Type: Character  
## 
##                Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ------------ ------ --------- -------------- --------- --------------
##       Female    146     54.89          54.89     54.89          54.89
##         Male    120     45.11         100.00     45.11         100.00
##         <NA>      0                               0.00         100.00
##        Total    266    100.00         100.00    100.00         100.00

Me lart eshte ndertuar tabela per gjinine, ku ne shtyllen e pare kemi efektivat, ne shtyllen e dyte frekeuncat ose dendurite relative. Ne shtyllen e trete kemi frekuencat e grumbulluara. Tabela afishon gjithashtu nese kemi vlera te munguara ose jo.

Grafiket kuti:

Per ndryshoret sasiore kemi ndertuar grafiket kuti nga ku mund te dallojme dhe vlerat ekstreme.

par(mfrow=c(1,3))
boxplot(Mosha,main="Mosha", col = "#CD1076")
boxplot(Oret_e_studimit_ne_jave,main="Oret_e_studimit_ne_jave", col="#79CDCD")
boxplot(rezultati_final,main="rezultati_final", col="#8968CD")

Nga grafiket veme re se nuk kemi vlera ekstremale. Per te pare shperndarjen e rezultateve finale mund te ndertojme nje grafik te densitetit per rezultatin final. Grafiku paraqitet me poshte.

library(ggplot2)
ggplot(data=student_performance, aes(x=rezultati_final))+geom_density(size=1.5, fill="skyblue", alpha=0.3)+labs(y="Densiteti",x="rezultati_final",title = "Densiteti per rezultatin final") +theme(plot.title=element_text(color="black",face="bold.italic",size=18, hjust = 0.5))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Grafiku tregon nje shperndarje asimetrike ne te majte ose me dy maja te lehta. Shumica e rezultateve jane te perqendruara midis vlerave 40 dhe 80. Pika me e larte e densitetit (mbi 0.020) ndodhet afer rezultatit 70, me nje rritje tjeter te ndjeshme rreth vleres 45.

library(moments)
kurtosis(rezultati_final)
## [1] 2.284771

Grafikun e densitetit mund ta ndertojme dhe per ndryshoren mosha, per te pare shperndarjen e moshave te studenteve.

ggplot(data=student_performance, aes(x=Mosha))+geom_density(size=1.5, fill="green", alpha=0.3)+labs(y="Densiteti",x="Mosha",title = "Densiteti per moshat") +theme(plot.title=element_text(color="black",face="bold.italic",size=18, hjust= 0.5))

Ne grafikun e mesiperm shperndarja eshte pothuajse uniforme, pasi densiteti qendron relativisht i qendrueshem (midis 0.18 dhe 0.23) per te gjitha moshat. Pika me e larte e densitetit ndodhet saktesisht ne moshen 17 vjeç.

Korrelacionet mes ndryshoreve:

Midis ndryshoreve sasiore mund te shohim lidhjen mes tyre nepermjet korrelacioneve.

#Importojme paketat per ndertimin e grafikut te korrelacioneve

library(corrplot)
## corrplot 0.95 loaded
library(GGally)
library(dplyr) #paketa per manipulime te databazes
## 
## 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
library(dplyr)

Model <- student_performance %>% select(age, study_hours_per_week, final_score)
cor.mat <- cor(Model)
cor.mat
##                              age study_hours_per_week final_score
## age                   1.00000000          -0.06630896 -0.07843102
## study_hours_per_week -0.06630896           1.00000000  0.80855230
## final_score          -0.07843102           0.80855230  1.00000000

Nga matrica e korrelacioneve vihet re nje vlere korrelacioni e forte mes oreve te studimit ne jave dhe rezultatit final. Korrelacionet mund te shqyrtohen dhe me ane te grafikeve.

ggpairs(Model)

Ne grafikun e mesiperm veme re se ne diagonalen kryesore paraqiten densitetet e ndryshoreve. Poshte diagonales paraqiten grafiket scatter plot qe sherbejne per te analizuar lidhjen mes ndryshoreve. Ne diagonalen e siperme jane vlerat e korrelacioneve.

Reja e pikave:

Pasi kemi studiuar korelacionet mes ndryshoreve ne duam te dime nese mund te parashikojme rezultatin final te nje studenti ne varesi te oreve te studimit ne jave. Kjo mund te realizohet nepermjet ndertimit te drejtezes se regresit te thjeshte ku si ndryshore te varur marrim rezultatin final dhe ndryshore te pavarur marrim oret e studimit. Para se te ndertojme drejtezen e regresit shqyrtojme rene e pikave.

ggplot(student_performance, aes( x = Oret_e_studimit_ne_jave, y = rezultati_final)) + geom_point( color = "violet") +
ggtitle('Reja e pikave')

Edhe nga reja e pikave veme re se kemi nje korrelacion te forte pozitiv mes ndryshoreve.

Drejteza e regresit:

Duke u mbeshtetur ne analizen e mesiperme mund te ndertojme drejtezen e regresit te thjeshte linear mes rezultatit final dhe oreve te studimit ne jave.

Model_reg <- lm(rezultati_final ~ Oret_e_studimit_ne_jave, data = student_performance)
summary(Model_reg)
## 
## Call:
## lm(formula = rezultati_final ~ Oret_e_studimit_ne_jave, data = student_performance)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -21.8586  -6.4144   0.5263   6.5573  20.4369 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             33.03035    1.17984   28.00   <2e-16 ***
## Oret_e_studimit_ne_jave  1.47079    0.06588   22.33   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.976 on 264 degrees of freedom
## Multiple R-squared:  0.6538, Adjusted R-squared:  0.6524 
## F-statistic: 498.5 on 1 and 264 DF,  p-value: < 2.2e-16

Nga te dhenat e mesiperme veme re se ekuacioni i regresit eshte:

Rezultati_i_ perfundimit = 1.47079* oret_e_studimit + 33.03035

Drejteza e regresit paraqitet grafikisht dhe me poshte:

library(ggpubr)
Grafiku<-ggplot(student_performance, aes(x = Oret_e_studimit_ne_jave,y = rezultati_final))+
geom_point(size=1,color="blue")+
geom_smooth(method="lm",color="black",formula = y~x)+
stat_cor(label.x = 5,label.y = 90)+
stat_regline_equation(label.x = 5,label.y = 100,size=4)+
labs(x="Oret e studimit ne jave",y="Rezultati final",title="Regresi i thjeshte linear")
Grafiku

Me lart parqitet drejteza e regresit linear dhe ekuacioni. R = 0.81 eshte vlera e korrelacionit mes rezultatit perfundimtar dhe oreve te studimit.

Tabelat e kontigjences:

Tabelat e kontigjences bejne te mundur paraqitjen e dy serive statistikore ne menyre te kryqezuar. Me poshte parqitet tabela e efektivave per gjinine dhe kalimin e vitit.

#Tabela e efektivave
tab <- table(student_performance$gender, student_performance$passed)
addmargins(tab)
##         
##           No Yes Sum
##   Female  48  98 146
##   Male    43  77 120
##   Sum     91 175 266
#Tabela e frekuencave
tab_freq <- prop.table(tab)
addmargins(tab_freq)
##         
##                 No       Yes       Sum
##   Female 0.1804511 0.3684211 0.5488722
##   Male   0.1616541 0.2894737 0.4511278
##   Sum    0.3421053 0.6578947 1.0000000
#Tabela e frekuencave ne perqindje
tab_freq1 <- prop.table(tab)*100
tab_freq1 <- addmargins(tab_freq1)
round(tab_freq1, 2)
##         
##              No    Yes    Sum
##   Female  18.05  36.84  54.89
##   Male    16.17  28.95  45.11
##   Sum     34.21  65.79 100.00

Nga tabela e kontigjences se frekuencave ne perqindje veme re se 36% e studenteve jane vajza dhe kane kaluar vitin, ndersa 16% e studenteve jane djem dhe nuk e kane kaluar vitin.

mosaicplot( tab, col = c("seagreen", "yellow2"), cex.axis = 1, sub = "Gjinia", ylab = "Denduria relative", main = "")

Nje menyre tjeter per te ndertuar tabelat e kontigjences eshte nepermjet funksionit ctable te paketes sum- marytools. x dhe y jane 2 ndryhsoret (serite statistikore), ndersa prop percakton nese do bejme frekuenca me kusht sipas rreshtave ose me kusht sipas shtyllave.

chisq.test(student_performance$gender, student_performance$passed)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  student_performance$gender and student_performance$passed
## X-squared = 0.14132, df = 1, p-value = 0.707

Perfundim:

  • Nga analizimi i te dhenave vume re se mosha mesatare e studenteve eshte 17 vjec.

  • Pjesa me e madhe e studenteve jane vajza.

  • Oret minimale te studimit ne jave jane 2 dhe max jane 30.

  • Shumica e studenteve kane akses ne inernet.

  • Pasi shfaqem grafiket dolem ne perfundimin se oret e studimit ne jave kane rezultat drastik ne rezultatet finale te studenteve.

  • Pjesa me e madhe e studenteve jane kalues si rezultat i oreve te studimit dhe aksesit ne internet.