数据分析-python模块5.25

昨日内容回顾

  • 数据可视化模块

    matplotlib
    	基于matplotlib的seaborn模块
       
    import matplotlib.pyplot as plt
    
    绘制图形有两种策略
    	1.直接使用Plt模块
        	plt.图形样式方法
        2.使用DataFrame内置方法
        	df.plot(kind='图形样式')
    
  • 饼图

    通过面积大小反应权重占比
    Plt.pie()
    
  • 条形图

    主体高低反应数值差异
    垂直条形图
    	plt.bar
    水平条形图
    	plt.barh
    交叉条形图
    	plt.bar
    
  • 直方图

    反应数据的分布特征
    plt.hist
    
  • 箱线图

    得知数据的下须值(Q1-1.5IQR)、下四分位数(Q1)、中位数(Q2)、均值、上四分位(Q3)数和上须值(Q3+1.5IQR),更重要的是,箱线图还可以发现数据中的异常点
    plt.boxplot
    
  • 折线图

    横坐标一般情况下都是时间序列
    	plt.plot
    
  • 散点图

    研究两个变量之间是否存在一定的关系
    	plt.scatter
    
    # 气泡图
    	由散点图演变而来 作用是通过气泡的大小来反映第三个变量的特征
    
  • 热力图

    交叉填充表	用来反应变量之间的组合关系
    	sns.heatmap
        
    '''脱稿完成下列两题'''   
    # 根据交易日期,衍生出年份和月份字段
    # 统计每年各月份的销售总额
    

今日内容概要

  • 组合图
  • 数据可视化其他模块
  • 数据清洗理论概要
  • 数据清洗实战案例

今日内容详细

组合图

工作中往往会根据业务需求,将绘制的多个图形组合到一个大图框内,形成类似仪表板的效果;
plt.subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)

shape:指定组合图的框架形状,以元组形式传递,如2×3的矩阵可以表示成(2,3) 
loc:指定子图所在的位置,如shape中第一行第一列可以表示成(0,0) 
rowspan:指定某个子图需要跨几行
colspan:指定某个子图需要跨几列

"""
# 设置大图框的长和高 plt.figure(figsize = (12,6))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 设置第二个子图的布局
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
# 设置第三个子图的布局
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
# 设置第四个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
"""


# 读取数据
Prod_Trade = pd.read_excel(r'Prod_Trade.xlsx')
# 衍生出交易年份和月份字段
Prod_Trade['year'] = Prod_Trade.Date.dt.year
Prod_Trade['month'] = Prod_Trade.Date.dt.month

