上回说到我们如何如何把拉勾的数据抓取下来的,既然获取了数据,就别放着不动,把它拿出来分析一下,看看这些数据里面都包含了什么信息。(本次博客源码地址: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-30k的比较多,工资高的估计要求会比较高,所以我们看一下职位要求。

      

  从词云图可看出,数据分析肯定要对数据比较敏感,并且对统计学、excel、python、数据挖掘、hadoop等也有一定的要求。不仅如此,还要求具有一定的抗压能力、解决问题的能力、良好的表达能力、思维能力等。

 

版权声明:本文为lyuzt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lyuzt/p/10643941.html