用python进行简单的数据分析和数据可视化

用python进行简单的数据分析和数据可视化

本篇文章主要是初步探索数据分析,简单了解数据分析大致流程
数据来源来自于Kaggle平台上的一个项目:Explore San Francisco city employee salary data
源代码与原数据:https://github.com/yb705/SF-Salaries
首先我们需要导入一些第三方库numpy,pandas等,对数据可视化进行一些初始设置以及对原始数据的导入:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline#在ipython或者是jupyter notebook上可以显示图片
plt.style.use("fivethirtyeight")
sns.set_style({
    
    'font.sans-serif':['SimHei','Arial']})
original=pd.read_csv('C:\\Users\\1994y\\Desktop\\Salaries.csv')

数据初探
那么首先我们需要观察数据看看是否有缺失值,以及数据的格式:

original.info()

在这里插入图片描述
可以看到有缺失值,那么在接下来的操作中要注意一下有缺失值的部分。
还可以看到在dtype一栏中的数据格式,要提醒大家,有的数据看起来是数字,实际上本身是字符串格式,如果接下来我们有算数或其他数字操作的话就需要把这些数据转换成int型或float型。

objlist = ['BasePay', 'OvertimePay', 'OtherPay', 'Benefits']
for obj in objlist:
    original[obj] = pd.to_numeric(original[obj], errors = 'coerce')
original.info()

在这里插入图片描述
这样就好了。除了to_numeric()之外,还可以使用astype()方法进行数据格式转换。
那么我们可以先大概了解一些这些数据,例如年份:

original['Year'].unique()

在这里插入图片描述
每年的基础工资的平均值:

original.groupby(["Year"])[["BasePay"]].mean()

在这里插入图片描述
还可以查到工资最少的那个人:

original[original['TotalPayBenefits'] == original['TotalPayBenefits'].min()]

在这里插入图片描述
这是公司还欠钱了吗,怎么是负的
加班工资最多的那个人:

original[original['OvertimePay'] == original['OvertimePay'].max()]

在这里插入图片描述
唉,加班的工资都比博主的正式工资要高,难受

还可以利用pandas的groupby机制进行分组统计,查看PT(兼职)和FT(全职)各自的基础工资的平均值:

original.groupby('Status')['BasePay'].mean()

在这里插入图片描述
数据可视化
数据可视化是用python进行数据分析的一个非常棒的功能,几行简单的代码就可以生成各种酷炫的图表,将数据非常直观的表现出来,主要是依托于第三方库matplotlib,seaborn来实现。(第三方库也是python的一个特色了。)
利用柱形图查看这四年的平均薪资最高的职业top5:
因为打算以子图组合的形式呈现出来,所以我们先筛选这4年的数据:

a=original.loc[original["Year"]==2011]
b=original.loc[original["Year"]==2012]
c=original.loc[original["Year"]==2013]
d=original.loc[original["Year"]==2014]

接下来就是对四组数据进行分组并各自求平均薪资:

a_2011=a.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()
a_2011['JobTitle']=a_2011['JobTitle'].str.capitalize()#这里是为了让工作名称即JobTitle的首字母大写,与其他三组一致
b_2012=b.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()
c_2013=c.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()
d_2014=d.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()
f, axs = plt.subplots(2,2,figsize=(20,15))#2x2的子图组合,大小是20x15

sns.barplot(x=a_2011['JobTitle'].head(5), y=a_2011['TotalPay'].head(5), palette="Greens_d",data=a_2011, ax=axs[0,0])#子图的数据,位置等设置
axs[0,0].set_title('2011年SF工资top5',fontsize=15)#标题
axs[0,0].set_xlabel('工作')
axs[0,0].set_ylabel('平均薪资')

sns.barplot(x=b_2012['JobTitle'].head(5), y=b_2012['TotalPay'].head(5), palette="Greens_d",data=b_2012, ax=axs[0,1])
axs[0,1].set_title('2012年SF工资top5',fontsize=15)
axs[0,1].set_xlabel('工作')
axs[0,1].set_ylabel('平均薪资')

