居民幸福感挖掘

发布时间:2019-06-28 浏览次数:175

                                                                     作者:武锦、陈桦、何健


 背景介绍及课题简介

1.     背景介绍

对于幸福感的定义,往往因人而异。有人认为身体健康就是幸福,有人认为生活富裕就是幸福,还有人认为社会公平了才能幸福。在社会科学领域,幸福感的研究占据了一个很重要的位置,它涉及到很多学科,比如哲学、心理学、社会学等等,这些学科更多地是从一个宏观的角度去解释大众幸福度受到哪些因素的影响。在日常生活中,幸福感与大家息息相关,每个人对幸福感都有自己的衡量标准。因此,如果能发现影响幸福感的共性,生活中将多一些乐趣;如果能找到影响幸福感的政策因素,便能通过优化资源配置来提升国民的幸福感。

目前的社会科学研究,大多注重变量的可解释性和未来政策的落地,主要采用了线性回归和逻辑回归的方法,在收入、健康、职业、社交关系、休闲方式等经济人口因素,以及政府公共服务、宏观经济环境、税负等宏观因素上做了一系列的推测和发现。

此次,我们尝试了幸福感预测这一经典课题。由于影响幸福感的因素有很多,比如收入、健康、职业、社会公平等等,关系较为复杂,用较为简单的线性模型也许不足以刻画这些因素和幸福感的关系。因此,我们希望尝试现有社会科学研究外维度的算法,比如基于树的模型,充分发挥统计学科的优势,挖掘潜在的影响因素,发现更多可解释、可理解的相关关系,挖掘幸福感的潜在影响因素。

 

2.     数据集简介

我们的课题是取自阿里云天池平台,数据来源于中国人大某中心主持的社会调查项目,涉及全国多个省份,采用问卷调查的方式。基于问卷调查的结果,提取了其中40多个特征,目标变量是居民对幸福感的评价,评价分为两类:幸福度较低(1)和幸福度较高(0)。我们希望通过这些特征来预测其对幸福感的评价。

数据集描述如表1所示:

问题类型

二分类问题

问题领域

社会科学

实例数量

8000

响应变量

二分类变量

特征数量

40

缺失值

nan

1社会调查数据集描述

      

数据集的响应变量是happiness,即居民幸福度,是一个二分类变量,1表示幸福度较低,0表示幸福度较高。数据集的解释变量有40个,分为数值型变量、分类型变量和时间类型变量,主要分为三类:个体变量(性别、年龄、地域、职业、健康、婚姻与政治面貌等等)、家庭变量(父母、配偶、子女、家庭资本等等)和社会态度(公平、信用、公共服务等等)。表2中详细解释了41个变量的各种取值和对应含义。

变量名称

问卷问题

变量类型

取值含义

happiness

幸福感

分类型 0-1变量

0-幸福度较高;1-幸福度较低

survey_type

样本类型

分类型

1-城市;2-农村

province

采访地点

分类型

1-31分别代表31个省

city

采访地点

分类型

地级市编码

county

采访地点

分类型

/区编码

survey_time

问卷当前时间

时间类型

-

gender

性别

分类型

1-男;2-

birth

出生年份

数值型

-

nationality

民族

分类型

1-汉;2-蒙;8

religion

是否有宗教信仰

分类型

0-否;1-

religion_freq

参加宗教活动的频繁程度

分类型

1-9,频率由低到高

edu

教育程度

分类型

1-14,程度由低到高

income

年收入

数值型

-

political

政治面貌

分类型

1-群众; 2-共青团员; 3-民主党派; 4-共产党员;

floor_area

住房面积

数值型

-

height_cm

身高

数值型

单位:cm

weight_jin

体重

数值型

单位:斤

health

健康状况

分类型

1-5,由坏到好

health_problem

健康问题影响到工作生活的程度

分类型

1-5

depression

最近心情沮丧程度

分类型

1-5,由严重到轻微

hukou

户口状况

分类型

1-88种类别

socialize

社交频率

分类型

1-5,由少到多

relax

放松频率

分类型

1-5,由少到多

learn

学习频率

分类型

1-5,由少到多

equity

认为社会是否公平

分类型

1-5,由不公平到公平

class

认为所处等级

分类型

1-10,由低到高

work_exper

工作经历

分类型

1-66种工作

work_status

工作状况

分类型

1-99种工作状况

work_yr

工作年限

数值型

-

work_type

工作性质

分类型

1-全职;2-非全职

work_manage

工作管理情况

分类型

1-44种管理情况

family_income

家庭总收入

数值型

-

family_m

家庭成员数量

数值型

-

family_status

家庭经济状况

分类型

1-5,由低到高

house

房产数量

数值型

-

car

是否有小汽车

分类型

1-有;2-没有

