Amazon Employee Access 数据分析报告
报告摘要
- 目标:本分析旨在利用Amazon的员工编号相关信息,来分析和预测当员工申请访问某个编号的资源时,是否被允许访问。
- 方法: 在原有部分变量的基础上,利用特征工程的方法,新增了单变量、双变量、三变量、四变量出现的频率和变量出现的条件概率等变量,利用随机森林模型,对目标变量进行预测。
- 结论:
- 一、对于训练集数据分析发现,各变量之间存在着一定的联系,其中ROLE_TITLE变量和ROLE_RODE变量存在一对一的关系,ROLE_TITLE变量和ROLE_FAMILY变量存在多对一的关系,其他变量之间也存在较强的对应关系。
- 二、根据这种方法建模,发现模型具有一定的预测效果。
目录
- 问题描述
- 数据加载
- 数据探索
- 描述性统计
- 变量间的对应关系探索
- 变量分布探索
- 特征工程
- 降维
- 新增单变量频率
- 新增双变量频率
- 新增三变量频率
- 新增四变量频率
- 新增各变量出现的条件概率
- 模型建立
- 模型预测与评价
一、问题描述
利用Amazon员工的编号信息,包括员工经理的编号、员工所在分类的编号、员工所在部门编号、员工职位编号、员工类别编号等信息,来预测当员工申请访问某个 编号的资源时,是否被允许访问。
变量名 | 含义 |
---|---|
ACTION | 1代表资源被授权访问,0代表资源未被授权访问 |
RESOURCE | 资源编号 |
MGR_ID | 员工经理的编号 |
ROLE_ROLLUP_1 | 公司员工分类1,如美国工程 |
ROLE_ROLLUP_2 | 公司员工分类2,如美国零售 |
ROLE_DEPTNAME | 公司部门描述,如零售 |
ROLE_TITLE | 职位名称,如高级工程零售经理 |
ROLE_FAMILY_DESC | 公司员工类别扩展描述,如零售经理,软件工程 |
ROLE_FAMILY | 公司员工类别描述,如零售经理 |
ROLE_CODE | 员工角色编号 |
二、数据加载
加载所需的python库
import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.graphics.api as smg
import patsy
get_ipython().magic('matplotlib inline')
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from scipy import stats
import seaborn as sns
载入train数据集
amazon = pd.read_csv("C:/Users/cs/Desktop/Amazon/train.csv")
data =amazon
data.head()
ACTION | RESOURCE | MGR_ID | ROLE_ROLLUP_1 | ROLE_ROLLUP_2 | ROLE_DEPTNAME | ROLE_TITLE | ROLE_FAMILY_DESC | ROLE_FAMILY | ROLE_CODE | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 39353 | 85475 | 117961 | 118300 | 123472 | 117905 | 117906 | 290919 | 117908 |
1 | 1 | 17183 | 1540 | 117961 | 118343 | 123125 | 118536 | 118536 | 308574 | 118539 |
2 | 1 | 36724 | 14457 | 118219 | 118220 | 117884 | 117879 | 267952 | 19721 | 117880 |
3 | 1 | 36135 | 5396 | 117961 | 118343 | 119993 | 118321 | 240983 | 290919 | 118322 |
4 | 1 | 42680 | 5905 | 117929 | 117930 | 119569 | 119323 | 123932 | 19793 | 119325 |
三、数据探索
3.1 描述性统计
train数据集共有32769个样本,不存在缺失值
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32769 entries, 0 to 32768
Data columns (total 10 columns):
ACTION 32769 non-null int64
RESOURCE 32769 non-null int64
MGR_ID 32769 non-null int64
ROLE_ROLLUP_1 32769 non-null int64
ROLE_ROLLUP_2 32769 non-null int64
ROLE_DEPTNAME 32769 non-null int64
ROLE_TITLE 32769 non-null int64
ROLE_FAMILY_DESC 32769 non-null int64
ROLE_FAMILY 32769 non-null int64
ROLE_CODE 32769 non-null int64
dtypes: int64(10)
memory usage: 2.5 MB
样本中,约有5.8%的员工授权申请没有通过,除ACTION外,各变量编号从个位数到六位数不等。
data.describe()
ACTION | RESOURCE | MGR_ID | ROLE_ROLLUP_1 | ROLE_ROLLUP_2 | ROLE_DEPTNAME | ROLE_TITLE | ROLE_FAMILY_DESC | ROLE_FAMILY | ROLE_CODE | |
---|---|---|---|---|---|---|---|---|---|---|
count | 32769.000000 | 32769.000000 | 32769.000000 | 32769.000000 | 32769.000000 | 32769.000000 | 32769.000000 | 32769.000000 | 32769.000000 | 32769.000000 |
mean | 0.942110 | 42923.916171 | 25988.957979 | 116952.627788 | 118301.823156 | 118912.779914 | 125916.152644 | 170178.369648 | 183703.408893 | 119789.430132 |
std | 0.233539 | 34173.892702 | 35928.031650 | 10875.563591 | 4551.588572 | 18961.322917 | 31036.465825 | 69509.462130 | 100488.407413 | 5784.275516 |
min | 0.000000 | 0.000000 | 25.000000 | 4292.000000 | 23779.000000 | 4674.000000 | 117879.000000 | 4673.000000 | 3130.000000 | 117880.000000 |
25% | 1.000000 | 20299.000000 | 4566.000000 | 117961.000000 | 118102.000000 | 118395.000000 | 118274.000000 | 117906.000000 | 118363.000000 | 118232.000000 |
50% | 1.000000 | 35376.000000 | 13545.000000 | 117961.000000 | 118300.000000 | 118921.000000 | 118568.000000 | 128696.000000 | 119006.000000 | 118570.000000 |
75% | 1.000000 | 74189.000000 | 42034.000000 | 117961.000000 | 118386.000000 | 120535.000000 | 120006.000000 | 235280.000000 | 290919.000000 | 119348.000000 |
max | 1.000000 | 312153.000000 | 311696.000000 | 311178.000000 | 286791.000000 | 286792.000000 | 311867.000000 | 311867.000000 | 308574.000000 | 270691.000000 |
查看各变量上不同编号的种类数。可以发现,在30000多个样本中,RESOURCE、MGR_ID和ROLE_FAMILY上编号种类数较多,其他变量上编号种类数较少。
值得注意的是,ROLE_TITLE和ROLE_CODE种类数一致。
f = lambda x: x.unique().size
data.apply(f)
ACTION 2
RESOURCE 7518
MGR_ID 4243
ROLE_ROLLUP_1 128
ROLE_ROLLUP_2 177
ROLE_DEPTNAME 449
ROLE_TITLE 343
ROLE_FAMILY_DESC 2358
ROLE_FAMILY 67
ROLE_CODE 343
dtype: int64
3.2 变量间的对应关系探索
3.2.1 ROLE_TITLE与ROLE_CODE
画出ROLE_TITLE和ROLE_CODE变量的散点图,存在明显的正相关关系。
fig,ax = plt.subplots(nrows=1,ncols=1,figsize=(8,5))
plt.scatter(data.ROLE_TITLE,data.ROLE_CODE)
<matplotlib.collections.PathCollection at 0xabb0c50>
将两个变量的值合并,编号的种类数目仍为343,
TITLE_CODE = data.ROLE_TITLE*1000000+data.ROLE_CODE
TITLE_CODE.unique().size
343
# 定义f2,用来计算交叉表每一行或每一列中非0值的个数
f2 = lambda x: x[x!=0].count()
# 画出两个变量间的交叉表
TICO = pd.crosstab(data.ROLE_TITLE,data.ROLE_CODE)
# 观察交叉表中ROLE_CODE变量对应的ROLE_TITLE变量个数
TICO.apply(f2).plot()
# 在变量ROLE_CODE上,对应的ROLE_TITLE个数为0,说明两个变量间至少存在一对多的对应关系
TICO.apply(f2)[TICO.apply(f2)>1]
Series([], dtype: int64)
观察交叉表中ROLE_TITLE变量对应的ROLE_CODE变量个数,也为0,说明两个变量间存在一一对应的关系
TICO.apply(f2,axis=1).plot()
TICO.apply(f2,axis=1)[TICO.apply(f2,axis=1)>1]
Series([], dtype: int64)
3.2.2 ROLE_ROLLUP_1与ROLE_DEPTNAME
# 将两个变量的值合并,编号的种类数目发生了较大的变化,但仍可发现,存在一定的对应关系
RO1_DEP= data.ROLE_ROLLUP_1*10000000+data.ROLE_DEPTNAME
data.ROLE_ROLLUP_1.unique().size, data.ROLE_DEPTNAME.unique().size, RO1_DEP.unique().size
# ctRO1DEP = pd.crosstab(data.ROLE_ROLLUP_1,data.ROLE_DEPTNAME)
(128, 449, 1185)
3.2.3 ROLE_ROLLUP_2与ROLE_DEPTNAME
# 将两个变量的值合并,编号的种类数目发生了较大的变化,但仍可发现,存在一定的对应关系
RO2_DEP= data.ROLE_ROLLUP_2*10000000+data.ROLE_DEPTNAME
data.ROLE_ROLLUP_2.unique().size, data.ROLE_DEPTNAME.unique().size, RO2_DEP.unique().size
(177, 449, 1398)
3.2.4 ROLE_ROLLUP_1与ROLE_ROLLUP_2
# 将两个变量合并,编号的唯一值数目变化不大,说明两者之间存在很强的对应关系
RO1_RO2= data.ROLE_ROLLUP_1*10000000+data.ROLE_ROLLUP_2
data.ROLE_ROLLUP_1.unique().size, data.ROLE_ROLLUP_2.unique().size, RO1_RO2.unique().size
(128, 177, 187)
#画出两个变量间的交叉表
ctRO12 = pd.crosstab(data.ROLE_ROLLUP_1,data.ROLE_ROLLUP_2)
# 观察交叉表中ROLE_ROLLUP_2变量对应的ROLE_ROLLUP_1变量个数
ctRO12.apply(f2).plot()
# 在变量ROLE_ROLLUP_2上,只有三个值对应的ROLE_ROLLUP_1个数大于1(非一一对应关系),说明两个变量间有很强的一对多的对应关系
ctRO12.apply(f2)[ctRO12.apply(f2)>1]