B1线条情感测评数据分析

文章目录

  • B1线条情感测评数据分析
  • 概述
  • 一、数据预处理
    • 问题1数据预处理过程:
    • 问题2数据预处理过程:
  • 二、差异度定义
    • 相同气泡男生女生情绪判断差异度
    • 不同气泡情绪判断差异度
  • 三、数据可视化
    • 叠加统计图
    • 雷达图
    • 词云图:
      • 1、刷白气泡中心获取气泡边框图
      • 2、区域生长获取气泡填充图
      • 3、生成词云图
      • 4、给词云图添加边框
  • 四、合并成应用程序
    • 1、男女评价对比板块
    • 2、不同气泡对比板块
    • 3、情绪词云图板块
  • 五、视频演示地址
  • 六、总结
    • 对于本次实验
    • 对于本门课程

概述

对于该选题中的以下两个问题

  1. 男生和女生对于对白气泡的情绪判断方面有无显著差异?
  2. 如何判断不同对白气泡两两之间表现的情绪是否有显著差异?如何衡量差异程度有多大?

我们认为二者在一定程度上具有相似性,所以把这两个问题放在一起解决。对于这两个问题,我们的大致解决流程为:数据预处理(excel)——数据可视化(python)——功能合并成应用程序(pyqt)。下面将对每个部分的工作进行更详细的介绍。


一、数据预处理

在这一部分的工作中,我们是直接利用WPS软件操作数据表格来提取我们需要的信息,我们最初也尝试过用python脚本读取和操作数据表格,但是表格内容太多了导致电脑直接卡死,所以只能先利用WPS进行数据的初步筛选。

问题1数据预处理过程:

  1. 根据性别将实验1&2的数据表格拆分开
  2. 在拆分后的表格中统计每一题(每个气泡)的答题人数
  3. 在拆分后的表格中统计每一题(每个气泡)的情绪选择数据

最终我们得到了以下4行*2910列尺寸(实验1&2共97个气泡,每30列对应一个气泡)的表格(完整表格见附件):


其中第一、三行分别是男女生对于某个气泡的某种情绪的选择人数,比如对于第一行第一列的1,表示对于第一个气泡,男生中选择第一种情绪(钦佩)的总人数是1;对于第三行第三列中的10,表示对于第一个气泡,女生中选择第三种情绪(欣赏)的总人数是10。
第二、四行分别是男女生中抽中该气泡的总人数(由于每30列对应一个气泡,所以每30列的值一致),比如第二行1-30列中该值为30,表示对于第一个气泡,男生中抽到该气泡的人数是30;对于第四行的1-30列中该值为53,表示对于第一个气泡,女生中抽到该气泡的总人数是53(统计这个值的目的是为了在后面数据可视化的过程中进行数据的归一化)。

问题2数据预处理过程:

  1. 分别统计抽中每个气泡的总人数
  2. 统计每一题(每个气泡)学生的情绪选择数据

最终我们得到了以下2行*2910列尺寸(实验1&2共97个气泡,每30列对应一个气泡)的表格(完整表格见附件):


其中第一行代表所有抽到该气泡的人数(每30列对应一个气泡,所以每30列为一组,一组中该值一致)。第二行代表对于某个气泡的某种情绪的选择人数,比如对于第一列的83和6,表示抽中第一个气泡的总人数是83,在83个人中有6个人认为该气泡表现的情绪中有第一种情绪(钦佩)(其实问题二的数据可以看作是把问题一中的男女生数据合并得来)

二、差异度定义

相同气泡男生女生情绪判断差异度

对于问题一中的每个气泡,我们把男女生的情绪数据先进行归一化然后放入一个图表进行对比,比如男生中有10个人抽中气泡1,并且其中有5人认为该气泡表现的情绪中有第一种情绪(钦佩),那么在气泡1的图表中的第一维(钦佩)的值则为0.5(5/10),归一化的目的是为了让每一维的值都落在区间[0,1]内。对于女生情绪数据也做相同处理,某个气泡对应的图表中每一个维度男生女生的值相减取绝对值,再把30个绝对值累加得到的结果就是对于该气泡的情绪男生女生判断的差异度。

不同气泡情绪判断差异度

而对于问题二,我们也做和问题一类似的处理,只不过这次我们是选择两个气泡,把两个气泡情绪判断的数据分别进行归一化处理,比如有10人抽中气泡1,其中有5人认为该气泡表现的情绪中有第一种情绪(钦佩),那么该气泡对应的图表中的第一维(钦佩)的值就是0.5(5/10),归一化的目的也是为了让每一维的值落在[0,1]区间内。把两个气泡对应的图表的相应维度值相减取绝对值,再把30个绝对值累加得到的结果就是对于不同气泡情绪判断的差异度。