marital

婚姻状况

分类型

1-77种婚姻状况

status_peer

在同龄人中的社会经济地位

分类型

1-3,由高到低

status_3_before

3年前相比社会经济地位变化

分类型

1-上升;2-差不多;3-下降

view

所持观点和大众一致情况

分类型

1-5,由少到多

inc_ability

收入是否合理

分类型

1-4,由合理到不合理

2数据集变量概述

 

二、       模型简介

本次课题用到的模型主要有:Logistic回归、随机森林、XGBoost。最后尝试用Easy Ensemble的方式对这3种模型做进一步集成,以下是这几个模型的简单介绍。

1.     Logistic回归

假定观测值,因变量i=1,…,N,并假定因变量取值为10,构建Logistic模型为:

通过对训练集的拟合,可以得到相对应的,得到Logistic回归模型,再对测试集的数据进行预测,判断模型的效果。

 

2.     随机森林

随机森林是一种经典的集成学习方法,它的基本思想是用随机的方式建立一个森林,在森林里有很多决策树组成,每一棵决策树之间是没有关联的。在分类问题中,当有一个新样本的时候,我们让森林中的每一棵决策树分别进行预测,判断这个样本属于哪一类,然后用多数投票的方式,哪一类被选择的多,就将那一类作为最终的分类结果。在回归问题中,随机森林输出的是所有决策树输出的平均值。

 

3.     XGBoost

XGBoost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量kaggle选手选用它进行数据挖掘比赛。XGBoost算法比较复杂,针对传统GBDT算法做了很多细节改进,包括损失函数、正则化、切分点查找算法优化、稀疏感知算法、并行化算法设计等等。

 

4.     Easy Ensemble

以上我们分别建立了3种分类模型,最后,我们考虑将几个模型进行集成。由于两类样本占比约为4:1,存在一定的不平衡现象,因此尝试采用Easy Ensemble方法,用以减小样本不平衡带来的影响。

Easy Ensemble的主要思想是将数量较多的那类样本随机切分成k个子集,每次用k个子集中的1个,连同另一类样本一起建模,这样得到k个模型,最后再将k个模型进行集成,得到一个最终的分类模型。Easy Ensemble的大致流程如下:


1 Easy Ensemble大致流程

 

三、       实例分析

1.     数据预处理

本数据集共有8000条居民社会调查数据,用这8000条数据进行建模,自变量数为40个,因变量为居民幸福感(1 = 幸福度较低,0 = 幸福度较高)。其中80%作为训练数据,20%作为测试数据。

2.     数据清洗

首先,大致观察一下数据格式,检查缺失值和异常值。

检查数据的缺失值情况,发现其中四列变量的缺失值较多,缺失率达到近70%,分别是如下变量:

Ÿ   work_status:工作状况(合伙人、个体工商户、自由职业等)

Ÿ   work_yr:工作年限

Ÿ   work_type:工作性质(全职、非全职)

Ÿ   work_manage:管理活动情况(是否管理别人、是否受别人管理等)

对于这四列变量,由于缺失值较多,因此将其直接删除。此外,family_income,即家庭收入一列存在少量缺失,考虑用中位数填补。

检查异常值情况,由于很多数据列存在一种异常值情况:-1 = 不适用;-2 = 不知道;-3 = 拒绝回答;-8= 无法回答。检查异常数据数量后,将所有出现过这几类异常值的行删除。

接着,对变量做了初步筛选,删除了一些列,主要有以下三类:

1)  数据集中的id(编号)是无用列,直接删除。

2)  数据集中的survey_time列表示调查时间,而该社会调查是在一小段时间内集中进行的,因此,我们认为在这段时间内,居民的各项特征不会发生较大变化,因此将这一列剔除。

3)  数据集中有provincecitycounty三列,分别表示省份、城市和县区,由于citycounty两列中的类别较多,分别由89134种,且调查未给出这些序号对应的城市,因此将这两列删除。

最后,我们将birth转换为年龄,再将数值型变量做等频率分箱。分箱处理如下:

1) 将incomefamily_income列等频率分为4类;

2) 将height_cmweight_jin列等频率分为5类。

3.     探索性数据分析

3.1  个人特征

由于变量比较多,这边只挑出部分图来来简单看下。图2是被调查者所属的类型(1-城市,2-农村),蓝色和黄色块分别表示幸福度较高和幸福度较低的人群。可以看出两类样本在这个变量上有微小的差异。现在城镇化速度加快,很多农村地区的基础设施都不断地完善,加上国家对三农问题的重视,农村的条件正在不断改善。但和城市相比起来,可能还有些差距,这可能也导致了不幸福人群中,农村类型占比要略过提高。

