目录

一、数据准备

二、缺失值处理

三、清洗数据

四、聚类分析

五、结果评估与分析

三、清洗数据

对categorical data特征进行观察。发现很多特征属于偏态分布或分类太多,对于我们进行分析是非常不利的,因此需要对部分数据合并。

1)workclass

在进行合并时。一些和我们分析的目标相关的关键信息是需要单独保留的。比如self-employed,对于评估个人收入高低很有帮助。其他的部分选择合并。

government_jobs = df.workclass.str.endswith('-gov')

df.loc[government_jobs,'workclass'] = 'Government'

others = df.workclass.isin(['Retired','Without-pay','Never-worked','Unknown'])

df.loc[others,'workclass'] = 'Other'

df.workclass = df.workclass.replace({"Self-emp-not-inc":"Freelance","Self-emp-inc":"Proprietor"})

2)对education分析

学校教育对于个人的收入还是有比较大的影响的,但是7th-8th和9th似乎差别不太,这里就需要对于美国教育有一定的了解才能够准备的对结果合并。我们将学校教育划分为三类,Primary, Secondary, Tertiary等三类。

primary = df.education.isin(['Preschool', '1st-4th', '5th-6th'])

df.loc[primary,'education'] = 'Primary'

secondary = df.education.isin(['Some-college', '11th', '9th', '7th-8th', '10th','12th','HS-grad','Assoc-voc'])

df.loc[secondary,'education'] = 'Secondary'

teriary = df.education.isin(['Bachelors', 'Masters', 'Doctorate', 'Prof-school','Assoc-acdm'])

df.loc[teriary,'education'] = 'Tertiary'

划分后结果如下:

3)maritalstatus婚姻状况

婚姻状态基本可以合并成已婚,未婚就可以了,并用数字0,1表示就可以了。

df.maritalstatus = (df.maritalstatus != 'Never-married').astype(int)

4)occupation职业

个人的工作对于收入的高低是相关性很高的特征, 因此划分职业按潜在收入高低划分,我们先对职业和收入进行对比。

income_per_occupation = df[['occupation','income']].groupby('occupation').income.value_counts().unstack()

但是只观察上面的关系图并不能很好的帮助我们直接对职业划分,需要进一步观察高收入人群的占比情况,因此通过下面:

income_per_occupation = (income_per_occupation.large /      income_per_occupation.sum(1)).sort_values(ascending=False)

得到结果如下:

可以按高收入占比进行划分,将占比大于0.33归为high,(0.2,0.33)归为med,小于等于0.2的归为low

high_earnings = df.occupation.isin(income_per_occupation[income_per_occupation >= 0.33].index.tolist())

df.loc[high_earnings,'occupation'] = 'High'

mid_earnings =     df.occupation.isin(income_per_occupation[(income_per_occupation > 0.20) & (income_per_occupation < 0.33)].index.tolist())

df.loc[mid_earnings,'occupation'] = 'Med'

low_earnings = df.occupation.isin(income_per_occupation[income_per_occupation <= 0.20].index.tolist())

df.loc[low_earnings,'occupation'] = 'Low'

接下来剩下None值,由于数量少,将它归到Med中。

5)relationship

对收入高低的影响关系来看,身份是Husband或Wife还是比较重要的,而且各自的市场价值也不相同,根据一份报告,将消费投资和市场价值人群划分如下:少女>儿童>少妇>老人>狗>男人。Husband和Wife,这个特征更像是将性别和婚姻状态的混合,或许可以考虑对婚姻状态的验证和填充使用。下面观察一下‘Own-Child’和年龄的关系

通过分布结果看的话,并不是直觉意义上拥有小孩的情况,如果是拥有小孩的话,应该是随着年龄的增长而增长才对。应该30岁之前的未婚的占多数。因此对于会不会影响个人收入或潜在价值,很难说。那么对于‘Not-in-family’、‘Own-child’、'Unmarried'和'Other-relative' 四个就归为‘Other了’。

或者如果愿意的话,划分为Husband、Wife,unmarried和other也是可以的,其实本来就没有所谓的准确答案,具体哪个更优,可以通过聚类效果来抉择。

not_spouse = df.relationship.isin(['Not-in-family', 'Own-child', 'Unmarried', 'Other-relative'])

df.loc[not_spouse, 'relationship'] = 'Other'

再看效果:

6)race种族

乍一看,白人遥遥领先啊,对个两两合并的方式肯定也不凑效了,只能直接将race划分为white和非white了。 df.race = (df.race == 'White').astype(int)。

