BookmarkSubscribeRSS Feed
chie_sas
Obsidian | Level 7

いつもお世話になっております。

SHEWHARTプロシジャにてIRCHARTステートメントで個々の測定値のチャートを作成しているのですが、

同時にCP、CPK値を算出し、可能であればチャート上に表記させたいと思っています。

 

調べたところ、INSETステートメントで出力できそうなのですが、

CP、CPK値出力のためにLSL、USL値の指定が必要とのこと。

ただ、LSL、USL値を直接指定するのではなく、データセット上の値を指定したいのですが、

何か方法は無いでしょうか?

なるべくであればプロシジャ内の機能で行いたいと思っています。

 

ご教授のほどよろしくお願いいたします。

12 REPLIES 12
PaigeMiller
Diamond | Level 26

Using a translation at Google Translate:

 

I am creating a chart of individual measurements with the IRCHART statement in the SHEWHART procedure.

At the same time, I would like to calculate the CP and CPK values and display them on the chart if possible.

 

After checking, it seems that it can be output with the INSET statement,

It is necessary to specify LSL and USL values for CP and CPK value output.

However, instead of directly specifying the LSL and USL values, I would like to specify the values on the dataset.

 

Maybe the translation is not clear.

 

Does this mean you have a data set which already contains the LSL and USL values?

 

Or does this mean you want to use the control limits found by PROC SHEWHART IRCHART as the LSL and USL?


Translating back to Japanese:

 

たぶん、翻訳は明確ではありません。

 

これは、LSL値とUSL値がすでに含まれているデータセットがあることを意味しますか?

 

それとも、PROC SHEWHART IRCHARTによって検出された管理限界をLSLおよびUSLとして使用することを意味しますか?

--
Paige Miller
chie_sas
Obsidian | Level 7

LSL値とUSL値がすでに含まれているデータセットがあり、

そちらを指定して使用したいと思っています。

 

よろしくお願いいたします。

PaigeMiller
Diamond | Level 26

Create a macro variable LSL and another macro variable USL. Use these macro variables in your IRCHART statement

 

マクロ変数LSLと別のマクロ変数USLを作成します。 IRCHARTステートメントでこれらのマクロ変数を使用します

 

/* Create macro variables */
data _null_;
     set dataset_with_lsl_and_usl;
     call symputx('lsl',lsl);
     call symputx('usl',usl);
run;

/* Run PROC SHEWHART but add in the LSL and USL macro variables */
proc shewhart data= ...;
     irchart ... / lsl=&lsl usl=&usl;
run;

 

--
Paige Miller
chie_sas
Obsidian | Level 7

プロシジャ機能(オプションなど)内で実現することは難しいでしょうか?

コーディングスキルの乏しい人にレクチャーしたいので、

なるべくマクロ変数を使用しない方法を取りたいと思っています。

 

よろしくお願いいたします。

yu_sas
SAS Employee

LSL=とUSL=オプションは定数のみ指定可能ですので、PaigeMillerさんが書いたようにマクロ変数を使うのがもっとも簡単かと思われます。その他の方法としては、LIMITS=オプションを用いてデータセットの値からLSLやCp、Cpkを指定することができますのであらかじめ算出した値を表示することは可能です。

 

data Jets;
   input Engine Diam @@;
   lsl=50; usl=80;
   label Engine = "Engine Number";
   datalines;
 1 78.4   2 80.1   3 84.4   4 79.1   5 80.4
 6 83.5   7 73.8   8 83.5   9 75.0  10 76.8
11 70.5  12 80.3  13 82.4  14 79.4  15 86.4
16 90.5  17 77.7  18 82.5  19 79.9  20 83.2
;
proc shewhart data=Jets;
   irchart Diam*Engine / outlimits = Jetlim
                         nochart;
run;

data Jetlim;
set Jetlim;
if _n_=1 then set Jets(keep=lsl usl);
_lsl_=lsl;
_usl_=usl;
_cp_=(_usl_-_lsl_)/(6*_stddev_);
_cpk_=min(_usl_-_mean_, _mean_-_lsl_)/(3*_stddev_);
run;

proc shewhart data=Jets limits=Jetlim;
   irchart Diam*Engine ;
   inset cp cpk;
run;
PaigeMiller
Diamond | Level 26

As far as I know, macro variables are the easiest way to do this. The USL and LSL must come from outside of PROC SHEWHART.

 

私の知る限り、これを行う最も簡単な方法はマクロ変数です。 USLとLSLは、PROCSHEWHARTの外部から取得する必要があります。

--
Paige Miller
chie_sas
Obsidian | Level 7

PaigeMillerさん yu_sasさん

 

お返事ありがとうございます。

LIMITS=オプションでの指定で実現できることを確認できました。

今回はこちらの方法を取りたいと思います。

ありがとうございました!

 

chie_sas
Obsidian | Level 7

お世話になっております。

 

Close後で大変恐縮です。

yu_sas様に教えていただいた方法でcp、cpk値を算出していたのですが、

その計算で使用している_stddev_の値がおかしいようで、cp、cpk値が想定の結果になりません。

_stddev_はどのような値なのでしょうか?

よろしくお願いいたします。

data Jets;
   input Engine Diam @@;
   lsl=50; usl=80;
   label Engine = "Engine Number";
   datalines;
 1 78.4   2 80.1   3 84.4   4 79.1   5 80.4
 6 83.5   7 73.8   8 83.5   9 75.0  10 76.8
11 70.5  12 80.3  13 82.4  14 79.4  15 86.4
16 90.5  17 77.7  18 82.5  19 79.9  20 83.2
;

/*標準偏差1*/
proc shewhart data=Jets;
   irchart Diam*Engine / outlimits = Jetlim(keep=_stddev_)
                         nochart;
run;

proc print data=Jetlim;
run;

/*標準偏差2*/
proc means data=Jets std;
 var Diam;
run;

/*
標準偏差1と2で値が異なる
*/

 

yu_sas
SAS Employee

SHEWHARTプロシジャが出力しているのはprocess standard deviationと呼ばれる値と
なります。これはD2関数と移動範囲の平均値から算出できます。

 

data test;
set jetlim;
std=_r_/d2(2);
put _stddev_ std;
run;

 

 

chie_sas
Obsidian | Level 7

お返事ありがとうございます。

一般的な標準偏差でCP、CPK値を算出したいと思っているのですが、

別で算出した方が良いでしょうか?

もしオプション設定などで算出できる方法があるようであれば教えてください。

yu_sas
SAS Employee

MEANSやUNIVARIATEプロシジャなどで算出したほうがよいと思います。

chie_sas
Obsidian | Level 7

yu_sas様、承知いたしました。

ありがとうございました。

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

Discussion stats
  • 12 replies
  • 2096 views
  • 3 likes
  • 3 in conversation