今年の初めに、私のマネージャーが Data Colada からの非常に興味深い投稿を私に送ってくれました。Data Colada は、発表された研究を調査する 3 人の行動科学者によって書かれたブログ投稿です。 Data Colada の著者らは匿名の研究者チームと協力し、2012 年の論文で使用された自動車の走行距離データ セットにいくつかの奇妙な異常を発見しました。私は、データ内の異常または予期しないパターンを識別するために使用できるJMPのExplore Patternsプラットフォームのテストを担当しています。この投稿では、JMP の他の便利なツールとともに Explore Patterns を使用して、車の走行距離データ内の予期しないまたは異常なパターンを検索します。
背景
車の走行距離データ セットの最初の数行と列を以下に示します。これらのデータは、特定の自動車保険代理店の 13,488 人の顧客に現在の走行距離計の測定値を報告するよう依頼した調査から収集されたものです。顧客が報告した測定値は、各顧客が最大 4 台の車の情報を報告したため、update_car1 から update_car4 列としてデータに含まれます。このデータには、保険契約が最初に発行されたときの各車両の走行距離計の測定値も含まれています。これらの列には、baseline_car1 から Baseline_car4 という名前が付けられます。すべてのポリシーが同時に発行されたわけではないため、この調査の観察では、ベースラインから更新までの経過時間は異なります。

Data Colada の投稿で、研究者らはこのデータセットで見つかった 4 つの異常を紹介しました。 JMP を使用して、これらの調査結果をそれぞれ詳しく調べてみましょう。
異常 #1: 走行距離の分布が均一である
Data Colada の著者らは、走行マイル数の分布が 0 から 50,000 マイルの範囲で均一に分布していることを発見しました。
データには各車の走行距離計の測定値のベースライン列と更新列が含まれているため、更新値からベースライン値を減算して走行マイル数を保存する数式列を作成します。次に、JMP では、分布プラットフォームを使用して、ベースラインの分布と更新値、および各車の総走行距離を表示します。各顧客の最初の車の流通レポートを考えてみましょう。

ベースライン走行距離の分布の形状は、更新された走行距離の分布と似ており、更新時のオドメーターの中央値は約 26,000 マイル高くなります。この発見自体は驚くべきことではありません。ベースラインと更新の測定値で最も興味深いのは、2 人の参加者が 100 万マイル近く走行した車両を所有していることです。彼らは非常に優れたメカニックを持っているに違いありません。
レポートの最も憂慮すべき部分は、最初の 2 つの間の違いを示す上記の 3 番目の分布です。ベースライン時間と更新時間の間に走行したマイルの分布は、0 ~ 50,000 マイルの間で均一に分布しているように見えます。 50,000 マイルを超える値はなく、ヒストグラムの各ビンにはほぼ同じ数の参加者が含まれています。この場合、目視検査により、データが均一に分布しているという確かな証拠が得られます。ただし、それほど明白でないデータの場合は、配布プラットフォームの [ベータ版に適合] オプションを使用して適合度テストを実行できます。
以下のスクリーンショットは、各参加者の車の走行距離の分布 (更新 - ベースライン) を示しています。 2 台目、3 台目、4 台目の車両についても、それぞれの分布が 0 ~ 50,000 の間で均一に分布していることがわかります。この分布パターンに基づいて、更新された走行距離値は、ベースライン走行距離値に均一に分布したランダム値を追加することによって生成された可能性があると結論付けることができます。

異常 #2: ベースラインの走行距離には四捨五入が使用され、更新された走行距離には四捨五入が行われていません
Data Colada の著者らは、ベースライン走行距離には多くの値が最も近い千の位に四捨五入されているのに対し、更新された走行距離にはこの四捨五入が含まれていないことを発見しました。
Data Colada の研究者は、走行距離の下 3 桁を見て四捨五入を調査しました。 JSL を使用して同様のアプローチを取ることもできますが、代わりに Explore Patterns を使用しましょう。これまでに Explore Patterns を使用したことがない場合は、[Analyze] > [Screening] を選択すると見つけることができます。

Explore Patterns を起動して各ベースラインを調査し、列を更新すると、次のスクリーンショットに示す出力が得られます。 [一変量パターン] レポートで、ベースラインを選択し、パターンを比較する最初の車の値を更新します。

