Seaborn 与 Pandas 数据可视化:银行客户忠诚度分析 8 种图表实战
Seaborn 与 Pandas 数据可视化银行客户忠诚度分析 8 种图表实战在数据分析领域数据可视化是洞察数据背后故事的关键工具。对于银行客户忠诚度分析而言通过恰当的可视化手段能够直观揭示客户行为模式、产品偏好和潜在流失风险。本文将系统介绍如何利用 Python 的 Seaborn 和 Pandas 库针对银行客户数据绘制 8 种核心图表每种图表都配有完整可复现的代码示例和解读要点。1. 热力图指标相关性分析热力图是展示多变量相关性的利器。在银行客户分析中我们可以用它来探索客户特征与购买行为之间的关联强度。import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 读取预处理后的数据 df pd.read_csv(cleaned_customer_data.csv) # 计算相关系数矩阵 corr_matrix df.corr() # 绘制热力图 plt.figure(figsize(12, 8)) sns.heatmap(corr_matrix, annotTrue, fmt.2f, cmapcoolwarm, center0, linewidths0.5) plt.title(银行客户特征相关性热力图, fontsize16) plt.xticks(rotation45) plt.yticks(rotation0) plt.tight_layout() plt.show()关键解读点颜色越暖红色表示正相关越强越冷蓝色表示负相关越强duration通话时长与y购买结果的相关系数为 0.39属于低度正相关poutcome上次营销结果与y的相关性为 0.32值得关注大多数特征间的相关性较弱绝对值0.3提示热力图中对角线上的值总是1变量与自身的完全相关可以设置mask参数隐藏对角线区域。2. 分组柱状图年龄与购买行为分组柱状图能清晰展示不同年龄段客户的购买行为差异# 创建年龄分段 bins [16, 26, 36, 46, 56, 66, 76, 86, 96] labels [16-25, 26-35, 36-45, 46-55, 56-65, 66-75, 76-85, 86-95] df[age_group] pd.cut(df[age], binsbins, labelslabels) # 计算各年龄段的购买比例 age_purchase df.groupby([age_group, y]).size().unstack() age_purchase[yes_ratio] age_purchase[1] / (age_purchase[0] age_purchase[1]) # 绘制分组柱状图 plt.figure(figsize(12, 6)) sns.barplot(xage_group, yyes_ratio, dataage_purchase.reset_index(), paletteviridis, orderlabels) plt.title(不同年龄段客户购买产品比例, fontsize16) plt.xlabel(年龄组) plt.ylabel(购买比例) plt.grid(axisy, linestyle--, alpha0.7) plt.show()分析发现26-35岁客户群体占比最大但购买率最低仅12.6%76-85岁客户购买比例最高51.6%忠诚度显著购买率随年龄呈现U型曲线中青年群体购买意愿最低3. 饼图职业与购买行为对比饼图适合展示构成比例这里我们比较蓝领和学生群体的购买情况# 筛选蓝领和学生数据 blue_collar df[df[job] blue-collar] student df[df[job] student] # 设置画布 fig, axes plt.subplots(1, 2, figsize(14, 6)) # 蓝领购买情况饼图 blue_counts blue_collar[y].value_counts() axes[0].pie(blue_counts, labels[未购买, 购买], autopct%1.1f%%, colors[#ff9999,#66b3ff], startangle90) axes[0].set_title(蓝领群体购买情况, fontsize14) # 学生购买情况饼图 student_counts student[y].value_counts() axes[1].pie(student_counts, labels[未购买, 购买], autopct%1.1f%%, colors[#99ff99,#ffcc99], startangle90) axes[1].set_title(学生群体购买情况, fontsize14) plt.tight_layout() plt.show()对比结论蓝领群体购买率仅为8%452/5670学生群体购买率达到33.3%203/609是蓝领的4倍针对蓝领群体需要设计更有吸引力的营销策略4. 箱线图通话时长与购买行为箱线图能直观展示数据分布和异常值适合分析通话时长这类连续变量plt.figure(figsize(10, 6)) sns.boxplot(xy, yduration, datadf, paletteSet2, showfliersFalse) # 不显示异常值 plt.title(购买行为与通话时长的关系, fontsize16) plt.xlabel(购买结果 (0未购买, 1购买)) plt.ylabel(通话时长(秒)) plt.grid(axisy, linestyle--, alpha0.7) # 添加均值标记 means df.groupby(y)[duration].mean() for i, mean in enumerate(means): plt.scatter(i, mean, colorred, s100, markerD) plt.text(i, mean20, f均值: {mean:.0f}s, hacenter, vabottom, fontsize12) plt.show()关键发现购买客户的中位通话时长约400秒显著高于未购买客户约180秒购买客户的通话时长分布更分散说明需要更个性化的沟通未购买客户的通话时长集中在较短时间内可能存在沟通不足的问题5. 折线图年龄与客户流失率折线图能清晰展示趋势变化适合分析年龄与流失率的关系# 计算各年龄的流失率 age_exit df.groupby(Age)[Exited].mean().reset_index() plt.figure(figsize(12, 6)) sns.lineplot(xAge, yExited, dataage_exit, color#ff6b6b, linewidth2.5) plt.fill_between(age_exit[Age], age_exit[Exited], alpha0.2, color#ff6b6b) plt.title(不同年龄客户的流失率趋势, fontsize16) plt.xlabel(年龄) plt.ylabel(流失率) plt.xticks(range(20, 90, 5)) plt.grid(linestyle--, alpha0.5) # 标记关键点 max_idx age_exit[Exited].idxmax() plt.scatter(age_exit.loc[max_idx, Age], age_exit.loc[max_idx, Exited], colorred, s100) plt.text(age_exit.loc[max_idx, Age]2, age_exit.loc[max_idx, Exited], f峰值: {age_exit.loc[max_idx, Exited]:.2%} {age_exit.loc[max_idx, Age]}岁, fontsize12) plt.show()趋势分析流失率在45-55岁达到峰值约42%30岁以下和65岁以上客户流失率较低20%银行应特别关注中年客户的维系策略6. 散点图信用评分与年龄散点图适合展示两个连续变量间的关系这里分析信用评分与年龄plt.figure(figsize(12, 6)) scatter sns.scatterplot(xAge, yCreditScore, hueExited, datadf, palette[#4c72b0,#c44e52], alpha0.6, sizeExited, sizes[20, 40]) plt.title(客户信用评分与年龄的关系按流失状态, fontsize16) plt.xlabel(年龄) plt.ylabel(信用评分) plt.legend(title流失状态, labels[未流失, 已流失]) plt.grid(alpha0.3) # 添加趋势线 sns.regplot(xAge, yCreditScore, datadf[df[Exited]0], scatterFalse, color#4c72b0, line_kws{linestyle:--}) sns.regplot(xAge, yCreditScore, datadf[df[Exited]1], scatterFalse, color#c44e52, line_kws{linestyle:--}) plt.show()观察结果信用评分在500-850之间的40-55岁客户流失最多年轻客户信用评分普遍较高且流失率低两条趋势线显示流失客户的信用评分随年龄下降更快7. 堆叠柱状图客户户龄与流失情况堆叠柱状图适合展示构成比例随时间/阶段的变化# 创建户龄与流失的交叉表 tenure_exit pd.crosstab(df[Tenure], df[Exited]) # 计算比例 tenure_exit[Total] tenure_exit[0] tenure_exit[1] tenure_exit[Exit_Ratio] tenure_exit[1] / tenure_exit[Total] plt.figure(figsize(12, 6)) tenure_exit[[0, 1]].plot(kindbar, stackedTrue, color[#55a868,#c44e52], figsize(12,6)) plt.title(不同户龄客户的流失情况, fontsize16) plt.xlabel(客户户龄年) plt.ylabel(客户数量) plt.legend(title流失状态, labels[未流失, 已流失]) plt.grid(axisy, alpha0.3) # 添加流失率折线 ax2 plt.twinx() ax2.plot(tenure_exit.index, tenure_exit[Exit_Ratio], color#dd8452, markero, linewidth2) ax2.set_ylabel(流失率, color#dd8452) ax2.tick_params(axisy, colors#dd8452) ax2.set_ylim(0, 0.5) plt.tight_layout() plt.show()户龄分析各户龄段的流失率基本稳定在20-25%之间新客户户龄0-1年流失率略高约25%户龄7年以上的老客户流失率最低约18%8. 热力图客户状态与资产阶段第二个热力图示例分析客户状态与资产阶段的流失情况# 创建客户状态和资产阶段的分类 df[Status] pd.cut(df[Tenure], bins[-1, 3, 6, 10], labels[新客户, 稳定客户, 老客户]) df[AssetStage] pd.qcut(df[Balance], q4, labels[低资产, 中下资产, 中上资产, 高资产]) # 构建透视表 pivot_table df.pivot_table(indexStatus, columnsAssetStage, valuesExited, aggfuncsum) plt.figure(figsize(10, 6)) sns.heatmap(pivot_table, annotTrue, fmt.0f, cmapYlOrRd, linewidths0.5, linecolorwhite) plt.title(不同状态和资产阶段客户的流失数量, fontsize16) plt.xlabel(资产阶段) plt.ylabel(客户状态) plt.show()策略启示高资产的新客户流失最多需要优先关注低资产的稳定客户流失最少维护成本较低中上资产的老客户忠诚度最高是重点维护对象图表美化进阶技巧为了让可视化作品更加专业分享几个实用技巧主题设置使用sns.set_style()统一风格sns.set_style(whitegrid, {grid.linestyle: --}) sns.set_palette(husl)字体优化解决中文显示问题plt.rcParams[font.sans-serif] [SimHei] # Windows plt.rcParams[axes.unicode_minus] False多图布局使用plt.subplots()创建复杂布局fig, axes plt.subplots(2, 2, figsize(14, 10)) fig.suptitle(银行客户分析仪表板, fontsize16)交互式可视化结合 Plotly 增强交互性import plotly.express as px fig px.scatter(df, xAge, yCreditScore, colorExited, hover_data[Tenure, Balance]) fig.show()自定义颜色使用企业品牌色系bank_palette [#003366, #FF6600, #669900, #CC0033] sns.set_palette(bank_palette)在实际项目中我经常发现中年高资产客户的流失问题最为棘手。通过组合使用热力图和散点图能够快速定位这类高风险客户群体而箱线图则帮助团队理解有效沟通的时间阈值。可视化不仅是分析工具更是团队沟通的通用语言——当业务部门看到直观的图表时数据驱动的决策过程会变得自然流畅。