关于如何使用python进行数据分析的文章很多,相关的书籍也有很多。本文是基于Excel思维使用python进行数据分析,换句话说就是本文不是传统意义上的专业python文章。文章的内容共分为8个部分,从最基础的数据导入和读取到分析结果的图表化输出。这其中包含了很多与Excel非常相似的函数和分析功能,如SUM,COUNTIF,TRANSPOSE函数,以及数据筛选,分类汇总和数据透视表等功能等等,这些在python中都能找到对应的代码。因此,只要你会使用基本的Excel函数就能看懂文中的python代码,并可以使用Python进行简单的数据分析。文章中的数据源来自Lending Club 2017-2011年的公开数据。

1.开始前的准备工作
使用Python进行数据分析之前,需要预先导入相对应的功能库。数据分析最常用的库包括用于数值计算的numpy,基于numpy构建的用于科学计算的Pandas库,用于数据可视化的matplotlib和提供各种操作系统功能接口的OS库。我们将这几个库导入到python中, import后是导入库的名称 as后是库的简称。例如pandas库
的简称是pd,在后面的代码中看到pd就表示这个操作使用了pandas库。具体代码如下:
import os as osimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt

导入功能库后,就可以开始读取数据了。这里需要注意的是如果数据文件没有保存在Jupyter Notebook的工作目录中,在导入的过程中需要说明数据所在的路径。如果你觉得输入路径太麻烦的话,可以使用OS库查看或更高操作系统中的工作目录。将数据文件直接拷到Jupyter Notebook的工作目录中,通过下面的代码可
以查看Jupyter Notebook的工作目录位置。
os.getcwd()
或者将数据所在位置的路径设置为工作目录。具体方法如下:
os.chdir('C:\\Users\\cliffwang\\Desktop\\python')我们将Lending Club的数据保存在Jupyter Notebook工作目录开始读取数据。Python可以读取多种数据格式,如csv,xls和txt等等。Lending Club的数据源是csv格式的。我们通过下面的代码完成读取数据和创建数据表的工作。
lc=pd.DataFrame(pd.read_csv('LoanStats3a.csv',header=1))
在上面读取数据的代码中,使用了pandas库(pd)中的功能,首先读取LoanStats3a.csv文件,并设置标题行header=1。然后将读取的csv文件转成DataFrame并将这个数据表取名lc。
2.数据内容预览数据读取工作完成后,可以开始对数据进行简单的预览。预览内容主要包括了解数据表的大小,字段的名称,数据格式等等。为接下来的数据分析工作做准备。
首先查看我们刚刚读取数据表的大小。通过下面的的结果可以看到Lending Club的数据表有4万多行,111个字段。想要进一步查看数据表中更具体的内容可以通过后面的代码来实现。
lc.shape
Columns是查看表中各个字段名称的代码,以方便后续的分析工作。这里由于字段数量较多,python只列出了一部分字段的名称。
lc.columns
我们继续查看数据表中具体的数据内容,由于这个数据表行数较多我们不查看所有数据,只查看开始和结束的几行。下面的的结果中显示了数据表前5行的数据内容。head后面的()括号中可以输入要查看的具体行数,为空时默认只显示前5行的数据。在前5行的数据表中可以发现,很多字段中都是NaN值,这可能导致后面
的字段不可用。不过到底包含多少NaN值,我们在后面的数据清洗部门会进行详细的统计。
lc.head()
tail显示数据表尾部的数据,和head一样tail后面的()中可以输入要查看的具体行数,这里我们输入3表示查看数据表后3行的数据。为空时默认显示最后5行的数据。下面的结果中可以看出id字段最后两行包含了一些其他的信息,而其他字段中并不包含这些信息是NaN值。
lc.tail(3)
最后查看数据表中各个字段的类型,确定数据表中包含哪些类型的数据,是否需要进行格式转换等等。这里发现日期字段的格式为object,需要转换为日期格式。
lc.dtypes
在数据内容概览部分我们大致了解了数据表中的信息,同时也发现表中包含很多NaN值,以及日期格式转换的问题。这些问题将在后面的数据清洗部分进行解决。
3,数据清洗在数据概览部分中发现的问题需要通过数据清洗进行解决。这部分主要解决前面发现的NaN值和日期格式转换问题。通过查看数据表中的空值情况可以发现,前面的字段中NaN值较少,NaN值主要集中在后面的一些字段中。
lc.isnull()
对前面查看的NaN值情况使用SUM进行汇总,可以获得每个字段中具体的NaN值数量。在下面的结果中,除了id字段以外,几乎每个字段都有NaN值。在数据预览的部分,我们发现id值后面有两行汇总数据,因此判断Member,loan_amnt等前面的大部分字段的NaN值是由于这最后这两行信息造成的。而后面字段NaN值达到了4
万多条,几乎与数据表总行数一致,因此我们舍弃这些字段,只对前面的字段进行统计。
lc.isnull().sum()
在python中解决NaN值有两个方法,可以统一填充为0,也可以将包含NaN值的行删除。我们先保留这些字段,在后面的使用过程中再进行填充。
对于日期字段我们使用to_datetime来进行日期格式的转换。下面的命令中将数据表中的issue_d字段更改为日期格式并重新赋给issue_d字段。从查看的结果中可以看出通过格式转换issue_d字段的格式已经从object变成了datetime64。
lc['issue_d']=pd.to_datetime(lc['issue_d'])
4,关键指标概览
清洗后的数据表可以开始进行分析工作,首先是对一些关键汇总指标的统计,对于Lending Club这些关键指标包括总贷款次数,总贷款金额,总利息收入等等。
对数据表中member_id字段进行计数,获得总的贷款次数。这与Excel中的count函数基本一致。
lc['member_id'].count()
对数据表中member_id字段进行唯一值计数,获得总贷款人数。这里贷款次数与人数基本一致。猜测这个值应为贷款次数。
len(lc['member_id'].unique())
对数据表中loan_amnt字段进行求和,获得总贷款金额。这与Excel中的sum函数基本一致。
lc['loan_amnt'].sum()
将贷款金额分布绘制成箱线图可以看出,贷款均值为10000元。大部分贷款的金额都集中在5000到15000之间。
plt.boxplot(lc[‘loan_amnt’])plt.show()
[/code]
换成直方图再看下,5000美金一个区间,与之前的结果类似,15000以下的贷款居多,其中最多的是5000到10000的区间。大额的贷款也有但笔数较少,最高的一笔35000美金。这些绘图功能我们使用了matplotlib库(plt)。
bins = [0, 5000, 10000, 15000, 20000, 25000, 30000, 35000, 40000]plt.hist(lc['loan_amnt'],bins,normed=1, histtype='bar', rwidth=1)
plt.show()