三、数据可视化

得到两个表格数据后我们进行数据可视化。可视化这部分的工作中我们用到的主要是python的matplotlib库。考虑到数据是多维数据(每个气泡有30个情绪数据),我们选择的可视化方式是叠加统计图、雷达图和词云图。由于叠加统计图和雷达图的制作步骤较为简单,这里对二者进行简述,对词云图进行详述。

叠加统计图

叠加统计图可以很好表现两组数据间的差异程度。每组数据有一个颜色,而颜色重叠部分则是两组数据一致的部分,颜色未重叠的部分则表现了两组数据的差异。对于问题一,我们将同一个气泡的男、女生情绪数据作为两组数据放入叠加统计图,而对于问题二,我们将两个不同气泡的情绪数据作为两组数据放入叠加统计图。效果如下图所示:


绘制叠加统计图的主要代码如下:

 #叠加统计图:传入两组数据、两个颜色、一个透明度和两个标签def barMap(self,dataList,colors,a,labels):dataNum = len(dataList)plt.figure()patches = [mpatches.Patch(color=colors[i], label="{:s}".format(labels[i])) for i in range(len(colors))]plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'plt.rcParams['axes.unicode_minus'] = Falsefor i in range(dataNum):plt.bar(range(1, 31), dataList[i], color=colors[i], tick_label=range(1, 31), alpha=a)aca = plt.gca()box = aca.get_position()aca.set_position([box.x0, box.y0, box.width, box.height])aca.legend(handles=patches, bbox_to_anchor=(0.22, 1.17), ncol=2)  # 生成legendplt.savefig("bartemp.jpg")plt.close()

雷达图

雷达图同样可以显示多维数据,我们将360度划分成30等份,每一份代表一种情绪。得到的效果如下图所示:


绘制雷达图的主要代码如下:

# 雷达图:传入两组数据、两个颜色、一个透明度、一个最大半径和两个标签def radarMap(self,dataList, colors, r,a,labels):data = dataList.copy()dataNum = len(data)# 中文和负号的正常显示plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'plt.rcParams['axes.unicode_minus'] = False# 使用ggplot的风格绘图plt.style.use('ggplot')N = len(data[0])# 设置雷达图的角度,用于平分切开一个平面angles = np.linspace(0, 2 * np.pi, N, endpoint=False)# 使雷达图封闭起来for i in range(dataNum):data[i] = np.concatenate((data[i], [data[i][0]]))angles = np.concatenate((angles, [angles[0]]))# 绘图fig = plt.figure()# 设置为极坐标格式ax = fig.add_subplot(111, polar=True)for i in range(dataNum):ax.plot(angles, data[i], 'o-', linewidth=0, label='2', markersize=0)ax.fill(angles, data[i], colors[i], alpha=a)# 添加每个特质的标签ax.set_thetagrids(angles * 180 / np.pi, emoList)# 设置极轴范围ax.set_ylim(0, r)# 添加标题# plt.title('气泡图1')patches = [mpatches.Patch(color=colors[i], label="{:s}".format(labels[i])) for i in range(len(colors))]aca = plt.gca()box = aca.get_position()aca.set_position([box.x0, box.y0, box.width, box.height])# 下面一行中bbox_to_anchor指定了legend的位置aca.legend(handles=patches, bbox_to_anchor=(0.12, 1.17), ncol=2)  # 生成legend# 增加网格纸plt.savefig("radtemp.jpg")ax.grid(True)plt.close()

词云图:

我们借助实验二的数据,以每个气泡中的各情绪选择人数作为频数,以每个气泡的形状为蒙版,为每一个气泡制作了一张情绪词云图。由于拿到的原始气泡图有色区域较小,我们首先对气泡图进行了一些处理。

1、刷白气泡中心获取气泡边框图

原始气泡图(见附件文件夹bubleDlg)

上图为初始拿到的一个气泡图,我们需要将中心也填充为白色。由于有97个气泡,利用PS之类的软件处理比较耗时间,我们这里是利用python的cv2库对图像的像素进行遍历操作,将气泡图的中心填充了一个120*120大小的白色矩形得到气泡边框图(具体代码见附件)。结果如下图所示(所有边框图见附件文件夹newDlg)

2、区域生长获取气泡填充图

词云图的蒙版图片要求有足够大小的有色区域来填充文字,所以我们将上诉气泡边框图的里面填充成黑色,同样因为气泡边框图的数量太多(97张),我们也利用python脚本进行处理,这里利用到的是数字图像处理技术课程里面教过的区域生长算法,将气泡边框图的中心点作为种子点进行区域生长,对于部分效果不是很理想的气泡边框图再利用PS进行处理,这样大大减小了工作量。得到的气泡填充图如下所示(所有气泡填充图见附件文件夹rstDlg):