sns.barplot(x=c_2013['JobTitle'].head(5), y=c_2013['TotalPay'].head(5), palette="Greens_d",data=c_2013.head(5), ax=axs[1,0])
axs[1,0].set_title('2013年SF工资top5',fontsize=15)
axs[1,0].set_xlabel('工作')
axs[1,0].set_ylabel('平均薪资')

sns.barplot(x=d_2014['JobTitle'].head(5), y=d_2014['TotalPay'].head(5), palette="Greens_d",data=d_2014.head(5), ax=axs[1,1])
axs[1,1].set_title('2014年SF工资top5',fontsize=15)
axs[1,1].set_xlabel('工作')
axs[1,1].set_ylabel('平均薪资')

在这里插入图片描述
结果如上所示,可以非常直观的看出每年薪资最高的几个职业,以及各自的薪酬。
利用折线图查看几个职业在三年里的平均薪资的变化
我选择了12年工资最高的五个职业,来进行查看:

job_list=["Chief of Police","Chief, Fire Department","Gen Mgr, Public Trnsp Dept","Executive Contract Employee","Asst Chf of Dept (Fire Dept)"]

接下来我编了一个函数用来筛选这三年里对应职业的薪酬,并生成一个字典:

def check_job(x):
    salary_dict={
    
    }
    for i in range(len(x["JobTitle"])):
        if x.loc[i,'JobTitle'] in job_list:
            salary_dict[x.loc[i,'JobTitle']]=x.loc[i,'TotalPay']
    return salary_dict
d1=check_job(a_2011)
d2=check_job(b_2012)
d3=check_job(c_2013)
d4=check_job(d_2014)
d4

其中一个结果如下:
在这里插入图片描述
最后将生成的字典整理一下就变成了这样:

salary={
    
    'Chief of Police':[321552.11,339282.07,326716.76],
 'Chief, Fire Department':[ 314759.6,336922.01,326233.44],
 'Gen Mgr, Public Trnsp Dept': [294000.17,305307.89,294000.18],
 'Executive Contract Employee': [273776.24,207269.5166666667,278544.71],
 'Asst Chf of Dept (Fire Dept)': [270674.81666666665,294846.6766666667,279768.9583333334]}

接下来将字典生成dataframe格式,并生成图片:

df=pd.DataFrame(salary,index=["2012","2013","2014"])
df.plot()#生成折线图

在这里插入图片描述
当然数据特征值的选择有点问题,如果时间可以在拉长一点的话,这个图表会更加直观。
利用热力图查看特征值的相关性
相关关系,是指2个或2个以上变量取值之间在某种意义下所存在的规律,其目的在于探寻数据集里所隐藏的相关关系网。一般采用相关系数来描述两组数据的相关性,而相关系数则是由协方差除以两个变量的标准差而得,相关系数的取值会在 [-1, 1] 之间,-1 表示完全负相关,1 表示完全相关。相关性在数据分析和数据挖掘都有着非常重要的作用。而对于相关性的表现,可以用热力图非常直观的表现出来。

del original["Notes"]#删掉note这个不相关的特征值
plt.figure(figsize=(20,20))
plt.rcParams['font.sans-serif']=['SimHei'] #定义字体避免出现乱码的情况
plt.rcParams['axes.unicode_minus']=False
sns.heatmap(original.corr(),linewidths=0.1,vmax=1.0, square=True, linecolor='white', annot=True)#。corr()就是相关系数
plt.show()

在这里插入图片描述
从颜色和结果我们可以看出各个属性之间的相关系数,即是否相互影响。颜色越浅,系数就越接近1,相关性就越大。

总结

以上便是数据分析与数据可视化的简单流程,希望大家可以简单的了解,实际上其中还有很多数据可以进行分析,有兴趣的同学可以自行研究。如果想了解更加详细的数据分析与挖掘的流程,可以看我的另一篇文章用python进行数据分析,挖掘及机器学习流程实项-天津租房
博主接触数据分析的时间不长,如果有什么不好的地方希望大家多多指正。
感谢阅读。

猜你喜欢

转载自blog.csdn.net/weixin_43580339/article/details/105975813
今日推荐