check_null = data.isnull().sum().sort_values(ascending=False)/float(len(data))
print(check_null[:5])
thresh_count = len(data)*0.5
data.dropna(thresh=thresh_count, axis=1, inplace=True)
data.fillna(method="bfill",inplace=True)
data.isnull().sum().sum()
import matplotlib.pyplot as plt
data['loan_status'].value_counts()
loan_status_label = []
loan_status_count = []
for name,group in data.groupby(['loan_status']):
loan_status_label.append(name)
loan_status_count.append(group['loan_status'].count())
plt.figure(figsize=(10,8), dpi= 80)
plt.bar(loan_status_label,loan_status_count)
plt.show()
plt.figure(figsize=(10,8), dpi= 80)
plt.bar(loan_status_label,loan_status_count)
plt.xticks(rotation=15)
plt.show()
## 绘图
plt.figure(figsize=(10,8), dpi= 80)
plt.bar(loan_status_label,loan_status_count)
## 绘图美化与添加信息
plt.xticks(rotation=15)
plt.title("Numbers of Loan Status" ,fontsize=20)
plt.xlabel("Loan Status" ,fontsize = 18)
plt.ylabel("Number" ,fontsize=18)
plt.show()
data['loan_status_1'] = [(x=='Current' or x =='Fully Paid') for x in data['loan_status']]
print (data['loan_status_1'].value_counts())
grade_labels=[]
grade_cat_1 = []
grade_cat_2 = []
for name,group in data.groupby(['grade']):
grade_labels.append(name)
grade_cat_1.append(group[group['loan_status_1'] == True]['grade'].count())
grade_cat_2.append(group[group['loan_status_1'] == False]['grade'].count())
grade_cat_1 = [+x / sum(grade_cat_1) for x in grade_cat_1]
grade_cat_2 = [-x / sum(grade_cat_2) for x in grade_cat_2]
plt.figure(figsize=(10,8), dpi= 80)
plt.bar(grade_labels, grade_cat_1, facecolor='#9999ff', edgecolor='white')
plt.bar(grade_labels, grade_cat_2, facecolor='#ff9999', edgecolor='white')
#在柱状图上显示比例文本数值,更加清晰
for x,y in zip(range(len(grade_labels)),grade_cat_1):
plt.text(x, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
for x,y in zip(range(len(grade_labels)),grade_cat_2):
plt.text(x, y-0.05, '%.2f' % y, ha='center', va= 'bottom')
plt.ylim(-0.5,+0.5)
plt.legend(['Normal', 'Unomoral'], loc='lower right', scatterpoints=1)
plt.title("Loan Status at different grades",fontsize = 16)
plt.xlabel("Grades")
plt.ylabel("Loan Status")
plt.show()
grade_count = []
for name,group in data.groupby(['grade']):
grade_count.append(group['grade'].count())
plt.figure(figsize=(10,8), dpi= 80)
plt.pie(grade_count,explode=None,labels=grade_labels,autopct='%1.1f%%',shadow=True,startangle=50)
plt.axis('equal')
plt.title("Grade")
plt.show()
data['emp_title'] = [str(x).lower() for x in data['emp_title']]
emp_len_list = ['< 1 year','1 year','2 years','3 years','4 years','5 years','6 years','7 years','8 years','9 years','10+ years']
avg_inc_list = []
data_director = data[data['emp_title'] == 'director']
for emp_len in emp_len_list:
avg_inc_list.append(data_director[data_director['emp_length'] == emp_len]['annual_inc'].mean())
plt.figure(figsize=(15,8), dpi= 80)
plt.plot(emp_len_list,avg_inc_list,linewidth=1)
plt.xticks(rotation = 20)
plt.title("Average annual income for different years of employment",fontsize = 20)
plt.xlabel("Emp_length",fontsize = 18)
plt.ylabel("Annual_income",fontsize = 16)
plt.show()
emp_list = []
avg_inc = []
for name,group in data.groupby(['emp_title']):
emp_list.append(name)
avg_inc.append(group['annual_inc'].mean())
dict_list = dict(zip(emp_list,avg_inc))
dict_list_1 = sorted(dict_list.items(), key=lambda x: x[1],reverse=True)
max_emp_list = []
max_avg_inc = []
for key,value in dict_list_1:
max_emp_list.append(key)
max_avg_inc.append(value)
绘制平均年收入最高的10个职位的的柱状子图以及平均年收入最低的10个职位的柱状子图。
plt.figure(figsize=(15,12), dpi= 80)
plt.subplot(2,1,1)
plt.xticks(np.arange(len(max_emp_list[:10])), max_emp_list[:10])
plt.bar(np.arange(len(max_emp_list[:10])),max_avg_inc[:10])
plt.title("Top 10",fontsize = 18)
plt.xticks(rotation = 15)
plt.xlabel("Emp_title", fontsize = 16)
plt.ylabel("Annual_income",fontsize = 16)
plt.subplot(2,1,2)
plt.xticks(np.arange(len(max_emp_list[-10:])), max_emp_list[-10:])
plt.bar(np.arange(len(max_emp_list[-10:])),max_avg_inc[-10:])
plt.title("Minimum 10",fontsize = 18)
plt.xticks(rotation = 15)
plt.xlabel("Emp_title", fontsize = 16)
plt.ylabel("Annual_income",fontsize = 16)
plt.show()
可见上图绘制的较为凌乱,上下子图坐标轴重合,不好查看,使用tight_layout函数将其自动相互适应,调整间距。
plt.figure(figsize=(15,12), dpi= 80)
plt.subplot(2,1,1)
plt.xticks(np.arange(len(max_emp_list[:10])), max_emp_list[:10])
plt.bar(np.arange(len(max_emp_list[:10])),max_avg_inc[:10])
plt.title("Top 10",fontsize = 18)
plt.xticks(rotation = 15)
plt.xlabel("Emp_title", fontsize = 16)
plt.ylabel("Annual_income",fontsize = 16)
plt.subplot(2,1,2)
plt.xticks(np.arange(len(max_emp_list[-10:])), max_emp_list[-10:])
plt.bar(np.arange(len(max_emp_list[-10:])),max_avg_inc[-10:])
plt.title("Minimum 10",fontsize = 18)
plt.xticks(rotation = 15)
plt.xlabel("Emp_title", fontsize = 16)
plt.ylabel("Annual_income",fontsize = 16)
plt.tight_layout()
plt.show()
目前可以直观的看出申请贷款的用户的年收入差距很大,即使是年收入排名前十也有很大差距。
3.Seaborn绘图
Seaborn是Python中基于Matplotlib的数据可视化工具。相较于Matplotlib,使用更加方便,图形更加好看。
#导入Seaborn库
import seaborn as sns
3.1散点图
散点图可以将两个特征直观的显示在二维坐标中,同时反映特征之间的关系。
Seaborn中的stripplot函数按照x特征所对应的类别分别展示y特征的值,适用于分类数据。例如绘制不同地区(addr_state)借款人与当前平均余额(avg_cur_bal)之间的散点图。其中x参数设置分组统计字段,y参数设置分布统计字段,jitter参数是当数据点重合较多时,可用该参数做一些调整,hue参数进行内部数据的分类,例如按照贷款状态(loan_status)特征分类。
plt.figure(figsize=(15,8), dpi= 80)
sns.stripplot(data=data, x='addr_state', y='avg_cur_bal', jitter=True,hue='loan_status')
plt.show()
从散点图分布看出,无论是哪个地区的申请人的目前余额都集中在100000以下,相对而言所处于CA(加拿大)和NY(纽约)地区的申请人平均余额高一点。
3.2点图
点图代表散点图位置的数值变量的中心趋势估计,并使用误差线提供关于该估计的不确定性的一些指示。例如利用pointplot函数可以绘制出不同贷款状态(loan_status_1)的当前平均余额(avg_cur_bal)的点图。
plt.figure(figsize=(10,8), dpi= 80)
sns.pointplot(x="loan_status_1",y="avg_cur_bal",data=data)
plt.show()
3.3箱线图
箱线图是一种用来显示一组数据分散情况资料的统计图。可以显示出数据的上下边界、上下四分位数,中位数以及异常值。例如利用boxplot函数可以绘制出借款人的当前平均余额(avg_cur_bal)的箱线图。
plt.figure(figsize=(10,8), dpi= 80)
sns.boxplot(y='avg_cur_bal',data=data)
plt.show()
plt.figure(figsize=(10,8), dpi= 80)
sns.boxplot(x='avg_cur_bal',data=data)
plt.show()
由于借款人贷款状态不同,也可绘制不同贷款状态下(loan_status)的借款人的当前平均余额(avg_cur_bal)的分组箱线图。其中分组因子是loan_status,在X轴不同位置绘制。
plt.figure(figsize=(10,8), dpi= 80)
sns.boxplot(y="avg_cur_bal", x="loan_status", data=data)
plt.xticks(rotation = 15)
plt.show()
可以看出借款人平均余额都不高,并且异常值集中在较大值一侧,分布呈右偏态。
3.4多面板绘图
对于上图,由于有多个种类,图形显得拥挤,可以利用catplot函数进行多面板绘图,而kind参数可以绘制不同的图形。例如kind='box'使上面的箱线图分成不同面板上的箱线图。
plt.figure(figsize=(10,8), dpi= 80)
sns.catplot(y="avg_cur_bal",col = 'loan_status',data=data,kind='box', aspect=.5,legend=False)
plt.show()
3.5小提琴图
小提琴图用于显示数据分布及其概率密度。这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。例如使用violinplot函数绘制借款人的平均当前余额(avg_cur_bal)的小提琴图。
plt.figure(figsize=(10,8), dpi= 80)
sns.violinplot(y="avg_cur_bal",data=data)
plt.show()
绘制不同贷款状态下(loan_status)的借款人的当前平均余额(avg_cur_bal)的分组小提琴图,分组因子为loan_status。
plt.figure(figsize=(10,8), dpi= 80)
sns.violinplot(x="loan_status",y="avg_cur_bal",data=data)
plt.xticks(rotation = 15)
plt.show()
查看不同信用贷款等级(grade)的人处在不同贷款状态(loan_status_1)下的当前平均余额(avg_cur_bal)的分布情况,只需要多加入参数hue即可。
plt.figure(figsize=(20,10), dpi= 80)
sns.violinplot(x="grade",y="avg_cur_bal",hue="loan_status_1",data=data)
plt.show()
将分组小提琴图组合,使得对比更加明显。
plt.figure(figsize=(20,10), dpi= 80)
sns.violinplot(x="grade",y="avg_cur_bal",hue="loan_status_1",split=True,data=data)
plt.show()
3.6直方图
直方图观察特征取值的分布情况。例如distplot函数绘制借款人所需的每月付款(installment)的直方图。
plt.figure(figsize=(10,8), dpi= 80)
sns.distplot(data['installment'])
plt.show()
上图的installment分类过多,可以设置bins参数来确定分类数。
plt.figure(figsize=(10,8), dpi= 80)
sns.distplot(data['installment'],bins=10)
plt.show()
利用jointplot函数绘制出二维直方图。
plt.figure(figsize=(10,8), dpi= 80)
sns.jointplot(x="installment", y="avg_cur_bal", data=data, kind="hex")
plt.show()
由上图可见,对于其当前平均余额(avg_cur_bal)数值较大,使得图像不明显,删除其中部分数据,再绘制图像进行查看。
plt.figure(figsize=(10,8), dpi= 80)
data_copy = data.copy()
data_copy.drop(list(data['avg_cur_bal'][data['avg_cur_bal']>80000].index),axis=0,inplace=True)
sns.jointplot(x="installment", y="avg_cur_bal", data=data_copy, kind="hex",color="r")
plt.show()
二维直方图反映了一个数据集中两个特征之间的分布情况。在上图中,上方与右方分别显示借款人每月还款金额(installment)和当前平均金额(avg_cur_bal)的直方图分布,中间显示两个变量的六边形图,颜色越深代表有更多的数据在此处。
3.7计数图
计数图可以被认为是一个分类直方图,就是对输入的数据分类,显示各个分类的数量。例如利用countplot函数绘制借款人当前房屋状态(home_ownership)的计数图。
plt.figure(figsize=(10,8), dpi= 80)
sns.countplot(x="home_ownership",data=data)
plt.show()
计数图不同于柱状图,不能同时输入x和y。输入x表示竖向,输入y表示横向。
plt.figure(figsize=(10,8), dpi= 80)
sns.countplot(y="home_ownership",data=data)
plt.show()
从上图可以看出,借款人的房屋大多是处于抵押或租赁状态。
3.8热力图
利用热力图可以看数据集里多个特征两两间的相似度。例如:corr函数获得数据的相关性矩阵,利用heatmap函数绘制热力图。
plt.figure(figsize=(14,14),dpi=80)
sns.heatmap(data.corr())
plt.show()
cmap参数设置热力图色系,例如设置为Blues。
plt.figure(figsize=(14,14),dpi=80)
sns.heatmap(data.corr(),cmap="Blues")
plt.show()
无论热力图色系如何,可以看出大部分特征之间相关性都不是很高。为了更加直观的显示相关性的大小,可以设置annot参数为True,直接在方格中显示两两特征的相关性大小,fmt参数设置相关性数值的格式,如fmt='.2f'表示仅显示小数点后两位。由于特征过多,故仅显示loan_amnt、installment、avg_cur_bal、annual_inc特征的相关性热力图。
plt.figure(figsize=(10,8), dpi= 80)
data_1 = data[['loan_amnt', 'installment','avg_cur_bal','annual_inc']]
sns.heatmap(data_1.corr(),fmt='.2f',annot=True)
plt.show()
标签:10,plt,grade,loan,1234ty,avg,data
From: https://www.cnblogs.com/chenrunun/p/17519296.html