D を計算する関数を作成する
Index of Dissimilarity(隔離指数、D)を計算するには複数の手順が必要で、再利用性も高いです。この演習では、前の演習で使用した関数 dissimilarity を作成します。関数の入力は、小地域(たとえば tract)の DataFrame と、3 つの列名です。すなわち、グループ A とグループ B の人口数が入った 2 つの列、および包含する地理(州や大都市圏など)の名称または識別子が入った列です。
補足として、Index of Dissimilarity の式は次のとおりです。
$$D = \frac{1}{2}\sum{\left\lvert \frac{a}{A} - \frac{b}{B} \right\rvert}$$
pandas は通常のエイリアスでインポート済みです。以下のコードでは、groupby と merge はすでに用意されています。
この演習はコースの一部です
Pythonで学ぶ米国センサスデータ分析
演習の手順
- 絶対値記号内の式を、上記の数式に基づいて計算します。\(A\) と \(B\) に対応する列名は、引数
col_Aとcol_Bに接尾辞"_sum"を付けて作成されます。 - 単一列に対する
sumメソッドは Series を返します。to_frame()メソッドで Series を DataFrame に変換してください。 - 新しい関数を
tractsでテストします。MSA 名ごとに White-Black の dissimilarity を計算してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
def dissimilarity(df, col_A, col_B, group_by):
# Sum Group A and Group B by grouping column
grouped_sums = df.groupby(group_by)[[col_A, col_B]].sum()
tmp = pd.merge(df, grouped_sums, left_on = group_by,
right_index = True, suffixes = ("", "_sum"))
# Calculate inner expression
tmp["D"] = abs(____)
# Calculate Index of Dissimilarity and convert to DataFrame
return 0.5 * tmp.groupby(group_by)["D"].sum().____
msa_D = dissimilarity(msa_tracts, ____, ____, "msa_name")
print(msa_D.head())