Data et Set#
Nous avons vu dans le chapitre précédent qu’il est possible d”afficher uniquement les variables qui nous intéressent. Nous avons vu également qu’il est possible d”afficher que les observations qui nous intéressent. Par exemple dans un ensemble de données sur des clients, nous pouvons afficher seulement les noms, prénoms et âge des clients habitant à Montréal.
Toutefois, avec la procédure Format
nous modifions seulement l”affichage. Si nous voulons effectuer une opération quelconque (calcul, régression…etc.) sur les variables et les observations d’intérêt, il faudrait extraire (ou dupliquer) un sous-ensemble de données.
DATA sous-ensemble-données;
SET ensemble-données;
WHERE variable_1='ce_qui_nous_interesse_1'
and variable_2='ce_qui_nous_interesse_2'
RUN;
Le sous-ensemble de données peut-être temporaire avec la bibliothèque WORK.sous_sensemble
ou dans une bibliothèque permanente LIBNAME.sous_sensemble
.
On peut extraire les observations d’intérêt avec la déclaration WHERE
. Nous pouvons spécifier ce qui nous intéresse avec la description exacte si nous la connaissons, par exemple WHRE type_prof='Ingénieur
. Lorsque nous ne sommes pas sûrs de l’écriture exacte de ce que nous cherchons, ou par exemple nous voulons extraire tout ce qui contient les deux lettres IN
, nous utilisons les %...%
. Par exemple WHRE type_prof='%In%
. Dans ce dernier cas, nous aurons tous les types de professions contenant les deux lettres In
.
Exemple;#
Reprenons notre base de données d’assurance;
libname assu 'data';
Data assu.cours_2;
set assu.eq_2;
/* nous verrons un peu plus loin à quoi sert keep */
keep numeropol type_prof alimentation cout1 cout2;
run;
proc print data=assu.cours_2 (firstobs = 2 obs = 5) noobs;
run;
SAS Connection established. Subprocess id is 23973
numeropol | type_prof | alimentation | cout1 | cout2 |
---|---|---|---|---|
52484 | Ingénieur | Carnivore | . | . |
27817 | Ingénieur | Carnivore | . | . |
32986 | Technicien | Carnivore | 230.280 | 287.217 |
45769 | Technicien | Carnivore | . | . |
On se rappelle des types de professions que nous avions dans notre base de données originale.
type_prof |
---|
Actuaire |
Autre |
Avocat |
Hockeyeur |
Infirmière |
Informaticien |
Ingénieur |
Médecin |
Professeur |
Technicien |
Nous voudrions créer un sous-ensemble de données temporaire appelé bd_ingenieurs
sur lequel on veut travailler. Ce dernier provient de l’ensemble de données assu.eq_2
et contient seulement les données sur les ingénieurs.
Data work.bd_ingenieurs;
set assu.cours_2;
where type_prof='Ingénieur';
run;
proc print data=work.bd_ingenieurs (firstobs = 2 obs = 10);
run;
Obs | numeropol | type_prof | alimentation | cout1 | cout2 |
---|---|---|---|---|---|
2 | 27817 | Ingénieur | Carnivore | . | . |
3 | 19651 | Ingénieur | Végétalien | . | . |
4 | 12507 | Ingénieur | Carnivore | . | . |
5 | 8670 | Ingénieur | Carnivore | . | . |
6 | 17867 | Ingénieur | Carnivore | . | . |
7 | 5127 | Ingénieur | Carnivore | . | . |
8 | 53543 | Ingénieur | Carnivore | . | . |
9 | 27131 | Ingénieur | Carnivore | 289.311 | . |
10 | 16186 | Ingénieur | Carnivore | . | . |
Maintenant, on veut les types de professions qui ont les deux In comme Infirmière ou Ingénieur
Data work.bd_in;
set assu.cours_2;
where type_prof like '%In%';
run;
proc print data=work.bd_in (firstobs = 2 obs = 10);
run;
Obs | numeropol | type_prof | alimentation | cout1 | cout2 |
---|---|---|---|---|---|
2 | 27817 | Ingénieur | Carnivore | . | . |
3 | 13590 | Infirmière | Carnivore | 509.261 | 2665.25 |
4 | 76422 | Infirmière | Carnivore | . | . |
5 | 20860 | Infirmière | Végétarien | 487.640 | . |
6 | 49010 | Infirmière | Végétarien | . | . |
7 | 30089 | Informaticien | Carnivore | . | . |
8 | 17174 | Informaticien | Végétarien | 458.789 | . |
9 | 38332 | Infirmière | Végétalien | . | . |
10 | 19651 | Ingénieur | Végétalien | . | . |
On peut vérifier que nous avons les types de proffessions avec In
type_prof |
---|
Infirmière |
Informaticien |
Ingénieur |
Regardons maintenant les types de proffesions se terminant par eur
Data work.bd_eur;
set assu.cours_2;
where type_prof like '%eur';
run;
proc print data=work.bd_eur (firstobs = 2 obs = 10);
run;
Obs | numeropol | type_prof | alimentation | cout1 | cout2 |
---|---|---|---|---|---|
2 | 27817 | Ingénieur | Carnivore | . | . |
3 | 56107 | Hockeyeur | Végétarien | . | . |
4 | 19651 | Ingénieur | Végétalien | . | . |
5 | 44235 | Professeur | Carnivore | . | . |
6 | 24013 | Hockeyeur | Végétarien | . | . |
7 | 12507 | Ingénieur | Carnivore | . | . |
8 | 28741 | Professeur | Carnivore | . | . |
9 | 14731 | Hockeyeur | Carnivore | 67.901 | 1639.48 |
10 | 3977 | Hockeyeur | Carnivore | 263.075 | . |
Nous obtenons alors que:
type_prof |
---|
Hockeyeur |
Ingénieur |
Professeur |
Si vous êtes curieux de voir comment nous obtenons ce résultat, voici la commande PROC sql
que nous verrons plus en détail dans les prochains cours
proc sql;
create table eur as
select type_prof, count(*) as type_prof from work.bd_eur
group by type_prof;
quit;
proc print data=eur noobs;
run;
type_prof |
---|
Hockeyeur |
Ingénieur |
Professeur |
Maintenant, essayons d’extraire un sous-ensemble de données avec les critères suivants;
Hokeyeur
Qui est végétarien ou végétalien
Data work.bd_hk_veg;
set assu.cours_2;
where type_prof='Hockeyeur'
and alimentation like 'Vé%';
run;
proc print data=work.bd_hk_veg (firstobs = 2 obs = 10);
run;
Obs | numeropol | type_prof | alimentation | cout1 | cout2 |
---|---|---|---|---|---|
2 | 24013 | Hockeyeur | Végétarien | . | . |
3 | 24660 | Hockeyeur | Végétarien | . | . |
4 | 56436 | Hockeyeur | Végétarien | . | . |
5 | 18535 | Hockeyeur | Végétalien | . | . |
6 | 21672 | Hockeyeur | Végétarien | . | . |
7 | 12342 | Hockeyeur | Végétarien | . | . |
8 | 74410 | Hockeyeur | Végétarien | . | . |
9 | 15159 | Hockeyeur | Végétarien | 456.261 | . |
10 | 32260 | Hockeyeur | Végétarien | . | . |
Création d’une nouvelle variable:#
Lorsque nous produisons un sous-ensemble de données, nous pouvons aussi créer une toute nouvelle variable à partir d’une opération quelconque sur les variables existantes. Par exemple, calculer le total des coûts de sinistre.
Comme dans l’exemple précédent, pour les Hokeyeurs qui ne mangent pas de viande, calculons le total des coûts de sinistres cout1-cout7;
Remarquez dans le code ci-dessous que nous avons un montant à la variable cout1
. Toutefois, le total n’est pas affiché à la neuvième observation. En effet, quand on somme avec des +
, SAS considère les valeurs manquantes dans le calcul.
Data work.bd_hk_veg;
set assu.cours_2;
cout_total=cout1+cout2+cout3+cout4+cout5+cout6+cout7;
where type_prof='Hockeyeur'
and alimentation like 'Vé%';
keep numeropol type_prof alimentation cout1 cout_total;
run;
proc print data=work.bd_hk_veg (firstobs = 2 obs = 10) noobs;
format cout1-cout7 cout_total dollar12.2;
run;
numeropol | type_prof | alimentation | cout1 | cout_total |
---|---|---|---|---|
24013 | Hockeyeur | Végétarien | . | . |
24660 | Hockeyeur | Végétarien | . | . |
56436 | Hockeyeur | Végétarien | . | . |
18535 | Hockeyeur | Végétalien | . | . |
21672 | Hockeyeur | Végétarien | . | . |
12342 | Hockeyeur | Végétarien | . | . |
74410 | Hockeyeur | Végétarien | . | . |
15159 | Hockeyeur | Végétarien | 456.261 | . |
32260 | Hockeyeur | Végétarien | . | . |
La fonction sum
règle ce problème;
Data work.bd_hk_veg;
set assu.cours_2;
cout_total=sum(cout1,cout2, cout3, cout4, cout5, cout6, cout7);
where type_prof='Hockeyeur'
and alimentation like 'Vé%';
keep numeropol type_prof alimentation cout_total;
run;
proc print data=work.bd_hk_veg (firstobs = 2 obs = 10) noobs;
format cout1-cout7 cout_total dollar12.2;
run;
numeropol | type_prof | alimentation | cout_total |
---|---|---|---|
24013 | Hockeyeur | Végétarien | . |
24660 | Hockeyeur | Végétarien | . |
56436 | Hockeyeur | Végétarien | . |
18535 | Hockeyeur | Végétalien | . |
21672 | Hockeyeur | Végétarien | . |
12342 | Hockeyeur | Végétarien | . |
74410 | Hockeyeur | Végétarien | . |
15159 | Hockeyeur | Végétarien | $456.26 |
32260 | Hockeyeur | Végétarien | . |
Maintenant que nous avons vu comment extraire les données, nous voudrions garder dans notre nouvelle base de données seulement les variables d’intérêt. Autrement dit, nous voulons garder ou ignorer certaines variables.
SAS possède l’option Keep ou Drop à cet effet.
DATA sous-ensemble-données;
SET ensemble-données;
WHERE variable_1='ce_qui_nous_interesse_1'
and variable_2='ce_qui_nous_interesse_2'
drop variable_1 variable_6 variable_7-variable_99
RUN;
ou
DATA sous-ensemble-données;
SET ensemble-données;
WHERE variable_1='ce_qui_nous_interesse_1'
and variable_2='ce_qui_nous_interesse_2'
keep variable_2 variable_3-variable_5 variable_7-variable_99
RUN;
Comment choisit-on entre les deux options?
Tout dépend bien sûr des variables dont nous avons besoin et du nombre de variables que nous avons à ignorer.
Exemple avec keep
#
Data work.bd_hk_veg;
set assu.cours_2;
cout_total=sum(cout1,cout2);
where type_prof='Hockeyeur'
and alimentation like 'Vé%';
keep numeropol type_prof alimentation cout_total;
run;
proc print data=work.bd_hk_veg (firstobs = 2 obs = 10);
format cout1-cout2 cout_total dollar12.2;
run;
Obs | numeropol | type_prof | alimentation | cout_total |
---|---|---|---|---|
2 | 24013 | Hockeyeur | Végétarien | . |
3 | 24660 | Hockeyeur | Végétarien | . |
4 | 56436 | Hockeyeur | Végétarien | . |
5 | 18535 | Hockeyeur | Végétalien | . |
6 | 21672 | Hockeyeur | Végétarien | . |
7 | 12342 | Hockeyeur | Végétarien | . |
8 | 74410 | Hockeyeur | Végétarien | . |
9 | 15159 | Hockeyeur | Végétarien | $456.26 |
10 | 32260 | Hockeyeur | Végétarien | . |
Exemple avec drop
#
Si nos variables d’intérêt sont (numeropol, type_prof, alimentation, cout_total), on voit que l’option la plus courte serait d’utiliser keep
Data work.bd_hk_veg;
set assu.cours_2;
cout_total=sum(cout1,cout2);
where type_prof='Hockeyeur'
and alimentation like 'Vé%';
drop debut_pol fin_pol freq_paiement langue type_territoire utilisation
presence_alarme annee_veh marque_voiture sexe date_naissance
couleur_voiture annee_permis myopie cheveux cout1-cout7 nbsin equipe ;
run;
proc print data=work.bd_hk_veg (firstobs = 2 obs = 10) noobs;
format cout1-cout2 cout_total dollar12.2;
run;
numeropol | type_prof | alimentation | cout_total |
---|---|---|---|
24013 | Hockeyeur | Végétarien | . |
24660 | Hockeyeur | Végétarien | . |
56436 | Hockeyeur | Végétarien | . |
18535 | Hockeyeur | Végétalien | . |
21672 | Hockeyeur | Végétarien | . |
12342 | Hockeyeur | Végétarien | . |
74410 | Hockeyeur | Végétarien | . |
15159 | Hockeyeur | Végétarien | $456.26 |
32260 | Hockeyeur | Végétarien | . |
Extraire un sous-ensemble avec de IF
#
Imaginons que nous voulons maintenant extraire un sous-ensemble de données avec les caractéristiques suivantes (Hokeyeur, végétarien ou végétalien, et que les coûts de sinistre est supérieur à 1000$).
Bien évidemment, on ne peut pas faire un WHERE
car la variable cout_total n’existe pas dans l’ensemble de données originales. Cette dernière a été créée seulement dans le sous-ensemble de données.
La fonction IF
sert justement à résoudre ce genre de situation;
Data work.bd_hk_veg;
set assu.cours_2;
cout_total=sum(cout1,cout2);
where type_prof='Hockeyeur'
and alimentation like 'Vé%';
keep numeropol type_prof alimentation cout_total;
if cout_total>1000;
run;
proc print data=work.bd_hk_veg (firstobs = 2 obs = 10) noobs;
format cout1-cout2 cout_total dollar12.2;
run;
numeropol | type_prof | alimentation | cout_total |
---|---|---|---|
84568 | Hockeyeur | Végétalien | $1,000.81 |
51085 | Hockeyeur | Végétarien | $70,040.85 |
12443 | Hockeyeur | Végétarien | $1,536.96 |
60675 | Hockeyeur | Végétarien | $3,105.94 |
1095 | Hockeyeur | Végétarien | $22,753.50 |
312 | Hockeyeur | Végétarien | $1,157.76 |
312 | Hockeyeur | Végétarien | $38,509.17 |
18535 | Hockeyeur | Végétarien | $3,857.07 |
44485 | Hockeyeur | Végétarien | $1,106.05 |
Maintenant, supposons que nous voulons afficher coût total en CAD
au lieu de cout_total
On se rappelle que nous avons l’option Label
à cet effet.
Data work.bd_hk_veg;
set assu.cours_2;
cout_total=sum(cout1,cout2);
where type_prof='Hockeyeur'
and alimentation like 'Vé%';
keep numeropol type_prof alimentation cout_total;
if cout_total>1000;
Label cout_total='coût total en CAD';
run;
proc print data=work.bd_hk_veg (firstobs = 2 obs = 10) label noobs;
format cout1-cout2 cout_total dollar12.2;
run;
numeropol | type_prof | alimentation | coût total en CAD |
---|---|---|---|
84568 | Hockeyeur | Végétalien | $1,000.81 |
51085 | Hockeyeur | Végétarien | $70,040.85 |
12443 | Hockeyeur | Végétarien | $1,536.96 |
60675 | Hockeyeur | Végétarien | $3,105.94 |
1095 | Hockeyeur | Végétarien | $22,753.50 |
312 | Hockeyeur | Végétarien | $1,157.76 |
312 | Hockeyeur | Végétarien | $38,509.17 |
18535 | Hockeyeur | Végétarien | $3,857.07 |
44485 | Hockeyeur | Végétarien | $1,106.05 |