<< 数据分析与应用>>课后实训任务完整答案

本篇内容涵盖了数据分析的基础应用,包括使用Python进行人口数据的散点图、直方图和箱线图绘制,揭示1996~2015年间人口特征间的关系与分布。同时,深入探究P2P网络贷数据,通过读取、清洗和分析用户信息更新表和登录信息表,提取时间信息并进行数据聚合,理解用户行为模式。此外,还涉及异常值处理和关键特征构建,为风险评估提供数据支持。
摘要由CSDN通过智能技术生成

**

<< 数据分析与应用>>课后实训任务完整答案

**

1. 第三章

(1).分析1996~2015年人口数据特征间的关系

        #第三章实训1

#```python

import numpy as np
import matplotlib.pyplot as plt

data = np.load('D:/Study/Python/Practical trainingDate/3date/populations.npz', allow_pickle=True)
print(data.files)
print(data['data'])
print(data['feature_names'])
 
plt.rcParams['font.sans-serif']='SimHei'
name=data['feature_names']
values=data['data']
 
p1=plt.figure(figsize=(12,12))
pip1=p1.add_subplot(2,1,1)

plt.scatter(values[0:20,0],values[0:20,1],marker='8',color='red')
plt.ylabel('总人口(万人)')
plt.legend('年末')
plt.title('1996~2015年末与各类人口散点图')
 
pip2=p1.add_subplot(2,1,2)#绘制子图2
plt.scatter(values[0:20,0],values[0:20,2],marker='o',color='yellow')
plt.scatter(values[0:20,0],values[0:20,3],marker='D',color='green')
plt.scatter(values[0:20,0],values[0:20,4],marker='p',color='blue')
plt.scatter(values[0:20,0],values[0:20,5],marker='s',color='purple')
plt.xlabel('时间')
plt.ylabel('总人口(万人)')
plt.xticks(values[0:20,0])
plt.legend(['男性','女性','城镇','乡村'])
 
 

p2=plt.figure(figsize=(12,12))
p1=p2.add_subplot(2,1,1)
plt.plot(values[0:20,0],values[0:20,1],color='r',linestyle='--',marker='8')
plt.ylabel('总人口(万人)')
plt.xticks(range(0,20,1),values[range(0,20,1),0],rotation=45)#rotation设置倾斜度
plt.legend('年末')
plt.title('1996~2015年末总与各类人口折线图')
 
p2=p2.add_subplot(2,1,2)
plt.plot(values[0:20,0],values[0:20,2],'y-')
plt.plot(values[0:20,0],values[0:20,3],'g-.')
plt.plot(values[0:20,0],values[0:20,4],'b-')
plt.plot(values[0:20,0],values[0:20,5],'p-')
plt.xlabel('时间')
plt.ylabel('总人口(万人)')
plt.xticks(values[0:20,0])
plt.legend(['男性','女性','城镇','乡村'])
 

plt.show()

(2).分析1996~2015年人口数据各个特征的分布与分散情况

#```python

import numpy as np
import matplotlib.pyplot as plt
 
data = np.load('D:/Study/Python/Practical trainingDate/3date/populations.npz', allow_pickle=True)
print(data['data'])#输出数据文件中的data数组
name=data['feature_names']#提取其中的feature_names数组,视为数据的标签
values=data['data']#提取其中的data数组,视为数据的存在位置
plt.rcParams['font.sans-serif']='SimHei'#设置中文显示
label1=['男性','女性']#标签
label2=['城镇','乡村']
ex=[0.01,0.01]#饼图:设定各项距离圆心n个半径
 
#1.直方图
p1=plt.figure(figsize=(12,12))#设置画布大小
#子图1
a1=p1.add_subplot(2,2,1)
plt.bar(range(2),values[19,2:4],width=0.5,color='orange')
plt.ylabel('人口(万人)')
plt.ylim(0,80000)#设置当前图形y轴的范围
plt.xticks(range(2),label1)#指定x轴刻度的数目与取值
plt.title('1996年男、女人口数直方图')
 
#子图2
b1=p1.add_subplot(2,2,2)
plt.bar(range(2),values[0,2:4],width=0.5,color='red')
plt.ylabel('人口(万人)')
plt.ylim(0,80000)
plt.xticks(range(2),label1)
plt.title('2015年男、女人口数直方图')
 
#子图3
c1=p1.add_subplot(2,2,3)
plt.bar(range(2),values[19,4:6],width=0.5,color='orange')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0,90000)
plt.xticks(range(2),label2)
plt.title('1996年城、乡人口数直方图')
 
