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()函数,拟合yX,并将拟合结果赋值给变量OLS_model
  • sm:程序包Statsmodels的简写,代码开头导入程序包时设置。
  • .fit():拟合函数,用于获取回归结果。

一元线性回归:展示回归结果

print("OLS回归结果:")
print(OLS_model.summary(), "\n")

运行结果:

OLS回归结果

说明:

  • 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变量单位,散点的颜色,趋势线的颜色,回归方程。
分类: 教程笔记

管理员

管理员

SEIT资源站