对于sex特征,只有Male和Female,不需要做任何的处理,可以直接用了。

7)nativecountry

USA又是一巨无霸,而且涉及到很多的国家,如果简单的将结果分为USA和非USA,肯定会错失很多关键信息,毕竟国家的发展状况还是会影响到个人收入的,因此可以将国家GDP考虑进来,将GDP按高低分段。或按发达国家,发展中国家和贫穷国家划分都是可选的方案的。嗯,这就交给你们去实践了,实验就按USA和非USA来了。

df.nativecountry = (df.nativecountry == 'United-States').astype(int) 。Categorical的清理工作已经完成,还剩下最关键的income和continuous没有处理了。

8) continuous连续变量

特征中出现连续变量的有三个,hoursperweek,capitalgain,capitalloss等三个,由于hoursperweek中40小时占比还挺大,可以考虑按40小时,小于40小时,大于40小时方式划分三段。或者将结果做归一化到[0,1],然后直接使用特征。

而capitalgain,capitalloss出现严重的偏态分布。而且非常的稀疏,需要确定一下是否存在使用价值。

将capitalgain,capitalloss放在一起比较,看是否存在某种关系。

果然,两个更像是一个特征,因为一个人不可能同时收益和损失,所有的点都在数轴上。可以考虑将两个特征合并成新的特征,has_capital_account, has_losses, has_gains。

处理好之后的数据如下:

是不是以为就结束了,但是还有一步没做,目前的结果并不能直接放到模型中,还需对特征,转变哑变量,利用pd.get_dummies处理。还有将目前income处理成is_large数值类型,

df['y'] = (df.income == 'large').astype(int)

其他暂时做空值处理。我们接下来对income的空值利用RandomForest来进行预测,用预测的结果填充income空值。

from sklearn.ensemble import RandomForestClassifier as RF

from sklearn.cross_validation import cross_val_score

data = df.select_dtypes(['int','float'])

X = data[data.y.notnull()].drop('y',axis=1)

y = df.y[df.y.notnull()]

X_new = df[df.y.isnull()].select_dtypes(['int','float']).drop('y',axis=1)

cls = RF(25, n_jobs=-1)

cross_val_score(cls,X,y,'roc_auc',cv=5)

打印出结果[ 0.8726842 ,  0.86185507,  0.86925446,  0.87965868,  0.87036015],效果还不错。接下来对空值进行预测。

cls = RF(25, n_jobs=-1)

cls.fit(X,y)

df.y[df.y.isnull()] = cls.predict(X_new)

接下来就是将object类型转变Categorical,float类型转变int类型。到此,数据清洗和缺失值的处理的过程就全部完成了。

四、聚类分析

在做聚类之前,需要做特征选择,选出一些和income相关性高的特征出来,再做聚类分析。这样聚类得到的结果可信度高。将特征与income做比较。下面选出一组分析。

通过比较Earning Potential,Relationship与income有强关联。将Relationship与income的占比情况分布。因此Relationship为Wife和Husband中高收入占比较高,因此与高income具有关联性,因此在聚类时,可以选为分类的特征。

类似方法,选择了如下特征:

'age','sex_male','is_married','is_white','education_tertiary','earning_potential_high','relationship_husband','relationship_wife',‘hoursperweek’

作为聚类的特征。其中需要age和hoursperweek做归一化到[0,1]中。

接下来调用sklearn.cluster中的KMeans做聚类,但是做聚类之前,要考虑聚类后的结果具可解释性,能够对具体营销有指导意义,因此需要确定最大K值的选取,如果k值太大,聚类本身也就失去意义,举个极端的例子,如果每个数据本身成为一个类别呢。

但是具体的k值,选取需要按照一定指标选取,我们先选取k=2,3,4,5,6,7得到聚类。

kmeans = KMeans(k,)

kmeans.fit(X)

另外考虑实际运行环境,聚类时,随机选取10000样本来做。

五、结果评估与分析

评估的的指标是通过计算Silhouette Score,它是通过簇内距离a与簇外距离b的比,(b - a) / max(a, b),能很好的评估聚类的效果。

可以发现在k=5之后,Silhouette Score的增长减缓,因此选择k=5作为聚类的k值比较合理的选择。利用k=5重新训练模型,最后得到分类的情况如下:

2.0    2751

0.0    2603

1.0    2175

3.0    1451

4.0    1020

接下来分类后的特征对于分类:

后续对于聚类的解释,可能就需要加入具体的场景和业务背景知识了。

