
- はじめに
- 問85 顧客データフレーム(df_customer)の全顧客に対し、郵便番号(postal_cd)を用いて経度緯度変換用データフレーム(df_geocode)を紐付け、新たなdf_customer_1を作成せよ。ただし、複数紐づく場合は経度(longitude)、緯度(latitude)それぞれ平均を算出すること。
- 問86 前設問で作成した緯度経度つき顧客データフレーム(df_customer_1)に対し、申込み店舗コード(application_store_cd)をキーに店舗データフレーム(df_store)と結合せよ。そして申込み店舗の緯度(latitude)・経度情報(longitude)と顧客の緯度・経度を用いて距離(km)を求め、顧客ID(customer_id)、顧客住所(address)、店舗住所(address)とともに表示せよ。計算式は簡易式で良いものとするが、その他精度の高い方式を利用したライブラリを利用してもかまわない。結果は10件表示すれば良い。
- Pythonのコードやライブラリーについて知りたい場合
- 独学でデータ分析をしている方へ
はじめに
問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_customerとdf_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でもこのデータフレームは使用します。特に、longitudeとlatitudeとapplication_store_cdが必要になります。
そこで、df_customerを結合し、longitudeとlatitudeとそれぞれm_longitude、m_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_onとright_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のコードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。
データ分析入門・データサイエンス初心者・初学者向けにデータ分析でよく使うPythonをまとめました。
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
>>【データ分析初心者】Python構文~for文、range関数、zip関数、enumerate関数~
>>【データ分析初心者】Python構文~無名関数lambda式、内包表記、map関数~
>>【データ分析初心者】Pandas~loc[]、iloc[]、スライス、drop()、isin()~
>>【データ分析初心者】Matplotlib、Seabornーscatter、hist、countplot 、barplot
独学でデータ分析をしている方へ
機械学習やデータサイエンス・データ分析を独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。
