婚恋配对模拟规则

  1. 按照一定规则生成了1万男性+1万女性样本:
    1. 在配对实验中,这2万个样本具有各自不同的个人属性(财富、内涵、外貌),每项属性都有一个得分
    2. 财富值符合指数分布,内涵和颜值符合正态分布
    3. 三项的平均值都为60分,标准差都为15分
  2. 模拟实验。基于现实世界的提炼及适度简化,我们概括了三个最主流的择偶策略:
    1. 择偶策略1:门当户对,要求双方三项指标加和的总分接近,差值不超过20分
    2. 择偶策略2:男才女貌,男性要求女性的外貌分比自己高出至少10分,女性要求男性的财富分比自己高出至少10分
    3. 择偶策略3:志趣相投、适度引领,要求对方的内涵得分在比自己低10分~高10分的区间内,且外貌和财富两项与自己的得分差值都在5分以内
  3. 每一轮实验中,我们将三种策略随机平分给所有样本(即采用每种策略的男性有3333个样本)
  4. 我们为每位单身男女随机选择一个对象,若双方互相符合要求就算配对成功,配对失败的男女则进入下一轮配对

样本数据处理

内容:

  1. 按照一定规则生成了1万男性+1万女性样本
  2. 在配对实验中,这2万个样本具有各自不同的个人属性(财富、内涵、外貌),每项属性都有一个得分
  3. 财富值符合指数分布,内涵和颜值符合正态分布
  4. 三项的平均值都为60分,标准差都为15分

    要求:

  5. 构建函数实现样本数据生成模型,函数参数之一为“样本数量”,并用该模型生成1万男性+1万女性数据样本

    1. 包括三个指标:财富、内涵、外貌
  6. 绘制柱状图来查看每个人的属性分值情况

    提示:

  7. 正态分布:np.random.normal(loc=60, scale=15, size=n)

  8. 指数分布:np.random.exponential(scale=15, size=n) + 45

导入库

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import os
  5. import time
  6. #导入时间模块
  7. import warnings
  8. warnings.filterwarnings('ignore')
  9. #不发出警告
  10. from bokeh.plotting import figure, show, output_file
  11. from bokeh.models import ColumnDataSource
  12. #导入boekh绘图模块

创建数据

在这里首先,使用Pandas库创建“正态分布”的数据和“指数分布”的数据,然后绘制成柱状图观察一下数据的变化趋势,代码和结果如下:

  1. '''
  2. (1)创建数据
  3. '''
  4. data_norm = pd.DataFrame({'正态分布': np.random.normal(loc = 60, scale = 15, size = 10000)})
  5. data_exp = pd.DataFrame({'指数分布': np.random.exponential(scale =15, size = 10000) + 45})
  6. fig, axes = plt.subplots(2, 1, figsize = (10, 4))
  7. data_norm.hist(bins = 50)
  8. data_exp.hist(bins = 50)

图片.png图片.png

构建函数,生成样本数据

  1. '''
  2. (2)构建一个函数,生成样本数据
  3. '''
  4. def create_sample(n, gender):
  5. sample_data = pd.DataFrame({'fortune':np.random.exponential(scale = 15, size = n) + 45,
  6. 'apperance': np.random.normal(loc = 60, scale = 15, size = n),
  7. 'character': np.random.normal(loc = 60, scale = 15, size = n)},
  8. index = [gender + str(i) for i in range(1, n+1)])
  9. sample_data.index.name = 'id'
  10. sample_data['score'] = sample_data.sum(axis = 1)/3
  11. return sample_data
  12. sample_m = create_sample(10000, 'm') #男性样本数据
  13. sample_f = create_sample(10000, 'f') #女性样本数据

图片.png

生成堆叠柱状图

  1. fig, axes = plt.subplots(2, 1, figsize = (12, 8))
  2. sample_m[['fortune', 'apperance', 'character']].iloc[:30].plot(kind = 'bar',
  3. colormap = 'Blues_r', stacked = True, grid = True, ax = axes[0])
  4. sample_f[['fortune', 'apperance', 'character']].iloc[:30].plot(kind = 'bar',
  5. colormap = 'Reds_r', stacked = True, grid = True, ax = axes[1 ])
  6. #绘制堆叠柱状图

图片.png