参考:

KMeans:http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

Silhoutte Score:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html


免责声明:本文系网络转载。版权归原作者所有。如涉及版权,请联系删除!

数据分析小实验(下)相关推荐

  1. Kali Linux下口令字典破解WAP2加密小实验

    仅仅是一个新手的小实验,不具有实际意义,记录下流程.用口令字典是暴力破解,字典越大越好,上不封顶,实验测试我只用了一个常用很小的弱口令字典. 环境: win10笔记本 迅捷FAST FW150U US ...

  2. 线下零售行业要看看的数据分析小要求

    它来了,它来了,大数据时代真的来了,对于线下零售行业来说,他们大部分都把注意力放在线上的数据收集和分析了,线上的数据收集更加简单,互联网带来的庞大数据量对我们的决策起到了至关重要的作用.但是,线下零售 ...

  3. python toimage函数 -baijiahao_财码Python管理会计小实验成本性态分析So Easy

    欢迎来到财码Python管理会计小实验系列课程,今天是小实验系列的首篇--成本性态分析. 用Python,So Easy~~  话不多说,直接入题--管理会计知识点回顾成本性态,是指成本与业务量之间的 ...

  4. 数据分析挖掘实验报告及算法源码

    数据分析挖掘实验报告及算法源码 四个实验21面,帮助你学习参考使用,帮助你取得更好成绩 报告地址:数据分析挖掘实验报告及其算法源码 1.Apriori关联规则算法 必修 实验类型 设计 Python3 ...

  5. CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 背景 测试CMSInitiatingOccupancyFracti ...

  6. 【 FPGA 】按键消抖与LED灯流动小实验

    记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...

  7. 用计算机做科学实验评课,科学小实验课程听课心得

    010在线为您甄选多篇描写科学小实验课程听课心得,科学小实验课程听课心得精选,科学小实验课程听课心得大全,有议论,叙事 ,想象等形式.文章字数有400字.600字.800字....缓存时间: 2021 ...

  8. 菜鸟学习JavaScript小实验之函数引用

      function tt()         {             alert(11);         }         var b = tt;         var b1 = tt() ...

  9. Batchsize不够大,如何发挥BN性能?探讨神经网络在小Batch下的训练方法

    由于算力的限制,有时我们无法使用足够大的batchsize,此时该如何使用BN呢?本文将介绍两种在小batchsize也可以发挥BN性能的方法. 本文首发自极市平台,作者 @皮特潘,转载需获授权. 前 ...

最新文章

  1. 听说这是互联网公司招工时忽悠的黑话? | 每日趣闻
  2. 2019全国普通高校学科竞赛排行榜发布
  3. ‘pip 安装第三方库速度太慢’的解决办法
  4. 2. Web Dynpro for ABAP :Component Controller
  5. iOS cell 里需要创建n个元素
  6. python数据可视化库 动态的_python --数据可视化(一)
  7. python——深拷贝与浅拷贝的区别
  8. Nginx实现高可用的工作原理
  9. 图表插件Highcharts的动态化赋值,实现图表数据的动态化设置显示
  10. Promise第三篇:async和await关键字
  11. 汉王云名片识别(SM)组件开发详解
  12. java上传图片到target目录,jsp如何访问target里的图片路径
  13. kibana-7.3.0安装配置
  14. java定义整形输出_java程序命令行接受字符转换为整形并相加输出
  15. UPPERERR.txt
  16. 原来这些网站功能这么强?做梦都没想到那些软件都不是他的对手!
  17. linux查看445端口状态,linux和Windows如何查看端口占用情况
  18. 冒险岛单机服务器修改,关于一树冒险岛单机技能 转数最新修改
  19. VMware 虚拟机操作命令收集
  20. 五粮液前三季净赚173亿背后:Q3净利增速下滑,3大流通股东减持

热门文章

  1. 名果黑的Mac装机必备
  2. python统计单词出现次数
  3. 测试与自动化测试,记测试工具Go4Api的诞生
  4. 攻防技术第二篇之-知己(防御手段)
  5. 你要学习,你要学习,你要学习
  6. 守望先锋打开黑屏闪退,已经重装过好几次都没用? 真正原因在这里
  7. 音频特效生成与算法 1
  8. 处理火绒弹窗拦截无法开机启动
  9. python在tk界面播放本地视频_tkinter做一个本地视频播放器(2)——弹幕
  10. 华为荣耀计算机设置,华为荣耀路由器设置(手机和电脑设置)的方法(图文详解)...