/****************************************************************************** * Programme : Discretización por puntos de corte (Cutpoint Binning) * Reference : DISCRE2214 * Source : https://www.wearecas.eu/en/sampleCode/DISCRE2214 ******************************************************************************/ /* --- BLOC 1 --- */ /* Création d'une table CAS temporaire */ options casdatalimit=1000; caslib _all_ assign; data casuser.auto_data; input MSRP Invoice EngineSize Horsepower Cylinders MPG_City MPG_Highway Weight Wheelbase Length; datalines; 25945 23722 3.5 210 6 18 26 3470 110 195 26445 24300 3.5 210 6 18 26 3470 110 195 28495 26033 3.5 210 6 18 26 3470 110 195 23720 21683 2.0 165 4 23 30 2778 101 179 24595 22473 2.0 165 4 23 30 2778 101 179 27270 24806 2.0 190 4 21 29 2833 104 184 28170 25686 2.0 190 4 21 29 2833 104 184 20000 18456 2.0 160 4 24 31 2901 106 187 22000 20387 2.0 170 4 23 31 2946 106 187 30000 27500 3.0 220 6 17 25 3450 109 188 ; run; /* Application du découpage par points de coupure */ proc binning data=casuser.auto_data numbin=3 method=cutpts; input Horsepower / cutpts(180, 200); output out=casuser.binned_data copyvars=(MSRP Horsepower); run; /* Affichage des résultats (facultatif) */ proc print data=casuser.binned_data (obs=5); run; proc freq data=casuser.binned_data; tables Binned_Horsepower; run; /* --- BLOC 2 --- */ /* Création d'une table CAS temporaire */ options casdatalimit=1000; caslib _all_ assign; data casuser.house_prices; input SqFt Bedrooms Bathrooms LotSize YearBuilt SalePrice; datalines; 1500 3 2 5000 1990 150000 1800 4 2.5 6000 1995 200000 1200 2 1 4000 1980 100000 2000 3 3 7000 2000 250000 1600 3 2 5500 1992 160000 1300 2 1.5 4500 1985 110000 2200 4 3.5 8000 2005 300000 1700 3 2 5800 1998 180000 1900 4 2 6500 2002 220000 1400 3 1 4800 1988 130000 ; run; /* Application du découpage par points de coupure avec options */ proc binning data=casuser.house_prices numbin=4 method=cutpts; input SqFt / cutpts(1500, 1800, 2000) monitor=(SalePrice); input YearBuilt / cutpts(1990, 2000) monitor=(SalePrice); output out=casuser.binned_house_data copyvars=(SqFt YearBuilt SalePrice) outstat=casuser.bin_stats; run; /* Affichage des détails des bins */ proc print data=casuser.bin_stats; run; /* Affichage des données binées */ proc print data=casuser.binned_house_data (obs=5); run; /* --- BLOC 3 --- */ /* Création d'une table CAS temporaire avec des valeurs manquantes */ options casdatalimit=1000; caslib _all_ assign; data casuser.customer_data; input Age Income_Monthly Education_Level $ Credit_Score_PreBinning Gender $; datalines; 30 3000 Bac NA . M 45 5000 Master NA 750 F 25 2000 HighSchool NA 600 M NA 4000 PhD NA 800 F 35 NA Bachelor NA 700 M 50 6000 Master NA 850 F 28 2500 HighSchool NA 620 M 40 4500 Bachelor NA 720 F NA 3500 PhD NA 780 M 32 3200 HighSchool NA 680 F ; run; /* Application du découpage avec gestion des manquantes et différentes numbin */ proc binning data=casuser.customer_data numbin=5 method=cutpts; input Age / cutpts(30, 40, 50); input Income_Monthly / numbin=3 cutpts(3000, 5000) handlemissing=bin; output out=casuser.binned_customer_data copyvars=(Age Income_Monthly Credit_Score_PreBinning); run; /* Affichage des résultats pour les données binées */ proc print data=casuser.binned_customer_data; run; /* Vérification des fréquences pour les variables binées */ proc freq data=casuser.binned_customer_data; tables Binned_Age Binned_Income_Monthly; run; /* --- BLOC 4 --- */ /* Assurez-vous d'avoir une session CAS active et une caslib assignée */ options casdatalimit=1000; caslib _all_ assign; /* Charger des données SASHELP dans CAS pour l'exemple */ data casuser.iris; set sashelp.iris; run; /* Application du découpage par points de coupure sur une table CAS */ proc binning data=casuser.iris numbin=3 method=cutpts; input PetalLength / cutpts(1.5, 4.5); input SepalWidth / cutpts(3.0, 3.5); output out=casuser.binned_iris (replace=true) copyvars=(Species PetalLength SepalWidth); save state out=casuser.binning_state (replace=true); run; /* Appliquer le découpage sur de nouvelles données (scoring) */ data casuser.new_iris_data; input PetalLength SepalWidth Species $; datalines; 1.2 3.8 Setosa 5.0 3.0 Virginica 4.0 2.5 Versicolor ; run; proc binning data=casuser.new_iris_data; score state=casuser.binning_state out=casuser.scored_iris; run; proc print data=casuser.scored_iris; run;