デフォルトでは、Explore Patterns には、各列の最も重複した値、各列の最長実行、および各列の最長重複シーケンスのレポートが含まれます。参加者が所有する最初の車の場合、最長実行レポートまたは最長重複シーケンス レポートから得られるものはあまりありません。ただし、「最も重複した値」レポートは興味深い対照を示しています。最初に所有した車の基準走行距離には、10,000 の位を四捨五入しているように見える値が多数あります。これは必ずしも予期しないパターンが見つかるわけではありません。車の走行距離を聞かれると、私はいつも丸めて答えます。
更新された走行距離の最も重複した値レポートはまったく異なります。このレポートでは重複がはるかに少なく、表示される重複はベースライン値のように四捨五入されていません。これは、一様に分散されたランダム値をベースライン値に追加することによって更新列が生成された場合に起こることです。したがって、この発見は異常 #1 と一致します。
異常 #3 – データは 2 つのフォントで入力され、各観測値にはもう一方のフォントで「ツイン」が含まれています
研究者らは、元のデータ ファイルでは、観察結果が 2 つの異なるフォントを使用して記録されていることに気づきました。研究者らは、賢明な並べ替えを通じて、あるフォントの各ベースライン観察が、もう一方のフォントの非常に類似した行に対応していることを発見しました。
フォントの違いに気づき、このアプローチをとった研究者たちに拍手を送ります。ただし、データがすべて同じフォントであり、この危険信号が発生しなかったと仮定します。 JMP を使用して、行と列の間の興味深い関係を特定できますか?もちろんできます。結局のところ、これは JMP ブログです。
Explore Patterns を使用すると、連続する行の列間に線形関係があるかどうかを調査できます。次の簡単な例を考えてみましょう。最初の 4 行では、列は Y=2*X という正確な線形関係を持ちます。次の 3 行でも、2 つの列は Y=0.5*X という正確な線形関係を持ちます。

Explore Patterns を使用すると、ベースライン列間のこのような線形関係を検索できます。異常 #1 にまだ気づいていない場合は、更新された列でも線形関係を探すのが合理的です。

正確な線形関係が多数ある場合、または線形関係が大量に連続している場合は、ある列の値が別の列の倍数を使用して生成されたことを示す可能性があります。ここでは、ベースライン列が正確な線形関係を持つ行はほんの数行しかありません。 [色付け] オプションを使用してこれらのセルを表示し、異常がないかどうかを検査することもできますが、多くの丸められた値を含むこのサイズのデータ セットの場合、いくつかの線形関係が見つかっても不思議ではありません。
Explore Patterns を使用して、ベースライン値の 2 つの列の行間に疑わしい線形関係があるかどうかを調査しました。しかし、結果はあまり役に立ちませんでした。ここで、ベースライン値について、2 つの行間の列間の線形関係も調べてみましょう。これを行うには、データの転置で Explore Patterns を使用する必要があります。
少なくとも 3 台の車両の走行距離を報告した参加者に対して、JMP の転置オプションを使用してデータをベースライン列ごとに転置しました。参加者が 2 台以下の車を所有している行は、線形関係を特定するのに役立たないため、除外しました。