3、生成词云图

利用区域生长得到的气泡填充图作为蒙版,将含30个情绪字符串的列表和每种情绪对应的频数组成的列表作为字典,利用python的wordcloud库生成词云图,得到词云图。


生成词云图主要代码:

emoList = ["钦佩", "崇拜", "欣赏", "娱乐", "焦虑", "敬畏", "尴尬", "厌倦", "冷静", "困惑","渴望", "厌恶", "痛苦", "着迷", "嫉妒", "兴奋", "恐惧", "痛恨", "有趣", "快乐", "怀旧", "浪漫", "悲伤", "满意", "性欲", "同情", "满足", "不确定", "安静", "激烈"]
#制作字典
def wordsdict():#导入表格wb=load_workbook('T2data.xlsx')#导入sheetws=wb.activerows=[]numlist=[]#获取表格内容for row in ws.iter_rows():rows.append(row)for i in range(len(rows[1])):numlist.append(rows[1][i].value)worddict=dict(zip(emoList,numlist[0:30]))return worddict#传入字典、气泡序号
def creWordcloud(mdict,idx):plt.figure(figsize=(4,4))bimg=plt.imread('rst/'+str(idx)+".jpg")WC=WordCloud(background_color='white',mask=bimg,font_path='simhei.ttf').fit_words(mdict)plt.imshow(WC)ax=plt.gca()ax.spines['top'].set_color('none')ax.spines['bottom'].set_color('none')ax.spines['left'].set_color('none')ax.spines['right'].set_color('none')plt.xticks([])plt.yticks([])plt.savefig("temp.jpg")plt.show()

4、给词云图添加边框

由于文本词汇太少导致形成的词云图形状不是很明显,我们于是给词云图加上对应的边框图(在步骤1中得到),这里也是利用python的cv2库对图像进行操作,将词云图中的非白色区域像素赋值给气泡边框图中对应位置的像素(代码见附件),效果如下图所示:

四、合并成应用程序

这部分的工作是借助python的pyqt库来完成的,包括界面的搭建和功能的组合等等,由于代码较长这里不放代码,而是对应用程序的主要功能进行介绍。我们的应用程序由三个部分构成,第一和第二个界面分别是对问题一二进行解答,而第三个界面则是每个气泡的词云图进行展示。

1、男女评价对比板块

简介: 该板块的左边的气泡图是当前选择的气泡图,男女评判的差异度表示男女生对该气泡图情绪判断的差异性大小,该值越大说明男女生对于改气泡图表现情绪的评判差异也越大。该板块左下方还有对于当前气泡图情绪评判的具体数值。
操作说明: 通过滑动条选择和切换不同的气泡,点击雷达图或者叠加统计图切换至相应样式的图表,底部设置图表样式可以改变图表的颜色和透明度。

2、不同气泡对比板块

简介: 该板块的左边的两个气泡图是当前选择的两个气泡图,初始时两个气泡一致,所以图表也是一致的,可通过两个滑块分别进行切换和选择。
操作说明: 通过滑动条选择和切换不同的气泡,点击雷达图或者叠加统计图切换至相应样式的图表,底部设置图表样式可以改变图表的颜色和透明度。

3、情绪词云图板块

简介: 显示的是当前选择的气泡图以及实时生成的气泡词云图。词云图中越大的情绪词表示越多人认为该气泡能表现出这种情绪。
操作说明: 通过滑动条选择和切换不同的气泡,相应的词云图也会进行改变。


五、视频演示地址

https://www.bilibili.com/video/bv1Wf4y1y7Mw

六、总结

对于本次实验

这部分的实验让我对于用数据统计和数据可视化来解决一个问题的完整过程有了初步的体会,开始简单认为可视化仅仅是做几张简单的图表,但这次实验让我有了不一样的看法。在这次实验过程中,我自己用excel的函数来处理表格、python处理excel数据、python制作可视化图表、python制作词云图以及应用程序搭建等技能都有了新的提高,感觉收获还是比较大的。但是也有不足的地方,比如界面的美化,因为时间的限制没有进行下去,比如对于数据还是停留在运用层面,没有进行更深入的挖掘,没有提取出更具有价值的深层信息,这些都是以后需要再加强的。

对于本门课程

本次实验也是本课程的最后一个实验,回顾最初上的几节课的时候认为这门课程是一个艺术的学科,那么艺术自然免不了与感性相挂钩,与理性相背离。但是做完最后一个实验再回想,原来艺术也是有其理性的一面,而我始终只停留在对其感性的欣赏层面,没有进行深入而理性的思考。这门课程算是我的一位艺术启蒙老师吧,如果没有这门课程也许我会与艺术终身无缘。

