实验名称
人口收入普查数据探索
实验目的
通过特征提取,使用机器学习算法计算得到哪些因素对收入的影响最大。本实验作为机器学习入门级实 验,仅简单地针对不同学历人员的收入、不同性别人数等做统计,主要目的是使大家了解机器学习的思 想和掌握pandas库对于数据处理的操作。
实验背景
本实验为一个入门级的测试案例,希望通过这次实验帮助大家学习如何通过算法来挖掘数据中的价值: 通过截取一份人口普查的数据,对学历和收入等进行统计和分析。本案例所用数据集为UCI开源数据集 Adult,其为针对美国某区域的一次人口普查结果,共32561条数据。具体字段如下表:
字段名 含义 类型 age 年龄 double workclass 工作类型 string fnlwgt 序号 string education 教育程度 string education_num 受教育时间 double maritial_status 婚姻状况 string occupation 职业 string relationship 关系 string race 种族 string sex 性别 string capital_gain 资本收益 string capital_loss 资 本损失 string hours_per_week 每周工作小时数 double native_country 原籍 string income 收入 string
实验原理
一、机器学习和数据挖掘
机器学习(Machine Learning,ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算 法复杂度理论等多门学科。其专门研究计算机是怎样模拟或实现人类的学习行为,以获取新的知识或技 能,重新组织已有的知识结构,使之不断改善自身的性能。 数据挖掘是从海量数据中获取有效的、新颖 的、潜在有用的、最终可理解的模式的非平凡过程。数据挖掘中用到了大量的机器学习界提供的数据分 析技术和数据库提供的数据管理技术。 学习能力是智能行为的一个非常重要的特征,不具有学习能力的 系统很难称之为一个真正的智能系统,而机器学习则希望(计算机)系统能够利用经验来改善自身的性能, 因此该领域一直是人工智能的核心研究领域之一。在计算机系统中,“经验”通常是以数据的形式存在 的,因此,机器学习不仅涉及对人的认知学习过程的探索,还涉及对数据的分析处理。实际上,机器学 习已经成为计算机数据分析技术的创新源头之一。由于几乎所有的学科都要面对数据分析任务,因此机 器学习已经开始影响到计算机科学的众多领域,甚至影响到计算机科学之外的很多学科。所以,机器学 习是数据挖掘中的一种重要工具。
二、 Pandas库
Pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库 和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便 捷地处理数据的函数和方法,它可以对数据进行导入、清洗、处理、统计和输出等。所以说,它是使 Python成为强大而高效的数据分析环境的重要因素之一。
要使用Pandas库的内置函数和方法,需要先下载第三方库函数,然后利用import进行引用。
实验步骤
一、环境准备
启动jupyter。打开终端,在终端中输入下列命令,点击回车按钮后即可打开链接
jupyter notebook
二、导入相关依赖模块及库,包括导入pandas、numpy、matplotlib等。
import warnings
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
三、加载数据,载入实验所需的Adult数据集。
data = pd.read_csv(r"adult.data.csv")
data.head()
age | workclass | fnlwgt | education | education-num | marital-status | occupation | relationship | race | sex | capital-gain | capital-loss | hours-per-week | native-country | salary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 39 | State-gov | 77516 | Bachelors | 13 | Never-married | Adm-clerical | Not-in-family | White | Male | 2174 | 0 | 40 | United-States | <=50K |
1 | 50 | Self-emp-not-inc | 83311 | Bachelors | 13 | Married-civ-spouse | Exec-managerial | Husband | White | Male | 0 | 0 | 13 | United-States | <=50K |
2 | 38 | Private | 215646 | HS-grad | 9 | Divorced | Handlers-cleaners | Not-in-family | White | Male | 0 | 0 | 40 | United-States | <=50K |
3 | 53 | Private | 234721 | 11th | 7 | Married-civ-spouse | Handlers-cleaners | Husband | Black | Male | 0 | 0 | 40 | United-States | <=50K |
4 | 28 | Private | 338409 | Bachelors | 13 | Married-civ-spouse | Prof-specialty | Wife | Black | Female | 0 | 0 | 40 | Cuba | <=50K |
四、计算数据集中有多少男性和女性。
data['sex'].value_counts()
Male 21790
Female 10771
Name: sex, dtype: int64
五、计算数据集中女性的平均年龄是多少。
data[data['sex'] == 'Female']['age'].mean()
36.85823043357163
六、计算数据集中德国公民的比例是多少。
data[data['native-country'] == 'Germany'].shape[0]/data.shape[0]
0.004207487485028101
七、计算年收入超过 50K 和低于 50K 人群年龄的平均值和标准差是多少。
richer = data[data['salary'] == '>50K']['age']
poorer = data[data['salary'] == '<=50K']['age']
print('种类\t平均值\t标准差\t')
print('>50K\t'+str(richer.mean())+'\t'+str(richer.std())+'\t')
print('<=50K\t'+str(poorer.mean())+'\t'+str(poorer.std())+'\t')
种类 平均值 标准差
>50K 44.24984058155847 10.51902771985177
<=50K 36.78373786407767 14.020088490824813
八、计算年收入超过 50K 的人群是否都接受过高中以上教育
data[data['salary'] == '>50K']['education'].unique()
# 显示收入高于50K的人群中学历种类的集合,所以结果为NO
array(['HS-grad', 'Masters', 'Bachelors', 'Some-college', 'Assoc-voc',
'Doctorate', 'Prof-school', 'Assoc-acdm', '7th-8th', '12th',
'10th', '11th', '9th', '5th-6th', '1st-4th'], dtype=object)
九、使用 groupby 和 describe 统计不同种族和性别人群的年龄分布数据
data.groupby(['race','sex'])['age'].describe()
count | mean | std | min | 25% | 50% | 75% | max | ||
---|---|---|---|---|---|---|---|---|---|
race | sex | ||||||||
Amer-Indian-Eskimo | Female | 119.0 | 37.117647 | 13.114991 | 17.0 | 27.0 | 36.0 | 46.00 | 80.0 |
Male | 192.0 | 37.208333 | 12.049563 | 17.0 | 28.0 | 35.0 | 45.00 | 82.0 | |
Asian-Pac-Islander | Female | 346.0 | 35.089595 | 12.300845 | 17.0 | 25.0 | 33.0 | 43.75 | 75.0 |
Male | 693.0 | 39.073593 | 12.883944 | 18.0 | 29.0 | 37.0 | 46.00 | 90.0 | |
Black | Female | 1555.0 | 37.854019 | 12.637197 | 17.0 | 28.0 | 37.0 | 46.00 | 90.0 |
Male | 1569.0 | 37.682600 | 12.882612 | 17.0 | 27.0 | 36.0 | 46.00 | 90.0 | |
Other | Female | 109.0 | 31.678899 | 11.631599 | 17.0 | 23.0 | 29.0 | 39.00 | 74.0 |
Male | 162.0 | 34.654321 | 11.355531 | 17.0 | 26.0 | 32.0 | 42.00 | 77.0 | |
White | Female | 8642.0 | 36.811618 | 14.329093 | 17.0 | 25.0 | 35.0 | 46.00 | 90.0 |
Male | 19174.0 | 39.652498 | 13.436029 | 17.0 | 29.0 | 38.0 | 49.00 | 90.0 |
十、统计男性高收入人群中已婚和未婚(包含离婚和分居)人群各自所占数量。
data[(data['sex'] == 'Male')&(data['salary'] == '>50K') & data['marital-status'].str.startswith('Married')].shape[0]
5965
data[(data['salary'] == '>50K')&(data['sex'] == 'Male') &
(data['marital-status'].isin(['Never-married',
'Separated', 'Divorced']))].shape[0]
658
十一、统计数据集中最长周工作小时数及对应的人数,并计算该群体中收入超过 50K 的比例。
maxWorkHour = data['hours-per-week'].max()
#最长周工作小时数及对应的人数
m1 = data[data['hours-per-week'] == maxWorkHour]
ratio = m1[m1['salary'] == '>50K'].shape[0]/m1.shape[0]
print('Max time - {0} hours./week,\nTotal number of such hard workers {1},\nPercentage of rich among then {2}'.format(maxWorkHour,m1.shape[0],ratio))
Max time - 99 hours./week,
Total number of such hard workers 85,
Percentage of rich among then 0.29411764705882354
十一、计算各国超过和低于 50K 人群各自的平均周工作时长。
data.groupby(['native-country','salary'])['hours-per-week'].mean()
native-country salary
? <=50K 40.164760
>50K 45.547945
Cambodia <=50K 41.416667
>50K 40.000000
Canada <=50K 37.914634
>50K 45.641026
China <=50K 37.381818
>50K 38.900000
Columbia <=50K 38.684211
>50K 50.000000
Cuba <=50K 37.985714
>50K 42.440000
Dominican-Republic <=50K 42.338235
>50K 47.000000
Ecuador <=50K 38.041667
>50K 48.750000
El-Salvador <=50K 36.030928
>50K 45.000000
England <=50K 40.483333
>50K 44.533333
France <=50K 41.058824
>50K 50.750000
Germany <=50K 39.139785
>50K 44.977273
Greece <=50K 41.809524
>50K 50.625000
Guatemala <=50K 39.360656
>50K 36.666667
Haiti <=50K 36.325000
>50K 42.750000
...
Mexico >50K 46.575758
Nicaragua <=50K 36.093750
>50K 37.500000
Outlying-US(Guam-USVI-etc) <=50K 41.857143
Peru <=50K 35.068966
>50K 40.000000
Philippines <=50K 38.065693
>50K 43.032787
Poland <=50K 38.166667
>50K 39.000000
Portugal <=50K 41.939394
>50K 41.500000
Puerto-Rico <=50K 38.470588
>50K 39.416667
Scotland <=50K 39.444444
>50K 46.666667
South <=50K 40.156250
>50K 51.437500
Taiwan <=50K 33.774194
>50K 46.800000
Thailand <=50K 42.866667
>50K 58.333333
Trinadad&Tobago <=50K 37.058824
>50K 40.000000
United-States <=50K 38.799127
>50K 45.505369
Vietnam <=50K 37.193548
>50K 39.200000
Yugoslavia <=50K 41.600000
>50K 49.500000
Name: hours-per-week, Length: 82, dtype: float64