二、大数据实践项目——数据分析与处理

一、数据处理主要任务

二、数据集处理

1、查看数据集基本情况

调用 info() 函数来查看数据data的基本情况,包括数据维度,字段名称和类型以及有无缺失值,数据占用内存等。(以下为部分字段信息)

可见总的数据47447行,少于此数值的为有数据缺失。

 

 2、查看数据基本统计信息

data_des = data.describe(include='all')

可以从基本信息中粗略的观察数据情况: 

 

3、是否违约特征分析

使用pandas中的plot()函数绘制特征 ‘违约’ 分布状况。

这一步主要目的是看数据集label分布是否是平衡的,即是否未违约人数明显多于违约人数。

import pandas as pd
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,6))
# 绘制柱状图,查看违约关系的取值分布情况
data['Default'].value_counts(dropna=False).plot(kind='bar',rot=40) #不去除nan值,x轴标签旋转40度

# 在柱形上方显示计数
counts = data['Default'].value_counts(dropna=False).values
for index, item in zip([0,1,2], counts): 
    plt.text(index, item, item, ha="center", va= "bottom", fontsize=12) 

# 设置柱形名称

plt.xticks([0,1,2],['未违约','违约','NaN'])
# 设置x、y轴标签

plt.xlabel("是否违约")
plt.ylabel("客户数量")
# 设置标题以及字体大小
plt.title("违约与未违约数量分布图",size=13)

# 设置中文显示
plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['font.family']=['sans-serif']
plt.show()

 

4、分析数据中某个离散型数据字段与标签值(是否违约)之间的关系(以CityId字段为例)

(1)不同城市级别下不同违约情况的数量分布柱状图

(2)不同城市级别下违约率柱状图

其中标签字段为'Default'

主要使用了 sns.countplot(),其中hue='Default'是按照标签进行分类

import seaborn as sns
import matplotlib.pyplot as plt

fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(16, 6))

# 对CityId列的类别设定顺序
data['CityId'] = data['CityId'].astype('category')
data['CityId'] = data['CityId'].cat.set_categories(['一线城市', '二线城市', '其它'], ordered=True)

# 绘制柱状图,查看不同城市级别在不同是否违约的取值分布情况
sns.countplot(x='CityId', hue='Default', data=data, ax=ax1)

# 将具体的计数值显示在柱形上方
counts = data['Default'].groupby(data['CityId']).value_counts().values
count1 = counts[[0, 2, 4]]
count2 = counts[[1, 3, 5]]
for index, item1, item2 in zip([0, 1, 2], count1, count2):
    ax1.text(index - 0.2, item1 + 0.05, '%.0f' % item1, ha="center", va="bottom", fontsize=12)
    ax1.text(index + 0.2, item2 + 0.05, '%.0f' % item2, ha="center", va="bottom", fontsize=12)

# 绘制柱状图查看违约率分布
cityid_rate = data.groupby('CityId')['Default'].sum() / data.groupby('CityId')['Default'].count()
sns.barplot(x=[0, 1, 2], y=cityid_rate, ax=ax2)

# 将具体的计数值显示在柱形上方
for index, item in zip([0, 1, 2], cityid_rate):
    ax2.text(index, item, '%.3f' % item, ha="center", va="bottom", fontsize=12)

# 设置柱形名称
ax1.set_xticklabels(['一线城市', '二线城市', '其它'])
ax2.set_xticklabels(['一线城市', '二线城市', '其它'])

# 设置图例名称
ax1.legend(['未违约','违约'])

# 设置标题以及字体大小
ax1.set_title("不同城市级别下不同违约情况数量分布柱状图",size=13)
ax2.set_title("不同城市级别违约率分布柱状图",size=13)

# 设置x,y轴标签
ax1.set_xlabel("CityId")
ax1.set_ylabel("客户人数")
ax2.set_xlabel("CityId")
ax2.set_ylabel("违约率")

# 显示汉语标注
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = ['sans-serif']
plt.show()

 

5、连续性特征分布状况分析

(1)总消费金额(transTotalAmt)分布情况

(2)总消费笔数(transTotalCnt)与总消费金额(transTotalAmt) 之间的关系

seaborn包中

a) : kdeplot()函数绘制“核密度图”,用来估计数据的密度函数,展现数据分布特征。

b): regplot() 绘制 “回归关系图”,展现两个特征之间的回归关系

import seaborn as sns
import matplotlib.pyplot as plt

# 建立画布ax1和ax2,及设置图像大小,设置subplots()函数中参数为(1,2)表示两画图呈一行两列
fig, [ax1,ax2] = plt.subplots(1, 2, figsize=(16, 5))

# 在画布ax1中画出总消费金额的核密度图
sns.kdeplot(data['transTotalAmt'],shade=True,ax=ax1)

# 在画布ax2中画出总消费笔数和总消费金额的回归关系图
sns.regplot(x='transTotalCnt',y='transTotalAmt',data=data,ax=ax2)

由图得知数据中,总消费金额为长尾分布,消费笔数与金额呈正相关。

 

6、年龄与开卡时长分布

import seaborn as sns
import matplotlib.pyplot as plt

# 建立画布ax1和ax2,及设置图像大小,设置subplots()函数中参数为(1,2)表示一行两列
fig,[ax1,ax2] = plt.subplots(1,2,figsize=(16,6))

# 在画布ax1中绘制年龄的直方图,颜色为红色
sns.distplot(data['age'],color='r',ax=ax1)

