数据分析

第一部分:数据分析简介

数据分析就是用适当的方法对收集来的大量的数据进行分析,帮助人们做出判断,以便采取行动

 

数据分析的流程

提出问题---->准备数据---->分析数据---->获得结论---->成果可视化

第二部分:Matplotlib

  • matplotlib是最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建。、
  • matplotlib可以将数据进行可视化,更直观的呈现
  • 使数据更加客观,更具说服力

折线图

显示一天的气温

# 显示一天的气温
import matplotlib.pyplot as plt

# 在图像模糊的时候可以传入dpi参数,让图片更加清晰
fig = plt.figure(figsize=(20,8),dpi=80)
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
plt.plot(x,y)
# 设置X的刻度完全按照给的数据来,不会像图中的Y轴一样是随机分配
plt.xticks(x)
# 设置刻度标记的大小
plt.tick_params(axis='both',labelsize=14)
# 保存图片
plt.savefig('./sig_size.png')
plt.show()

运行结果:

 

显示一天两个小时的气温-时间图

# 显示两小时内每一分钟的温度图
import random

X = range(120)  # 列表可以选取步长,所以这儿最好还是用list函数转一下
# 设置随机种子,让不同时刻随机得到的结果都一样
random.seed(10)
Y = [random.randint(20,35) for i in X]
fig = plt.figure(figsize=(20,8),dpi=80)
plt.plot(X,Y)

# 注意对X轴和Y轴的修改是发生在绘图完成之后的
_x_ticks = ['10点{}分'.format(i) for i in range(60)]
_x_ticks += ['11点{}分'.format(i) for i in range(60)]  # +=相当于extend,将后面列表中的数据取出来放到前一个列表中去
# 一个参数的时候是将坐标值换成对应的列表中的值,当然这种方法仅限于列表中是int的情况,如果是str,则不能采用这种方法
# 如果想要将str传进去,那么就需要两个参数,意思是用后面的列表中的值替换前面列表中的值,作为坐标值
# 两组数据的长度必须一样,否则不能完全覆盖整个轴
# 使用rotation选项,这样可以让字符串旋转90度
plt.xticks(X[::5], _x_ticks[::5], rotation=90)  # 使用列表的切片,每隔五个选一组数据作为展示
plt.savefig('./save_fig1.png',bbox_inches='tight')  # 第二个参数意思是将图标多余的空白区域裁剪掉
plt.show()

问题:可以看到虽然大体的图像是对的,但是没法正常显示中文,这是因为matplotlib默认不显示中文

完善后:

# -*- coding: utf-8 -*-
"""
Created on Fri Mar  1 14:05:34 2019

@author: Happme
"""

# 显示两小时内每一分钟的温度图
import random
import matplotlib
import matplotlib.pyplot as plt

X = range(120)
# 设置随机种子,让不同时刻随机得到的结果都一样
random.seed(10)
Y = [random.randint(20,35) for i in X]
fig = plt.figure(figsize=(20,8),dpi=80)
# 设置备注、颜色、线的类型、线的宽度、透明度
plt.plot(X,Y,label='hah',color='r',linestyle='--',linewidth=5,alpha=0.5)

# 注意对X轴和Y轴的修改是发生在绘图完成之后的
_x_ticks = [u'10点{}分'.format(i) for i in range(60)]
_x_ticks += [u'11点{}分'.format(i) for i in range(60)]  
matplotlib.rcParams['font.sans-serif'] = [u'SimHei']  # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号‘-’显示为方块的问题
plt.xlabel('时间',fontsize=14)  # 设置X轴label,并设置字体大小
plt.ylabel('温度')  # 设置Y轴label
plt.title('10点到12点之间温度变化情况')  # 设置标题
plt.legend(loc='upper right') 
# 一个参数的时候是将坐标值换成对应的列表中的值,当然这种方法仅限于列表中是int的情况,如果是str,则不能采用这种方法
# 如果想要将str传进去,那么就需要两个参数,意思是用后面的列表中的值替换前面列表中的值,作为坐标值
# 两组数据的长度必须一样,否则不能完全覆盖整个轴
# 使用rotation选项,这样可以让字符串旋转90度
plt.xticks(X[::5], _x_ticks[::5], rotation=90)  # 使用列表的切片,每隔五个选一组数据作为展示
plt.savefig('./save_fig1.png')
plt.show()

测试结果:可以正常显示中文

