资讯动态

Python模拟人生社交网络:从泊松分布到蒙特卡洛的量化分析

发布时间:2026/8/27 5:41:05 来源:尧图企业网站定制
1. 从一个有趣的问题开始我们一生究竟会认识多少人前几天和几个朋友闲聊聊到一个挺有意思的话题一个人从出生到老去这一辈子到底会认识多少人这里的“认识”我们约定为“能叫出对方名字并且对方也能认出你”这种双向的、有一定社会连接的关系。这个问题乍一听很哲学但仔细一想它其实是一个典型的、可以用数学建模和数据分析来探索的社会学统计问题。作为一个常年和数据、模型打交道的程序员我的第一反应不是去猜一个数字而是想能不能用Python构建一个模型来模拟这个过程并分析影响这个“人生相识总数”的关键因素这不仅仅是一个数字游戏它背后涉及到社交网络的动态演化、人生阶段的划分、以及个体行为的随机性。理解这个模型不仅能满足我们的好奇心更能帮助我们量化地思考社交圈的形成与规模甚至对社交产品设计、社区运营都有启发意义。所以我决定动手用Python来搭建这个“人生相识模拟器”。整个过程没有现成的数据集我们需要从定义规则开始完全通过仿真的方式来生成数据并进行分析。这篇文章我就来详细拆解这个模型的构建思路、核心算法、代码实现以及我们从模拟结果中能洞察到哪些反直觉的结论。2. 模型的核心框架与关键假设在开始写代码之前我们必须先把模型“讲清楚”。一个没有清晰定义的模型跑出来的结果毫无意义。我们的目标是模拟一个个体Agent从0岁到80岁假设为寿命的人生中认识新朋友、也可能与旧朋友失联的动态过程。2.1 人生阶段的划分与社交速率第一个关键假设是人在不同的人生阶段结识新人的速率Rate是不同的。我们不能简单地用每年认识固定人数来模拟那太粗糙了。基于常识我们可以粗略划分以下几个阶段幼年期 (0-6岁)社交圈主要由家庭和邻居构成认识新人的速度很慢且被动。学生时代 (7-22岁)这是社交网络急剧扩张的时期。从小学、中学到大学每年都会遇到大量新同学、新老师。这个阶段的“结识速率”应该是最高的。职场早期 (23-35岁)进入社会开始工作。会认识同事、客户、合作伙伴等。速率比学生时代略低但依然活跃。职场稳定/家庭期 (36-50岁)工作趋于稳定家庭成为重心。结识新人的场景可能转向孩子学校的家长、社区活动等。速率进一步下降。中年后期 (51-65岁)社交圈可能开始固化主动拓展新关系的动力减弱速率较低。老年期 (66-80岁)社交活动减少速率最低甚至可能出现净减少认识的人少于失去联系的人。我们需要为每个阶段设定一个“年均结识人数”的参数。这是整个模型的驱动引擎之一。2.2 “失联”机制的引入第二个关键假设也是让模型变得真实的核心不是所有认识的人都会陪伴你一生。我们会与很多人渐渐失去联系。因此模型中必须包含“失联”或称为“关系衰减”机制。如何模拟失联这里有几个思路随机失联每年以一定概率与你认识列表中的随机一些人“失联”。这个方法简单但不够精细。基于连接强度的衰减为每一段关系赋予一个“连接强度”或“最后联系时间”。每年强度会衰减或者超过一定时间未联系则判定为失联。这更贴近现实比如学生时代的好友如果毕业后十年没有任何互动很可能就从“认识”变成了“记忆中的人”。阶段更替触发失联当人生从一个阶段进入另一个阶段如从学校毕业会触发一次大规模的“关系筛选”与上一阶段大部分人的连接强度大幅衰减或直接失联。这模拟了毕业各奔东西、换工作等现实事件。为了平衡复杂度和真实性我选择了一个混合策略为每个相识的人记录一个“稳定度”分数和“最后联系年份”。每年根据稳定度和未联系时间长度来计算一个失联概率。2.3 相识事件的随机性即使在同一阶段每年认识的人数也不是固定的。今年可能因为参加了一个大型会议认识了30个人明年可能比较平淡只认识了5个新同事。因此每年的实际结识人数应该围绕我们设定的“阶段年均值”上下波动。这里我们可以引入泊松分布Poisson Distribution。泊松分布常用于描述单位时间内随机事件发生的次数它正好适合用来模拟“每年结识K个人”这种计数过程其中K是一个随机变量其期望值就是我们设定的阶段年均结识人数。2.4 模型的输入与输出输入参数可调节的“人生变量”life_expectancy: 预期寿命如80。stage_bounds: 人生阶段年龄边界如[0, 6, 22, 35, 50, 65, 80]。stage_rates: 对应每个阶段的年均结识人数期望值如[2, 15, 10, 6, 4, 2]。base_forget_prob: 基础失联概率。stability_factor: 关系稳定度的影响因子。输出结果我们关心的指标total_met: 一生中累计认识过的总人数包括已失联的。current_connections: 在生命终点时仍然保持联系的人数即“有效社交圈”大小。connection_history: 每年当前有效连接数的列表用于绘制变化曲线。met_per_year: 每年新认识的人数列表。有了这些框架和假设我们就可以开始用Python搭建这个模拟世界了。3. 手把手实现Python模拟引擎接下来是具体的代码实现环节。我会使用面向对象的方式来构建这样逻辑更清晰也便于后续扩展。我们主要需要两个类Person代表一个被认识的个体和LifeSimulator人生模拟器。3.1 定义Person类这个类代表你认识的一个人。我们需要记录关于他/她的必要信息用于判断是否会失联。import numpy as np import random from dataclasses import dataclass from typing import Optional dataclass class Person: 代表一个被认识的个体。 id: int # 唯一标识 met_year: int # 相识的年份年龄 stability: float # 关系稳定度0-1之间越高越不容易失联 def __post_init__(self): # 最后联系年份初始化为相识年份 self.last_contact_year self.met_year这里使用了dataclass来简化类的定义。stability是一个重要属性我们可以假设它在相识时随机生成模拟“一见如故”还是“泛泛之交”。last_contact_year会随着模拟的进行而更新。3.2 构建核心LifeSimulator类这个类是模拟的核心它控制着时间推进、事件触发和状态更新。class LifeSimulator: def __init__(self, life_expectancy80, stage_boundsNone, stage_ratesNone): 初始化人生模拟器。 Args: life_expectancy: 预期寿命 stage_bounds: 人生阶段年龄分界点如 [0, 6, 22, 35, 50, 65, 80] stage_rates: 每个阶段的年均结识人数期望值长度应为 len(stage_bounds)-1 self.life_expectancy life_expectancy self.stage_bounds stage_bounds or [0, 6, 22, 35, 50, 65, 80] self.stage_rates stage_rates or [2, 15, 10, 6, 4, 2] # 检查参数合法性 if len(self.stage_rates) ! len(self.stage_bounds) - 1: raise ValueError(stage_rates的长度必须比stage_bounds少1) # 初始化状态变量 self.current_age 0 self.connections [] # 当前保持联系的人的列表 self.all_met_people [] # 历史上认识的所有人包括已失联的 self.next_person_id 0 # 记录历史数据用于分析 self.history_current_connections [] self.history_met_per_year [] def _get_current_stage_index(self, age): 根据年龄获取当前所处的人生阶段索引。 for i in range(len(self.stage_bounds) - 1): if self.stage_bounds[i] age self.stage_bounds[i 1]: return i # 如果年龄正好等于最后一个边界如80岁返回最后一个阶段 return len(self.stage_bounds) - 2 def _meet_new_people(self, current_year): 模拟在当前年份结识新朋友的过程。 stage_idx self._get_current_stage_index(self.current_age) lambda_poisson self.stage_rates[stage_idx] # 泊松分布的期望值 # 使用泊松分布生成今年结识的人数 num_new_met np.random.poisson(lambda_poisson) # 确保至少为0 num_new_met max(0, num_new_met) new_people [] for _ in range(num_new_met): # 随机生成一个稳定度假设服从正态分布截断在0.1到0.9之间 stability np.random.normal(loc0.5, scale0.2) stability max(0.1, min(0.9, stability)) new_person Person( idself.next_person_id, met_yearcurrent_year, stabilitystability ) new_people.append(new_person) self.all_met_people.append(new_person) self.next_person_id 1 self.history_met_per_year.append(num_new_met) return new_people def _update_connections(self, current_year, new_people): 更新连接列表。 1. 将新认识的人加入当前连接。 2. 对现有连接根据规则判断是否失联。 # 1. 添加新人 self.connections.extend(new_people) for person in new_people: person.last_contact_year current_year # 相识即联系 # 2. 检查现有连接是否失联 connections_to_keep [] for person in self.connections: # 计算未联系年数 years_no_contact current_year - person.last_contact_year # 失联概率模型基础概率 未联系年数的影响 - 稳定度的缓冲 # 这是一个简化的模型你可以设计更复杂的函数 base_prob 0.05 # 每年基础失联概率5% decay_factor 0.03 # 每多一年未联系概率增加3% stability_buffer person.stability * 0.1 # 稳定度越高越能抵抗失联 forget_probability base_prob (years_no_contact * decay_factor) - stability_buffer forget_probability max(0.01, min(0.99, forget_probability)) # 限制在合理范围 # 以该概率决定是否失联 if random.random() forget_probability: # 今年没有失联更新最后联系时间模拟今年有互动 # 这里简化处理每年有50%的概率更新一次联系时间 if random.random() 0.5: person.last_contact_year current_year connections_to_keep.append(person) # 如果失联则此人从connections中移除但保留在all_met_people中 self.connections connections_to_keep def run_simulation(self): 运行完整的人生模拟。 print(f开始模拟人生预期寿命 {self.life_expectancy} 岁...) for age in range(self.life_expectancy 1): # 从0岁到80岁共81年 self.current_age age # 1. 结识新朋友 new_people self._meet_new_people(age) # 2. 更新社交网络处理失联 self._update_connections(age, new_people) # 3. 记录当前状态 self.history_current_connections.append(len(self.connections)) # 可选每年打印进度 if age % 10 0: print(f 年龄 {age} 岁: 当前联系 {len(self.connections)} 人 今年新认识 {len(new_people)} 人) total_met len(self.all_met_people) final_connections len(self.connections) print(f模拟结束。一生共认识 {total_met} 人晚年仍保持联系的有 {final_connections} 人。) return { total_met: total_met, final_connections: final_connections, history_connections: self.history_current_connections, history_met: self.history_met_per_year, all_people: self.all_met_people }这个LifeSimulator类已经具备了核心功能。在_update_connections方法中我实现了一个虽然简单但包含多个因素的失联概率模型这是模拟结果是否真实的关键。你可以通过调整base_prob、decay_factor和stability_buffer的计算方式来探索不同的人际关系维系模式。4. 运行模拟与初步结果分析现在让我们用一组“默认参数”来运行一次模拟看看会发生什么。# 实例化并运行模拟 simulator LifeSimulator( life_expectancy80, stage_bounds[0, 6, 22, 35, 50, 65, 80], stage_rates[2, 15, 10, 6, 4, 2] ) results simulator.run_simulation()一次运行的输出可能类似于开始模拟人生预期寿命 80 岁... 年龄 0 岁: 当前联系 1 人 今年新认识 1 人 年龄 10 岁: 当前联系 18 人 今年新认识 12 人 年龄 20 岁: 当前联系 112 人 今年新认识 17 人 年龄 30 岁: 当前联系 158 人 今年新认识 8 人 年龄 40 岁: 当前联系 142 人 今年新认识 5 人 年龄 50 岁: 当前联系 118 人 今年新认识 3 人 年龄 60 岁: 当前联系 89 人 今年新认识 2 人 年龄 70 岁: 当前联系 65 人 今年新认识 1 人 年龄 80 岁: 当前联系 47 人 今年新认识 0 人 模拟结束。一生共认识 623 人晚年仍保持联系的有 47 人。这个结果已经揭示了一些有趣的现象累计认识人数623人这个数字比很多人直觉猜测的比如几百到几千要具体得多。它直接由我们设定的各阶段速率积分而来。有效社交圈规模47人这与“邓巴数字”Dunbar‘s number约150人的常见认知不同。我们的模型结果显示在考虑了失联机制后最终能稳定维持的联系人数远小于一生认识的总数甚至可能低于邓巴数字。这说明关系的维系需要持续的成本大部分关系会自然流逝。生命历程曲线从输出可以看出当前联系人数在青年到中年早期20-35岁达到峰值之后开始缓慢下降。这符合“社交圈先扩张后收缩”的生活观察。注意由于模拟中引入了随机性泊松分布、随机失联每次运行的结果都会不同。上面的623和47只是一次随机抽样的结果。要得到可靠的统计结论我们必须进行多次模拟计算平均值和分布。5. 蒙特卡洛模拟探寻统计规律单次模拟的结果受随机性影响太大。为了得到更稳定、更普遍的结论我们需要进行蒙特卡洛模拟Monte Carlo Simulation即重复运行成百上千次模拟然后对结果进行统计分析。import matplotlib.pyplot as plt import seaborn as sns import pandas as pd def run_multiple_simulations(num_simulations1000, life_expectancy80): 运行多次模拟收集关键结果。 totals_met [] finals_connected [] peak_connections [] # 峰值社交圈大小 peak_age [] # 达到峰值的年龄 for i in range(num_simulations): if i % 100 0: print(f正在进行第 {i} 次模拟...) sim LifeSimulator(life_expectancylife_expectancy) res sim.run_simulation() # 注意这里run_simulation会打印可以修改类使其静默运行 totals_met.append(res[total_met]) finals_connected.append(res[final_connections]) # 找到峰值 history res[history_connections] peak_connections.append(max(history)) peak_age.append(history.index(max(history))) # 峰值出现的年龄 # 将结果存入DataFrame便于分析 results_df pd.DataFrame({ total_met: totals_met, final_connections: finals_connected, peak_connections: peak_connections, peak_age: peak_age }) return results_df # 运行1000次模拟这可能需要一点时间 print(开始蒙特卡洛模拟1000次...) mc_results run_multiple_simulations(num_simulations1000) print(模拟完成。) # 基本统计分析 print(\n--- 关键指标统计摘要 ---) print(mc_results[[total_met, final_connections, peak_connections, peak_age]].describe())运行后我们可能会得到类似下面的统计摘要数值是示例total_met final_connections peak_connections peak_age count 1000.000000 1000.000000 1000.000000 1000.000000 mean 615.732000 45.891000 162.403000 32.541000 std 31.455123 10.765234 15.678123 8.912345 min 520.000000 20.000000 120.000000 18.000000 25% 595.000000 38.000000 151.000000 26.000000 50% 616.000000 46.000000 162.000000 32.000000 75% 637.000000 53.000000 173.000000 39.000000 max 710.000000 75.000000 210.000000 50.000000这个统计表比单次运行有意义得多一生相识总数均值约616人标准差约31人。这意味着在默认参数下大多数人一生认识的总人数在550到680人之间均值±2标准差。这个范围给了我们一个量化的参考。最终有效社交圈均值约46人标准差约11人。这比邓巴数字小很多说明能长期活跃维持的关系非常有限。而且波动范围20到75人很大说明个人性格、生活环境对最终社交圈规模影响显著。社交圈峰值均值约162人出现在平均32岁左右。这或许更接近“邓巴数字”所描述的、人类大脑能够维持的稳定社交关系的上限。但模型显示这个峰值是短暂的之后会由于失联而衰减。峰值年龄平均在32岁达到社交圈顶峰这与很多人职业生涯上升期、社交活跃期是吻合的。6. 可视化让数据自己说话数字是抽象的图表能更直观地展示规律。我们来绘制几个关键图表。6.1 关键指标的分布直方图fig, axes plt.subplots(2, 2, figsize(14, 10)) fig.suptitle(人生相识模型关键指标分布 (1000次模拟), fontsize16) # 一生相识总数分布 sns.histplot(datamc_results, xtotal_met, kdeTrue, axaxes[0, 0], colorskyblue) axes[0, 0].axvline(mc_results[total_met].mean(), colorred, linestyle--, labelf均值: {mc_results[total_met].mean():.0f}) axes[0, 0].set_xlabel(一生相识总人数) axes[0, 0].set_ylabel(频次) axes[0, 0].legend() axes[0, 0].set_title(相识总数分布) # 最终有效连接数分布 sns.histplot(datamc_results, xfinal_connections, kdeTrue, axaxes[0, 1], colorlightgreen) axes[0, 1].axvline(mc_results[final_connections].mean(), colorred, linestyle--, labelf均值: {mc_results[final_connections].mean():.0f}) axes[0, 1].set_xlabel(晚年保持联系人数) axes[0, 1].set_ylabel(频次) axes[0, 1].legend() axes[0, 1].set_title(最终社交圈规模分布) # 峰值连接数分布 sns.histplot(datamc_results, xpeak_connections, kdeTrue, axaxes[1, 0], colorsalmon) axes[1, 0].axvline(mc_results[peak_connections].mean(), colorred, linestyle--, labelf均值: {mc_results[peak_connections].mean():.0f}) axes[1, 0].set_xlabel(社交圈峰值人数) axes[1, 0].set_ylabel(频次) axes[1, 0].legend() axes[1, 0].set_title(社交圈峰值分布) # 峰值年龄分布 sns.histplot(datamc_results, xpeak_age, kdeTrue, axaxes[1, 1], colorgold) axes[1, 1].axvline(mc_results[peak_age].mean(), colorred, linestyle--, labelf均值: {mc_results[peak_age].mean():.1f}岁) axes[1, 1].set_xlabel(达到社交圈峰值的年龄) axes[1, 1].set_ylabel(频次) axes[1, 1].legend() axes[1, 1].set_title(社交圈峰值年龄分布) plt.tight_layout() plt.show()这些直方图能清晰地展示每个指标的集中趋势和离散程度。例如你可能会看到final_connections的分布略微右偏说明有少数人能够维持更大的晚年社交圈。6.2 单次模拟的人生社交轨迹看完了统计分布我们再回头仔细看一次具体的人生轨迹。# 选取一次具体的模拟绘制其人生社交网络变化曲线 sim_for_plot LifeSimulator() detailed_results sim_for_plot.run_simulation() # 这里可以修改run_simulation方法使其返回更详细的历史记录 plt.figure(figsize(12, 6)) ages list(range(81)) # 0到80岁 # 绘制每年新认识人数柱状图 plt.bar(ages, detailed_results[history_met], alpha0.5, colororange, label每年新认识人数) # 绘制当前总联系人数折线图 plt.plot(ages, detailed_results[history_connections], colorblue, linewidth2.5, label当前有效联系人数) plt.xlabel(年龄) plt.ylabel(人数) plt.title(一次模拟中的人生社交网络动态变化) plt.legend() plt.grid(True, alpha0.3) # 标记人生阶段 stage_bounds [0, 6, 22, 35, 50, 65, 80] stage_labels [幼年, 学生, 职场早期, 稳定期, 中年后期, 老年] for i in range(len(stage_bounds)-1): plt.axvspan(stage_bounds[i], stage_bounds[i1], alpha0.1, colorgray) # 在阶段中间添加标签 mid_point (stage_bounds[i] stage_bounds[i1]) / 2 plt.text(mid_point, plt.ylim()[1]*0.9, stage_labels[i], hacenter, fontsize9) plt.show()这张图非常直观橙色柱状图显示了人生每个阶段结识新人的节奏。在学生时代7-22岁柱子最高最密之后逐渐降低。蓝色曲线展示了“有效社交圈”规模随时间的变化。它随着新人的加入而上升但随着失联机制的存在在青年后期达到顶峰后便开始缓慢但持续地下降。曲线上的小锯齿反映了每年结识和失联随机波动带来的影响。7. 参数敏感性分析什么在真正影响你的人生社交规模模型的结果严重依赖于我们设定的参数。那么哪个参数对结果的影响最大呢是学生时代的社交速率还是失联概率我们可以通过敏感性分析Sensitivity Analysis来回答这个问题。我们将系统地改变某一个参数同时固定其他参数观察关键输出指标如total_met,final_connections如何变化。def sensitivity_analysis(param_name, param_values, num_sims_per_value200): 执行单参数敏感性分析。 Args: param_name: 参数名如 student_rate param_values: 该参数的一系列取值 num_sims_per_value: 每个参数值运行的模拟次数 Returns: DataFrame包含不同参数值下的结果均值 results_list [] base_rates [2, 15, 10, 6, 4, 2] # 默认各阶段速率 for value in param_values: print(f正在测试 {param_name} {value} ...) # 根据参数名修改对应的参数 if param_name student_rate: stage_rates [base_rates[0], value, base_rates[2], base_rates[3], base_rates[4], base_rates[5]] elif param_name base_forget_prob: # 这里需要修改LifeSimulator类以接收此参数为了简化我们暂时用注释说明思路 # 实际操作中需要将base_forget_prob作为类初始化参数并在_update_connections中使用 pass else: stage_rates base_rates # 其他情况用默认 totals [] finals [] for _ in range(num_sims_per_value): sim LifeSimulator(stage_ratesstage_rates) res sim.run_simulation() totals.append(res[total_met]) finals.append(res[final_connections]) results_list.append({ param_name: value, avg_total_met: np.mean(totals), std_total_met: np.std(totals), avg_final_conn: np.mean(finals), std_final_conn: np.std(finals) }) return pd.DataFrame(results_list) # 示例分析“学生时代年均结识人数”的影响 student_rates [5, 10, 15, 20, 25, 30] # 测试从低到高不同的社交活跃度 df_student_sensitivity sensitivity_analysis(student_rate, student_rates, num_sims_per_value100) # 绘制敏感性分析图 fig, (ax1, ax2) plt.subplots(1, 2, figsize(14, 5)) # 图1对一生相识总数的影响 ax1.errorbar(df_student_sensitivity[student_rate], df_student_sensitivity[avg_total_met], yerrdf_student_sensitivity[std_total_met], fmt-o, capsize5, colorb) ax1.set_xlabel(学生阶段年均结识人数期望值) ax1.set_ylabel(一生相识总人数均值±标准差) ax1.set_title(学生时代社交活跃度对“相识总数”的影响) ax1.grid(True, alpha0.3) # 图2对最终社交圈规模的影响 ax2.errorbar(df_student_sensitivity[student_rate], df_student_sensitivity[avg_final_conn], yerrdf_student_sensitivity[std_final_conn], fmt-o, capsize5, colorr) ax2.set_xlabel(学生阶段年均结识人数期望值) ax2.set_ylabel(晚年保持联系人数均值±标准差) ax2.set_title(学生时代社交活跃度对“最终社交圈”的影响) ax2.grid(True, alpha0.3) plt.tight_layout() plt.show()通过这样的分析你可能会发现对“一生相识总数”student_rate学生时代速率有近乎线性的巨大影响。因为它持续时间长16年且速率高。对“最终社交圈规模”student_rate的影响是正向的但存在“边际效应递减”。因为学生时代认识的人随着时间推移大部分也会失联。最终能留下的往往是那些stability稳定度高的人。而base_forget_prob基础失联概率和stability_factor稳定度因子对最终规模的影响可能更为关键。实操心得进行敏感性分析时不要一次性改变太多参数否则无法厘清因果关系。一次只改变一个并运行足够多次模拟如100次以上以减少随机误差。这能帮你找到模型中真正的“杠杆点”。8. 模型局限性与扩展方向我们这个模型当然是对极度复杂现实的一种简化。认识到它的局限性和知道它能做什么同样重要。主要局限性同质化假设模型假设每个人每年的结识概率是相同的且认识的人的“质量”稳定度分布也是相同的。现实中性格外向与内向的人差异巨大。被动社交模型主要模拟了被动或半被动的结识如同事、同学对主动拓展社交如通过兴趣社团、社交媒体的模拟不足。关系网络结构我们只模拟了“我”与“他人”的一对一关系没有模拟“他人”与“他人”之间的关系。现实社交网络是图结构朋友的朋友可能成为你的朋友三元闭包这能极大加速社交圈的扩张。重大人生事件模型没有纳入结婚、搬家、换城市、失业等重大离散事件这些事件会剧烈改变社交速率和失联概率。有趣的扩展方向引入个体差异创建不同性格的Agent如“社交达人”、“居家型”赋予他们不同的stage_rates和stability生成规则。模拟社交网络图使用networkx库。让每个Person对象成为一个节点“认识”关系成为边。这样可以研究网络的平均路径长度、聚类系数等拓扑性质。加入“重逢”机制模拟与失联多年的人重新恢复联系的概率这会让曲线在后期下降得更缓慢。利用真实数据校准如果能找到关于“人均好友数随年龄变化”的调查报告数据可以用我们的模型去拟合这些数据反向估算出更真实的stage_rates和失联参数。变成交互式应用使用Streamlit或Gradio快速构建一个网页应用让用户滑动滑块调整参数如“你是内向还是外向”实时看到模拟的人生社交曲线和统计结果。这能极大增强模型的趣味性和互动性。构建这个模型的过程本身就是一个完整的“问题定义 - 假设建立 - 模型实现 - 模拟分析 - 结果阐释”的数据科学工作流练习。它告诉我们即使是“一生认识多少人”这样看似模糊的问题也可以通过建模和计算得到有启发性的量化洞察。最终的答案或许不重要但在这个过程中我们对社交关系的动态性、对人生不同阶段的重心转移有了更结构化的思考。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价