统计短视频东方美学穿搭播放数据,算法计算国风内容传播流量增益值。
2026/6/26 5:06:25 网站建设 项目流程

用 Python 模拟短视频平台东方美学穿搭播放数据,通过算法量化国风内容的传播流量增益值,并以中立视角呈现分析结果。

一、实际应用场景描述

在《时尚产业与品牌创新》课程中,"短视频时代的时尚传播"是核心议题。具体表现为:

- 抖音/小红书/B站/快手:成为国风穿搭内容的核心传播阵地,汉服、新中式穿搭话题播放量屡破百亿。

- 东方美学内容特征:传统纹样、水墨配色、古建筑场景、非遗工艺展示、古典乐配乐等,形成区别于西方时尚叙事的视觉语言。

- 品牌困惑:同样是穿搭短视频,"国风"标签到底能带来多少额外流量?是算法推荐偏好,还是用户主动搜索驱动?

内容创作者与品牌面临核心问题:

"投入国风内容制作,流量回报是否优于常规穿搭内容?国风标签的流量增益是多少?哪些内容维度对传播贡献最大?"

本模拟基于短视频平台内容传播的典型数据特征,用 Python 做统计建模与算法分析,量化国风穿搭内容的流量增益。

二、引入痛点

- 短视频平台数据不透明(抖音/小红书 API 权限严格),真实数据获取门槛高。

- "国风流量红利"多停留在定性讨论,缺乏可量化的增益系数作为内容策略依据。

- 创作者需要多维度指标(播放完成率、互动率、转发率、搜索转化率)而非单一播放量来指导内容方向。

⇒ 用 Python 构建合成播放数据集 + 传播增益算法 + 多维可视化,模拟真实分析流程。

三、核心逻辑讲解

1. 数据维度设计

维度 说明

内容类型 国风穿搭(汉服、新中式、国潮联名)/ 常规穿搭(欧美风、日韩风、极简风)

平台 抖音、小红书、B站、快手

内容特征 是否有传统纹样、古建筑场景、非遗元素、古典配乐、文化叙事

传播指标 播放量、完播率、点赞率、评论率、转发率、收藏率、搜索转化量

2. 流量增益算法

核心思路:控制变量法——对比"相同制作水准下,国风元素带来的额外流量"。

流量增益值 (Traffic Lift) = (国风内容指标 - 对照组指标) / 对照组指标 × 100%

多维度增益综合评分:

Traffic Gain Score = Σ(w_i × Gain_i)

其中:

- Gain_i:第 i 个指标的增益率(播放量/完播率/互动率等)

- w_i:该指标的权重(基于平台推荐算法特征重要性)

3. 传播动力学模型

短视频传播遵循多级扩散模型:

累计播放量(t) = S × (1 - e^(-k×t)) × F

其中:

- S:初始曝光池(平台分配的初始流量)

- k:传播速率系数(内容质量决定)

- F:国风加成因子(F > 1 表示国风内容获得额外推荐权重)

4. 关键量化指标

- 播放量增益率:国风 vs 常规的内容播放量差异

- 完播率增益:国风内容的用户留存优势

- 互动率增益:点赞/评论/转发的综合提升

- 搜索转化增益:内容带来的品牌/商品搜索增量

- 综合流量增益指数(TFGI):多指标加权总分

四、代码模块化(guofeng_traffic_analysis.py)

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

"""

guofeng_traffic_analysis.py

短视频东方美学穿搭播放数据统计分析

算法计算国风内容传播流量增益值

依赖: numpy, pandas, matplotlib, scipy

安装: pip install numpy pandas matplotlib scipy

"""

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from matplotlib import rcParams

from scipy import stats

from dataclasses import dataclass, field

from typing import Dict, List, Tuple

from enum import Enum

# 中文字体设置

rcParams['font.sans-serif'] = ['Noto Sans CJK SC', 'SimHei', 'Microsoft YaHei']

rcParams['axes.unicode_minus'] = False

# ──────────────────────────────────────────────

