パラメータ等を使った、動向分析について教えてください。

株主の動向分析をしたいと思ってます。
データは半期(4月と10月)ごとの時点データです。<-確定基準年月日
例えば、
2023年4月時点で100株購入した株主が何人いるか?前回確定基準年月日が空欄の株主、
その後
2023年10月に
・100株を保有し続けてる株主が何人いるか?
・100株すべてを売却した株主が何人いるか?
・100株から増やした株主が何人いるか?
・100株から減らした株主が何人いるか?
同じように
2024年4月、2024年10月・・・と指定した期間で動向推移を見たい。
また、購入株数(100、200、1000など)も指定した株数で動向推移を見れるようにしたい。これはリストで固定で選択できれば良いです。
どのように設定すると実現できるか教えてほしい。

日付は年月日で持っています。20230331、20230930・・・
株数は1株単位のため、1~99株を100以下、100~199株を100株

検索開始日付~検索終了日付 ← 確定基準年月日を使用してリスト選択したい。
基準株数(100、200、300・・・30,000など)

データを展開できないため、文字だけの説明になりますが、よろしくお願いします。

以下のようなダミーデータを作り試してみました。

データ

shareholder_id,record_date,shares
S0001,20230331,100
S0001,20230930,100
S0001,20240331,100
S0001,20240930,100
S0001,20250331,100
S0001,20250930,100
S0002,20230331,100
S0002,20230930,0
S0002,20240331,0
S0002,20240930,0
S0002,20250331,0
S0002,20250930,0
S0003,20230331,100
S0003,20230930,200
S0003,20240331,200
S0003,20240930,300
S0003,20250331,300
S0003,20250930,300
S0004,20230331,200
S0004,20230930,100
S0004,20240331,100
S0004,20240930,100
S0004,20250331,100
S0004,20250930,100

作成手順

  1. データセット作成
    ファイルをアップロードし、record_dateを日付型に変換します

  2. 計算式を3つ作成
    名前:prev_shares

lag(
  sum({shares}),
  [{record_date} ASC],
  1,
  [{shareholder_id}]
)

名前:movement

ifelse(
  {prev_shares} = 0 AND sum({shares}) > 0, '新規購入',
  {prev_shares} > 0 AND sum({shares}) = 0, '全売却',
  sum({shares}) = {prev_shares},           '維持',
  sum({shares}) >  {prev_shares},          '増加',
  sum({shares}) <  {prev_shares},          '減少',
  '不明'
)

名前:prev_bucket

ifelse(
  {prev_shares} = 0,                          '0(前回なし)',
  {prev_shares} >= 1   AND {prev_shares} < 100,  '100以下',
  {prev_shares} >= 100 AND {prev_shares} < 200,  '100',
  {prev_shares} >= 200 AND {prev_shares} < 300,  '200',
  {prev_shares} >= 300 AND {prev_shares} < 400,  '300',
  {prev_shares} >= 500 AND {prev_shares} < 600,  '500',
  {prev_shares} >= 1000 AND {prev_shares} < 1100,'1000',
  {prev_shares} >= 30000 AND {prev_shares} < 30100,'30000',
  'その他'
)
  1. ピポットテーブルで可視化

この方式の注意点は以下のとおりです。

  • 全売却した株主は行自体が存在しないので「全売却」をカウントできないため、保有株0のレコードを作成する必要があります

ありがとうございます。
ピボットテーブルを作成する際に期間を任意に設定して、表示させることは可能ですか?
作成した頂いたダミーデータを参考にさせていただくと
20230331~20250331や20230331~20240930、20230930~20250930など
ユーザーで指定した期間での推移を表示させたい。
また、基準となる枚数を100や200・・・などこちらもユーザーがリストから任意で指定して、
表示をさせたい。

私の説明がヘタなため、お手間をかけてしましますが、よろしくお願いします。

日付の範囲指定は、フィルターにて実現可能です。

