Python数据分析入门(一)——初探数据可视化

前言

静下心算算,当程序员已经有好几年了,不过自大学时代开始,学习对我来说就是个被动接受的过程,学校的课程、当时热门的移动端开发、数据库的学习、web学习、PHP后端学习……需要做什么我便去学什么,到了今天,突然意识到我是不是该给自己一个明确的发展方向了,毕竟岁月不饶人,96年的小朋友都参加工作了,不精通某一领域始终都会觉得浑浑噩噩。因为对大数据比较感兴趣,而这方面的知识挖掘空间和发展空间都很大,再加上以前也摸过Python,所以给自己定了个自学计划,也写一些笔记类的博客做个记录与学习分享。关于Python的基础语法这类的东西就不在笔记中额外开文章写了,我会在代码示例中穿插着提一些Python的语法,因为这毕竟是一门“脚本语言”,语法的学习并不困难。这个系列的博客我会尽量地勤快些,算是对自己的敦促,开始的部分是结合《Python编程:从入门到实践》这本书上的例子做一些理解,下一步是根据《利用Python进行数据分析》这本书做一些学习笔记。

开发环境

《利用Python进行数据分析》中开篇就说到了“你的Python开发环境是什么”的问题,作者给出的答案是“IPython外加一个文本编辑器”。这样的开发环境对于一个经验老到的工程师来说,无疑是最为简洁易用的,好比我现在工作中,写Android代码会使用Android Studio,前辈会使用Source Insight;写PHP会用到PHPStorm,前辈会使用Source Insight;写web前端会使用VSCode,前辈会使用Source Insight……年轻的程序员有个通病就是过分依赖于使用IDE进行开发,我也是个年轻程序员,所以在这个博客系列中我是用的开发工具是PyCharm。在这之前我也分别尝试了在Ubuntu、Windows下搭建《利用Python进行数据分析》书中所需要的开发环境,过程其实是很繁琐的,而且使用文本编辑器写代码的效率……反正我水平有限,所以我的看法是,搭建环境这个过程是需要亲自动手体验一下的,而实际的生产中,我更倾向于使用IDE。

至于下载Python、配置环境变量、下载PyCharm,这些都不在这里多讲了。

在这一篇博客中主要使用的开发包是matplotlib,在PyCharm导入即可,Download的过程可能会有点慢甚至下载不了,搭个梯子就行了,都很简单。

言归正传,初探门径

什么是数据可视化?

数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表,也可以是数以及字节的数据。
——摘自《Python编程:从入门到实践》

我们可以这样理解,数据可视化和数据挖掘都是探索数据和分析数据的一种手段,只不过数据挖掘是以代码为探索途径,而数据可视化是将数据转换为图形、图表这样可视的形式来进行分析。

关于matplotlib

matplotlib是一个Python的2D绘图库,我们可以通过这个库将数据绘制成各种2D图形(直方图、散点图、条形图等)。

小试牛刀

matplotlib是一个功能很强大的绘图库,其提供的一系列功能完善的api可以帮助我们快速地建立起我们所需的图形,接下来是几个简单的例子,在这些例子中我也会穿插着记录一下Python的相关语法。

1.先来一个简单的折线图

①import matplotlib.pyplot as plt

squares = [1, 4, 9, 16, 25]
②plt.plot(squares, linewidth=5)
③plt.title("Square Numbers", fontsize=24)
④plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14) ⑤plt.tick_params(axis='both', labelsize=12)plt.show()

(代码中有些行的开头有标号作为稍后讲解代码的标号,要运行这些代码的话先把标号删掉哦)

这段代码的执行效果是这样的:

TIM图片20180810165530.png

先来看看代码吧:

①导入matplotlib.pyplot模块并赋予其别名plt,这是Python中常用的小技巧,目的主要是简化一些名称,当然我们也可以这样写:

from matplotlib import pyplot

不过这样一来,在后面调用到pyplot的方法时需要把之前的plt改为全称pyplot,运行结果不会有任何差别。