3显示了被调查者过去一个月感到心情抑郁或者沮丧的频繁程度,数字越小表示越频繁。可以看到心情是很影响个人对幸福感的掌控的。可以很明显的看出,不幸福的人过去一个月的心情往往是比较低落的。这种大家一看就很明白,心情不好,也就会难以发现生活中其他很多有趣的事,幸福度自然就会低很多。还有一些其他的个人特征,比如健康问题啊,年龄啊等等,都可以通过画这样的图来直观的看下特征的区分度。


2被调查者所属类型 图3被调查者心情沮丧频繁程度

 

3.2  家庭特征

下面,同样通过简单的可视化看看家庭因素对个人幸福度的影响。图4显示的是家庭住房面积的影响。我们也对其进行了分箱处理,0-4顺次表示家庭住房面积的升高。可以明显的看出家庭住房面积低的人要更倾向于不幸福。

5反映的是家庭经济状况在所在地属于哪一档,数字越大表示档次越高,3表示平均水平,我们也可以看出,不幸福的人群在地低于平均水平部分占比很大,而幸福的人群中,一半以上集中在平均水平。这儿得出的结论也显而易见了,只要不低于所在地平均水平,人还是比较容易满足的,这也就是说,只要大家都差不多,是多是少都不是问题。这也印证了中国一句古话,“不患寡而患不均”,自己碗里那么少,再看看别人的蛋糕那么大,自然会有心里落差,哪儿再谈幸福感。因此,缩小贫富差距,把蛋糕分好,其实是提高大众幸福感很重要的一个因素。


4家庭住房面积 图5家庭经济状况

 

3.3  社会态度

       最后我们再简单看下,社会态度这一因素对大众幸福感的影响。社会态度这些因素主要描述的是大众对自己社会的融入度的判断。主要反映自己认为自己在社会中的地位、对社会热点问题和大众看是否一致这些方面。从图中就可以看出,这些特征在两类样本中的取值还是有较大差异的。拿图6图简单说下,描述的是个人认为自己处于哪个等级之上,1-10顺次表示等级的提高。可以看出不幸福人群主要集中在社会底层中,这群人属于社会弱势群体,拥有的社会资源也比较少。从这一变量还是看出,社会公平的重要性。


6社会地位 图7在同龄人中的地位

3.4  列联表卡方检验

从以上的分析中,我们可以从图形上直观的看出哪些变量对幸福感有较大的影响,还有些特征在2类差异中不是很大,光从图形上难以决断,因此,下面我们对这些变量采用列联表卡方检验,看看哪些特征对因变量没有显著影响。

个人特征

卡方检验P

性别

0.86

民族

0.81

是否信仰宗教

0.14

参加宗教活动的频率

0.95

身高

0.06

3列联表卡方检验结果

从检验的结果来看,性别、名族、宗教信仰、身高这几个变量没有通过卡方检验,认为这几个变量对幸福感的影响不是很大。所有家庭特征、社会态度特征均通过显著性检验,说明家庭、个人在社会中的定位以及社会认同感对幸福感影响还是很大的。

 

4.     模型建立与评估

通过简单的探索性数据分析,大致可以看出哪些特征对幸福感比较重要,哪些特征可能无关紧要。下面我们可以基于上面的分析,根据已有的数据建立分类模型,帮助我们根据一个人的个人、家庭、社会态度特征,判断这个人是否幸福。

为了对比,我们分别用经过特征选择后的部分特征以及使用全部特征进行建模。模型效果如下:

模型

XGBoost

Random Forest

Logistic Regression

Easy Ensemble

部分

特征

全部

特征

部分

特征

全部

特征

部分

特征

全部

特征

部分

特征

全部

特征

F1

0.54

0.56

0.53

0.52

0.54

0.52

0.54

0.56

Recall

0.73

0.75

0.62

0.61

0.63

0.61

0.70

0.72

4模型效果

从上面的结果可以看出,在单个模型中,XGBoostF1Recall指标上的效果最优。使用部分特征和全部特征建模后,F1Recall的值相差不大,也就是说明特征筛选可以在保证精度不变的情况下,有效降低模型的复杂度。将三个模型进行Easy Ensemble的效果并不显著,XGBoost的结果相仿。

5.     结果分析

5.1逻辑回归

        我们选取了逻辑回归中系数绝对值最大的前5个变量,依次如下:

1)   认为当今社会公不公平;

2)   在同龄人中社会经济定位;

3)   过去一个月感到心情抑郁或沮丧的频繁程度;

4)   和三年前比,社会经济地位发生的变化;

5)   是否有车。

可以看出,逻辑回归建立的模型确实比较有较好的解释性的,筛选出来的这几个重要特征大多属于社会态度这一类,说明一个人对这个社会的认同感对其幸福感影响还是蛮大的。

 

5.2随机森林


