证据原则
PropTools 把注册成交价视为来源中的一项观察值,而不是估价。挂牌价、估计市值、拍卖底价与注册成交价是不同的概念,没有标注就不能混为一谈。
数据导入流程
PropTools 从 NAPIC/JPPH 官方公开的 Tableau 导出数据中导入所有州属的记录,写入一个全新的 SQLite 数据库。系统会验证必填字段与全国覆盖范围,把平方米换算成平方尺,生成确定性的记录编号,将近期数据标记为暂定,建立州属与县区汇总,然后才以原子操作替换旧数据库。更新失败或不完整时,线上继续使用上一个通过验证的数据库。
质量标记
| 状态 | 含义 | 默认处理方式 |
|---|---|---|
| 已核实 | 必填字段通过验证,且所属时期的数据已足够成熟。 | 纳入汇总统计。 |
| 暂定 | 近期申报时段,可能受注册滞后影响。 | 纳入并附警示;成交量趋势须谨慎解读。 |
| 待复核 | 每平方尺价格、价格、面积或匹配可信度异常,需要检查。 | 在原始结果中可见;可选择从截尾统计中剔除。 |
稳健统计
公开页面应在中位数旁同时显示样本数量。若某个细分市场有足够记录,PropTools 会提供原始中位数、截尾中位数、四分位距以及第 10 至第 90 百分位数。平均数不作为默认指标,因为少数异常值就足以扭曲它。
市场活跃度评分
活跃度评分是一个 0–100 的综合指标,刊登在市场分析页面上。它刻意不称为需求评分:衡量需求需要挂牌方面的数据,例如库存、挂牌天数和下架率,而 PropTools 一项都没有收集。仅凭注册成交推断需求,等于把猜测当作测量。以下每一项输入都来自官方登记数据。
activity_score =
liquidity × 0.40
+ price_momentum × 0.30
+ auction_pressure × 0.20
+ pipeline_pressure × 0.10
liquidity = percentile_rank(registered_sales among all districts)
price_momentum = normalise(five_year_median_growth, −10%, +30%)
auction_pressure = 100 − normalise(state_auction_lots_per_1000_state_sales, 0, 30)
pipeline_pressure = 100 − normalise(state_pipeline_units / state_sales × 100, 0, 60)
normalise(v, lo, hi) = clamp((v − lo) / (hi − lo) × 100, 0, 100)流动性采用百分位排名,而非缩放值:成交量横跨三个数量级,线性尺度(所有数值都挤向零)和对数尺度(成交 441 宗的县区得 55 分)都无法如实反映。拍卖与在建供应两项比率以州属成交量为基准,因为这两个来源数据集都按州属划分。两个压力项取反向,因为强制出售和未售出的未来供应都对市场不利,而非有利。
已知局限:拍卖列表与新项目登记都按州属而非县区划分,因此这两项是州属层面的信号,套用到该州的每个县区。位于拍卖量大的州属的县区,即使本地市况平稳,也会承受这份压力。请把评分当作县区之间的粗略比较,而非精确排名。
日照与单位朝向
日照工具不使用任何数据集。太阳位置采用 NOAA 的算法,日出与日落取太阳位于地平线以下 −0.833° 的时刻——这是对大气折射和太阳本身半径的标准修正,也就是历书所印、户外的人所见的那一刻。工具同时以伦敦和吉隆坡公布的历书时间核对,因为在北纬 51° 一个误差会让日出时间偏移数分钟、十分明显,而在北纬 3° 同样的误差却隐藏在全年几乎不变的昼长之中。
墙面所受能量只计直射光。大气质量采用 Kasten–Young 公式,衰减采用标准晴空近似,模型峰值为 953 W/m²,而太阳能板的额定值为 1,000 W/m²。对于垂直墙面,入射余弦为 cos(高度角) × cos(方位角 − 朝向),所以正午最高、最强的阳光照在屋顶而不是墙上。全年每隔五天取样一次,再按 365 天换算总量。
各朝向按能量而非时数排名。时数只是替代指标,在这里会得出错误答案:在吉隆坡三月春分当天,有四个朝向在下午 3 点后同样获得 4.5 小时日照,而其中西墙所受的能量是南墙的二十多倍。晴空只是上限而非预报——马来西亚天空多云潮湿——但云层会同时削减每个朝向,所以即使总量不准,比较结果依然成立。
它不绘制阴影。阴影需要每栋建筑的高度,而马来西亚没有这方面的开放数据:在所测量的地区,OpenStreetMap 只有 5–17% 的建筑带有高度,而可作商业用途的全球卫星衍生数据集在约 100 米处便饱和,把 Merdeka 118 读成 35 米,实际高度却是 679 米。这两个数字都是实测而非假设。因此地图在街道布局上显示日出与日落的方位,并清楚说明线条穿过某栋建筑并不代表已把该建筑计算在内。
报案罪案
报案罪案数据来自 PDRM 的各县区罪案数据集,与 DOSM 的县区人口数据合并,并以每 1,000 名居民计算。单看案件数主要反映的是人口多少,因此不作为主要数字。
关键在于数据合并。PDRM 按警区报告,而警区与行政县区的范围并不相同。吉隆坡是一个县区,却分为五个警区,因此要加总。新近划出的县区往往没有自己的警区——Kuala Nerus 由 Kuala Terengganu 警区管辖,Putatan 由 Penampang 管辖——所以它的罪案计入母县区,而居民却在它自己的人口数据里。只有两个数字涵盖同一范围时,比率才成立,因此这类县区会合并报告。警方还把纳闽归在沙巴之下、布城归在吉隆坡之下,而每个州属都有一行名为“All”的合计,若与县区相加会使州属数字翻倍。
每个警区和每个人口县区都只归入一次,依据一张明确的对照表,凡不是名称直接相符的情况都注明理由。管辖范围以 PDRM 自己的名录和同期的警局名单核实,而不是从地图推断。除非结果加总后与 PDRM 自 2016 年起每一年的全国总数相符,否则构建就会失败。结果确实相符,唯独 2020 和 2021 年 PDRM 自己的雪兰莪数字前后矛盾;这些差距按确切数值记录,任何其他差距都会让构建停止。
报案罪案并非全部罪案:报案率因地点和罪行类别而异,而分母只计居民,所以旅游区和市中心的数字会偏高。这些数字描述的是一年内报到警方的案件,而不是某条街道的安全评级。
水灾损失
水灾损失数据来自 DOSM《水灾影响特别报告》(Special Report on Impact of Floods)的表 2:每个县区的住宅、车辆、商业场所和制造业损失,取自 DOSM 随每一版发布的工作簿。每一版都包含当年和前一年的数据,所以 2021 至 2025 年来自四个版本,除了首尾两年,每一年都印了两次。两次印出的数字分毫不差。
主要数字是五年内平均每间住宅的损失。总额主要反映规模,而任何单一年份主要反映那一年哪里下雨:仅 2021 年就占了五年损失的近三分之二。住宅数量采用 DOSM 自己的数字,列在每个县区旁边。DOSM 称之为“住所”(living quarters),但其数字与 2020 年人口普查的住户数相符。
每个数字使用前都经过检查。一行中的四类损失必须加总等于该行总额,各县区加总等于州属,各州属加总等于全国;然后按本网站合并后的县区,必须加总回到 DOSM 每一年的全国数字。任何一项不符都会让构建停止。来源中的三个缺陷逐一处理:沙巴的住宅数量在 2022 和 2023 年版中偏低,于 2024 年更正;自 2024 年起玻璃市被分成三部分,整个州的住宅数量被复制到其中一部分,因此改用州属行;Hilir Perak 的脚注说明包含 Bagan Datuk,而 Bagan Datuk 仍保留自己的一行,因此两者合并显示。
这些是水灾发生后评估的损失,涵盖的县区范围远大于任何一次水灾。它们不是预报,也不是水灾地图,无法说明某条街道是否会淹水。
已知局限
公开的成交数据可能缺少单位地址、卧室数量、楼层、屋况以及其他影响价值的属性。近期时段的成交量会被低估。拍卖或关系人之间的交易可能进入注册数据。盖印的买卖合约(SPA)价格可能与买家心目中的当前市值不同。