上回说到我们如何如何把拉勾的数据抓取下来的, 既然获取了数据, 就别放着不动, 把它拿出来分析一下, 看看这些数据里面都包含了什么信息.(本次博客源码地址: https://github.com/MaxLyu/Lagou_Analyze )
一, 前期准备
由于上次抓的数据里面包含有 ID 这样的信息, 我们需要将它去掉, 并且查看描述性统计, 确认是否存在异常值或者确实值.
- read_file = "analyst.csv"
- # 读取文件获得数据
- data = pd.read_csv(read_file, encoding="gbk")
- # 去除数据中无关的列
- data = data[:].drop(['ID'], axis=1)
- # 描述性统计
- data.describe()
结果中的 unique 表示的是在该属性列下面存在的不同值个数, 以学历要求为例子, 它包含 [本科, 大专, 硕士, 不限] 这 4 个不同的值, top 则表示数量最多的值为 [本科] ,freq 表示出现的频率为 387. 由于薪资的 unique 比较多, 我们查看一下存在什么值.
- print(data['学历要求'].unique())
- print(data['工作经验'].unique())
- print(data['薪资'].unique())
二, 预处理
从上述两张图可以看到, 学历要求和工作经验的值比较少且没有缺失值与异常值, 可以直接进行分析; 但薪资的分布比较多, 总计有 75 种, 为了更好地进行分析, 我们要对薪资做一个预处理. 根据其分布情况, 可以将它分成 [5k 以下, 5k-10k,10k-20k,20k-30k,30k-40k,40k 以上] , 为了更加方便我们分析, 取每个薪资范围的中位数, 并划分到我们指定的范围内.
- # 对薪资进行预处理
- def pre_salary(data):
- salarys = data['薪资'].values
- salary_dic = {}
- for salary in salarys:
- # 根据'-'进行分割并去掉'k', 分别将两端的值转换成整数
- min_sa = int(salary.split('-')[0][:-1])
- max_sa = int(salary.split('-')[1][:-1])
- # 求中位数
- median_sa = (min_sa + max_sa) / 2
- # 判断其值并划分到指定范围
- if median_sa <5:
- salary_dic[u'5k 以下'] = salary_dic.get(u'5k 以下', 0) + 1
- elif median_sa> 5 and median_sa <10:
- salary_dic[u'5k-10k'] = salary_dic.get(u'5k-10k', 0) + 1
- elif median_sa> 10 and median_sa <20:
- salary_dic[u'10k-20k'] = salary_dic.get(u'10k-20k', 0) + 1
- elif median_sa> 20 and median_sa <30:
- salary_dic[u'20k-30k'] = salary_dic.get(u'20k-30k', 0) + 1
- elif median_sa> 30 and median_sa < 40:
- salary_dic[u'30k-40k'] = salary_dic.get(u'30k-40k', 0) + 1
- else:
- salary_dic[u'40 以上'] = salary_dic.get(u'40 以上', 0) + 1
- print(salary_dic)
- return salary_dic
对 [薪资] 进行预处理之后, 还要对 [任职要求] 的文本进行预处理. 因为要做成词云图, 需要对文本进行分割并去除掉一些出现频率较多但没有意义的词, 我们称之为停用词, 所以我们用 jieba 库进行处理. jieba 是一个 python 实现的分词库, 对中文有着很强大的分词能力.
- import jieba
- def cut_text(text):
- stopwords =['熟悉','技术','职位','相关','工作','开发','使用','能力',
- '优先','描述','任职','经验','经验者','具有','具备','以上','善于',
- '一种','以及','一定','进行','能够','我们']
- for stopword in stopwords:
- jieba.del_word(stopword)
- words = jieba.lcut(text)
- content = " ".join(words)
- return content
预处理完成之后, 就可以进行可视化分析了.
三, 可视化分析
我们先绘制环状图和柱状图, 然后将数据传进去就行了, 环状图的代码如下:
- def draw_pie(dic):
- labels = []
- count = []
- for key, value in dic.items():
- labels.append(key)
- count.append(value)
- fig, ax = plt.subplots(figsize=(8, 6), subplot_kw=dict(aspect="equal"))
- # 绘制饼状图, wedgeprops 表示每个扇形的宽度
- wedges, texts = ax.pie(count, wedgeprops=dict(width=0.5), startangle=0)
- # 文本框设置
- bbox_props = dict(boxstyle="square,pad=0.9", fc="w", ec="k", lw=0)
- # 线与箭头设置
- kw = dict(xycoords='data', textcoords='data', arrowprops=dict(arrowstyle="-"),
- bbox=bbox_props, zorder=0, va="center")
- for i, p in enumerate(wedges):
- ang = (p.theta2 - p.theta1)/2. + p.theta1
- y = np.sin(np.deg2rad(ang))
- x = np.cos(np.deg2rad(ang))
- # 设置文本框在扇形的哪一侧
- horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
- # 用于设置箭头的弯曲程度
- connectionstyle = "angle,angleA=0,angleB={}".format(ang)
- kw["arrowprops"].update({"connectionstyle": connectionstyle})
- # annotate() 用于对已绘制的图形做标注, text 是注释文本, 含'xy' 的参数跟坐标点有关
- text = labels[i] + ":" + str('%.2f' %((count[i])/sum(count)*100)) + "%"
- ax.annotate(text, size=13, xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
- horizontalalignment=horizontalalignment, **kw)
- plt.show()
柱状图的代码如下:
- def draw_workYear(data):
- workyears = list(data[u'工作经验'].values)
- wy_dic = {}
- labels = []
- count = []
- # 得到工作经验对应的数目并保存到 count 中
- for workyear in workyears:
- wy_dic[workyear] = wy_dic.get(workyear, 0) + 1
- print(wy_dic)
- # wy_series = pd.Series(wy_dic)
- # 分别得到 count 的 key 和 value
- for key, value in wy_dic.items():
- labels.append(key)
- count.append(value)
- # 生成 keys 个数的数组
- x = np.arange(len(labels)) + 1
- # 将 values 转换成数组
- y = np.array(count)
- fig, axes = plt.subplots(figsize=(10, 8))
- axes.bar(x, y, color="#1195d0")
- plt.xticks(x, labels, size=13, rotation=0)
- plt.xlabel(u'工作经验', fontsize=15)
- plt.ylabel(u'数量', fontsize=15)
- # 根据坐标将数字标在图中, ha,va 为对齐方式
- for a, b in zip(x, y):
- plt.text(a, b+1, '%.0f' % b, ha='center', va='bottom', fontsize=12)
- plt.show()
我们再把学历要求和薪资的数据稍微处理一下变成字典形式, 传进绘制好的环状图函数就行了. 另外, 我们还要对 [任职要求] 的文本进行可视化.
- from wordcloud import WordCloud
- # 绘制词云图
- def draw_wordcloud(content):
- wc = WordCloud(
- font_path = 'c:\\Windows\Fonts\msyh.ttf',
- background_color = 'white',
- max_font_size=150, # 字体最大值
- min_font_size=24, # 字体最小值
- random_state=800, # 随机数
- collocations=False, # 避免重复单词
- width=1600,height=1200,margin=35, # 图像宽高, 字间距
- )
- wc.generate(content)
- plt.figure(dpi=160) # 放大或缩小
- plt.imshow(wc, interpolation='catrom',vmax=1000)
- plt.axis("off") # 隐藏坐标
四, 成果与总结
python 数据分析师的学历大部分要求是本科, 占了 86%.
从柱状图可以看出, python 数据分析师的工作经验绝大部分要求 1-5 年.
由此可以得出 python 数据分析的工资为 10k-20k 的比较多, 40 以上的也不少, 工资高估计要求会比较高, 所以我们看一下职位要求.
从词云图可看出, 数据分析肯定要对数据比较敏感, 并且对统计学, Excel,python, 数据挖掘, hadoop 等也有一定的要求. 不仅如此, 还要求具有一定的抗压能力, 解决问题的能力, 良好的表达能力, 思维能力等.
来源: https://www.cnblogs.com/lyuzt/p/10643941.html