Impact on Housing and Community#

This notebook shows an analysis of the impact of the war on Gaza for housing and communities. This is done using the following indicators as of April 15th, 2024

  • Percentage of Residential Buildings Damaged

  • Percentage of Places of Worship Damaged

  • Percentage of People in Neighbourhoods with Damaged Buildings

  • Percentage of Places of Education Damaged

  • Places of Public Amenities Damaged

  • Percentage of Homes without (observed) Nighttime Lights

Overall Impact on Housing and Community#

  % Residential Buildings Damaged % Population in Neighborhoods with Damaged Buildings % Places of Worship Damaged % Places of Education Damaged % Public Amenities Damaged
Governorate          
North Gaza 36% 47% 72% 82% 82%
Gaza 65% 87% 84% 79% 79%
Deir Al-Balah 39% 33% 65% 78% 78%
Khan Younis 47% 58% 62% 77% 77%
Rafah 15% 15% 40% 79% 79%

Observations#

  • The Governorate of Gaza took the greatest impact in almost every indicator being measured. The biggest being the number of people potentially impacted (~720k).

  • The Governorate of North Gaza took impact on Points of Interest. However, this could also be because of the low number of reported buildings in the OpenStreetMap database.

  • Khan Younis, a southern Governorate, has more than half its population living in neighborhoods with damaged buildings and without observed nighttime lights.

Hide code cell source
summary_stats[
    [
        "Number of Residential Buildings Damaged",
        "People in Neighborhoods with Damaged Buildings",
        "Number of Places of Worship Damaged",
        "Number of Places of Education Damaged",
        "Number of Public Amenities Damaged",
    ]
].style.background_gradient(cmap="viridis", axis=0).format("{:.0f}")
  Number of Residential Buildings Damaged People in Neighborhoods with Damaged Buildings Number of Places of Worship Damaged Number of Places of Education Damaged Number of Public Amenities Damaged
Governorate          
North Gaza 178 248145 18 46 46
Gaza 394 758658 49 80 80
Deir Al-Balah 282 121525 13 14 14
Khan Younis 484 275585 21 24 24
Rafah 22 41877 8 27 27

Percentage of Residential Buildings Damaged#

../../_images/8ff6666d863b7f908d2a7469835fe275b8b1f899bb8268ab84dfe5774b2c8ef3.svg

Observations and Limitations#

  • More than 60% of residential buildings in Gaza, the second province from north, can be considered damaged. However, in absolute numbers, Khan Younis has the most number of damaged residential buildings.

  • Residential buildings reported here include all th buildings atagged as ‘residential’, ‘apartments’ and ‘houses’.

  • In the OpenStreetMap database, Deir Al-Balah has 717 reported residential buildings. Khan Younis has 1027, Gaza has 606, North Gaza has 491 and Rafah has 150 reported residential buildings.

  • Khan Younis was declared an evacuation zone by the Israeli Armed Forces which could be a potential rason for the high number of damaged buildings.

Percentage of Places of Worship Damaged#

Hide code cell source
fig, ax = plt.subplots(figsize=(14, 6))
plt.suptitle(
    "Gaza: Percentage of Places of Worship Damaged as of April 15th 2024",
    y=0.99,
    fontsize=20,
    x=0.49,
)

absolute_damage_numbers = list(
    places_of_worship.pivot_table(
        "damaged", "ADM2_EN", "type", observed=False
    ).sort_values(by="ADM2_EN", ascending=False)["places_of_worship"]
)


ax = (
    places_of_worship.pivot_table("perc", "ADM2_EN", "type", observed=False)[
        ["places_of_worship"]
    ]
    .sort_values(by="ADM2_EN", ascending=False)
    .plot(ax=ax, kind="barh", legend=False)
)

# Add labels and customization
ax.set_xlabel("% Places of Worship Damaged", fontsize=12)

ax.set_ylabel("Governorate", fontsize=16)
# ax.set_yticklabels(df["ADM2_EN"].unique(), fontsize=12)

ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position("left")
ax.xaxis.set_ticks_position("bottom")
ax.xaxis.set_major_formatter(FuncFormatter(lambda y, _: "{:.0f}%".format(y)))

ax.grid(axis="x", linestyle="--", linewidth=0.25, color="gray", alpha=0.5)
# ax.legend()