# 1. 枚举与配置模块

# ──────────────────────────────────────────────

class ContentType(Enum):

"""内容类型枚举"""

HANFU = "汉服穿搭"

NEW_CHINESE = "新中式穿搭"

GUOCHAO = "国潮联名"

WESTERN = "欧美风穿搭"

JAPANESE_KOREAN = "日韩风穿搭"

MINIMALIST = "极简风穿搭"

class Platform(Enum):

"""平台枚举"""

DOUYIN = "抖音"

XIAOHONGSHU = "小红书"

BILIBILI = "B站"

KUAISHOU = "快手"

@dataclass

class FeatureWeights:

"""内容特征权重配置"""

# 国风特征

traditional_pattern: float = 0.20 # 传统纹样

ancient_architecture: float = 0.18 # 古建筑场景

intangible_heritage: float = 0.22 # 非遗元素

classical_music: float = 0.12 # 古典配乐

cultural_storytelling: float = 0.28 # 文化叙事

# 常规特征(对照组)

modern_aesthetic: float = 0.30 # 现代审美

trending_music: float = 0.25 # 流行配乐

urban_setting: float = 0.20 # 都市场景

celebrity_effect: float = 0.25 # 达人效应

# ──────────────────────────────────────────────

# 2. 合成数据生成模块

# ──────────────────────────────────────────────

class SyntheticDataGenerator:

"""

生成模拟的短视频播放数据

基于各平台公开数据报告的典型量级关系构建

"""

# 平台基础曝光池(模拟值,单位:次)

PLATFORM_BASE_EXPOSURE = {

Platform.DOUYIN: 5000,

Platform.XIAOHONGSHU: 3000,

Platform.BILIBILI: 2000,

Platform.KUAISHOU: 4000

}

# 内容类型基础传播系数

CONTENT_BASE_MULTIPLIER = {

ContentType.HANFU: 1.45, # 汉服天然话题性高

ContentType.NEW_CHINESE: 1.35, # 新中式受众广

ContentType.GUOCHAO: 1.25, # 国潮联名有品牌加持

ContentType.WESTERN: 1.00, # 常规基准

ContentType.JAPANESE_KOREAN: 1.05,

ContentType.MINIMALIST: 0.90

}

@staticmethod

def generate_video_data(n_videos: int = 200,

seed: int = 42) -> pd.DataFrame:

"""

生成视频播放数据

每个视频包含:

- 内容类型、平台、特征标签

- 播放量、完播率、互动指标

- 搜索转化量

"""

np.random.seed(seed)

rows = []

content_types = list(ContentType)

platforms = list(Platform)

for i in range(n_videos):

# 随机分配内容类型和平台

content_type = content_types[i % len(content_types)]

platform = platforms[i % len(platforms)]

# 基础曝光

base_exposure = SyntheticDataGenerator.PLATFORM_BASE_EXPOSURE[platform]

content_mult = SyntheticDataGenerator.CONTENT_BASE_MULTIPLIER[content_type]

# 国风内容获得算法额外加权(核心假设)

guofeng_boost = 1.0

is_guofeng = content_type in [ContentType.HANFU,

ContentType.NEW_CHINESE,

ContentType.GUOCHAO]

if is_guofeng:

# 国风内容在推荐算法中获得 15%-30% 的额外流量倾斜

guofeng_boost = np.random.uniform(1.15, 1.30)

# 特征质量随机(模拟制作水准差异)

production_quality = np.random.beta(3, 2) # 偏高质量的Beta分布

# 播放量 = 基础曝光 × 内容系数 × 国风加成 × 制作质量 + 噪声

play_count = int(

base_exposure

* content_mult

* guofeng_boost

* (0.5 + 0.5 * production_quality)

* np.random.lognormal(0, 0.3)

)

# 完播率:国风内容通常高于常规(文化叙事吸引人看完)

base_completion = 0.35 + 0.15 * production_quality

if is_guofeng:

base_completion += 0.08 # 国风额外完播优势

completion_rate = min(np.random.normal(base_completion, 0.05), 0.95)

