Exploratory コミュニティ

締日ごとの売上金額列を作りたいです

#1

締日が、5日、10日、15日、25日、末日、とあった場合、それぞれ売上金額をデータラングリングで作ることは可能でしょうか?

#2

@11124 さん

計算元となるデータの状態がわからないので、お役に立たないかもしれませんが、下記はどうでしょうか。

  1. 適当に日毎のデータが1年分あると仮定しています。

pre

  1. 5日、10日、15日、25日、末日のフラグを下記のように生成します

フラグ計算元はフラグを作成する過程を理解しやすいように表示しているだけで、本来は不要です。
フラグ計算元の通り、日を取り出して5で割って、切り上げて、5を掛けると5の倍数が生成できますので、
それをもとに、月によって変動する「月末」だけを別に処理して、フラグを作成しています。月末のグループ、つまり26日以降はフラグ計算元の値は30以上になるため。

  mutate(
    `フラグ計算元` = (ceiling(day(date)/5)*5),
    flg_closing_date = if_else(
      (ceiling(day(date)/5)*5) >= 30, 
      str_c(year(date), "-", str_pad(month(date), width = 2, side = "left", pad = 0), "-", "EOM"), 
      str_c(year(date), "-", str_pad(month(date), width = 2, side = "left", pad = 0), "-", 
            str_pad(as.character(ceiling(day(date)/5)*5), width = 2, side = "left", pad = 0))
      ))

post

※ちょっと汚くて申し訳ないですが、このやり方以外でも、「月末は次の月の1日から1日を引けば、先月の月末の日が計算できる」ので、そのように考えて処理用のスクリプトを作るのも良いかもしれません。もしくはデータが少ないのであれば、「締日マスタ」を用意してJoinすることでデータを付与するでもよいかもしれません

  1. このフラグをもとにグループ化して合算

04

#3

sugiaki
ご回答ありがとうございます。
普段プログラミングをやらない私にはとても難しいコードだと感じました。

実は、私の説明が悪過ぎてうまく質問出来ませんでした。
C:\Users\yoshi\Desktop\20201216-2221.csv
ファイルを添付します。
これは得意先毎の売上金額データになります。
得意先毎に締日が違い、それに応じた1ヶ月毎の売上合計を
求めたいです。

宜しくお願いいたします。

#4

image
先の投稿でcsvファイルを添付しようとしましたが、失敗しました。
画像を添付します。
このようなイメージです。
宜しくお願いいたします。

#5

@11124 さん

なるほどです。頂いたデータからデータの中身を下記の通り、簡単にした例で説明します。誤っていれば指摘ください〜!すでにご存知の点もあるかと思いますが、その点はスルーしてください。

日付:2020年10月1日から2020年10月3日まで
得意コード:1,2,3,4,5の5つのみ
締日:「得意コード1は31日」「2は20日」「3は10日」「4は5日」「5は15日」とします
金額:万単位とします

要件:得意先毎に締日が違い、それに応じた1ヶ月毎の売上合計を計算するとありますので、まずは合計を計算させる前に、「得意先ごと」という要件をExploratoryに認識させる必要があります。
それは、下記の画像の「グループ化」から実行できます。

57
45
10

グループ化を行うことで、どこのグループごとに合計を計算させるのか、合計の計算範囲が色で分けられます。この例であれば、「得意コード=1の2020年10月1日から2020年10月3日まで」が、次に実行するグループごとの合計の範囲となります。Exploratoryに「得意先ごと」が認識できているので、「集計(summarise)」を実行します。

21
test_-_R_Script_Data_3
48

これで、「得意先ごとに合計金額を計算する」ことができます。

この次にやるべきことは、これに加えて「1ヶ月ごとの」という要件を満たす作業が必要です。ということなので、さきほどに加え、「得意先ごと」「1ヶ月ごと」という要件をExploratoryに認識させる必要があります。データを見る限り、1ヶ月ごとを認識させるためのカラムがないので、それを作る必要があります。10月だけだとわかりにくいので、データを1ヶ月分増やします。

28

「1ヶ月ごと」を認識させるためのカラムを作ります。

42
49
34

「1ヶ月ごと」を認識させるための日付_monthというカラムが出来ていますので、これを使って、最初に行ったグループ化を行います。

test_-_R_Script_Data_3

Exploratoryに「得意先ごと」「1ヶ月ごと」が認識できているので、「集計(summarise)」を実行します。

03

これで、要件である得意先毎に締日が違い、それに応じた1ヶ月毎の売上合計を計算するというのが出来ているかと思います。

補足ですが…これは実際のデータをみない限りわかりませんが、1つの得意先が複数の締日をもつ場合もあるかもしれません(こんな例あるのかわかりませんが…)。このような場合も、これまでと同じ手順で、「得意先ごと」「1ヶ月ごと」「締日ごと」でグループ化して、「集計(summarise)」を実行すれば、「得意先ごと、締日ごと、1ヶ月ごとの合計金額」が計算できます!イメージ画像をアップしておきます。「得意コード4の締日は5日」のはずが、先方都合で10月の「5日」でしめて、「30日」でも締めて、11月は「5日」で・・・みたいな感じです。

06

お役に立てば幸いです。

1 Like
#6

image
sugiaki様
何度もご回答ありがとうございます。
画像のような状態であった場合、2020-03-25と2020-04-10は
同じグループになると嬉しいです。

#7

@11124 さん

そのような場合、このグループ集計を実行している状態からさらに、データの加工を進める必要があります。例えば、2020-03-252020-04-10をグループ化の単位(=Exploratoryに認識させるため)にできるように新たなカラムが必要です。

例えば、右側のステップの「計算を作成(mutate)」から下記のような計算式を作ることで、日付をまとめるフラグを作れます。

# "2020-01-01" と "2020-01-02"には1というフラグがたつカラム
if_else(date == "2020-01-01" | date == "2020-01-02", 1, 0)

14

このようにフラグを作れば、Exploratoryに「これをグループ」にしたいと認識させることが出来ますので、そこからさらに集計します。

ただ、ここで検討しなければいけないのが、他の得意コードでも、1のフラグが立ちますので、得意コード=00011以外でも、このようなルールで、日付をまとめて合計してよいか、考える必要がでてきます。

# "2020-01-01" と "2020-01-02"には1というフラグがたつカラム
if_else(date == "2020-01-01" | date == "2020-01-02", 1, 0)

これが**得意コード=00011だけに**適用したいのであれば、下記のようにフラグを作り変える必要があります。

if_else(`得意コード` == "00011" & (date == "2020-01-01" | date == "2020-01-02"), 1, 0)

というような感じで、要件が増えるのであれば、その要件を満たすためのルールを考えて、データを加工するということを続けていく必要があります!

よろしくおねがいします!

1 Like
#8

sugiaki様
ご回答を参考にさせて頂きます。
大変助かりました。
ありがとうございました。

1 Like