ax.set_title(
    "Estimated percentage (and absolute number) of places of worship damaged in each Governorate",
    fontsize=14,
    loc="left",
)
ax.text(
    0,
    -0.23,
    "On X: Percentage of places of worship damaged. Inside Bar: Absolute number of places of worship damaged On Y: Governorate from North to South. \nPlaces of worship include all points tagged as 'mosque', 'church' and 'religious'. 99% of the dataset is of mosques alone.\nSource: World Bank calculations derived from OpenStreetMap and Sentinel-1 data.",
    ha="left",
    va="center",
    transform=ax.transAxes,
    fontsize=10,
    color="black",
    weight="normal",
)

for id, bar in enumerate(ax.patches):
    width = bar.get_width()  # Use width since the bars are horizontal
    ax.annotate(
        f"{int(np.round(absolute_damage_numbers[id],0))}",
        xy=(width, bar.get_y() + bar.get_height() / 2),
        xytext=(-20, 0),  # Shift the text to the left of the bar's end
        textcoords="offset points",
        color="white",
        ha="right",
        va="center",
    )
../../_images/4e820d2054a9f957a66d681ed7da79cc1f6af4860b07b15aebf657358aaac375.svg

Observations and Limitations#

  • Gaza had the biggest hit on places of worship both in terms of percentage and abolute numbers.

  • There are a total of 58 reported places of worship in Gaza, North Gaza has 25, Deir Al-Balah has 20, Khan Younis has 34 and Rafah has 20.

  • There are no reported synagogues.

Percentage of People Living in Neighborhoods with Damaged Buildings#

../../_images/fd1a5904985e31c52885dde228b43c4c47e84e25bffbc09d5c30accaa6bb5947.svg

Observations#

  • Both North Gaza (523k) and Gaza (869k) have higher population than Khan Younis (476k). This is a potential reason for why the damage is higher in Khan Younis but the people impacted are greater in the other two administrative regions.

  • The population numbers are derived from WorldPop which uses machine learning code to distribute population density top-down. This means that sometimes, in areas where there are fewer people, the number reported in WorldPop could be higher and vice versa. Therefore, the numbers reported here are the best approximation we can make with the data available.

Percentage of Schools and Public Amenities Damaged#

Hide code cell source
fig, ax = plt.subplots(figsize=(12, 6), dpi=300)
plt.suptitle(
    "Gaza: Percentage of Places of Education Damaged as of April 15th 2024",
    y=0.99,
    fontsize=20,
    x=0.56,
)

absolute_damage_numbers = list(
    df.pivot_table("damaged", "ADM2_EN", "type", observed=False).sort_values(
        by="ADM2_EN", ascending=False
    )["Education"]
)


ax = (
    df.pivot_table("perc", "ADM2_EN", "type", observed=False)[["Education"]]
    .sort_values(by="ADM2_EN", ascending=False)
    .plot(ax=ax, kind="barh", color=TableauMedium_10.mpl_colors, legend=False)
)

# Add labels and customization
ax.set_xlabel("% Places of Education Damaged", fontsize=12)
ax.xaxis.set_major_formatter(FuncFormatter(lambda y, _: "{}%".format(y)))
ax.set_ylabel("Governorate", fontsize=16)
# ax.set_yticklabels(df["ADM2_EN"].unique(), fontsize=12)
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position("left")
ax.xaxis.set_ticks_position("bottom")
ax.grid(which="both", linestyle="--", linewidth=0.25, color="gray", alpha=0.5)
# ax.legend(bbox_to_anchor=(1.01, 0.9))

ax.set_title(
    "Estimated percentage (and absolute numbers) of places of education damaged in each Governorate",
    fontsize=14,
    loc="left",
)
ax.text(
    0,
    -0.17,
    "On X: Percentage of places of education damaged. Inside Bar: Absolute number of places of education damaged On Y: Governorate from North to South. \nPlaces of education consist of buildings tagged 'schools', 'colleges', 'universities', 'kindergarten'\nSource: World Bank calculations derived from OpenStreetMap and Sentinel-1 data.",
    ha="left",
    va="center",
    transform=ax.transAxes,
    fontsize=10,
    color="black",
    weight="normal",
)

for id, bar in enumerate(ax.patches):
    width = bar.get_width()  # Use width since the bars are horizontal
    ax.annotate(
        f"{int(np.round(absolute_damage_numbers[id],0))}",
        xy=(width, bar.get_y() + bar.get_height() / 2),
        xytext=(-20, 0),  # Shift the text to the left of the bar's end
        textcoords="offset points",
        color="white",
        ha="right",
        va="center",
    )