# 设置大图框的长和高
plt.figure(figsize = (12,6))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 统计2012年各订单等级的数量
Class_Counts = Prod_Trade.Order_Class[Prod_Trade.year == 2012].value_counts()
Class_Percent = Class_Counts/Class_Counts.sum()
# 将饼图设置为圆形(否则有点像椭圆)
ax1.set_aspect(aspect = 'equal')
# 绘制订单等级饼图
ax1.pie(x = Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
# 添加标题
ax1.set_title('各等级订单比例')

# 设置第二个子图的布局
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
# 统计2012年每月销售额
Month_Sales = Prod_Trade[Prod_Trade.year == 2012].groupby(by = 'month').aggregate({'Sales':np.sum})
# 绘制销售额趋势图
Month_Sales.plot(title = '2012年各月销售趋势', ax = ax2, legend = False)
# 删除x轴标签
ax2.set_xlabel('')

# 设置第三个子图的布局
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
# 绘制各运输方式的成本箱线图
sns.boxplot(x = 'Transport', y = 'Trans_Cost', data = Prod_Trade, ax = ax3)
# 添加标题
ax3.set_title('各运输方式成本分布')
# 删除x轴标签
ax3.set_xlabel('')
# 修改y轴标签
ax3.set_ylabel('运输成本')

# 设置第四个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
# 2012年客单价分布直方图
sns.distplot(Prod_Trade.Sales[Prod_Trade.year == 2012], bins = 40, norm_hist = True, ax = ax4, hist_kws = {'color':'steelblue'}, kde_kws=({'linestyle':'--', 'color':'red'}))
# 添加标题
ax4.set_title('2012年客单价分布图')
# 修改x轴标签
ax4.set_xlabel('销售额')

# 调整子图之间的水平间距和高度间距
plt.subplots_adjust(hspace=0.6, wspace=0.3)
# 图形显示
plt.show()

补充

数据可视化的方法补充
	matplotlib
    seaborn
    highcharts
    echarts
python中有模块可以直接使用echarts
	pyecharts
    文档:https://pyecharts.org/#/

数据清洗理论概要

1.什么是数据清洗
	在对数据进行分析之前 对收集到的数据进行审核 处理 校验
    # 数据清洗是整个数据分析环节中必不可少的一环
 
2.数据清洗比喻
	 明确需求:	麻辣香锅
     收集数据:	采购食材
     数据清洗:	清洗食材
     数据分析:	烹饪食材
     数据可视化:	拍照   
	 数据报告:	点评
     
3.数据清洗定义
	数据清洗是从记录表、表格、数据库中检测、纠正或删除损坏或不准确记录的过程
    
脏数据
	缺失数据 异常数据 重复数据 错误数据等不符合规则的数据
干净的数据
	处理完毕可以用于数据分析环节的数据

数据清洗常用方法及流程

读取数据:三种方法
数据概览:df.info()、df.describe()
简单处理:去除数据间的空格、英文字母大小写的转换
重复值处理:duplicated()、drop_duplicates()
缺失值处理:删除缺失值、均值填补法、向前填充/向后填充、模型填补法,如随机森林
异常值处理:删除异常值的记录,作为缺失值处理,平均值修正、盖帽法修正,不处理:业务分析挖掘价值
文本数据处理:去除前后空格处理,处理中间有,()之类的数据,正则表达式提取所需数据
日期类型处理:将系统时间格式化,系统时间和时间戳相互转换,年月日的提取
# 处理过程没有先后顺序 熟练之后随意操作

实战演练

# 数据分析三剑客
# 导入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读入数据
df = pd.read_csv(r'qunar_freetrip.csv')
df
# 数据概览
df.shape  # 获取行列数  (5100, 14)
df.columns  # 获取列字段  
df.index  # 获取行索引
df.dtypes  # 获取字段类型
df.info()  # 查看字段类型及是否含有缺失数据
df.describe()  # 快速统计

##########列字段处理#####
# df.head(5)
# 1.删除无用的Unnamed: 0字段
df.drop(columns='Unnamed: 0',inplace=True)
df.head()

# 2.列字段首尾空格(极其容易忽略)
new_col = []
for col in df.columns:
    # 移除字段首尾的空格
    new_col.append(col.strip())
# 替换旧字段
df.columns = new_col

"""
列表生成式
df.columns = [col.strip() for col in df.columns]
"""


"""
针对异常值处理
	1.占比不大可以直接删除
	2.Z得分法
	3.分位数法
	4.距离法
	5.直接核定修改
"""

# 删除行数据
# 方式1 纵向合并 统一获取索引值

# 重置行索引
df.index = range(0,df.)


重复值处理

# 统计重复的数据
df.duplicated().sum()
# 直接删除重复的数据
df.drop_duplicates(inplace=True)

df.shape # 查看行列数

# 重置行索引
# 方式1
df.reset_index(inplace=True)
df.drop(columns=['index'],inplace=True)
df.drop(columns=['level_0'],inplace=True)
# 方式2
# 重新赋值 
df.index = range(0,df.shape[0])

异常值处理

# 利用快速统计大致猜测可能有异常值的字段
df.describe()
# 1.公式判断是否存在异常值
sd = (df['价格'] - df['价格'].mean()) / df['价格'].std()  # 判断的标准
# 利用逻辑索引筛选数据
df[(sd > 3)|(sd < -3)]
# 利用绝对值
df[abs(sd) > 3]  # abs就是绝对值的意思(移除正负号)
# 节省大于价格的数据
df[df['节省']>df['价格']]

"""
针对异常值处理
    1. 占比不大可以直接删除
    2. Z得分法
    3. 分位数法
    4. 距离法
    5. 直接核定修改
"""
# 删除行数据
# 方式1 纵向合并 统一获取索引值
del_index = pd.concat([df[abs(sd) > 3],df[df['节省']>df['价格']]]).index
del_index
# 删除数据
df.drop(index=del_index,inplace=True)
# 再次重置行索引
df.index = range(0,df.shape[0])
# 显示后五条数据
df.tail()

缺失值处理

# 查看缺失数据
df.info()
df.isnull().sum()
# 查看出发地数据是否缺失
df[df['出发地'].isnull()]

'''有时候缺失的数据可能在其他单元格中可以找到答案'''

# 针对出发地缺失可以在路线中找到
df[df['出发地'].isnull()]['路线名']

"""
1.字符串切片(有缺陷)
    出发地字符个数不确定
2.字符串切割(没有缺陷)
    切割之后列表的第一个元素就是出发地
3.正则表达式(后面讲)
    利用特殊符号的组合去字符串中筛选出符合条件的数据
"""
# 获取出发地缺失的行的路线名
str_data = df[df['出发地'].isnull()]['路线名'].values
str_data

# 获取出发地
new_l = []
for i in str_data:
    new_l.append(i.split('-')[0])
new_l

# new_l = [i.split('-')[0] for i in df[df['出发地'].isnull()]['路线名'].values]

# 获取对应行的出发地
df.loc[df.出发地.isnull(),'出发地'] = [i.split('-')[0] for i in df.loc[df.出发地.isnull(),'路线名'].values]
# 查看目的地数据是否有缺失
df[df['目的地'].isnull()]

# 针对目的地的获取 无法使用切片和切割操作    只能使用正则
import re
re.findall('-(.*?)\d','深圳-香格里拉3天2晚 | 入住大连黄金山大酒店 + 南方航空/东海往返机票')
# 通过正则表达式获取目的地
reg_exp = '-(.*?)\d'
df.loc[df.目的地.isnull(),'目的地'] = [re.findall(reg_exp,i) for i in df.loc[df.目的地.isnull(),'路线名'].values]

作业

1.利用组合图将所学的统计学图形全部展示在一张图中(最少六个及以上)
2.完成今日数据清洗案例
3.预习明日内容:
	https://www.cnblogs.com/Dominic-Ji/articles/11109067.html#_label10
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值