注意: JMP 11 先週発売しました。今日、私たちは火曜日にシリーズを始めます大きな統計によるブログ投稿ジョン・ソールスクリーニングに重点を置いて、ビッグデータがあるときに何を変更する必要があるかについて。
データの準備はアナリストの仕事の大きな部分を占めます。ビッグデータがある場合、それは多くの場合仕事の大きな部分を占めるようになります。
私は3年間の出生記録データをダウンロードしました。 CDCのウェブサイトそして、1280万行あるにもかかわらず、母親の年齢別に赤ちゃんの出生時体重のグラフを作成するのはかなり速かったです。

1280万人のうち、あなたは8キログラム(17.6ポンド)を言う、いくつかのかなり重い赤ちゃんに遭遇することになるでしょう。しかし、隙間があると、一番上に10キログラムの赤ん坊の列があることに注意してください。赤ちゃんはそれほど大きく来ません。これらの点の1つをクリックしてツールチップを使用して詳細を確認すると、9999という値が表示されます。それは明らかに本当の重さではなく、むしろ欠損値コードです。
適合させる前に、これらの値を欠損値に書き換えるか、プラットフォームが欠損値コードとして認識できるように、欠損値コードプロパティを列プロパティに追加する必要があります。
修正するコードが複数ある場合は、さらにいくつかの手順があります。通常の方法は、点をグラフィカルに選択し、右側の列と行を選択してデータテーブルに戻り、[編集]メニューの[削除]コマンドを実行して、それらを欠損値にします。あなたが修正すべきコラムがほんの少ししかないとき、それはとてもうまくいきます。しかし、多くの列を修正しなければならない場合は、その方法では面倒です。
半導体業界には、数百または数千の列を持つデータがあります。値はすべてテスト機によって収集されます。機械は悪い価値を与えないでしょうか。この機械入手コラムの分布を見てください。ほとんどの値は0.5未満ですが、9999という欠落値コードがあります。欠損値コードの面倒を見てくれば、本当の分布がわかります。


以下は別の機械収集測定です。ほとんどすべての値は0.5未満ですが、もっと大きい値もあります - それらは測定システムからのある種のエラーコードです。これらのコードは実際のデータより11桁大きいため、堅牢な方法を使用したとしても、どんな解析でも大混乱を招くことになるので、これらをmissingに設定します。


大きなコードを削除すると、以前には明らかになっていなかった負のコードが表示されます。これらは実際のデータとわずか3桁違うので、他の異常値を取り除くまでそれらは隠されていました。これらを取り除けば、配布を見始める。まだ異常値はありますが、エラーコードだけでなく、実際の値のように見えます。それでそれらを一人にしておき、後で頑健な方法を検討することを忘れないでください。


あなたが日常的に分析するためにこの種のデータを持っているなら、あなたはきれいになることがかなり自動的に起こることを望むでしょう。ここでの主な特徴は、エラーコードが実際の値から非常に離れていることです。20倍の四分位範囲(IQR)を使用しても、それらすべてを見つけることができます。
だから私は上四分位数から、そして同様に下四分位数から20個のIQRであるすべてのユニークな値を集めるスクリプトを書いた。これはほとんどの不正な値を捉えましたが、別の問題が発生しました。以下に示すように、多くの場合、ほとんどのデータは同じ値で、IQRはゼロでした。不正なデータが半分以上のデータとほとんど異なる場合は、不正を宣言することはできません。

