【解説】データサイエンス100本ノック【問63〜65 回答】

【解説】データサイエンス100本ノック【問63〜65 回答】




当ページのリンクには広告が含まれています。



目次

この記事の対象者



・ データサイエンティストを目指している人

・ データフレームの各カラム同士の四則演算の方法を理解したい人



以降はデータサイエンス100本ノックの問題を題材にしながら学んでいきます。


データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。


>>データサイエンス100本ノックの始め方を確認する


第63問目: 引き算

P-063: 商品データフレーム(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益額を算出せよ。結果は10件表示させれば良い。

まずはdf_productの構造を確認します。

1
df_product.head(5)
出力
1
2
3
4
5
6
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost
0 P040101001 04 0401 040101 198.0 149.0
1 P040101002 04 0401 040101 218.0 164.0
2 P040101003 04 0401 040101 230.0 173.0
3 P040101004 04 0401 040101 248.0 186.0
4 P040101005 04 0401 040101 268.0 201.0

各商品の利益額は、単価から原価を引けばよいですね。

unit_profitというカラムに、利益額を算出します。

この際第53問目: データ型変換(str→int)と2値化で学んだ通り、演算する前に明示的にコピーを用いていることを宣言しないとWarningが出てしまいます。明示的にcopy()を用いてコピーであることを宣言します。

1
2
3
df_tmp = df_product.copy()
df_tmp['unit_profit'] = df_tmp['unit_price'] - df_tmp['unit_cost']
df_tmp.head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	unit_profit
0 P040101001 04 0401 040101 198.0 149.0 49.0
1 P040101002 04 0401 040101 218.0 164.0 54.0
2 P040101003 04 0401 040101 230.0 173.0 57.0
3 P040101004 04 0401 040101 248.0 186.0 62.0
4 P040101005 04 0401 040101 268.0 201.0 67.0
5 P040101006 04 0401 040101 298.0 224.0 74.0
6 P040101007 04 0401 040101 338.0 254.0 84.0
7 P040101008 04 0401 040101 420.0 315.0 105.0
8 P040101009 04 0401 040101 498.0 374.0 124.0
9 P040101010 04 0401 040101 580.0 435.0 145.0

これで完成です。

第64問目: 平均値の計算(meanの使い方)

P-064: 商品データフレーム(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益率の全体平均を算出せよ。 ただし、単価と原価にはNULLが存在することに注意せよ。

平均値は第34問目: 検索結果に対するサブクエリで学んだ通りmeanを用いることで算出できます。

利益率の計算は(単価-原価)/単価で算出することが出来ます。

まずは利益率を算出してunit_profit_rateという新たなカラムに算出しましょう。

1
2
3
df_tmp = df_product.copy()
df_tmp['unit_profit_rate'] = (df_tmp['unit_price'] - df_tmp['unit_cost'])/df_tmp['unit_price']
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	unit_profit_rate
0 P040101001 04 0401 040101 198.0 149.0 0.247475
1 P040101002 04 0401 040101 218.0 164.0 0.247706
2 P040101003 04 0401 040101 230.0 173.0 0.247826
3 P040101004 04 0401 040101 248.0 186.0 0.250000
4 P040101005 04 0401 040101 268.0 201.0 0.250000
... ... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0 0.250000
10026 P091503002 09 0915 091503 680.0 510.0 0.250000
10027 P091503003 09 0915 091503 1080.0 810.0 0.250000
10028 P091503004 09 0915 091503 1130.0 848.0 0.249558
10029 P091503005 09 0915 091503 1280.0 960.0 0.250000
10030 rows × 7 columns

その上でunit_profit_rateの平均値を算出します。

1
2
df_mean = df_tmp['unit_profit_rate'].mean()
df_mean
出力
1
0.24911389885176904

「単価と原価にはNULLが存在することに注意せよ」という部分ですが、これはNULLが一つでも含まれていた場合に平均値の算出ができなくならないようにしましょう、ということです。
NULLが含まれていてもそれを無視して平均値を算出させる場合は、mean()とするかmean(skipna=True)とすれば良いです。※meanは引数にskipnaを指定しない場合はデフォルトでTrueに設定されます。

試しに、mean(skipna=False)としてみましょう。

試しにmean(skipna
1
2
df_mean = df_tmp['unit_profit_rate'].mean(skipna=False)
df_mean
出力
1
nan

このようにデータの中にNULLが含まれているデータの平均値を取る際に、mean(skipna=False)とするとnanを返却し、平均値を計算出来ません。

NULLを無視する場合はmean()とするかmean(skipna=True)としましょう。

第65問目: 小数点の切り捨て(numpy.floorの使い方)

P-065: 商品データフレーム(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。ただし、1円未満は切り捨てること。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)にはNULLが存在することに注意せよ。

少数の切り捨てを行うには、numpy.floor関数を使用します。

小数点の切り捨ては、math.floor関数を用いても良いですが、SeriesデータにNaNが存在するとエラーになってしまいます。

本問ではnumpy.floorを用いて算出していきます。

1
2
3
df_tmp = df_product.copy()
df_tmp['new_price'] = np.floor(df_tmp['unit_cost']/0.7)
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	new_price
0 P040101001 04 0401 040101 198.0 149.0 212.0
1 P040101002 04 0401 040101 218.0 164.0 234.0
2 P040101003 04 0401 040101 230.0 173.0 247.0
3 P040101004 04 0401 040101 248.0 186.0 265.0
4 P040101005 04 0401 040101 268.0 201.0 287.0
... ... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0 300.0
10026 P091503002 09 0915 091503 680.0 510.0 728.0
10027 P091503003 09 0915 091503 1080.0 810.0 1157.0
10028 P091503004 09 0915 091503 1130.0 848.0 1211.0
10029 P091503005 09 0915 091503 1280.0 960.0 1371.0
10030 rows × 7 columns

new_profit_rateに改めて算出した利益率を代入し、10件出力することで30%付近になっていることを確認します。

1
2
df_tmp['new_profit_rate'] = (df_tmp['new_price'] - df_tmp['unit_cost'])/df_tmp['new_price']
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
14

product_cd category_major_cd category_medium_cd category_small_cd unit_price unit_cost new_price new_profit_rate
0 P040101001 04 0401 040101 198.0 149.0 212.0 0.297170
1 P040101002 04 0401 040101 218.0 164.0 234.0 0.299145
2 P040101003 04 0401 040101 230.0 173.0 247.0 0.299595
3 P040101004 04 0401 040101 248.0 186.0 265.0 0.298113
4 P040101005 04 0401 040101 268.0 201.0 287.0 0.299652
... ... ... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0 300.0 0.300000
10026 P091503002 09 0915 091503 680.0 510.0 728.0 0.299451
10027 P091503003 09 0915 091503 1080.0 810.0 1157.0 0.299914
10028 P091503004 09 0915 091503 1130.0 848.0 1211.0 0.299752
10029 P091503005 09 0915 091503 1280.0 960.0 1371.0 0.299781
10030 rows × 8 columns

new_profit_rateの結果を見ると、すべての値が30%付近に収まっていることが確認できました。

まとめ: 平均値(mean)と小数点の切り捨て方法を学びました。

本記事は、「【解説】データサイエンス100本ノック【問63〜65 回答】」というテーマでまとめました。

本記事で紹介した方法を元にデータサイエンティストとしての知見を深めていただければと思います。

なお、データサイエンティストに必要な知識は、TechAcademyのデータサイエンスコースでの学習がおすすめです。

コメント