项目背景
安然曾是 2000 年美国最大的公司之一。辉煌时期,市值高达700亿美元。2002 年,由于其存在大量的企业欺诈行为,这个昔日的大集团以极快的速度土崩瓦解。 在随后联邦进行的调查过程中,大量有代表性的保密信息进入了公众的视线,包括成千上万涉及高管的邮件和详细的财务数据。 你将在此项目中扮演侦探,运用你的新技能,根据安然丑闻中公开的财务和邮件数据来构建相关人士识别符。利用机器学习算法进行数据分析,从邮件和财务数据中找出犯罪嫌疑人。
数据集初步探索
加载数据集
首先我们加载数据集
with open("final_project_dataset.pkl", "r") as data_file:
data_dict = pickle.load(data_file)
电子邮件和财务 (E+F) 数据字典被存储在 pickle 文件中,该文件可直接存储和加载 python 对象,非常方便。
数据集初步分析
分析发现我们读取的数据数据实际上是以字典形式进行。随机取一个字典,其存储结构如下所示:
{METTS MARK:{'salary': 365788, 'to_messages': 807, 'deferral_payments': 'NaN', 'total_payments': 1061827, 'exercised_stock_options': 'NaN', 'bonus': 600000, 'restricted_stock': 585062, 'shared_receipt_with_poi': 702, 'restricted_stock_deferred': 'NaN', 'total_stock_value': 585062, 'expenses': 94299, 'loan_advances': 'NaN', 'from_messages': 29, 'other': 1740, 'from_this_person_to_poi': 1, 'poi': False, 'director_fees': 'NaN', 'deferred_income': 'NaN', 'long_term_incentive': 'NaN', 'email_address': 'mark.metts@enron.com', 'from_poi_to_this_person': 38}}
在预处理此项目时,我们已将安然邮件和财务数据与字典结合在一起,字典中的每对键值对应一个人。 字典键是人名,值是另一个字典(包含此人的所有特征名和对应的值)。 数据中的特征分为三大类,即财务特征、邮件特征和 POI 标签。
财务特征 : [‘salary’, ‘deferral_payments’, ‘total_payments’, ‘loan_advances’, ‘bonus’, ‘restricted_stock_deferred’, ‘deferred_income’, ‘total_stock_value’, ‘expenses’, ‘exercised_stock_options’, ‘other’, ‘long_term_incentive’, ‘restricted_stock’, ‘director_fees’] (单位均是美元)
邮件特征 : [‘to_messages’, ‘email_address’, ‘from_poi_to_this_person’, ‘from_messages’, ‘from_this_person_to_poi’, ‘shared_receipt_with_poi’] (单位通常是电子邮件的数量,明显的例外是 ‘email_address’,这是一个字符串)
POI 标签 : [‘poi’] (boolean,整数)
数据特征
分析这个数据字典,我们发现每个人一共有20个特征可以用于分析,其中的poi不是特征,而是label/target
数据点总数
分析整个数据字典,我们发现一共有146个数据点(人)。
POI统计
POI( Person of interest )是嫌疑犯的意思,数据集有一个标签(label)就是嫌疑犯,所以我们只需要统计
data_dict[preson name][‘poi’] == 1
的数量就可以了。
统计发现有18个。
缺失的特征
数据集并不是每个特征后都有明确的值,有很多信息的特征是缺失的。对于salary特征,很多人的信息就是NaN。146个数据点(人)中,只有95个人有salary的具体信息。有111个人有邮箱地址,其他人的邮箱地址信息为NaN。
异常值调查和处理
我们在分析财务数据salary和bounds之间的关系时发现了一个极为异常额异常值,如下图所示
明显在右上角有一个极为异常的点,奖金和薪水远远高于其他人。我们通过代码寻找一下奖金和薪水都极高的人,看是否还有其他的异常值。
data_dict = sorted(data_dict.items(), key = lambda x : x[1]["salary"