此练习将单变量分析方法应用到一个真实数据集中。它涵盖了如何使用Python库为数值变量和类别变量计算描述性统计量并生成可视化图表。准备工作:加载数据我们将使用'penguins'数据集,它可以通过Seaborn库方便地获取。此数据集包含不同企鹅物种的测量数据。首先,确保你已安装并导入Seaborn和Pandas。然后,加载数据集:import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 penguins_df = sns.load_dataset('penguins') # 显示基本信息和前几行,以了解数据 print("数据集信息:") penguins_df.info() print("\n前5行:") print(penguins_df.head()) # 在本次练习中,简单处理缺失值 # (在实际情况中,你会使用第2章的方法) penguins_df.dropna(inplace=True) print("\n删除NaN值后的数据集信息:") penguins_df.info()这个初始输出向我们显示了列、它们的数据类型(例如数值测量值的float64,类别字符串的object),并确认存在一些缺失值,为了本练习的简便,我们已将其删除。分析数值变量:flipper_length_mm我们来查看企鹅的鳍肢长度。描述性统计我们可以使用.describe()方法对此特定列(Series)进行快速统计汇总。# 计算flipper_length_mm的描述性统计量 flipper_stats = penguins_df['flipper_length_mm'].describe() print("\n鳍肢长度(毫米)的描述性统计量:") print(flipper_stats) # 单独计算中位数(通常很有用) flipper_median = penguins_df['flipper_length_mm'].median() print(f"\n鳍肢中位数长度:{flipper_median} 毫米") # 计算偏度 flipper_skew = penguins_df['flipper_length_mm'].skew() print(f"鳍肢长度的偏度:{flipper_skew:.2f}")解读: .describe()的输出提供了计数、均值、标准差($ \sigma $)、最小值、最大值和四分位数(第25百分位数或Q1,第50百分位数或中位数,第75百分位数或Q3)。中位数给我们提供了对异常值不敏感的中心点。偏度值(接近0表示近似对称,正值表示右偏,负值表示左偏)可以快速检查分布的形态。在此处,偏度接近0表明在处理缺失数据后,鳍肢长度的分布相当对称。分布可视化:直方图直方图非常适合可视化分布的形态、集中趋势和离散程度。# 设置绘图风格(可选,为了美观) sns.set_style("whitegrid") # 为flipper_length_mm创建直方图 plt.figure(figsize=(8, 5)) sns.histplot(data=penguins_df, x='flipper_length_mm', kde=True, bins=15, color='#4dabf7') plt.title('企鹅鳍肢长度分布') plt.xlabel('鳍肢长度 (毫米)') plt.ylabel('频数') plt.show(){"layout": {"title": "企鹅鳍肢长度分布", "xaxis": {"title": "鳍肢长度 (毫米)"}, "yaxis": {"title": "频数"}, "bargap": 0.1, "template": "plotly_white", "width": 600, "height": 400}, "data": [{"type": "histogram", "x": [172.0, 178.0, 178.0, 180.0, 180.0, 181.0, 181.0, 181.0, 182.0, 183.0, 184.0, 185.0, 185.0, 186.0, 186.0, 186.0, 187.0, 187.0, 187.0, 187.0, 188.0, 188.0, 190.0, 190.0, 190.0, 190.0, 190.0, 191.0, 191.0, 192.0, 192.0, 193.0, 193.0, 193.0, 194.0, 195.0, 195.0, 195.0, 196.0, 196.0, 197.0, 197.0, 198.0, 198.0, 199.0, 200.0, 201.0, 202.0, 202.0, 203.0, 205.0, 205.0, 206.0, 207.0, 208.0, 208.0, 209.0, 209.0, 210.0, 210.0, 210.0, 210.0, 210.0, 211.0, 211.0, 212.0, 212.0, 212.0, 213.0, 213.0, 214.0, 214.0, 215.0, 215.0, 215.0, 216.0, 216.0, 217.0, 217.0, 218.0, 218.0, 218.0, 219.0, 219.0, 219.0, 220.0, 220.0, 220.0, 221.0, 221.0, 221.0, 222.0, 222.0, 223.0, 223.0, 224.0, 225.0, 225.0, 228.0, 228.0, 229.0, 230.0, 230.0, 231.0, 180.0, 181.0, 182.0, 183.0, 184.0, 184.0, 185.0, 186.0, 186.0, 186.0, 187.0, 188.0, 189.0, 189.0, 190.0, 190.0, 190.0, 190.0, 191.0, 192.0, 192.0, 193.0, 193.0, 194.0, 195.0, 195.0, 195.0, 196.0, 196.0, 197.0, 197.0, 198.0, 198.0, 199.0, 199.0, 200.0, 200.0, 201.0, 202.0, 203.0, 203.0, 205.0, 205.0, 207.0, 207.0, 208.0, 209.0, 210.0, 210.0, 210.0, 211.0, 211.0, 212.0, 213.0, 214.0, 215.0, 216.0, 217.0, 218.0, 219.0, 221.0, 221.0, 225.0, 230.0, 178.0, 179.0, 180.0, 181.0, 181.0, 182.0, 183.0, 184.0, 185.0, 185.0, 186.0, 186.0, 187.0, 188.0, 189.0, 189.0, 190.0, 190.0, 190.0, 191.0, 191.0, 192.0, 192.0, 193.0, 193.0, 194.0, 195.0, 196.0, 196.0, 197.0, 197.0, 197.0, 198.0, 199.0, 200.0, 201.0, 202.0, 203.0, 204.0, 205.0, 208.0, 209.0, 210.0, 211.0, 212.0, 213.0, 214.0, 215.0, 216.0, 217.0, 218.0, 219.0, 220.0, 221.0, 222.0, 224.0, 185.0, 187.0, 190.0, 192.0, 195.0, 196.0, 198.0, 199.0, 200.0, 201.0, 201.0, 202.0, 203.0, 204.0, 205.0, 206.0, 207.0, 208.0, 208.0, 209.0, 210.0, 210.0, 211.0, 211.0, 212.0, 212.0, 213.0, 213.0, 213.0, 214.0, 214.0, 215.0, 215.0, 216.0, 216.0, 216.0, 217.0, 218.0, 218.0, 219.0, 220.0, 220.0, 221.0, 222.0, 223.0, 224.0, 225.0, 226.0, 227.0, 228.0, 228.0, 230.0, 235.0], "marker": {"color": "#4dabf7"}, "nbinsx": 15}]}直方图显示了企鹅鳍肢长度的频数分布。曲线(KDE)提供了分布的平滑估计。解读: 直方图直观地证实了偏度值所暗示的近似对称、大致呈钟形的分布。大多数鳍肢长度集中在中心(均值/中位数附近)。kde=True参数添加了核密度估计曲线,提供了分布的平滑轮廓。bins=15指定了要使用的条形数量;尝试此数量有时可以显示分布的不同特性。汇总统计可视化:箱线图箱线图能有效比较汇总统计量(中位数、四分位数、范围),并根据IQR规则识别潜在异常值。# 为flipper_length_mm创建箱线图 plt.figure(figsize=(6, 4)) sns.boxplot(data=penguins_df, x='flipper_length_mm', color='#96f2d7') plt.title('企鹅鳍肢长度的箱线图') plt.xlabel('鳍肢长度 (毫米)') plt.show(){"layout": {"title": "企鹅鳍肢长度的箱线图", "xaxis": {"title": "鳍肢长度 (毫米)"}, "yaxis": {"showticklabels": false}, "template": "plotly_white", "width": 500, "height": 300}, "data": [{"type": "box", "x": [172.0, 178.0, 178.0, 180.0, 180.0, 181.0, 181.0, 181.0, 182.0, 183.0, 184.0, 185.0, 185.0, 186.0, 186.0, 186.0, 187.0, 187.0, 187.0, 187.0, 188.0, 188.0, 190.0, 190.0, 190.0, 190.0, 190.0, 191.0, 191.0, 192.0, 192.0, 193.0, 193.0, 193.0, 194.0, 195.0, 195.0, 195.0, 196.0, 196.0, 197.0, 197.0, 198.0, 198.0, 199.0, 200.0, 201.0, 202.0, 202.0, 203.0, 205.0, 205.0, 206.0, 207.0, 208.0, 208.0, 209.0, 209.0, 210.0, 210.0, 210.0, 210.0, 210.0, 211.0, 211.0, 212.0, 212.0, 212.0, 213.0, 213.0, 214.0, 214.0, 215.0, 215.0, 215.0, 216.0, 216.0, 217.0, 217.0, 218.0, 218.0, 218.0, 219.0, 219.0, 219.0, 220.0, 220.0, 220.0, 221.0, 221.0, 221.0, 222.0, 222.0, 223.0, 223.0, 224.0, 225.0, 225.0, 228.0, 228.0, 229.0, 230.0, 230.0, 231.0, 180.0, 181.0, 182.0, 183.0, 184.0, 184.0, 185.0, 186.0, 186.0, 186.0, 187.0, 188.0, 189.0, 189.0, 190.0, 190.0, 190.0, 190.0, 191.0, 192.0, 192.0, 193.0, 193.0, 194.0, 195.0, 195.0, 195.0, 196.0, 196.0, 197.0, 197.0, 198.0, 198.0, 199.0, 199.0, 200.0, 200.0, 201.0, 202.0, 203.0, 203.0, 205.0, 205.0, 207.0, 207.0, 208.0, 209.0, 210.0, 210.0, 210.0, 211.0, 211.0, 212.0, 213.0, 214.0, 215.0, 216.0, 217.0, 218.0, 219.0, 221.0, 221.0, 225.0, 230.0, 178.0, 179.0, 180.0, 181.0, 181.0, 182.0, 183.0, 184.0, 185.0, 185.0, 186.0, 186.0, 187.0, 188.0, 189.0, 189.0, 190.0, 190.0, 190.0, 191.0, 191.0, 192.0, 192.0, 193.0, 193.0, 194.0, 195.0, 196.0, 196.0, 197.0, 197.0, 197.0, 198.0, 199.0, 200.0, 201.0, 202.0, 203.0, 204.0, 205.0, 208.0, 209.0, 210.0, 211.0, 212.0, 213.0, 214.0, 215.0, 216.0, 217.0, 218.0, 219.0, 220.0, 221.0, 222.0, 224.0, 185.0, 187.0, 190.0, 192.0, 195.0, 196.0, 198.0, 199.0, 200.0, 201.0, 201.0, 202.0, 203.0, 204.0, 205.0, 206.0, 207.0, 208.0, 208.0, 209.0, 210.0, 210.0, 211.0, 211.0, 212.0, 212.0, 213.0, 213.0, 213.0, 214.0, 214.0, 215.0, 215.0, 216.0, 216.0, 216.0, 217.0, 218.0, 218.0, 219.0, 220.0, 220.0, 221.0, 222.0, 223.0, 224.0, 225.0, 226.0, 227.0, 228.0, 228.0, 230.0, 235.0], "marker": {"color": "#96f2d7"}, "boxpoints": "outliers"}]}箱线图汇总了企鹅鳍肢长度的分布情况。箱体表示IQR(Q1到Q3),内部的线是中位数,晶须延伸显示数据范围(不包括异常值,通常为1.5 * IQR)。晶须之外的点是潜在异常值。解读: 箱线图清楚地显示了中位数(约200毫米)、IQR(箱体本身,根据.describe()大约为193毫米到209毫米),以及由晶须指示的整体范围。在这个特定图中,删除NaN值后,似乎没有点被标记为异常值,这表明根据标准IQR规则(Q3 + 1.5IQR或Q1 - 1.5IQR),没有极端值。分析类别变量:species现在我们来查看species列。频数和比例对于类别数据,我们想知道每个类别中有多少观测值。# 计算species的频数 species_counts = penguins_df['species'].value_counts() print("\n物种频数:") print(species_counts) # 计算比例(百分比) species_proportions = penguins_df['species'].value_counts(normalize=True) * 100 print("\n物种比例(%):") print(species_proportions)解读: .value_counts()方法列出了每个独特的物种以及属于该物种的企鹅数量。将normalize=True设置为真会把这些计数转换为比例(或乘以100后的百分比),显示数据集中每个物种的相对频率。我们看到在此清洗过的数据集中,阿德利企鹅物种最为常见。频数可视化:条形图条形图是比较不同类别频数的理想工具。# 为物种计数创建条形图 plt.figure(figsize=(7, 5)) # 使用countplot直接计数并绘图 sns.countplot(data=penguins_df, x='species', palette=['#ff8787', '#74c0fc', '#74b816'], order=species_counts.index) plt.title('各物种企鹅数量') plt.xlabel('物种') plt.ylabel('数量') plt.show(){"layout": {"title": "各物种企鹅数量", "xaxis": {"title": "物种", "categoryorder": "array", "categoryarray": ["Adelie", "Gentoo", "Chinstrap"]}, "yaxis": {"title": "数量"}, "template": "plotly_white", "width": 500, "height": 400}, "data": [{"type": "bar", "x": ["Adelie", "Gentoo", "Chinstrap"], "y": [146, 119, 68], "marker": {"color": ["#ff8787", "#74c0fc", "#74b816"]}}]}条形图显示了数据集中每种企鹅的计数。解读: 条形图提供了物种数量的即时视觉比较,确认了在我们的处理数据中,阿德利企鹅物种的代表性最高,其次是金图企鹅,然后是帽带企鹅。order=species_counts.index参数确保条形按频率降序绘制,这通常有助于提高可读性。使用特定的palette可以控制颜色。练习总结在本次练习中,你对企鹅数据集中的数值变量(flipper_length_mm)和类别变量(species)应用了单变量分析方法。你计算了重要的描述性统计量,并生成了直方图、箱线图和条形图,以图表形式表示它们的分布和频数。这种逐个查看变量的过程是你在查看变量之间关系之前,理解数据基本特征的根本方式。