# 互动率

like_rate = np.random.normal(0.03 * guofeng_boost if is_guofeng else 0.025,

0.005)

comment_rate = np.random.normal(0.005 * guofeng_boost if is_guofeng else 0.004,

0.001)

share_rate = np.random.normal(0.008 * guofeng_boost if is_guofeng else 0.006,

0.002)

save_rate = np.random.normal(0.012 * guofeng_boost if is_guofeng else 0.009,

0.003)

# 搜索转化(内容带来的品牌/商品搜索)

search_conversion = int(

play_count * np.random.normal(0.002 if is_guofeng else 0.0015, 0.0005)

)

rows.append({

'video_id': f'vid_{i:04d}',

'content_type': content_type.value,

'content_type_en': content_type.name,

'platform': platform.value,

'is_guofeng': is_guofeng,

'play_count': max(play_count, 100),

'completion_rate': max(min(completion_rate, 1.0), 0.0),

'like_rate': max(like_rate, 0.0),

'comment_rate': max(comment_rate, 0.0),

'share_rate': max(share_rate, 0.0),

'save_rate': max(save_rate, 0.0),

'search_conversion': max(search_conversion, 0),

'production_quality': round(production_quality, 3)

})

return pd.DataFrame(rows)

# ──────────────────────────────────────────────

# 3. 流量增益算法模块

# ──────────────────────────────────────────────

class TrafficGainCalculator:

"""

核心算法:计算国风内容的流量增益值

方法论:对照组实验设计

- 实验组:国风穿搭内容(汉服/新中式/国潮)

- 对照组:常规穿搭内容(欧美/日韩/极简)

- 指标:播放量、完播率、互动率、搜索转化

"""

# 指标权重(基于平台推荐算法特征重要性)

METRIC_WEIGHTS = {

'play_count': 0.30, # 播放量是基础

'completion_rate': 0.25, # 完播率影响推荐池

'like_rate': 0.15, # 点赞权重

'comment_rate': 0.15, # 评论权重(深度互动)

'share_rate': 0.10, # 转发权重(破圈能力)

'search_conversion': 0.05 # 搜索转化(商业价值)

}

@classmethod

def calc_traffic_gain(cls, df: pd.DataFrame) -> pd.DataFrame:

"""

计算各平台各内容类型的流量增益率

返回 DataFrame:

- content_type, platform, metric, guofeng_value, control_value, gain_rate

"""

results = []

# 确定对照组基准(欧美风穿搭)

control_df = df[df['content_type_en'] == 'WESTERN']

for content_type in df['content_type_en'].unique():

if content_type == 'WESTERN':

continue

exp_df = df[df['content_type_en'] == content_type]

for platform in df['platform'].unique():

exp_platform = exp_df[exp_df['platform'] == platform]

ctrl_platform = control_df[control_df['platform'] == platform]

if len(exp_platform) == 0 or len(ctrl_platform) == 0:

continue

for metric in cls.METRIC_WEIGHTS.keys():

exp_val = exp_platform[metric].mean()

ctrl_val = ctrl_platform[metric].mean()

if ctrl_val > 0:

gain_rate = (exp_val - ctrl_val) / ctrl_val * 100

else:

gain_rate = 0.0

results.append({

'content_type': content_type,

'platform': platform,

'metric': metric,

'exp_value': round(exp_val, 4),

'control_value': round(ctrl_val, 4),

'gain_rate_%': round(gain_rate, 1)

})

return pd.DataFrame(results)

@classmethod

def calc_composite_gain(cls, gain_df: pd.DataFrame) -> pd.DataFrame:

"""

计算综合流量增益指数(TFGI)

TFGI = Σ(weight_i × gain_rate_i) / 100 + 1

归一化到 0-2 范围,1.0 表示与对照组持平

"""

results = []

for _, row in gain_df.iterrows():

metric = row['metric']

weight = cls.METRIC_WEIGHTS.get(metric, 0.1)

gain = row['gain_rate_%']

