アラフォーから色々始めるリケジョの独り言

アラフォーになって色々始めてみました手探りでがんばります。

【Python】100本ノックやってます。p‐89

P-089: 売上実績がある顧客を、予測モデル構築のため学習用データとテスト用データに分割したい。それぞれ8:2の割合でランダムにデータを分割せよ。

pip install scikit-learn

して

from sklearn.model_selection import train_test_split

した上で

df_train, df_test = train_test_split(df_sales_customer, test_size=0.2)

【Python】100本ノックやってます。p‐87~p-88

P-087: 顧客データ(df_customer)では、異なる店舗での申込みなどにより同一顧客が複数登録されている。名前(customer_name)と郵便番号(postal_cd)が同じ顧客は同一顧客とみなして1顧客1レコードとなるように名寄せした名寄顧客データを作成し、顧客データの件数、名寄顧客データの件数、重複数を算出せよ。ただし、同一顧客に対しては売上金額合計が最も高いものを残し、売上金額合計が同一もしくは売上実績がない顧客については顧客ID(customer_id)の番号が小さいものを残すこととする。

 

P-088: 087で作成したデータを元に、顧客データに統合名寄IDを付与したデータを作成せよ。ただし、統合名寄IDは以下の仕様で付与するものとする。

・重複していない顧客:顧客ID(customer_id)を設定
・重複している顧客:前設問で抽出したレコードの顧客IDを設定

顧客IDのユニーク件数と、統合名寄IDのユニーク件数の差も確認すること。

 

この二つめちゃくちゃ難しかった、、、何だろうはまった、、、

 

考え方としては

ダブっている人を抜かしたリストを作る。(名寄席顧客データ)

それと元の顧客リストを名前と郵便番号で内部結合すると。

そうするとダブった人のところにも残す人のcustomer_idが入ると。

 

難しくなさそうなのになんかはまった・・・

【Python】100本ノックやってます。p‐84~p-86

P-084: 顧客データ(df_customer)の全顧客に対して全期間の売上金額に占める2019年売上金額の割合を計算し、新たなデータを作成せよ。ただし、売上実績がない場合は0として扱うこと。そして計算した割合が0超のものを抽出し、結果を10件表示せよ。また、作成したデータに欠損が存在しないことを確認せよ。

スムーズな方法になってるかはわからないけど、昨日理解したapplyを使いこなしたくて使ってみた!あまり時間かからずできた!

 

P-085: 顧客データ(df_customer)の全顧客に対し、郵便番号(postal_cd)を用いてジオコードデータ(df_geocode)を紐付け、新たな顧客データを作成せよ。ただし、1つの郵便番号(postal_cd)に複数の経度(longitude)、緯度(latitude)情報が紐づく場合は、経度(longitude)、緯度(latitude)の平均値を算出して使用すること。また、作成結果を確認するために結果を10件表示せよ。

突然簡単になってびっくりだったけど、次へのつながりがあるのか。

 

P-086: 085で作成した緯度経度つき顧客データに対し、会員申込店舗コード(application_store_cd)をキーに店舗データ(df_store)と結合せよ。そして申込み店舗の緯度(latitude)・経度情報(longitude)と顧客住所(address)の緯度・経度を用いて申込み店舗と顧客住所の距離(単位:km)を求め、顧客ID(customer_id)、顧客住所(address)、店舗住所(address)とともに表示せよ。計算式は以下の簡易式で良いものとするが、その他精度の高い方式を利用したライブラリを利用してもかまわない。結果は10件表示せよ。

math.sin、math.cos、math.acosが分かれば問題なし。

mathにはデータフレームは渡せないからapply使わないといけない。

【Python】100本ノックやってます。p‐81~p-83

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

平均出して、fillna使う。

[inplace=True]をつけないと反映されないの不思議。要注意。

 

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

中央値出してfillna使う。

 

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

小区分コードごとの中央値は出せるけど、それをNaNにどう入れれば・・・

大変だった、、、3~4時間悩んでしまった・・・

先に全部マージして、NaNのところに入れるということが思いつかず。

いまいちapplyの使い方がつかみ切れてなくて。

xをなんとするかが難しかった・・・

【Python】100本ノックやってます。p‐81~p-83

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

平均出して、fillna使う。

