题目:

生成“不同类型男女配对成功率”矩阵图

要求:

  1. 以之前1万男+1万女实验的结果为数据
  2. 按照财富值、内涵值、外貌值分别给三个区间,以区间来评判“男女类型”
    1. 高分(70-100分),中分(50-70分),低分(0-50分)
    2. 按照此类分布,男性女性都可以分为27中类型:财高品高颜高、财高品中颜高、财高品低颜高、… (财→财富,品→内涵,颜→外貌)
  3. bokhe制图

    1. 散点图
    2. 27行*27列,散点的颜色深浅代表匹配成功率

      提示:

  4. 注意绘图的数据结构

  5. 这里散点图通过xy轴定位数据,然后通过设置颜色的透明度来表示匹配成功率
  6. alpha字段为每种类型匹配成功率标准化之后的结果,再乘以一个参数
    1. data[‘alpha’] = (data[‘chance’] - data[‘chance’].min())/(data[‘chance’].max() - data[‘chance’].min())*8

导入库

  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.io import output_notebook
  11. output_notebook()
  12. # 导入notebook绘图模块
  13. from bokeh.plotting import figure,show
  14. from bokeh.models import ColumnDataSource,HoverTool
  15. # 导入bokeh绘图模块

数据清洗

首先在这里,我们作分析使用的数据是之前1万男性与1万女性样本最后的结果数据match_success1,同样的我们需要将match_success1数据复制后,使用样本数据进行操作。然后通过Pandas的merge方法合并数据,得到男女的各项分值,并筛选出分析作图所需要的字段,代码如下:

  1. graphdata2 = match_success1.copy()
  2. graphdata2 = pd.merge(graphdata2,sample1_m1,left_on = 'm',right_index = True)
  3. graphdata2 = pd.merge(graphdata2,sample1_f1,left_on = 'f',right_index = True)
  4. # 合并数据,得到成功配对的男女各项分值
  5. graphdata2 = graphdata2[['m','f','apperance_x','character_x','fortune_x','apperance_y','character_y','fortune_y']]
  6. # 筛选字段

图片.png
筛选得到所需的数据以后,我们需要对数据进行进一步处理,为数据设置三个区间,分别是高分(70-100分),中分(50-70分),低分(0-50分),然后根据不同字段的不同值,将数据按照财富、内涵、颜值的不同阶段划分成27个类型,代码如下:

  1. graphdata2['for_m'] = pd.cut(graphdata2['fortune_x'],[0,50,70,500],labels = ['财低','财中','财高'])
  2. graphdata2['cha_m'] = pd.cut(graphdata2['character_x'],[0,50,70,500],labels = ['品低','品中','品高'])
  3. graphdata2['app_m'] = pd.cut(graphdata2['apperance_x'],[0,50,70,500],labels = ['颜低','颜中','颜高'])
  4. graphdata2['for_f'] = pd.cut(graphdata2['fortune_y'],[0,50,70,500],labels = ['财低','财中','财高'])
  5. graphdata2['cha_f'] = pd.cut(graphdata2['character_y'],[0,50,70,500],labels = ['品低','品中','品高'])
  6. graphdata2['app_f'] = pd.cut(graphdata2['apperance_y'],[0,50,70,500],labels = ['颜低','颜中','颜高'])
  7. # 指标区间划分

由于后期的作图,我们需要将每一个男性数据,或者女性数据的财富、颜值与内涵三个字段,其数据处于的范围合并在一起,例如“财低品高颜高”这种类型的数据,因此我们需要将每一条数据的区间描述转换成字符串,然后将其合并,并筛选出作图所需的字段,代码如下:

  1. graphdata2['type_m'] = graphdata2['for_m'].astype(np.str) + graphdata2['cha_m'].astype(np.str) + graphdata2['app_m'].astype(np.str)
  2. graphdata2['type_f'] = graphdata2['for_f'].astype(np.str) + graphdata2['cha_f'].astype(np.str) + graphdata2['app_f'].astype(np.str)
  3. graphdata2 = graphdata2[['m','f','type_m','type_f']]
  4. # 筛选字段

图片.png

匹配成功率计算

在这一步是为了计算每一种类型匹配成功的概率,例如“财低品高颜高”这种类型的男性与“财中品中颜中”匹配成功的概率,同时为了后期做散点图时,匹配的称功率越高,点的颜色越深,在此还需要做一个标准化处理用来设置点的透明度,代码如下:

  1. # 匹配成功率计算
  2. success_n = len(graphdata2) #匹配成功的数据长度
  3. success_chance = graphdata2.groupby(['type_m','type_f']).count().reset_index()#统计每一种类型匹配成功的数量
  4. success_chance['chance'] = success_chance['m']/success_n #计算每一种类型,匹配成功的成功概率
  5. success_chance['alpha'] = (success_chance['chance'] - success_chance['chance'].min())/(success_chance['chance'].max() - success_chance['chance'].min())*8 # 设置alpha参数

图片.png

Bokeh绘图

  1. # bokeh绘图
  2. output_file('C:\\Users\\RaingEye\\Desktop\\数据分析项目实战\\婚恋配对实验\\pic2.html')
  3. mlst = success_chance['type_m'].value_counts().index.tolist()
  4. flst = success_chance['type_f'].value_counts().index.tolist()
  5. source = ColumnDataSource(success_chance) # 创建数据
  6. hover = HoverTool(tooltips=[("男性类别", "@type_m"),
  7. ("女性类别","@type_f"),
  8. ("匹配成功率","@chance")]) # 设置标签显示内容
  9. p = figure(plot_width=800, plot_height=800,x_range = mlst, y_range = flst,
  10. title="不同类型男女配对成功率" ,x_axis_label = '男', y_axis_label = '女', # X,Y轴label
  11. tools= [hover,'reset,wheel_zoom,pan,lasso_select']) # 构建绘图空间
  12. p.square_cross(x = 'type_m', y = 'type_f', source = source,size = 18 ,color = 'red',alpha = 'alpha')
  13. # 绘制点
  14. p.ygrid.grid_line_dash = [6, 4]
  15. p.xgrid.grid_line_dash = [6, 4]
  16. p.xaxis.major_label_orientation = "vertical"
  17. # 设置其他参数
  18. show(p)

图片.png