この転置データの Explore Patterns レポートには、傾きがほぼ 1 である正確な線形関係が多数あります。したがって、元のデータ テーブルには、車全体にわたってほぼ 2 行のベースライン値を持つ行が多数存在します。 (ヒント: [傾き] 列を右クリックし、[場所を選択] 機能を使用すると、傾きが 1 に近いすべての行を強調表示できます。傾きが 0.99 ~ 1.01 の間にあるペアは 69 個あります。

線形関係の表の上にある [色付け] を選択して、正確な線形関係にあるすべての値を色付けするか、Y 列を右クリックして特定の値を色付けすることができます。以下の表には、線形関係レポートの最初の 3 行の色分けされた値が含まれています。

Explore Patterns は、ベースライン走行距離の値がすべての車で非常に類似しており、正確な線形関係を持つ「運転双子」のペアをいくつか特定しました。これを追跡するには、正確な線形関係はないが、それでも非常に密接な関係があるペアをさらに探すことができます。 Data Colada の投稿に示されているように、4 台目の車のベースライン値で並べ替えると、多くの運転双子を簡単に特定できます。
異常 #4 – 1 つのフォントには多くの丸められたベースライン値があり、もう 1 つはそうではありません
研究者らは、Calibri フォントのベースライン値は四捨五入されており、Cambria フォントの値は四捨五入されていないことを発見しました。
ここで、一部の行は 1 つのフォントで書かれ、他の行は 2 番目のフォントで書かれていること、そしてデータ内に各行のフォントを含む列があることがわかっているとします。 By 列としてフォント名を指定して Explore Patterns を使用する場合があります。

Explore Patterns レポートに見られるように、Calibri フォントの行のベースライン走行距離値には多くの四捨五入値が含まれていますが、Cambria 行のベースライン値は四捨五入されていません。顧客から報告された走行距離は四捨五入されると予想されるため、これは、元の報告値が Calibri フォントを使用した行であり、「ドライビング ツイン」データが作成されて Cambria フォントで入力されたことを示唆しています。
結論
新しいデータセットを取得するときは必ず、探索的分析やデータクリーニングを行うことがあります。おそらく、 外れ値を検索したり、 欠損値がないかデータをチェックしたり、各変数の分布を表示したりすることがあります。この投稿が、データ内の異常なパターンをチェックするために Explore Patterns の使用を検討するきっかけになったことを願っています。 Explore Patterns を使用して見つかったすべてのパターンが、問題や懸念のあることを示す証拠であるわけではありませんが、このユーティリティは、さらなる調査が必要なパターンを見つけるためのツールを提供します。
やあ@マドゥ。 ご質問ありがとうございます。転置データ テーブルの列タイトルにこの形式を使用するための 2 つの解決策を紹介します。
まず、元のデータ テーブルに、以下のスクリーンショットにある数式を使用する新しい列を作成できます。

この列を作成したら、転置を実行するときにそれをラベル列として使用できます。

すでに転置データ テーブルを作成しているため、使用できる 2 番目のオプションは、JSL を使用して列タイトルを編集することです。 これを行うには、転置データ テーブルを開き、[ファイル] > [新規作成] > [スクリプト] を選択し、以下のスクリプトをスクリプト エディタ ウィンドウに貼り付けます。 このスクリプトを実行すると、列タイトルが目的の形式に更新されます。
dt = Data Table("Transpose of Car Mileage Data");
colNames = dt << Get Column Names(string);
For(i=2, i <= Length(colNames), i++,
Column(dt, i) << Set Name("id=" || char(colNames[i]))
);
これがお役に立てば幸いです。 コメントありがとうございます。
やあ@jacob_rhyne
ご指導ありがとうございます。 これで転置行列が作成できました。
この演習で実行できないと考えられる唯一のことは、列タイトル id=12、id=23、id=36 などを一度に変更することです。 各列名を手動で変更する必要がありますか? id= を追加する数式を使用して、すべての列タイトルを一度に置き換えたいと考えました。
やあ@マドゥ。 「行の選択」>「行の選択」>「場所の選択」は、「行」>「行の選択」>「場所の選択」にあります。

ただし、JSL を使用する代わりに JMP を対話的に使用してこれらの行を選択する場合は、新しい列を追加し、これらの行を識別するための式を作成することをお勧めします。 これを行うには、次の手順を試してください。
- 上部のメニューから [列] > [新しい列...] を選択します。
- [新しい列] メニューで、[列のプロパティ] > [数式] を選択します。
- 数式エディターで、次のように数式を入力します。

数式を入力したら、「OK」をクリックして列を作成します。 新しい列の値 1 の行は、3 台以上の車を所有する参加者に対応します。 以下のように、値 1 の行を右クリックし、[一致するセルの選択] をクリックすると、値 1 のすべての行を選択できます。

これを行うための JSL の使用に関する質問については、拡張ログを調べて、対話的に実行したアクションに対して生成された JSL を見つけることから始めるとよいでしょう。 たとえば、以下のスクリーンショットは、このページに添付されているデータ テーブルを開いて、上記で説明した新しい数式列を作成し、選択した行を使用してデータを転置した後のログを示しています。 ログからスクリプトを新しいスクリプトとして保存し、いつでも再実行できます。

これがお役に立てば幸いです。 改めてお読みいただきありがとうございます。
やあ@jacob_rhyne
迅速な返信ありがとうございます。 私は JMP を初めて使用するため (JMP 16 Pro を使用)、JMP についてあまり知りません。 残念ながら、セレクトが見つかりませんJMP メニューのどこにでも機能があります。
さらに、データファイルに JSL コードを挿入してコードを自動的に実行する方法はありますか?
やあ@マドゥ読んでいただき、そして質問していただきありがとうございます。 少なくとも 3 台の車両の走行距離を報告した参加者を特定するには、JMP の「場所を選択」機能を使用してこれらの行を選択します。 データを転置するときに、選択した行のみを使用することを選択できます。 以下は、3 台以上の車を持つすべての参加者の行を選択し、選択された行のみを使用してデータを転置する JSL スクリプトです。
Data Table( "Car Mileage Data" ) << Select Where(
Sum(Is Missing(:baseline_car1),
Is Missing(:baseline_car2),
Is Missing(:baseline_car3),
Is Missing(:baseline_car4)
) <= 1);
Data Table( "Car Mileage Data" ) << Transpose(
columns( :baseline_car1, :baseline_car2, :baseline_car3, :baseline_car4 ),
Transpose selected rows only( 1 ),
Output Table( "Transpose of Car Mileage Data" )
);
車の走行距離の転置データを作成するには、少なくとも 3 台の車両の走行距離を報告した参加者をどのように特定 (またはピックアップ) しましたか? 各行をチェックして手動で行うこともできますが、使用する公式はありますか?