# 综合增益 = 加权平均增益

composite = weight * gain

results.append({

'content_type': row['content_type'],

'platform': row['platform'],

'metric': metric,

'weight': weight,

'gain_rate_%': gain,

'weighted_contribution': round(composite, 2)

})

# 按内容类型+平台聚合

agg = pd.DataFrame(results).groupby(['content_type', 'platform']).agg(

total_weighted_gain=('weighted_contribution', 'sum'),

metrics_count=('metric', 'count')

).reset_index()

agg['TFGI'] = (agg['total_weighted_gain'] / 100 + 1).round(2)

return agg.sort_values('TFGI', ascending=False)

# ──────────────────────────────────────────────

# 4. 统计检验模块

# ──────────────────────────────────────────────

class StatisticalTester:

"""对国风 vs 常规的指标差异做统计显著性检验"""

@staticmethod

def t_test_comparison(df: pd.DataFrame,

metric: str) -> pd.DataFrame:

"""独立样本 t 检验:国风组 vs 常规组"""

guofeng = df[df['is_guofeng'] == True][metric]

control = df[df['is_guofeng'] == False][metric]

if len(guofeng) < 3 or len(control) < 3:

return None

t_stat, p_value = stats.ttest_ind(guofeng, control, equal_var=False)

return {

'metric': metric,

'guofeng_mean': round(guofeng.mean(), 4),

'control_mean': round(control.mean(), 4),

'difference': round(guofeng.mean() - control.mean(), 4),

'pct_difference': round((guofeng.mean() - control.mean()) / control.mean() * 100, 1),

't_statistic': round(t_stat, 3),

'p_value': round(p_value, 4),

'significant': p_value < 0.05,

'significance_level': '**' if p_value < 0.01 else '*' if p_value < 0.05 else 'ns'

}

@staticmethod

def run_all_tests(df: pd.DataFrame) -> pd.DataFrame:

"""对所有指标执行 t 检验"""

metrics = ['play_count', 'completion_rate', 'like_rate',

'comment_rate', 'share_rate', 'search_conversion']

results = []

for m in metrics:

result = StatisticalTester.t_test_comparison(df, m)

if result:

results.append(result)

return pd.DataFrame(results)

# ──────────────────────────────────────────────

# 5. 可视化仪表盘模块

# ──────────────────────────────────────────────

class Dashboard:

"""多面板可视化仪表盘"""

CONTENT_COLORS = {

'HANFU': '#E74C3C',

'NEW_CHINESE': '#E67E22',

'GUOCHAO': '#F1C40F',

'WESTERN': '#3498DB',

'JAPANESE_KOREAN': '#2ECC71',

'MINIMALIST': '#9B59B6'

}

PLATFORM_MARKERS = {

'抖音': 'o',

'小红书': 's',

'B站': '^',

'快手': 'D'

}

CONTENT_CN = {

'HANFU': '汉服',

'NEW_CHINESE': '新中式',

'GUOCHAO': '国潮',

'WESTERN': '欧美风',

'JAPANESE_KOREAN': '日韩风',

'MINIMALIST': '极简风'

}

METRIC_CN = {

'play_count': '播放量',

'completion_rate': '完播率',

'like_rate': '点赞率',

'comment_rate': '评论率',

'share_rate': '转发率',

'search_conversion': '搜索转化'

}

@classmethod

def plot_dashboard(cls,

df: pd.DataFrame,

gain_df: pd.DataFrame,

composite_df: pd.DataFrame,

ttest_df: pd.DataFrame,

filename: str = "guofeng_traffic_dashboard.png"):

fig = plt.figure(figsize=(22, 18))

fig.suptitle('短视频东方美学穿搭 — 国风内容流量增益量化分析',

fontsize=20, fontweight='bold', y=0.99)

# ── 图1:各平台各内容类型平均播放量 ──

ax1 = fig.add_subplot(3, 2, 1)

cls._plot_play_count_by_platform(ax1, df)

# ── 图2:国风 vs 常规 各指标增益率(分平台) ──