[inplace=True]をつけないと反映されないの不思議。要注意。

 

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

中央値出してfillna使う。

 

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

小区分コードごとの中央値は出せるけど、それをNaNにどう入れれば・・・

大変だった、、、3~4時間悩んでしまった・・・

先に全部マージして、NaNのところに入れるということが思いつかず。

いまいちapplyの使い方がつかみ切れてなくて。

xをなんとするかが難しかった・・・

【Python】100本ノックやってます。p‐75~p-80

P-075: 顧客データ(df_customer)からランダムに1%のデータを抽出し、先頭から10件表示せよ。

これはfracで問題なく。

smart-hint.com

P-076: 顧客データ(df_customer)から性別コード(gender_cd)の割合に基づきランダムに10%のデータを層化抽出し、性別コードごとに件数を集計せよ。

素直にgroupbyしてそれぞれの人数出して、10%の人数出したんだけど、解答例はまた知らないのでてきた。

# sklearn.model_selection.train_test_splitを使用した例」

 

P-077: レシート明細データ(df_receipt)の売上金額を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。なお、外れ値は売上金額合計を対数化したうえで平均と標準偏差を計算し、その平均から3σを超えて離れたものとする(自然対数と常用対数のどちらでも可)。結果は10件表示せよ。

happy-analysis.com

外れ値って何ぞやがわからないことが問題、コード組むこと自体は問題なし。

P-078: レシート明細データ(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第1四分位と第3四分位の差であるIQRを用いて、「第1四分位数-1.5×IQR」を下回るもの、または「第3四分位数+1.5×IQR」を超えるものとする。結果は10件表示せよ。

 

qiita.com

P-079: 商品データ(df_product)の各項目に対し、欠損数を確認せよ。

df_product.isnull().sum()

 

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

.dropna()

でNaNが削除できる!

【Python】100本ノックやってます。p‐66~p-69

P-066: 商品データ(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。今回は、1円未満を丸めること(四捨五入または偶数への丸めで良い)。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)には欠損が生じていることに注意せよ。

偶数への丸めはround()。

単品だったらmath、複数だったらnumpyを使う。

私lambda使っちゃったけど、解答の方が楽。わざわざ使う必要なかったな。

 

P-067: 商品データ(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。今回は、1円未満を切り上げること。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)には欠損が生じていることに注意せよ。

切り上げはceil()

 

P-068: 商品データ(df_product)の各商品について、消費税率10%の税込み金額を求めよ。1円未満の端数は切り捨てとし、結果を10件表示せよ。ただし、単価(unit_price)には欠損が生じていることに注意せよ。

切り捨てはfloor()

 

P-069: レシート明細データ(df_receipt)と商品データ(df_product)を結合し、顧客毎に全商品の売上金額合計と、カテゴリ大区分コード(category_major_cd)が"07"(瓶詰缶詰)の売上金額合計を計算の上、両者の比率を求めよ。抽出対象はカテゴリ大区分コード"07"(瓶詰缶詰)の売上実績がある顧客のみとし、結果を10件表示せよ。

道筋を立てるのに四苦八苦・・・

 

まず2つをマージしてから色々いじろうかと思ってたんだけど、なんかうまくいかなくて、、、

なので一回頭をリセットして「①全顧客ごとの売上金額合計リスト」を作って。

そのあと別に「カテゴリ7を含むproduct_cdのリスト」をレシートデータにぶつけて「カテゴリ7を買った顧客リスト」を作って。

その「カテゴリ7を買った顧客リスト」の「②顧客ごとのカテゴリ7売上金額合計リスト」を作って。

 

②←①を左結合。(③)

 

③の2つの売上金額の割合を計算。

 

とても泥臭い・・・

でも解答例1と似てるかな?

私1行にできてないから泥臭く見えるけど、考え方は同じっぽい。

商品データのカテゴリ7の絞り込みをマージの時に一緒にやってるんだな。

df_product.query('category_major_cd == "07"')

でもaggって今までずっと使ってなかったから見といたほうがよさそう。(今回は別にsumでいける)

vector-ium.com

 

有休的には余裕があるけど、5/1-2は働きます。

再来週推し事で平日に休みまくるから・・・

でも周りが休みなのでやることなさそうなので、引き続き100本ノックできるかな。

寝なければ。。。