【問79~問83】データサイエンス100本ノック 解説

※アフィリエイト広告を利用しています。

ファイル
  1. はじめに
  2. 問79 商品データフレーム(df_product)の各項目に対し、欠損数を確認せよ。
  3. 問80 商品データフレーム(df_product)のいずれかの項目に欠損が発生しているレコードを全て削除した新たなdf_product_1を作成せよ。なお、削除前後の件数を表示させ、前設問で確認した件数だけ減少していることも確認すること。
  4. 問81 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの平均値で補完した新たなdf_product_2を作成せよ。なお、平均値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
  5. 問82 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの中央値で補完した新たなdf_product_3を作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
  6. 問83 単価(unit_price)と原価(unit_cost)の欠損値について、各商品の小区分(category_small_cd)ごとに算出した中央値で補完した新たなdf_product_4を作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
  7. Pythonのコードやライブラリーについて知りたい場合
  8. 独学でデータ分析をしている方へ

はじめに

問79~問83のコードの説明を初心者や初学者でもわかるような方法でまとめました。

データサイエンス100本ノックのはじめ方は、以下のブログ記事を参考にしてください。

>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会

問79 商品データフレーム(df_product)の各項目に対し、欠損数を確認せよ。

欠損値を確認するには、isnull()を使います。

本問は、(df_product)の各項目に対し、欠損数を確認しないといけないので、各カラムに対して、合計を出すsum()を使用します。

df_product.isnull().sum()

問80 商品データフレーム(df_product)のいずれかの項目に欠損が発生しているレコードを全て削除した新たなdf_product_1を作成せよ。なお、削除前後の件数を表示させ、前設問で確認した件数だけ減少していることも確認すること。

削除前の件数を表示させます。

df_product_1 = df_product.copy()
print('削除前:',len(df_product_1))

次に、いずれかの項目に欠損が発生しているレコードを全て削除した新たなdf_product_1を作成し、削除後の件数を表示させます。

欠損値を含む列、または行を削除するdropna()を使用します。

inplace=Trueにしないと、元のデータに変更が反映されません。

df_product_1.dropna(inplace=True)
print('削除後:',len(df_product_1))

前設問で確認した件数だけ減少していることも確認する必要があります。

df_product_1.isnull().sum()

問81 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの平均値で補完した新たなdf_product_2を作成せよ。なお、平均値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。

欠損値NaNデータを保管するにはfillna()を使用します。

fillna()辞書を用いると、列ごとに異なる値を代入できる。

例えば、{key: value}を{’カラム名’: 置き換えたい値}とする。指定されていない列は欠損値NaNのまま。列名と一致しないkeyは無視される。

四捨五入をするnp.round()欠損値が含まれている状態で平均値を求めるnp.nanmean()を使用します。

df_product_2 = df_product.fillna({'unit_price':np.round(np.nanmean(df_product['unit_price'])),                         'unit_cost':np.round(np.nanmean(df_product['unit_cost']))})

補完後、各項目について欠損が生じていないことも確認します。

df_product_2.isnull().sum()

問82 単価(unit_price)と原価(unit_cost)の欠損値について、それぞれの中央値で補完した新たなdf_product_3を作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。

基本的には問81と同じ処理で、違うのは、それぞれの中央値で補完する点です。

欠損値が含まれている状態で平均値を求めるnp.nanmedian()を使用します。

df_product_3 = df_product.fillna({'unit_price':np.round(np.nanmedian(df_product['unit_price'])),
'unit_cost':np.round(np.nanmedian(df_product['unit_cost']))})
df_product_3.isnull().sum()

問83 単価(unit_price)と原価(unit_cost)の欠損値について、各商品の小区分(category_small_cd)ごとに算出した中央値で補完した新たなdf_product_4を作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。

基本的には問81と同じ処理で、違うのは、各商品の小区分(category_small_cdごとに算出した中央値で補完する点です。

まず、各商品の小区分(category_small_cd)ごとにunit_priceunit_cost中央値を算出します

df_tmp = df_product.groupby('category_small_cd').agg({'unit_price':'median','unit_cost':'median'}).reset_index()

カラム名を’category_small_cd‘,’median_price‘,’median_cost‘に変更します。

df_tmp.columns = ['category_small_cd','median_price','median_cost']

各商品の小区分(category_small_cd)ごとに算出した中央値をいれたdf_product_4を作成します。

df_product_4 = pd.merge(df_product,df_tmp,how='inner',on='category_small_cd')

欠損値に対して各商品の小区分ごとに算出した中央値で補完をします。

unit_priceunit_costNaNの場合には上記中央値を代入し、それ以外のデータはそのままにする処理を行います。

これをlamda式で書くと以下のようになります。

lambda x:np.round(x[1]) if np.isnan(x[0]) else x[0],axis=1

x[0]つまりunit_price欠損値があった場合(isnan(x[0]))は、x[1]つまりmedian_priceを適用し、そうでない場合は、そのままにする。そして、,axis=1にすることで行方向への処理を行う。これをunit_costについても書きます。

df_product_4['unit_price'] = df_product_4[['unit_price','median_price']].apply(lambda x:np.round(x[1]) 
if np.isnan(x[0]) else x[0],axis=1)
df_product_4['unit_cost'] = df_product_4[['unit_cost','median_price']].apply(lambda x:np.round(x[1]) 
if np.isnan(x[0]) else x[0],axis=1)

補完実施後、各項目について欠損が生じていないことも確認します。

df_product_4.isnull().sum()

Pythonのコードやライブラリーについて知りたい場合

Pythonデータ分析よく使われている言語です。

この機会にPythonコードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。

独学でデータ分析をしている方へ

機械学習データサイエンスデータ分析独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。