ax2 = fig.add_subplot(3, 2, 2)

cls._plot_gain_by_metric(ax2, gain_df)

# ── 图3:综合流量增益指数(TFGI) ──

ax3 = fig.add_subplot(3, 2, 3)

cls._plot_composite_gain(ax3, composite_df)

# ── 图4:统计显著性检验(森林图) ──

ax4 = fig.add_subplot(3, 2, 4)

cls._plot_forest_plot(ax4, ttest_df)

# ── 图5:播放量分布箱线图 ──

ax5 = fig.add_subplot(3, 2, 5)

cls._plot_boxplot(ax5, df)

# ── 图6:完播率 vs 播放量 散点图 ──

ax6 = fig.add_subplot(3, 2, 6)

cls._plot_scatter(ax6, df)

plt.tight_layout(rect=[0, 0, 1, 0.96])

plt.savefig(filename, dpi=150, bbox_inches='tight')

plt.show()

print(f"[INFO] 仪表盘已保存: {filename}")

@classmethod

def _plot_play_count_by_platform(cls, ax, df: pd.DataFrame):

"""各平台各内容类型播放量对比"""

pivot = df.pivot_table(index='content_type_en', columns='platform',

values='play_count', aggfunc='mean')

# 重排顺序

order = ['HANFU', 'NEW_CHINESE', 'GUOCHAO', 'WESTERN', 'JAPANESE_KOREAN', 'MINIMALIST']

pivot = pivot.reindex(order)

pivot = pivot.rename(index=cls.CONTENT_CN)

pivot = pivot.rename(columns={v.value: v.value for v in Platform})

pivot.plot(kind='bar', ax=ax, color=['#e74c3c', '#ff6b6b', '#e67e22', '#f1c40f'],

edgecolor='white', width=0.8)

ax.set_ylabel('平均播放量')

ax.set_title('各平台内容类型平均播放量', fontsize=13, fontweight='bold')

ax.legend(fontsize=8)

ax.grid(axis='y', alpha=0.3)

plt.setp(ax.get_xticklabels(), rotation=30, ha='right')

@classmethod

def _plot_gain_by_metric(cls, ax, gain_df: pd.DataFrame):

"""各指标增益率热力图"""

# 筛选国风内容

guofeng_types = ['HANFU', 'NEW_CHINESE', 'GUOCHAO']

gdf = gain_df[gain_df['content_type'].isin(guofeng_types)].copy()

gdf['content_cn'] = gdf['content_type'].map(cls.CONTENT_CN)

gdf['metric_cn'] = gdf['metric'].map(cls.METRIC_CN)

pivot = gdf.pivot_table(index='content_cn', columns='metric_cn',

values='gain_rate_%', aggfunc='mean')

im = ax.imshow(pivot.values, cmap='RdYlGn', aspect='auto')

ax.set_xticks(range(len(pivot.columns)))

ax.set_xticklabels(pivot.columns, fontsize=9, rotation=30, ha='right')

ax.set_yticks(range(len(pivot.index)))

ax.set_yticklabels(pivot.index, fontsize=10)

for i in range(len(pivot.index)):

for j in range(len(pivot.columns)):

val = pivot.values[i, j]

color = 'white' if abs(val) > 40 else 'black'

ax.text(j, i, f'{val:+.1f}%', ha='center', va='center',

color=color, fontsize=9, fontweight='bold')

ax.set_title('国风内容各指标流量增益率', fontsize=13, fontweight='bold')

plt.colorbar(im, ax=ax, shrink=0.8)

@classmethod

def _plot_composite_gain(cls, ax, comp_df: pd.DataFrame):

"""综合流量增益指数 TFGI"""

comp_df = comp_df.copy()

comp_df['content_cn'] = comp_df['content_type'].map(cls.CONTENT_CN)

comp_df = comp_df.sort_values('TFGI')

colors = [cls.CONTENT_COLORS.get(ct, '#95a5a6')

for ct in comp_df['content_type']]