B1线条情感测评数据分析相关推荐

  1. 心理测评数据分析系统(Java毕业设计)

    一.选题背景介绍

  2. 基于Springboot+vue的心理测评数据分析系统(Java毕业设计)

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  3. 毕业设计之 - 大数据分析:电商产品评论数据情感分析

    文章目录 1 简介 数据分析目的 数据预处理 评论去重 数据清洗 分词.词性标注.去除停用词 提取含名词的评论 绘制词云¶ 词典匹配 评论数据情感倾向分析 修正情感倾向 LinearSVC模型预测情感 ...

  4. 暴力变现之测评小程序

    大家好,我是摹摹哥,今天又来给大家分享有趣的东西了. 最近摹摹哥在某平台刷短视频时,刷到了这个: 摹摹哥大吃一惊,现在的大数据这么牛了吗,我刚刚在某相亲平台偷偷提交完资料就刷到这么个东西! 作为适龄青 ...

  5. 小白自总结【情感分析】时、空、事件+情感

    参考赞赞的一文:https://mp.weixin.qq.com/s?__biz=MzA3MDg0MjgxNQ==&mid=2652389938&idx=1&sn=264382 ...

  6. 使用matlab判断CDMA接收码片

    CDMA码分多址matlab计算 Contents 运算前工作 原题表述: 码片长度m 发送序列为 数据分析: 运算前工作 clc clear all close all 原题表述: ▇4个站的码片序 ...

  7. 立项管理—立项建议阶段

    立项建议小组应反复进行立项调查.产品构思和可行性分析.在深思熟虑之后,立项小组撰写<项目建议书>,并申请立项. 项目立项调查过程是迭代和反复的过程,项目立项小组必须深入地进行立项调查,切不 ...

  8. MMORPG的一份Unity手游性能蓝皮书

    https://mp.weixin.qq.com/s/iEs-1O3wTntaTrrCnOBn-A 这可能是针对MMORPG最全的一份Unity手游性能蓝皮书 2017-07-21 侑虎科技 游戏葡萄 ...

  9. python(十二)Uiautomator2搭建UI自动化框架实战

    前言 由于公司UI自动化框架底层用的是Uiautomator2,所以我就用Uiautomator2搭了一套UI自动化框架,并运用某软件做了一个实战,思路其实和之前写的Appnium一样的 ps:这里其 ...

最新文章

  1. 入坑推荐系统,从Google这篇开始
  2. python中threading模块详解及常用方法_Python常用模块功能简介(二)threading
  3. MyBatis Generator分页插件RowBoundsPlugin坑
  4. fastjson转换时有大括号或者冒号或者有中括号_[Python Basic] 字符串处理以及类型转换 1...
  5. rabbitmqBat常用指令
  6. 全场景解析!基于 Flink 的12个实时数仓生产实践
  7. java考试时间,Java认证考试知识点:Java时间类的函数
  8. java俄罗斯方块说明书_俄罗斯方块java代码(java编写俄罗斯方块代码详解)
  9. [转]浅谈封装中的非技术细节 - 含减肥攻略
  10. (附源码)APP+spring boot心理健康线上咨询系统 毕业设计 031539
  11. Flask web 表单、蓝本与代码模块化
  12. mysql账号认证_浅谈MySQL用户账号认证方式
  13. 科达与中航工业签署战略合作协议
  14. matlab求二阶微分方程的通解,二阶常微分方程matlab的数值解和解析解分析总报告.ppt...
  15. my read_university
  16. linux内核原子操作的实现
  17. VBA将ppt保存为html,ppt2013怎样保存为网页的方法
  18. 查看自己本机的ip地址、DNS服务器地址
  19. 您的浏览器没有获得Java Virtual Machine(JVM)支持。可能由于没有安装JVM或者已安装但是没有启用。请安装JVM1.5或者以上版本,如果已安装则启用它
  20. Hibernate②一(多)对多的映射配置与级联操作

热门文章

  1. 求二叉树中的第一条最长路径长度,并输出最长路径上的节点
  2. 【新书推荐】【2018.11】海洋SAR遥感研究进展(第一版)
  3. 【学习笔记】斯特林反演+单位根反演
  4. [附源码]Python计算机毕业设计航空订票系统Django(程序+LW)
  5. python c++情侣网名是什么意思_c++和Python的选择?
  6. 第十一届“挑战杯”广东省大学生课外学术科技作品竞赛总结——谢凌云
  7. nodejs优雅的使用es6语法
  8. 简单描述一下redux-thunk的个人理解
  9. 知乎采集手机,轻松搞定信息收集
  10. Android开发者的寒冬:轮回之下,几人破茧,几人沉沦?