#子图4
d1=p1.add_subplot(2,2,4)
plt.bar(range(2),values[0,4:6],width=0.5,color='red')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0,90000)
plt.xticks(range(2),label2)
plt.title('2015年城、乡人口数直方图')
plt.savefig('D:/Study/Python/date/tmp/1996、2015年各类人口直方图.png')#保存图片
 
#2.饼图
p2=plt.figure(figsize=(8,8))
#子图1
a2=p2.add_subplot(2,2,1)
plt.pie(values[19,2:4],explode=ex,labels=label1,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年男、女人口数饼图')
 
#子图2
b2=p2.add_subplot(2,2,2)
plt.pie(values[0,2:4],explode=ex,labels=label1,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年男、女人口数饼图')
 
#子图3
c2=p2.add_subplot(2,2,3)
plt.pie(values[19,4:6],explode=ex,labels=label2,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年城、乡人口数饼图')
 
#子图4
d2=p2.add_subplot(2,2,4)
plt.pie(values[0,4:6],explode=ex,labels=label2,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年城、乡人口数饼图')
plt.savefig('D:/Study/Python/date/tmp/1996、2015年各类人口饼图.png')
 
#3.箱线图
p3=plt.figure(figsize=(10,10))
plt.boxplot(values[0:20,1:6],notch=True,labels=['年末','男性','女性','城镇','乡村'],meanline=True)
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.title('1996~2015年各特征人口箱线图')
plt.savefig('D:/Study/Python/date/tmp/1996`2015年各特征人口箱线图.png')
 
#显示
plt.show()

2.第四章

        

## (1).读取并查看P2P网络贷数据主表的基本信息

#```python


import pandas as pd
Master=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Master.csv",encoding="gbk")
Userupdate=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_LogInfo.csv",encoding="gbk")
#查看ndim维度、shape形状、memory_usage占用内存
print("主表的维度为:",Master.ndim)
print("主表的形状为:",Master.shape)
print("主表的占用内存为:",Master.memory_usage().head())

print("用户信息更新表的维度为:",Userupdate.ndim)
print("用户信息更新表的形状为:",Userupdate.shape)
print("用户信息更新表的占用内存为:",Userupdate.memory_usage().head())

print("登录信息表的维度为:",LogInfo.ndim)
print("登录信息表的形状为:",LogInfo.shape)
print("登录信息表的占用内存为:",LogInfo.memory_usage().head())
'''

print("主表的索引为:",Master.index)
print("主表的值为:",Master.values)
print("主表的列名为:",Master.columns)
print("主表的数据类型为:",Master.dtypes)
print("主表的元素个数为:",Master.size)
'''

print("主表的描述性统计为:",Master.describe())

def Drop_same_null(data):
    print("删除前的的形状为:",data.shape)
    before=data.shape[1]
    NullCol=data.describe().loc["count"]==0
    for i in range(0,len(NullCol)):
        if NullCol[i]:
            data.drop(labels=NullCol.index[i],axis=1,inplace=True)
    StdCol=data.describe().loc["std"]==0
    for j in range(0,len(StdCol)):
        if StdCol[j]:
            data.drop(labels=StdCol.index[j],axis=1,inplace=True)
    after=data.shape[1]
    print("删除后的形状为:",data.shape)
print("主表的删除值相同或者全空的列后的情况:")
Drop_same_null(Master)
print("用户信息更新表的删除值相同或者全空后的情况:")
Drop_same_null(Userupdate)
print("登录信息表的删除值相同或者全空后的情况:")
Drop_same_null(LogInfo)

## (2).提取用户信息更新表和登录信息表的时间信息

```python
import pandas as pd
Master=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Master.csv",encoding="gbk")
Userupdate=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_LogInfo.csv",encoding="gbk")

Userupdate["ListingInfo1"]=pd.to_datetime(Userupdate["ListingInfo1"])
Userupdate["UserupdateInfo2"]=pd.to_datetime(Userupdate["UserupdateInfo2"])
LogInfo["Listinginfo1"]=pd.to_datetime(LogInfo["Listinginfo1"])
LogInfo["LogInfo3"]=pd.to_datetime(LogInfo["LogInfo3"])

year=[i.year for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个年份信息:",year[:5])
month=[i.month for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个月份信息:",month[:5])
week=[i.week for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个星期信息:",week[:5])
day=[i.day for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个日期信息:",day[:5])

timeDeltaUserupdate=Userupdate["ListingInfo1"]-Userupdate["UserupdateInfo2"]
print("计算时间差以日期为单位:\n",timeDeltaUserupdate.head())

def TransformDayIntoHour(data):
    for i in range(0,len(data)):
        data[i]=data[i].total_seconds()/3600
    return data
print("计算时间差以小时为单位:\n",TransformDayIntoHour(timeDeltaUserupdate).head())

def TransformDayIntoMinute(data):
    for i in range(0,len(data)):
        data[i]=data[i].total_seconds()/60
    return data 
timeDeltaUserupdate=Userupdate["ListingInfo1"]-Userupdate["UserupdateInfo2"]
print("计算时间差以分钟为单位:\n",TransformDayIntoMinute(timeDeltaUserupdate).head())

(3).使用分组聚合得到方法进一步分析用户信息更新表和登录信息表

import pandas as pd
import numpy as np
Userupdate=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_LogInfo.csv",encoding="gbk")
#(1)使用groupby方法对用户信息更新表和登录信息表进行分组
UserupdateGroup=Userupdate[["Idx","UserupdateInfo2"]].groupby(by="Idx")
LogInfoGroup=LogInfo[["Idx","LogInfo3"]].groupby(by="Idx")
print('分组后的用户信息更新表为:',UserupdateGroup.head())
print('分组后的登录信息表为:',LogInfoGroup.head())
#(2)使用agg方法求取分组后的最早和最晚更新及登录时间。
print("分组后最早更新时间:",UserupdateGroup.agg(np.min).head())
print("分组后最晚更新时间:",UserupdateGroup.agg(np.max).head())
#(3)使用size方法求取分组后的数据的信息更新次数与登录次数。
print("分组后信息更新次数:",UserupdateGroup.size().head())
print("分组后登录次数:",LogInfoGroup.size().head())

(4).对用户信息更新表和登录信息表进行长宽的转换

import pandas as pd

logInfo = pd.read_csv('D:/Study\Python/Practical trainingDate/4date/Training_LogInfo.csv', encoding='gbk')
userUpdate = pd.read_csv('D:/Study\Python/Practical trainingDate/4date/Training_Userupdate.csv', encoding='gbk')

LogInfo_pivot = pd.pivot_table(logInfo, index='Idx', columns=['LogInfo1'], aggfunc='count')
print('用LogInfo1作为分组键创建的登录信息表\n', LogInfo_pivot.head())

UserUpdate_pivot = pd.pivot_table(userUpdate, index='Idx', columns=['UserupdateInfo1'], aggfunc='count')
print('用UserupdateInfo1作为分组键创建的用户信息更新表\n', UserUpdate_pivot.head())

LogInfo_cross = pd.crosstab(index=logInfo['Idx'], columns=logInfo['LogInfo1'])
print('用LogInfo1作为分组键创建的登录信息表\n', LogInfo_cross.head())
Userupdate_cross = pd.crosstab(index=userUpdate['Idx'], columns=userUpdate['UserupdateInfo1'])

print('用UserupdateInfo1作为分组键创建的用户信息更新表\n', Userupdate_cross.head())

3. 第五章

(1).查不用户用电量数据缺失值

import pandas as pd
import numpy as np
arr=np.array([0,1,2])
missing_data=pd.read_csv("D:/Study/Python/Practical trainingDate/5date/missing_data.csv",names=arr)

print("lagrange插值前(False为缺失值所在位置)",'\n',missing_data.notnull())


from scipy.interpolate import lagrange
for i in range(0,3): 

    la=lagrange(missing_data.loc[:,i].dropna().index,missing_data.loc[:,i].dropna().values)
  
    list_d=list(set(np.arange(0,21)).difference(set(missing_data.loc[:,i].dropna().index)))
   
    missing_data.loc[list_d,i]=la(list_d)  
    print("第%d列缺失值的个数为:%d"%(i,missing_data.loc[:,i].isnull().sum()))
print("lagrange插值后(False为缺失值所在位置)","\n",missing_data.notnull())

(2).合并线损,用电量趋势与线路警告数据

import pandas as pd
ele_loss=pd.read_csv('D:/Study/Python/Practical trainingDate/5date/ele_loss.csv',encoding='gbk')
alarm=pd.read_csv('D:/Study/Python/Practical trainingDate/5date/alarm.csv',encoding='gbk')
print('ele_loss的形状为:',ele_loss.shape)
print('alarm的形状为:',alarm.shape)
merge=pd.merge(ele_loss,alarm,how='inner',left_on=['ID','date'],right_on=['ID','date'])
print('merge的数据为:',merge)

(3).标准化建模专家样本数据

import pandas as pd
model=pd.read_csv("D:/Study/Python/Practical trainingDate/5date/model.csv",encoding = "gbk")
def Standard(data):
    data=(data-data.mean())/data.std()
    return data
S=Standard(model)
print("标准化后的数据为:",'\n',S.head())

'''
#离差标准化函数
def MinMaxScale(data):
    data=(data-data.min())/(data.max()-data.min())
    return data
M=MinMaxScale(model)
print("离差标准化后的数据为:",'\n',S.head())

#小数定标差标准化函数
def DecimalScaler(data): 
    data=data/10**np.ceil(np.log10(data.abs().max()))
    return data
D=DecimalScaler(model)
print("小数定标差标准化的数据为:",'\n',D.head())'''

4. 第七章

(1).处理信用卡数据异常值

import numpy as np
import pandas as pd
import os
credit_card = pd.read_csv('D:/Study/Python/Practical trainingDate/7data/credit_card.csv',sep=',',encoding='gbk')
print(credit_card)

index1 = credit_card['逾期'] == 1
index2 = credit_card['呆账'] == 1
index3 = credit_card['强制停卡记录'] == 1
index4 = credit_card['退票'] == 1
index5 = credit_card['拒往记录'] == 1
index6 = credit_card['瑕疵户'] == 2
indexs = index1 & index2  & index3 & index4 & index5 & index6
credit_card1 = credit_card.loc[indexs == False,:]
print('删除逾期,呆账,强制停卡,退票,拒往记录为1,瑕疵户为2后的数据的形状为:',credit_card1.shape)
word1 = r'D:/Study/Python/Practical trainingDate/7data/data/credit_card1.csv'
if os.path.exists(word1):
    print('该文件已存在!')
else:
    credit_card1.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card1.csv')
    print('该文件保存成功!')

index7 = credit_card1['拒往记录'] == 2
indexs2 = index2 & index3 & index4 & index7
credit_card2 = credit_card1.loc[indexs2 == False,:]
print('删除呆账,强制停卡,退票为1,拒往记录为2后的数据的形状为:',credit_card2.shape)
credit_card2.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card2.csv')
word2 = r'D:/Study/Python/Practical trainingDate/7data/data/credit_card2.csv'
if os.path.exists(word2):
    print('该文件已存在!')
else:
    credit_card2.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card2.csv')
    print('该文件保存成功!')

index8 = credit_card2['频率'] == 5
index9 = credit_card2['月刷卡额'] != 1
indexs3 = index8 & index9
credit_card3 = credit_card2.loc[indexs3 == False,:]
print('删除频率为5,刷卡金额不等于1的数据形状为:',
      credit_card3.shape)
credit_card3.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card3.csv')
word3 = r'D:/Study/Python/Practical trainingDate/7data/data//credit_card3.csv'
if os.path.exists(word3):
    print('该文件已存在!')
else:
    credit_card3.to_csv('D:/Study/Python/Practical trainingDate/7data/data/datacredit_card3.csv')
    print('该文件已保存')

(2).构建信用卡客户风险评价关键特征

import numpy as np
import pandas as pd
import os
credit_card3= pd.read_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card3.csv',encoding='utf-8',index_col=0, engine = 'python')
card_selection1 = credit_card3[['瑕疵户','逾期','呆账','退票','拒往记录','强制停卡记录']]
print('构建历史行为特征前5个特征为:\n',card_selection1.head())

card_selection1 = credit_card3[['瑕疵户','逾期','呆账','退票','拒往记录','强制停卡记录']]
print('构建历史行为特征前5个特征为:\n',card_selection1.head())

card_selection2 = credit_card3[['借款余额','个人月收入','个人月开销','家庭月收入','月刷卡额']]
print('构建经济风险特征前5个特征为:\n',card_selection2.head())

card_selection3 = credit_card3[['职业','年龄','住家']]
print('构建收入风险情况特征前5个特征为:\n',card_selection3.head())

card_features = pd.concat([card_selection1,card_selection2,card_selection3],axis=1)
print('构建LFS特征前5个为:\n',card_features.head())


from sklearn.preprocessing import StandardScaler
data = StandardScaler().fit_transform(card_features)
np.savez('D:/Study/Python/Practical trainingDate/7data/data/card_features.npz',data)
print('标准化后LFS模型的前5个特征为:\n',data[:5,:])

(3).构建K-Means聚类模型

from sklearn.cluster import KMeans
card_scale = np.load('D:/Study/Python/Practical trainingDate/7data/data/card_features.npz')    ['arr_0']
k = 5
kmeans_model = KMeans(n_clusters=k,random_state=123)
fit_kmeans = kmeans_model.fit(card_scale)
kmeans_model.cluster_centers_ 

a1 = pd.Series(kmeans_model.labels_).value_counts()
print('最终每个类别的数目为:\n',a1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值