bars = ax.barh(range(len(comp_df)), comp_df['TFGI'], color=colors, edgecolor='white')

ax.set_yticks(range(len(comp_df)))

ax.set_yticklabels(comp_df['content_cn'], fontsize=10)

ax.set_xlabel('TFGI(综合流量增益指数)')

ax.set_title('综合流量增益指数 TFGI\n(>1.0 表示优于欧美风基准)',

fontsize=13, fontweight='bold')

ax.axvline(x=1.0, color='gray', linestyle='--', linewidth=1, label='基准线')

ax.grid(axis='x', alpha=0.3)

for i, (bar, val) in enumerate(zip(bars, comp_df['TFGI'])):

ax.text(bar.get_width() + 0.01, i, f'{val:.2f}',

va='center', fontsize=10, fontweight='bold')

ax.legend(fontsize=8)

@classmethod

def _plot_forest_plot(cls, ax, ttest_df: pd.DataFrame):

"""森林图展示 t 检验结果的效应量"""

if ttest_df is None or len(ttest_df) == 0:

ax.text(0.5, 0.5, '无统计检验结果', ha='center', va='center',

transform=ax.transAxes, fontsize=12)

return

ttest_df = ttest_df.copy()

ttest_df['metric_cn'] = ttest_df['metric'].map(cls.METRIC_CN)

ttest_df = ttest_df.sort_values('pct_difference')

y_positions = range(len(ttest_df))

colors = ['#e74c3c' if s else '#95a5a6' for s in ttest_df['significant']]

ax.scatter(ttest_df['pct_difference'], y_positions,

c=colors, s=100, zorder=5)

# 画置信区间近似(用 ±1.96*SE 近似)

ttest_df['se'] = ttest_df['difference'] / ttest_df['t_statistic'].replace(0, np.nan)

ttest_df['ci_lower'] = ttest_df['pct_difference'] - 1.96 * ttest_df['se'] / ttest_df['control_mean'] * 100

ttest_df['ci_upper'] = ttest_df['pct_difference'] + 1.96 * ttest_df['se'] / ttest_df['control_mean'] * 100

for i, row in ttest_df.iterrows():

ax.plot([row['ci_lower'], row['ci_upper']],

[y_positions[i], y_positions[i]],

color=colors[i], linewidth=2, zorder=3)

ax.set_yticks(y_positions)

ax.set_yticklabels(ttest_df['metric_cn'], fontsize=10)

ax.set_xlabel('国风 - 常规 百分比差异 (%)')

ax.set_title('统计显著性检验(森林图)\n红色 = p < 0.05 显著',

fontsize=13, fontweight='bold')

ax.axvline(x=0, color='gray', linewidth=0.8)

ax.grid(axis='x', alpha=0.3)

@classmethod

def _plot_boxplot(cls, ax, df: pd.DataFrame):

"""播放量分布箱线图"""

data_by_type = []

labels = []

colors = []

for ct in ['HANFU', 'NEW_CHINESE', 'GUOCHAO', 'WESTERN']:

subset = df[df['content_type_en'] == ct]['play_count']

if len(subset) > 0:

data_by_type.append(subset.values)

labels.append(cls.CONTENT_CN[ct])

colors.append(cls.CONTENT_COLORS[ct])

bp = ax.boxplot(data_by_type, patch_artist=True, labels=labels,

medianprops=dict(color='black', linewidth=2))

for patch, color in zip(bp['boxes'], colors):

patch.set_facecolor(color)

patch.set_alpha(0.6)

ax.set_ylabel('播放量')

ax.set_title('国风 vs 常规 播放量分布', fontsize=13, fontweight='bold')

ax.grid(axis='y', alpha=0.3)

@classmethod

def _plot_scatter(cls, ax, df: pd.DataFrame):

"""完播率 vs 播放量 散点图"""

for ct in ['HANFU', 'NEW_CHINESE', 'GUOCHAO', 'WESTERN']:

subset = df[df['content_type_en'] == ct]

color = cls.CONTENT_COLORS[ct]

利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询