# 在画布ax2中绘制开卡时长的直方图,颜色为默认值
sns.distplot(data['card_age'],ax=ax2)

# 在画布ax1、ax2中设置标题
ax1.set_title('年龄分布')
ax2.set_title('开卡时长分布')

# 显示汉语标注
plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['font.family']=['sans-serif']

图为年龄与开卡时长的直方图。

可以看出,年龄和开卡时长的分布都属于偏态分布。客户年龄主要分布在25-45岁之间,客户开卡时长主要分布在0-30小时之间。

 

7、查看缺失值信息

# 计算特征缺失值个数
na_counts = data.isnull().sum()

# 将na_counts取大于0的部分进行降序排序
missing_value = na_counts[na_counts > 0].sort_values(ascending=False)

# 查看存在缺失值的特征
print(missing_value)

下面是输出结果:可见Default列有2个缺失值,占比很小可以选择删除整行,其他列缺失值很多,不可以直接删除。

 

8、离散型特征的缺失值处理

import pandas as pd
# 缺失值处理
# 只在subset中删除na
data.dropna(subset=['Default'],inplace=True) #删除sex中2行缺失值
filling_columns = ['sex','maritalStatus','threeVerify','idVerify','education']
for column in filling_columns:
    data[column].fillna('未知',inplace=True) # 其他缺失值填充为'位置'
# 查看存在缺失值的特征
na_counts = data.isnull().sum()
missing_value = na_counts[na_counts > 0].sort_values(ascending = False)
print(missing_value)

 9、离散型特征值的异常值处理

import pandas as pd
#可以看出 
#print(data[data['isCrime'] > 1]['isCrime'])
#查看每个列 分类状况 可以看出 有些列值异常
#for col in data.columns:
#    print(data[col].value_counts())
# 异常值处理 把 犯罪分类 2 替换为 0
data['isCrime'] = data['isCrime'].replace(2,0)

# 查看处理后的数据情况
print(data['isCrime'].value_counts())

10、连续型特征(异常值发现与处理)

(1)查看最小值

# 所有连续型特征列名已保存在continuous_columns中
continuous_columns = ['age','cashTotalAmt','cashTotalCnt','monthCardLargeAmt','onlineTransAmt','onlineTransCnt','publicPayAmt','publicPayCnt','transTotalAmt','transTotalCnt','transCnt_non_null_months','transAmt_mean','transAmt_non_null_months','cashCnt_mean','cashCnt_non_null_months','cashAmt_mean','cashAmt_non_null_months','card_age']
# 查看数据各连续型特征的最小值
data_con_min = data[continuous_columns].min()
print(data_con_min)

(2)由(1)可见网上消费总额有小于0的情况。

# 从原始数据中筛选出网上消费金额小于0时,网上消费金额和网上消费笔数这两列
online_trans = data[data['onlineTransAmt'] < 0][['onlineTransAmt','onlineTransCnt']]
print(online_trans)

根据实际经验,网上消费笔数为0时,网上消费金额应该为0;

(3)把网上消费笔数为0时,网上消费金额置0

# 将网上消费笔数为0时的网上消费金额皆修改为0
#data[data['onlineTransCnt'] == 0]['onlineTransAmt'] = 0
data.loc[data['onlineTransCnt'] == 0,'onlineTransAmt'] = 0
# 查看修正后网上消费笔数为0时,网上消费金额与网上消费笔数
online_after = data[data["onlineTransCnt"]  == 0 ][["onlineTransAmt","onlineTransCnt"]] 
print(online_after)

(4)绘制连续性特征(网上消费金额)的盒图,查看消费金额的大致分布。

盒图的简介:

import seaborn as sns
import matplotlib.pyplot as plt 
fig,ax = plt.subplots(figsize=(8,6))
# 绘制盒图查看网上消费金额数据分布
sns.boxplot(data['onlineTransAmt'],ax=ax,orient='v')
plt.title('onlineTransAmt distribution')

(5)发现异常值后,异常值处理

去除网上消费金额大于2千万的数据

# 筛选出网上消费金额在2千万以下的数据样本,更新data
data = data[data['onlineTransAmt']<2.0e+07]
print(data.head())

11、数字编码(字符串型转换为数字)

利用map函数进行快速转换 

import numpy as np
import pandas as pd

data["maritalStatus"] = data["maritalStatus"].map({"未知":0,"未婚":1,"已婚":2})
data['education']= data['education'].map({"未知":0,"小学":1,"初中":2,"高中":3,"本科以上":4})
data['idVerify']= data['idVerify'].map({"未知":0,"一致":1,"不一致":2})
data['threeVerify']= data['threeVerify'].map({"未知":0,"一致":1,"不一致":2})
data["netLength"] = data['netLength'].map({"无效":0,"0-6个月":1,"6-12个月":2,"12-24个月":3,"24个月以上":4})
data["sex"] = data['sex'].map({"未知":0,"男":1,"女":2})
data["CityId"] = data['CityId'].map({"一线城市":1,"二线城市":2,"其它":3})

print(data.head())

12、One-Hot编码

对所有的非有序的特征列进行One-Hot编码

import numpy as np
import pandas as pd

data = pd.get_dummies(data=data,columns=['maritalStatus','education','idVerify','threeVerify','Han','netLength','sex','CityId'])
print(data.columns)

 

  • 21
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值