基于Python的大数据分析基础(九)--- 数据分析
8 数据分析
8.1 基本统计分析(描述性统计分析)
一般统计某个变量的最小值,第一个四分位值,中值,第三个四分位值,以及最大值
均值(Mean),中位数(Median)和众数(Mode)
其中均值和中位数用于定量的数据,众数用于定性的数据
对于定 量数据( Data )来说,均值是总和除以总量 N,中位数是数值大小位于中间(奇偶总量处理不同)的值,均值相对中位位数来说,包含的信息量更大,但是容易受异常的影响。
描述性统计分析函数为 describe 。该函数返回值有均值、标准差、最大 值、最小值、分位数等。括号中可以带一些参数,
size计数(此函数不需要括号),sum()求和,mean()平均值, var()方差,std()标准差,median()中位数,mode()众数
# -*- coding: UTF-8 -*-
'''
@Author :Jason
数据分析中的一些特殊值,比如平均值,最大值,方差,标准差等等
'''
def BasicInfo():import pandas as pddf = pd.read_excel(r"./files/i_nuc.xls",sheet_name=6)#sheet_name可以写具体sheet名字符串,也可以写第几个,注意从0开始# print(df.head())# print(df["英语"].describe())'''count 20.000mean 72.550std 7.178min 60.00025% 66.00050% 73.50075% 76.250max 85.000Name: 英语, dtype: float64'''# print(df.describe()) #DF的各列相应的数据'''Unnamed: 0 学号 班级 ... 数分 高代 解几count 20.00000 2.000000e+01 2.000000e+01 ... 20.000000 20.000000 20.000000mean 9.50000 2.308024e+09 2.308024e+07 ... 62.850000 62.150000 69.650000std 5.91608 8.399160e+01 8.522416e-01 ... 9.582193 15.142394 10.643876min 0.00000 2.308024e+09 2.308024e+07 ... 40.000000 23.000000 44.00000025% 4.75000 2.308024e+09 2.308024e+07 ... 60.750000 56.750000 66.75000050% 9.50000 2.308024e+09 2.308024e+07 ... 63.500000 65.500000 71.00000075% 14.25000 2.308024e+09 2.308024e+07 ... 69.250000 71.250000 77.000000max 19.00000 2.308024e+09 2.308024e+07 ... 78.000000 90.000000 83.000000[8 rows x 9 columns]'''# print(df["解几"].size) #这里的size 没有括号()# #20# print(df["解几"].var()) #最大值max(),最小值min(),和sum(),平均值mean(),var()方差,std()标准差#这里处理用mean()来算样本均值import numpy as npprint(np.mean(df["数分"]),np.average(df["数分"]),df["数分"].mean()) #62.85 62.85 62.85if __name__ == "__main__":BasicInfo()
8.2 分组分析
根据字段将分析对象分成不同的部分,以对比分析各组之间差异性的一种方法
常用的统计指标: 计数,求和,平均值
命令:
df.groupby(by=["分类1","分类2",...])["被统计的列"].agg({列别名1:统计函数1,列别名:统计函数2,...})
其中agg最后不好写成字典格式 FutureWarning: using a dict with renaming is deprecated and will be removed
# -*- coding: UTF-8 -*-
'''
@Author :Jason
df.groupby(by=["分类1","分类2",...])["被统计的列"].agg({列别名1:统计函数1,列别名:统计函数2,...})by 表示用于分组的列[] 表示用于统计的列.agg 表示统计别名显示统计值的名称,统计函数用于统计数据。常用size,sum,mean提示,agg好像会逐渐取消,所以还是一个个算比较好
'''
import pandas as pd
import numpy as np
class Groupby:def __init__(self):self.df = pd.read_excel(r'./files/i_nuc.xls',sheet_name=6)def printp(self):afterGbInfo1 = self.df.groupby(by="班级")["军训","英语","体育","性别"].mean()# print(afterGbInfo1)'''军训 英语 体育班级 23080242 81.333333 70.833333 73.00000023080243 85.500000 71.000000 60.66666723080244 64.375000 75.000000 75.375000结合实例理解: 先根据班级分组,再算出指定科目的平均分'''afterGbInfo2 = self.df.groupby(by=["班级", "性别"])["军训", "英语", "体育"].mean()# print(afterGbInfo2)'''军训 英语 体育班级 性别 23080242 女 83.500000 69.500000 89.500000男 80.250000 71.500000 64.75000023080243 女 86.000000 69.333333 42.666667男 85.000000 72.666667 78.66666723080244 女 46.500000 74.500000 77.000000男 70.333333 75.166667 74.833333结合实例理解:先按班级分组,再按性别分组,再算指定列的平均值'''afterGbInfo3 = self.df.groupby(["班级", "性别"])["军训"].agg({"总分":np.sum,"人数":np.size})print(afterGbInfo3)'''总分 人数班级 性别 23080242 女 167 2男 321 423080243 女 258 3男 255 323080244 女 93 2男 422 6'''afterGbInfo4 = self.df.groupby(["班级", "性别"])["军训", "英语", "体育", "性别"].agg({"总分": np.sum, "人数": np.size})# print(afterGbInfo4)'''总分 人数 军训 英语 体育 体育 军训 英语班级 性别 23080242 女 167 139 179 2 2 2男 321 286 259 4 4 423080243 女 258 208 128 3 3 3男 255 218 236 3 3 323080244 女 93 149 154 2 2 2男 422 451 449 6 6 6数组这样太多反而更复杂了,'''if __name__ == "__main__":GB = Groupby()GB.printp()
8.3 分布分析 cut==>分组最好理解
将数据(定量数据)进行等距 或 不等距的分组,研究各组分布规律的一种分析方法
# -*- coding: UTF-8 -*-
'''
@Author :Jason
@Date :2019/11/17 16:56
@Desc :Crate By Jason
'''
import pandas as pd
import numpydef Cut():df = pd.read_excel("./files/i_nuc.xls",sheet_name=6)df["total"] = df["英语"] + df["体育"] + df["军训"] + df["数分"] + df["高代"] + df["解几"]# print(df["total"].head())'''0 3541 3702 3913 4004 407Name: total, dtype: int64'''# print(df["total"].describe())'''count 20.000000mean 413.250000std 36.230076min 354.00000025% 386.00000050% 416.50000075% 446.250000max 457.000000Name: total, dtype: float64'''bins = [df["total"].min()-1,400,450,df["total"].max()+1]labels = ["及格","良好","优秀"]newDf = pd.cut(df["total"],bins=bins,labels = labels)df["等级"] = newDf# print(df.head())'''Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几 total 等级0 0 2308024241 23080242 成龙 男 76 78 77 40 23 60 354 及格1 1 2308024244 23080242 周怡 女 66 91 75 47 47 44 370 及格2 2 2308024251 23080242 张波 男 85 81 75 45 45 60 391 及格3 3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 400 及格4 4 2308024219 23080242 封印 女 73 88 92 61 47 46 407 良好'''print(df.groupby(by = ["等级"])["total"].agg(numpy.size))'''等级及格 7良好 9优秀 4Name: total, dtype: int64'''
if __name__ == "__main__":Cut()
8.4 交叉分析
分析两个或者两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析,一般分为定量、定量分组交叉;
定量、定性分组分析;定性、定性分组交叉
# -*- coding: UTF-8 -*-
'''
@Author :Jason
交叉分析分析两个或者两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析,一般分为定量、定量分组交叉;定量、定性分组分析;定性、定性分组交叉
pivot_table(values,index,colnums,aggfunc,fill_value)values 数据透视表中的值index 数据透视中的行colnums 数据透视表的列aggfunc 表示统计函数fill_value 表示NA缺失值的同一替换返回值:数据透视表的结果
注意:默认对所有的数据列进行透视,非数据列会自动删除,例如:性别
'''
from pandas import read_excel
from pandas import pivot_table
import numpy
import pandas as pddef pivot_table_Exanple():df = read_excel(r'./files/i_nuc.xls',sheet_name=6)info1 = df.pivot_table(index=["班级","姓名"]) #透视所有数据列,性别列被自动删除# print(info1)'''Unnamed: 0 体育 军训 学号 数分 英语 解几 高代班级 姓名 23080242 周怡 1 91 75 2308024244 47 66 44 47封印 4 88 92 2308024219 61 73 46 47张波 2 81 75 2308024251 45 85 60 45成龙 0 78 77 2308024241 40 76 60 23朱浩 3 50 80 2308024249 72 65 71 62迟培 5 50 89 2308024201 71 60 71 7623080243 余皓 8 67 85 2308024326 65 66 71 61李上初 10 90 84 2308024342 60 76 60 66李华 6 61 84 2308024347 61 67 78 65李嘉 9 0 90 2308024320 60 62 77 67郭窦 11 67 84 2308024310 64 79 79 64陈田 7 79 86 2308024307 69 76 69 4023080244 周路 14 80 0 2308024446 61 76 80 74姜毅涛 12 71 0 2308024435 61 77 76 73李侧通 17 96 91 2308024428 69 64 77 60李大强 16 76 77 2308024433 78 79 70 70李晓亮 19 60 85 2308024422 72 85 83 72林建祥 15 72 81 2308024421 63 72 75 90王慧 18 74 93 2308024402 70 73 75 71赵宇 13 74 88 2308024432 68 74 71 70'''info2 = df.pivot_table(["军训","英语","体育"],index=["班级","姓名"])# print(info2)'''体育 军训 英语班级 姓名 23080242 周怡 91 75 66封印 88 92 73张波 81 75 85成龙 78 77 76朱浩 50 80 65迟培 50 89 6023080243 余皓 67 85 66李上初 90 84 76李华 61 84 67李嘉 0 90 62郭窦 67 84 79陈田 79 86 7623080244 周路 80 0 76姜毅涛 71 0 77李侧通 96 91 64李大强 76 77 79李晓亮 60 85 85林建祥 72 81 72王慧 74 93 73赵宇 74 88 74'''df["total"] = df["英语"] + df["体育"] + df["军训"] + df["数分"] + df["高代"] + df["解几"]df["等级"] = pd.cut(df["total"],bins=[df["total"].min()-1,400,450,df["total"].max()+1],labels = ["及格","良好","优秀"])info3 = df.pivot_table(values=["total"],index=["等级"],columns=["性别"],aggfunc=[numpy.size,numpy.mean])print(info3)'''size mean total total 性别 女 男 女 男等级 及格 3 4 365.666667 375.750000良好 3 6 420.000000 430.333333优秀 1 3 456.000000 455.666667'''if __name__ == "__main__":pivot_table_Exanple()
8.5 结构分析
在分组分析以及交叉分析的基础之上,计算各组成部分所占的比重,进而分析总体的内部特征的一种交叉分析方法
这里主要指定性分组,定性分组一般看结构,它的重点在于计算个组成部分占总体的比重.
# -*- coding: UTF-8 -*-
'''
@Author :Jason
结构分析
'''
import numpy as np
import pandas as pd
from pandas import read_exceldef StructuralAnaly():df = read_excel(r'./files/i_nuc.xls',sheet_name="Sheet7")df["total"] = df["英语"] + df["体育"] + df["军训"] + df["数分"] + df["高代"] + df["解几"]df_pt = df.pivot_table(values=["total"],index=["班级"],columns=["性别"],aggfunc=[np.sum])# print(df_pt)'''sum total 性别 女 男班级 23080242 777 156223080243 1209 127023080244 827 2620'''# print(df_pt.sum())'''性别sum total 女 2813男 5452dtype: int64'''# print(df_pt.sum(axis=1)) #按列统计'''班级23080242 233923080243 247923080244 3447dtype: int64'''# print(df_pt.div(df_pt.sum(axis=1),axis=0)) #按列占比'''sum total 性别 女 男班级 23080242 0.332193 0.66780723080243 0.487697 0.51230323080244 0.239919 0.760081'''print(df_pt.div(df_pt.sum(axis=0),axis=1)) #按行占比'''sum total 性别 女 男班级 23080242 0.276218 0.28650023080243 0.429790 0.23294223080244 0.293992 0.480558'''if __name__ == "__main__":StructuralAnaly()
8.6 相关分析
是否存在某种依赖关系==> 是否线性相关 ==>
两个变量 ==> 散点图.看变量之间是否符合某个变化规律
多个变量间 ==> 散点矩阵图 + 各变量间的散点图
||
相关系数:
Pearson相关系数:一般用于分析两个变量间的关系,要去连续变量的取值服从正态分布
Spearman秩相关系数和判定系数(等级相关系数):不符合Peason的
# -*- coding: UTF-8 -*-
'''
@Author :Jason
相关分析
DataFrame.corr() == 返回DataFrame计算每列两两之间的相似度
Series.corr(other) == 返回一个数值,大小表示相关度计算该序列与传入的序列之间的相关度
'''
import numpy as np
import pandas as pddef LinerRelated():df = pd.read_excel(r'./files/i_nuc.xls',sheet_name="Sheet7")linerNum = df["高代"].corr(df["数分"]) #计算两列之间的相关度# print(linerNum) #0.6077408233260108 查表可知中度相关linerInfo = df.loc[:,["英语","体育","军训","解几","数分","高代"]].corr()print(linerInfo)'''英语 体育 军训 解几 数分 高代英语 1.000000 0.375784 -0.252970 0.027452 -0.129588 -0.125245体育 0.375784 1.000000 -0.127581 -0.432656 -0.184864 -0.286782军训 -0.252970 -0.127581 1.000000 -0.198153 0.164117 -0.189283解几 0.027452 -0.432656 -0.198153 1.000000 0.544394 0.613281数分 -0.129588 -0.184864 0.164117 0.544394 1.000000 0.607741高代 -0.125245 -0.286782 -0.189283 0.613281 0.607741 1.000000'''
if __name__ == '__main__':LinerRelated()
8.7 实际案例:电商数据分析
数据如图,对各产品之间的销售情况做相关分析
# -*- coding: UTF-8 -*-
'''
@Author :Jason
数据分析电商案例
'''
from pandas import read_excel
import pandas as pd
import numpy as np
class ECommerce(object):def __init__(self):self.df = read_excel(r"./files/i_nuc.xls",sheet_name=0)def analy(self):df = self.dflinerRelat = df.loc[:6].corr()# print(linerRelat)'''优盘 电子表 电脑支架 插座 电池 音箱 鼠标 usb数据线 手机充电线 键盘 优盘 1.000000 -0.164718 -0.300081 0.823515 0.141810 0.348761 0.178440 -0.096369 -0.466076 0.537446电子表 -0.164718 1.000000 0.710849 0.032032 -0.072249 0.079744 0.523711 0.453210 0.178404 -0.227296 电脑支架 -0.300081 0.710849 1.000000 0.038194 -0.460049 -0.291185 0.190518 -0.221613 -0.236130 -0.530569 插座 0.823515 0.032032 0.038194 1.000000 0.345195 0.376368 0.449717 -0.227473 -0.501474 0.622129 电池 0.141810 -0.072249 -0.460049 0.345195 1.000000 0.672230 0.601558 0.357665 0.316784 0.845828 音箱 0.348761 0.079744 -0.291185 0.376368 0.672230 1.000000 0.809477 0.124411 0.147405 0.756389 鼠标 0.178440 0.523711 0.190518 0.449717 0.601558 0.809477 1.000000 0.160018 0.262633 0.624991 usb数据线 -0.096369 0.453210 -0.221613 -0.227473 0.357665 0.124411 0.160018 1.000000 0.483424 0.057932 手机充电线 -0.466076 0.178404 -0.236130 -0.501474 0.316784 0.147405 0.262633 0.483424 1.000000 0.174410 键盘 0.537446 -0.227296 -0.530569 0.622129 0.845828 0.756389 0.624991 0.057932 0.174410 1.000000'''#观察个数据之间的关系系数,寻找突破口#...没看出结论,案例说的是 键盘鼠标电池之间的关联比较大if __name__ == "__main__":EC = ECommerce()EC.analy()
参照:《基于Python的大数据分析基础及实战》
基于Python的大数据分析基础(九)--- 数据分析相关推荐
- 【数据分析】基于Python的一次职位招聘数据分析(入门参考)
基于Python的一次职位招聘数据分析 1 Python数据分析常用的库和库函数 2 一次完整的数据分析过程 画图 工作地点处理 工资计量单位统一 公司类型 行业类型 参考 配套资源下载 职位信息分析 ...
- 基于python的旅游系统_基于python的去哪儿网旅游数据分析
20011 基于python的去哪儿网旅游数据分析 运行视频.代码等: 链接:https://pan.baidu.com/s/1tw4Qvtcuwt7ys36M7HvLSg 提取码:1589 复制这段 ...
- 大学计算机基础python学多久_基于Python 的“大学计算机基础”课程教学设计
基于Python 的"大学计算机基础"课程教学设计 日期:2018-04-11 04:32 摘要 培养非计算机专业大学生的计算思维能力,在"大学计算机基础"课程 ...
- 基于python的分布式扫描器_一种基于python的大数据分布式任务处理装置的制作方法...
本发明涉及数据处理技术,具体是一种基于python的大数据分布式任务处理装置. 背景技术: 本发明提供一种分布式队列任务处理方案和装置,该方法可以提供分布式处理python任务,任务类型包括爬虫及其他 ...
- 基于Python的中英文分词基础:正则表达式和jieba分词器
基于Python的中英文分词基础:正则表达式和jieba分词器 前言介绍 英文字符串处理 Python中的str 正则表达式 Python中的正则表达式模块 re 小练习 字符串中出现频次最多的字母 ...
- 基于python的量化投资基础(Chapter.0)——概述
量化交易概述 量化交易就是通过数理统计模型方式及计算机程序化发出买卖指令去实现投资理念.实现投资策略的过程,以获取稳定收益为目的的交易方式. 广义的量化投资=基于现代科学方法的理论体系+研究方式+工程 ...
- 简书python数据分析基础reading_Python数据分析基础ReadingDay5_sqlite3
reading Foundations for Analysis with Python Day 5 <Python数据分析基础>封面 这篇笔记开始记录数据库的内容,会用两篇笔记分别讲述P ...
- 简书python数据分析基础reading_Python数据分析基础ReadingDay1
从今天(2018-3-13)到3月26号本目录下会更新<Python数据分析基础>这本书的一些读书笔记和思考. 书目信息: 原书名: Foundations for Analysis wi ...
- 一个基于Python数据大屏可视化开源项目
今天给大家介绍一个开源数据大屏可视化工具. 项目简介 这是一个基于Python开发的,结构简单的项目.可通过配置Json的数据,实现数据报表大屏显示. 优点:代码清晰.结构简单.配置Json数据 ...
最新文章
- web前端,我的新开始
- C#调用C++的DLL 所有数据类型转换方式
- 从汉诺塔讲递归的思考方式
- spring aop抽取切点表达式
- 嵩天-Python语言程序设计程序题--第一周:Python基本语法元素
- 办学10年,进入全国前10名!这所神奇的高校,迎来10岁生日
- @async 没有异步_javascript之异步函数
- Python 基础—— collections 模块
- 软件测试黑盒用例文档,软件测试黑盒白盒测试用例.pdf
- Xor异或是什么意思? - 已解决 - 搜搜问问
- 修改保存hosts文件
- SQL Server 2005 express下载地址
- 城建税和教育费附加怎么计算
- matlab随机函数
- Spring MVC的数据绑定(简单数据绑定+POJO类型绑定)
- 前端之jquery基础
- JAVA 文件上传格式限制_关于servlet文件上传限制文件大小的问题,求高手帮忙
- ACL2022 PAIE: Prompting Argument Interaction for Event Argument Extraction
- Java百度识别身份证照片、驾驶证识别
- 第一次参与国际空间站ISS 的SSTV活动