Verified Commit a84c0419 authored by 施乐存's avatar 施乐存
Browse files

添加UP主生态分析文档及分区专注度分布图生成代码



Signed-off-by: 施乐存's avatarszdytom <szdytom@qq.com>
parent 006e2ea2
Loading
Loading
Loading
Loading

up-analysis/up.md

0 → 100644
+61 −0
Original line number Original line Diff line number Diff line
1. 显著的幂律分布特征

    拟合指数 -1.53 表明这是一个典型的幂律分布(长尾分布)

    这意味着B站UP主的成功遵循"赢家通吃"的模式:

        少数UP主占据大量曝光机会:约0.2%的UP主(上榜20次以上)占据了约20%的上榜次数

        绝大多数UP主只能偶尔上榜:75%的UP主(2686/3581)只上榜1次

2. UP主生态的结构特征

TODO

3. 幂律分布的现实意义

    指数 -1.53 表示每增加一倍的上榜次数,对应UP主数量减少约 2.9倍(2¹·⁵³)

    这比许多自然和社会系统中的幂律分布更陡峭(通常指数在 -2 到 -1 之间),说明:

        B站内容生态的"头部效应"非常显著

        成为"常青UP主"的壁垒相当高

        马太效应明显:越成功的UP主越容易持续成功

4. 生态稳定性分析

    新UP主入口仍然开放:每年仍有大量UP主首次上榜(从4.2的数据看)

    核心UP主护城河深厚:有27位UP主上榜超过20次,最高达161次

    中间层相对薄弱:2-10次上榜的UP主数量衰减很快,显示难以从"偶尔上榜"过渡到"经常上榜"

5. 对内容策略的启示

    爆款策略 vs 持续输出:

        大多数UP主依赖单次爆款(75%只上榜1次)

        极少数UP主能建立稳定的内容输出机制

    内容生态的健康度:

        陡峭的幂律分布可能反映推荐算法的集中效应

        但也可能表明用户偏好的自然集中

与行业对比

对比YouTube等平台的研究:

    YouTube的创作者分布通常指数在 -1.2 到 -1.4 之间

    B站的 -1.53 更陡峭,可能说明:

        中国观众口味更集中

        B站推荐算法更倾向于头部内容

        社区文化中的"梗"和"潮流"更易形成共识
+33 −0
Original line number Original line Diff line number Diff line
这些数据反映了频繁上榜UP主的分区专注度分布规律,具有以下几个重要发现:
一、核心发现
1. 中度专注是最优策略

    峰值在2-4个分区:涉猎3个分区的UP主最多(34人),2个分区次之(30人),4个分区第三(21人)

    这表明:频繁上榜的UP主通常不极度专一,也不过度分散,而是在2-4个分区内深耕

2. 幂律分布特征明显

数据呈现典型的长尾分布:

    头部(1-8个分区):193人(占总数215人的89.8%)

    尾部(9-29个分区):仅22人(占10.2%)

    大多数UP主聚焦少数几个分区

3. 专注度与上榜能力呈倒U型关系

	平均值约5.9个分区,但分布高度偏态:

    中位数在4个分区(小于平均值)

    这意味着少数高分区UP主拉高了平均值
	
4. 总结

    "适度多元"策略最优:3个分区是"甜蜜点"

    分区跨界存在"隐形门槛":超过8个分区后UP主数量锐减

    "全能型"UP主极其罕见但存在:证明跨分区能力是稀缺资源
 No newline at end of file
+24 −6
Original line number Original line Diff line number Diff line
@@ -24,12 +24,27 @@ ORDER BY distinct_tidv2_count;"]];
(* \:8f6c\:6362\:4e3a\:5750\:6807\:70b9\:5217\:8868 *)
(* \:8f6c\:6362\:4e3a\:5750\:6807\:70b9\:5217\:8868 *)
points = {#["x"], #["y"]} & /@ data;
points = {#["x"], #["y"]} & /@ data;


(* \:521b\:5efa\:67f1\:72b6\:56fe *)
(* \:5904\:7406\:95f4\:65ad\:6570\:636e - \:521b\:5efa\:8fde\:7eed\:7684x\:8f74\:8303\:56f4 *)
plot = BarChart[points[[All, 2]],
minX = Min[points[[All, 1]]];
maxX = Max[points[[All, 1]]];
allX = Range[minX, maxX];

(* \:521b\:5efa\:5305\:542b\:6240\:6709\:53ef\:80fdx\:503c\:7684\:5b8c\:6574\:6570\:636e\:5217\:8868 *)
fullPoints = Table[
  point = Select[points, #[[1]] == x &];
  If[Length[point] > 0, {x, point[[1, 2]]}, {x, 0}],
  {x, allX}
];

Print[fullPoints];

(* \:521b\:5efa\:67f1\:72b6\:56fe - \:4f7f\:7528RectangleChart\:786e\:4fdd\:6b63\:786e\:5904\:7406\:95f4\:65ad\:6570\:636e *)
plot = BarChart[
  fullPoints[[All,2]],
  ChartStyle -> RGBColor[0.368, 0.507, 0.71],
  ChartStyle -> RGBColor[0.368, 0.507, 0.71],
  Frame -> True,
  Frame -> True,
  FrameLabel -> {"\:6d89\:730e\:7684\:5206\:533a\:6570\:91cf", "UP\:4e3b\:6570\:91cf"},
  FrameLabel -> {"\:6d89\:730e\:7684\:5206\:533a\:6570\:91cf", "UP\:4e3b\:6570\:91cf"},
  FrameTicks -> {All, All},
  FrameTicks -> {{Automatic, None}, {allX, None}},  (* \:660e\:786e\:8bbe\:7f6ex\:8f74\:523b\:5ea6 *)
  FrameStyle -> Directive[Black, 14],
  FrameStyle -> Directive[Black, 14],
  GridLines -> Automatic,
  GridLines -> Automatic,
  GridLinesStyle -> Directive[Gray, Dotted],
  GridLinesStyle -> Directive[Gray, Dotted],
@@ -38,10 +53,13 @@ plot = BarChart[points[[All, 2]],
   Style["\:4e0a\:699c\:89c6\:9891\:6570\[GreaterEqual]10\:7684UP\:4e3b\:5206\:533a\:591a\:6837\:6027\:5206\:5e03", 16, Bold],
   Style["\:4e0a\:699c\:89c6\:9891\:6570\[GreaterEqual]10\:7684UP\:4e3b\:5206\:533a\:591a\:6837\:6027\:5206\:5e03", 16, Bold],
  LabelStyle -> Directive[Black, 12],
  LabelStyle -> Directive[Black, 12],
  Epilog -> {
  Epilog -> {
    (* \:5728\:6bcf\:4e2a\:67f1\:5b50\:4e0a\:65b9\:663e\:793a\:6570\:91cf *)
    (* \:5728\:6bcf\:4e2a\:67f1\:5b50\:9876\:90e8\:663e\:793a\:6570\:91cf *)
    MapIndexed[
    MapIndexed[
     Text[Style[#1, 10, Black], {First[#2], #1 + 
     With[{yVal = #1, idx = First[#2]},
         Max[points[[All, 2]]]*0.01}] &, points[[All, 2]]],
       If[yVal > 0, 
        Text[Style[yVal, 10, Black], {idx, yVal + Max[points[[All, 2]]]*0.01}]
       ]
     ] &, fullPoints[[All, 2]]],
    (* \:6dfb\:52a0\:7edf\:8ba1\:4fe1\:606f *)
    (* \:6dfb\:52a0\:7edf\:8ba1\:4fe1\:606f *)
    Text[
    Text[
     Style[
     Style[