数据分析:
- 基础概念和环境
- matplotlib:绘图
- numpy:处理数值型数组
- pandas:在numpy的基础之上,除了能够处理数值型数组之外,还能处理字符串,列表,时间序列等等数据类型。
为什么要学习数据分析
从大量数据中,寻找规律,对大量数据进行统计和分析,统计出感兴趣的规律,供后续使用。绘图使我们更好的理解数据,从一堆数据里面找出经验或结论供他人使用。
- 有岗位需求 爬虫+数据分析
- 是python数据科学的基础
- 是机器学习课程的基础
什么是数据分析
数据分析是用适当的方法对收集来的大量数据进行分析,帮助人们做出判断,以便采取行动。
数据分析的流程: 提出问题-》准备数据-》分析数据-》获得结论-》成果可视化, …
环境安装
conda: https://www.anaconda.com/download/ 创建环境:
conda create --name env_name python=3
切换环境:
windows: activate env_name linux/macos: source activate env_name
认识jupyter notebook
jupyter notebook:一款变成、文档、笔记、展示软件。 启动命令:
jupyter notebook
matplotlib
纯用python实现的库,matplotlib能将数据进行可视化,更直观地呈现,使数据更加客观、更具说服力。 matplotlib是最流行的python底层绘图库,主要做数据可视化图标,名字取材于matlab.
matplotlib能够绘制折线图,散点图,柱状图,直方图,箱线图,饼图等。
但是,我们需要知道不同的统计图到底能够表示出什么,以此来决定选择哪种统计图来更直观的呈现我们的数据
matplotlib绘制折线图 plt.plot
plt.plot(x,y)画一条线 多个plt.plot画多条线
from matplotlib import pyplot as plt
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.show()
结果:
maplotlib基础绘图
设置图片大小 plt.figure(figsize=,dpi=)
生成指定大小的高清图,必须在plt.plot函数之前设置。
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi=80)
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.show()
结果:
保存到本地 plt.savefig(save_path)
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi=80)
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.savefig('d:\pic.png')
plt.show()
结果:
添加x,y轴刻度 plt.xticks(x)
比如x轴和y轴表示什么,这个图表示什么
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi=80)
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.xticks(range(2,25))
plt.yticks(range(min(y),max(y)+1))
plt.show()
结果:
调整x轴或y轴上的刻度表示 plt.xticks(x, x_label, rotation)
将数字刻度与字符串刻度一一对应,数据长度必须一样。
如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况? a= [random.randint(20,35) for i in range(120)]
import random
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
_x = x[::10]
_xticks_labels = ['{0}:{1}'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 90)
plt.show(
结果:
设置中文(fc-list命令 font_manager模块)
matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字。 查看linux/mac/windows下面支持的字体:
fc-list 查看支持的字体 fc-list :lang=zh 查看支持的中文(冒号前面有空格)
如何修改matplotlib的默认字体?
通过matplotlib.rc函数可以修改,具体方法参见源码(windows/linux) 通过matplotlib 下的font_manager模块可以解决(windows/linux/mac)
matplotlib.rc函数
font = {'family' : 'monospace',
'weight' : 'bold',
'size' : 'larger'}
matplotlib.rc('font', **font)
font_manager模块 使用fc-list查看字体文件路径,然后利用该路径实例化font_manager
font_manager.FontProperties(fname=“C:/WINDOWS/Fonts/msyhbd.ttc”) plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font)
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/msyhbd.ttc")
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
_x = x[::10]
_xticks_labels = ['{0}点{1}分'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font)
plt.show()
结果:
添加x轴、y轴描述信息 plt.xlable() plt.ylabel() plt.title()
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/msyhbd.ttc")
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
_x = x[::10]
_xticks_labels = ['{0}点{1}分'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font)
plt.xlabel('时间',fontproperties = my_font)
plt.ylabel('温度 单位(摄氏度)',fontproperties = my_font)
plt.title('10点到12点每分钟气温的变化情况', fontproperties = my_font)
plt.show()
结果:
绘制网格 plt.grid
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x = range(11,31)
plt.figure(figsize=(20,8), dpi= 80)
plt.plot(x,y)
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)
plt.grid(alpha = 0.4)
plt.show()
结果:
绘制多个折线 plt.legend()
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)
plt.figure(figsize=(20,8), dpi= 80)
plt.plot(x,y, label = '自己')
plt.plot(x,y2, label = '同桌')
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)
plt.grid(alpha = 0.4)
plt.legend(prop = my_font, loc = 'upper left')
plt.show()
结果:
线条的样式(比如颜色,透明度等) plt.plot(x,y, label, color = ‘orange’, linestyle = ‘-.’)
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)
plt.figure(figsize=(20,8), dpi= 80)
plt.plot(x,y, label = '自己', color = 'orange', linestyle = ':')
plt.plot(x,y2, label = '同桌', color = 'cyan', linestyle = '-.')
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)
plt.grid(alpha = 0.4, linestyle = '--')
plt.legend(prop = my_font, loc = 'upper left')
plt.show()
结果:
- 标记出特殊的点(比如告诉别人最高点和最低点在哪里)
- 给图片添加一个水印(防伪,防止盗用)
常用统计图
折线图
以折线的上升或下降来表示统计数量的增减变化的统计图。 特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
直方图
由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。 特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)
条形图
排列在工作表的列或行中的数据可以绘制到条形图中。 特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
散点图
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量 之间是否存在某种关联或总结坐标点的分布模式。 特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
matplotlib绘制散点图 plt.scatter()
假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律? a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23] b =[26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
y1 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y2 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
x1 = range(1,32)
x2 = range(51,82)
fig = plt.figure(figsize=(20,8), dpi = 80)
plt.scatter(x1,y1, label='3月份',)
plt.scatter(x2,y2, label='4月份')
x1_labels = ['3月{}日'.format(i) for i in x1[::3]]
x2_labels = ['10月{}日'.format(i%50) for i in x2[::3]]
plt.xticks(list(x1[::3]) + list(x2[::3]), x1_labels + x2_labels, fontproperties = my_font, rotation = 45)
plt.xlabel('时间', fontproperties = my_font)
plt.ylabel('温度', fontproperties = my_font)
plt.title('3月和10月份的温度变化', fontproperties = my_font)
plt.legend(prop = my_font)
plt.show()
结果: 散点图的应用场景:
- 不同条件(维度)之间的内在关联关系
- 观察数据的离散聚合程度
matplotlib绘制条形图 plt.bar() plt.barh()
示例一:假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?
a = [“战狼2”,“速度与激情8”,“功夫瑜伽”,“西游伏妖篇”,“变形金刚5:最后的骑士”,“摔跤吧!爸爸”,“加勒比海盗5:死无对证”,“金刚:骷髅岛”,“极限特工:终极回归”,“生化危机6:终章”,“乘风破浪”,“神偷奶爸3”,“智取威虎山”,“大闹天竺”,“金刚狼3:殊死一战”,“蜘蛛侠:英雄归来”,“悟空传”,“银河护卫队2”,“情圣”,“新木乃伊”,]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 单位:亿
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:\n最后的骑士","摔跤吧!\n爸爸","加勒比海盗5:\n死无对证","金刚:\n骷髅岛","极限特工:\n终极回归","生化危机6:\n终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:\n殊死一战","蜘蛛侠:\n英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
x = range(len(x_labels))
y = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
fig = plt.figure(figsize= (15,10), dpi = 80)
plt.bar(x,y, width= 0.7, label='电影销量')
plt.xticks(x, x_labels, fontproperties = my_font, rotation = 90)
plt.legend(prop = my_font)
plt.show()
结果: 横着的条形图
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
x = range(len(x_labels))
y = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
fig = plt.figure(figsize= (15,10), dpi = 80)
plt.barh(x,y, height= 0.3, label='电影销量',color = 'orange')
plt.yticks(x, x_labels, fontproperties = my_font)
plt.grid(alpha = 0.3)
plt.show()
结果:
示例二:假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?
a = [“猩球崛起3:终极之战”,“敦刻尔克”,“蜘蛛侠:英雄归来”,“战狼2”] b_16 = [15746,312,4497,319] b_15 = [12357,156,2045,168] b_14 = [2358,399,2358,362]
from turtle import width
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
y1 = [15746,312,4497,319]
y2 = [12357,156,2045,168]
y3 = [2358,399,2358,362]
x1 = list(range(len(x_labels)))
x2 = [i+0.2 for i in x1]
x3 = [i+0.4 for i in x1]
plt.figure(figsize=(20,8), dpi = 80)
plt.bar(x1,y1, width=0.2, label='9月14日')
plt.bar(x2,y2, width=0.2, label='9月15日')
plt.bar(x3,y3, width=0.2, label='9月16日')
plt.xticks(x2,x_labels, fontproperties = my_font)
plt.legend(prop = my_font)
plt.show()
结果: 条形图的应用场景:
示例三、在美国2004年人口普查发现有124 million的人在离家相对较远的地方工作。根据他们从家到上班地点所需要的时间,通过抽样统计(最后一列)出了下表的数据,这些数据能够绘制成直方图么? interval = [0,5,10,15,20,25,30,35,40,45,60,90] width = [5,5,5,5,5,5,5,5,5,15,30,60] quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
from matplotlib import pyplot as plt
from matplotlib import font_manager
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
plt.figure(figsize= (20,8), dpi = 80)
plt.bar(range(len(quantity)), quantity, width = 1)
_x = [i-0.5 for i in range(13)]
_xtick_labels = interval + [150]
plt.xticks(_x, _xtick_labels)
plt.grid()
plt.show()
结果:
matplotlib绘制直方图 plt.hist
假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?
from matplotlib import pyplot as plt
from matplotlib import font_manager
a = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
d = 3
num_bins = (max(a) - min(a)) //d
plt.figure(figsize=(20,8), dpi = 80)
plt.hist(a, num_bins)
plt.xticks(range(min(a), max(a)+d, d))
plt.grid()
plt.show()
结果: 频数分布直方图 频率分布直方图 直方图应用场景:
- 用户的年龄分布状态
- 一段时间内用户点击次数的分布状态
- 用户活跃时间的分布状态
更多的绘图工具
plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas
使用用法:简单,照着文档写即可。
文档地址: https://plot.ly/python/
|