Top overall rank
Banani
Banani ranked first in this experimental index with a score of 83.43.
Data & Python
A data case study comparing Dhaka neighborhoods using mapped amenities, 7 day air quality, and evening peak mobility.
Dhaka neighborhoods are usually judged by reputation, rent, traffic, or personal experience. This project turns that question into a small data product. It compares selected areas using amenity access, Public Space Access, 7 day air quality, and evening peak travel time to other areas in the dataset.
Areas analyzed
0
Amenity radius
0m
About 7.07 sq km around each area center
Air quality sample
0 days
Mobility mode
Evening peak peer area travel
This is a comparative experimental index across the selected 10 areas, not an official livability index.
Findings
Top overall rank
Banani ranked first in this experimental index with a score of 83.43.
Best evening peak mobility
Banani had the strongest peer area evening peak mobility score.
Best 7 day AQI sample
Badda and Bashundhara performed strongest on Google Universal AQI.
Read the scores as relative
100 means strongest among the selected areas. 0 means weakest among the selected areas. It does not mean perfect or absent.
Methodology
The scoring is deliberately simple and relative. It is meant to compare the selected 10 areas in a transparent portfolio case study, not to produce an official citywide model.
For amenity access, this index uses a 1500m radius around each area's selected center point. This creates a circle of about 7.07 sq km. The goal is to compare nearby amenity concentration rather than everything that might fall within a broad neighborhood name.
This makes the score more about local accessibility than total neighborhood size. Larger or more spread out areas may score lower if key amenities are located outside the 1500m circle.
For example, Bashundhara performs poorly in the amenity based categories in this version. This does not necessarily mean Bashundhara has few amenities overall. It more likely means that, within the selected 1500m circle around the chosen center point, mapped amenities are less concentrated than in denser areas such as Banani or Dhanmondi. In a larger radius model, Bashundhara's result could change.
Counts mapped places within 1500m, converts them to density per square km, applies log transformation, and normalizes scores from 0 to 100.
Measures evening peak travel time from each area to every other area in the selected list. Self routes are excluded. Lower average travel time gives a higher mobility score.
Google Universal AQI is used, where higher values are better. The page scores the 7-day historical sample in that direction.
Uses the frozen formula: 40% essential amenities, 25% mobility, 20% air quality, 10% Public Space Access, and 5% data confidence.
Ranking
The ranking uses the frozen local dataset score. Scores are relative to the selected 10 areas.
Scroll sideways to view all columns.
| 1 | Banani | 83.43 | 75.25 | 100.00 | 66.67 | 100.00 |
| 2 | Gulshan | 74.35 | 74.91 | 90.89 | 33.33 | 100.00 |
| 3 | Badda | 64.47 | 74.70 | 26.71 | 100.00 | 29.14 |
| 4 | Mohammadpur | 63.95 | 92.89 | 55.34 | 0.00 | 79.55 |
| 5 | Mirpur | 60.63 | 74.82 | 67.73 | 16.67 | 54.33 |
| 6 | Dhanmondi | 59.04 | 83.33 | 44.83 | 16.67 | 61.66 |
| 7 | Uttara | 57.54 | 57.48 | 25.97 | 83.33 | 63.92 |
| 8 | Motijheel | 54.12 | 84.36 | 13.11 | 33.33 | 54.33 |
| 9 | Khilgaon | 52.53 | 71.90 | 0.00 | 66.67 | 54.33 |
| 10 | Bashundhara | 41.88 | 0.00 | 67.51 | 100.00 | 0.00 |
Interactive
Adjust the weights to see how the ranking changes when priorities shift. The calculation normalizes weights if the total is not exactly 100.
Weight total
100 / 100
Scroll sideways to view all columns.
| 1 | Banani | 83.43 | 75.25 | 100.00 | 66.67 | 100.00 |
| 2 | Gulshan | 74.35 | 74.91 | 90.89 | 33.33 | 100.00 |
| 3 | Badda | 64.47 | 74.70 | 26.71 | 100.00 | 29.14 |
| 4 | Mohammadpur | 63.95 | 92.89 | 55.34 | 0.00 | 79.55 |
| 5 | Mirpur | 60.63 | 74.82 | 67.73 | 16.67 | 54.33 |
| 6 | Dhanmondi | 59.04 | 83.33 | 44.83 | 16.67 | 61.66 |
| 7 | Uttara | 57.54 | 57.48 | 25.97 | 83.33 | 63.92 |
| 8 | Motijheel | 54.12 | 84.36 | 13.11 | 33.33 | 54.33 |
| 9 | Khilgaon | 52.53 | 71.90 | 0.00 | 66.67 | 54.33 |
| 10 | Bashundhara | 41.88 | 0.00 | 67.51 | 100.00 | 0.00 |
Topics
Each topic is scored from 0 to 100 relative to the selected 10 Dhaka areas. Public Space Access uses mapped parks as a proxy.
Scroll sideways to view all columns.
| 1 | Dhanmondi | 96.42 |
| 2 | Mohammadpur | 95.07 |
| 3 | Mirpur | 88.93 |
| 4 | Motijheel | 87.37 |
| 5 | Khilgaon | 84.37 |
| 6 | Badda | 73.44 |
| 7 | Gulshan | 70.25 |
| 8 | Uttara | 68.42 |
| 9 | Banani | 67.31 |
| 10 | Bashundhara | 0.00 |
Appendix
These tables are summary-level views of the frozen dataset. The raw hourly air quality rows are intentionally not rendered here.
Formula, transformations, and limitations.
Amenities were collected from Google Places Aggregate API. Mobility was collected from Google Routes API. Air quality was collected from Google Air Quality API history lookup. No live APIs are called from this portfolio page; it uses a frozen local dataset.
For each selected area, the system used the area center coordinate and a 1500m radius. For each amenity category, it collected mapped place counts. The count is mapped amenity availability from Google Places, not an official census.
The amenity model is intentionally a 1500m radius around a selected center point for each area. The measured area of that circle is:
area_km2 = π × radius_meters² / 1,000,000
For 1500m: area_km2 = π × 1500² / 1,000,000 ≈ 7.07 sq km
The index compares amenity density inside this circle, so a compact dense area can score better than a larger more spread out area. This is intentional: the current model is measuring nearby access, not total area level inventory.
A future version could compare multiple radius options such as 1500m, 2500m, and 3000m.
| Topic score | Amenity categories used | Meaning |
|---|---|---|
| Healthcare | hospital, pharmacy | Access to mapped healthcare related amenities |
| Education | school | Access to mapped schools |
| Finance | bank, atm | Access to mapped banking and cash withdrawal points |
| Food and Daily Needs | restaurant, supermarket | Access to mapped food and grocery related places |
| Transport Access | bus_station | Access to mapped bus related transport points |
| Public Space Access | park | Access to mapped parks as a proxy for Public Space Access |
For every area and every amenity category, the system starts with the raw mapped count from Google Places Aggregate API. Example: Area: Banani; Category: restaurant; Radius: 1500m; Raw count: number of mapped restaurants found within 1500m.
The raw count is converted into density so every area can be compared fairly.
area_km2 = π × radius_meters² / 1,000,000
For 1500m: area_km2 ≈ 7.07 sq km
count_per_sq_km = raw_count / area_km2
transformed_value = log1p(count_per_sq_km)
Google Places counts can be very high in dense areas. log1p reduces the impact of extreme counts so one category does not dominate the score only because the raw count is very large.
category_score = (transformed_value_for_area - minimum_transformed_value_for_that_category)
/ (maximum_transformed_value_for_that_category - minimum_transformed_value_for_that_category) × 100
For each category, the area with the strongest transformed density gets 100. The area with the weakest transformed density gets 0. Other areas receive scores between 0 and 100.
If Banani has the highest transformed restaurant density among the selected 10 areas, Banani gets restaurant_score = 100. If Bashundhara has the lowest transformed restaurant density, Bashundhara gets restaurant_score = 0. This does not mean Bashundhara has no restaurants. It only means it is weakest for restaurant density within this selected comparison set.
When a topic has multiple categories, the topic score is the average of those category scores.
Essential Amenities is calculated from Healthcare, Education, Finance, Food and Daily Needs, and Transport Access.
essential_amenities_score =
average of healthcare_score, education_score, finance_score,
food_and_daily_needs_score, and transport_access_score
The mobility score uses an evening peak mobility sample. Each area is routed to every other selected area. Self routes are excluded. For 10 areas, this creates 90 route pairs.
The system calculates average travel time for each area. Lower average travel time gives a higher mobility score. This avoids the old bias where Motijheel or Gulshan scored well because they were also fixed destinations.
average_duration_seconds = average travel time from one area to all other selected areas
mobility_score = inverse normalized score from 0 to 100
The air quality score uses 7 days of hourly Google Universal AQI data. Google Universal AQI is higher is better. Median AQI is used for scoring. PM2.5 and PM10 are shown as diagnostics, but they are not the main score.
air_quality_score = normalized median Universal AQI score across selected areas
Air quality is center point based, so it represents the selected coordinate, not every street inside the neighborhood.
Overall Livability Score =
40% Essential Amenities
25% Mobility
20% Air Quality
10% Public Space Access
5% Data Confidence
Data Confidence reflects whether the required data components were available for the area.
All scores are relative to the selected 10 areas. A score of 100 means strongest within this dataset, not perfect. A score of 0 means weakest within this dataset, not absent.
Frozen scores and component scores by area.
Scroll sideways to view all columns.
| 1 | Banani | 83.43 | 75.25 | 100.00 | 66.67 | 100.00 |
| 2 | Gulshan | 74.35 | 74.91 | 90.89 | 33.33 | 100.00 |
| 3 | Badda | 64.47 | 74.70 | 26.71 | 100.00 | 29.14 |
| 4 | Mohammadpur | 63.95 | 92.89 | 55.34 | 0.00 | 79.55 |
| 5 | Mirpur | 60.63 | 74.82 | 67.73 | 16.67 | 54.33 |
| 6 | Dhanmondi | 59.04 | 83.33 | 44.83 | 16.67 | 61.66 |
| 7 | Uttara | 57.54 | 57.48 | 25.97 | 83.33 | 63.92 |
| 8 | Motijheel | 54.12 | 84.36 | 13.11 | 33.33 | 54.33 |
| 9 | Khilgaon | 52.53 | 71.90 | 0.00 | 66.67 | 54.33 |
| 10 | Bashundhara | 41.88 | 0.00 | 67.51 | 100.00 | 0.00 |
Area-level score inputs used for the index.
Scroll sideways to view all columns.
| Mohammadpur | 92.89 | 95.07 | 100.00 | 74.63 | 94.77 | 100.00 | 79.55 | 55.34 | 0.00 |
| Motijheel | 84.36 | 87.37 | 81.26 | 100.00 | 95.59 | 57.56 | 54.33 | 13.11 | 33.33 |
| Dhanmondi | 83.33 | 96.42 | 97.24 | 86.33 | 96.12 | 40.54 | 61.66 | 44.83 | 16.67 |
| Banani | 75.25 | 67.31 | 74.68 | 79.09 | 82.21 | 72.97 | 100.00 | 100.00 | 66.67 |
| Gulshan | 74.91 | 70.25 | 78.71 | 83.28 | 84.75 | 57.56 | 100.00 | 90.89 | 33.33 |
| Mirpur | 74.82 | 88.93 | 97.02 | 69.09 | 97.53 | 21.53 | 54.33 | 67.73 | 16.67 |
| Badda | 74.70 | 73.44 | 88.59 | 74.97 | 95.95 | 40.54 | 29.14 | 26.71 | 100.00 |
| Khilgaon | 71.90 | 84.37 | 95.59 | 71.65 | 86.36 | 21.53 | 54.33 | 0.00 | 66.67 |
| Uttara | 57.48 | 68.42 | 82.96 | 53.19 | 82.84 | 0.00 | 63.92 | 25.97 | 83.33 |
| Bashundhara | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 67.51 | 100.00 |
Mapped category counts and density scores.
Scroll sideways to view all columns.
| Badda | Hospital | 80 | 11.32 | 61.77 |
| Badda | Pharmacy | 350 | 49.51 | 86.78 |
| Badda | School | 225 | 31.83 | 88.59 |
| Badda | Bank | 123 | 17.40 | 75.77 |
| Badda | ATM | 82 | 11.60 | 73.99 |
| Badda | Restaurant | 829 | 117.28 | 89.19 |
| Badda | Supermarket | 61 | 8.63 | 100.00 |
| Badda | Park | 9 | 1.27 | 29.14 |
| Badda | Bus Station | 2 | 0.28 | 40.54 |
| Badda | Mosque | 143 | 20.23 | 78.44 |
| Banani | Hospital | 106 | 15.00 | 69.60 |
| Banani | Pharmacy | 129 | 18.25 | 64.69 |
| Banani | School | 144 | 20.37 | 74.68 |
| Banani | Bank | 142 | 20.09 | 79.32 |
| Banani | ATM | 98 | 13.86 | 78.81 |
| Banani | Restaurant | 868 | 122.80 | 90.41 |
| Banani | Supermarket | 36 | 5.09 | 77.29 |
| Banani | Park | 43 | 6.08 | 100.00 |
| Banani | Bus Station | 4 | 0.57 | 72.97 |
| Banani | Mosque | 96 | 13.58 | 62.70 |
| Bashundhara | Hospital | 4 | 0.57 | 0.00 |
| Bashundhara | Pharmacy | 1 | 0.14 | 0.00 |
| Bashundhara | School | 8 | 1.13 | 0.00 |
| Bashundhara | Bank | 0 | 0.00 | 0.00 |
| Bashundhara | ATM | 0 | 0.00 | 0.00 |
| Bashundhara | Restaurant | 23 | 3.25 | 0.00 |
| Bashundhara | Supermarket | 2 | 0.28 | 0.00 |
| Bashundhara | Park | 3 | 0.42 | 0.00 |
| Bashundhara | Bus Station | 0 | 0.00 | 0.00 |
| Bashundhara | Mosque | 16 | 2.26 | 0.00 |
| Dhanmondi | Hospital | 305 | 43.15 | 100.00 |
| Dhanmondi | Pharmacy | 448 | 63.38 | 92.33 |
| Dhanmondi | School | 296 | 41.88 | 97.24 |
| Dhanmondi | Bank | 169 | 23.91 | 83.65 |
| Dhanmondi | ATM | 145 | 20.51 | 89.61 |
| Dhanmondi | Restaurant | 1,244 | 175.99 | 100.00 |
| Dhanmondi | Supermarket | 53 | 7.50 | 93.80 |
| Dhanmondi | Park | 20 | 2.83 | 61.66 |
| Dhanmondi | Bus Station | 2 | 0.28 | 40.54 |
| Dhanmondi | Mosque | 177 | 25.04 | 87.00 |
| Gulshan | Hospital | 117 | 16.55 | 72.38 |
| Gulshan | Pharmacy | 149 | 21.08 | 67.83 |
| Gulshan | School | 164 | 23.20 | 78.71 |
| Gulshan | Bank | 171 | 24.19 | 83.94 |
| Gulshan | ATM | 112 | 15.84 | 82.46 |
| Gulshan | Restaurant | 972 | 137.51 | 93.42 |
| Gulshan | Supermarket | 38 | 5.38 | 79.54 |
| Gulshan | Park | 43 | 6.08 | 100.00 |
| Gulshan | Bus Station | 3 | 0.42 | 57.56 |
| Gulshan | Mosque | 99 | 14.01 | 63.91 |
| Khilgaon | Hospital | 111 | 15.70 | 70.89 |
| Khilgaon | Pharmacy | 623 | 88.14 | 99.78 |
| Khilgaon | School | 281 | 39.75 | 95.59 |
| Khilgaon | Bank | 93 | 13.16 | 68.95 |
| Khilgaon | ATM | 85 | 12.03 | 74.95 |
| Khilgaon | Restaurant | 935 | 132.28 | 92.39 |
| Khilgaon | Supermarket | 41 | 5.80 | 82.74 |
| Khilgaon | Park | 17 | 2.41 | 54.33 |
| Khilgaon | Bus Station | 1 | 0.14 | 21.53 |
| Khilgaon | Mosque | 237 | 33.53 | 98.82 |
| Mirpur | Hospital | 149 | 21.08 | 79.25 |
| Mirpur | Pharmacy | 629 | 88.99 | 100.00 |
| Mirpur | School | 294 | 41.59 | 97.02 |
| Mirpur | Bank | 81 | 11.46 | 65.63 |
| Mirpur | ATM | 80 | 11.32 | 73.32 |
| Mirpur | Restaurant | 1,118 | 158.16 | 97.15 |
| Mirpur | Supermarket | 58 | 8.21 | 97.76 |
| Mirpur | Park | 17 | 2.41 | 54.33 |
| Mirpur | Bus Station | 1 | 0.14 | 21.53 |
| Mirpur | Mosque | 200 | 28.29 | 91.93 |
| Mohammadpur | Hospital | 235 | 33.25 | 92.39 |
| Mohammadpur | Pharmacy | 579 | 81.91 | 98.13 |
| Mohammadpur | School | 323 | 45.70 | 100.00 |
| Mohammadpur | Bank | 105 | 14.85 | 71.90 |
| Mohammadpur | ATM | 95 | 13.44 | 77.97 |
| Mohammadpur | Restaurant | 981 | 138.78 | 93.67 |
| Mohammadpur | Supermarket | 55 | 7.78 | 95.42 |
| Mohammadpur | Park | 29 | 4.10 | 79.55 |
| Mohammadpur | Bus Station | 6 | 0.85 | 100.00 |
| Mohammadpur | Mosque | 215 | 30.42 | 94.86 |
| Motijheel | Hospital | 176 | 24.90 | 84.03 |
| Motijheel | Pharmacy | 426 | 60.27 | 91.20 |
| Motijheel | School | 178 | 25.18 | 81.26 |
| Motijheel | Bank | 323 | 45.70 | 100.00 |
| Motijheel | ATM | 210 | 29.71 | 100.00 |
| Motijheel | Restaurant | 966 | 136.66 | 93.26 |
| Motijheel | Supermarket | 57 | 8.06 | 97.00 |
| Motijheel | Park | 17 | 2.41 | 54.33 |
| Motijheel | Bus Station | 3 | 0.42 | 57.56 |
| Motijheel | Mosque | 244 | 34.52 | 100.00 |
| Uttara | Hospital | 66 | 9.34 | 56.52 |
| Uttara | Pharmacy | 283 | 40.04 | 82.02 |
| Uttara | School | 188 | 26.60 | 82.96 |
| Uttara | Bank | 46 | 6.51 | 52.45 |
| Uttara | ATM | 38 | 5.38 | 54.10 |
| Uttara | Restaurant | 701 | 99.17 | 84.73 |
| Uttara | Supermarket | 40 | 5.66 | 81.70 |
| Uttara | Park | 21 | 2.97 | 63.92 |
| Uttara | Bus Station | 0 | 0.00 | 0.00 |
| Uttara | Mosque | 117 | 16.55 | 70.47 |
Evening peak peer-area travel summary.
Scroll sideways to view all columns.
| Banani | 9 | 27.3 min | 27.7 min | 32.5 min | 228.3 sec/km | 100.00 |
| Gulshan | 9 | 29.8 min | 29.5 min | 35.0 min | 296.3 sec/km | 90.89 |
| Mirpur | 9 | 36.2 min | 33.1 min | 46.9 min | 223.4 sec/km | 67.73 |
| Bashundhara | 9 | 36.3 min | 37.5 min | 43.7 min | 154.2 sec/km | 67.51 |
| Mohammadpur | 9 | 39.7 min | 42.5 min | 44.8 min | 241.5 sec/km | 55.34 |
| Dhanmondi | 9 | 42.6 min | 42.0 min | 50.0 min | 267.8 sec/km | 44.83 |
| Badda | 9 | 47.7 min | 45.7 min | 51.9 min | 353.7 sec/km | 26.71 |
| Uttara | 9 | 47.9 min | 50.3 min | 54.6 min | 174.6 sec/km | 25.97 |
| Motijheel | 9 | 51.4 min | 56.1 min | 62.1 min | 291.6 sec/km | 13.11 |
| Khilgaon | 9 | 55.1 min | 58.6 min | 67.4 min | 316.9 sec/km | 0.00 |
7-day summarized Google Universal AQI sample.
Scroll sideways to view all columns.
| Badda | 168 | 47.0 | 49.0 | 35.7 | 45.8 | 100.00 | high |
| Bashundhara | 168 | 47.0 | 49.2 | 35.5 | 45.2 | 100.00 | high |
| Uttara | 168 | 46.0 | 48.7 | 35.7 | 45.0 | 83.33 | high |
| Banani | 168 | 45.0 | 48.7 | 36.1 | 45.8 | 66.67 | high |
| Khilgaon | 168 | 45.0 | 46.4 | 39.4 | 52.0 | 66.67 | high |
| Gulshan | 168 | 43.0 | 45.8 | 40.4 | 52.2 | 33.33 | high |
| Motijheel | 168 | 43.0 | 45.6 | 41.1 | 52.7 | 33.33 | high |
| Dhanmondi | 168 | 42.0 | 45.4 | 41.4 | 52.4 | 16.67 | high |
| Mirpur | 168 | 42.0 | 45.6 | 40.8 | 52.2 | 16.67 | high |
| Mohammadpur | 168 | 41.0 | 45.2 | 41.6 | 52.4 | 0.00 | high |