Which town has the most clinics?
Pick your town or area to see how many neighbours share each CHAS clinic. Clinics 2021, residents 2020.
How many neighbours share each clinic?
Each row is an area, with the most clinics for its residents at the top. A longer bar means more clinics for the people who live there. Hover or tap a row for details, and click to pick it.
Ang Mo Kio has more clinics for its residents than 23 of the other 25 areas. All 27 areas together have 1 clinic for every 4,200 residents.
Novena has the most clinics for its residents (1 for every 1,700) and Pasir Ris the fewest (1 for every 7,700): about 4.6 times as many residents for each clinic.
Which areas have the most clinics in number?
The 6 areas with the most clinics, whatever their size. Your area is in red. Click a row to pick it.
Ang Mo Kio has 60 clinics. Tampines has the most, 71.
Where are the clinics?
Each dot is one clinic. Shaded areas are the 27 in the picker, and your area is picked out in yellow. Hover or tap an area for details.
The 5 areas with the most clinics (Tampines, Bedok, Ang Mo Kio, Yishun, Bukit Merah) hold 29 in every 100 of the 1,052 clinics on the map.
Which part of Singapore has the most clinics?
Each bar adds up the clinics and residents of the areas in one of URA's five regions. A longer bar means more clinics for each resident. Your area's region is in red.
10 areas
3 areas
5 areas
6 areas
3 areas
The Central region has 1 clinic for every 3,000 residents and the North region 1 for every 5,100: about 1.7 times as many residents for each clinic.
Fun finds
The short version
Of 27 areas where people live, Tampines has the most CHAS clinics in number (71), but Novena has the most for its residents (1 clinic for every 1,700 residents) and Pasir Ris the fewest (1 for every 7,700), using clinics from 2021 and residents from 2020.
What we did. We took the 1,053 medical clinics in the Ministry of Health's CHAS Clinics file (last edited September 2021) and placed 1,052 of them inside URA's planning areas. We divided each area's clinics into its residents from the Census of Population 2020. 27 areas have at least 20,000 residents; they hold 941 of the clinics and 3,978,600 residents.
What we found. Novena had the most clinics for its residents (1 for every 1,700) and Pasir Ris the fewest (1 for every 7,700), a gap of about 4.6 times. Tampines had the most clinics in number (71), and it shares each one among 3,700 residents. Across all 27 areas, there were 2.4 clinics for every 10,000 residents. The Central region had 1 clinic for every 3,000 residents, the North region 1 for every 5,100.
What to keep in mind. This is not every GP clinic: it is the CHAS list as it stood in 2021, and MOH's website now says there are more than 2,000 private GP clinics, of which more than 1,300 are on CHAS. Newer estates have grown since then. A lower figure may mean fewer CHAS clinics, not fewer clinics. The census (2020) and the clinic list (2021) both date from the COVID-19 years. We count clinics, not doctors, opening hours or distance, and we do not say why some areas have more. Use the picker to see your own area, then check the numbers and the boring bit below.
By Ben (opens in a new tab). Updated . Data: MOH, CHAS Clinics (2021); SingStat, Census of Population 2020; URA, planning areas; all on data.gov.sg.
Questions people ask
Which town in Singapore has the most clinics?
By number, Tampines, with 71 CHAS clinics, then Bedok (65) and Ang Mo Kio (60). For the size of its population, Novena comes first, with 29 clinics for 49,330 residents, or 1 clinic for every 1,700 residents (clinics 2021, residents 2020).
Which town has the fewest clinics for its residents?
Pasir Ris, with 19 CHAS clinics for 147,110 residents, or 1 for every 7,700. Bukit Panjang is next, at the same figure to the nearest hundred. Pasir Ris has about 4.6 times as many residents for each clinic as Novena.
How many GP clinics are there per 10,000 people in Singapore?
Across the 27 areas where people live, 2.4 CHAS clinics for every 10,000 residents (941 clinics, 3,978,600 residents). It runs from 1.3 in Pasir Ris to 5.9 in Novena. The clinic list is from 2021 and is not every GP clinic.
Is this every GP clinic in Singapore?
No. The clinic list is the CHAS Clinics file from the Ministry of Health, last edited in September 2021. It has 1,053 medical clinics, and 1,052 of them fall inside a planning area. MOH's own website now says there are more than 2,000 private GP clinics, of which more than 1,300 are on CHAS, so this file is part of the picture and is out of date for newer estates.
Which part of Singapore has the most clinics?
For its residents, the Central region: 1 clinic for every 3,000 residents. The North region has 1 for every 5,100, about 1.7 times as many residents for each clinic. These use the 27 areas where people live, grouped by URA's five regions.
Why does Orchard have so many clinics but so few residents?
The census counts people who live in an area. Orchard has 21 clinics and 920 residents, and Downtown Core 36 clinics and 3,190 residents. Clinics there serve people who work, shop and travel through, so we leave areas this small out of the picker.
Does this say how easy it is to see a doctor?
No. It counts clinics for each resident in an area. It does not know opening hours, queue times, how big a clinic is, how far away the nearest one is, or the polyclinics, which are not in the file.
How were the clinics counted?
We took the 1,053 medical clinics (licence type MC) in the CHAS Clinics file, put each one in the planning area its coordinates fall inside, and divided by the area's residents in the 2020 census. The 140 dental clinics in the file are left out.
Why only 27 areas?
We kept planning areas with at least 20,000 residents in the 2020 census (27 of the 55). Areas with fewer residents are listed in the tables but not ranked. Tanglin is in the picker but has only 3 clinics, under the 10 needed to rank, so it is not ranked either.
Why do some towns have more clinics for their residents?
This page shows where the clinics are, not why. We do not claim a reason.
The numbers behind it
| Area | Region | CHAS clinics | Residents | Residents per clinic | Clinics per 10,000 residents | Place in the list |
|---|---|---|---|---|---|---|
| Novena | Central | 29 | 49,330 | 1,700 | 5.9 | 1 |
| Queenstown | Central | 39 | 95,930 | 2,500 | 4.1 | 2 |
| Ang Mo Kio | North-East | 60 | 162,280 | 2,700 | 3.7 | 3 |
| Toa Payoh | Central | 43 | 121,850 | 2,800 | 3.5 | 4 |
| Bukit Merah | Central | 52 | 151,250 | 2,900 | 3.4 | 5 |
| Geylang | Central | 37 | 110,110 | 3,000 | 3.4 | 6 |
| Jurong East | West | 25 | 78,600 | 3,100 | 3.2 | 7 |
| Kallang | Central | 31 | 101,290 | 3,300 | 3.1 | 8 |
| Marine Parade | Central | 14 | 46,220 | 3,300 | 3.0 | 9 |
| Clementi | West | 27 | 91,990 | 3,400 | 2.9 | 10 |
| Tampines | East | 71 | 259,900 | 3,700 | 2.7 | 11 |
| Bukit Batok | West | 40 | 158,030 | 4,000 | 2.5 | 12 |
| Yishun | North | 56 | 221,610 | 4,000 | 2.5 | 13 |
| Bukit Timah | Central | 19 | 77,860 | 4,100 | 2.4 | 14 |
| Bedok | East | 65 | 276,990 | 4,300 | 2.3 | 15 |
| Serangoon | North-East | 26 | 116,900 | 4,500 | 2.2 | 16 |
| Hougang | North-East | 47 | 227,560 | 4,800 | 2.1 | 17 |
| Jurong West | West | 52 | 262,730 | 5,100 | 2.0 | 18 |
| Bishan | Central | 17 | 87,320 | 5,100 | 1.9 | 19 |
| Woodlands | North | 42 | 255,130 | 6,100 | 1.6 | 20 |
| Sengkang | North-East | 40 | 249,370 | 6,200 | 1.6 | 21 |
| Choa Chu Kang | West | 29 | 192,070 | 6,600 | 1.5 | 22 |
| Sembawang | North | 15 | 102,640 | 6,800 | 1.5 | 23 |
| Punggol | North-East | 25 | 174,450 | 7,000 | 1.4 | 24 |
| Bukit Panjang | West | 18 | 138,270 | 7,700 | 1.3 | 25 |
| Pasir Ris | East | 19 | 147,110 | 7,700 | 1.3 | 26 |
| Tanglin | Central | 3 | 21,810 | 7,300 | 1.4 | not ranked (under 10 clinics) |
| Region | Areas | CHAS clinics | Residents | Residents per clinic | Clinics per 10,000 residents |
|---|---|---|---|---|---|
| Central | 10 | 284 | 862,970 | 3,000 | 3.3 |
| East | 3 | 155 | 684,000 | 4,400 | 2.3 |
| North-East | 5 | 198 | 930,560 | 4,700 | 2.1 |
| West | 6 | 191 | 921,690 | 4,800 | 2.1 |
| North | 3 | 113 | 579,380 | 5,100 | 2.0 |
| Area | CHAS clinics | Residents |
|---|---|---|
| Downtown Core | 36 | 3,190 |
| Orchard | 21 | 920 |
| Outram | 14 | 18,340 |
| Rochor | 14 | 13,120 |
| Changi | 7 | no count in the census file |
| Tuas | 4 | 70 |
| Newton | 3 | 8,260 |
| Singapore River | 3 | 3,260 |
| Museum | 2 | 510 |
| Paya Lebar | 2 | 40 |
| Seletar | 2 | 300 |
| Pioneer | 1 | 80 |
| Southern Islands | 1 | 1,940 |
| Western Water Catchment | 1 | 640 |
The boring bit
Where the data comes from
Clinics: the Ministry of Health's CHAS Clinics file on data.gov.sg, downloaded 9 Oct 2026. It has 1,053 medical clinics (licence type MC) and 140 dental clinics (MD); we used the medical clinics only and call them clinics, as the file's name does. Every record was last edited on 26 Sep 2021. Places: URA's Master Plan 2025 planning areas and their five regions. Residents: SingStat's Census of Population 2020 by planning area, on data.gov.sg.
What is not claimed
- This is not every GP clinic. It is the CHAS list as of 2021. MOH's website now says there are more than 2,000 private GP clinics, of which more than 1,300 are on CHAS, so a clinic that is not on CHAS is not counted.
- It does not say how easy it is to see a doctor. We do not know opening hours, queues, clinic size or the distance to the nearest clinic, and polyclinics are not in the file.
- An area with fewer clinics for its residents is not described as poorly served, and an area with more is not described as well served.
- Clinics serve people who work, study and shop in an area as well as people who live there, and the census counts residents only. That favours busy central areas such as Novena and leaves out places like Orchard, which has 21 clinics and 920 residents.
- An area needs at least 10 clinics to be ranked. Tanglin has 3, so it is shown but not ranked.
- Both the clinic list (2021) and the census (2020) date from the COVID-19 years.
- We do not say why some areas have more clinics for their residents.
Coverage
1,052 of the 1,053 medical clinics sit inside a planning area (the other one has coordinates outside every boundary). The 27 areas in the picker hold 941 of them and 111 are in smaller areas, listed in the third table. Of the 55 planning areas, 27 have at least 20,000 residents in the census.
Report an error. Corrections are logged publicly with a date.
How we did it
- Read the CHAS file and kept the medical clinics (licence type MC), 1,053 of them.
- Placed each clinic in a planning area by testing which URA boundary its coordinates fall inside.
- Read the 2020 census residents for each planning area.
- Kept 27 areas with at least 20,000 residents, and divided residents by clinics.
- Ranked the areas with at least 10 clinics, most clinics for their residents first.
- Added up each region (clinics and residents of its areas) and divided again.
Show the Python code
import json, re
import pandas as pd
from shapely.geometry import shape, Point
MIN_RESIDENTS = 20000 # planning areas with at least this many residents (Census 2020) are in the picker
MIN_CLINICS = 10 # an area needs at least this many clinics to be ranked
def read_areas(data):
"""URA planning areas: name, region and outline."""
feats = json.load(open(f'{data}/planning_areas.geojson'))['features']
return [(f['properties']['PLN_AREA_N'].title(), f['properties']['REGION_N'].title(), shape(f['geometry'])) for f in feats]
def read_clinics(data, areas):
"""Medical clinics (licence type MC) in MOH's CHAS Clinics file, placed in the planning area their coordinates fall inside."""
rows = []
for ft in json.load(open(f'{data}/chas.geojson'))['features']:
kv = dict(re.findall(r'<th>(.*?)</th>\s*<td>(.*?)</td>', ft['properties']['Description']))
kv['lon'], kv['lat'] = ft['geometry']['coordinates'][:2]
rows.append(kv)
allrows = pd.DataFrame(rows)
gp = allrows[allrows.LICENCE_TYPE == 'MC'].copy()
where = lambda r: next((n for n, _, g in areas if g.contains(Point(r.lon, r.lat))), None)
gp['area'] = gp.apply(where, axis=1)
return allrows, gp
def read_residents(data):
"""Residents by planning area, Census of Population 2020."""
pop = pd.read_csv(f'{data}/population_2020.csv')
pop = pop[pop.Number.str.endswith(' - Total')]
return pd.Series(pd.to_numeric(pop.Total_Total, errors='coerce').values,
index=pop.Number.str.replace(' - Total', '', regex=False).str.title())
def prep(data):
areas = read_areas(data)
allrows, gp, = read_clinics(data, areas)
res = read_residents(data)
clinics = gp.area.value_counts()
region = {n: r for n, r, _ in areas}
t = pd.DataFrame({'clinics': clinics, 'res': res}).fillna({'clinics': 0})
t = t[(t.res >= MIN_RESIDENTS) & t.index.isin(region)].copy()
t['region'] = t.index.map(region)
t['per_clinic'] = t.res / t.clinics
t['per10k'] = t.clinics / t.res * 10000
t['ranked'] = t.clinics >= MIN_CLINICS
return areas, allrows, gp, res, clinics, t
What could make it wrong: a clinic list that is out of date, clinics that are not on CHAS, an area whose residents have changed since 2020, or a clinic whose coordinates sit just across a boundary. As a check, the 1,052 placed clinics add up to the total in the file (all but 1 of 1,053).
No machine learning was needed. The question was "how many for each resident", which dividing answers directly.
Sources: MOH CHAS Clinics (opens in a new tab), URA Master Plan 2025 Planning Area Boundary (opens in a new tab) and SingStat Census of Population 2020 (opens in a new tab), data.gov.sg, downloaded 9 Oct 2026; clinic totals from MOH's primary care page (opens in a new tab). Contains information from data.gov.sg made available under the Singapore Open Data Licence.