../../_images/2c0d9d858be502a588c76627be6c6046f8967fbabc402c888fd41ee24f6c8622.svg
Hide code cell source
fig, ax = plt.subplots(figsize=(14, 6), dpi=300)
plt.suptitle(
    "Gaza: Percentage of Public Amenities Damaged as of April 15th 2024",
    y=0.99,
    fontsize=20,
    x=0.49,
)

absolute_damage_numbers = list(
    public_amenities.pivot_table("damaged", "ADM2_EN", observed=False).sort_values(
        by="ADM2_EN", ascending=False
    )["damaged"]
)


ax = (
    public_amenities.pivot_table("perc", "ADM2_EN", observed=False)[["perc"]]
    .sort_values(by="ADM2_EN", ascending=False)
    .plot(ax=ax, kind="barh", color=TableauMedium_10.mpl_colors, legend=False)
)

# Add labels and customization
ax.set_xlabel("% Public Amenities Damaged", fontsize=12)
ax.xaxis.set_major_formatter(FuncFormatter(lambda y, _: "{:.0f}%".format(y)))
ax.set_ylabel("Governorate", fontsize=16)
# ax.set_yticklabels(df["ADM2_EN"].unique(), fontsize=12)
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position("left")
ax.xaxis.set_ticks_position("bottom")
ax.grid(which="both", linestyle="--", linewidth=0.25, color="gray", alpha=0.5)
# ax.legend(bbox_to_anchor=(1.01, 0.9))

ax.set_title(
    "Estimated percentage (and absolute numbers) of public amenities damaged in each Governorate",
    fontsize=14,
    loc="left",
)
ax.text(
    0,
    -0.17,
    "On X: Percentage of public amenities damaged. Inside Bar: Absolute number of public amenities damaged On Y: Governorate from North to South. \nPublic amenities consist of 'public_building', 'police', 'courthouse', 'library', 'monument', 'post_office', 'memorial', 'community_centre', 'town_hall', 'museum', 'arts_centre', 'sports_centre', 'tourist_info', 'fire_station'\nSource: World Bank calculations derived from OpenStreetMap and Sentinel-1 data.",
    ha="left",
    va="center",
    transform=ax.transAxes,
    fontsize=10,
    color="black",
    weight="normal",
)

for id, bar in enumerate(ax.patches):
    width = bar.get_width()  # Use width since the bars are horizontal
    ax.annotate(
        f"{int(np.round(absolute_damage_numbers[id],0))}",
        xy=(width, bar.get_y() + bar.get_height() / 2),
        xytext=(-20, 0),  # Shift the text to the left of the bar's end
        textcoords="offset points",
        color="white",
        ha="right",
        va="center",
    )
../../_images/8d195edfa1fb736641a70e25b00dcba807004b6a118a9b9133a1695d66e589d9.svg

Percentage of Residential Buildings without Observed Nighttime Lights#

Lower nighttime lights intensity indicative of darker areas may correspond to higher numbers of residential buildings without electricity. The chart below shows the percentage of residential buildings retrieved from OpenStreetMap for which the nighttime lights intensity has decreased as of December 2023 by at least 95% compared to September 2023 for each governorate in Gaza.

Hide code cell source
fig, ax = plt.subplots(figsize=(12, 6))
plt.suptitle(
    "Gaza: Percentage of Residential Buildings without Observed Nighttime Lights",
    y=1.01,
    fontsize=20,
    x=0.45,
)

data = pd.read_csv(
    "../../data/ntl/PSE_2-buildings_without_electricity.csv", index_col="name"
)[["% residential buildings without electricity"]].plot(
    ax=ax, kind="barh", color=TableauMedium_10.mpl_colors[1], legend=False
)

# Add labels and customization
ax.set_xlabel("% residential buildings without electricity ", fontsize=12)
ax.xaxis.set_major_formatter(FuncFormatter(lambda y, _: "{:.0f}%".format(y)))
ax.set_ylabel("Governorate", fontsize=16)
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position("left")
ax.xaxis.set_ticks_position("bottom")
ax.grid(which="both", linestyle="--", linewidth=0.25, color="gray", alpha=0.5)

# ax.set_title(
#     "Estimated percentage of buildings without electricity for each governorate",
#     fontsize=14,
# )
ax.text(
    0,
    -0.13,
    "Source: World Bank calculations derived from NASA Black Marble and OpenStreetMap data.",
    ha="left",
    va="center",
    transform=ax.transAxes,
    fontsize=10,
    color="black",
    weight="normal",
);
../../_images/c539f4a6f22ec11b22f957952897ed386f246a876ebf9c3c2493237e01e6b827.svg