
数据分析避坑指南用Pandas和Matplotlib处理犯罪率数据的实战经验当你在处理犯罪率数据时是否遇到过图表显示异常、中文字体乱码或回归曲线无法绘制的问题作为一名数据分析师我在处理美国各州犯罪率数据时踩过不少坑今天分享三个最常见的问题及其解决方案。1. 数据清洗的陷阱如何正确过滤非州级数据第一次处理美国犯罪率数据集时我差点犯了一个低级错误——没有过滤掉非州级数据。原始数据中包含了华盛顿特区和全美平均值这两条记录如果直接用于分析会导致结果严重失真。1.1 为什么需要过滤这些数据华盛顿特区虽然在地理上是独立区域但它不是州。而全美平均值是一个汇总统计量不是具体某个地区的数据。将它们与其他州的数据混在一起分析会产生统计偏差。1.2 正确的过滤方法Pandas提供了isin()方法和~操作符组合来实现这一过滤import pandas as pd crime pd.read_csv(crimeRatesByState2005.csv) # 正确过滤方法 crime_filtered crime[~crime[state].isin([District of Columbia, United States])]常见错误只使用isin()而没有取反操作符~拼写错误如DistrictofColumbia没有空格忘记包含United States这一项1.3 验证过滤结果过滤后建议立即检查数据print(f原始数据行数: {len(crime)}) print(f过滤后行数: {len(crime_filtered)}) print(剩余州的数量:, crime_filtered[state].nunique())正常情况下过滤后的数据应该包含50个州美国有50个州。2. 局部加权回归的实现难题在分析犯罪率数据时我尝试使用Statsmodels的lowess函数进行局部加权回归但遇到了数据格式不匹配的问题。2.1 LOWESS回归简介局部加权散点平滑LOWESS是一种非参数回归方法特别适合探索变量间的非线性关系。在犯罪率分析中它可以帮助我们发现谋杀率与入室盗窃率之间的潜在模式。2.2 正确的实现方式import statsmodels.api as sm # 确保数据已经过滤 crime_filtered crime[~crime[state].isin([District of Columbia, United States])] # 执行LOWESS回归 lowess_result sm.nonparametric.lowess( crime_filtered[burglary], # y值 crime_filtered[murder], # x值 frac0.666 # 平滑参数默认为2/3 ) # lowess_result是一个二维数组第一列是x值第二列是拟合的y值关键点输入数据的顺序y值在前x值在后frac参数控制平滑程度0-1之间返回值是NumPy数组不是DataFrame2.3 常见问题排查问题现象可能原因解决方案报错ValueError输入数据包含NaN先执行dropna()曲线过于平滑frac值太大减小frac值曲线过于波动frac值太小增大frac值图形不显示没有调用plot确保调用了ax.plot()3. 中文显示问题的终极解决方案当我尝试在图表标题中使用中文美国谋杀率和入室盗窃率时遇到了令人头疼的乱码问题。经过多次尝试我总结了几种可靠的解决方案。3.1 方法一指定中文字体最直接的方法是明确指定支持中文的字体from matplotlib import pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 设置黑体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 fig, ax plt.subplots() ax.set_title(美国谋杀率和入室盗窃率, fontsize16)3.2 方法二使用字体属性如果不想全局修改可以在特定元素上设置字体from matplotlib.font_manager import FontProperties font FontProperties(fnamesimhei.ttf, size16) ax.set_title(美国谋杀率和入室盗窃率, fontpropertiesfont)3.3 方法三使用系统字体路径对于更复杂的环境可以定位系统字体文件import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 查找系统中支持中文的字体 font_path fm.findfont(fm.FontProperties(family[sans-serif])) plt.rcParams[font.family] sans-serif plt.rcParams[font.sans-serif] [Arial Unicode MS] # macOS常用字体3.4 跨平台字体解决方案不同操作系统下可用的中文字体操作系统推荐字体WindowsSimHei, Microsoft YaHeimacOSArial Unicode MS, PingFang SCLinuxWenQuanYi Zen Hei4. 完整实战案例从数据到洞察现在让我们将这些知识点整合到一个完整的分析流程中。4.1 数据准备与清洗import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm # 设置中文显示 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 加载并清洗数据 crime pd.read_csv(crimeRatesByState2005.csv) crime_clean crime[~crime[state].isin([District of Columbia, United States])]4.2 可视化分析# 创建画布 fig, ax plt.subplots(figsize(10, 6)) # 绘制散点图 ax.scatter( crime_clean[murder], crime_clean[burglary], marker*, color#00CC88, label各州数据 ) # 添加LOWESS回归线 lowess sm.nonparametric.lowess(crime_clean[burglary], crime_clean[murder]) ax.plot(lowess[:, 0], lowess[:, 1], r-, label趋势线) # 设置图表元素 ax.set_xlabel(谋杀率每10万人, fontsize12) ax.set_ylabel(入室盗窃率每10万人, fontsize12) ax.set_title(美国各州谋杀率与入室盗窃率关系2005年, fontsize16) ax.legend() ax.grid(True, alpha0.3) # 调整坐标轴范围 ax.set_xlim(0, crime_clean[murder].max() * 1.1) ax.set_ylim(0, crime_clean[burglary].max() * 1.1) plt.tight_layout() plt.savefig(crime_analysis.png, dpi300) plt.close()4.3 分析结果解读通过这个分析我们可以观察到谋杀率和入室盗窃率之间存在正相关关系趋势线显示这种关系是非线性的有几个州的数值明显高于平均水平可能是异常值实用技巧使用tight_layout()避免标签重叠保存图像时指定dpi参数提高分辨率坐标轴范围设置为最大值乘以1.1留出适当边距