データベースで中央値列を見つけるにはどうすればよいですか?


8

普及地域の住居の建設期間に関するデータがあります。このデータを私の調査地域に転送しました。各調査地域の建設期間の中央値を決定したいと思います。唯一の問題は、列の情報が住居の数であり、それらの中央値は必要ないということですが、列のタイトルが新しいフィールド(またはそれを示す他の何か、できればテキストの期間)の行に入力されます形式ですが、ピリオドを示す単なる数値であれば、それは世界の終わりではありません)。

関連するフィールドが強調表示された属性テーブルの画像を添付しています。MEDIANフィールドはありますが、私が使用しているデータは他の人が作成したものであり、文書化が不十分であるため、計算がすでに行われたかどうかはわかりません。

(7つの列は、時系列順に並べられた7つの重複しない期間を表します。[中央値]フィールドは、全体の建設が半分完了した期間を示すように見えます。つまり、中央値の時間を記録します。

テーブルのスクリーンショット


1
中央が発生するフィールドの名前(またはインデックス)を求めていますか?(それは明らかに現在の[中央値]値ではありません。)または、おそらく、すべての構築の前半が発生した期間の名前(またはインデックス)を尋ねているのでしょうか。たとえば、行1で、期間の終わりの総建設は45、180、485、1495、1995、2130、2130でした。2130/ 2 = 1065の中央値は、第4期間中に発生しました(そして、確かに、[中央値] = 4)。これは通常「中央値」とは呼ばれませんが、現在のデータと一致しているように見えます。
whuber

@whuber、私はそれが間違っていることに偏執的です。これを編集した人はバンクーバーにいて、私は彼に直接尋ねることができず、メタデータに何も記録していませんでした。
エミリー

「中央列」が何を意味するのかまだわかりません-誰かがタイトルと質問を言い換えることはできますか?
blah238

1
@blah私の返信の冒頭で説明し、Nathanusによる返信へのコメントでさらに明確にしたように、用語は確かに正しいです。あなたのリクエストに応えるため、質問に段落を追加しました。
whuber

回答:


8

列が時間順に表示されていると仮定すると、最初の行(たとえば)は、各期間の全体の建設が完了したことを示します

0, 0+45 = 45, 45+135 = 180, 180+405 = 585, 585+1010 = 1595, ..., 2230+0 = 2230.

建設は2230/2 = 1115で途中で終了しました。これは、期間3の終わりに合計が585、期間4の終わりに合計が1595、および585 <= 1115 <1595だったため、期間4中に発生しました。

これは、期間のインデックスを示す[中央値]列によって報告された結果のようです(左側の1から開始)。

これを好きな言語でコーディングできます。ただし、テーブルは非常に小さい(100行)ので、Pythonなどで正式に何を行うかを確認する場合にのみ、スプレッドシートが便利です。これは次のようになります。

スプレッドシート

最初の3つのデータ行の値は同じです。次の2つのデータ行(空白行で囲まれている)は、テーブルのさらに下で選択されます。最後の5つのデータ行は、アルゴリズムを少し実行します。

(スプレッドシートの最後の2行に示されているように、中央が2つの期間のちょうど真ん中にある場合 Excelが後の期間を選択する方法に注意してください。これは必ずしも「正しい」答えではありませんが、有効な答えです。)

H:R列の数式は次のとおりです。

フォーミュラ

すべてを入力する必要はありません。必要な唯一の入力は次のとおりです。

  • =H2+A2I2で。これをO2にドラッグします。これは、累積合計を計算します。列A:Gが時系列であることが必要です。

  • =O2/2P2で。これは合計の半分を見つけます。

  • =Match(P2,H2:O2,1)Q2。これは、構築が半分完了した列にインデックスを付けます。

  • =Offset($A$1:$G$1,0 0, Q2-1, 1, 1)R2で。これにより、インデックスに対応する列見出しが取得されます。

次に0、列Hのすべてに貼り付け、I2:R2を必要な数の行までドラッグします。

これは事実上、アルゴリズムの疑似コードとして機能します。最もトリッキーな部分は、ExcelのMATCH機能を実装するための検索です。しかし、これには工夫は必要ありません。これらの配列は非常に短いため、累積合計の各配列を(推奨されるバイナリ検索アルゴリズムではなく)順次検索することは非効率的ではありません。


どうもありがとうございました!これは私が探していたものです。:)
エミリー

1

列の中央値を返したい場合は、おそらくPythonカーソルを使用して行を反復処理します。フィールドを使用してリストに入力し、作成したリストでsorted()関数を呼び出した後、中央のアイテム(7アイテムの場合は[3]でインデックス付けされます)を返します。昼食から戻ったら、少しコードを書きます。


これが必要なものであると確信するまで、コーディングを控えてください!
whuber

年か量かは辞書とリストの違いだけかと思います。
Nathanus、2011

私の質問に対するla @whuberのコメントを手作業で確認してきましたが、おそらく列は正しいですが、将来の調査地域(これらの列がない)でこれを行う方法を知っておくとよいでしょう
Emily

@Nathanusは、まったく別の計算だと思います。1つはデータを順序付けられていないカウントのセット{x1、x2、...、x7}と見なし、もう1つはそれらをシーケンスの差(0、x1、x1 + x2、x1 + x2 + x3、...、 x7)時間の経過に伴う累積分布を表します。カウントの中央値は、3つのカウントを超え、他の3つ以上の値になります。累積分布の中央値は時間であり、カウントではなく、私の返信で説明されている方法を使用して検出されます。
whuber

1
その通りです。質問では区別が明確ではありません。コメントで出てきただけです。質問に短い説明文を挿入しました。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.