实际操作示例使用 Pandas、Matplotlib 和 Seaborn 等 Python 库对示例数据集进行双变量分析。这些示例展示了如何探索变量间的关系。进行这些实践操作需要一个已加载的 Pandas DataFrame。在我们的示例中,假设我们有一个名为 df 的 DataFrame,它包含客户信息,具有 Age(年龄)、Annual_Income_k$(年收入,单位千美元)、Spending_Score(消费得分,根据消费行为分配的1-100分值)、Gender(性别)和 Education(教育程度)等列。import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 假设 'df' 是您已加载的 DataFrame # 示例:df = pd.read_csv('customer_data.csv') # 让我们回顾一下数据结构 print("数据样本:") print(df.head()) print("\n数据信息:") df.info() # 设置绘图风格以保持一致性 sns.set_theme(style="whitegrid")df.head() 和 df.info() 的输出将确认列名及其数据类型,为我们的分析奠定基础。分析数值变量间的关系一个常见的任务是理解两个定量测量之间如何关联。收入是否随年龄增长?收入和消费得分之间是否存在关联?散点图散点图非常适合可视化两个数值变量之间的关系。让我们考察 Annual_Income_k$ 和 Spending_Score 之间的关系。plt.figure(figsize=(10, 6)) sns.scatterplot(data=df, x='Annual_Income_k$', y='Spending_Score', hue='Gender', palette=['#1c7ed6', '#f06595']) plt.title('年收入与消费得分') plt.xlabel('年收入(千美元)') plt.ylabel('消费得分 (1-100)') plt.show(){"layout": {"title": "年收入与消费得分", "xaxis": {"title": "年收入(千美元)"}, "yaxis": {"title": "消费得分 (1-100)"}, "legend": {"title": {"text": "性别"}}, "width": 700, "height": 450}, "data": [{"type": "scatter", "mode": "markers", "x": [15, 16, 20, 23, 28, 29, 35, 54, 60, 62, 63, 67, 71, 75, 78, 81, 87, 99, 103, 113, 120, 137], "y": [39, 6, 77, 26, 40, 87, 4, 47, 52, 42, 5, 59, 95, 5, 16, 93, 26, 97, 35, 91, 20, 83], "marker": {"color": "#f06595"}, "name": "女性"}, {"type": "scatter", "mode": "markers", "x": [15, 19, 21, 25, 28, 33, 39, 48, 54, 59, 62, 65, 70, 73, 78, 86, 93, 101, 110, 126, 130], "y": [81, 3, 66, 12, 14, 93, 61, 35, 60, 15, 73, 8, 77, 88, 22, 75, 90, 29, 10, 74, 18], "marker": {"color": "#1c7ed6"}, "name": "男性"}]}散点图显示客户年收入与消费得分之间的关系。点按性别着色。该图有助于我们直观地查看分布情况。我们可能会观察到一些簇群,例如低收入低消费得分的客户,或高收入高消费得分的客户。添加性别的 hue 参数使我们能够观察不同群体之间关系是否存在差异。相关性分析散点图直观地展示了关系,而相关系数量化了数值变量之间的线性关联。珀尔逊相关系数 ($r$) 的范围是从 -1(完全负线性相关)到 +1(完全正线性相关),0 表示无线性相关。让我们计算 DataFrame 中数值列之间的相关性。numerical_cols = df.select_dtypes(include=['int64', 'float64']).columns correlation_matrix = df[numerical_cols].corr() print("相关系数矩阵:") print(correlation_matrix)这将输出一个显示成对相关系数的表格。例如,我们可能会发现 Age 和 Annual_Income_k$ 之间存在微弱的正相关,或者 Age 和 Spending_Score 之间存在中度的负相关。相关系数热力图热力图提供相关系数矩阵的图形表示,便于识别强相关或弱相关,尤其是在涉及许多变量时。plt.figure(figsize=(8, 6)) sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=.5) plt.title('数值特征的相关系数矩阵') plt.show(){"layout": {"title": "相关系数矩阵热力图", "xaxis": {"tickangle": -45}, "yaxis": {"automargin": true}, "width": 500, "height": 400}, "data": [{"type": "heatmap", "z": [[1.00, -0.01, -0.33], [-0.01, 1.00, 0.01], [-0.33, 0.01, 1.00]], "x": ["Age", "Annual_Income_k$", "Spending_Score"], "y": ["Age", "Annual_Income_k$", "Spending_Score"], "colorscale": [[0.0, "#1c7ed6"], [0.5, "#e9ecef"], [1.0, "#f03e3e"]], "colorbar": {"title": "相关性"}, "showscale": true}]}热力图可视化年龄、年收入和消费得分之间的珀尔逊相关系数。注释显示相关值。颜色表示相关性的强度和方向(例如,红色表示正相关,蓝色表示负相关),注释提供了精确的数值。分析数值变量与类别变量间的关系通常,我们需要比较由类别变量定义的各个群体间的数值测量。例如,Annual_Income_k$ 的平均值在不同 Gender 群体或不同 Education 级别之间是否存在显著差异?比较图 (箱线图、小提琴图)箱线图和小提琴图对于可视化类别变量的每个类别中数值变量的分布非常有效。让我们使用箱线图比较不同 Education 级别的 Annual_Income_k$。plt.figure(figsize=(12, 7)) sns.boxplot(data=df, x='Education', y='Annual_Income_k$', palette='Blues') plt.title('按教育水平划分的年收入分布') plt.xlabel('教育水平') plt.ylabel('年收入(千美元)') plt.xticks(rotation=45) plt.show(){"layout": {"title": "按教育水平划分的年收入分布", "xaxis": {"title": "教育水平", "categoryorder": "array", "categoryarray": ["High School", "Bachelor", "Master", "PhD"]}, "yaxis": {"title": "年收入(千美元)"}, "boxmode": "group", "width": 700, "height": 500}, "data": [{"type": "box", "name": "高中", "y": [15, 20, 25, 33, 40, 48, 55, 60], "marker": {"color": "#a5d8ff"}}, {"type": "box", "name": "本科", "y": [28, 35, 54, 62, 65, 70, 78, 85, 90, 101], "marker": {"color": "#74c0fc"}}, {"type": "box", "name": "硕士", "y": [60, 67, 75, 81, 88, 95, 105, 115], "marker": {"color": "#4dabf7"}}, {"type": "box", "name": "博士", "y": [78, 87, 99, 110, 120, 130, 137], "marker": {"color": "#339af0"}}]}箱线图比较不同教育水平的年收入分布。该图显示了每个教育类别中年收入的中位数(中心线)、四分位距(IQR,即箱体)和潜在异常值(晶须外的点)。我们可以直观地评估这些群体之间年收入的集中趋势和离散程度是否不同。小提琴图(sns.violinplot)也可以类似地使用,它能提供关于分布密度形状的信息。分析类别变量间的关系为了理解两个类别变量之间是否存在关联,我们可以使用频数统计和可视化方法。例如,在我们的客户群中,Gender 和 Education 级别之间是否存在关系?交叉制表交叉制表(或列联表)显示了一个类别变量相对于另一个类别变量的频数分布。Pandas 提供了 crosstab 函数来实现这一点。cross_tab = pd.crosstab(df['Gender'], df['Education']) print("交叉制表: 性别与教育程度") print(cross_tab)这会输出一个表格,其中行代表一个类别(例如,性别),列代表另一个类别(例如,教育程度),单元格中包含每个组合的出现次数。您也可以通过在 pd.crosstab 中使用 normalize 参数来显示比例。堆叠或分组柱状图将交叉制表可视化通常能使关系更清晰。分组或堆叠柱状图适用于此。我们可以使用 Seaborn 的 countplot 并带上 hue 参数。plt.figure(figsize=(10, 6)) sns.countplot(data=df, x='Education', hue='Gender', palette=['#1c7ed6', '#f06595']) plt.title('按性别划分的教育水平分布') plt.xlabel('教育水平') plt.ylabel('数量') plt.xticks(rotation=45) plt.legend(title='性别') plt.show(){"layout": {"title": "按性别划分的教育水平分布", "xaxis": {"title": "教育水平", "categoryorder": "array", "categoryarray": ["High School", "Bachelor", "Master", "PhD"]}, "yaxis": {"title": "数量"}, "barmode": "group", "width": 700, "height": 500}, "data": [{"type": "bar", "name": "男性", "x": ["高中", "本科", "硕士", "博士"], "y": [25, 40, 20, 15], "marker": {"color": "#1c7ed6"}}, {"type": "bar", "name": "女性", "x": ["高中", "本科", "硕士", "博士"], "y": [30, 35, 25, 10], "marker": {"color": "#f06595"}}]}分组柱状图显示了按性别区分的每个教育水平的客户数量。此图可以对不同类别之间的计数进行直接比较。例如,我们可以查看我们数据集中拥有“硕士”学位的个体比例在“男性”和“女性”客户之间是否存在差异。堆叠柱状图(通过在 sns.countplot 中设置 dodge=False 或在 Pandas 绘图中使用 kind='bar', stacked=True 实现)可以替代地显示每个教育水平内部的相对比例。通过应用这些技术,即散点图、相关性分析、比较图、交叉制表和类别柱状图,您可以系统地研究数据集中成对变量之间的关系。这些分析为您的数据底层结构提供了有价值的见解,是 EDA 过程的重要组成部分。