5.2.0 要点
-
Python基本操作
-
自定义绘图函数:XY散点图,趋势和散点图函数
-
自定义序列
x
的统计指标函数
x.count() # 计算总数 x.min() # 最小值 x.quantile(.25) # 下四分位数 x.median() # 中位数 x.quantile(.75) # 上四分位数 x.max() # 最大值 x.mean() # 平均数 x.var() # 方差 x.std() # 标准差 x.skew() # 偏度 x.kurt() # 峰度 x.max()-x.min() # 极差
-
调用自定义函数
-
字符串拼接:
OLS_equation = "Y=" + beta0 + "+" + beta1 + "*X"
-
-
Pandas程序包
-
数据序列的简要统计描述:
.describe()
-
数据序列的协方差矩阵:
.cov()
-
数据序列的相关系数矩阵:
.corr()
-
-
Matplotlib程序包
-
绘制散点图:
plt.scatter()
-
绘制折线图:
plt.plot()
-
-
Statsmodels程序包
-
一元线性回归:
OLS_model=sm.OLS(y, X).fit()
-
回归结果:
OLS_model.summary()
-
回归参数:
OLS_model.params
-
拟合值:
OLS_model.predict()
-
5.2.1 题目
某大型商业银行在多个地区设有分行,其业务主要是进行基础设施建设、国家重点项目建设、固定资产投资等项目的贷款。近年来,该银行的贷款额平稳增长,但不良贷款也有较大比例的增长,这给银行业务的发展带来较大压力。管理者希望知道:不良贷款是否与贷款余额、累计应收贷款、贷款项目个数、固定资产投资额等因素有关?关系强度如何?贷款余额对不良贷款的影响程度如何?
数据:
数据来源:统计学原理(第8版)第216页,贾俊平等编著,中国人民大学出版社,2021.
请以上述数据为依据,进行如下分析:
- 绘制XY散点图:不良贷款与贷款余额,不良贷款与累积应收贷款,不良贷款与贷款项目个数,不良贷款与固定资产投资。
- 计算协方差矩阵与相关系数矩阵。
- 建立一元线性回归,分析:不良贷款与贷款余额之间的关系。
变量说明
NP_Loan # 不良贷款
Balance # 贷款余额
CR_Loan # 累积应收贷款
Loan_Num # 贷款项目个数
Fix_Invest # 固定资产投资
5.2.2 代码
# 导入程序包
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import ssl
# 禁用SSL证书校验
ssl._create_default_https_context = ssl._create_unverified_context
# 导入excel数据(在线数据)
df = pd.read_excel(r"https://cdn.seit2019.xyz/data/econometrics/exp11.6.xlsx", index_col="分行编号")
# 修改列索引为英文
df = df.rename(columns={"不良贷款(亿元)": "NP_Loan", "贷款余额(亿元)": "Balance", "累计应收贷款(亿元)": "CR_Loan", "贷款项目个数(个)": "Loan_Num", "固定资产投资额(亿元)": "Fix_Invest"})
# 展示数据
print("数据展示如下:")
print(df, "\n")
# 展示简要统计指标
print("数据的简要统计指标:")
print(df.describe(), "\n")
# 绘制XY散点图
# 定义XY散点图函数
def xy_scatter(x_var, y_var, x_label_str, y_label_str, x_unit_str, y_unit_str, color_str): # 函数名称(参数)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 定义字体,显示中文
plt.rcParams['axes.unicode_minus'] = False # 定义字体,显示中文
title_str = y_label_str + "与" + x_label_str + "散点图" # 定义标题字符串
y_label_str = y_label_str + y_unit_str # y轴标签+单位
x_label_str = x_label_str + x_unit_str # x轴标签+单位
plt.scatter(x_var, y_var, c=color_str) # 散点图
plt.xlabel(x_label_str) # 显示x轴标签
plt.ylabel(y_label_str) # 显示y轴标签
plt.title(title_str, fontsize="xx-large", fontweight="bold") # 显示标题
plt.show() # 显示整个图形
return
# 定义变量
y = df["NP_Loan"]
x1 = df["Balance"]
x2 = df["CR_Loan"]
x3 = df["Loan_Num"]
x4 = df["Fix_Invest"]
# 定义标签
y_label_str = "不良贷款"
x1_label_str = "贷款余额"
x2_label_str = "累计应收贷款"
x3_label_str = "贷款项目个数"
x4_label_str = "固定资产投资额"
# 绘图
# 不良贷款与贷款余额散点图
xy_scatter(x1, y, x1_label_str, y_label_str, "(亿元)", "(亿元)", "red")
# 不良贷款与累计应收贷款散点图
xy_scatter(x2, y, x2_label_str, y_label_str, "(亿元)", "(亿元)", "yellow")
# 不良贷款与贷款项目个数散点图
xy_scatter(x3, y, x3_label_str, y_label_str, "(个)", "(亿元)", "blue")
# 不良贷款与固定资产投资额散点图
xy_scatter(x4, y, x4_label_str, y_label_str, "(亿元)", "(亿元)", "black")
# 详细统计指标
# 定义统计指标函数
def stat(x):
return pd.Series(
[x.count(), x.min(), x.quantile(.25), x.median(), x.quantile(.75), x.max(), x.mean(), x.var(), x.std(),
x.skew(), x.kurt(), x.max() - x.min()],
index=['总数', '最小值', '下四分位数', '中位数', '上四分位数', '最大值', '平均数', '方差', '标准差', '偏度', '峰度', '极差'])
# 计算统计指标
stat_y = pd.DataFrame(stat(y))
stat_x1 = pd.DataFrame(stat(x1))
stat_x2 = pd.DataFrame(stat(x2))
stat_x3 = pd.DataFrame(stat(x3))
stat_x4 = pd.DataFrame(stat(x4))
# 合并显示统计指标
dfs = pd.DataFrame(columns=['NP_Loan', 'Balance', 'CR_Loan', 'Loan_Num', 'Fix_Invest'])
dfs['NP_Loan'] = stat_y
dfs['Balance'] = stat_x1
dfs['CR_Loan'] = stat_x2
dfs['Loan_Num'] = stat_x3
dfs['Fix_Invest'] = stat_x4
# 展示详细的统计描述
print("数据的详细统计指标:")
print(dfs, "\n")
# 展示数据的协方差矩阵
print("数据的协方差矩阵:")
print(df.cov(), "\n")
# 展示数据的相关系数矩阵
print("数据的相关系数矩阵:")
print(df.corr(), "\n")
# 一元线性回归
# 定义变量
X = sm.add_constant(x1) # 添加常数项
# OLS回归
OLS_model = sm.OLS(y, X).fit()
# 展示OLS回归结果
print("OLS回归结果:")
print(OLS_model.summary(), "\n")
# 展示OLS回归方程
dfc = pd.DataFrame(OLS_model.params).round(4) # 获取回归参数,保留小数点后4位,赋值给dfc
dfc = dfc.astype("string") # 转换dfc的格式为字符串
beta0 = dfc.iloc[0, 0] # 获取dfc的第1个值,赋值给beta0
beta1 = dfc.iloc[1, 0] # 获取dfc的第2个值,赋值给定义beta1
OLS_equation = "Y=" + beta0 + "+" + beta1 + "*X" # 定义回归方程,方式:字符串拼接
print("一元线性回归方程为:"+OLS_equation, "\n") # 显示回归方程
# 绘制趋势线与散点图
# 定义趋势线和散点图函数
def fitted_scatter(x_var, y_var, y_fit_var, x_label_str, y_label_str, x_unit_str, y_unit_str, scatter_c, plot_c, equation_str): # 函数名称(参数)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 定义字体,显示中文
plt.rcParams['axes.unicode_minus'] = False # 定义字体,显示中文
title_str = y_label_str + "与" + x_label_str + "散点图" # 定义标题字符串
y_label_str = y_label_str + y_unit_str # y轴标签+单位
x_label_str = x_label_str + x_unit_str # y轴标签+单位
plt.scatter(x_var, y_var, color=scatter_c, label="实际值") # 散点图
plt.plot(x_var, y_fit_var, color=plot_c, label="预测值") # 趋势线
plt.title(title_str, fontsize="xx-large", fontweight="bold") # 标题
plt.xlabel(x_label_str) # 显示x轴标签
plt.ylabel(y_label_str) # 显示y轴标签
plt.text(240, 7, s=equation_str, fontsize="x-large") # 显示回归方程,位置自定义
plt.legend() # 显示图例
plt.show() # 显示整个图形
return
# 定义变量
y_fitted = OLS_model.predict()
# 定义标签(已定义)
# 绘图
fitted_scatter(x1, y, y_fitted, x1_label_str, y_label_str, "亿元", "亿元", "blue", "black", OLS_equation)
5.2.3 代码解析
导入程序包
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
说明:
pandas
:Python数据处理最常用的程序包matplotlib
:Python绘图常用程序包statsmodels
:Python回归分析常用程序包import pandas as pd
:表示将pandas程序包导入,并简化命名为:pd
import matplotlib.pyplot as plt
:表示将matplotlib
程序包中的pyplot
模块导入,并简化命名为:plt
import statsmodels.api as sm
:表示将statsmodels
程序包中的api
模块导入,并简化命名为:sm
- 上述程序包导入和简化命名方式,是Python编程通用的方式。为了便于代码阅读和分享,建议保持不变。
导入数据
df = pd.read_excel(r"https://cdn.seit2019.xyz/data/econometrics/exp11.6.xlsx", index_col="分行编号")
说明:
- 功能:调用
pandas
程序包中的read_excel()
函数,将链接中数据导入,并命名为变量df01
,同时设定名称为"分行编号"
的列为行索引。 - 变量
df
中,数据以DataFrame格式存储数据。 - DataFrame是pandas支持的表格型数据格式,类似excel。
- 关于DataFrame,详情参考:Pandas 数据结构 – DataFrame
- 为了便于教程分享,这里采用在线数据。
index_col="分行编号"
:表示将名称为"分行编号"
的列设定为行索引。- 详细的数据导入与导出,请参考:2.2 Python数据导入与导出
修改数据列索引
df = df.rename(columns={"不良贷款(亿元)": "NP_Loan", "贷款余额(亿元)": "Balance", "累计应收贷款(亿元)": "CR_Loan", "贷款项目个数(个)": "Loan_Num", "固定资产投资额(亿元)": "Fix_Invest"})
说明:
- 功能:修改变量
df
中数据的列名称。 .rename()
:修改行或列标签的函数columns={}
:表示以字典的方式修改列名称,即用:
后面的value
(新列名)替换:
前面的key
(原列名)- 字典是Python中重要的数据结构,通常以
{}
标记;字典的每个键值由:
分开,表示一一对应关系,格式:key:value
;多个键值之间用,
分隔,格式:{key1: value, key2: value}。 - 关于字典,详情参考:菜鸟教程:Python 字典(Dictionary)
展示数据
print("数据展示如下:")
print(df, "\n")
运行结果:
说明:
print("数据展示如下:")
表示将""
中的文字(字符串)显示在程序运行窗口。print(df, "\n")
:显示名称为df
的变量,然后回车,换行。print()
是python显示输出函数,可以将变量,数据,运行结果等以文本的方式显示在程序运行窗口。”\n"
:表示回车、换行,其功能是:将前后两次显示的结果以空行隔开。
展示简要统计指标
print("数据的简要统计指标:")
print(df.describe(), "\n")
运行结果:
说明:
print("数据的简要统计指标:")
表示将""
中的文字(字符串)显示在程序运行窗口。print(df.describe(), "\n")
:显示名称为df
变量的简要统计结果,然后回车,换行。print()
是python显示输出函数,可以将变量,数据,运行结果等以文本的方式显示在程序运行窗口。”\n"
:表示回车、换行,其功能是:将前后两次显示的结果以空行隔开。
绘制XY散点图:定义函数
def xy_scatter(x_var, y_var, x_label_str, y_label_str, x_unit_str, y_unit_str, color_str): # 函数名称(参数)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 定义字体,显示中文
plt.rcParams['axes.unicode_minus'] = False # 定义字体,显示中文
title_str = y_label_str + "与" + x_label_str + "散点图" # 定义标题字符串
y_label_str = y_label_str + y_unit_str # y轴标签+单位
x_label_str = x_label_str + x_unit_str # x轴标签+单位
plt.scatter(x_var, y_var, c=color_str) # 散点图
plt.xlabel(x_label_str) # 显示x轴标签
plt.ylabel(y_label_str) # 显示y轴标签
plt.title(title_str, fontsize="xx-large", fontweight="bold") # 显示标题
plt.show() # 显示整个图形
return
说明:
- 功能:定义一个绘制XY散点图的函数
xy_scatter()
。 - 函数定义:函数是指一段功能完整,可以重复使用的代码片段。
- 函数说明:python中,函数定义以
def
开始,return
结束。 - 函数使用场景:当某一特定功能需要多次实现,建议定义为函数,重复调用。
- 关于函数,详情参考:Python 函数
绘制XY散点图:定义变量
y = df["NP_Loan"]
x1 = df["Balance"]
x2 = df["CR_Loan"]
x3 = df["Loan_Num"]
x4 = df["Fix_Invest"]
说明:
- 将变量
df
中名称为"NP_Loan"
的列,赋值给变量y
;其他变量赋值,依次类推。
绘制XY散点图:定义标签
y_label_str = "不良贷款"
x1_label_str = "贷款余额"
x2_label_str = "累计应收贷款"
x3_label_str = "贷款项目个数"
x4_label_str = "固定资产投资额"
说明:
- 将字符串
"不良贷款"
赋值给变量y_label_str
;其他变量赋值,依次类推。
绘制XY散点图:绘图
xy_scatter(x1, y, x1_label_str, y_label_str, "(亿元)", "(亿元)", "red") # 不良贷款与贷款余额散点图
xy_scatter(x2, y, x2_label_str, y_label_str, "(亿元)", "(亿元)", "yellow") # 不良贷款与累计应收贷款散点图
xy_scatter(x3, y, x3_label_str, y_label_str, "(个)", "(亿元)", "blue") # 不良贷款与贷款项目个数散点图
xy_scatter(x4, y, x4_label_str, y_label_str, "(亿元)", "(亿元)", "black") # 不良贷款与固定资产投资额散点图
运行结果:
说明:
- 调用上述自定义函数
xy_scatter()
,绘制XY散点图; ()
内为函数参数,参数次序与函数定义保持一致。- 参数含义(依次为):x变量,y变量,x变量标签,y变量标签,x变量单位,y变量单位,散点的颜色
详细统计指标:定义函数
def stat(x):
return pd.Series(
[x.count(), x.min(), x.quantile(.25), x.median(), x.quantile(.75), x.max(), x.mean(), x.var(), x.std(),
x.skew(), x.kurt(), x.max() - x.min()],
index=['总数', '最小值', '下四分位数', '中位数', '上四分位数', '最大值', '平均数', '方差', '标准差', '偏度', '峰度', '极差'])
说明:
- 功能:定义一个计算详细统计指标的函数
stat()
。 - 函数定义:函数是指一段功能完整,可以重复使用的代码片段。
- 函数说明:python中,函数定义以
def
开始,return
结束。 - 函数使用场景:当某一特定功能需要多次实现,建议定义为函数,重复调用。
- 关于函数,详情参考:Python 函数
详细统计指标:计算统计指标
stat_y = pd.DataFrame(stat(y))
stat_x1 = pd.DataFrame(stat(x1))
stat_x2 = pd.DataFrame(stat(x2))
stat_x3 = pd.DataFrame(stat(x3))
stat_x4 = pd.DataFrame(stat(x4))
说明:
- 功能:调用上述自定义函数
stat()
,计算变量y
的详细统计指标取值,并将统计指标取值赋给变量stat_y
;其他变量,依次类推。
详细统计指标:合并显示统计指标
dfs = pd.DataFrame(columns=['NP_Loan', 'Balance', 'CR_Loan', 'Loan_Num', 'Fix_Invest'])
dfs['NP_Loan'] = stat_y
dfs['Balance'] = stat_x1
dfs['CR_Loan'] = stat_x2
dfs['Loan_Num'] = stat_x3
dfs['Fix_Invest'] = stat_x4
说明:
dfs = pd.DataFrame()
:定义一个格式为DataFrame的变量dfs
。columns=[]
:表示以列表方式定义变量dfs
的列标签。- 列表是python中常用的数据结构,通常以
[]
标记,列表内的元素可以是任意内容,多个元素之间以,
隔开。 - 关于列表,详情参考:菜鸟教程:Python 列表(List)
dfs['NP_Loan'] = stat_y
:表示将变量stat_y
赋值给变量dfs
中名称为'NP_Loan'
的列;其他变量赋值,依次类推。
详细统计指标:展示统计指标
print("数据的详细统计指标:")
print(dfs, "\n")
运行结果:
说明:
print("数据的详细统计指标:")
表示将""
中的文字(字符串)显示在程序运行窗口。print(dfs, "\n")
:显示名称为dfs
变量的简要统计结果,然后回车,换行。print()
是python显示输出函数,可以将变量,数据,运行结果等以文本的方式显示在程序运行窗口。”\n"
:表示回车、换行,其功能是:将前后两次显示的结果以空行隔开。
展示数据的协方差矩阵
print("数据的协方差矩阵:")
print(df.cov(), "\n")
运行结果:
说明:
print("数据的协方差矩阵:")
表示将""
中的文字(字符串)显示在程序运行窗口。print(df.cov(), "\n")
:显示名称为df
变量的协方差矩阵,然后回车,换行。.cov()
:计算数据序列协方差的函数。print()
是python显示输出函数,可以将变量,数据,运行结果等以文本的方式显示在程序运行窗口。”\n"
:表示回车、换行,其功能是:将前后两次显示的结果以空行隔开。
展示数据的相关系数矩阵
print("数据的相关系数矩阵:")
print(df.corr(), "\n")
运行结果:
说明:
print("数据的相关系数矩阵:")
表示将""
中的文字(字符串)显示在程序运行窗口。print(df.corr(), "\n")
:显示名称为df
变量的相关系数矩阵,然后回车,换行。.corr()
:计算数据序列相关系数的函数。print()
是python显示输出函数,可以将变量,数据,运行结果等以文本的方式显示在程序运行窗口。”\n"
:表示回车、换行,其功能是:将前后两次显示的结果以空行隔开。
一元线性回归:定义变量
X = sm.add_constant(x1) # 添加常数项
说明:
- 功能:为变量
x1
添加一列取值为1的列,并将结果赋值给变量X
。相当于在回归的解释变量中添加一个常数列,作为回归的常数项。
一元线性回归:OLS回归
OLS_model = sm.OLS(y, X).fit()
说明:
- 功能:调用
Statsmodels
程序包中的.OLS()
函数,拟合y
和X
,并将拟合结果赋值给变量OLS_model
。 sm
:程序包Statsmodels
的简写,代码开头导入程序包时设置。.fit()
:拟合函数,用于获取回归结果。
一元线性回归:展示回归结果
print("OLS回归结果:")
print(OLS_model.summary(), "\n")
运行结果:
说明:
print("OLS回归结果:")
表示将""
中的文字(字符串)显示在程序运行窗口。print(OLS_model.summary(), "\n")
:展示OLS回归结果的主要内容,然后回车,换行。.summary()
:获取变量OLS_model
中OLS回归的主要内容。
一元线性回归:展示回归方程
dfc = pd.DataFrame(OLS_model.params).round(4) # 获取回归参数,保留小数点后4位,赋值给dfc
dfc = dfc.astype("string") # 转换dfc的格式为字符串,重新赋值给dfc
beta0 = dfc.iloc[0, 0] # 获取dfc的第1个值,赋值给beta0
beta1 = dfc.iloc[1, 0] # 获取dfc的第2个值,赋值给定义beta1
OLS_equation = "Y=" + beta0 + "+" + beta1 + "*X" # 定义回归方程,方式:字符串拼接
print("一元线性回归方程为:"+OLS_equation, "\n") # 显示回归方程
运行结果:
说明:
OLS_model.params
:表示获取变量OLS_model
中OLS回归的参数.round(4)
:表示对变量取值保留小数点后4位dfc.astype("string")
:表示将变量dfc
的格式转换为字符(string)串格式。.loc[]
:定位函数,依据行索引和列索引定位DataFrame数据中的元素。例如:dfc.iloc[1, 0]
表示dfc变量中行索引为1,列索引为0的元素。(注意:python中,行索引和列索引默认从0开始。)
绘制趋势线与散点图:定义函数
def fitted_scatter(x_var, y_var, y_fit_var, x_label_str, y_label_str, x_unit_str, y_unit_str, scatter_c, plot_c, equation_str): # 函数名称(参数)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 定义字体,显示中文
plt.rcParams['axes.unicode_minus'] = False # 定义字体,显示中文
title_str = y_label_str + "与" + x_label_str + "散点图" # 定义标题字符串
y_label_str = y_label_str + y_unit_str # y轴标签+单位
x_label_str = x_label_str + x_unit_str # y轴标签+单位
plt.scatter(x_var, y_var, color=scatter_c, label="实际值") # 散点图
plt.plot(x_var, y_fit_var, color=plot_c, label="预测值") # 趋势线
plt.title(title_str, fontsize="xx-large", fontweight="bold") # 标题
plt.xlabel(x_label_str) # 显示x轴标签
plt.ylabel(y_label_str) # 显示y轴标签
plt.text(240, 7, s=equation_str, fontsize="x-large") # 显示回归方程,位置自定义
plt.legend() # 显示图例
plt.show() # 显示整个图形
return
说明:
- 功能:定义一个绘制趋势线和散点图的函数
fitted_scatter()
。 - 函数定义:函数是指一段功能完整,可以重复使用的代码片段。
- 函数说明:python中,函数定义以
def
开始,return
结束。 - 函数使用场景:当某一特定功能需要多次实现,建议定义为函数,重复调用。
- 关于函数,详情参考:Python 函数
绘制趋势线与散点图:定义变量
y_fitted = OLS_model.predict()
说明:
- 功能:获取变量
OLS_model
中OLS回归的拟合值,赋值给变量y_fitted
。 OLS_model.predict()
:表示获取变量OLS_model
中OLS回归的拟合值。
绘制趋势线与散点图:定义标签(略)
说明:上述代码已经定义,这里直接引用。
绘制趋势线与散点图:绘图
fitted_scatter(x1, y, y_fitted, x1_label_str, y_label_str, "亿元", "亿元", "blue", "black", OLS_equation)
运行结果:
说明:
- 功能:调用上述自定义函数
fitted_scatter()
,绘制趋势线和散点图。 ()
内为函数参数,参数次序与函数定义保持一致。- 参数含义(依次为):x变量,y变量,y变量的拟合值,x变量标签,y变量标签,x变量单位,y变量单位,散点的颜色,趋势线的颜色,回归方程。