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

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

ファイル

はじめに

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

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

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

問85 顧客データフレーム(df_customer)の全顧客に対し、郵便番号(postal_cd)を用いて経度緯度変換用データフレーム(df_geocode)を紐付け、新たなdf_customer_1を作成せよ。ただし、複数紐づく場合は経度(longitude)、緯度(latitude)それぞれ平均を算出すること。

df_customer_1を作成するには、(df_customer)の全顧客に対し、郵便番号(postal_cd)経度緯度変換用データフレーム(df_geocode)内部結合する必要があります。

しかし、customer_idに対して複数の経度(longitude)緯度(latitude)紐づく場合、経度(longitude)緯度(latitude)のそれぞれ平均算出する必要があります。

そこで、平均を算出したデータフレームを作成します。

まず、元となるデータフレームdf_customerdf_geocode(postal_cd)内部結合したもの)を作成します。

df_tmp = pd.merge(df_customer[['customer_id','postal_cd']],df_geocode[['postal_cd','longitude','latitude']],how='inner',on='postal_cd')
#重複をみてみると
print(df_tmp[df_tmp.duplicated(subset='customer_id')])

そこで、このデータフレームのcustomer_idに対して経度(longitude)緯度(latitude)のそれぞれ平均算出します。下記コードは、重複があるものには平均の値が埋まり重複がないものにはそのままの値が埋まります(重複がないのなら、その値が平均値のため)

df_tmp = df_tmp.groupby('customer_id').agg({'longitude':'mean','latitude':'mean'}).reset_index()

できたデータフレームを最後にdf_customer_1として終了です。

しかし、問86でもこのデータフレームは使用します。特に、longitudelatitudeapplication_store_cdが必要になります。

そこで、df_customerを結合し、longitudelatitudeとそれぞれm_longitudem_latitudeとし、application_store_cdも追加しておきます。

df_customer_1 = pd.merge(df_customer,df_tmp).rename(columns={'longitude':'m_longitude', 'latitude':'m_latitude'})

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

前設問で作成した緯度経度つき顧客データフレーム(df_customer_1)に対し、申込み店舗コード(application_store_cd)をキーに店舗データフレーム(df_store)と内部結合します。

しかし、df_storeには、application_store_cdという名前のカラムがありません

そこで、merge()引数としてleft_onright_onを用いて左側と右側それぞれにおけるキーを指定して、内部結合します。

df_tmp = pd.merge(df_customer_1, df_store, how='inner', left_on='application_store_cd', right_on='store_cd')

次に、2地点間の距離を算出する関数を定義します。

上記の問題文に記述されている距離Lを導く式を使用します。

def calc_distance(x1,y1,x2,y2):
    distance =6371 * math.acos(math.sin(math.radians(y1))* math.sin(math.radians(y2))+ math.cos(math.radians(y1)) * math.cos(math.radians(y2)) * math.cos(math.radians(x1) - math.radians(x2)))
    return distance

定義した関数を用いてapply()lambda式を用いて距離計算します。

df_tmp['distance'] = df_tmp[['m_longitude','m_latitude','longitude','latitude']].apply(lambda x: calc_distance(x[0], x[1], x[2], x[3]), axis=1)

顧客ID(customer_id)、顧客住所(address)、店舗住所(address)とともに10件表示します。

df_tmp[['customer_id', 'address_x', 'address_y', 'distance']].head(10)

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

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

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

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

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