总结:上面我们一共做了什么

  • 绘制折线图          plt.plot()
  • 设置了图片大小以及分辨率       plt.figure()
  • 实现了图片的保存     plt.savefig()
  • 设置了xy轴的刻度和字符串          xticks()
  • 解决了刻度稀疏和密集的问题      x[::5]切片
  • 设置了标题,xy轴的label     title() xlabel ylabel
  • 在一个图像上绘制多个图形,直接plt.plot多次就可以

matplotlib可以绘制折线图、散点图、柱状图、直方图、箱线图、饼图等等,但是我们需要知道不同的统计图到底能够表示出什么,以此来决定哪种统计图来更直观的呈现我们的数据

折线图:以折线的上升和下降来表示统计数量的增减变化的统计图,特点是能够显示数据的变化趋势,反映事务的变化情况(变化)

直方图:由一系列高度不等的纵向条纹或线段表示数据的分布情况,一般用横轴表示数据的分布范围,纵轴表示分布情况;特点是绘制连续性的数据,展示一组或者多组的分布状况(统计)

散点图:用两组数据构成多个坐标点,考查坐标点的分布,判断两变量之间是否存在某些关联或总结坐标点的分布模式;特点是判断变量之间是都存在数量关联趋势,展示离群点(分布规律

散点图

利用scatter函数绘制散点图

import matplotlib.pyplot as plt
import random

x_values = list(range(1000))
y_values = [x**2 for x in x_values]
# 绘制散点图
plt.scatter(x_values,y_values,s=40,label='随意',color='red')
plt.xticks(x_values[::100])
plt.xlabel('闲的无聊',fontsize=14)
plt.ylabel('极其无聊',fontsize=15)
plt.title('无聊',fontsize=20)
plt.legend()
# 设置每个坐标轴的取值范围
plt.axis([0,1000,0,1000000])
# 隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()

直方图

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号
# 随机生成(10000,)服从正态分布的数据
data = np.random.randn(10000)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=40, normed=0, facecolor="blue", edgecolor="black", alpha=0.7)
# 显示横轴标签
plt.xlabel("区间")
# 显示纵轴标签
plt.ylabel("频数/频率")
# 显示图标题
plt.title("频数/频率分布直方图")
plt.show()

条形图

import matplotlib.pyplot as plt
import matplotlib
# 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

