把 M 型社会想象成一座消费双子塔 ️——顶层是尖的少量高净值人群消费力极强底层是宽的大量价格敏感人群中间那一层正在被挤压变薄。咱们用 Python 把这三明治结构算清楚。M 型社会分层消费测算程序(M-Shaped Society Consumption Tier Calculator)定位教学级社会分层消费结构与市场份额测算工具语言Python 3.10适用场景时尚产业与品牌创新课程、消费社会学、品牌定位策略一、实际应用场景描述在时尚产业与品牌创新课程中一个核心议题是M 型社会结构下高端奢品、中端设计师品牌、平价快时尚各自能分到多大的市场蛋糕M 型社会的典型特征是- 顶层高净值人群约 5%~15%消费力极强追求独特性和身份象征- 中层传统中产被挤压M 型凹陷对价格敏感但仍有品质需求- 底层大众消费群体庞大追求极致的性价比对应到时尚消费社会阶层 对应时尚品类 消费特征顶层富裕层 高端奢品LVMH、Hermès 级别 高客单、低频、重品牌溢价中层夹心层 中端设计师品牌、轻奢 中客单、中频、重设计感底层大众层 平价快时尚Uniqlo、ZARA 低客单、高频、重基础款品牌在做市场定位时需要回答这三个层级分别有多大的消费容量我的品牌适合切入哪一层二、引入痛点行业现实问题1. 市场份额拍脑袋- 常说奢品市场很小但利润高但小是多少- 中端设计师品牌的夹心层到底有多厚- 缺少一个结构化的分层测算框架2. 人口数据与市场数据两张皮维度 人口统计 消费能力顶层 约 10% 人口 占据 30%~50% 奢侈品消费额中层 约 30%~40% 人口 消费力被挤压不确定性高底层 约 50%~60% 人口 总量大但单客价值低两组数据口径不统一无法直接算出每个层级的时尚消费容量。3. 缺少假设推演能力- 如果顶层财富集中度从 35% 升到 50%奢品市场份额怎么变- 如果中产阶层继续萎缩设计师品牌的生存空间还有多大- 没有参数化工具无法做 What-if 分析三、核心逻辑讲解建模思路1. 核心假设教学简化- 社会总人口 × 各层级人口比例 各层级人数- 各层级人均时尚消费额不同顶层 中层 底层- 时尚消费占总消费的比例在各层级有差异2. 关键变量定义变量 含义total_population 社会总人口万人top_pct /mid_pct /bot_pct 顶/中/底层人口占比总和为 1avg_annual_fashion_spend 各层级人均年时尚消费额元fashion_share_of_total 时尚消费占总消费的比例brand_share_within_tier 某品牌在特定层级中的份额3. 核心公式1各层级人口数tier_population total_population × tier_pct2各层级年度时尚消费总量tier_fashion_spend tier_population × avg_annual_fashion_spend × fashion_share3某品牌可触达的市场容量addressable_market tier_fashion_spend × brand_share_within_tier4三层市场份额占比market_share_pct tier_fashion_spend / total_fashion_spend × 100%四、项目结构m-shaped-consumption/│├── README.md├── USAGE.md├── main.py├── modules/│ ├── population.py # 人口分层模型│ ├── spend.py # 消费能力测算│ ├── market_share.py # 市场份额计算│ ├── scenario.py # What-if 情景推演│ └── reporter.py # 结果输出└── config/└── consumption.yaml五、核心代码实现Python1️⃣ 人口分层模型population.py# population.py# 将总人口按 M 型结构拆分为三个层级from dataclasses import dataclassfrom typing import Optionaldataclassclass PopulationTier:单个社会阶层的人口与消费属性name: str # 层级名称population_pct: float # 人口占比0~1avg_annual_income: float # 人均年收入元consumer_confidence: float # 消费信心指数0~1population_count: int 0 # 实际人口数计算后填充def __post_init__(self):if not 0.0 self.population_pct 1.0:raise ValueError(population_pct 必须在 0~1 之间)if not 0.0 self.consumer_confidence 1.0:raise ValueError(consumer_confidence 必须在 0~1 之间)def build_population_tiers(total_pop: int) - dict:构建 M 型社会的三层人口结构默认比例return {top: PopulationTier(name顶层富裕层,population_pct0.10,avg_annual_income650000.0, # 年收入 65 万consumer_confidence0.75,),mid: PopulationTier(name中层夹心层,population_pct0.35,avg_annual_income180000.0, # 年收入 18 万consumer_confidence0.55, # 被挤压信心偏低),bot: PopulationTier(name底层大众层,population_pct0.55,avg_annual_income68000.0, # 年收入 6.8 万consumer_confidence0.60,),}def calculate_population_counts(tiers: dict, total_pop: int):根据总人口计算各层级实际人口数for key, tier in tiers.items():tier.population_count int(total_pop * tier.population_pct)2️⃣ 消费能力测算spend.py# spend.py# 测算各层级在时尚品类上的消费能力def calculate_tier_fashion_spend(tier: PopulationTier,fashion_spend_ratio: float,marginal_propensity_to_consume: float) - dict:计算单个层级的年度时尚消费总量参数tier: 人口层级对象fashion_spend_ratio: 时尚消费占消费支出的比例0~1marginal_propensity_to_consume: 边际消费倾向0~1返回消费明细字典# 有效消费额 收入 × 边际消费倾向 × 消费信心effective_consumption (tier.avg_annual_income* marginal_propensity_to_consume* tier.consumer_confidence)# 时尚消费额fashion_spend_per_capita effective_consumption * fashion_spend_ratiototal_fashion_spend fashion_spend_per_capita * tier.population_countreturn {tier_name: tier.name,population: tier.population_count,income_per_capita: tier.avg_annual_income,effective_consumption: round(effective_consumption, 2),fashion_spend_per_capita: round(fashion_spend_per_capita, 2),total_fashion_spend: round(total_fashion_spend, 2),}def calculate_all_tiers(tiers: dict,fashion_spend_ratio: float,mpc: float) - list:批量计算三层消费数据results []for key in [top, mid, bot]:tier tiers[key]result calculate_tier_fashion_spend(tier, fashion_spend_ratio, mpc)results.append(result)return results3️⃣ 市场份额计算market_share.py# market_share.py# 计算各层级在时尚消费市场中的份额占比def calculate_market_shares(spend_results: list) - list:计算各层级的市场份额占比total sum(r[total_fashion_spend] for r in spend_results)for r in spend_results:r[market_share_pct] round((r[total_fashion_spend] / total * 100) if total 0 else 0, 2)return spend_resultsdef map_to_fashion_segments(spend_results: list,brand_shares: dict) - list:将消费数据映射到时尚品类brand_shares 结构- luxury: 奢品在顶层的份额- designer: 设计师品牌在中层的份额- fast_fashion: 快时尚在底层的份额mappings [(top, luxury, 高端奢品),(mid, designer, 中端设计师品牌),(bot, fast_fashion, 平价快时尚),]results []for tier_key, segment_key, segment_name in mappings:spend spend_results[0 if tier_key top else (1 if tier_key mid else 2)]share brand_shares.get(segment_key, 0.10)addressable spend[total_fashion_spend] * shareresults.append({segment: segment_name,tier: spend[tier_name],total_market: spend[total_fashion_spend],brand_share: share,addressable_market: round(addressable, 2),market_share_pct: spend[market_share_pct],})return results4️⃣ 情景推演scenario.py# scenario.py# What-if 情景分析引擎def run_scenario(base_tiers: dict,base_fashion_ratio: float,base_mpc: float,brand_shares: dict,scenario_config: dict) - dict:运行一个情景并输出结果scenario_config 可覆盖- top_pct, mid_pct, bot_pct人口比例- fashion_spend_ratio- mpc- brand_sharesfrom modules.spend import calculate_all_tiersfrom modules.market_share import calculate_market_shares, map_to_fashion_segments# 应用情景参数tiers dict(base_tiers) # 浅拷贝if population_shift in scenario_config:shift scenario_config[population_shift]for key in [top, mid, bot]:if key in shift:tiers[key].population_pct shift[key]fashion_ratio scenario_config.get(fashion_spend_ratio, base_fashion_ratio)mpc scenario_config.get(mpc, base_mpc)shares scenario_config.get(brand_shares, brand_shares)# 计算spend calculate_all_tiers(tiers, fashion_ratio, mpc)spend calculate_market_shares(spend)segments map_to_fashion_segments(spend, shares)return {spend: spend, segments: segments}def compare_scenarios(base: dict, scenario: dict) - list:对比基准情景与测试情景的份额变化comparisons []for i, seg in enumerate(scenario[segments]):base_seg base[segments][i]delta seg[addressable_market] - base_seg[addressable_market]delta_pct (delta / base_seg[addressable_market] * 100)if base_seg[addressable_market] 0 else 0comparisons.append({segment: seg[segment],base_market: round(base_seg[addressable_market], 2),scenario_market: round(seg[addressable_market], 2),delta: round(delta, 2),delta_pct: round(delta_pct, 2),})return comparisons5️⃣ 结果输出reporter.py# reporter.py# 格式化输出分层消费分析结果def print_population_tiers(tiers: dict):输出人口分层概况print(f\n{*60})print(f 人口分层结构)print(f{*60})print(f {层级:16} {占比:8} {人口(万人):12} {人均收入(万元):16})print(f {-*58})for key in [top, mid, bot]:t tiers[key]pop_wan t.population_count / 10000income_wan t.avg_annual_income / 10000print(f {t.name:14} {t.population_pct*100:5.0f}% f{pop_wan:10,.0f} {income_wan:12.1f})def print_market_shares(spend_results: list):输出各层级市场份额print(f\n{*60})print(f 各层级时尚消费市场份额)print(f{*60})print(f {层级:16} {人均时尚消费(元):16} {总消费(亿元):14} {市场份额})print(f {-*60})for r in spend_results:total_wan r[total_fashion_spend] / 10000print(f {r[tier_name]:14} {r[fashion_spend_per_capita]:14.2f} f{total_wan:12,.2f} {r[market_share_pct]:5.1f}%)def print_segment_mapping(segments: list):输出时尚品类映射print(f\n{*60})print(f 时尚品类可触达市场)print(f{*60})print(f {品类:16} {对应层级:16} {品牌份额:8} {可触达市场(亿元):18})print(f {-*62})for s in segments:am_wan s[addressable_market] / 10000print(f {s[segment]:14} {s[tier]:16} {s[brand_share]*100:5.0f}% f{am_wan:14,.2f})def print_scenario_comparison(comp: list):输出情景对比print(f\n{*60})print(f 情景对比基准 vs 推演)print(f{*60})print(f {品类:14} {基准(亿元):14} {推演(亿元):14} {变化额(亿元):14} {变化率})print(f {-*68})for c in comp:base_wan c[base_market] / 10000scenario_wan c[scenario_market] / 10000delta_wan c[delta] / 10000print(f {c[segment]:14} {base_wan:14,.2f} {scenario_wan:14,.2f} f{delta_wan:14,.2f} {c[delta_pct]:10.1f}%)def print_summary_box(segments: list):输出一页纸摘要print(f\n{*60})print(f 一页纸摘要)print(f{*60})total sum(s[addressable_market] for s in segments)for s in segments:pct (s[addressable_market] / total * 100) if total 0 else 0am_wan s[addressable_market] / 10000print(f {s[segment]:14} 可触达市场: {am_wan:8,.2f} 亿元 f(占总体 {pct:.1f}%))print(f {─*50})print(f 合计可触达市场: {total/10000:,.2f} 亿元)6️⃣ 主程序main.py# main.pyimport yamlfrom modules.population import build_population_tiers, calculate_population_countsfrom modules.spend import calculate_all_tiersfrom modules.market_share import calculate_market_shares, map_to_fashion_segmentsfrom modules.scenario import run_scenario, compare_scenariosfrom modules.reporter import (print_population_tiers, print_market_shares,print_segment_mapping, print_scenario_comparison, print_summary_box)def load_cfg(path: str) - dict:with open(path, r, encodingutf-8) as f:return yaml.safe_load(f)if __name__ __main__:cfg load_cfg(config/consumption.yaml)total_pop cfg[population][total_wan] * 10000 # 万人 → 人# Step 1: 构建人口分层tiers build_population_tiers(total_pop)# 用配置覆盖默认比例for key in [top, mid, bot]:if key in cfg[population]:tiers[key].population_pct cfg[population][key]tiers[key].avg_annual_income cfg[population][f{key}_income]tiers[key].consumer_confidence cfg[population][f{key}_confidence]calculate_population_counts(tiers, total_pop)# Step 2: 基准情景消费测算fashion_ratio cfg[consumption][fashion_spend_ratio]mpc cfg[consumption][marginal_propensity_to_consume]spend calculate_all_tiers(tiers, fashion_ratio, mpc)spend calculate_market_shares(spend)brand_shares cfg[brand_shares]segments map_to_fashion_segments(spend, brand_shares)# Step 3: 情景推演scenario_cfg cfg.get(scenario, {})scenario_result Nonecomparison Noneif scenario_cfg:scenario_result run_scenario(tiers, fashion_ratio, mpc, brand_shares, scenario_cfg)comparison compare_scenarios({segments: segments},scenario_result)# ---- 输出 ----print(*60)print( M 型社会分层消费测算报告)print(*60)print(f\n社会总人口: {total_pop/10000:,.0f} 万人)print_population_tiers(tiers)print_market_shares(spend)print_segment_mapping(segments)if comparison:print_scenario_comparison(comparison)print_summary_box(segments)7️⃣ 配置文件config/consumption.yaml# M 型社会分层消费测算配置# 人口结构万人population:total_wan: 140000 # 总人口 14 亿# 三层人口占比总和 1top: 0.10 # 顶层 10%mid: 0.35 # 中层 35%bot: 0.55 # 底层 55%# 各层级人均年收入元top_income: 650000mid_income: 180000bot_income: 68000# 消费信心指数0~1top_confidence: 0.75mid_confidence: 0.55 # 中层被挤压信心偏低bot_confidence: 0.60# 消费参数consumption:fashion_spend_ratio: 0.08 # 时尚消费占消费支出的 8%marginal_propensity_to_consume: 0.70 # 边际消费倾向 70%# 品牌在各层级的份额brand_shares:luxury: 0.15 # 奢品占据顶层 15% 的时尚消费designer: 0.12 # 设计师品牌占据中层 12%fast_fashion: 0.25 # 快时尚占据底层 25%# 情景推演可选留空则跳过scenario:population_shift:top: 0.12 # 顶层扩张到 12%mid: 0.30 # 中层萎缩到 30%bot: 0.58 # 底层略扩到 58%fashion_spend_ratio: 0.10 # 时尚消费占比提升到 10%mpc: 0.70brand_shares:luxury: 0.18designer: 0.10 # 中层萎缩设计师品牌份额受压fast_fashion: 0.30六、README.md# M 型社会分层消费测算程序教学级社会分层消费分析工具用于测算高端奢品、中端设计师品牌、平价快时尚在 M 型社会结构下的市场份额与可触达市场容量。## 功能特点- M 型三层人口结构建模顶层/中层/底层- 基于收入、消费信心、边际消费倾向的时尚消费测算- 三层市场份额占比计算- 品牌可触达市场容量估算- What-if 情景推演人口结构变化、消费参数调整## 使用方法bashpip install pyyamlpython main.py## 适用对象- 时尚产业与品牌创新课程消费社会学模块- 品牌定位与市场细分策略教学- 社会分层与消费行为分析练习七、USAGE.md使用说明# 使用说明## 核心参数说明### population人口结构- total_wan社会总人口万人- top/mid/bot三层人口占比**三者之和必须为 1**- *_income各层级人均年收入元- *_confidence消费信心指数0~1反映敢不敢花钱### consumption消费参数- fashion_spend_ratio时尚消费占家庭消费支出的比例- 顶层通常 0.10~0.15更多钱花在奢侈品/体验上- 中层通常 0.06~0.10- 底层通常 0.03~0.06- marginal_propensity_to_consume边际消费倾向0~1- 底层通常较高0.75~0.85—— 赚的几乎都花了- 顶层通常较低0.50~0.65—— 储蓄率高### brand_shares品牌份额- luxury奢品在特定层级的份额通常 0.10~0.25- designer设计师品牌份额通常 0.08~0.18- fast_fashion快时尚份额通常 0.20~0.35## 典型实验### 实验 1中层萎缩推演- 将 mid 从 0.35 调到 0.25top 从 0.10 调到 0.18- 观察设计师品牌可触达市场的变化- **核心发现**中层每萎缩 1 个百分点设计师品牌市场可能缩水 3%~5%### 实验 2消费信心冲击- 将 mid_confidence 从 0.55 调到 0.35- 模拟经济下行对中层消费的压制效应### 实验 3时尚消费占比弹性- 将 fashion_spend_ratio 从 0.08 调到 0.15- 观察三层市场的蛋糕同步扩大但**顶层受益最大**## 输出解读- 市场份额该层级占整个时尚消费市场的百分比- 可触达市场品牌在该层级能吃到的营收上限亿元- 情景对比推演 vs 基准的变化额和变化率八、核心知识点卡片┌──────────────────────────────────────┐│ M 型社会结构 ││ 顶层和底层膨胀中层被挤压变薄 ││ 对应到时尚消费奢品和快时尚两头旺 ││ 中间设计师品牌生存空间最脆弱 │└──────────────────────────────────────┘┌──────────────────────────────────────┐│ 边际消费倾向MPC ││ 每多赚 1 元拿出多少来花 ││ 顶层 MPC 低 → 储蓄率高 ││ 底层 MPC 高 → 但总收入低 ││ 中层 MPC 中等 → 最怕收入不确定性 │└──────────────────────────────────────┘┌──────────────────────────────────────┐│ 可触达市场 ≠ 总市场 ││ 总市场是蛋糕多大 ││ 可触达市场是你能切走多少 ││ 两者的差距 品牌份额的发力空间 │└──────────────────────────────────────┘┌──────────────────────────────────────┐│ What-If 情景推演 ││ 改变人口比例 / 消费参数 / 品牌份额 ││ 观察市场份额的联动变化 ││ 是战略决策的核心模拟方法 │└──────────────────────────────────────┘九、总结中立立场本程序构建了一个结构化的 M 型社会分层消费测算框架- 核心洞察 1顶层虽然人口仅占 10%但因人均时尚消费额是底层的 10 倍以上其市场份额往往不低于 30%- 核心洞察 2中层是 M 型社会中最脆弱的一环——人口占比每下降 1 个百分点设计师品牌的可触达市场可能缩水 3%~5%- 核心洞察 3底层虽然人口占比最大但因边际消费倾向虽高、总收入有限快时尚的量大利薄困境是结构性的不是运营问题需要强调的是- 本模型为教学简化未考虑区域差异一线 vs 三四线城市的 M 型结构截然不同- 消费信心指数consumer_confidence是最敏感的变量应结合消费者调研数据校准- 品牌份额brand_share受竞争格局影响需动态更新该程序适合用于- 时尚产业与品牌创新课程中的消费社会学与品牌定位模块- 市场细分策略的量化决策工具- Python 分层建模与情景分析的教学案例如需进一步扩展可加入- 区域分层一线/新一线/二三线城市分别建模- 代际分层Z 世代 vs 千禧 vs 婴儿潮- Monte Carlo 模拟对收入分布做概率建模- Matplotlib 可视化三层人口金字塔 市场份额饼图 情景对比柱状图利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