Python数据可视化:浅谈数据挖掘岗

640

作者 | 小F

来源 | 法纳斯特


之前在「数据分析岗」的文章提到,会写一期有关「数据挖掘岗」的文章。


本次结合最近学的统计推断,来波简单的实战。


首先请教了两位从事过数据挖掘的大佬,简单说了下什么是数据挖掘。


让小F和大家对数据挖掘有个认识,毕竟这可是大佬的切身体会!!!


640


当然也感谢我司的大佬给出的建议,小F也是受益颇多。


曾经在知乎上看到一个比较励志的视频,特意去腾讯视频找了下,这里分享给大家。




/ 01 / PostgreSQL


本次使用的数据库为PostgreSQL。


它是一个开源对象关系数据库管理系统(ORDBMS)。


通过psycopg2模块与Python集成。


可视化工具使用Navicat for PostgreSQL,免费试用14天...


没找到如何用Python创建PG数据库,所以数据库的创建在Navicat for PostgreSQL中完成。


数据库的连接通过Pyhton的psycopg2模块,具体如下。


 
  

import psycopg2
# 连接数据库
conn = psycopg2.connect(database="lagou_job", user="postgres", password="774110919", host="127.0.0.1", port="5432")
print("Opened database successfully")
# 创建工作表
cur = conn.cursor()
cur.execute('''CREATE TABLE job (id INT PRIMARY KEY NOT NULL, job_title TEXT NOT NULL, job_salary TEXT NOT NULL, job_city TEXT NOT NULL, job_experience TEXT NOT NULL, job_education TEXT NOT NULL, company_name TEXT NOT NULL, company_type TEXT NOT NULL, company_status TEXT NOT NULL, company_people TEXT NOT NULL, job_tips TEXT NOT NULL, job_welfare TEXT NOT NULL);''')
print("Table created successfully")
# 关闭数据库
conn.commit()
conn.close()


希望以后能出一期PostgreSQL的教程,网上关于它的教程并不多,还是选择自力更生...



/ 02 / 数据获取


代码和之前的差不多,有变化的就是「关键词」和「数据库」。


同时还获取了职位详情页的URL,不过我没对详情页进行爬取,有兴趣的小伙伴可以试试。


 
  

import requests
import psycopg2
import random
import time
import json

count = 0
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
headers = {
    'User-Agent''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
    'Cookie''你的cookie值',
    'Accept''application/json, text/javascript, */*; q=0.01',
    'Connection''keep-alive',
    'Host''www.lagou.com',
    'Origin''https://www.lagou.com',
    'Referer''https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=sug&fromSearch=true&suginput=shuju'
}

# 连接数据库
db = psycopg2.connect(database="lagou_job", user="postgres", password="774110919", host="127.0.0.1", port="5432")


def add_Postgresql(id, job_title, job_salary, job_city, job_experience, job_education, company_name, company_type, company_status, company_people, job_tips, job_welfare):
    # 将数据写入数据库中
    try:
        cursor = db.cursor()
        sql = "insert into job (id, job_title, job_salary, job_city, job_experience, job_education, company_name, company_type, company_status, company_people, job_tips, job_welfare) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % (int(id), job_title, job_salary, job_city, job_experience, job_education, company_name, company_type, company_status, company_people, job_tips, job_welfare);
        print(sql)
        cursor.execute(sql);
        print(cursor.lastrowid)
        db.commit()
    except Exception as e:
        print(e)
        db.rollback()


