298.How Can SAS Be Used to Analyze Intermediate Students Performance
How Can SAS Be Used to Analyze Intermediate Students Performance
options nocenter;
1. DATA SIMULATION MACRO
/* SIMULATE STUDENT DATA */
%macro simulate_students;
data Students_Marks;
length StuID $5 StuName $15 Subject $12 Grade $2;
do n = 1 to 7; /* numeric loop instead of character loop */
StuID = cats("S", put(n, z2.)); /* creates S01, S02, ... S7 */
select (StuID);
when ("S01") StuName="Rahul";
when ("S02") StuName="Anitha";
when ("S03") StuName="Kiran";
when ("S04") StuName="Priya";
when ("S05") StuName="Vamsi";
when ("S06") StuName="Divya";
when ("S07") StuName="Rohit";
otherwise;
end;
/* Assign random subjects and marks */
array subs[3] $12 _temporary_ ('Maths','Physics','Chemistry');
do i=1 to dim(subs);
Subject = subs[i];
Marks = 50 + int(50*ranuni(123));
if Marks >=90 then Grade="A+";
else if Marks >=80 then Grade="A";
else if Marks >=70 then Grade="B";
else if Marks >=60 then Grade="C";
else if Marks >=50 then Grade="D";
else Grade="F";
output;
end;
end;
drop i n;
run;
%mend simulate_students;
%simulate_students;
proc print data=Students_Marks;
run;
OUTPUT:
| Obs | StuID | StuName | Subject | Grade | Marks |
|---|---|---|---|---|---|
| 1 | S01 | Rahul | Maths | A | 87 |
| 2 | S01 | Rahul | Physics | C | 66 |
| 3 | S01 | Rahul | Chemistry | D | 58 |
| 4 | S02 | Anitha | Maths | A+ | 95 |
| 5 | S02 | Anitha | Physics | C | 67 |
| 6 | S02 | Anitha | Chemistry | C | 61 |
| 7 | S03 | Kiran | Maths | A | 89 |
| 8 | S03 | Kiran | Physics | C | 69 |
| 9 | S03 | Kiran | Chemistry | D | 56 |
| 10 | S04 | Priya | Maths | D | 59 |
| 11 | S04 | Priya | Physics | A | 88 |
| 12 | S04 | Priya | Chemistry | B | 71 |
| 13 | S05 | Vamsi | Maths | A+ | 98 |
| 14 | S05 | Vamsi | Physics | C | 63 |
| 15 | S05 | Vamsi | Chemistry | A | 85 |
| 16 | S06 | Divya | Maths | B | 77 |
| 17 | S06 | Divya | Physics | B | 76 |
| 18 | S06 | Divya | Chemistry | A+ | 93 |
| 19 | S07 | Rohit | Maths | D | 57 |
| 20 | S07 | Rohit | Physics | A+ | 93 |
| 21 | S07 | Rohit | Chemistry | A | 82 |
2. CREATE SECONDARY TABLES
/* Student Info Dataset */
data Students_Info;
input StuID $ Age Gender $ Section $;
datalines;
S01 17 M A
S02 18 F B
S03 17 M A
S04 18 F A
S05 17 M B
S06 17 F C
S07 18 M C
;
run;
proc print data=Students_Info;
run;
OUTPUT:
| Obs | StuID | Age | Gender | Section |
|---|---|---|---|---|
| 1 | S01 | 17 | M | A |
| 2 | S02 | 18 | F | B |
| 3 | S03 | 17 | M | A |
| 4 | S04 | 18 | F | A |
| 5 | S05 | 17 | M | B |
| 6 | S06 | 17 | F | C |
| 7 | S07 | 18 | M | C |
/* Sports Information Dataset */
data Students_Sports;
input StuID $ Sport:$10. Position $;
datalines;
S01 Cricket Captain
S02 Badminton Player
S03 Football Player
S04 KhoKho Captain
S05 Chess Player
S06 Basketball Player
S07 Kabaddi Captain
;
run;
proc print data=Students_Sports;
run;
OUTPUT:
| Obs | StuID | Sport | Position |
|---|---|---|---|
| 1 | S01 | Cricket | Captain |
| 2 | S02 | Badminton | Player |
| 3 | S03 | Football | Player |
| 4 | S04 | KhoKho | Captain |
| 5 | S05 | Chess | Player |
| 6 | S06 | Basketball | Player |
| 7 | S07 | Kabaddi | Captain |
3. COMBINING DATA TECHNIQUES
3a. Using SET
/* Creating two parts for SET demonstration */
data Term1;
set Students_Marks(obs=9);
run;
proc print data=Term1;
run;
OUTPUT:
| Obs | StuID | StuName | Subject | Grade | Marks |
|---|---|---|---|---|---|
| 1 | S01 | Rahul | Maths | A | 87 |
| 2 | S01 | Rahul | Physics | C | 66 |
| 3 | S01 | Rahul | Chemistry | D | 58 |
| 4 | S02 | Anitha | Maths | A+ | 95 |
| 5 | S02 | Anitha | Physics | C | 67 |
| 6 | S02 | Anitha | Chemistry | C | 61 |
| 7 | S03 | Kiran | Maths | A | 89 |
| 8 | S03 | Kiran | Physics | C | 69 |
| 9 | S03 | Kiran | Chemistry | D | 56 |
data Term2;
set Students_Marks(firstobs=10 obs=21);
run;
proc print data=Term2;
run;
OUTPUT:
| Obs | StuID | StuName | Subject | Grade | Marks |
|---|---|---|---|---|---|
| 1 | S04 | Priya | Maths | D | 59 |
| 2 | S04 | Priya | Physics | A | 88 |
| 3 | S04 | Priya | Chemistry | B | 71 |
| 4 | S05 | Vamsi | Maths | A+ | 98 |
| 5 | S05 | Vamsi | Physics | C | 63 |
| 6 | S05 | Vamsi | Chemistry | A | 85 |
| 7 | S06 | Divya | Maths | B | 77 |
| 8 | S06 | Divya | Physics | B | 76 |
| 9 | S06 | Divya | Chemistry | A+ | 93 |
| 10 | S07 | Rohit | Maths | D | 57 |
| 11 | S07 | Rohit | Physics | A+ | 93 |
| 12 | S07 | Rohit | Chemistry | A | 82 |
/* Combine both terms */
data Combined_SET;
set Term1 Term2;
run;
proc print data=Combined_SET;
run;
OUTPUT:
| Obs | StuID | StuName | Subject | Grade | Marks |
|---|---|---|---|---|---|
| 1 | S01 | Rahul | Maths | A | 87 |
| 2 | S01 | Rahul | Physics | C | 66 |
| 3 | S01 | Rahul | Chemistry | D | 58 |
| 4 | S02 | Anitha | Maths | A+ | 95 |
| 5 | S02 | Anitha | Physics | C | 67 |
| 6 | S02 | Anitha | Chemistry | C | 61 |
| 7 | S03 | Kiran | Maths | A | 89 |
| 8 | S03 | Kiran | Physics | C | 69 |
| 9 | S03 | Kiran | Chemistry | D | 56 |
| 10 | S04 | Priya | Maths | D | 59 |
| 11 | S04 | Priya | Physics | A | 88 |
| 12 | S04 | Priya | Chemistry | B | 71 |
| 13 | S05 | Vamsi | Maths | A+ | 98 |
| 14 | S05 | Vamsi | Physics | C | 63 |
| 15 | S05 | Vamsi | Chemistry | A | 85 |
| 16 | S06 | Divya | Maths | B | 77 |
| 17 | S06 | Divya | Physics | B | 76 |
| 18 | S06 | Divya | Chemistry | A+ | 93 |
| 19 | S07 | Rohit | Maths | D | 57 |
| 20 | S07 | Rohit | Physics | A+ | 93 |
| 21 | S07 | Rohit | Chemistry | A | 82 |
3b. Using MERGE
proc sort data=Students_Info;
by StuID;
run;
proc print data=Students_Info;
run;
OUTPUT:
| Obs | StuID | Age | Gender | Section |
|---|---|---|---|---|
| 1 | S01 | 17 | M | A |
| 2 | S02 | 18 | F | B |
| 3 | S03 | 17 | M | A |
| 4 | S04 | 18 | F | A |
| 5 | S05 | 17 | M | B |
| 6 | S06 | 17 | F | C |
| 7 | S07 | 18 | M | C |
proc sort data=Students_Sports;
by StuID;
run;
proc print data=Students_Sports;
run;
OUTPUT:
| Obs | StuID | Sport | Position |
|---|---|---|---|
| 1 | S01 | Cricket | Captain |
| 2 | S02 | Badminton | Player |
| 3 | S03 | Football | Player |
| 4 | S04 | KhoKho | Captain |
| 5 | S05 | Chess | Player |
| 6 | S06 | Basketball | Player |
| 7 | S07 | Kabaddi | Captain |
/* Merge horizontally */
data Combined_MERGE;
merge Students_Info Students_Sports;
by StuID;
run;
proc print data=Combined_MERGE;
run;
OUTPUT:
| Obs | StuID | Age | Gender | Section | Sport | Position |
|---|---|---|---|---|---|---|
| 1 | S01 | 17 | M | A | Cricket | Captain |
| 2 | S02 | 18 | F | B | Badminton | Player |
| 3 | S03 | 17 | M | A | Football | Player |
| 4 | S04 | 18 | F | A | KhoKho | Captain |
| 5 | S05 | 17 | M | B | Chess | Player |
| 6 | S06 | 17 | F | C | Basketball | Player |
| 7 | S07 | 18 | M | C | Kabaddi | Captain |
3c. Using PROC SQL (Join)
proc sql;
create table Combined_SQL as
select a.StuID, a.StuName, a.Subject, a.Marks, a.Grade,
b.Age, b.Gender, c.Sport, c.Position
from Students_Marks a
left join Students_Info b
on a.StuID=b.StuID
left join Students_Sports c
on a.StuID=c.StuID
order by a.StuID;
quit;
proc print data=Combined_SQL;
run;
OUTPUT:
| Obs | StuID | StuName | Subject | Marks | Grade | Age | Gender | Sport | Position |
|---|---|---|---|---|---|---|---|---|---|
| 1 | S01 | Rahul | Physics | 66 | C | 17 | M | Cricket | Captain |
| 2 | S01 | Rahul | Chemistry | 58 | D | 17 | M | Cricket | Captain |
| 3 | S01 | Rahul | Maths | 87 | A | 17 | M | Cricket | Captain |
| 4 | S02 | Anitha | Chemistry | 61 | C | 18 | F | Badminton | Player |
| 5 | S02 | Anitha | Physics | 67 | C | 18 | F | Badminton | Player |
| 6 | S02 | Anitha | Maths | 95 | A+ | 18 | F | Badminton | Player |
| 7 | S03 | Kiran | Maths | 89 | A | 17 | M | Football | Player |
| 8 | S03 | Kiran | Chemistry | 56 | D | 17 | M | Football | Player |
| 9 | S03 | Kiran | Physics | 69 | C | 17 | M | Football | Player |
| 10 | S04 | Priya | Chemistry | 71 | B | 18 | F | KhoKho | Captain |
| 11 | S04 | Priya | Physics | 88 | A | 18 | F | KhoKho | Captain |
| 12 | S04 | Priya | Maths | 59 | D | 18 | F | KhoKho | Captain |
| 13 | S05 | Vamsi | Chemistry | 85 | A | 17 | M | Chess | Player |
| 14 | S05 | Vamsi | Physics | 63 | C | 17 | M | Chess | Player |
| 15 | S05 | Vamsi | Maths | 98 | A+ | 17 | M | Chess | Player |
| 16 | S06 | Divya | Chemistry | 93 | A+ | 17 | F | Basketball | Player |
| 17 | S06 | Divya | Physics | 76 | B | 17 | F | Basketball | Player |
| 18 | S06 | Divya | Maths | 77 | B | 17 | F | Basketball | Player |
| 19 | S07 | Rohit | Chemistry | 82 | A | 18 | M | Kabaddi | Captain |
| 20 | S07 | Rohit | Physics | 93 | A+ | 18 | M | Kabaddi | Captain |
| 21 | S07 | Rohit | Maths | 57 | D | 18 | M | Kabaddi | Captain |
4. QC CHECKS USING PROC COMPARE
proc compare base=Combined_MERGE compare=Combined_SQL
out=Compare_Result noprint;
run;
proc print data=Compare_Result (obs=10);
title "QC Comparison between MERGE and SQL Outputs";
run;
OUTPUT:
| Obs | _TYPE_ | _OBS_ | StuID | Age | Gender | Sport | Position |
|---|---|---|---|---|---|---|---|
| 1 | DIF | 1 | ........ | 0 | ........ | .......... | ........ |
| 2 | DIF | 2 | ..X..... | -1 | X....... | XXXXXX.XX. | XXXXXXX. |
| 3 | DIF | 3 | ..X..... | 0 | ........ | XXXXXXXX.. | XXXXXXX. |
| 4 | DIF | 4 | ..X..... | 0 | ........ | XXXXXXXXX. | XXXXXXX. |
| 5 | DIF | 5 | ..X..... | 1 | X....... | XXXXXXXXX. | ........ |
| 6 | DIF | 6 | ..X..... | 1 | ........ | ..XXXXXXXX | ........ |
| 7 | DIF | 7 | ..X..... | -1 | ........ | XXXXXXXX.. | XXXXXXX. |
5. TLF-STYLE SUMMARY TABLES
5a. PROC REPORT
proc report data=Combined_SQL nowd headline headskip;
column StuName Subject Marks Grade;
define StuName / group 'Student Name';
define Subject / group 'Subject';
define Marks / analysis mean format=8.2 'Average Marks';
define Grade / group;
rbreak after / summarize;
title "TABLE 1: STUDENTS PERFORMANCE SUMMARY BY SUBJECT";
run;
OUTPUT:
| Student Name | Subject | Average Marks | Grade |
|---|---|---|---|
| Anitha | Chemistry | 61.00 | C |
| Maths | 95.00 | A+ | |
| Physics | 67.00 | C | |
| Divya | Chemistry | 93.00 | A+ |
| Maths | 77.00 | B | |
| Physics | 76.00 | B | |
| Kiran | Chemistry | 56.00 | D |
| Maths | 89.00 | A | |
| Physics | 69.00 | C | |
| Priya | Chemistry | 71.00 | B |
| Maths | 59.00 | D | |
| Physics | 88.00 | A | |
| Rahul | Chemistry | 58.00 | D |
| Maths | 87.00 | A | |
| Physics | 66.00 | C | |
| Rohit | Chemistry | 82.00 | A |
| Maths | 57.00 | D | |
| Physics | 93.00 | A+ | |
| Vamsi | Chemistry | 85.00 | A |
| Maths | 98.00 | A+ | |
| Physics | 63.00 | C | |
| 75.71 |
5b. PROC REPORT : SHOWS TOTAL MARKS PER STUDENT
proc report data=Combined_SQL nowd headline headskip;
column StuID StuName Subject Marks Grade;
define StuID / group 'Student ID';
define StuName / group 'Student Name';
define Subject / display 'Subject';
define Marks / display format=8.2 'Marks';
define Grade / display 'Grade';
/* Initialize accumulator before each student group */
compute before StuID;
sumMarks = 0;
endcomp;
/* Accumulate marks as each subject row is processed */
compute Marks;
sumMarks + Marks;
endcomp;
/* After the group (student) is finished, print the total line */
compute after StuID;
line '';
line @5 "Total Marks for " StuName $15. ": " sumMarks 8.2;
line '';
endcomp;
title "TABLE 2: STUDENTS PERFORMANCE SUMMARY WITH TOTAL PER STUDENT (LINE)";
run;
OUTPUT:
| Student ID | Student Name | Subject | Marks | Grade |
|---|---|---|---|---|
| S01 | Rahul | Physics | 66.00 | C |
| Chemistry | 58.00 | D | ||
| Maths | 87.00 | A | ||
| Total Marks for : 211.00 | ||||
| S02 | Anitha | Chemistry | 61.00 | C |
| Physics | 67.00 | C | ||
| Maths | 95.00 | A+ | ||
| Total Marks for : 223.00 | ||||
| S03 | Kiran | Maths | 89.00 | A |
| Chemistry | 56.00 | D | ||
| Physics | 69.00 | C | ||
| Total Marks for : 214.00 | ||||
| S04 | Priya | Chemistry | 71.00 | B |
| Physics | 88.00 | A | ||
| Maths | 59.00 | D | ||
| Total Marks for : 218.00 | ||||
| S05 | Vamsi | Chemistry | 85.00 | A |
| Physics | 63.00 | C | ||
| Maths | 98.00 | A+ | ||
| Total Marks for : 246.00 | ||||
| S06 | Divya | Chemistry | 93.00 | A+ |
| Physics | 76.00 | B | ||
| Maths | 77.00 | B | ||
| Total Marks for : 246.00 | ||||
| S07 | Rohit | Chemistry | 82.00 | A |
| Physics | 93.00 | A+ | ||
| Maths | 57.00 | D | ||
| Total Marks for : 232.00 | ||||
5c. PROC TABULATE
proc tabulate data=Combined_SQL;
class Subject Grade;
var Marks;
table Subject,
Grade*(Marks*(mean min max))
/ misstext='0' box='Subjects';
title "TABLE 3: SUBJECT-WISE MARK STATISTICS BY GRADE";
run;
OUTPUT:
| Subjects | Grade | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | A+ | B | C | D | |||||||||||
| Marks | Marks | Marks | Marks | Marks | |||||||||||
| Mean | Min | Max | Mean | Min | Max | Mean | Min | Max | Mean | Min | Max | Mean | Min | Max | |
| Subject | 83.50 | 82.00 | 85.00 | 93.00 | 93.00 | 93.00 | 71.00 | 71.00 | 71.00 | 61.00 | 61.00 | 61.00 | 57.00 | 56.00 | 58.00 |
| Chemistry | |||||||||||||||
| Maths | 88.00 | 87.00 | 89.00 | 96.50 | 95.00 | 98.00 | 77.00 | 77.00 | 77.00 | 0 | 0 | 0 | 58.00 | 57.00 | 59.00 |
| Physics | 88.00 | 88.00 | 88.00 | 93.00 | 93.00 | 93.00 | 76.00 | 76.00 | 76.00 | 66.25 | 63.00 | 69.00 | 0 | 0 | 0 |
6. REPORT MACRO
/*------------- MACRO : REPORT GENERATION --------------*/
%macro report_summary(type=REPORT);
%if &type=REPORT %then %do;
ods pdf file="C:\SASReports\Student_Report.pdf";
proc report data=Combined_SQL nowd;
column StuID StuName Subject Marks Grade;
define StuID / group;
define StuName / group;
define Subject / group;
define Marks / analysis mean 'Avg Marks';
define Grade / group;
title "STUDENTS PERFORMANCE REPORT (PROC REPORT)";
run;
ods pdf close;
%end;
%else %if &type=TABULATE %then %do;
ods pdf file="C:\SASReports\Student_Tabulates.pdf";
proc tabulate data=Combined_SQL;
class Subject Grade;
var Marks;
table Subject, Grade*(Marks*(mean min max));
title "STUDENTS PERFORMANCE SUMMARY (PROC TABULATE)";
run;
ods pdf close;
%end;
%mend report_summary;
/* Call both report types */
%report_summary(type=REPORT);
OUTPUT:
| StuID | StuName | Subject | Avg Marks | Grade |
|---|---|---|---|---|
| S01 | Rahul | Chemistry | 58 | D |
| Maths | 87 | A | ||
| Physics | 66 | C | ||
| S02 | Anitha | Chemistry | 61 | C |
| Maths | 95 | A+ | ||
| Physics | 67 | C | ||
| S03 | Kiran | Chemistry | 56 | D |
| Maths | 89 | A | ||
| Physics | 69 | C | ||
| S04 | Priya | Chemistry | 71 | B |
| Maths | 59 | D | ||
| Physics | 88 | A | ||
| S05 | Vamsi | Chemistry | 85 | A |
| Maths | 98 | A+ | ||
| Physics | 63 | C | ||
| S06 | Divya | Chemistry | 93 | A+ |
| Maths | 77 | B | ||
| Physics | 76 | B | ||
| S07 | Rohit | Chemistry | 82 | A |
| Maths | 57 | D | ||
| Physics | 93 | A+ |
%report_summary(type=TABULATE);
OUTPUT:
| Grade | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | A+ | B | C | D | |||||||||||
| Marks | Marks | Marks | Marks | Marks | |||||||||||
| Mean | Min | Max | Mean | Min | Max | Mean | Min | Max | Mean | Min | Max | Mean | Min | Max | |
| Subject | 83.50 | 82.00 | 85.00 | 93.00 | 93.00 | 93.00 | 71.00 | 71.00 | 71.00 | 61.00 | 61.00 | 61.00 | 57.00 | 56.00 | 58.00 |
| Chemistry | |||||||||||||||
| Maths | 88.00 | 87.00 | 89.00 | 96.50 | 95.00 | 98.00 | 77.00 | 77.00 | 77.00 | . | . | . | 58.00 | 57.00 | 59.00 |
| Physics | 88.00 | 88.00 | 88.00 | 93.00 | 93.00 | 93.00 | 76.00 | 76.00 | 76.00 | 66.25 | 63.00 | 69.00 | . | . | . |
Comments
Post a Comment