このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-056: 顧客データ(customer.csv)の年齢(age)をもとに10歳刻みで年代を算出し、顧客ID(customer_id)、生年月日(birth_day)とともに10件表示せよ。ただし、60歳以上は全て60歳代とすること。年代を表すカテゴリ名は任意とする。
※年代を格納するフィールドはeraとする
解答ワークフローは以下のようになります。
今回は年齢を階級化する問題です。久々にシンプルな問題です。
年齢(age)を10歳刻みで年代を算出する、とのことですが、実際にこの年齢(age)というフィールドがどのような値で構成されているのか見てみたいと思います。いちばん簡単な方法は、オートフィールドツールとフィールドサマリーツールを使うことです。ワークフローとしては以下のようになります。
フィールドサマリーツール
フィールドサマリーツールは、記述統計を含むフィールドのサマリーレポートを作成するツールです。設定はシンプルで基本的には情報を得たいフィールドにチェックを入れるだけです。
フィールドサマリーツールを使うには正しいデータ型に設定されている必要があるため、オートフィールドツールと組み合わせて使うと便利です。
フィールドサマリーツールのO出力を見てみると以下のようになっています。
これによると、ageというフィールドは、最小値(Min)が11、最大値(Max)が90となっていることがわかります。ということは、0歳代と100歳代は存在しない、ということになります。また、Percent Missingも0なので空白やNullは存在しないということになります。
実際にワークフローを作る
それでは実際にワークフローを作っていきたいと思いますが、まず年齢(age)をセレクトツールを使って数値型にしていきたいと思います。ついでに不要な項目も削除してしまいましょう。
次に、フォーミュラツールを使って階級化していきます。単純にIF文で場合分けするのであれば以下のような計算式を使うことが可能です。
IF [age]<10 THEN 0
ELSEIF [age]<20 THEN 10
ELSEIF [age]<30 THEN 20
...
ELSEIF [age]<60 THEN 50
ELSE 60
ENDIF
正直めんどくさいので、もっとスマートに行いたいと思います。
例えば、11歳を10代と表現するには、10で割って小数点以下を削除して再び10をかければ良いです。計算式としては以下のようになります。
FLOOR([age]/10)*10
FLOOR関数は、小数点を削除してくれます(切り下げですね)。
ただし、今回の階級化の条件として、60歳以上はすべて60とすることになっています。これはIF文で表現したいと思います。つまり、以下のような計算式となります。
IF [age]>=60 THEN 60
ELSE
FLOOR([age]/10)*10
ENDIF
実際のフォーミュラツールの設定は以下の通りとなります。
データ型については、年代は10~60の範囲となるので、Byte型で十分です。
あとは、不要なフィールドを削除し、先頭から10レコードをサンプリングツールなどで抽出してください。
まとめ
今回は階級化する問題でした。10ごとに、といった場合には一度その間隔の数値で割り、FLOOR関数で小数点以下を削除し、再度間隔の数値でかければ簡単に階級化可能かと思います。
コメント