def get_message():
    for i in range(131):
        print('第' + str(i) + '页')
        time.sleep(random.randint(1020))
        data = {
            'first''false',
            'pn': i,
            'kd''数据挖掘'
        }
        response = requests.post(url=url, data=data, headers=headers)
        result = json.loads(response.text)
        job_messages = result['content']['positionResult']['result']
        # 职位详情页URL获取
        job_urls = result['content']['hrInfoMap'].keys()
        for k in job_urls:
            url_1 = 'https://www.lagou.com/jobs/' + k + '.html'
            print(url_1)
            with open('job_urls.csv''a+', encoding='utf-8-sig'as f:
                f.write(url_1 + '\n')
        for job in job_messages:
            global count
            count += 1
            # 岗位名称
            job_title = job['positionName']
            print(job_title)
            # 岗位薪水
            job_salary = job['salary']
            print(job_salary)
            # 岗位地点
            job_city = job['city']
            print(job_city)
            # 岗位经验
            job_experience = job['workYear']
            print(job_experience)
            # 岗位学历
            job_education = job['education']
            print(job_education)
            # 公司名称
            company_name = job['companyShortName']
            print(company_name)
            # 公司类型
            company_type = job['industryField']
            print(company_type)
            # 公司状态
            company_status = job['financeStage']
            print(company_status)
            # 公司规模
            company_people = job['companySize']
            print(company_people)
            # 工作技能
            if len(job['positionLables']) > 0:
                job_tips = ','.join(job['positionLables'])
            else:
                job_tips = 'None'
            print(job_tips)
            # 工作福利
            job_welfare = job['positionAdvantage']
            print(job_welfare + '\n\n')
            add_Postgresql(count, job_title, job_salary, job_city, job_experience, job_education, company_name, company_type, company_status, company_people, job_tips, job_welfare)


if __name__ == '__main__':
    get_message()


获取拉勾网数据挖掘岗数据如下。


640


获取到详情页的URL信息后,直接点击文件里的链接,并不会跳转到详情页页面。


需复制网址,粘贴到浏览器上,才能访问成功。


具体原因我也不知道,可能和请求头有关吧...


640


/ 03 / 数据可视化


01 工作经验薪水图


640

这里1年以下的数据只有一个,所以直接去除。


640


探索多分类变量与连续变量间的关系,采用单因素方差分析。


原假设为工作经验对薪水无显著影响。


 
  

from scipy import stats
import pandas as pd
import psycopg2
# 获取数据库数据
conn = psycopg2.connect(database="lagou_job", user="postgres", password="774110919", host="127.0.0.1", port="5432")
cursor = conn.cursor()
sql = "select * from job"
df = pd.read_sql(sql, conn)
# 清洗数据,生成薪水列
dom = []
for i in df['job_salary']:
    i = ((float(i.split('-')[0].replace('k''').replace('K''')) + float(i.split('-')[1].replace('k''').replace('K'''))) / 2) * 1000
    dom.append(i)
df['salary'] = dom
# 去除无效列
data = df[df.job_experience != '不限']
# 生成不同工作经验的薪水列表
exp = []
for i in ['应届毕业生''1-3年''3-5年''5-10年']:
    exp.append(data[data['job_experience'] == i]['salary'])
# 单因素方差分析
print(stats.f_oneway(*exp))
# 得到的结果
F_onewayResult(statistic=34.8568474246936, pvalue=5.894831071529752e-20)


得到F值为34.85,P值接近于0,其中取显著性水平为0.05。


所以拒绝原假设,即工作经验会显著影响薪水。


02 学历薪水图


640

这里大部分岗位的学历要求,为本科和硕士,极少部分为学历不限和大专。


同上,也对学历和薪水做假设,为无显著差异。


 
  

# 去除无效列
data = df[df.job_education != '不限']
# 生成不同学历的薪水列表
edu = []
for i in ['大专''本科''硕士']:
    edu.append(data[data['job_education'] == i]['salary'])
# 单因素方差分析
print(stats.f_oneway(*edu))
# 得到的结果
F_onewayResult(statistic=5.29713465351118, pvalue=0.005345061949394161)


得到F值为5.29,P值为0.005,其中取显著性水平为0.05。


所以拒绝原假设,即学历会显著影响薪水。


综合两个F值和P值,可以看出工作经验比起学历更能影响薪水。


那么我们就通过有交互效应的多元方差分析来看看具体情况。


 
  

import statsmodels.formula.api as smf
import statsmodels.api as sm
import pandas as pd
import psycopg2
# 消除pandas输出省略号情况及换行情况
pd.set_option('display.max_columns'500)
pd.set_option('display.width'1000)
# 获取数据库数据
conn = psycopg2.connect(database="lagou_job", user="postgres", password="774110919", host="127.0.0.1", port="5432")
cursor = conn.cursor()
sql = "select * from job"
df = pd.read_sql(sql, conn)
# 清洗数据,生成薪水列
dom = []
for i in df['job_salary']:
    i = ((float(i.split('-')[0].replace('k''').replace('K''')) + float(i.split('-')[1].replace('k''').replace('K'''))) / 2) * 1000
    dom.append(i)
df['salary'] = dom
# 去除学历不限
data = df[df.job_education != '不限']
# 去除工作经验不限及1年以下
data = data[data.job_experience != '不限']
data = data[data.job_experience != '1年以下']
# smf:最小二乘法,构建线性回归模型
anal = smf.ols('salary ~ C(job_experience) + C(job_education) + C(job_experience)*C(job_education)', data=data).fit()
# anova_lm:多因素方差分析
print(sm.stats.anova_lm(anal))
# 基本信息输出
print(anal.summary())

输出结果。


640

这里看出学历和工作经验的交互项对薪水影响并不显著。


其F值为1.33,P值为0.2,则无法拒绝原假设。


640


R²的值为0.277,说明工作经验和学历仅仅解释了薪水变异性的27.7%。


R²的值大于0.8时,则说明模型拟合效果好,本次实验看来是远远达不到要求了。


640


这是带交互项的多元方差分析的回归系数。


参考标准是工作经验「1-3年」和学历「 大专」。


按理说应该是选择工作经验「应届毕业生」和学历「 大专」做参考标准的。


这里是由于我没用数字对信息进行归类,导致这一现象出现,所以凑合着看吧!


从表中可以看出:


①「3-5年」的「 大专」较「1-3年」的「 大专」,P值为0.081,略大于0.05,说明两种情况薪水差异较显著。


②「5-10年」的「 大专」较「1-3年」的「 大专」,P值为0,说明没有样本。


③「应届生」的「 大专」较「1-3年」的「 大专」,P值为0.911,说明两种情况薪水无差异。


④「1-3年」的「本科」较「1-3年」的「 大专」,P值为0.021,说明两种情况薪水差异显著。


⑤「1-3年」的「 硕士」较「1-3年」的「 大专」,P值为0.012,说明两种情况薪水差异显著。


03 公司类型TOP10


640


数据挖掘岗也是集中在互联网行业,「数据服务」「O2O」「金融」「电子商务」。


目前认识的数据挖掘大佬,还真是在「数据服务」「O2O」「金融」行业里。


04 工作技能图


640


「数据挖掘岗」和「数据分析岗」都是相通的,你中有我,我中有你。


不过「数据挖掘岗」中算法是第一位要求,更高级,更难学...



/ 04 / 总结


依照惯例,贴出拉勾网数据挖掘岗薪水TOP20。


640


比数据分析岗高出不少,膜拜呐...


看来之前两位大佬是真的牛皮,向大佬看齐!!!


后台回复“数据挖掘”,即可获得代码地址


这么走心,还好看的文章,右下角点个「好看」就行啦,比心!!!


◆ ◆ ◆  ◆ ◆










凡是在通过上面二维码购买,并在后台发送购买截图的,我都送出一整套资料集锦,内有“数据分析学习清单+思维导图”,是由这个专栏作者陈旸亲自整理制作,对你快速掌握数据分析非常有价值。



数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以通过扫描下方管理员二维码,让管理员帮忙拉进群,期待大家的加入。


管理员二维码:


猜你喜欢

● 

● 


● 

● 

支持小F原创  

目 录 1 引言.............................................................5 1.1 Python的介绍...................................................5 1.2 数据采集(爬虫)介绍............................................5 1.2.1 什么是爬虫....................................................5 1.2.2 通用爬虫和聚焦爬虫............................................5 1.2.3 数据采集研究现状..............................................6 1.3 数据清洗介绍....................................................6 1.4 数据可视化介绍..................................................6 1.4.1 数据可视化发展史..............................................6 1.4.2 数据可视化研究概述............................................7 2 数据采集(爬虫)技术实现..........................................8 2.1 采集需求........................................................8 2.2 爬虫设计流程....................................................8 2.3 采集网站分析....................................................9 2.4 采集代码实现....................................................10 3 数据清洗技术.....................................................13 4 数据可视化技术...................................................14 4.1 可视化技术实现.................................................14 4.1.1 字段确认.....................................................14 4.1.2 数据获取.....................................................15 4.1.2.1 获取薪资数据...............................................15 4.1.2.2 获取城市数据...............................................16 4.1.2.3 获取学历数据...............................................17 4.1.2.4 获取工作性质数据...........................................18 4.1.2.5 获取工作经验数据...........................................19 4.1.3 可视化实现.................................................19 4.2 数据展示与分析.................................................20 4.2.1 薪资可视化...................................................20 4.2.2 城市地区分布.................................................21 4.2.3 学历要求.....................................................21 4.2.4 工作性质.....................................................22 4.2.5 工作经验.....................................................24 5 结束语...........................................................25 参考文献...........................................................25 致谢.........................................................25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值