基準値を変更するのは、データそのものを更新することになるので、Quick Sightの中で行うことはできません。指定した基準値でデータセットを更新する仕組みを別途作成する必要があります。

ymatz様

ご連絡ありがとうございます。

基準値について、データを更新することは必要としておりません。データとの比較としてリストから選択できればと考えておりますが、その場合でも別途の仕組みを作成する必要がありますでしょうか?日付と同じようにパラメータとフィルターの組み合わせで実現させることは難しいでしょうか?

すいません、ご希望のフィルターがイメージできていません。
先に示した例では、2023/04/01 - 2024/10/31でフィルタしていますが、この状態で基準値というは、どこの値を指しているのでしょうか?
例えば、S0001の場合、2023/09/30 の shares = 100 が基準値でしょうか?
それとも、2023/09/30のprev_shares(フィルタされる範囲より前の値)が基準値でしょうか?

説明が不明瞭で申し訳ございません。
検索期間が2023/03/31~2024/09/30の場合、2023/03/31の時に100株購入した人数が
2023/09/30の時、人数がどのように変化しているか?
2024/03/31の時に2023/03/31と比べて人数がどのように変化しているか?
を指定した検索期間で表示させたいと思ってます。

イメージはこんな感じです

検索期間 2023.09 2025.09
100 株購入
2023.09 2024.03 2024.09 2025.03 2025.09 <-検索期間によって変動
維持(人数) 200 150 120 100 90
売却(人数) ↑基準 30 55 75 100
株数増(人数) 20 25 20 10
株数減(人数) 0 0 5 0
200 200 200 200 200

返事が遅れてすいません。方式を変えてみました。以下を新たに試してみてください。

1. パラーメータを3つ作成

Column 1 Column 2 Column 3 Column 4
名前 デフォルト スタイル
baseDate 日付 2023/03/31 日付選択ツール
endDate 日付 2025/09/30 日付選択ツール
baseBucket Integer 100 ドロップダウン(100,200,300,…)

2. 計算フィールドを5つ作成

(1) 基準日のときだけ shares、それ以外 null
shares_at_base

ifelse(
    {record_date} = ${baseDate},
    {shares},
    null
)

(2) 株主単位で先頭値を行に伝播(=基準日の保有数を全行に持たせる)
base_shares

maxOver({shares_at_base}, [{shareholder_id}], PRE_AGG)

(3) バケット(100株単位、1〜99株は 0)
base_bucket

ifelse(
    isNull({base_shares}), null,
    {base_shares} = 0,     null,
    {base_shares} < 100,   0,
    floor({base_shares} / 100) * 100
)

(4) ステータス
status

ifelse(
    {shares} = 0,              '売却',
    {shares} = {base_shares},  '維持',
    {shares} > {base_shares},  '株数増',
                               '株数減'
)

(5) 並び順用(行に入れて非表示にする)
status_order

ifelse({status}='維持',1, {status}='売却',2, {status}='株数増',3, 4)

3. フィルタを3つ作成
(1) record_date

フィルタータイプ:日付と時刻の範囲
条件:次の間、パラメータを使用
開始日のパラメータ:baseDate、開始日を含める
終了日のパラメータ:endDate、終了日を含める

(2) base_stars

フィルター条件:次より大きい
最小値:0

(3) base_bucket

フィルター条件:次と等しい、パラメータを使用
パラメータ:baseBucket
  1. ピポットテーブル作成
Column 1 Column 2 Column 3
ペイン フィールド 補足
status_order 「フィールドを非表示」にする
status
record_date 昇順ソート
shareholder_id (個別の値をカウント)
タイトル 動向分析
サブタイトル 検索期間:${baseDate}〜${endDate} ${baseBucket}株購入

長くなりました、、、ご参考になれば幸いです。

@kazuhiko_kaneda
本件、いかがでしょうか?
もし @ymatz さんの回答で解決しているようでしたら、返答の下にあるチェックボックスをクリックし、Solution 選択をお願いいたします。