GAMING PLAYERS PERFORMANCE ANALYSIS USING SAS DATA STEP | PROC SQL | PROC MEANS | PROC UNIVARIATE | PROC SGPLOT | MACROS | DATE FUNCTIONS | APPEND | MERGE | TRANSPOSE
options nocenter;
1.GAMING PLAYERS DATASET CREATION
data work.gaming_players;
length Player_Name $20 Country $15;
format Join_Date Last_Play_Date date9.;
input Player_Name $ Country $ Hours_Played Wins Kills Rank Join_Date :date9.;
Last_Play_Date = intnx('day', Join_Date, ceil(Hours_Played/10));
datalines;
Alex USA 520 120 3400 1 01JAN2024
Ravi India 480 110 3100 2 15JAN2024
Chen China 460 105 2950 3 01FEB2024
Carlos Brazil 430 98 2700 4 10FEB2024
Ivan Russia 410 95 2600 5 20FEB2024
Leo France 390 90 2450 6 01MAR2024
Sam UK 360 85 2300 7 10MAR2024
Noah Canada 340 80 2150 8 15MAR2024
Ali UAE 320 75 2000 9 20MAR2024
Tom Australia 300 70 1850 10 01APR2024
Ken Japan 280 65 1700 11 05APR2024
Mark Germany 260 60 1550 12 10APR2024
;
run;
proc print data=work.gaming_players;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank |
|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 |
| 2 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 |
| 3 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 |
| 4 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 |
| 6 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 |
| 7 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 |
| 8 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 |
| 9 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 |
| 10 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 |
| 11 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 |
| 12 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 |
2.DATE FUNCTIONS PRACTICE
2.1 Months Active Using INTCK
data work.player_duration;
set gaming_players;
Months_Active = intck('month', Join_Date, Last_Play_Date);
run;
proc print data=work.player_duration;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank | Months_Active |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 | 1 |
| 2 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 | 2 |
| 3 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 | 1 |
| 4 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 | 1 |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 | 2 |
| 6 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 | 1 |
| 7 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 | 1 |
| 8 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 | 1 |
| 9 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 | 1 |
| 10 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 | 1 |
| 11 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 | 1 |
| 12 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 | 1 |
2.2 Generating a Fixed Tournament Date Using MDY
data work.tournament;
set gaming_players;
Tournament_Date = mdy(6, 15, 2024);
format Tournament_Date date9.;
run;
proc print data=work.tournament;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank | Tournament_Date |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 | 15JUN2024 |
| 2 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 | 15JUN2024 |
| 3 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 | 15JUN2024 |
| 4 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 | 15JUN2024 |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 | 15JUN2024 |
| 6 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 | 15JUN2024 |
| 7 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 | 15JUN2024 |
| 8 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 | 15JUN2024 |
| 9 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 | 15JUN2024 |
| 10 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 | 15JUN2024 |
| 11 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 | 15JUN2024 |
| 12 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 | 15JUN2024 |
3.PROC SQL – DATA QUERY & DERIVED METRICS
3.1 Calculating Kill Efficiency
proc sql;
create table work.player_efficiency as
select Player_Name,Country,Hours_Played,Kills,Wins,
(Kills / Hours_Played) as Kill_Rate format=8.2
from gaming_players
order by Kill_Rate desc;
quit;
proc print data=work.player_efficiency;
run;
OUTPUT:
| Obs | Player_Name | Country | Hours_Played | Kills | Wins | Kill_Rate |
|---|---|---|---|---|---|---|
| 1 | Alex | USA | 520 | 3400 | 120 | 6.54 |
| 2 | Ravi | India | 480 | 3100 | 110 | 6.46 |
| 3 | Chen | China | 460 | 2950 | 105 | 6.41 |
| 4 | Sam | UK | 360 | 2300 | 85 | 6.39 |
| 5 | Ivan | Russia | 410 | 2600 | 95 | 6.34 |
| 6 | Noah | Canada | 340 | 2150 | 80 | 6.32 |
| 7 | Leo | France | 390 | 2450 | 90 | 6.28 |
| 8 | Carlos | Brazil | 430 | 2700 | 98 | 6.28 |
| 9 | Ali | UAE | 320 | 2000 | 75 | 6.25 |
| 10 | Tom | Australia | 300 | 1850 | 70 | 6.17 |
| 11 | Ken | Japan | 280 | 1700 | 65 | 6.07 |
| 12 | Mark | Germany | 260 | 1550 | 60 | 5.96 |
4.PROC MEANS – STATISTICAL SUMMARY
proc means data=gaming_players mean min max;
var Hours_Played Wins Kills Rank;
run;
OUTPUT:
The MEANS Procedure
| Variable | Mean | Minimum | Maximum |
|---|---|---|---|
Hours_Played Wins Kills Rank | 379.1666667 87.7500000 2395.83 6.5000000 | 260.0000000 60.0000000 1550.00 1.0000000 | 520.0000000 120.0000000 3400.00 12.0000000 |
5.PROC UNIVARIATE – DISTRIBUTION ANALYSIS
proc univariate data=gaming_players;
var Kills;
histogram Kills;
run;
OUTPUT:
The UNIVARIATE Procedure
Variable: Kills
| Moments | |||
|---|---|---|---|
| N | 12 | Sum Weights | 12 |
| Mean | 2395.83333 | Sum Observations | 28750 |
| Std Deviation | 577.792953 | Variance | 333844.697 |
| Skewness | 0.2184608 | Kurtosis | -0.8796393 |
| Uncorrected SS | 72552500 | Corrected SS | 3672291.67 |
| Coeff Variation | 24.1165754 | Std Error Mean | 166.794459 |
| Basic Statistical Measures | |||
|---|---|---|---|
| Location | Variability | ||
| Mean | 2395.833 | Std Deviation | 577.79295 |
| Median | 2375.000 | Variance | 333845 |
| Mode | . | Range | 1850 |
| Interquartile Range | 900.00000 | ||
| Tests for Location: Mu0=0 | ||||
|---|---|---|---|---|
| Test | Statistic | p Value | ||
| Student's t | t | 14.36399 | Pr > |t| | <.0001 |
| Sign | M | 6 | Pr >= |M| | 0.0005 |
| Signed Rank | S | 39 | Pr >= |S| | 0.0005 |
| Quantiles (Definition 5) | |
|---|---|
| Level | Quantile |
| 100% Max | 3400 |
| 99% | 3400 |
| 95% | 3400 |
| 90% | 3100 |
| 75% Q3 | 2825 |
| 50% Median | 2375 |
| 25% Q1 | 1925 |
| 10% | 1700 |
| 5% | 1550 |
| 1% | 1550 |
| 0% Min | 1550 |
| Extreme Observations | |||
|---|---|---|---|
| Lowest | Highest | ||
| Value | Obs | Value | Obs |
| 1550 | 12 | 2600 | 5 |
| 1700 | 11 | 2700 | 4 |
| 1850 | 10 | 2950 | 3 |
| 2000 | 9 | 3100 | 2 |
| 2150 | 8 | 3400 | 1 |
The UNIVARIATE Procedure
6.PROC SGPLOT – DATA VISUALIZATION
6.1 Hours Played vs Wins
proc sgplot data=gaming_players;
scatter x=Hours_Played y=Wins;
title "Hours Played vs Wins";
run;
OUTPUT:
7.MACRO – AUTOMATED PLAYER RANKING
%macro player_category;
data work.player_category;
set gaming_players;
length Player_Level $15;
if Rank <= 3 then Player_Level = "Elite";
else if Rank <= 7 then Player_Level = "Pro";
else Player_Level = "Beginner";
run;
proc print data=work.player_category;
run;
%mend;
%player_category;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank | Player_Level |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 | Elite |
| 2 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 | Elite |
| 3 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 | Elite |
| 4 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 | Pro |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 | Pro |
| 6 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 | Pro |
| 7 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 | Pro |
| 8 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 | Beginner |
| 9 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 | Beginner |
| 10 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 | Beginner |
| 11 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 | Beginner |
| 12 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 | Beginner |
8.PROC APPEND – ADDITIONAL PLAYERS
data work.new_players;
length Player_Name $20 Country $15;
format Join_Date date9.;
input Player_Name $ Country $ Hours_Played Wins Kills Rank Join_Date :date9.;
datalines;
Zane USA 200 45 1200 13 15APR2024
;
run;
proc print data=work.new_players;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Hours_Played | Wins | Kills | Rank |
|---|---|---|---|---|---|---|---|
| 1 | Zane | USA | 15APR2024 | 200 | 45 | 1200 | 13 |
proc append base=gaming_players
data=new_players force;
run;
proc print data=work.gaming_players;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank |
|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 |
| 2 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 |
| 3 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 |
| 4 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 |
| 6 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 |
| 7 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 |
| 8 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 |
| 9 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 |
| 10 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 |
| 11 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 |
| 12 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 |
| 13 | Zane | USA | 15APR2024 | . | 200 | 45 | 1200 | 13 |
9.PROC MERGE – COMBINING DATASETS
proc sort data=gaming_players; by Player_Name; run;
proc print data=work.gaming_players;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank |
|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 |
| 2 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 |
| 3 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 |
| 4 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 |
| 6 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 |
| 7 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 |
| 8 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 |
| 9 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 |
| 10 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 |
| 11 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 |
| 12 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 |
| 13 | Zane | USA | 15APR2024 | . | 200 | 45 | 1200 | 13 |
proc sort data=player_category; by Player_Name; run;
proc print data=work.player_category;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank | Player_Level |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 | Elite |
| 2 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 | Beginner |
| 3 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 | Pro |
| 4 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 | Elite |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 | Pro |
| 6 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 | Beginner |
| 7 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 | Pro |
| 8 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 | Beginner |
| 9 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 | Beginner |
| 10 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 | Elite |
| 11 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 | Pro |
| 12 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 | Beginner |
data work.player_full;
merge gaming_players player_category;
by Player_Name;
run;
proc print data=work.player_full;
run;
OUTPUT:
| Obs | Player_Name | Country | Join_Date | Last_Play_Date | Hours_Played | Wins | Kills | Rank | Player_Level |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Alex | USA | 01JAN2024 | 22FEB2024 | 520 | 120 | 3400 | 1 | Elite |
| 2 | Ali | UAE | 20MAR2024 | 21APR2024 | 320 | 75 | 2000 | 9 | Beginner |
| 3 | Carlos | Brazil | 10FEB2024 | 24MAR2024 | 430 | 98 | 2700 | 4 | Pro |
| 4 | Chen | China | 01FEB2024 | 18MAR2024 | 460 | 105 | 2950 | 3 | Elite |
| 5 | Ivan | Russia | 20FEB2024 | 01APR2024 | 410 | 95 | 2600 | 5 | Pro |
| 6 | Ken | Japan | 05APR2024 | 03MAY2024 | 280 | 65 | 1700 | 11 | Beginner |
| 7 | Leo | France | 01MAR2024 | 09APR2024 | 390 | 90 | 2450 | 6 | Pro |
| 8 | Mark | Germany | 10APR2024 | 06MAY2024 | 260 | 60 | 1550 | 12 | Beginner |
| 9 | Noah | Canada | 15MAR2024 | 18APR2024 | 340 | 80 | 2150 | 8 | Beginner |
| 10 | Ravi | India | 15JAN2024 | 03MAR2024 | 480 | 110 | 3100 | 2 | Elite |
| 11 | Sam | UK | 10MAR2024 | 15APR2024 | 360 | 85 | 2300 | 7 | Pro |
| 12 | Tom | Australia | 01APR2024 | 01MAY2024 | 300 | 70 | 1850 | 10 | Beginner |
| 13 | Zane | USA | 15APR2024 | . | 200 | 45 | 1200 | 13 |
10.PROC TRANSPOSE – STRUCTURAL TRANSFORMATION
proc transpose data=gaming_players out=work.transposed_kills;
by Country NotSorted;
var Kills;
run;
proc print data=work.transposed_kills;
run;
OUTPUT:
| Obs | Country | _NAME_ | COL1 |
|---|---|---|---|
| 1 | USA | Kills | 3400 |
| 2 | UAE | Kills | 2000 |
| 3 | Brazil | Kills | 2700 |
| 4 | China | Kills | 2950 |
| 5 | Russia | Kills | 2600 |
| 6 | Japan | Kills | 1700 |
| 7 | France | Kills | 2450 |
| 8 | Germany | Kills | 1550 |
| 9 | Canada | Kills | 2150 |
| 10 | India | Kills | 3100 |
| 11 | UK | Kills | 2300 |
| 12 | Australia | Kills | 1850 |
| 13 | USA | Kills | 1200 |
No comments:
Post a Comment