用 Python 构建东西方时尚审美差异量化分析程序通过对男女消费者的中西服饰偏好打分统计分析性别与文化背景对审美偏好的影响并以中立视角呈现分析结果。一、实际应用场景描述在《时尚产业与品牌创新》课程中跨文化审美差异是国际时尚品牌本土化战略的核心议题。具体表现为- 东方审美偏好含蓄、留白、对称、自然意象山水、花鸟、重意境与整体和谐感。- 西方审美偏好外放、曲线强调、视觉冲击、个体表达、重轮廓与比例张力。- 性别差异研究表明男性消费者普遍更看重功能性身份象征女性消费者更关注美学细节情感共鸣但在不同文化背景下表现不同。品牌面临核心问题做全球化产品时如何平衡东西方审美差异男女消费者的跨文化偏好是否存在显著差异哪些设计要素是审美公约数本程序用 Python 构建审美维度评分 性别×文化双因素方差分析 可视化对比的完整统计框架量化东西方时尚审美差异。二、引入痛点- 审美偏好研究多停留在东方含蓄、西方奔放的定性描述缺乏可量化的维度评分体系。- 真实跨文化消费者调研成本高需中英美法日等多国样本手工整理问卷数据效率低。- 缺乏统计检验框架来判断男女审美差异是否显著东西方差异是否大于性别差异等核心问题。⇒ 用 Python 构建合成问卷数据 多维度 ANOVA 分析 可视化仪表盘模拟完整分析流程。三、核心逻辑讲解1. 审美维度设计基于审美心理学与时尚理论提炼六大可量化审美维度维度 说明 东方偏好方向 西方偏好方向色彩饱和度Color Saturation 0低饱和莫兰迪 100高饱和撞色 偏中低饱和 偏高饱和剪裁复杂度Cut Complexity 0极简直线 100多层叠搭 偏简约流畅 偏结构感装饰密度Ornamentation 0无装饰 100满绣满印 偏意境留白 偏繁复装饰轮廓夸张度Silhouette Boldness 0贴身自然 100夸张廓形 偏自然垂坠 偏结构夸张文化符号强度Cultural Symbolism 0无文化标识 100强文化符号 偏含蓄隐喻 偏直白表达功能性权重Functionality Weight 0纯装饰 100纯功能 偏装饰意境 偏功能实用2. 性别×文化双因素模型审美偏好得分 基础分 文化效应 性别效应 交互效应 随机噪声其中- 文化效应东方 vs 西方的整体偏移- 性别效应男性 vs 女性的整体偏移- 交互效应文化×性别的交叉影响如东方男性 vs 西方女性的差异模式不同3. 统计方法- 描述性统计各维度均值、标准差、分布- 独立样本 t 检验东西方差异是否显著 / 男女差异是否显著- 双因素 ANOVA文化 × 性别 交互效应检验- 效应量Cohens d差异的实际意义大小而非仅看 p 值四、代码模块化aesthetic_preference_analysis.py#!/usr/bin/env python3# -*- coding: utf-8 -*-aesthetic_preference_analysis.py东西方时尚审美差异量化分析男女消费者对中西服饰偏好的统计建模与显著性检验依赖: numpy, pandas, matplotlib, scipy, statsmodels安装: pip install numpy pandas matplotlib scipy statsmodelsimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom matplotlib import rcParamsfrom scipy import statsimport statsmodels.api as smfrom statsmodels.formula.api import olsfrom dataclasses import dataclass, fieldfrom typing import Dict, List, Tuplefrom enum import Enum# 中文字体设置rcParams[font.sans-serif] [Noto Sans CJK SC, SimHei, Microsoft YaHei]rcParams[axes.unicode_minus] False# ──────────────────────────────────────────────# 1. 枚举与配置模块# ──────────────────────────────────────────────class Culture(Enum):文化背景EAST 东方WEST 西方class Gender(Enum):性别MALE 男性FEMALE 女性dataclassclass AestheticDimension:审美维度定义name_en: strname_cn: strdescription: str# 东西方基准偏移0-100 量表east_base: floatwest_base: float# 性别偏移叠加在文化基准上male_shift: floatfemale_shift: float# 交互效应强度文化×性别interaction_strength: float# 组内标准差std: float# ──────────────────────────────────────────────# 2. 审美维度数据库模块# ──────────────────────────────────────────────class AestheticDatabase:东西方时尚审美维度评分体系基于审美心理学文献与跨文化时尚研究综合构建staticmethoddef get_dimensions() - Dict[str, AestheticDimension]:返回六大审美维度的完整定义return {color_saturation: AestheticDimension(name_enColor Saturation,name_cn色彩饱和度,description对色彩鲜艳/柔和程度的偏好,east_base35, west_base65,male_shift-5, female_shift8,interaction_strength0.3, std15),cut_complexity: AestheticDimension(name_enCut Complexity,name_cn剪裁复杂度,description对服装结构层次感的偏好,east_base40, west_base60,male_shift-3, female_shift5,interaction_strength0.2, std12),ornamentation: AestheticDimension(name_enOrnamentation,name_cn装饰密度,description对装饰元素刺绣/印花/铆钉等的接受度,east_base55, west_base50,male_shift-12, female_shift10,interaction_strength0.5, std18),silhouette_boldness: AestheticDimension(name_enSilhouette Boldness,name_cn轮廓夸张度,description对廓形夸张程度的接受度,east_base30, west_base70,male_shift-8, female_shift5,interaction_strength0.4, std16),cultural_symbolism: AestheticDimension(name_enCultural Symbolism,name_cn文化符号强度,description对显性文化标识龙纹/十字架/图腾等的偏好,east_base45, west_base55,male_shift3, female_shift-2,interaction_strength0.3, std14),functionality_weight: AestheticDimension(name_enFunctionality Weight,name_cn功能性权重,description对服装实用功能口袋/防水/多用途的重视程度,east_base50, west_base55,male_shift15, female_shift-8,interaction_strength0.6, std13)}# ──────────────────────────────────────────────# 3. 合成数据生成模块# ──────────────────────────────────────────────class SurveyDataGenerator:生成模拟的消费者审美偏好问卷数据基于维度定义中的文化/性别效应叠加生成PERCEIVED_QUALITY_BASE {Culture.EAST: {Gender.MALE: 62, Gender.FEMALE: 68},Culture.WEST: {Gender.MALE: 58, Gender.FEMALE: 72}}SAMPLE_SIZE_PER_CELL 150 # 每个 文化×性别 组合的样本量classmethoddef generate(cls, seed: int 42) - pd.DataFrame:生成完整问卷数据集每行 一位受访者对六大维度的评分0-100加上人口统计变量与综合审美得分np.random.seed(seed)dims AestheticDatabase.get_dimensions()rows []for culture in Culture:for gender in Gender:n cls.SAMPLE_SIZE_PER_CELLfor i in range(n):respondent {respondent_id: f{culture.name[:1]}{gender.name[:1]}_{i:04d},culture: culture.value,culture_code: 0 if culture Culture.EAST else 1,gender: gender.value,gender_code: 0 if gender Gender.MALE else 1,}# 各维度评分total_score 0for key, dim in dims.items():base dim.east_base if culture Culture.EAST else dim.west_basegender_shift (dim.male_shift if gender Gender.MALEelse dim.female_shift)interaction (dim.interaction_strength* (1 if culture Culture.WEST else -1)* (1 if gender Gender.FEMALE else -1))true_score base gender_shift interactionnoise np.random.normal(0, dim.std)final_score np.clip(true_score noise, 0, 100)respondent[key] round(final_score, 1)total_score final_score# 综合审美得分标准化到 0-100respondent[overall_aesthetic_score] round(total_score / len(dims), 1)# 人口统计模拟年龄、收入层级respondent[age] int(np.random.choice([22, 27, 32, 37, 42, 47],p[0.15, 0.30, 0.25, 0.15, 0.10, 0.05]))respondent[income_tier] np.random.choice([Low, Mid, High], p[0.25, 0.50, 0.25])rows.append(respondent)return pd.DataFrame(rows)# ──────────────────────────────────────────────# 4. 统计分析模块# ──────────────────────────────────────────────class AestheticAnalyzer:核心统计分析引擎DIMENSION_KEYS list(AestheticDatabase.get_dimensions().keys())DIMENSION_NAMES {k: v.name_cn for k, v in AestheticDatabase.get_dimensions().items()}classmethoddef describe_by_group(cls, df: pd.DataFrame,group_cols: List[str]) - pd.DataFrame:按分组计算各维度描述性统计return df.groupby(group_cols)[cls.DIMENSION_KEYS].agg([mean, std, count]).round(2)classmethoddef t_test_culture(cls, df: pd.DataFrame) - pd.DataFrame:东西方差异 t 检验全样本results []for key in cls.DIMENSION_KEYS:east df[df[culture] Culture.EAST.value][key]west df[df[culture] Culture.WEST.value][key]t_stat, p_value stats.ttest_ind(east, west, equal_varFalse)cohen_d (east.mean() - west.mean()) / np.sqrt((east.std()**2 west.std()**2) / 2)results.append({dimension: cls.DIMENSION_NAMES[key],east_mean: round(east.mean(), 2),west_mean: round(west.mean(), 2),diff: round(east.mean() - west.mean(), 2),t_statistic: round(t_stat, 3),p_value: round(p_value, 4),cohen_d: round(cohen_d, 3),significant: p_value 0.05,sig_level: (** if p_value 0.01else * if p_value 0.05 else ns)})return pd.DataFrame(results)classmethoddef t_test_gender(cls, df: pd.DataFrame) - pd.DataFrame:男女差异 t 检验全样本results []for key in cls.DIMENSION_KEYS:male df[df[gender] Gender.MALE.value][key]female df[df[gender] Gender.FEMALE.value][key]t_stat, p_value stats.ttest_ind(male, female, equal_varFalse)cohen_d (male.mean() - female.mean()) / np.sqrt((male.std()**2 female.std()**2) / 2)results.append({dimension: cls.DIMENSION_NAMES[key],male_mean: round(male.mean(), 2),female_mean: round(female.mean(), 2),diff: round(male.mean() - female.mean(), 2),t_statistic: round(t_stat, 3),p_value: round(p_value, 4),cohen_d: round(cohen_d, 3),significant: p_value 0.05,sig_level: (** if p_value 0.01else * if p_value 0.05 else ns)})return pd.DataFrame(results)classmethoddef two_way_anova(cls, df: pd.DataFrame) - pd.DataFrame:双因素 ANOVA文化 × 性别 对综合审美得分的影响results []for key in cls.DIMENSION_KEYS [overall_aesthetic_score]:# 构建 OLS 模型formula f{key} ~ C(culture) * C(gender)model ols(formula, datadf).fit()anova_table sm.stats.anova_lm(model, typ2)row {dimension: cls.DIMENSION_NAMES.get(key, key)}# 提取各效应for effect in [C(culture), C(gender), C(culture):C(gender)]:if effect in anova_table.index:row[f{effect}_F] round(anova_table.loc[effect, F], 3)row[f{effect}_p] round(anova_table.loc[effect, PR(F)], 4)row[f{effect}_sig] (** if row[f{effect}_p] 0.01else * if row[f{effect}_p] 0.05else ns)else:row[f{effect}_F] np.nanrow[f{effect}_p] np.nanrow[f{effect}_sig] —results.append(row)return pd.DataFrame(results)classmethoddef find_aesthetic_overlap(cls, df: pd.DataFrame) - pd.DataFrame:寻找审美公约数——东西方男女都给出高分的维度results []for key in cls.DIMENSION_KEYS:east_male df[(df[culture] 东方) (df[gender] 男性)][key].mean()east_female df[(df[culture] 东方) (df[gender] 女性)][key].mean()west_male df[(df[culture] 西方) (df[gender] 男性)][key].mean()west_female df[(df[culture] 西方) (df[gender] 女性)][key].mean()overall_mean df[key].mean()min_group min(east_male, east_female, west_male, west_female)max_group max(east_male, east_female, west_male, west_female)spread max_group - min_groupresults.append({dimension: cls.DIMENSION_NAMES[key],east_male: round(east_male, 1),east_female: round(east_female, 1),west_male: round(west_male, 1),west_female: round(west_female, 1),overall_mean: round(overall_mean, 1),min: round(min_group, 1),max: round(max_group, 1),spread: round(spread, 1),is_consensus: spread 15 # 四组差异 15 分视为共识区})return pd.DataFrame(results)# ──────────────────────────────────────────────# 5. 可视化仪表盘模块# ──────────────────────────────────────────────class Dashboard:多面板可视化仪表盘CULTURE_COLORS {东方: #E74C3C, 西方: #3498DB}GENDER_MARKERS {男性: s, 女性: o}GENDER_COLORS {男性: #2C3E50, 女性: #E91E63}DIMENSION_SHORT {color_saturation: 色彩饱和度,cut_complexity: 剪裁复杂度,ornamentation: 装饰密度,silhouette_boldness: 轮廓夸张度,cultural_symbolism: 文化符号,functionality_weight: 功能性}classmethoddef plot_dashboard(cls,df: pd.DataFrame,culture_ttest: pd.DataFrame,gender_ttest: pd.DataFrame,anova_df: pd.DataFrame,overlap_df: pd.DataFrame,filename: str aesthetic_preference_dashboard.png):fig plt.figure(figsize(24, 20))fig.suptitle(东西方时尚审美差异量化分析,fontsize22, fontweightbold, y0.99)# ── 图1文化×性别 分组雷达图 ──ax1 fig.add_subplot(3, 2, 1, polarTrue)cls._plot_group_radar(ax1, df)# ── 图2东西方差异Cohens d 森林图 ──ax2 fig.add_subplot(3, 2, 2)cls._plot_culture_effect(ax2, culture_ttest)# ── 图3男女差异分维度箱线图 ──ax3 fig.add_subplot(3, 2, 3)cls._plot_gender_boxplot(ax3, df)# ── 图4双因素 ANOVA 热力图 ──ax4 fig.add_subplot(3, 2, 4)cls._plot_anova_heatmap(ax4, anova_df)# ── 图5审美公约数 ──ax5 fig.add_subplot(3, 2, 5)cls._plot_overlap_chart(ax5, overlap_df)# ── 图6综合审美得分分布 ──ax6 fig.add_subplot(3, 2, 6)cls._plot_overall_distribution(ax6, df)plt.tight_layout(rect[0, 0, 1, 0.96])plt.savefig(filename, dpi150, bbox_inchestight)plt.show()print(f[INFO] 仪表盘已保存: {filename})classmethoddef _plot_group_radar(cls, ax, df: pd.DataFrame):四组东西×男女雷达图dims list(cls.DIMENSION_SHORT.keys())angles np.linspace(0, 2 * np.pi, len(dims), endpointFalse).tolist()angles angles[:1]ax.set_theta_offset(np.pi / 2)ax.set_theta_direction(-1)for culture in [东方, 西方]:for gender in [男性, 女性]:subset df[(df[culture] culture) (df[gender] gender)]values []for d in dims:values.append(subset[d].mean())values values[:1]color cls.CULTURE_COLORS[culture]marker cls.GENDER_MARKERS[gender]linestyle - if gender 女性 else --label f{culture}{gender}ax.plot(angles, values, marker, linestylelinestyle,colorcolor, linewidth1.5, markersize4, labellabel)ax.fill(angles, values, alpha0.03, colorcolor)ax.set_xticks(angles[:-1])ax.set_xticklabels([cls.DIMENSION_SHORT[d] for d in dims], fontsize8)ax.set_ylim(0, 100)ax.set_title(文化×性别 审美维度画像, fontsize13, fontweightbold, pad15)ax.legend(fontsize7, locupper right, bbox_to_anchor(1.25, 1.1))classmethoddef _plot_culture_effect(cls, ax, ttest_df: pd.DataFrame):东西方差异 Cohens d 森林图df ttest_df.sort_values(cohen_d)y_pos range(len(df))colors []for _, row in df.iterrows():if row[significant] and abs(row[cohen_d]) 0.5:colors.append(#e74c3c)elif row[significant]:colors.append(#f39c12)else:colors.append(#95a5a6)ax.barh(y_pos, df[cohen_d], colorcolors, edgecolorwhite)ax.set_yticks(y_pos)ax.set_yticklabels(df[dimension], fontsize9)ax.set_xlabel(Cohens d负东方高于西方)ax.set_title(东西方审美差异效应量, fontsize13, fontweightbold)# 标注数值for i, (_, row) in enumerate(df.iterrows()):sig row[sig_level]ax.text(row[cohen_d] (0.05 if row[cohen_d] 0 else -0.05),i, f{row[cohen_d]:.2f} {sig},vacenter, fontsize8, fontweightbold,haleft if row[cohen_d] 0 else right)ax.axvline(x0, colorgray, linewidth0.8)ax.axvline(x-0.5, colorgray, linestyle:, alpha0.5)ax.axvline(x0.5, colorgray, linestyle:, alpha0.5)ax.grid(axisx, alpha0.3)classmethoddef _plot_gender_boxplot(cls, ax, df: pd.DataFrame):男女差异箱线图分维度dims list(cls.DIMENSION_SHORT.keys())data_by_group []labels []colors []for dim in dims:for gender in [男性, 女性]:subset df[df[gender] gender][dim]if len(subset) 0:data_by_group.append(subset.values)labels.append(f{cls.DIMENSION_SHORT[dim]}-{gender})colors.append(cls.GENDER_COLORS[gender])if len(data_by_group) 0:bp ax.boxplot(data_by_group, patch_artistTrue, labelslabels,medianpropsdict(colorblack, linewidth2))for patch, color in zip(bp[boxes], colors):patch.set_facecolor(color)patch.set_alpha(0.5)ax.set_ylabel(评分 (0-100))ax.set_title(男女审美差异分布, fontsize13, fontweightbold)ax.tick_params(axisx, rotation45, labelsize7)ax.grid(axisy, alpha0.3)classmethoddef _plot_anova_heatmap(cls, ax, anova_df: pd.DataFrame):ANOVA F 值热力图# 提取文化主效应和性别主效应的 F 值dims anova_df[dimension].tolist()culture_f []gender_f []interaction_f []for _, row in anova_df.iterrows():culture_f.append(row.get(C(culture)_F, np.nan))gender_f.append(row.get(C(gender)_F, np.nan))interaction_f.append(row.get(C(culture):C(gender)_F, np.nan))data np.array([culture_f, gender_f, interaction_f])im ax.imshow(data, cmapYlOrRd, aspectauto)ax.set_xticks(range(len(dims)))ax.set_xticklabels(dims, rotation30, haright, fontsize8)ax.set_yticks(range(3))ax.set_yticklabels([文化主效应, 性别主效应, 交互效应], fontsize9)for i in range(3):for j in range(len(dims)):val data[i, j]if not np.isnan(val):ax.text(j, i, f{val:.1f}, ha利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛
东西方时尚审美差异量化程序,分别统计男女消费者对中西服饰偏好打分。
发布时间:2026/6/25 22:31:44
用 Python 构建东西方时尚审美差异量化分析程序通过对男女消费者的中西服饰偏好打分统计分析性别与文化背景对审美偏好的影响并以中立视角呈现分析结果。一、实际应用场景描述在《时尚产业与品牌创新》课程中跨文化审美差异是国际时尚品牌本土化战略的核心议题。具体表现为- 东方审美偏好含蓄、留白、对称、自然意象山水、花鸟、重意境与整体和谐感。- 西方审美偏好外放、曲线强调、视觉冲击、个体表达、重轮廓与比例张力。- 性别差异研究表明男性消费者普遍更看重功能性身份象征女性消费者更关注美学细节情感共鸣但在不同文化背景下表现不同。品牌面临核心问题做全球化产品时如何平衡东西方审美差异男女消费者的跨文化偏好是否存在显著差异哪些设计要素是审美公约数本程序用 Python 构建审美维度评分 性别×文化双因素方差分析 可视化对比的完整统计框架量化东西方时尚审美差异。二、引入痛点- 审美偏好研究多停留在东方含蓄、西方奔放的定性描述缺乏可量化的维度评分体系。- 真实跨文化消费者调研成本高需中英美法日等多国样本手工整理问卷数据效率低。- 缺乏统计检验框架来判断男女审美差异是否显著东西方差异是否大于性别差异等核心问题。⇒ 用 Python 构建合成问卷数据 多维度 ANOVA 分析 可视化仪表盘模拟完整分析流程。三、核心逻辑讲解1. 审美维度设计基于审美心理学与时尚理论提炼六大可量化审美维度维度 说明 东方偏好方向 西方偏好方向色彩饱和度Color Saturation 0低饱和莫兰迪 100高饱和撞色 偏中低饱和 偏高饱和剪裁复杂度Cut Complexity 0极简直线 100多层叠搭 偏简约流畅 偏结构感装饰密度Ornamentation 0无装饰 100满绣满印 偏意境留白 偏繁复装饰轮廓夸张度Silhouette Boldness 0贴身自然 100夸张廓形 偏自然垂坠 偏结构夸张文化符号强度Cultural Symbolism 0无文化标识 100强文化符号 偏含蓄隐喻 偏直白表达功能性权重Functionality Weight 0纯装饰 100纯功能 偏装饰意境 偏功能实用2. 性别×文化双因素模型审美偏好得分 基础分 文化效应 性别效应 交互效应 随机噪声其中- 文化效应东方 vs 西方的整体偏移- 性别效应男性 vs 女性的整体偏移- 交互效应文化×性别的交叉影响如东方男性 vs 西方女性的差异模式不同3. 统计方法- 描述性统计各维度均值、标准差、分布- 独立样本 t 检验东西方差异是否显著 / 男女差异是否显著- 双因素 ANOVA文化 × 性别 交互效应检验- 效应量Cohens d差异的实际意义大小而非仅看 p 值四、代码模块化aesthetic_preference_analysis.py#!/usr/bin/env python3# -*- coding: utf-8 -*-aesthetic_preference_analysis.py东西方时尚审美差异量化分析男女消费者对中西服饰偏好的统计建模与显著性检验依赖: numpy, pandas, matplotlib, scipy, statsmodels安装: pip install numpy pandas matplotlib scipy statsmodelsimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom matplotlib import rcParamsfrom scipy import statsimport statsmodels.api as smfrom statsmodels.formula.api import olsfrom dataclasses import dataclass, fieldfrom typing import Dict, List, Tuplefrom enum import Enum# 中文字体设置rcParams[font.sans-serif] [Noto Sans CJK SC, SimHei, Microsoft YaHei]rcParams[axes.unicode_minus] False# ──────────────────────────────────────────────# 1. 枚举与配置模块# ──────────────────────────────────────────────class Culture(Enum):文化背景EAST 东方WEST 西方class Gender(Enum):性别MALE 男性FEMALE 女性dataclassclass AestheticDimension:审美维度定义name_en: strname_cn: strdescription: str# 东西方基准偏移0-100 量表east_base: floatwest_base: float# 性别偏移叠加在文化基准上male_shift: floatfemale_shift: float# 交互效应强度文化×性别interaction_strength: float# 组内标准差std: float# ──────────────────────────────────────────────# 2. 审美维度数据库模块# ──────────────────────────────────────────────class AestheticDatabase:东西方时尚审美维度评分体系基于审美心理学文献与跨文化时尚研究综合构建staticmethoddef get_dimensions() - Dict[str, AestheticDimension]:返回六大审美维度的完整定义return {color_saturation: AestheticDimension(name_enColor Saturation,name_cn色彩饱和度,description对色彩鲜艳/柔和程度的偏好,east_base35, west_base65,male_shift-5, female_shift8,interaction_strength0.3, std15),cut_complexity: AestheticDimension(name_enCut Complexity,name_cn剪裁复杂度,description对服装结构层次感的偏好,east_base40, west_base60,male_shift-3, female_shift5,interaction_strength0.2, std12),ornamentation: AestheticDimension(name_enOrnamentation,name_cn装饰密度,description对装饰元素刺绣/印花/铆钉等的接受度,east_base55, west_base50,male_shift-12, female_shift10,interaction_strength0.5, std18),silhouette_boldness: AestheticDimension(name_enSilhouette Boldness,name_cn轮廓夸张度,description对廓形夸张程度的接受度,east_base30, west_base70,male_shift-8, female_shift5,interaction_strength0.4, std16),cultural_symbolism: AestheticDimension(name_enCultural Symbolism,name_cn文化符号强度,description对显性文化标识龙纹/十字架/图腾等的偏好,east_base45, west_base55,male_shift3, female_shift-2,interaction_strength0.3, std14),functionality_weight: AestheticDimension(name_enFunctionality Weight,name_cn功能性权重,description对服装实用功能口袋/防水/多用途的重视程度,east_base50, west_base55,male_shift15, female_shift-8,interaction_strength0.6, std13)}# ──────────────────────────────────────────────# 3. 合成数据生成模块# ──────────────────────────────────────────────class SurveyDataGenerator:生成模拟的消费者审美偏好问卷数据基于维度定义中的文化/性别效应叠加生成PERCEIVED_QUALITY_BASE {Culture.EAST: {Gender.MALE: 62, Gender.FEMALE: 68},Culture.WEST: {Gender.MALE: 58, Gender.FEMALE: 72}}SAMPLE_SIZE_PER_CELL 150 # 每个 文化×性别 组合的样本量classmethoddef generate(cls, seed: int 42) - pd.DataFrame:生成完整问卷数据集每行 一位受访者对六大维度的评分0-100加上人口统计变量与综合审美得分np.random.seed(seed)dims AestheticDatabase.get_dimensions()rows []for culture in Culture:for gender in Gender:n cls.SAMPLE_SIZE_PER_CELLfor i in range(n):respondent {respondent_id: f{culture.name[:1]}{gender.name[:1]}_{i:04d},culture: culture.value,culture_code: 0 if culture Culture.EAST else 1,gender: gender.value,gender_code: 0 if gender Gender.MALE else 1,}# 各维度评分total_score 0for key, dim in dims.items():base dim.east_base if culture Culture.EAST else dim.west_basegender_shift (dim.male_shift if gender Gender.MALEelse dim.female_shift)interaction (dim.interaction_strength* (1 if culture Culture.WEST else -1)* (1 if gender Gender.FEMALE else -1))true_score base gender_shift interactionnoise np.random.normal(0, dim.std)final_score np.clip(true_score noise, 0, 100)respondent[key] round(final_score, 1)total_score final_score# 综合审美得分标准化到 0-100respondent[overall_aesthetic_score] round(total_score / len(dims), 1)# 人口统计模拟年龄、收入层级respondent[age] int(np.random.choice([22, 27, 32, 37, 42, 47],p[0.15, 0.30, 0.25, 0.15, 0.10, 0.05]))respondent[income_tier] np.random.choice([Low, Mid, High], p[0.25, 0.50, 0.25])rows.append(respondent)return pd.DataFrame(rows)# ──────────────────────────────────────────────# 4. 统计分析模块# ──────────────────────────────────────────────class AestheticAnalyzer:核心统计分析引擎DIMENSION_KEYS list(AestheticDatabase.get_dimensions().keys())DIMENSION_NAMES {k: v.name_cn for k, v in AestheticDatabase.get_dimensions().items()}classmethoddef describe_by_group(cls, df: pd.DataFrame,group_cols: List[str]) - pd.DataFrame:按分组计算各维度描述性统计return df.groupby(group_cols)[cls.DIMENSION_KEYS].agg([mean, std, count]).round(2)classmethoddef t_test_culture(cls, df: pd.DataFrame) - pd.DataFrame:东西方差异 t 检验全样本results []for key in cls.DIMENSION_KEYS:east df[df[culture] Culture.EAST.value][key]west df[df[culture] Culture.WEST.value][key]t_stat, p_value stats.ttest_ind(east, west, equal_varFalse)cohen_d (east.mean() - west.mean()) / np.sqrt((east.std()**2 west.std()**2) / 2)results.append({dimension: cls.DIMENSION_NAMES[key],east_mean: round(east.mean(), 2),west_mean: round(west.mean(), 2),diff: round(east.mean() - west.mean(), 2),t_statistic: round(t_stat, 3),p_value: round(p_value, 4),cohen_d: round(cohen_d, 3),significant: p_value 0.05,sig_level: (** if p_value 0.01else * if p_value 0.05 else ns)})return pd.DataFrame(results)classmethoddef t_test_gender(cls, df: pd.DataFrame) - pd.DataFrame:男女差异 t 检验全样本results []for key in cls.DIMENSION_KEYS:male df[df[gender] Gender.MALE.value][key]female df[df[gender] Gender.FEMALE.value][key]t_stat, p_value stats.ttest_ind(male, female, equal_varFalse)cohen_d (male.mean() - female.mean()) / np.sqrt((male.std()**2 female.std()**2) / 2)results.append({dimension: cls.DIMENSION_NAMES[key],male_mean: round(male.mean(), 2),female_mean: round(female.mean(), 2),diff: round(male.mean() - female.mean(), 2),t_statistic: round(t_stat, 3),p_value: round(p_value, 4),cohen_d: round(cohen_d, 3),significant: p_value 0.05,sig_level: (** if p_value 0.01else * if p_value 0.05 else ns)})return pd.DataFrame(results)classmethoddef two_way_anova(cls, df: pd.DataFrame) - pd.DataFrame:双因素 ANOVA文化 × 性别 对综合审美得分的影响results []for key in cls.DIMENSION_KEYS [overall_aesthetic_score]:# 构建 OLS 模型formula f{key} ~ C(culture) * C(gender)model ols(formula, datadf).fit()anova_table sm.stats.anova_lm(model, typ2)row {dimension: cls.DIMENSION_NAMES.get(key, key)}# 提取各效应for effect in [C(culture), C(gender), C(culture):C(gender)]:if effect in anova_table.index:row[f{effect}_F] round(anova_table.loc[effect, F], 3)row[f{effect}_p] round(anova_table.loc[effect, PR(F)], 4)row[f{effect}_sig] (** if row[f{effect}_p] 0.01else * if row[f{effect}_p] 0.05else ns)else:row[f{effect}_F] np.nanrow[f{effect}_p] np.nanrow[f{effect}_sig] —results.append(row)return pd.DataFrame(results)classmethoddef find_aesthetic_overlap(cls, df: pd.DataFrame) - pd.DataFrame:寻找审美公约数——东西方男女都给出高分的维度results []for key in cls.DIMENSION_KEYS:east_male df[(df[culture] 东方) (df[gender] 男性)][key].mean()east_female df[(df[culture] 东方) (df[gender] 女性)][key].mean()west_male df[(df[culture] 西方) (df[gender] 男性)][key].mean()west_female df[(df[culture] 西方) (df[gender] 女性)][key].mean()overall_mean df[key].mean()min_group min(east_male, east_female, west_male, west_female)max_group max(east_male, east_female, west_male, west_female)spread max_group - min_groupresults.append({dimension: cls.DIMENSION_NAMES[key],east_male: round(east_male, 1),east_female: round(east_female, 1),west_male: round(west_male, 1),west_female: round(west_female, 1),overall_mean: round(overall_mean, 1),min: round(min_group, 1),max: round(max_group, 1),spread: round(spread, 1),is_consensus: spread 15 # 四组差异 15 分视为共识区})return pd.DataFrame(results)# ──────────────────────────────────────────────# 5. 可视化仪表盘模块# ──────────────────────────────────────────────class Dashboard:多面板可视化仪表盘CULTURE_COLORS {东方: #E74C3C, 西方: #3498DB}GENDER_MARKERS {男性: s, 女性: o}GENDER_COLORS {男性: #2C3E50, 女性: #E91E63}DIMENSION_SHORT {color_saturation: 色彩饱和度,cut_complexity: 剪裁复杂度,ornamentation: 装饰密度,silhouette_boldness: 轮廓夸张度,cultural_symbolism: 文化符号,functionality_weight: 功能性}classmethoddef plot_dashboard(cls,df: pd.DataFrame,culture_ttest: pd.DataFrame,gender_ttest: pd.DataFrame,anova_df: pd.DataFrame,overlap_df: pd.DataFrame,filename: str aesthetic_preference_dashboard.png):fig plt.figure(figsize(24, 20))fig.suptitle(东西方时尚审美差异量化分析,fontsize22, fontweightbold, y0.99)# ── 图1文化×性别 分组雷达图 ──ax1 fig.add_subplot(3, 2, 1, polarTrue)cls._plot_group_radar(ax1, df)# ── 图2东西方差异Cohens d 森林图 ──ax2 fig.add_subplot(3, 2, 2)cls._plot_culture_effect(ax2, culture_ttest)# ── 图3男女差异分维度箱线图 ──ax3 fig.add_subplot(3, 2, 3)cls._plot_gender_boxplot(ax3, df)# ── 图4双因素 ANOVA 热力图 ──ax4 fig.add_subplot(3, 2, 4)cls._plot_anova_heatmap(ax4, anova_df)# ── 图5审美公约数 ──ax5 fig.add_subplot(3, 2, 5)cls._plot_overlap_chart(ax5, overlap_df)# ── 图6综合审美得分分布 ──ax6 fig.add_subplot(3, 2, 6)cls._plot_overall_distribution(ax6, df)plt.tight_layout(rect[0, 0, 1, 0.96])plt.savefig(filename, dpi150, bbox_inchestight)plt.show()print(f[INFO] 仪表盘已保存: {filename})classmethoddef _plot_group_radar(cls, ax, df: pd.DataFrame):四组东西×男女雷达图dims list(cls.DIMENSION_SHORT.keys())angles np.linspace(0, 2 * np.pi, len(dims), endpointFalse).tolist()angles angles[:1]ax.set_theta_offset(np.pi / 2)ax.set_theta_direction(-1)for culture in [东方, 西方]:for gender in [男性, 女性]:subset df[(df[culture] culture) (df[gender] gender)]values []for d in dims:values.append(subset[d].mean())values values[:1]color cls.CULTURE_COLORS[culture]marker cls.GENDER_MARKERS[gender]linestyle - if gender 女性 else --label f{culture}{gender}ax.plot(angles, values, marker, linestylelinestyle,colorcolor, linewidth1.5, markersize4, labellabel)ax.fill(angles, values, alpha0.03, colorcolor)ax.set_xticks(angles[:-1])ax.set_xticklabels([cls.DIMENSION_SHORT[d] for d in dims], fontsize8)ax.set_ylim(0, 100)ax.set_title(文化×性别 审美维度画像, fontsize13, fontweightbold, pad15)ax.legend(fontsize7, locupper right, bbox_to_anchor(1.25, 1.1))classmethoddef _plot_culture_effect(cls, ax, ttest_df: pd.DataFrame):东西方差异 Cohens d 森林图df ttest_df.sort_values(cohen_d)y_pos range(len(df))colors []for _, row in df.iterrows():if row[significant] and abs(row[cohen_d]) 0.5:colors.append(#e74c3c)elif row[significant]:colors.append(#f39c12)else:colors.append(#95a5a6)ax.barh(y_pos, df[cohen_d], colorcolors, edgecolorwhite)ax.set_yticks(y_pos)ax.set_yticklabels(df[dimension], fontsize9)ax.set_xlabel(Cohens d负东方高于西方)ax.set_title(东西方审美差异效应量, fontsize13, fontweightbold)# 标注数值for i, (_, row) in enumerate(df.iterrows()):sig row[sig_level]ax.text(row[cohen_d] (0.05 if row[cohen_d] 0 else -0.05),i, f{row[cohen_d]:.2f} {sig},vacenter, fontsize8, fontweightbold,haleft if row[cohen_d] 0 else right)ax.axvline(x0, colorgray, linewidth0.8)ax.axvline(x-0.5, colorgray, linestyle:, alpha0.5)ax.axvline(x0.5, colorgray, linestyle:, alpha0.5)ax.grid(axisx, alpha0.3)classmethoddef _plot_gender_boxplot(cls, ax, df: pd.DataFrame):男女差异箱线图分维度dims list(cls.DIMENSION_SHORT.keys())data_by_group []labels []colors []for dim in dims:for gender in [男性, 女性]:subset df[df[gender] gender][dim]if len(subset) 0:data_by_group.append(subset.values)labels.append(f{cls.DIMENSION_SHORT[dim]}-{gender})colors.append(cls.GENDER_COLORS[gender])if len(data_by_group) 0:bp ax.boxplot(data_by_group, patch_artistTrue, labelslabels,medianpropsdict(colorblack, linewidth2))for patch, color in zip(bp[boxes], colors):patch.set_facecolor(color)patch.set_alpha(0.5)ax.set_ylabel(评分 (0-100))ax.set_title(男女审美差异分布, fontsize13, fontweightbold)ax.tick_params(axisx, rotation45, labelsize7)ax.grid(axisy, alpha0.3)classmethoddef _plot_anova_heatmap(cls, ax, anova_df: pd.DataFrame):ANOVA F 值热力图# 提取文化主效应和性别主效应的 F 值dims anova_df[dimension].tolist()culture_f []gender_f []interaction_f []for _, row in anova_df.iterrows():culture_f.append(row.get(C(culture)_F, np.nan))gender_f.append(row.get(C(gender)_F, np.nan))interaction_f.append(row.get(C(culture):C(gender)_F, np.nan))data np.array([culture_f, gender_f, interaction_f])im ax.imshow(data, cmapYlOrRd, aspectauto)ax.set_xticks(range(len(dims)))ax.set_xticklabels(dims, rotation30, haright, fontsize8)ax.set_yticks(range(3))ax.set_yticklabels([文化主效应, 性别主效应, 交互效应], fontsize9)for i in range(3):for j in range(len(dims)):val data[i, j]if not np.isnan(val):ax.text(j, i, f{val:.1f}, ha利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