从2017到2011年贷款笔数增长趋势看,虽然中间贷款笔数整体呈快速增长趋势,并且增长速度非常快,从开始每月几十笔到近2500笔。这应该与美国人的理财观念有关系。在后面的贷款用途分析中也可以发现,他们的贷款目的和用途非常广泛,有些甚至有点奇怪。贷款目的可能是为了一次旅行,结婚,甚至还有一个贷
款目的写的是为了自由。
lc.sort(columns='issue_d',ascending=False)issue_date=lc.groupby('issue_d').count()
plt.plot(issue_date['member_id'],linewidth=3)
plt.show()

继续对数据表中total_rec_in字段进行求和,获得总利息收入金额。除了利息收入以外,Lending Club还有一部分收入是罚息和类似手续费的收入。这里我们并没有包括这些收入,只是简单sum了贷款利息收入。
lc['total_rec_int'].sum()
最后再对表中各个字段做个描述统计,看下数据的集中度与离散情况,这里主要关注最大值,最小值和标准差等。由于字段较多,我们在描述统计的命令后面加了一个.T,对数据进行转置,这相当于Excel中的TRANSPOSE函数。
lc.describe().T
从描述统计的结果可以发现,贷款的最小金额为500美金,最大金额为35000美金。用户收入最少为1896美金,最多为6000000美金。
5,用户属性分析Lending Club的数据表中包含很多与用户相关的字段,例如用户收入,贷款用途,用户等级,职位,所在地区等等。我们可以通过这些字段从多个维度做个贷款用户画像。
首先是收入情况,Lending Club的贷款用户收入差距还是挺高的,从1-2万美金/年到30-40万美金/年的都有。我们以5万美金/年对贷款用户的收入分布进行了统计。从下面的直方图中可以看出,大部分贷款用户收入在10万美金/年以下。高收入的贷款用户数量很少。
bins = [0, 50000, 100000, 150000, 200000, 250000, 300000, 350000, 400000, 450000]plt.hist(lc['annual_inc'],bins, histtype='bar', rwidth=1)
plt.show()

前面的贷款金额分布与用户收入非常相似,小额贷款高于大额贷款。那么贷款金额的大小与贷款用户的收入之间是否有联系呢?我们对用户收入和贷款金额进行相关分析。从下面的结果中可以看出两者的相关系数仅为0.27,推翻了我们之前的假设,也就是说并不是收入越高的人贷款金额也越高。
c=lc[['annual_inc','loan_amnt']]c.corr()

了解了用户的收入分布情况后,我们再来逐一看下其他维度的用户属性。贷款目的分布中,debt_consolidation(债务合并)的数量最高,也就是借新还旧。其次是credit_card(还信用卡)。第三名是其他,第四名的是home_improvement(家装)。后面还有婚礼,医疗,教育和度假等等。贷款目的非常多元化。下面的这些
贷款目的是Lending Club整理并汇总后的信息。
lc['purpose'].value_counts()
再细一级的贷款目的内容就更加庞杂和有意思了。真的能感觉到美国人做什么事情都通过贷款来实现。
lc['title'].value_counts()
从信用等级分布来看,Lending Club中大部分用户为B和A级,G级用户数量较少。大部分用户都拥有较高的信用等级。
lc['grade'].value_counts()
数据表中的emp_title字段记录了用户的职位名称,简单的统计后发现贷款用户的职业分布非常广泛。其中排第一的是US Army。其次为Bank of America。后面还包括IBM,AT&T,UPS的用户。
lc['emp_title'].value_counts()
在工作年限上贷款用户的分布非常极端,数量排名第一的是工作10年以上,第二名是工作小于1