8随机森林中的决策树示例1


9随机森林中的决策树示例2

 

随机森林通过选取适当的阈值在该数据集上recall达到0.62,模型认为比较重要的特征有所在省份、社会是否公平、所处阶层、是否经常焦虑、受教育水平等。但和逻辑回归的结果相比,随机森林的recall还有略微降低。猜测是可能特征数量不够多的原因,导致树之间的差异不是很大,用随机森林的效果并不是很明显。上面两幅图是从随机森林中随机挑选的两个树,从结果中也可以看出,树之间的差异性不大,前几个分裂点都很相似,但模型输出的特征重要性还是比较有解释性的。

 

5.3Xgboost


10XGBoost特征重要性排序

从上面模型评估的结果可以看出,XGBoost的效果目前看来是几个模型中最好的,recall达到了0.73,较前两个模型,有0.1的提升。通过模型输出的特征重要性,排在前5个的是所在省份、所处阶层、是否健康、认为社会是否公平、是否经常焦虑,属于个人特征和社会态度。

我们将XGBoost在测试样本中正样本的分类结果进行了分析,将判对和判错的样本在不同特征上的分布绘制了出来,结果如下:


11XGBoost正样本预测结果分析

从上面的特征分布图可以看出,分错的样本并不是没有根据的。当一个人社会阶层低、经常抑郁或者焦虑、认为社会不公、家庭经济状况差的人,模型倾向于将其分为不幸福的。而那些被分错的样本在特征上和幸福的人更相似。

 

6.     总结

本文研究了大众幸福度这一经典课题,基于个人特征,包括家庭情况,社会态度等,从比较微观的角度去解释影响一个人幸福度的相关因素。以上三种模型分别选出了最重要的5个变量,具体如下:

Ÿ   逻辑回归:社会是否公平、在同龄人中社会经济定位、是否经常焦虑、和三年前比社会经济地位发生的变化、是否有车。

Ÿ   随机森林:所在省份、社会是否公平、所处阶层、是否经常焦虑、受教育水平。

Ÿ   XGBoost:所在省份、所处阶层、是否健康、认为社会是否公平、是否经常焦虑。

以上,我们总结出一个人的个人情况、对社会的认同感这两方面的因素对个人幸福感的影响比较大,家庭情况对幸福度的影响略小一些,而这些都直接受到社会公平的影响。因此从微观到宏观,基于对个人幸福感的挖掘,我们总结出提高大众幸福度还需要从提高社会公平这一角度入手才能整体有效提高大众幸福度。

在研究方法中,本文主要对比了逻辑回归模型、基于树的模型,发现XGBoost效果在保证F1基本不变的情况下,有效的提高了 Recall;基于树的模型在保证模型解释性的前提下,能够使得模型分类性能有较大的提高。

 

7.     展望

在项目过程中,我们遇到了如下几个问题:

(1)      特征中同时存在连续型数据、分类型数据,在具体使用模型时,该连续性变量是否需要分箱,以及如何分箱才更加合理,对名义型分类数据和保序型分类数据如何进行处理才能正确的利用到变量的信息来达到我们的建模目标,这些在具体实施过程中一直是比较疑惑的,后面需要对这部分的数据处理方法进一步学习。

(2)      在本文中,我们主要使用了画出变量的直方图分布以及运用列联表卡方检验的方法进行变量探索和选择,如何能够进行更加有效的变量选择,做好特征工程工作也是我们需要进一步学习的方向。

(3)      本文涉及的数据存在样本不均衡的情况,幸福感低的人群数要远小于幸福感高的人群,我们对此也使用了一些比较流行的处理非平衡样本的方法,比如EasyEnsemble方法,效果对比未作处理时有明显提升。但是,我们也发现,对非平衡样本不做处理直接建模的话,选取合适的阈值,效果同样可以上升,并且和做处理后相差不大。因此,我们的疑问是模型评估时给出的指标一般都是在使用默认决策阈值0.5的情况下,因此对非平衡样本建模最后得到的正例概率估计往往会比较小,使用默认阈值往往不太合适,因此模型评估的指标自然就会差,但如果我们改变决策的阈值,效果就会上升。而使用一些处理非平衡样本的方法时,模型评估的指标上升了,但我们使用的是默认决策阈值0.5,因此可能是非平衡处理的方法只是改变了预测概率的分布,使得使用0.5作为阈值更加合适。因此,是否需要对非平衡样本做处理,还是不做处理,只是在决策时调整我们的决策阈值,是需要讨论的地方。

(4)      在项目过程使用PySpark进行分析建模时遇到一些的问题,包括环境配置和数据探索、建模实现方面,为了解决这些问题,借助了其他的工具,后面还需要加强对spark的学习,进一步理解spark的分布式思想。