用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进行数据分析,挖掘及机器学习流程实项-天津租房

个人博客:https://www.yyb705.com/
欢迎大家来我的个人博客逛一逛,里面不仅有技术文,也有系列书籍的内化笔记。
有很多地方做的不是很好,欢迎网友来提出建议,也希望可以遇到些朋友来一起交流讨论。

  • 11
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python的设计哲学是“优雅”、“明确”、“简单Python用途极广。图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。 数学处理:NumPy扩展提供大量与许多标准数学库的接口。 文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。 数据库编程:程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。 网络编程:提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。 Web编程:应用的开发语言,支持最新的XML技术。 多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。 pymo引擎:PYMO全称为python memories off,是一款运行于Symbian S60V3,Symbian3,S60V5, Symbian3, Android系统上的AVG游戏引擎。因其基于python2.0平台开发,并且适用于创建秋之回忆(memories off)风格的AVG游戏,故命名为PYMO。 黑客编程:python有一个hack的库,内置了你熟悉的或不熟悉的函数,但是缺少成就感。 用Python简单爬虫

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值