②plot()方法:这里将存放了一组平方数的列表传入plot(),它将会尝试根据这些数据绘制出有意义的图形。再调用show()即可将图形显示出来。实参linewidth=5指定了折线的宽度。

③title()方法:使用此方法为图标添加标题,实参fontsize=24指定了文字尺寸,后面的方法中该参数含义相同。

④xlabel()和ylabel()方法:为x轴和y轴命名。

⑤tick_params()方法:设置坐标轴刻度的样式,实参axis='both'表示同时设置两条轴,也可以指定为x或y单独设置。

相信大家发现了一个问题,我们传入的数据是一组平方值,而我们起始的数据是1的平方,但是x轴的起点却是0——事实上当你向plot()提供一系列数字时,它会默认x轴的0作为数据的起点,要改变这种默认配置,只需要对代码稍作修改,再提供一组x轴的值与平方数一一对应:

import matplotlib.pyplot as plt

input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12)
plt.show()

来看看运行结果:

TIM图片20180810162200.png

这样就好多了对吧?

2.再试试散点图吧

在绘制折线图的时候,我们使用了plot()方法来接收数据,而对于散点图,则需要使用scatter()方法。我们直接来看看代码:

import matplotlib.pyplot as plt

①x_values = list(range(1, 101))  # 区分list()和range()
y_values = [x ** 2 for x in x_values]
②plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolors='none', s=40)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis="both", labelsize=14)
③plt.axis([0, 110, 0, 11000])
# plt.show()
④plt.savefig('squares_plot.png', bbox_inches='tight')

依然根据标号来看看代码:

①x_values和y_values,定义了数据源,分别对应x轴的输入值和y轴的输出值,相互间的关系为y轴的输出值为x轴值的平方。在Python中,range()方法的含义是产生一个可迭代的对象,它的很多行为都与list相似,比如在遍历range(1, 101)并打印将会得到1至100的值,但是它与list是有本质区别的,即它在迭代的情况下返回的是一个索引值而非在内存中真正生成一个列表对象,所以在Python3中执行print(range(1, 101)),你将会得到的打印结果是range(1, 101)而非一个从1到100的列表。所以想要得到一个真正的列表则需要跟list()方法结合使用。对于这一句[x ** 2 for x in x_values],可能看着有些奇怪,但并不难理解,我们可以将它看成遍历列表x_values,每次遍历时将取出一个x值将它做平方放入y_values中生成一个列表。

②scatter()方法:和上一个例子中的plot()方法类似,都是负责接收数据绘制图形,我们可以通过传入实参c、edgecolors、s来分别指定散点颜色、散点边缘颜色和散点大小,对于颜色可以直接传“red”、“blue”这种简单的颜色,也可以传入rgb色值。在本段代码中,则是利用颜色映射(colormap)来设置颜色,即代码中的实参cmap,结合c=y_values,绘制出的散点将根据y轴值由小到大颜色逐渐加深,基本颜色为蓝色。

③axis()方法:指定每个坐标轴的取值范围,[x_min, x_max, y_min, y_max]。

④savefig()方法:可以注意到,在这个例子中,我将show()方法注释掉了,改为savefig()方法,这个方法将把绘制结果储存在项目目录下,第一个参数指定了图形文件名称,第二个参数表示将图表多余的空白区域裁掉。

运行结果当然是在项目目录下生成了一个图表,内容如下:

squares_plot.png

结语

这是这个系列的第一篇文章,算是简单的起个头,内容不复杂,注解也很详细。之前说过这一系列的博客我会写得频繁些,所以每一篇文章的内容不会太多,但求理解细致,希望在这个过程中自己的学习能够更扎实些,读者们也能学到些东西。最后作为读书笔记,还是把书上这一节的小练习贴出来,大家可以试试自己敲敲:

1.数字的三次方被称为其立方。请绘制一个图形,显示前5 个整数的立方值,再绘制一个图形,显示前5000 个整数的立方值。

2.给你前面绘制的立方图指定颜色映射。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容