演習の回答例#
SASの画面構成#
前のサンプルプログラムとCharm City Circulator Ridershipデータセットを使用し、以下の変更を加えてSASの動作を試してみてください。
属性マップデータセット
palette
を使用して、元の色とは異なる色に変更してください。SASの色のリストは https://support.sas.com/content/dam/SAS/support/en/books/pro-template-made-easy-a-guide-for-sas-users/62007_Appendix.pdf を参照してください。表示する曜日を変更し、
"Saturday"
ではなく"Sunday"
を表示するようにしてください。proc sgpanel
でseries
をscatter
に変更して、線グラフから散布図に変更してください。
%let working_directory = data; *Replace data with your path to your
directory containing the dataset;
proc import datafile = "&working_directory/Charm_City_Circulator_Ridership.csv"
out = circ dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc sort data = circ;
by day date daily;
run;
proc transpose data = circ out = long (rename=(_NAME_ = var col1 = number));
var orangeboardings -- banneraverage;
by day date daily;
run;
data long2;
set long;
var = tranwrd(var, 'Board', '_Board');
var = tranwrd(var, 'Alight', '_Alight');
var = tranwrd(var, 'Average', '_Average');
line = scan(var, 1, '_');
type = scan(var, 2, '_');
drop var;
run;
data avg;
set long2;
where (type = "Average");
run;
data palette;
input id $ value $ linecolor $;
markercolor = linecolor;
datalines;
lc banner red
lc green yellow
lc orange darkblue
lc purple brown
;
run;
proc sgpanel data = avg dattrmap=palette;
where day in ("Monday" "Tuesday" "Friday" "Sunday");
panelby day;
scatter Y = number X = date / group = line attrid = lc;
run;
基本的なSASプログラム#
以下のプログラムを実行してください。これは何を行うものでしょうか?
PROC PRINT DATA = sashelp.heart (OBS=10);
RUN;
PROC MEANS DATA = sashelp.heart;
VAR height weight;
RUN;
proc print data = sashelp.heart (obs=10);
run;
proc means data = sashelp.heart;
var height weight;
run;
OBS | Status | DeathCause | AgeCHDdiag | Sex | AgeAtStart | Height | Weight | Diastolic | Systolic | MRW | Smoking | AgeAtDeath | Cholesterol | Chol_Status | BP_Status | Weight_Status | Smoking_Status |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Dead | Other | . | Female | 29 | 62.50 | 140 | 78 | 124 | 121 | 0 | 55 | . | Normal | Overweight | Non-smoker | |
2 | Dead | Cancer | . | Female | 41 | 59.75 | 194 | 92 | 144 | 183 | 0 | 57 | 181 | Desirable | High | Overweight | Non-smoker |
3 | Alive | . | Female | 57 | 62.25 | 132 | 90 | 170 | 114 | 10 | . | 250 | High | High | Overweight | Moderate (6-15) | |
4 | Alive | . | Female | 39 | 65.75 | 158 | 80 | 128 | 123 | 0 | . | 242 | High | Normal | Overweight | Non-smoker | |
5 | Alive | . | Male | 42 | 66.00 | 156 | 76 | 110 | 116 | 20 | . | 281 | High | Optimal | Overweight | Heavy (16-25) | |
6 | Alive | . | Female | 58 | 61.75 | 131 | 92 | 176 | 117 | 0 | . | 196 | Desirable | High | Overweight | Non-smoker | |
7 | Alive | . | Female | 36 | 64.75 | 136 | 80 | 112 | 110 | 15 | . | 196 | Desirable | Normal | Overweight | Moderate (6-15) | |
8 | Dead | Other | . | Male | 53 | 65.50 | 130 | 80 | 114 | 99 | 0 | 77 | 276 | High | Normal | Normal | Non-smoker |
9 | Alive | . | Male | 35 | 71.00 | 194 | 68 | 132 | 124 | 0 | . | 211 | Borderline | Normal | Overweight | Non-smoker | |
10 | Dead | Cerebral Vascular Disease | . | Male | 52 | 62.50 | 129 | 78 | 124 | 106 | 5 | 82 | 284 | High | Normal | Normal | Light (1-5) |
MEANS プロシジャ
変数 | N | 平均 | 標準偏差 | 最小値 | 最大値 |
---|---|---|---|---|---|
Height
Weight
|
5203
5203
|
64.8131847
153.0866808
|
3.5827074
28.9154261
|
51.5000000
67.0000000
|
76.5000000
300.0000000
|
このプログラムはデータセットsashelp.heartの先頭10行と、変数「Height」と 「Weight」の要約統計量 N (サンプルサイズ), 平均, 標準偏差, 最小値, 最大値を出力します。
以下のプログラムを実行してください。いくつのDATAステップ、PROCステップが含まれ、どのステップが実行されるでしょうか?
data work.quant;
set sashelp.heart; /* Read in from the heart datset */
keep height weight diastolic systolic; *Only keep these variable
in the new dataset;
RUN;
proc print data = work.quant (obs=10);
run;
/*
proc means data = work.quant min q1 median q3 max mean std;
run;
*/
data work.quant;
set sashelp.heart; /* Read in from the heart datset */
keep height weight diastolic systolic; *Only keep these variable
in the new dataset;
run;
proc print data = work.quant (obs=10);
run;
/*
proc means data = work.quant min q1 median q3 max mean std;
run;
*/
OBS | Height | Weight | Diastolic | Systolic |
---|---|---|---|---|
1 | 62.50 | 140 | 78 | 124 |
2 | 59.75 | 194 | 92 | 144 |
3 | 62.25 | 132 | 90 | 170 |
4 | 65.75 | 158 | 80 | 128 |
5 | 66.00 | 156 | 76 | 110 |
6 | 61.75 | 131 | 92 | 176 |
7 | 64.75 | 136 | 80 | 112 |
8 | 65.50 | 130 | 80 | 114 |
9 | 71.00 | 194 | 68 | 132 |
10 | 62.50 | 129 | 78 | 124 |
データステップは1つ、PROCステップは2つあります。しかし最後のPROC MEANSはコメントアウトされているため実行されません。
データセット sashelp.heart でPROC CONTENTSを実行してください。データセットのオブザベーション数はいくつですか?
proc contents data = sashelp.heart;
run;
CONTENTS プロシジャ
データセット名 | SASHELP.HEART | オブザベーション数 | 5209 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 17 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2020/08/06 01:11:21 | オブザベーションのバッファ長 | 168 |
更新日時 | 2020/08/06 01:11:21 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | Framingham Heart Study | ||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | us-ascii ASCII (ANSI) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 65536 |
データセットのページ数 | 14 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 389 |
先頭ページのOBS数 | 365 |
データセットの修復数 | 0 |
ファイル名 | /pbr/sfw/sas/940/SASFoundation/9.4/sashelp/heart.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 83658455 |
アクセス権限 | rw-r--r-- |
所有者名 | odaowner |
ファイルサイズ | 960KB |
ファイルサイズ (バイト) | 983040 |
変数と属性リスト (アルファベット順) | ||||
---|---|---|---|---|
# | 変数 | タイプ | 長さ | ラベル |
12 | AgeAtDeath | 数値 | 8 | Age at Death |
5 | AgeAtStart | 数値 | 8 | Age at Start |
3 | AgeCHDdiag | 数値 | 8 | Age CHD Diagnosed |
15 | BP_Status | 文字 | 7 | Blood Pressure Status |
14 | Chol_Status | 文字 | 10 | Cholesterol Status |
13 | Cholesterol | 数値 | 8 | |
2 | DeathCause | 文字 | 26 | Cause of Death |
8 | Diastolic | 数値 | 8 | |
6 | Height | 数値 | 8 | |
10 | MRW | 数値 | 8 | Metropolitan Relative Weight |
4 | Sex | 文字 | 6 | |
11 | Smoking | 数値 | 8 | |
17 | Smoking_Status | 文字 | 17 | Smoking Status |
1 | Status | 文字 | 5 | |
9 | Systolic | 数値 | 8 | |
7 | Weight | 数値 | 8 | |
16 | Weight_Status | 文字 | 11 | Weight Status |
データセットには5209オブザベーション(行)があります。
以下のプログラムを実行してください。「CurrentDate」の値は何でしたか? (この値はSASが基準日とする1960/1/1からの経過日数です)
data work.date;
CurrentDate = Today();
run;
proc print data = work.date;
run;
data work.date;
CurrentDate = Today();
run;
proc print data = work.date;
run;
proc print data = work.date;
format currentdate mmddyy10.;
run;
OBS | CurrentDate |
---|---|
1 | 23533 |
OBS | CurrentDate |
---|---|
1 | 06/06/2024 |
「CurrentDate」の値はプログラムを実行した日によります。私は2024/06/06に実行したので値は23533で、1960/1/1から23533日です。
データの入出力#
PROC IMPORT を使用して、Youth_Tobacco_Survey_YTS_Data.csv を読み込み、それに youth という名前を付けます。
proc import datafile = "/folders/myfolders/SAS_Notes/data/Youth_Tobacco_Survey_YTS_Data.csv"
out = youth dbms = csv replace;
getnames = yes;
guessingrows = 500;
run;
proc print data = youth (obs=5);
run;
OBS | YEAR | LocationAbbr | LocationDesc | TopicType | TopicDesc | MeasureDesc | DataSource | Response | Data_Value_Unit | Data_Value_Type | Data_Value | Data_Value_Footnote_Symbol | Data_Value_Footnote | Data_Value_Std_Err | Low_Confidence_Limit | High_Confidence_Limit | Sample_Size | Gender | Race | Age | Education | GeoLocation | TopicTypeId | TopicId | MeasureId | StratificationID1 | StratificationID2 | StratificationID3 | StratificationID4 | SubMeasureID | DisplayOrder |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2015 | AZ | Arizona | Tobacco Use - Survey Data | Cessation (Youth) | Percent of Current Smokers Who Want to Quit | YTS | % | Percentage | . | * | Data in these cells have been suppressed because of a small sample size | . | . | . | . | Overall | All Races | All Ages | Middle School | (34.865970280000454, -111.76381127699972) | BEH | 105BEH | 170CES | 1GEN | 8AGE | 6RAC | 1EDU | YTS01 | 1 | |
2 | 2015 | AZ | Arizona | Tobacco Use - Survey Data | Cessation (Youth) | Percent of Current Smokers Who Want to Quit | YTS | % | Percentage | . | * | Data in these cells have been suppressed because of a small sample size | . | . | . | . | Male | All Races | All Ages | Middle School | (34.865970280000454, -111.76381127699972) | BEH | 105BEH | 170CES | 2GEN | 8AGE | 6RAC | 1EDU | YTS02 | 2 | |
3 | 2015 | AZ | Arizona | Tobacco Use - Survey Data | Cessation (Youth) | Percent of Current Smokers Who Want to Quit | YTS | % | Percentage | . | * | Data in these cells have been suppressed because of a small sample size | . | . | . | . | Female | All Races | All Ages | Middle School | (34.865970280000454, -111.76381127699972) | BEH | 105BEH | 170CES | 3GEN | 8AGE | 6RAC | 1EDU | YTS03 | 3 | |
4 | 2015 | AZ | Arizona | Tobacco Use - Survey Data | Cessation (Youth) | Quit Attempt in Past Year Among Current Cigarette Smokers | YTS | % | Percentage | . | * | Data in these cells have been suppressed because of a small sample size | . | . | . | . | Overall | All Races | All Ages | Middle School | (34.865970280000454, -111.76381127699972) | BEH | 105BEH | 169QUA | 1GEN | 8AGE | 6RAC | 1EDU | YTS04 | 4 | |
5 | 2015 | AZ | Arizona | Tobacco Use - Survey Data | Cessation (Youth) | Quit Attempt in Past Year Among Current Cigarette Smokers | YTS | % | Percentage | . | * | Data in these cells have been suppressed because of a small sample size | . | . | . | . | Male | All Races | All Ages | Middle School | (34.865970280000454, -111.76381127699972) | BEH | 105BEH | 169QUA | 2GEN | 8AGE | 6RAC | 1EDU | YTS05 | 5 |
READMEに記載のリンクからMonumentsデータセット、Monuments.xlsxをダウンロードします。PROC IMPORTを使ってデータセットを読み込み、monという名前で出力します。
proc import datafile = "/folders/myfolders/SAS_Notes/data/Monuments.xlsx"
out = mon dbms = xlsx replace;
getnames = yes;
run;
proc print data = mon (obs=5);
run;
OBS | name | zipCode | neighborhood | councilDistrict | policeDistrict | Location 1 |
---|---|---|---|---|---|---|
1 | James Cardinal Gibbons | 21201 | Downtown | 11 | CENTRAL | 408 CHARLES ST Baltimore, MD |
2 | The Battle Monument | 21202 | Downtown | 11 | CENTRAL | |
3 | Negro Heroes of the U.S Monument | 21202 | Downtown | 11 | CENTRAL | |
4 | Star Bangled Banner | 21202 | Downtown | 11 | CENTRAL | 100 HOLLIDAY ST Baltimore, MD |
5 | Flame at the Holocaust Monument | 21202 | Downtown | 11 | CENTRAL | 50 MARKET PL Baltimore, MD |
DATALINESを使って以下の列フォーマットデータを読み込み、PROC PRINTを使って結果を出力するDATAステップを書きます。このデータセットには、フランスのIlle-et-Vilaineにおける食道癌の情報が含まれています。変数は
年齢層
アルコール消費量
タバコ消費量
症例数
コントロール数
データを読み込むためにDATAステップを書いて結果を表示させます。注意: 最初の行は列を数えるためのものです。各数値に5をかけたものが列番号になります。
----1----2----3----4----5----6----7----8
75+ 0-39g/day 0-9g/day 1 18
75+ 0-39g/day 10-19 2 6
75+ 0-39g/day 30+ 1 3
75+ 40-79 0-9g/day 2 5
75+ 40-79 10-19 1 3
75+ 40-79 20-29 0 3
75+ 40-79 30+ 1 1
75+ 80-119 0-9g/day 1 1
75+ 80-119 10-19 1 1
75+ 120+ 0-9g/day 2 2
75+ 120+ 10-19 1 1
data eso;
input aggrp $ 1-3 alc $ 5-13 smoke $ 15-22 ncases 29 ncontrl 38-39;
datalines;
75+ 0-39g/day 0-9g/day 1 18
75+ 0-39g/day 10-19 2 6
75+ 0-39g/day 30+ 1 3
75+ 40-79 0-9g/day 2 5
75+ 40-79 10-19 1 3
75+ 40-79 20-29 0 3
75+ 40-79 30+ 1 1
75+ 80-119 0-9g/day 1 1
75+ 80-119 10-19 1 1
75+ 120+ 0-9g/day 2 2
75+ 120+ 10-19 1 1
;
run;
proc print data=eso;
run;
OBS | aggrp | alc | smoke | ncases | ncontrl |
---|---|---|---|---|---|
1 | 75+ | 0-39g/day | 0-9g/day | 1 | 18 |
2 | 75+ | 0-39g/day | 10-19 | 2 | 6 |
3 | 75+ | 0-39g/day | 30+ | 1 | 3 |
4 | 75+ | 40-79 | 0-9g/day | 2 | 5 |
5 | 75+ | 40-79 | 10-19 | 1 | 3 |
6 | 75+ | 40-79 | 20-29 | 0 | 3 |
7 | 75+ | 40-79 | 30+ | 1 | 1 |
8 | 75+ | 80-119 | 0-9g/day | 1 | 1 |
9 | 75+ | 80-119 | 10-19 | 1 | 1 |
10 | 75+ | 120+ | 0-9g/day | 2 | 2 |
11 | 75+ | 120+ | 10-19 | 1 | 1 |
SAS変数と代入ステートメント#
次のSASデータステップを使って、新しい変数「Grade」と「Course」を以下の定義に従って作成してください。
data school;
input Age Quiz : $1. Midterm Final;
/* ここにステートメントを追加 */
datalines;
12 A 92 95
12 B 88 88
13 C 78 75
13 A 92 93
12 F 55 62
13 B 88 82
;
If-Then-Elseステートメントを使って新しい2つの変数を作成してください。
Grade(数値)の値は、Ageが12の場合は6、Ageが13の場合は8となります。
クイズの成績には以下の数値が対応しています: A=95、B=85、C=75、D=70、F=65
この情報を使って、コースの成績「Course」(クイズ「Quiz」20%、中間試験「Midterm」30%、期末試験「Final」50%の加重平均)を計算してください。
data school;
input Age Quiz : $1. Midterm Final;
if Age = 12 then Grade = 6;
else if AGE = 13 then Grade = 8;
if quiz = "A" theN Course = 0.2*95 + 0.3*midterm + 0.5*final;
else if quiz = "B" then Course = 0.2*85 + 0.3*midterm + 0.5*final;
else if quiz = "C" then Course = 0.2*75 + 0.3*midterm + 0.5*final;
else if quiz = "D" then Course = 0.2*70 + 0.3*midterm + 0.5*final;
else if quiz = "F" then Course = 0.2*65 + 0.3*midterm + 0.5*final;
datalines;
12 A 92 95
12 B 88 88
13 C 78 75
13 A 92 93
12 F 55 62
13 B 88 82
;
run;
proc print data = school;
run;
OBS | Age | Quiz | Midterm | Final | Grade | Course |
---|---|---|---|---|---|---|
1 | 12 | A | 92 | 95 | 6 | 94.1 |
2 | 12 | B | 88 | 88 | 6 | 87.4 |
3 | 13 | C | 78 | 75 | 8 | 75.9 |
4 | 13 | A | 92 | 93 | 8 | 93.1 |
5 | 12 | F | 55 | 62 | 6 | 60.5 |
6 | 13 | B | 88 | 82 | 8 | 84.4 |
データの操作#
データセットsashelp.heartから一時SASデータセット
heart
を作成してください。(ライブラリsashelpは、SASに同梱された永久ライブラリです)
data heart;
set sashelp.heart;
run;
13 SAS システム 2024年 6月 6日 木曜日 09時33分00秒
223 ods listing close;ods html5 (id=saspy_internal) file=_tomods1 options(bitmap_mode='inline') device=svg style=HTMLBlue;
223 ! ods graphics on / outputfmt=png;
224
225 options notes ;
226 data heart;
227 set sashelp.heart;
228 run;
NOTE: データセットSASHELP.HEARTから5209オブザベーションを読み込みました。
NOTE: データセットWORK.HEARTは5209オブザベーション、17変数です。
NOTE: DATA ステートメント処理(合計処理時間):
処理時間 0.00 秒
ユーザーCPU時間 0.00 秒
システムCPU時間 0.00 秒
メモリ 2185.21k
OSメモリ 23724.00k
タイムスタンプ 2024/06/06 午前09:35:26
ステップ数 10 スイッチ数 2
ページフォルト回数 0
ページリクレーム回数 259
ページスワップ回数 0
自発的コンテキストスイッチ回数 9
非自発的コンテキストスイッチ回数 0
ブロック入力操作回数 0
ブロック出力操作回数 1800
229
230
231 ods html5 (id=saspy_internal) close;ods listing;
232
14 SAS システム 2024年 6月 6日 木曜日 09時33分00秒
233
PROC CONTENTSを実行してデータセット
heart
のディスクリプタ部を表示してください。このデータセットにはいくつのオブザベーション(行)と変数(列)がありますか?
proc contents data = heart;
run;
CONTENTS プロシジャ
データセット名 | WORK.HEART | オブザベーション数 | 5209 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 17 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:35:27 | オブザベーションのバッファ長 | 168 |
更新日時 | 2024/06/06 09:35:27 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 7 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 779 |
先頭ページのOBS数 | 755 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536881018 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 1MB |
ファイルサイズ (バイト) | 1048576 |
変数と属性リスト (アルファベット順) | ||||
---|---|---|---|---|
# | 変数 | タイプ | 長さ | ラベル |
12 | AgeAtDeath | 数値 | 8 | Age at Death |
5 | AgeAtStart | 数値 | 8 | Age at Start |
3 | AgeCHDdiag | 数値 | 8 | Age CHD Diagnosed |
15 | BP_Status | 文字 | 7 | Blood Pressure Status |
14 | Chol_Status | 文字 | 10 | Cholesterol Status |
13 | Cholesterol | 数値 | 8 | |
2 | DeathCause | 文字 | 26 | Cause of Death |
8 | Diastolic | 数値 | 8 | |
6 | Height | 数値 | 8 | |
10 | MRW | 数値 | 8 | Metropolitan Relative Weight |
4 | Sex | 文字 | 6 | |
11 | Smoking | 数値 | 8 | |
17 | Smoking_Status | 文字 | 17 | Smoking Status |
1 | Status | 文字 | 5 | |
9 | Systolic | 数値 | 8 | |
7 | Weight | 数値 | 8 | |
16 | Weight_Status | 文字 | 11 | Weight Status |
5209オブザベーション(行)と17変数(列)
データセットオプションのRENAME=オプションを使って、
Status
をcondition
に変更します。PROC CONTENTSの変数の一覧を表示して、名前が変更されたことを確認してください。
data heart2 (rename = (status = condition));
set heart;
run;
proc contents data = heart2;
run;
CONTENTS プロシジャ
データセット名 | WORK.HEART2 | オブザベーション数 | 5209 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 17 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:36:02 | オブザベーションのバッファ長 | 168 |
更新日時 | 2024/06/06 09:36:02 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 7 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 779 |
先頭ページのOBS数 | 755 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart2.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536875385 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 1MB |
ファイルサイズ (バイト) | 1048576 |
変数と属性リスト (アルファベット順) | ||||
---|---|---|---|---|
# | 変数 | タイプ | 長さ | ラベル |
12 | AgeAtDeath | 数値 | 8 | Age at Death |
5 | AgeAtStart | 数値 | 8 | Age at Start |
3 | AgeCHDdiag | 数値 | 8 | Age CHD Diagnosed |
15 | BP_Status | 文字 | 7 | Blood Pressure Status |
14 | Chol_Status | 文字 | 10 | Cholesterol Status |
13 | Cholesterol | 数値 | 8 | |
2 | DeathCause | 文字 | 26 | Cause of Death |
8 | Diastolic | 数値 | 8 | |
6 | Height | 数値 | 8 | |
10 | MRW | 数値 | 8 | Metropolitan Relative Weight |
4 | Sex | 文字 | 6 | |
11 | Smoking | 数値 | 8 | |
17 | Smoking_Status | 文字 | 17 | Smoking Status |
9 | Systolic | 数値 | 8 | |
7 | Weight | 数値 | 8 | |
16 | Weight_Status | 文字 | 11 | Weight Status |
1 | condition | 文字 | 5 |
データセット
heart
からサブセットheart_sub
を作成し、height
、weight
、diastolic
の列のみを含めます。heart_sub
のオブザベーション(行)と変数(列)はいくつですか?heart_sub
の最初の5行を出力してください。
data heart_sub;
set heart;
keep height weight diastolic;
run;
proc contents data = heart_sub;
run;
proc print data = heart_sub(obs=5);
run;
CONTENTS プロシジャ
データセット名 | WORK.HEART_SUB | オブザベーション数 | 5209 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 3 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:36:18 | オブザベーションのバッファ長 | 24 |
更新日時 | 2024/06/06 09:36:18 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 5431 |
先頭ページのOBS数 | 5209 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536875977 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||
---|---|---|---|
# | 変数 | タイプ | 長さ |
3 | Diastolic | 数値 | 8 |
1 | Height | 数値 | 8 |
2 | Weight | 数値 | 8 |
OBS | Height | Weight | Diastolic |
---|---|---|---|
1 | 62.50 | 140 | 78 |
2 | 59.75 | 194 | 92 |
3 | 62.25 | 132 | 90 |
4 | 65.75 | 158 | 80 |
5 | 66.00 | 156 | 76 |
データセットheart_sub
は5209行 3列
データセット
heart
から、拡張期血圧(diastolic)が90を超える被験者の行をデータセットheart_sub2
にサブセットします。何オブザベーションありますか?heart_sub2
の最初の5行を出力してください。
data heart_sub2;
set heart;
where diastolic > 90;
run;
proc contents data = heart_sub2;
run;
proc print data = heart_sub2(obs=5);
run;
CONTENTS プロシジャ
データセット名 | WORK.HEART_SUB2 | オブザベーション数 | 1366 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 17 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:36:36 | オブザベーションのバッファ長 | 168 |
更新日時 | 2024/06/06 09:36:36 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 2 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 779 |
先頭ページのOBS数 | 755 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub2.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536898439 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 384KB |
ファイルサイズ (バイト) | 393216 |
変数と属性リスト (アルファベット順) | ||||
---|---|---|---|---|
# | 変数 | タイプ | 長さ | ラベル |
12 | AgeAtDeath | 数値 | 8 | Age at Death |
5 | AgeAtStart | 数値 | 8 | Age at Start |
3 | AgeCHDdiag | 数値 | 8 | Age CHD Diagnosed |
15 | BP_Status | 文字 | 7 | Blood Pressure Status |
14 | Chol_Status | 文字 | 10 | Cholesterol Status |
13 | Cholesterol | 数値 | 8 | |
2 | DeathCause | 文字 | 26 | Cause of Death |
8 | Diastolic | 数値 | 8 | |
6 | Height | 数値 | 8 | |
10 | MRW | 数値 | 8 | Metropolitan Relative Weight |
4 | Sex | 文字 | 6 | |
11 | Smoking | 数値 | 8 | |
17 | Smoking_Status | 文字 | 17 | Smoking Status |
1 | Status | 文字 | 5 | |
9 | Systolic | 数値 | 8 | |
7 | Weight | 数値 | 8 | |
16 | Weight_Status | 文字 | 11 | Weight Status |
OBS | Status | DeathCause | AgeCHDdiag | Sex | AgeAtStart | Height | Weight | Diastolic | Systolic | MRW | Smoking | AgeAtDeath | Cholesterol | Chol_Status | BP_Status | Weight_Status | Smoking_Status |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Dead | Cancer | . | Female | 41 | 59.75 | 194 | 92 | 144 | 183 | 0 | 57 | 181 | Desirable | High | Overweight | Non-smoker |
2 | Alive | . | Female | 58 | 61.75 | 131 | 92 | 176 | 117 | 0 | . | 196 | Desirable | High | Overweight | Non-smoker | |
3 | Alive | . | Female | 42 | 67.75 | 162 | 96 | 138 | 119 | 1 | . | 200 | Borderline | High | Overweight | Light (1-5) | |
4 | Dead | Coronary Heart Disease | 71 | Female | 49 | 60.50 | 153 | 110 | 196 | 140 | 5 | 73 | 221 | Borderline | High | Overweight | Light (1-5) |
5 | Alive | 43 | Male | 33 | 66.50 | 172 | 106 | 146 | 127 | 0 | . | 247 | High | High | Overweight | Non-smoker |
拡張期血圧(diastolic)が90より高いオブザベーションは1366
データセット
heart
から、拡張期血圧が90以下で体重が180ポンド以上の被験者の行をデータセットheart_sub3
にサブセットします。何オブザベーションありますか?heart_sub3
の最初の5行を出力してください。
data heart_sub3;
set heart;
where diastolic <= 90 and weight > 180;
run;
proc contents data = heart_sub3;
run;
proc print data = heart_sub3(obs=5);
run;
CONTENTS プロシジャ
データセット名 | WORK.HEART_SUB3 | オブザベーション数 | 481 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 17 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:37:06 | オブザベーションのバッファ長 | 168 |
更新日時 | 2024/06/06 09:37:06 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 779 |
先頭ページのOBS数 | 481 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub3.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536898451 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | ||||
---|---|---|---|---|
# | 変数 | タイプ | 長さ | ラベル |
12 | AgeAtDeath | 数値 | 8 | Age at Death |
5 | AgeAtStart | 数値 | 8 | Age at Start |
3 | AgeCHDdiag | 数値 | 8 | Age CHD Diagnosed |
15 | BP_Status | 文字 | 7 | Blood Pressure Status |
14 | Chol_Status | 文字 | 10 | Cholesterol Status |
13 | Cholesterol | 数値 | 8 | |
2 | DeathCause | 文字 | 26 | Cause of Death |
8 | Diastolic | 数値 | 8 | |
6 | Height | 数値 | 8 | |
10 | MRW | 数値 | 8 | Metropolitan Relative Weight |
4 | Sex | 文字 | 6 | |
11 | Smoking | 数値 | 8 | |
17 | Smoking_Status | 文字 | 17 | Smoking Status |
1 | Status | 文字 | 5 | |
9 | Systolic | 数値 | 8 | |
7 | Weight | 数値 | 8 | |
16 | Weight_Status | 文字 | 11 | Weight Status |
OBS | Status | DeathCause | AgeCHDdiag | Sex | AgeAtStart | Height | Weight | Diastolic | Systolic | MRW | Smoking | AgeAtDeath | Cholesterol | Chol_Status | BP_Status | Weight_Status | Smoking_Status |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Alive | . | Male | 35 | 71.00 | 194 | 68 | 132 | 124 | 0 | . | 211 | Borderline | Normal | Overweight | Non-smoker | |
2 | Alive | . | Female | 50 | 67.50 | 185 | 88 | 150 | 136 | 15 | . | 228 | Borderline | High | Overweight | Moderate (6-15) | |
3 | Alive | . | Male | 42 | 72.25 | 182 | 78 | 136 | 113 | 0 | . | 221 | Borderline | Normal | Overweight | Non-smoker | |
4 | Alive | 68 | Male | 40 | 70.00 | 189 | 78 | 124 | 124 | 0 | . | 319 | High | Normal | Overweight | Non-smoker | |
5 | Alive | 68 | Male | 40 | 70.00 | 195 | 76 | 132 | 128 | 20 | . | 205 | Borderline | Normal | Overweight | Heavy (16-25) |
拡張期血圧が90以下で体重が180ポンド以上なのは481オブザベーション
データセット
heart
から重度の喫煙者(Smoking_Status = “Heavy (16-25)”)について、weight
、systolic
、cholesterol
の列のみを含むサブセットを作成します。このサブセットをheart_sub
に保存します。このデータセットののオブザベーション(行)と変数(列)はいくつですか?heart_sub
の最初の5行を出力してください。
data heart_sub;
set heart;
where Smoking_Status = "Heavy (16-25)";
keep weight systolic cholesterol;
run;
proc contents data = heart_sub;
run;
proc print data = heart_sub(obs=5);
run;
CONTENTS プロシジャ
データセット名 | WORK.HEART_SUB | オブザベーション数 | 1046 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 3 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:37:25 | オブザベーションのバッファ長 | 24 |
更新日時 | 2024/06/06 09:37:25 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 5431 |
先頭ページのOBS数 | 1046 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536875336 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||
---|---|---|---|
# | 変数 | タイプ | 長さ |
3 | Cholesterol | 数値 | 8 |
2 | Systolic | 数値 | 8 |
1 | Weight | 数値 | 8 |
OBS | Weight | Systolic | Cholesterol |
---|---|---|---|
1 | 156 | 110 | 281 |
2 | 195 | 132 | 205 |
3 | 181 | 144 | 223 |
4 | 152 | 144 | 263 |
5 | 196 | 128 | . |
データセットheart_sub
は1046オブザベーション、3変数
データセット
heart_sub
の行を、コレステロール値の降順で並べ替えます。並べ替えたデータセットの最初の5行を出力してください。
proc sort data = heart_sub out = heart_sub_srt;
by descending cholesterol;
run;
proc print data = heart_sub_srt(obs=5);
run;
OBS | Weight | Systolic | Cholesterol |
---|---|---|---|
1 | 169 | 155 | 568 |
2 | 205 | 154 | 534 |
3 | 194 | 150 | 429 |
4 | 104 | 122 | 392 |
5 | 137 | 185 | 368 |
データの要約#
Baltimoreにはいくつの自転車レーンがありますか?各オブザベーション/行が異なる自転車レーンであると想定できます。
proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
out = bike dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc contents data = bike;
run;
CONTENTS プロシジャ
データセット名 | WORK.BIKE | オブザベーション数 | 1631 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 9 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:38:03 | オブザベーションのバッファ長 | 136 |
更新日時 | 2024/06/06 09:38:03 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 2 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 962 |
先頭ページのOBS数 | 940 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/bike.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536873870 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 384KB |
ファイルサイズ (バイト) | 393216 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
3 | block | 文字 | 29 | $29. | $29. |
9 | dateInstalled | 数値 | 8 | BEST12. | BEST32. |
8 | length | 数値 | 8 | BEST12. | BEST32. |
2 | name | 文字 | 20 | $20. | $20. |
5 | numLanes | 数値 | 8 | BEST12. | BEST32. |
6 | project | 文字 | 25 | $25. | $25. |
7 | route | 文字 | 13 | $13. | $13. |
1 | subType | 文字 | 6 | $6. | $6. |
4 | type | 文字 | 15 | $15. | $15. |
自転車レーンの数は1631
Baltimoreにある自転車レーンの総延長距離は(a)フィート数と(b)マイル数でいくらですか?(変数「length」が延長距離で単位はフィート、1マイルは5280フィート)
proc means data = bike sum;
var length;
run;
MEANS プロシジャ
分析変数 : length |
---|
合計 |
439447.59 |
data miles;
length_mi = 439447.59 / 5280;
run;
proc print data = miles;
run;
OBS | length_mi |
---|---|
1 | 83.2287 |
自転車レーンの種類(type)は何種類ありますか?最も多い種類と(b)平均レーン長が最も長い種類はどれですか?
proc freq data = bike;
table type;
run;
proc means data = bike noprint;
class type;
var length;
output out = type_mean mean = length_mean;
run;
proc sort data = type_mean;
by descending length_mean;
run;
proc print data = type_mean;
run;
FREQ プロシジャ
type | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
欠損値の度数 = 9 | ||||
BIKE BOULEVARD | 49 | 3.02 | 49 | 3.02 |
BIKE LANE | 621 | 38.29 | 670 | 41.31 |
CONTRAFLOW | 13 | 0.80 | 683 | 42.11 |
SHARED BUS BIKE | 39 | 2.40 | 722 | 44.51 |
SHARROW | 589 | 36.31 | 1311 | 80.83 |
SIDEPATH | 7 | 0.43 | 1318 | 81.26 |
SIGNED ROUTE | 304 | 18.74 | 1622 | 100.00 |
OBS | type | _TYPE_ | _FREQ_ | length_mean |
---|---|---|---|---|
1 | SIDEPATH | 1 | 7 | 665.87751019 |
2 | BIKE LANE | 1 | 621 | 300.24183502 |
3 | SHARED BUS BIKE | 1 | 39 | 276.66575695 |
4 | 0 | 1622 | 269.48876975 | |
5 | SIGNED ROUTE | 1 | 304 | 263.57986593 |
6 | SHARROW | 1 | 589 | 243.8718592 |
7 | BIKE BOULEVARD | 1 | 49 | 197.27815495 |
8 | CONTRAFLOW | 1 | 13 | 136.46646088 |
自転車レーンの種類は7(欠損値を含めた場合は8)、最も多い種類はbike laneで621、平均レーン長が最も長いのはsidepathで 665.88 ft.
自転車レーンはいくつのプロジェクト(project)に分かれていますか?最も平均レーン長が長いプロジェクトカテゴリはどれですか?
proc freq data = bike;
table project;
run;
proc means data = bike noprint;
class project;
var length;
output out = project_mean mean = length_mean;
run;
proc sort data = project_mean;
by descending length_mean;
run;
proc print data = project_mean;
run;
FREQ プロシジャ
project | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
欠損値の度数 = 74 | ||||
CHARM CITY CIRCULATOR | 39 | 2.50 | 39 | 2.50 |
COLLEGETOWN | 339 | 21.77 | 378 | 24.28 |
COLLEGETOWN NETWORK | 13 | 0.83 | 391 | 25.11 |
ENGINEERING CONSTRUCTION | 12 | 0.77 | 403 | 25.88 |
GUILFORD AVE BIKE BLVD | 49 | 3.15 | 452 | 29.03 |
MAINTENANCE | 4 | 0.26 | 456 | 29.29 |
OPERATION ORANGE CONE | 458 | 29.42 | 914 | 58.70 |
PARK HEIGHTS BIKE NETWORK | 172 | 11.05 | 1086 | 69.75 |
PLANNING TRAFFIC | 18 | 1.16 | 1104 | 70.91 |
SOUTHEAST BIKE NETWORK | 323 | 20.75 | 1427 | 91.65 |
TRAFFIC | 51 | 3.28 | 1478 | 94.93 |
TRAFFIC CALMING | 79 | 5.07 | 1557 | 100.00 |
OBS | project | _TYPE_ | _FREQ_ | length_mean |
---|---|---|---|---|
1 | MAINTENANCE | 1 | 4 | 1942.1522856 |
2 | ENGINEERING CONSTRUCTION | 1 | 12 | 512.09762483 |
3 | TRAFFIC | 1 | 51 | 419.52878809 |
4 | COLLEGETOWN | 1 | 339 | 320.68363126 |
5 | PARK HEIGHTS BIKE NETWORK | 1 | 172 | 283.22519367 |
6 | CHARM CITY CIRCULATOR | 1 | 39 | 276.66575695 |
7 | 0 | 1557 | 272.0534698 | |
8 | TRAFFIC CALMING | 1 | 79 | 268.53137627 |
9 | OPERATION ORANGE CONE | 1 | 458 | 250.07840273 |
10 | COLLEGETOWN NETWORK | 1 | 13 | 213.63728443 |
11 | SOUTHEAST BIKE NETWORK | 1 | 323 | 210.82827388 |
12 | PLANNING TRAFFIC | 1 | 18 | 209.42893827 |
13 | GUILFORD AVE BIKE BLVD | 1 | 49 | 197.27815495 |
プロジェクトの数は12(欠損値を含めると13)で、 maintenanceプロジェクトが平均レーン長が1942.15 ftで最も長い
設置された年ごとの自転車レーンの平均延長距離はどのくらいですか?(「dateInstalled」が0の場合は先に値を.としてください)
data bike;
set bike;
if dateinstalled = 0 then dateinstalled = .;
run;
proc means data = bike mean;
class dateinstalled;
var length;
run;
MEANS プロシジャ
分析変数 : length | ||
---|---|---|
dateInstalled | Obs 数 | 平均 |
2006 | 2 | 1469.35 |
2007 | 368 | 309.8903287 |
2008 | 206 | 249.4810027 |
2009 | 86 | 407.2947463 |
2010 | 625 | 245.6015777 |
2011 | 101 | 232.8127593 |
2012 | 107 | 271.4321825 |
2013 | 10 | 290.4263702 |
自転車レーンの長さ(length)の分布を(a)統計量、(b)グラフにより表してください。
proc univariate data = bike plots;
var length;
run;
UNIVARIATE プロシジャ
変数 : length
モーメント | |||
---|---|---|---|
N | 1631 | 重み変数の合計 | 1631 |
平均 | 269.434449 | 合計 | 439447.587 |
標準偏差 | 277.706646 | 分散 | 77120.9813 |
歪度 | 5.1297861 | 尖度 | 43.3888947 |
無修正平方和 | 244109518 | 修正済平方和 | 125707200 |
変動係数 | 103.070208 | 平均の標準誤差 | 6.87637089 |
基本統計量 | |||
---|---|---|---|
位置 | ばらつき | ||
平均 | 269.4344 | 標準偏差 | 277.70665 |
中央値 | 200.3027 | 分散 | 77121 |
最頻値 | . | 範囲 | 3749 |
四分位範囲 | 217.16479 |
位置の検定 H0: Mu0=0 | ||||
---|---|---|---|---|
検定 | 統計量 | p 値 | ||
Student の t 検定 | t | 39.18265 | Pr > |t| | <.0001 |
符号検定 | M | 815 | Pr >= |M| | <.0001 |
符号付順位検定 | S | 664632.5 | Pr >= |S| | <.0001 |
分位点 (定義 5) | |
---|---|
水準 | 分位点 |
100% 最大値 | 3749.3226 |
99% | 1341.8291 |
95% | 664.2305 |
90% | 502.2232 |
75% Q3 | 341.1493 |
50% 中央値 | 200.3027 |
25% Q1 | 123.9845 |
10% | 67.8206 |
5% | 45.3655 |
1% | 14.8383 |
0% 最小値 | 0.0000 |
極値 | |||
---|---|---|---|
最小値 | 最大値 | ||
値 | Obs | 値 | Obs |
0.00000 | 4 | 2536.73 | 1284 |
5.51372 | 523 | 2715.20 | 1344 |
6.85712 | 724 | 2916.53 | 903 |
8.16243 | 490 | 3467.68 | 904 |
9.71914 | 595 | 3749.32 | 3 |
自転車レーンの長さの分布を(a)type、(b)numLanesごとに層別化して、統計量とグラフに表してください。
proc means data=bike mean std;
class type;
var length;
run;
proc sgplot data = bike;
vbox length / category = type;
run;
proc means data=bike mean std;
class numlanes;
var length;
run;
proc sgplot data = bike;
vbox length / category = numlanes;
run;
MEANS プロシジャ
分析変数 : length | |||
---|---|---|---|
type | Obs 数 | 平均 | 標準偏差 |
BIKE BOULEVARD | 49 | 197.2781549 | 113.1318019 |
BIKE LANE | 621 | 300.2418350 | 314.6605599 |
CONTRAFLOW | 13 | 136.4664609 | 48.5165725 |
SHARED BUS BIKE | 39 | 276.6657570 | 140.1811711 |
SHARROW | 589 | 243.8718592 | 188.4222254 |
SIDEPATH | 7 | 665.8775102 | 619.3894227 |
SIGNED ROUTE | 304 | 263.5798659 | 347.8501541 |
MEANS プロシジャ
分析変数 : length | |||
---|---|---|---|
numLanes | Obs 数 | 平均 | 標準偏差 |
0 | 21 | 308.3767969 | 201.5548096 |
1 | 900 | 277.9016282 | 317.8281529 |
2 | 710 | 257.5495894 | 218.6179448 |
フォーマットと日付#
Freqプロシージャを使用して、bike lane 種類別の表を作成してください。
proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
out = bike dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc freq data = bike;
table type;
run;
FREQ プロシジャ
type | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
欠損値の度数 = 9 | ||||
BIKE BOULEVARD | 49 | 3.02 | 49 | 3.02 |
BIKE LANE | 621 | 38.29 | 670 | 41.31 |
CONTRAFLOW | 13 | 0.80 | 683 | 42.11 |
SHARED BUS BIKE | 39 | 2.40 | 722 | 44.51 |
SHARROW | 589 | 36.31 | 1311 | 80.83 |
SIDEPATH | 7 | 0.43 | 1318 | 81.26 |
SIGNED ROUTE | 304 | 18.74 | 1622 | 100.00 |
bike lane について”SIDEPATH”, “BIKE BOULEVARD” と “BIKE LANE”はそのまま、その他は “ “とするフォーマットを作成し、Freqプロシージャでフォーマットを使用してbike lane種類別の表を作成してください。表はどのようになりましたか?
proc format;
value $typefmt "SIDEPATH" = "SIDEPATH"
"BIKE BOULEVARD" = "BIKE BOULEVARD"
"BIKE LANE" = "BIKE LANE"
OTHER = " ";
run;
data bike2;
set bike;
format type $typefmt.;
run;
proc freq data = bike2;
table type;
run;
FREQ プロシジャ
type | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
欠損値の度数 = 954 | ||||
BIKE BOULEVARD | 49 | 7.24 | 49 | 7.24 |
BIKE LANE | 621 | 91.73 | 670 | 98.97 |
SIDEPATH | 7 | 1.03 | 677 | 100.00 |
“SIDEPATH”, “BIKE BOULEVARD” と “BIKE LANE”以外を欠損値にしたため、3つの水準の表となった。
bike lane について”CONTRAFLOW”, “SHARED BUS BIKE”, “SHARROW”, “SIGNED ROUTE”はそのまま、その他は “OTHER”とするフォーマットを作成し、Freqプロシージャでフォーマットを使用してbike lane種類別の表を作成してください。
proc format;
value $type2fmt "CONTRAFLOW" = "CONTRAFLOW"
"SHARED BUS BIKE" = "SHARED BUS BIKE"
"SHARROW" = "SHARROW"
"SIGNED ROUTE" = "SIGNED ROUTE"
"SIDEPATH", "BIKE BOULEVARD", "BIKE LANE" = "OTHER";
run;
data bike3;
set bike;
format type $type2fmt.;
run;
proc freq data = bike3;
table type;
run;
FREQ プロシジャ
type | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
欠損値の度数 = 9 | ||||
OTHER | 677 | 41.74 | 677 | 41.74 |
CONTRAFLOW | 13 | 0.80 | 690 | 42.54 |
SHARED BUS BIKE | 39 | 2.40 | 729 | 44.94 |
SHARROW | 589 | 36.31 | 1318 | 81.26 |
SIGNED ROUTE | 304 | 18.74 | 1622 | 100.00 |
以下の日付3つと時間を含むデータセットを読み込むようなデータステップのコードを作成してください。その後データセットを読めるような日時フォーマットを使用して結果に出力し、正しく読み込めたことを確認してください(SASドキュメントの日時フォーマット・インフォーマットのページを必要に応じ参照してください)。
data temp;
input date1 /*informat1*/ +1 date2 /*informat2*/ +1
date3 /*informat3*/ @32 time /*informat4*/;
datalines;
2014/02/14 06Jan2018 4/5/2016 03:2:22
;
run;
data temp;
input date1 yymmdd10. +1 date2 DATE9. +1
date3 mmddyy8. @32 time time7.;
datalines;
2014/02/14 06Jan2018 4/5/2016 03:2:22
;
run;
proc print data = temp;
format date1 date2 date3 mmddyy10. time time7.;
run;
OBS | date1 | date2 | date3 | time |
---|---|---|---|---|
1 | 02/14/2014 | 01/06/2018 | 04/05/2016 | 3:02:02 |
文字列関数#
PROC IMPORTを使ってBaltimore cityの給与データセット Baltimore_City_Employee_Salaries_FY2015.csvを読み込んでください。
proc import datafile = "/folders/myfolders/SAS_Notes/data/Baltimore_City_Employee_Salaries_FY2015.csv"
out = sal dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc print data = sal(obs=5);
run;
OBS | name | JobTitle | AgencyID | Agency | HireDate | AnnualSalary | GrossPay |
---|---|---|---|---|---|---|---|
1 | Aaron,Patricia G | Facilities/Office Services II | A03031 | OED-Employment Dev (031) | 10/24/1979 | 55,314 | 53,626 |
2 | Aaron,Petra L | ASSISTANT STATE'S ATTORNEY | A29045 | States Attorneys Office (045) | 09/25/2006 | 74,000 | 73,000 |
3 | Abaineh,Yohannes T | EPIDEMIOLOGIST | A65026 | HLTH-Health Department (026) | 07/23/2009 | 64,500 | 64,404 |
4 | Abbene,Anthony M | POLICE OFFICER | A99005 | Police Department (005) | 07/24/2013 | 46,309 | 59,620 |
5 | Abbey,Emmanuel | CONTRACT SERV SPEC II | A40001 | M-R Info Technology (001) | 05/01/2013 | 60,060 | 54,060 |
一時データセット health_sal を作成し、そこには (大文字小文字を区別せずに) 職名「JobTitle」に “fire” が含まれるもののみを含めでください。
data health_sal;
set sal;
where index(lowcase(JobTitle), 'fire') > 0;
RUN;
proc print data=health_sal(obs=5);
var JobTitle;
run;
OBS | JobTitle |
---|---|
1 | EMT Firefighter Suppression |
2 | Fire Pump Operator Supp ALS |
3 | Firefighter/Paramedic Suppress |
4 | Fire Pump Operator Supp ALS |
5 | Firefighter Suppression |
一時データセット trans を作成し、そこには (大文字小文字を区別して) “TRANS” が含まれるもののみを含めてください。
data trans;
set sal;
where index(JobTitle, 'TRANS') > 0;
run;
proc print data=trans(obs=5);
var JobTitle;
run;
OBS | JobTitle |
---|---|
1 | TRANSPORTATION ASSOC II |
2 | TAX TRANSFER CLERK I |
3 | GENL SUPT TRANSPORTATION MAINT |
4 | TAX TRANSFER CLERK I |
5 | TAX TRANSFER CLERK I |
Baltimoreの給与データで、名前に “abra” が含まれる人の職業は何ですか? 大文字小文字は区別しないでください。
proc print data=sal;
var name JobTitle;
where index(lowcase(name), 'abra') > 0;
run;
OBS | name | JobTitle |
---|---|---|
26 | Abraham,Donta D | LABORER (Hourly) |
27 | Abraham,Santhosh | ACCOUNTANT I |
28 | Abraham,Sharon M | HOUSING INSPECTOR |
29 | Abrahams,Brandon A | POLICE OFFICER TRAINEE |
30 | Abrams,Maria | OFFICE SERVICES ASSISTANT II S |
31 | Abrams,Maxine | COLLECTIONS REPRESENTATIVE I |
32 | Abrams,Terry | RECREATION ARTS INSTRUCTOR |
958 | Bey,Abraham | PROCUREMENT SPECIALIST II |
3761 | Elgamil,Abraham D | AUDITOR SUPV |
4545 | Gatto,Abraham M | POLICE OFFICER |
11107 | Schwartz,Abraham M | GENERAL COUNSEL |
12789 | Velez,Abraham L | POLICE OFFICER (EID) |
警察局、消防局、保安官事務所のみを含む給与データセットのサブセットを作成します。変数「Agency」を使って(大文字小文字を区別した)文字列のマッチングを行ってください。このデータセットemerには何人の従業員が含まれていますか?
data emer;
set sal;
where index(agency, "Sheriff's Office") > 0 or
index(agency, "Police Department") > 0 or
index(agency, "Fire Department") > 0;
run;
proc print data=emer(obs=5);
var agency;
run;
OBS | Agency |
---|---|
1 | Police Department (005) |
2 | Fire Department (120) |
3 | Police Department (127) |
4 | Sheriff's Office (410) |
5 | Fire Department (465) |
データセットemer に変数「dept」を作成し、変数「Agency」から ‘ment’ または ‘ice’ の手前の部分を抽出してください。例えば、ment または ice までの文字を抜き出し (正規表現ではカッコで囲むとグループ化できます)、その後の文字は削除します。PROC FREQを使って変数「dept」の度数表を作成します。目的の部分文字列を抽出するには、次のようにします。
re = prxparse('/.*(ment|ice)/');
call prxsubstr(re, Agency, pos, len);
dept = substr(Agency, pos, len);
data emer;
set emer;
re = prxparse('/.*(ment|ice)/');
call prxsubstr(re, Agency, pos, len);
dept = substr(Agency, pos, len);
run;
proc freq data = emer;
table dept;
run;
FREQ プロシジャ
dept | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
Fire Department | 1615 | 32.81 | 1615 | 32.81 |
Police Department | 3097 | 62.92 | 4712 | 95.73 |
Sheriff's Office | 210 | 4.27 | 4922 | 100.00 |
データクリーニング#
PROC IMPORTを使ってBike_Lanes.csvをデータセットbikeとして読み込んでください。
proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
out = bike dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc print data = bike(obs=5);
run;
OBS | subType | name | block | type | numLanes | project | route | length | dateInstalled |
---|---|---|---|---|---|---|---|---|---|
1 | BIKE BOULEVARD | 1 | GUILFORD AVE BIKE BLVD | 435.73787702 | 0 | ||||
2 | SIDEPATH | 1 | NORTHERN | 1024.6746249 | 2010 | ||||
3 | SIGNED ROUTE | 1 | SOUTHEAST BIKE NETWORK | 3749.3226377 | 2010 | ||||
4 | HUNTINGDON PATH | SIDEPATH | 1 | 0 | 0 | ||||
5 | STCLN | EDMONDSON AVE | 5300 BLK EDMONDSON AVE | BIKE LANE | 1 | OPERATION ORANGE CONE | 180.92546489 | 2011 |
データセットbikeには何行あり、そのうち完全ケースは何行ありますか? ヒント: cmiss(of _ALL_)を使ってデータセットにおいて0/1の変数を作り、その0/1変数をPROC MEANSで合計することで完全ケースの数がわかります。
proc contents data = bike;
run;
CONTENTS プロシジャ
データセット名 | WORK.BIKE | オブザベーション数 | 1631 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 9 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:46:16 | オブザベーションのバッファ長 | 136 |
更新日時 | 2024/06/06 09:46:16 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 2 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 962 |
先頭ページのOBS数 | 940 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/bike.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 536875965 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 384KB |
ファイルサイズ (バイト) | 393216 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
3 | block | 文字 | 29 | $29. | $29. |
9 | dateInstalled | 数値 | 8 | BEST12. | BEST32. |
8 | length | 数値 | 8 | BEST12. | BEST32. |
2 | name | 文字 | 20 | $20. | $20. |
5 | numLanes | 数値 | 8 | BEST12. | BEST32. |
6 | project | 文字 | 25 | $25. | $25. |
7 | route | 文字 | 13 | $13. | $13. |
1 | subType | 文字 | 6 | $6. | $6. |
4 | type | 文字 | 15 | $15. | $15. |
データセットbikeは1631行です。
data bike;
set bike;
if cmiss(of _all_) > 0 then complete = 0;
else complete = 1;
run;
proc print data = bike(obs=5);
run;
proc means data = bike sum;
var complete;
run;
OBS | subType | name | block | type | numLanes | project | route | length | dateInstalled | complete |
---|---|---|---|---|---|---|---|---|---|---|
1 | BIKE BOULEVARD | 1 | GUILFORD AVE BIKE BLVD | 435.73787702 | 0 | 0 | ||||
2 | SIDEPATH | 1 | NORTHERN | 1024.6746249 | 2010 | 0 | ||||
3 | SIGNED ROUTE | 1 | SOUTHEAST BIKE NETWORK | 3749.3226377 | 2010 | 0 | ||||
4 | HUNTINGDON PATH | SIDEPATH | 1 | 0 | 0 | 0 | ||||
5 | STCLN | EDMONDSON AVE | 5300 BLK EDMONDSON AVE | BIKE LANE | 1 | OPERATION ORANGE CONE | 180.92546489 | 2011 | 0 |
MEANS プロシジャ
分析変数 : complete |
---|
合計 |
257.0000000 |
変数「route」が欠損していない行のみを抽出して一時データセットhave_routeを作成します。そして、PROC FREQを使って変数「subType」の度数表(欠損値を含む)を作成してください。
data have_route;
set bike;
where not missing(route);
run;
proc freq data = have_route;
table subType / missing;
run;
FREQ プロシジャ
subType | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
1 | 0.28 | 1 | 0.28 | |
STRALY | 3 | 0.83 | 4 | 1.10 |
STRPRD | 358 | 98.90 | 362 | 100.00 |
データ操作#
Bike_Lanes_Wide.csvデータセットをPROC IMPORTでデータセット
wide
として読み込み、最初の数行を出力してください。
proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes_Wide.csv"
out = wide dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc contents data = wide;
run;
proc print data = wide(obs=5);
run;
CONTENTS プロシジャ
データセット名 | WORK.WIDE | オブザベーション数 | 134 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 9 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:58:39 | オブザベーションのバッファ長 | 141 |
更新日時 | 2024/06/06 09:58:39 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 928 |
先頭ページのOBS数 | 134 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/wide.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 2249148 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
2 | BIKE BOULEVARD | 文字 | 11 | $11. | $11. |
3 | BIKE LANE | 文字 | 11 | $11. | $11. |
4 | CONTRAFLOW | 文字 | 11 | $11. | $11. |
9 | NA | 文字 | 11 | $11. | $11. |
5 | SHARED BUS BIKE | 文字 | 11 | $11. | $11. |
6 | SHARROW | 文字 | 11 | $11. | $11. |
7 | SIDEPATH | 文字 | 11 | $11. | $11. |
8 | SIGNED ROUTE | 文字 | 11 | $11. | $11. |
1 | name | 文字 | 53 | $53. | $53. |
OBS | name | BIKE BOULEVARD | BIKE LANE | CONTRAFLOW | SHARED BUS BIKE | SHARROW | SIDEPATH | SIGNED ROUTE | NA |
---|---|---|---|---|---|---|---|---|---|
1 | ALBEMARLE ST | NA | NA | NA | NA | 109.9141727 | NA | 234.9190031 | NA |
2 | ALICEANNA ST | NA | NA | NA | NA | 250.7103035 | NA | NA | NA |
3 | ARGONNE DR | NA | 1312.608373 | NA | NA | NA | NA | NA | NA |
4 | ART MUSEUM DR | NA | NA | NA | NA | NA | NA | 277.6579871 | NA |
5 | AUCHENTOROLY TERR | NA | 1341.82908 | NA | NA | NA | NA | NA | NA |
データセット
wide
をPROC TRANSPOSEまたはデータステップを使って縦持ち形式に変形してください。「name」以外のすべての列を対象にする必要があります。新しい2つの列「lanetype」(元の列名)と「the_length」(データ値)を持つ縦持ちのデータセットに変換します。変数「the_length」の’NA’の値は.に置き換え、数値型に変換します。
data long;
set wide;
array col{*} 'BIKE BOULEVARD'n -- NA;
do i = 1 to dim(col);
lanetype = vname(col[i]);
if col[i] = 'NA' then the_length = .;
else the_length = input(col[i], 20.7);
output;
end;
drop 'BIKE BOULEVARD'n -- NA i;
run;
title 'Using a DATA step';
proc print data = long(obs=10);
run;
proc sort data=wide;
by name;
run;
proc transpose data = wide
out = long2 (rename = (col1 = the_length
_name_ = lanetype));
by name;
var 'BIKE BOULEVARD'n -- NA;
run;
data long2;
set long2(rename = (the_length = length));
if length = 'NA' then the_length = .;
else the_length = input(length, 20.7);
drop length;
run;
title 'Using PROC TRANSPOSE';
proc print data = long2(obs=10);
run;
title;
OBS | name | lanetype | the_length |
---|---|---|---|
1 | ALBEMARLE ST | BIKE BOULEVARD | . |
2 | ALBEMARLE ST | BIKE LANE | . |
3 | ALBEMARLE ST | CONTRAFLOW | . |
4 | ALBEMARLE ST | SHARED BUS BIKE | . |
5 | ALBEMARLE ST | SHARROW | 109.914 |
6 | ALBEMARLE ST | SIDEPATH | . |
7 | ALBEMARLE ST | SIGNED ROUTE | 234.919 |
8 | ALBEMARLE ST | NA | . |
9 | ALICEANNA ST | BIKE BOULEVARD | . |
10 | ALICEANNA ST | BIKE LANE | . |
OBS | name | lanetype | the_length |
---|---|---|---|
1 | ALBEMARLE ST | BIKE BOULEVARD | . |
2 | ALBEMARLE ST | BIKE LANE | . |
3 | ALBEMARLE ST | CONTRAFLOW | . |
4 | ALBEMARLE ST | SHARED BUS BIKE | . |
5 | ALBEMARLE ST | SHARROW | 109.914 |
6 | ALBEMARLE ST | SIDEPATH | . |
7 | ALBEMARLE ST | SIGNED ROUTE | 234.919 |
8 | ALBEMARLE ST | NA | . |
9 | ALICEANNA ST | BIKE BOULEVARD | . |
10 | ALICEANNA ST | BIKE LANE | . |
roads.csvとcrashes.csvファイルをデータセット
road
とcrash
として読み込みんでください。
proc import datafile="/folders/myfolders/SAS_Notes/data/roads.csv"
out = road dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc import datafile="/folders/myfolders/SAS_Notes/data/crashes.csv"
out = crash dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc print data = road;
run;
proc print data = crash(obs=10);
run;
OBS | Road | District | Length |
---|---|---|---|
1 | Interstate 65 | Greenfield | 262 |
2 | Interstate 70 | Vincennes | 156 |
3 | US-36 | Crawfordsville | 139 |
4 | US-40 | Greenfield | 150 |
5 | US-52 | Crawfordsville | 172 |
OBS | Year | Road | N_Crashes | Volume |
---|---|---|---|---|
1 | 1991 | Interstate 65 | 25 | 40000 |
2 | 1992 | Interstate 65 | 37 | 41000 |
3 | 1993 | Interstate 65 | 45 | 45000 |
4 | 1994 | Interstate 65 | 46 | 45600 |
5 | 1995 | Interstate 65 | 46 | 49000 |
6 | 1996 | Interstate 65 | 59 | 51000 |
7 | 1997 | Interstate 65 | 76 | 52000 |
8 | 1998 | Interstate 65 | 90 | 58000 |
9 | 1999 | Interstate 65 | 95 | 65000 |
10 | 2000 | Interstate 65 | 95 | 74000 |
データセット
crash
の変数「Road」にあるハイフン(-
)をすべて空白に置き換え(tranwrd
を使用)、データセットcrash2
とします。変数「Road」をPROC FREQにより度数表を作成してください。
data crash2;
set crash;
road = tranwrd(road, '-', ' ');
run;
proc freq data = crash2;
table road;
run;
FREQ プロシジャ
Road | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
Interstate 275 | 22 | 20.00 | 22 | 20.00 |
Interstate 65 | 22 | 20.00 | 44 | 40.00 |
Interstate 70 | 22 | 20.00 | 66 | 60.00 |
US 36 | 22 | 20.00 | 88 | 80.00 |
US 40 | 22 | 20.00 | 110 | 100.00 |
データセット
crash
とroad
のそれぞれに何件のオブザベーションがありますか?
proc contents data = crash;
run;
proc contents data = road;
run;
CONTENTS プロシジャ
データセット名 | WORK.CRASH | オブザベーション数 | 110 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 4 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:58:44 | オブザベーションのバッファ長 | 40 |
更新日時 | 2024/06/06 09:58:44 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 3265 |
先頭ページのOBS数 | 110 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/crash.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 2063333 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
3 | N_Crashes | 数値 | 8 | BEST12. | BEST32. |
2 | Road | 文字 | 14 | $14. | $14. |
4 | Volume | 数値 | 8 | BEST12. | BEST32. |
1 | Year | 数値 | 8 | BEST12. | BEST32. |
CONTENTS プロシジャ
データセット名 | WORK.ROAD | オブザベーション数 | 5 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 3 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:58:44 | オブザベーションのバッファ長 | 40 |
更新日時 | 2024/06/06 09:58:44 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 3265 |
先頭ページのOBS数 | 5 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/road.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 2063331 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
2 | District | 文字 | 14 | $14. | $14. |
3 | Length | 数値 | 8 | BEST12. | BEST32. |
1 | Road | 文字 | 13 | $13. | $13. |
crash: 110オブザベーション、road: 5オブザベーション
crash2
の「Road」scan
を使って(「type」と「number」)に分割します。この結果を再びcrash2
に割り当てます。crash2
の「type」をPROC FREQで度数表を作成してください。次に、連結関数(CATなど)を使って新しい変数「road_hyphen」を作成します。「type」と「number」の列をハイフン(-
)で結合し、「road_hyphen」をPROC FREQで度数表を作成してください。
data crash2;
set crash2;
type = scan(road, 1);
number = scan(road, 2);
run;
proc freq data=crash2;
table type;
run;
data crash2;
set crash2;
road_hyphen = catx('-', type, number);
run;
proc freq data=crash2;
table road_hyphen;
run;
FREQ プロシジャ
type | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
Interstate | 66 | 60.00 | 66 | 60.00 |
US | 44 | 40.00 | 110 | 100.00 |
FREQ プロシジャ
road_hyphen | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
Interstate-275 | 22 | 20.00 | 22 | 20.00 |
Interstate-65 | 22 | 20.00 | 44 | 40.00 |
Interstate-70 | 22 | 20.00 | 66 | 60.00 |
US-36 | 22 | 20.00 | 88 | 80.00 |
US-40 | 22 | 20.00 | 110 | 100.00 |
crash
データセットでは、どの年のデータが収集されましたか?何年分ありますか?
proc freq data=crash;
table year;
run;
FREQ プロシジャ
Year | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
1991 | 5 | 4.55 | 5 | 4.55 |
1992 | 5 | 4.55 | 10 | 9.09 |
1993 | 5 | 4.55 | 15 | 13.64 |
1994 | 5 | 4.55 | 20 | 18.18 |
1995 | 5 | 4.55 | 25 | 22.73 |
1996 | 5 | 4.55 | 30 | 27.27 |
1997 | 5 | 4.55 | 35 | 31.82 |
1998 | 5 | 4.55 | 40 | 36.36 |
1999 | 5 | 4.55 | 45 | 40.91 |
2000 | 5 | 4.55 | 50 | 45.45 |
2001 | 5 | 4.55 | 55 | 50.00 |
2002 | 5 | 4.55 | 60 | 54.55 |
2003 | 5 | 4.55 | 65 | 59.09 |
2004 | 5 | 4.55 | 70 | 63.64 |
2005 | 5 | 4.55 | 75 | 68.18 |
2006 | 5 | 4.55 | 80 | 72.73 |
2007 | 5 | 4.55 | 85 | 77.27 |
2008 | 5 | 4.55 | 90 | 81.82 |
2009 | 5 | 4.55 | 95 | 86.36 |
2010 | 5 | 4.55 | 100 | 90.91 |
2011 | 5 | 4.55 | 105 | 95.45 |
2012 | 5 | 4.55 | 110 | 100.00 |
データセットcrashに含まれているのは1991-2012の22年分
Bike_Lanes.csvをデータセット
bike
として読み込んでください。
proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
out = bike dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
proc print data=bike(obs=5);
run;
OBS | subType | name | block | type | numLanes | project | route | length | dateInstalled |
---|---|---|---|---|---|---|---|---|---|
1 | BIKE BOULEVARD | 1 | GUILFORD AVE BIKE BLVD | 435.73787702 | 0 | ||||
2 | SIDEPATH | 1 | NORTHERN | 1024.6746249 | 2010 | ||||
3 | SIGNED ROUTE | 1 | SOUTHEAST BIKE NETWORK | 3749.3226377 | 2010 | ||||
4 | HUNTINGDON PATH | SIDEPATH | 1 | 0 | 0 | ||||
5 | STCLN | EDMONDSON AVE | 5300 BLK EDMONDSON AVE | BIKE LANE | 1 | OPERATION ORANGE CONE | 180.92546489 | 2011 |
「type」と「name」に欠損値がない行のみを残し、出力を
bike
に再度割り当ててください。
data bike;
set bike;
where not missing(type);
run;
proc print data=bike(obs=5);
run;
OBS | subType | name | block | type | numLanes | project | route | length | dateInstalled |
---|---|---|---|---|---|---|---|---|---|
1 | BIKE BOULEVARD | 1 | GUILFORD AVE BIKE BLVD | 435.73787702 | 0 | ||||
2 | SIDEPATH | 1 | NORTHERN | 1024.6746249 | 2010 | ||||
3 | SIGNED ROUTE | 1 | SOUTHEAST BIKE NETWORK | 3749.3226377 | 2010 | ||||
4 | HUNTINGDON PATH | SIDEPATH | 1 | 0 | 0 | ||||
5 | STCLN | EDMONDSON AVE | 5300 BLK EDMONDSON AVE | BIKE LANE | 1 | OPERATION ORANGE CONE | 180.92546489 | 2011 |
PROC MEANSでBYステートメントを使い、「name」と「type」でグループ化(各nameごとのtypeごとの意味)し、「length」の合計を求めてください。OUTPUTステートメントを使ってこの要約データセットを出力し、「name」、「type」と合計した「length」(これを
length
に名前を変更)のみを保持し、データセットsub
としてください。
proc sort data = bike;
by name type;
run;
proc means data = bike noprint;
by name type;
output out=sub sum=length;
run;
data sub;
set sub;
keep name type length;
run;
proc print data=sub(obs=8);
run;
OBS | name | type | length |
---|---|---|---|
1 | BIKE BOULEVARD | 1 | |
2 | BIKE LANE | 1 | |
3 | SHARROW | 3 | |
4 | SIDEPATH | 1 | |
5 | SIGNED ROUTE | 8 | |
6 | ALBEMARLE ST | SHARROW | 8 |
7 | ALBEMARLE ST | SIGNED ROUTE | 8 |
8 | ALICEANNA ST | SHARROW | 38 |
proc freq data=sub;
table type;
run;
FREQ プロシジャ
type | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
BIKE BOULEVARD | 3 | 1.80 | 3 | 1.80 |
BIKE LANE | 54 | 32.34 | 57 | 34.13 |
CONTRAFLOW | 4 | 2.40 | 61 | 36.53 |
SHARED BUS BIKE | 4 | 2.40 | 65 | 38.92 |
SHARROW | 50 | 29.94 | 115 | 68.86 |
SIDEPATH | 5 | 2.99 | 120 | 71.86 |
SIGNED ROUTE | 47 | 28.14 | 167 | 100.00 |
sub
を縦持ちの形式から「type」を変数名、「length」を値とした横持ちの形式に変換してください。(注: 「name」にはスペースが含まれます。変数名にする前にスペースを置き換える必要はあるでしょうか? データステップによる方法はすべての「name」が同じ「type」の値を持っていないことから、難しくなっています。)
data new_wide;
set sub;
by name;
retain BIKE_BOULEVARD BIKE_LANE CONTRAFLOW SHARED_BUS_BIKE
SHARROW SIDEPATH SIGNED_ROUTE;
array atype [*] BIKE_BOULEVARD BIKE_LANE CONTRAFLOW SHARED_BUS_BIKE
SHARROW SIDEPATH SIGNED_ROUTE;
if first.name then call missing(of atype(*));
if type = 'BIKE BOULEVARD' then atype[1] = length;
else if type = 'BIKE LANE' then atype[2] = length;
else if type = 'CONTRAFLOW' then atype[3] = length;
else if type = 'SHARED BUS BIKE' then atype[4] = length;
else if type = 'SHARROW' then atype[5] = length;
else if type = 'SIDEPATH' then atype[6] = length;
else if type = 'SIGNED ROUTE' then atype[7] = length;
if last.name then output;
drop type length;
run;
title 'Wide Dataset Using DATA Step';
proc print data=new_wide(obs=5);
run;
proc transpose data = sub out = new_wide2(drop=_name_);
by name;
var length;
id type;
run;
title 'Wide Dataset Using PROC TRANSPOSE';
proc print data = new_wide2(obs=5);
run;
title ;
OBS | name | BIKE_BOULEVARD | BIKE_LANE | CONTRAFLOW | SHARED_BUS_BIKE | SHARROW | SIDEPATH | SIGNED_ROUTE |
---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | . | . | 3 | 1 | 8 | |
2 | ALBEMARLE ST | . | . | . | . | 8 | . | 8 |
3 | ALICEANNA ST | . | . | . | . | 38 | . | . |
4 | ARGONNE DR | . | 2 | . | . | . | . | . |
5 | ART MUSEUM DR | . | . | . | . | . | . | 6 |
OBS | name | BIKE BOULEVARD | BIKE LANE | SHARROW | SIDEPATH | SIGNED ROUTE | CONTRAFLOW | SHARED BUS BIKE |
---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 3 | 1 | 8 | . | . | |
2 | ALBEMARLE ST | . | . | 8 | . | 8 | . | . |
3 | ALICEANNA ST | . | . | 38 | . | . | . | . |
4 | ARGONNE DR | . | 2 | . | . | . | . | . |
5 | ART MUSEUM DR | . | . | . | . | 6 | . | . |
データセット
crash
とroad
を「Road」をキーとして結合し完全ケースだけを含むようにして(内部結合を使用)、名前をmerged
としてください。いくつのオブザベーションが含まれますか?
proc sort data = road;
by road;
run;
proc sort data = crash;
by road;
run;
data merged;
merge road (in = in1)
crash (in = in2);
by road;
if in1 = 1 and in2 = 1;
run;
proc contents data = merged;
run;
CONTENTS プロシジャ
データセット名 | WORK.MERGED | オブザベーション数 | 88 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 6 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:59:05 | オブザベーションのバッファ長 | 64 |
更新日時 | 2024/06/06 09:59:05 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 2043 |
先頭ページのOBS数 | 88 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/merged.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 2063333 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
2 | District | 文字 | 14 | $14. | $14. |
3 | Length | 数値 | 8 | BEST12. | BEST32. |
5 | N_Crashes | 数値 | 8 | BEST12. | BEST32. |
1 | Road | 文字 | 13 | $13. | $13. |
6 | Volume | 数値 | 8 | BEST12. | BEST32. |
4 | Year | 数値 | 8 | BEST12. | BEST32. |
88オブザベーション
外部結合により結合して、名前は
full_join
としてください。 いくつのオブザベーションが含まれますか?
data full_join;
merge road crash;
by road;
run;
proc print data = full_join(obs=10);
run;
OBS | Road | District | Length | Year | N_Crashes | Volume |
---|---|---|---|---|---|---|
1 | Interstate 27 | . | 1991 | 27 | 20350 | |
2 | Interstate 27 | . | 1992 | 26 | 21200 | |
3 | Interstate 27 | . | 1993 | 22 | 23200 | |
4 | Interstate 27 | . | 1994 | 21 | 21200 | |
5 | Interstate 27 | . | 1995 | 28 | 23200 | |
6 | Interstate 27 | . | 1996 | 22 | 20000 | |
7 | Interstate 27 | . | 1997 | 27 | 18000 | |
8 | Interstate 27 | . | 1998 | 21 | 19500 | |
9 | Interstate 27 | . | 1999 | 22 | 21000 | |
10 | Interstate 27 | . | 2000 | 29 | 20700 |
115 オブザベーション
road
とcrash
を左結合により結合してください。ここでは順番が重要になります。いくつのオブザベーションが含まれますか?
data left_join;
merge road (in = in1) crash;
by road;
if in1 = 1;
run;
proc contents data = left_join;
run;
CONTENTS プロシジャ
データセット名 | WORK.LEFT_JOIN | オブザベーション数 | 89 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 6 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:59:13 | オブザベーションのバッファ長 | 64 |
更新日時 | 2024/06/06 09:59:13 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 2043 |
先頭ページのOBS数 | 89 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/left_join.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 2063332 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
2 | District | 文字 | 14 | $14. | $14. |
3 | Length | 数値 | 8 | BEST12. | BEST32. |
5 | N_Crashes | 数値 | 8 | BEST12. | BEST32. |
1 | Road | 文字 | 13 | $13. | $13. |
6 | Volume | 数値 | 8 | BEST12. | BEST32. |
4 | Year | 数値 | 8 | BEST12. | BEST32. |
89オブザベーション
上記を右結合により結合してください。いくつのオブザベーションが含まれますか?
data right_join;
merge road crash (in = in1);
by road;
if in1 = 1;
run;
proc contents data = right_join;
run;
CONTENTS プロシジャ
データセット名 | WORK.RIGHT_JOIN | オブザベーション数 | 110 |
---|---|---|---|
メンバータイプ | DATA | 変数の数 | 6 |
エンジン | V9 | インデックス数 | 0 |
作成日時 | 2024/06/06 09:59:55 | オブザベーションのバッファ長 | 64 |
更新日時 | 2024/06/06 09:59:55 | 削除済みオブザベーション数 | 0 |
保護 | 圧縮済み | NO | |
データセットタイプ | ソート済み | NO | |
ラベル | |||
データ表現 | SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 | ||
エンコード | utf-8 Unicode (UTF-8) |
エンジン/ホスト関連情報 | |
---|---|
データセットのページサイズ | 131072 |
データセットのページ数 | 1 |
データページの先頭 | 1 |
ページごとの最大OBS数 | 2043 |
先頭ページのOBS数 | 110 |
データセットの修復数 | 0 |
ファイル名 | /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/right_join.sas7bdat |
作成したリリース | 9.0401M7 |
作成したホスト | Linux |
I ノード番号 | 2063337 |
アクセス権限 | rw-r--r-- |
所有者名 | user-name |
ファイルサイズ | 256KB |
ファイルサイズ (バイト) | 262144 |
変数と属性リスト (アルファベット順) | |||||
---|---|---|---|---|---|
# | 変数 | タイプ | 長さ | 出力形式 | 入力形式 |
2 | District | 文字 | 14 | $14. | $14. |
3 | Length | 数値 | 8 | BEST12. | BEST32. |
5 | N_Crashes | 数値 | 8 | BEST12. | BEST32. |
1 | Road | 文字 | 13 | $13. | $13. |
6 | Volume | 数値 | 8 | BEST12. | BEST32. |
4 | Year | 数値 | 8 | BEST12. | BEST32. |
110オブザベーション
Output Delivery System(ODS)とグラフ#
proc import datafile = "/folders/myfolders/SAS_Notes/data/Charm_City_Circulator_Ridership.csv"
out = circ dbms = csv replace;
getnames = yes;
guessingrows = max;
run;
data long;
set circ;
array larray[*] orangeBoardings -- bannerAverage;
do i = 1 to dim(larray);
var = vname(larray[i]);
number = larray[i];
var = tranwrd(var, 'Board', ' Board');
var = tranwrd(var, 'Alight', ' Alight');
var = tranwrd(var, 'Average', ' Average');
route = scan(var, 1);
type = scan(var, 2);
output;
end;
drop i var orangeBoardings -- bannerAverage;
run;
data avg;
set long;
where type = 'Average' and number ^= .;
run;
proc print data = long(obs = 10);
run;
proc print data = avg(obs=10);
run;
OBS | day | date | daily | number | route | type |
---|---|---|---|---|---|---|
1 | Monday | 01/11/2010 | 952 | 877 | orange | Boardings |
2 | Monday | 01/11/2010 | 952 | 1027 | orange | Alightings |
3 | Monday | 01/11/2010 | 952 | 952 | orange | Average |
4 | Monday | 01/11/2010 | 952 | . | purple | Boardings |
5 | Monday | 01/11/2010 | 952 | . | purple | Alightings |
6 | Monday | 01/11/2010 | 952 | . | purple | Average |
7 | Monday | 01/11/2010 | 952 | . | green | Boardings |
8 | Monday | 01/11/2010 | 952 | . | green | Alightings |
9 | Monday | 01/11/2010 | 952 | . | green | Average |
10 | Monday | 01/11/2010 | 952 | . | banner | Boardings |
OBS | day | date | daily | number | route | type |
---|---|---|---|---|---|---|
1 | Monday | 01/11/2010 | 952 | 952.0 | orange | Average |
2 | Tuesday | 01/12/2010 | 796 | 796.0 | orange | Average |
3 | Wednesday | 01/13/2010 | 1211.5 | 1211.5 | orange | Average |
4 | Thursday | 01/14/2010 | 1213.5 | 1213.5 | orange | Average |
5 | Friday | 01/15/2010 | 1644 | 1644.0 | orange | Average |
6 | Saturday | 01/16/2010 | 1490.5 | 1490.5 | orange | Average |
7 | Sunday | 01/17/2010 | 888.5 | 888.5 | orange | Average |
8 | Monday | 01/18/2010 | 999.5 | 999.5 | orange | Average |
9 | Tuesday | 01/19/2010 | 1035 | 1035.0 | orange | Average |
10 | Wednesday | 01/20/2010 | 1395.5 | 1395.5 | orange | Average |
データセットavgから日付ごとの平均乗客数の散布図を作成してください。 a. ポイントの色をルート(オレンジ、パープル、グリーン、バナー)で色分けしてください。ここではデフォルトの色で構いません。 b. 各ルートに対して黒い滑らかな曲線(LOESS)を追加してください。 c. ポイントの色を曜日ごとにしてください。
title '1a';
proc sgplot data = avg;
scatter y = number x = date / group = route;
run;
title '1b';
proc sgplot data = avg;
scatter y = number x = date / group = route;
loess y = number x = date / group = route lineattrs=(color = black);
run;
title '1c';
proc sgplot data = avg;
scatter y = number x = date / group = day;
run;
ポイントの色がルートの名前(バナー→青)である1aを再プロットしてください。注:属性マッピングデータを作成する必要があります。
data marker_map;
input id $2. +1 VALUE $6. +1 MARKERCOLOR $6.;
datalines;
mc banner blue
mc green green
mc orange orange
mc purple purple
;
run;
title '2';
proc sgplot data = avg dattrmap = marker_map;
scatter y = number x = date / group = route attrid = mc;
run;
ルートごとにパネルを1つずつ持つ、日付ごとの平均乗客数の散布図を作成してください。
title '3';
proc sgpanel data = avg;
panelby route;
scatter y = number x = date;
run;
曜日ごとに別々のパネルを持ち、ルートで色分けされた、日付ごとの平均乗客数の散布図を作成してください。
*Default colors are fine here to, but we can also use a data attribute map like we did before;
title '4';
proc sgpanel data = avg dattrmap = marker_map;
panelby day;
scatter y = number x = date / group = route attrid = mc;
run;
ルートで色分けされた(1aと同じ)、日付ごとの平均乗客数(avg)の散布図を作成してください。(平均を算出はせず、各ルートの平均の列を使用します)。x軸のラベルを”Year”、y軸のラベルを”Number of People”にします。
title '5';
proc sgplot data = avg dattrmap = marker_map;
scatter y = number x = date / group = route attrid = mc;
xaxis label = "Year";
yaxis label = "Number of People";
run;
オレンジルートの日付に対する平均乗客数の線グラフを作成し、乗車数(boardings)と降車数(alightings)も誤差線として破線にして追加してください。線の色はオレンジにします。
data orange;
set long;
where route = "orange";
run;
data line_map;
input id $2. +1 VALUE $10. +1 linepattern $5.;
datalines;
lp Alightings dash
lp Average solid
lp Boardings dash
;
run;
title '6';
proc sgplot data = orange dattrmap = line_map;
series y = number x = date / group = type attrid = lp lineattrs=(color = orange);
run;
title;
SASによる統計解析#
filename cardata '/folders/myfolders/SAS_Notes/data/kaggleCarAuction.csv';
proc import datafile = cardata out = cars dbms = csv replace;
getnames = yes;
guessingrows = 1000;
run;
filename mortdat '/folders/myfolders/SAS_Notes/data/indicatordeadkids35.csv';
proc import datafile = mortdat out = mort dbms = csv replace;
getnames = yes;
guessingrows = 500;
run;
1980年、1990年、2000年、2010年の死亡率データ間の相関関係を計算します。結果を画面に表示するだけで十分です。次に、NOMMISS オプションを使用して計算します。(注意: 列名は数値ですが、SASの標準的な名前としては無効なので、コード内で 1980 年の変数を指すには ‘1980’n を使用します)
proc corr data = mort;
var '1980'n '1990'n '2000'n '2010'n;
run;
proc corr data = mort nomiss;
var '1980'n '1990'n '2000'n '2010'n;
run;
CORR プロシジャ
4 変数 : | 1980 1990 2000 2010 |
---|
単純統計量 | ||||||
---|---|---|---|---|---|---|
変数 | N | 平均 | 標準偏差 | 合計 | 最小値 | 最大値 |
1980 | 197 | 0.94731 | 0.88694 | 186.62013 | 0.07049 | 3.49035 |
1990 | 197 | 0.70911 | 0.77929 | 139.69428 | 0.04922 | 3.28983 |
2000 | 197 | 0.55004 | 0.68922 | 108.35786 | 0.03232 | 2.81186 |
2010 | 193 | 0.39601 | 0.50021 | 76.42946 | 0.03173 | 2.02857 |
Pearson の相関係数 H0: Rho=0 に対する Prob > |r| オブザベーション数 |
||||
---|---|---|---|---|
1980 | 1990 | 2000 | 2010 | |
1980 |
1.00000
197
|
0.96015
<.0001
197
|
0.88884
<.0001
197
|
0.84683
<.0001
193
|
1990 |
0.96015
<.0001
197
|
1.00000
197
|
0.96138
<.0001
197
|
0.92472
<.0001
193
|
2000 |
0.88884
<.0001
197
|
0.96138
<.0001
197
|
1.00000
197
|
0.98623
<.0001
193
|
2010 |
0.84683
<.0001
193
|
0.92472
<.0001
193
|
0.98623
<.0001
193
|
1.00000
193
|
CORR プロシジャ
4 変数 : | 1980 1990 2000 2010 |
---|
単純統計量 | ||||||
---|---|---|---|---|---|---|
変数 | N | 平均 | 標準偏差 | 合計 | 最小値 | 最大値 |
1980 | 193 | 0.96250 | 0.88966 | 185.76175 | 0.07049 | 3.49035 |
1990 | 193 | 0.72132 | 0.78263 | 139.21550 | 0.05512 | 3.28983 |
2000 | 193 | 0.55976 | 0.69297 | 108.03459 | 0.03271 | 2.81186 |
2010 | 193 | 0.39601 | 0.50021 | 76.42946 | 0.03173 | 2.02857 |
Pearson の相関係数, N = 193 H0: Rho=0 に対する Prob > |r| |
||||
---|---|---|---|---|
1980 | 1990 | 2000 | 2010 | |
1980 |
1.00000
|
0.95968
<.0001
|
0.88774
<.0001
|
0.84683
<.0001
|
1990 |
0.95968
<.0001
|
1.00000
|
0.96103
<.0001
|
0.92472
<.0001
|
2000 |
0.88774
<.0001
|
0.96103
<.0001
|
1.00000
|
0.98623
<.0001
|
2010 |
0.84683
<.0001
|
0.92472
<.0001
|
0.98623
<.0001
|
1.00000
|
a. ミャンマー、中国、およびアメリカの死亡率データ間の相関関係を計算します。この相関行列をODS OUTPUT を使用してデータセット country_corに出力します。 b. ミャンマーとアメリカの相関関係を相関行列から抽出します。
data mort_sub;
set mort(rename=(Var1 = Country));
where country in ('Myanmar' 'China' 'United States');
run;
proc transpose data = mort_sub out = mort_sub_transposed;
var '1760'n -- '2099'n;
id country;
run;
ods output PearsonCorr = country_cor;
proc corr data = mort_sub_transposed;
var China Myanmar 'United States'n;
run;
proc print data = country_cor;
var Myanmar;
where Variable = 'United States';
run;
CORR プロシジャ
3 変数 : | China Myanmar United States |
---|
単純統計量 | ||||||
---|---|---|---|---|---|---|
変数 | N | 平均 | 標準偏差 | 合計 | 最小値 | 最大値 |
China | 214 | 2.37608 | 1.15555 | 508.48153 | 0.04325 | 3.61453 |
Myanmar | 214 | 2.82215 | 1.12767 | 603.94031 | 0.05150 | 3.76418 |
United States | 214 | 1.36080 | 1.14407 | 291.21132 | 0.02867 | 3.17018 |
Pearson の相関係数, N = 214 H0: Rho=0 に対する Prob > |r| |
|||
---|---|---|---|
China | Myanmar | United States | |
China |
1.00000
|
0.97436
<.0001
|
0.69093
<.0001
|
Myanmar |
0.97436
<.0001
|
1.00000
|
0.62926
<.0001
|
United States |
0.69093
<.0001
|
0.62926
<.0001
|
1.00000
|
OBS | Myanmar |
---|---|
3 | 0.62926 |
1990年と2000年の死亡率情報間に差があるかどうかを、対応のある t 検定とウィルコクソン符号順位検定で調べてください。ヒント: 1990年の情報列を取り出すには ‘1990’n を使用します。
proc ttest data = mort;
paired '1990'n*'2000'n;
run;
data diff;
set mort;
diff = '2000'n - '1990'n;
run;
proc univariate data = diff;
var diff;
run;
TTEST プロシジャ
差 : 1990 - 2000
N | 平均 | 標準偏差 | 標準誤差 | 最小値 | 最大値 |
---|---|---|---|---|---|
197 | 0.1591 | 0.2227 | 0.0159 | -0.5456 | 0.8726 |
平均 | 平均の 95% 信頼限界 |
標準偏差 | 標準偏差の 95% 信頼限界 |
||
---|---|---|---|---|---|
0.1591 | 0.1278 | 0.1904 | 0.2227 | 0.2027 | 0.2472 |
自由度 | t 値 | Pr > |t| |
---|---|---|
196 | 10.03 | <.0001 |
UNIVARIATE プロシジャ
変数 : diff
モーメント | |||
---|---|---|---|
N | 197 | 重み変数の合計 | 197 |
平均 | -0.1590681 | 合計 | -31.336415 |
標準偏差 | 0.22269839 | 分散 | 0.04959457 |
歪度 | -0.9205453 | 尖度 | 2.01791651 |
無修正平方和 | 14.7051599 | 修正済平方和 | 9.72053615 |
変動係数 | -140.00192 | 平均の標準誤差 | 0.0158666 |
基本統計量 | |||
---|---|---|---|
位置 | ばらつき | ||
平均 | -0.15907 | 標準偏差 | 0.22270 |
中央値 | -0.09007 | 分散 | 0.04959 |
最頻値 | . | 範囲 | 1.41823 |
四分位範囲 | 0.21805 |
位置の検定 H0: Mu0=0 | ||||
---|---|---|---|---|
検定 | 統計量 | p 値 | ||
Student の t 検定 | t | -10.0253 | Pr > |t| | <.0001 |
符号検定 | M | -84.5 | Pr >= |M| | <.0001 |
符号付順位検定 | S | -8245.5 | Pr >= |S| | <.0001 |
分位点 (定義 5) | |
---|---|
水準 | 分位点 |
100% 最大値 | 0.5456100 |
99% | 0.3990751 |
95% | 0.0830986 |
90% | -0.0104786 |
75% Q3 | -0.0286619 |
50% 中央値 | -0.0900725 |
25% Q1 | -0.2467130 |
10% | -0.4798594 |
5% | -0.6188205 |
1% | -0.8710244 |
0% 最小値 | -0.8726242 |
極値 | |||
---|---|---|---|
最小値 | 最大値 | ||
値 | Obs | 値 | Obs |
-0.872624 | 19 | 0.272621 | 32 |
-0.871024 | 131 | 0.321500 | 196 |
-0.808735 | 96 | 0.329956 | 22 |
-0.804626 | 54 | 0.399075 | 99 |
-0.794268 | 106 | 0.545610 | 197 |
データセット carsを使用して、車両価格「VehBCost」 を従属変数とし、車両年齢「VehicleAge」とオンライン販売 「IsOnlineSale」の有無とその相互作用を予測変数とする線形回帰モデルを使用します。
proc glm data = cars;
model VehBCost = VehicleAge IsOnlineSale VehicleAge*IsOnlineSale;
run;
GLM プロシジャ
読み込んだオブザベーション数 | 72983 |
---|---|
使用されたオブザベーション数 | 72983 |
GLM プロシジャ
従属変数 : VehBCost
要因 | 自由度 | 平方和 | 平均平方 | F 値 | Pr > F |
---|---|---|---|---|---|
Model | 3 | 22422071293 | 7474023764.4 | 2652.08 | <.0001 |
Error | 72979 | 205667188003 | 2818169.4461 | ||
Corrected Total | 72982 | 228089259296 |
R2 乗 | 変動係数 | Root MSE | VehBCost の平均 |
---|---|---|---|
0.098304 | 24.94067 | 1678.740 | 6730.934 |
要因 | 自由度 | Type I 平方和 |
平均平方 | F 値 | Pr > F |
---|---|---|---|---|---|
VehicleAge | 1 | 22249980049 | 22249980049 | 7895.19 | <.0001 |
IsOnlineSale | 1 | 158865621 | 158865621 | 56.37 | <.0001 |
VehicleAg*IsOnlineSa | 1 | 13225623 | 13225623 | 4.69 | 0.0303 |
要因 | 自由度 | Type III 平方和 |
平均平方 | F 値 | Pr > F |
---|---|---|---|---|---|
VehicleAge | 1 | 21533779839 | 21533779839 | 7641.05 | <.0001 |
IsOnlineSale | 1 | 64252535 | 64252535 | 22.80 | <.0001 |
VehicleAg*IsOnlineSa | 1 | 13225623 | 13225623 | 4.69 | 0.0303 |
パラメータ | 推定値 | 標準誤差 | t 値 | Pr > |t| |
---|---|---|---|---|
Intercept | 8062.701999 | 16.5870226 | 486.08 | <.0001 |
VehicleAge | -320.662108 | 3.6683525 | -87.41 | <.0001 |
IsOnlineSale | 514.308268 | 107.7114631 | 4.77 | <.0001 |
VehicleAg*IsOnlineSa | -55.372926 | 25.5607123 | -2.17 | 0.0303 |
データセットcars内に車両価格が 10,000 ドルを超えていることを示す変数「expensive」を作成してください。カイ二乗検定により車が高価だったことと、損な取引だったことを示すラベル用変数「IsBadbuy」に関連があるかを評価してください。
data cars;
set cars;
if VehBCost > 10000 then expensive = 1;
else expensive = 0;
run;
proc freq data = cars;
tables expensive*IsBadBuy / chisq;
run;
FREQ プロシジャ
|
|
expensive * IsBadBuy の統計量
統計量 | 自由度 | 値 | p 値 |
---|---|---|---|
カイ 2 乗値 | 1 | 1.8948 | 0.1687 |
尤度比カイ 2 乗値 | 1 | 1.9314 | 0.1646 |
連続性補正カイ 2 乗値 | 1 | 1.8152 | 0.1779 |
Mantel-Haenszel のカイ 2 乗値 | 1 | 1.8948 | 0.1687 |
ファイ係数 | -0.0051 | ||
一致係数 | 0.0051 | ||
Cramer の V 統計量 | -0.0051 |
Fisher の正確検定 | |
---|---|
セル (1,1) 度数 (F) | 61505 |
左側 Pr <= F | 0.0880 |
右側 Pr >= F | 0.9211 |
表の確率 (P) | 0.0091 |
両側 Pr <= P | 0.1790 |
標本サイズ = 72983
ロジスティック回帰を使用し、 応答変数を「IsBadbuy」予測変数を「expensive」「VehicleAge」としてオッズ比の信頼区間を算出してください。
proc logistic data = cars;
model IsBadBuy(event='1') = expensive VehicleAge / clodds = wald;
run;
LOGISTIC プロシジャ
モデルの情報 | |
---|---|
データセット | WORK.CARS |
応答変数 | IsBadBuy |
応答の水準数 | 2 |
モデル | binary logit |
最適化の手法 | Fisher's scoring |
読み込んだオブザベーション数 | 72983 |
---|---|
使用されたオブザベーション数 | 72983 |
反応プロファイル | ||
---|---|---|
順番 | IsBadBuy | 度数の合計 |
1 | 0 | 64007 |
2 | 1 | 8976 |
モデルの確率基準は IsBadBuy='1' です。
モデル収束状態 |
---|
収束基準(GCONV=1E-8)は満たされました。 |
モデルの適合度統計量 | ||
---|---|---|
基準 | 切片のみ | 切片と共変量 |
AIC | 54423.307 | 52447.788 |
SC | 54432.505 | 52475.381 |
-2 Log L | 54421.307 | 52441.788 |
包括的帰無仮説: BETA=0 の検定 | |||
---|---|---|---|
検定 | カイ 2 乗値 | 自由度 | Pr > ChiSq |
尤度比 | 1979.5198 | 2 | <.0001 |
スコア | 2042.5760 | 2 | <.0001 |
Wald | 1961.8662 | 2 | <.0001 |
最尤推定値の分析 | |||||
---|---|---|---|---|---|
パラメータ | 自由度 | 推定値 | 標準誤差 | Wald カイ 2 乗値 |
Pr > ChiSq |
Intercept | 1 | -3.2495 | 0.0332 | 9554.1782 | <.0001 |
expensive | 1 | -0.0804 | 0.0607 | 1.7542 | 0.1853 |
VehicleAge | 1 | 0.2866 | 0.00648 | 1958.7086 | <.0001 |
予測確率と観測データの応答との関連性 | |||
---|---|---|---|
一致の割合 | 56.9 | Somers の D | 0.279 |
不一致の割合 | 29.1 | ガンマ | 0.324 |
タイの割合 | 14.0 | Tau-a | 0.060 |
組 | 574526832 | c | 0.639 |
オッズ比推定と Wald による信頼区間 | ||||
---|---|---|---|---|
効果 | 単位 | 推定値 | 95% 信頼限界 | |
expensive | 1.0000 | 0.923 | 0.819 | 1.039 |
VehicleAge | 1.0000 | 1.332 | 1.315 | 1.349 |
SAS MACRO プログラミング#
量的変数の値を以下のように4つのカテゴリーに分割するマクロを書いてください。:
X < Q1の場合、group = 1
Q1 < X < Medianの場合、group = 2
Median < X < Q3の場合、group = 3
Q3 < Xの場合、group = 4
このマクロの定義は次のようになります。%quartilesmacro(mydata, qvar, round, out);
mydata: 量的変数を含むデータセット
qvar: 量的変数の名前
round: 小数点以下の桁数
out: 出力データセット名。この中にカテゴリ化された変数「qvar_cat」が含まれます。例えば、「qvar」が”bmi”の場合、出力変数は「bmi_cat」になります。
例としてデータセットFraminghamを使用してマクロを検証します。
libname phc6089 "/folders/myfolders/SAS_Notes/data/";
*Create a temporary data set, so that we don't save changes to the original data set.;
data fghmtemp;
set phc6089.fghm113;
run;
/*Now let's code some variables with some more descriptive values.
SEX (Gender): 1=Men
2=Women
Period (Examination cycle): 1=Period1
2=Period2
3=Period3
BPMEDS (Use of anti-hypertensive meds): 0=Not currently
1=Currently use
CURSMOKE (Currently smoke?): 0=No
1=Yes
DIABETES: 0=Not diabetic
1=Diabetic
PREVAP (Have angina pectoric?): 0=No
1=Yes
PREVCHD (Coronary heart disease?): 0=No
1=Yes
PREVMI (Myocardial infarction?): 0=No
1=Yes
PREVSTRK (Had a stroke?): 0=No
1=Yes
PREVHYP (Hypertensive? sys bp >=140 or dyas bp >= 90): 0=no
1=yes
*/
proc format;
value YNfmt 0="No"
1="Yes";
value perfmt 1="Period 1"
2="Period 2"
3="Period 3";
value gndrfmt 1="Men"
2="Women";
run;
data fghmtemp;
set fghmtemp;
format prevap ynfmt.
diabetes ynfmt.
cursmoke ynfmt.
bpmeds ynfmt.
prevchd ynfmt.
prevmi ynfmt.
prevstrk ynfmt.
prevhyp ynfmt.
sex gndrfmt.;
run;
* Step 1 - write code with only macros variables - Let's categorize BMI by quartiles;
%let qvar = bmi;
* Find table name;
ods trace on;
proc means data = fghmtemp Q1 Median Q3;
var &qvar.;
run;
ods trace off;
ods output summary = quartiles;
proc means data = fghmtemp Q1 Median Q3;
var &qvar.;
run;
* See the contents of the ODS table;
proc print data = quartiles;
run;
data _null_;
set quartiles;
call symputx("Q1", strip(&qvar._Q1));
call symputx("M", strip(&qvar._Median));
call symputx("Q3", strip(&qvar._Q3));
run;
%put _user_; * see the value of our macro variables in the log file;
data fghmtemp;
set fghmtemp;
if not missing(&qvar.) and &qvar. < &Q1. then &qvar._cat = 1;
else if &qvar. < &M. then &qvar._cat = 2;
else if &qvar. < &Q3. then &qvar._cat = 3;
else &qvar._cat = 4;
run;
proc freq data = fghmtemp;
tables &qvar._cat;
run;
MEANS プロシジャ
分析変数 : BMI Body Mass Index (kr/(M*M) | ||
---|---|---|
下側四分位点 | 中央値 | 上側四分位点 |
23.1000000 | 25.2800000 | 27.6300000 |
MEANS プロシジャ
分析変数 : BMI Body Mass Index (kr/(M*M) | ||
---|---|---|
下側四分位点 | 中央値 | 上側四分位点 |
23.1000000 | 25.2800000 | 27.6300000 |
OBS | BMI_Q1 | BMI_Median | BMI_Q3 |
---|---|---|---|
1 | 23.1 | 25.28 | 27.63 |
FREQ プロシジャ
bmi_cat | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
1 | 120 | 24.00 | 120 | 24.00 |
2 | 130 | 26.00 | 250 | 50.00 |
3 | 125 | 25.00 | 375 | 75.00 |
4 | 125 | 25.00 | 500 | 100.00 |
基礎となるコードは動作しました。これをマクロにしましょう。
%macro quartilesmacro(mydata, qvar, round, out = out_dat);
ods select none;
ods output summary = quartiles;
proc means data = &mydata. Q1 Median Q3 maxdec = &round.;
var &qvar.;
run;
ods select all;
data _null_;
set quartiles;
call symputx("Q1", strip(&qvar._Q1));
call symputx("M", strip(&qvar._Median));
call symputx("Q3", strip(&qvar._Q3));
run;
data &out.;
set &mydata.;
if not missing(&qvar.) and &qvar. < &Q1. then &qvar._cat = 1;
else if &qvar. < &M. then &qvar._cat = 2;
else if &qvar. < &Q3. then &qvar._cat = 3;
else &qvar._cat = 4;
run;
%mend;
%quartilesmacro(fghmtemp, bmi, round = 2, out = out_bmi);
proc freq data = out_bmi;
tables bmi_cat;
run;
FREQ プロシジャ
bmi_cat | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
1 | 120 | 24.00 | 120 | 24.00 |
2 | 130 | 26.00 | 250 | 50.00 |
3 | 125 | 25.00 | 375 | 75.00 |
4 | 125 | 25.00 | 500 | 100.00 |
SASによるシミュレーション#
この例では、母比率の標本分布を扱います。
a) n = 1、p = 0.3の二項分布からサイズ50の500個のサンプルを生成してください。これを行うために、この二項分布からのランダム変量で埋められた500行50列のデータセットを生成します。ヒント:配列とネストされたDOループを使用します。
b) mean(of )を使用して、これら500行の各行の平均を計算し、この平均を新しい列として保存してください。
c) part bで計算された500個の平均のヒストグラムをプロットし、part bで計算された500個の平均からの平均と標準偏差を計算するためにPROC MEANSを使用してください。これは、サンプルサイズが30のときに成功確率p = 0.3の母集団分布を持つ場合のp-hatの標本分布を表しています。
data sim;
array data[*] x1-x50;
do numsim = 1 to 500;
do n = 1 to 50;
data[n] = ranbin(1234, 1, 0.3);
end;
p_hat = mean(of x1-x50);
output;
end;
run;
proc sgplot data = sim;
histogram p_hat;
run;
proc means data = sim mean std;
var p_hat;
run;
MEANS プロシジャ
分析変数 : p_hat | |
---|---|
平均 | 標準偏差 |
0.2980400 | 0.0635376 |