2025年12月20日

行をシマシマにする。グループごとにシマシマにする。” についての 6 の意見

  1. こんばんは。
    リンク先
    https://kokodane.com/2013_waza_064.htm

    https://bellcurve.jp/statistics/blog/15370.html
    で countif() の逆数を取ってる理由は、品名の初回の出現を数えるためではなさそうです。
    式でやっていることは、
    その行より上の範囲で、各品名が何回出てきているかを countif(範囲,範囲) で数え、
    得た重複度の逆数 1/countif(範囲,範囲) を重みとして
     (=範囲内に n 回出現する品名は、1回の出現が 1/n 回相当と見なして)、
    sum() (または sumproduct() ) で品名を数え上げることで、
    その行より上の範囲におけるユニークな品名数を求めているように見えます。
    sum() を使う場合は countif() の第二引数の配列数式とする必要があるみたいです。
    sumproduct() を使うとそれは不要らしい。(ここがよくわかってない)
    ちなみに、https://kokodane.com/2013_waza_064.htm では
    sumproduct() の結果を int() してますが、その理由はおそらく、
    逆数を求めて sumproduct する計算が浮動小数点で行われるため計算結果を整数に
    変換したかったからではないかと。

  2. と思ったら、int() は端数切り捨てだった。なんで最も近い整数に丸めなかったんだろう

  3. ありがとうございます。落ち着いたらもうひと記事書きます(><)
    うーん。nを連番整数として1/nを合計すると1~2の間に収まるって事かなぁって思ってたんだけど、「1/でてくる回数」だから、合計すると1になるって感じの考え方なんですね。ROUNDだと引数増えるからINTなのかなぁ?
    で、その結果の合計にSUMPRODUCT使ってる、と。
    あ゛~配列数列よくわかってないんすよねぇ・・・。
    しっかし、はてなブログのコメント欄使いにくいなぁぁぁぁwwww 表示されないこと多いしwww 酷いwww

  4. > nを連番整数として1/nを合計すると
    うーん。
    1 + 1/2 = 1.5
    1 + 1/2 + 1/3 = 11/6 = 1.83…
    1 + 1/2 + 1/3 + 1/4 = 25/25 = 2.083…
    1 + 1/2 + 1/3 + 1/4 + … → ∞
    なので、
    (a) n 個を全部 1/n の重みで数える
    (b) n 個のうち初出のみ数えて2回目以降の出現は無視する
    のどちらかのアプローチがいいのでは。
    (a) はリンク先の人たちの発想だし、
    (b) は elve さんが sumproduct(int(1/countif()) でやっていることですよね。

  5. ほんとだ米欄すげー使いにくいww修正も削除して再投稿もできない?こんなんだったっけ

narwhal へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA