CompareSG

Which town has the most clinics?

Pick your town or area to see how many neighbours share each CHAS clinic. Clinics 2021, residents 2020.

27 towns and areas where people live, A to Z

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.

1 clinic for every 2,700 residents in Ang Mo Kio
60 clinics162,280 residents (2020)North-East region

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.

One clinicA clinic in your areaYour area

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.

Central
10 areas
1 for every 3,000
East
3 areas
1 for every 4,400
North-East
5 areas
1 for every 4,700
West
6 areas
1 for every 4,800
North
3 areas
1 for every 5,100

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

Same number of clinics, very different crowds?
19 clinics each: Bukit Timah and Pasir Ris
Bukit Timah shares each clinic among 4,100 residents. Pasir Ris shares each one among 7,700.
Where are clinics but hardly any residents?
Orchard: 21 clinics, 920 residents
Residents only: the census counts people who live there, not people who work or shop there. Downtown Core has 36 clinics and 3,190 residents.
Next-door neighbours, very different crowds?
Sengkang and Ang Mo Kio are 2.3 times apart
Ang Mo Kio has 1 clinic for every 2,700 residents. Next door, Sengkang has 1 for every 6,200.

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

CHAS clinics and residents in 27 areas (most clinics for their residents first). Clinics 2021, residents 2020
AreaRegionCHAS clinicsResidentsResidents per clinicClinics per 10,000 residentsPlace in the list
NovenaCentral2949,3301,7005.91
QueenstownCentral3995,9302,5004.12
Ang Mo KioNorth-East60162,2802,7003.73
Toa PayohCentral43121,8502,8003.54
Bukit MerahCentral52151,2502,9003.45
GeylangCentral37110,1103,0003.46
Jurong EastWest2578,6003,1003.27
KallangCentral31101,2903,3003.18
Marine ParadeCentral1446,2203,3003.09
ClementiWest2791,9903,4002.910
TampinesEast71259,9003,7002.711
Bukit BatokWest40158,0304,0002.512
YishunNorth56221,6104,0002.513
Bukit TimahCentral1977,8604,1002.414
BedokEast65276,9904,3002.315
SerangoonNorth-East26116,9004,5002.216
HougangNorth-East47227,5604,8002.117
Jurong WestWest52262,7305,1002.018
BishanCentral1787,3205,1001.919
WoodlandsNorth42255,1306,1001.620
SengkangNorth-East40249,3706,2001.621
Choa Chu KangWest29192,0706,6001.522
SembawangNorth15102,6406,8001.523
PunggolNorth-East25174,4507,0001.424
Bukit PanjangWest18138,2707,7001.325
Pasir RisEast19147,1107,7001.326
TanglinCentral321,8107,3001.4not ranked (under 10 clinics)
The same figures by URA region (clinics and residents of the 27 areas added up)
RegionAreasCHAS clinicsResidentsResidents per clinicClinics per 10,000 residents
Central10284862,9703,0003.3
East3155684,0004,4002.3
North-East5198930,5604,7002.1
West6191921,6904,8002.1
North3113579,3805,1002.0
Areas with fewer than 20,000 residents that have clinics (shown, not ranked)
AreaCHAS clinicsResidents
Downtown Core363,190
Orchard21920
Outram1418,340
Rochor1413,120
Changi7no count in the census file
Tuas470
Newton38,260
Singapore River33,260
Museum2510
Paya Lebar240
Seletar2300
Pioneer180
Southern Islands11,940
Western Water Catchment1640

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
Spatial joinRates per residentGrouping by regionSmall-sample rule
  1. Read the CHAS file and kept the medical clinics (licence type MC), 1,053 of them.
  2. Placed each clinic in a planning area by testing which URA boundary its coordinates fall inside.
  3. Read the 2020 census residents for each planning area.
  4. Kept 27 areas with at least 20,000 residents, and divided residents by clinics.
  5. Ranked the areas with at least 10 clinics, most clinics for their residents first.
  6. 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.