だからあなたは空ではないいくつかの分位数の範囲が見つかるまで外に行かなければならない。それからあなたは測定するための基準を持っています。ここで、上位四分位数よりも大きい最小値と下位四分位数よりも小さい最大値を使用します。これにより、データが中央で定数にまとめられる場合が処理されます。
ここでの必要性はオートメーション :不正な値を自動的に検索して報告し、要求されたら修復するスクリプトを用意する必要があります。自動化しなければ、各テーブルのすべての列についてすべてのステップを繰り返すことに制限されます。
だからここに私のスクリプトは、部分的にです。
まず、ダイアログから選択された変数をループするためにダイアログから呼び出されるコードを書きます。列を探し、すべての値をベクトルとして取得します。それからそれは拡張分位範囲を見つけます。次に、分位数の外側にある20分位数範囲であり、整数でもあるすべての値を検索します。私はすべてのエラーコードが整数であることを知っています。それから私は「面白い」価値についての情報を蓄積します。[修正]オプションがオンになっている場合は、列の値を欠損値に置き換えます。
okAction = expr(
text1 = "Quantile Tail=" || Char(tail,5) || " Reach=" || Char(reach,5);
dt<
For( icol = 1, icol <= nCheckCol, icol++,
col = Column( checkCols[icol] );
data = col<
// Guarantee a non-degenerate IQR by going just outside it
QUpper = Minimum(data[Loc(data >Quantile(1-tail,vec))]);
QLower = Maximum(data[Loc(data
LimitUpper = QUpper+reach*(QUpper-QLower);
LimitLower = QLower-reach*(QUpper-QLower);
funnyRows = Loc(((vec>LimitUpper)|(vec
nFix = nrow(funnyRows);
if (nFix==0,continue());
text1 ||= "\!n\!nColumn: "||(col<
||"\!n Lower Quantile="||char(QLower,7) || " Lower Threshold=" || char(LimitLower)
||"\!n Upper Quantile="||char(QUpper,7) || " Upper Threshold=" || char(LimitUpper)
||"\!n Outlier Values= ";
text1 ||= char(data[funnyRows]);
if (isFix,for(i=1,i<=nfix,i++,col[funnyRows]=.;));
);
dt<
NewWindow("Cleanup Items",ScriptBox(text1,"TEXT",600,600));
);
コードの残りの部分はセットアップとダイアログのコードです。
cleanupDlg = NewWindow("Outlier Cleanup",
BorderBox(left(3),top(2),
VListBox(
BorderBox(Left(60),Top(10),Bottom(10),
TextBox("Look for outliers to clean up.", Set Font Size(15),Set Wrap(400))
),
HlistBox(
VListBox(
PanelBox("Select Columns",
colListData=ColListBox(All,width(lbWidth),nLines(min(nc,25))))
),
PanelBox("Cast Selected Columns into Roles",VListBox(
chkbox1=CheckBox("Replace with missing"),
chkbox2=CheckBox("Look for non-integer outliers too"),
HListBox(TextBox("Quantile tail: "),edtbox1=TextEditBox(Char(tail))),
HListBox(TextBox("Number of quantiles ranges beyond quantile:"),
edtbox2=TextEditBox(Char(reach))),
LineupBox(NCol(2),Spacing(8),
ButtonBox("Columns to Check", colListCheck<
colListCheck = ColListBox(width(lbWidth),nLines(30))
)
)),
PanelBox("Action",LineupBox(NCol(1),
ButtonBox("OK",
checkCols = colListCheck<
nCheckCol = nItems(checkCols);
isFix = chkbox1<
isNonInt = chkbox2<
tail = Num(edtbox1<
reach = Num(edtbox2<
if (nCheckCol>=0, okAction; cleanupDlg << CloseWindow;);
),
ButtonBox("Cancel",cleanupDlg<
ButtonBox("Remove", colListCheck<
)))
)));
colListData << Set Data Type( "Numeric" );
スクリプトをテストした後、新しいデータのバッチを取得するたびに使用するアドインにします。各変数について、拡張分位点の値が何であり、どの値がそれらから20レンジ離れているかを示す出力ウィンドウが表示されます。
Column: DELW_SICR
Lower Quantile=-0.0321 Lower Threshold=-1.98795621097088
Upper Quantile=0.06569 Upper Threshold=2.02154020965099
Outlier Values= [9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999]
Column: PS_RPNBR
Lower Quantile=5462.67 Lower Threshold=-10461.529296875
Upper Quantile=6258.88 Upper Threshold=22183.0791015625
Outlier Values= [421034, 422334, 423613, 423085, 425256, 420978, 422327, 423525, 423021, 425233]
Column: RCON_PEM
Lower Quantile=0.162 Lower Threshold=-1.39799988269806
Upper Quantile=0.24 Upper Threshold=1.79999987781048
Outlier Values= [22539399168, 22751399936, 27257200640, 26248300544, 28104099840, 565313024]
ビッグデータは通常ダーティデータであり、検討すべきことがたくさんある場合は、データを整理して分析できるようにするためのツールを探す必要があります。このブログ記事で使用しているスクリプト - クリーンアップエラーコードアドイン - JMP File Exchangeに入っています。データの整理をより簡単にする必要がある場合は、ダウンロードする準備ができています。
マイク・クレイトン書きました:
エラーコードは整数であることが多いことに同意するので、継続的なデータと優れたゲージ機能のために、それらの整数は除外され、テストエンジニアまたは他のチームによって説明されることがあります。悪いゲージ能力は、ある範囲の値で偽の「整数」を与えることができます。
しかし、テストファイル生成プロセスやファイル変換プロセスによって、すべての整数に誤った余分な桁が与えられることがあります。そのため、検出可能なエラーコードを作成してバイナリからアナログに変換し、整数
次に、もちろん、残りの部品配布以外にも多くのIQR倍数である限界的な装置があり、許容範囲の制限が緩すぎる([パイロット制作後および顧客からのフィードバック後に統計的に設定するのではなく設計者によって設定される制限による] 「異端のある機器」を特定して封じ込める必要があり、それはデータの「クリーンアップ」または分析の次のステップの一部になる可能性があります。
チームの検証のために、製品ごとに、このような異常値が多数あるバッチに対しては、すべての異常値をデータシートに一時的に「除外」しておくことをお勧めします。
スクリプトがはるかに異常な整数を捕まえてくれてありがとう。