从数据清洗到可视化:用Pandas把Selenium爬到的8000条招聘数据变成你的行业洞察报告
从数据清洗到可视化用Pandas把Selenium爬到的8000条招聘数据变成你的行业洞察报告当你用Selenium爬取到8000条招聘数据后真正的挑战才刚刚开始。这些原始数据就像未经雕琢的玉石只有经过专业的数据处理和可视化才能展现出它们真正的价值。本文将带你从零开始把杂乱无章的招聘数据转化为具有商业价值的行业洞察报告。1. 数据清洗从混乱到规范拿到原始数据的第一件事不是急着分析而是要进行彻底的数据清洗。招聘数据通常存在各种问题缺失值、异常值、格式不统一等。以下是一个典型的数据清洗流程import pandas as pd # 读取爬取到的数据 df pd.read_csv(job_data.csv, encodingutf-8) # 查看数据概况 print(df.info()) print(df.head())1.1 处理缺失值招聘数据中最常见的缺失值出现在薪资、工作经验和学历要求等字段。处理策略需要根据具体情况而定删除法当缺失比例小于5%时可以直接删除填充法对于数值型数据可以用中位数填充对于类别型数据可以用众数填充# 处理薪资缺失值 - 用该职位的中位数薪资填充 df[salary] df.groupby(position)[salary].apply( lambda x: x.fillna(x.median()))1.2 薪资字段标准化爬取到的薪资通常是15k-30k这样的字符串我们需要将其转换为可计算的数值def parse_salary(salary_str): if k in salary_str: parts salary_str.replace(k, ).split(-) return (float(parts[0]) float(parts[1])) / 2 return None df[avg_salary] df[salary].apply(parse_salary)1.3 工作经验标准化工作经验字段通常包含1-3年、3-5年等描述我们可以将其转换为数值范围原始描述转换后下限转换后上限不限001年以下011-3年133-5年355-10年51010年以上10202. 数据分析挖掘数据背后的故事清洗后的数据已经可以进行深入分析了。我们将从多个维度挖掘数据价值。2.1 薪资分布分析首先看看整体薪资分布情况import matplotlib.pyplot as plt plt.figure(figsize(10, 6)) df[avg_salary].plot(kindhist, bins20) plt.title(薪资分布直方图) plt.xlabel(月薪(k)) plt.ylabel(职位数量) plt.show()2.2 城市薪资对比不同城市的薪资水平差异是求职者最关心的信息之一city_salary df.groupby(city)[avg_salary].agg([mean, median, count]) city_salary city_salary[city_salary[count] 50] # 只考虑样本量足够的城市 city_salary.sort_values(mean, ascendingFalse).head(10)2.3 技能需求分析从职位描述中提取热门技能关键词from collections import Counter # 假设职位描述存储在description列 all_descriptions .join(df[description].dropna().tolist()) words [word.lower() for word in all_descriptions.split() if len(word) 1] word_counts Counter(words) # 排除常见无意义词 stop_words [的, 和, 等, 有, 相关, 优先] for word in stop_words: word_counts.pop(word, None) word_counts.most_common(20)3. 高级分析多维度交叉洞察基础分析之后我们可以进行更深入的交叉分析发现更有价值的洞察。3.1 薪资与经验的关系exp_salary df.groupby(experience)[avg_salary].mean() exp_salary.plot(kindbar, figsize(10, 6)) plt.title(不同工作经验的平均薪资) plt.ylabel(平均月薪(k)) plt.xticks(rotation45) plt.show()3.2 行业薪资对比industry_salary df.groupby(industry)[avg_salary].agg([mean, count]) industry_salary industry_salary[industry_salary[count] 30] industry_salary.sort_values(mean, ascendingFalse).head(10)3.3 公司规模与薪资的关系# 首先将公司规模标准化 def parse_company_size(size_str): if 人以下 in size_str: return 50 elif 500 in size_str and 1000 in size_str: return 750 # 其他情况类似处理... return None df[company_size_num] df[company_size].apply(parse_company_size) # 然后分析关系 size_salary df.groupby(company_size_num)[avg_salary].mean() size_salary.plot(kindline, markero, figsize(10, 6)) plt.title(公司规模与平均薪资关系) plt.xlabel(公司规模(人)) plt.ylabel(平均月薪(k)) plt.show()4. 数据可视化让数据说话数据分析的最终目的是为了呈现洞察。好的可视化能让数据自己讲故事。4.1 热力图城市-行业薪资矩阵import seaborn as sns # 准备数据 heatmap_data df.pivot_table( indexindustry, columnscity, valuesavg_salary, aggfuncmean ) plt.figure(figsize(12, 8)) sns.heatmap(heatmap_data, cmapYlGnBu, annotTrue, fmt.1f) plt.title(各城市不同行业的平均薪资热力图) plt.xticks(rotation45) plt.yticks(rotation0) plt.show()4.2 箱线图薪资分布对比plt.figure(figsize(12, 6)) sns.boxplot(xcity, yavg_salary, datadf[df[city].isin(top_cities)]) plt.title(主要城市薪资分布对比) plt.xticks(rotation45) plt.ylabel(月薪(k)) plt.show()4.3 词云热门技能需求from wordcloud import WordCloud wordcloud WordCloud( font_pathsimhei.ttf, background_colorwhite, width800, height600 ).generate_from_frequencies(word_counts) plt.figure(figsize(12, 8)) plt.imshow(wordcloud, interpolationbilinear) plt.axis(off) plt.title(热门技能需求词云) plt.show()5. 构建完整的分析报告将上述分析整合成一份专业的报告建议包含以下部分执行摘要1-2页总结主要发现方法论数据来源、清洗和分析方法主要发现整体薪资水平和分布城市间薪资差异热门技能需求行业趋势建议基于数据的行动建议附录详细数据表格和方法说明提示使用Jupyter Notebook可以很方便地将分析代码、结果和说明文字整合在一起导出为HTML或PDF报告。在实际项目中我发现最耗时的部分往往是数据清洗和标准化。特别是当数据来源多样时统一各种格式需要花费大量精力。建议在爬取阶段就尽量规范化数据格式可以节省后续很多时间。