label_list = ['2014', '2015', '2016', '2017']    # 横坐标刻度显示值
num_list1 = [20, 30, 15, 35]      # 纵坐标值1
num_list2 = [15, 30, 40, 20]      # 纵坐标值2
x = range(len(num_list1))
"""
绘制条形图
left:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(left=x, height=num_list1, width=0.4, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar(left=[i + 0.4 for i in x], height=num_list2, width=0.4, color='green', label="二部门")
plt.ylim(0, 50)     # y轴取值范围
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend()     # 设置题注
plt.show()

è¿éåå¾çæè¿°

水平条形图

import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

price = [39.5, 39.9, 45.4, 38.9, 33.34]
"""
绘制水平条形图方法barh
参数一:y轴
参数二:x轴
"""
plt.barh(range(5), price, width=0.7, color='steelblue', alpha=0.8)      # 从下往上画
plt.yticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
plt.xlim(30,47)
plt.xlabel("价格")
plt.title("不同平台图书价格")
for x, y in enumerate(price):
    plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.show()

è¿éåå¾çæè¿°

堆叠条形图

堆叠条形图其实就是将上面的代码设置为不用偏移那一小段距离,这样就相当于堆叠的效果

import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

label_list = ['2014', '2015', '2016', '2017']
num_list1 = [20, 30, 15, 35]
num_list2 = [15, 30, 40, 20]
x = range(len(num_list1))
rects1 = plt.bar(left=x, height=num_list1, width=0.45, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar(left=x, height=num_list2, width=0.45, color='green', label="二部门", bottom=num_list1)
plt.ylim(0, 80)
plt.ylabel("数量")
plt.xticks(x, label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend()
plt.show()

è¿éåå¾çæè¿°

饼图

import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

label_list = ["第一部分", "第二部分", "第三部分"]    # 各部分标签
size = [55, 35, 10]    # 各部分大小
color = ["red", "green", "blue"]     # 各部分颜色
explode = [0.05, 0, 0]   # 各部分突出值
"""
绘制饼图
explode:设置各部分突出
label:设置各部分标签
labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
autopct:设置圆里面文本
shadow:设置是否有阴影
startangle:起始角度,默认从0开始逆时针转
pctdistance:设置圆内文本距圆心距离
返回值
l_text:圆内部文本,matplotlib.text.Text object
p_text:圆外部文本
"""
patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
plt.axis("equal")    # 设置横轴和纵轴大小相等,这样饼才是圆的
plt.legend()
plt.show()

è¿éåå¾çæè¿°

第三部分:numpy(释放了GIL锁)

numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算的额基础库,多用于大型、多维数组上执行数值计算;numpy释放了GIL锁所以numpy的运行速度非常快,后面用的库都是以numpy为基础的

 

 

注:上面的非同一维度的数组能够进行运算的原因是遵循广播原则;如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或者其中一方的长度为1,则认为他们是广播兼容的

numpy读取数据

CSV:Comma-Seperated Value,逗号分割值文件

显示:表格状态

源文件:换行和逗号分隔符分割行列的格式化文本文件,每一行的数据表示一条记录

np.loadtxt(name,dtype=np.float,delimiter=None, skiprows=0, usecols=None, unpack=False)

name:文件、字符串或者产生器,可以是gz和bz2压缩文件

dtype:数据类型,可选,默认的是np.float

delimiter:分隔字符串,默认是任何空格,改为逗号

skiprows:跳过钱x行,一般默认是跳过表头
usecols:选取指定的列、索引、元组类型

unpack:如果时候True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认为False

numpy中的转置

转置是一种变化,目的是为了更方便的去处理数据

np.where(条件,m,n):给定一个条件,对于满足该条件的赋值m,否则赋值n

numpy中的nan

  • nan:not a number表示不是一个数字;当我们读取本地的文件为float的时候,如果有缺失,就会出现nan的情况
  • 两个nan是不相等的
  • np.nan!=np.nan
  • 判断数组中nan的个数:np.count_nonzero(t!=t)    # t为一个数组
  • 我们可以通过np.isnan()来判断一个数字是否是nan

numpy中的数组拼接

  • np.vstack((t1,t2))     # 将t1和t2垂直拼接
  • np.hstack((t1,t2))     # 将t1和t2水平拼接
  • 数组的水平或者垂直拼接很简单,但是我们在拼接之前要注意要保证拼接的所对应的列或者行的意义想同

numpy中的数组的行列交换

  • t[[1,2],:] = t[[2,1],:]    # 数组的行进行交换
  • t[:,[1,2]] = t[:,[2,1]]    # 数组的列进行交换

numpy中的一些常用的方法

  • np.argmax(t,axis=0)    # 获得最大值的位置
  • np.zeros((3,4))       # 创建一个3行4列的全为0的数组
  • ones()

第四部分:pandas

numpy能够帮助我们处理数值型的数据,但是这还不够,很多时候我们还需要处理一些字符串或者时间序列;numpy能够帮我们处理数值,但是pandas可以处理除了数值之外的其他的数据

pandas之Series切片和索引:

  • 切片:直接传入start和end就可以了
  • 索引:一个的时候直接传入序号或者index,多个的时候传入序号或者index的列表

DataFrame基础属性:

  • df.shape   # 返回数据维度
  • df.dtypes    # 列数据类型
  • df.index   # 行索引
  • df.columns   # 列索引(表头)
  • df.values     # 对象值,二维ndarray数组
  • df.head(3)
  • df.tail(3)
  • df.describe()
  • df.info()

pandas之取行或者取列(重重重)

一般来说pandas取行很简单,df[1:3]就可以把数据中的第一行到第三行之间的数据取出来了,但是却无法像numpy中那样通过切片选择列,比如df[1:3,1:3]或者df[1:3]['列名','列名'...](后面那个列表中如果放的东西超过两个了那么就会报错,一个是可以的)

pandas提供了优化过的选择方式:

  • df.loc通过标签索引行数据
  • df.iloc通过位置获取行数据
  • 还可以通过loc['行1','列1'] = num   为行1和列1对应的这个值赋上一个新值

缺失数据的处理

对于NaN数据我们一般是怎么处理的?

  • 判断是否为NaN:pd.isnull(df),pf.notnull(df)
  • 处理方式1:删除NaN所在的行列dropna(axis=0,how='any',inplace=False)
  • 处理方式2:填充数据,t.fillna(t.mean()), t.fillna(t.median())
  • 处理为0的数据:t[t==0] = np.nan

pandas常用统计方法

  • mean()
  • max()
  • min()
  • argmax()
  • argmin()
  • median()

数据合并

join:默认情况下是把航索引相同的数据合并到一起(相当于numpy中的hstack);如果行数不相同,缺失值哟经NaN补全

merge:按照指定的列把数据按照一定的方式合并起来

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值