一般统计某个变量的最小值,第一个四分位值,中值,第三个四分位值,以及最大值
均值(Mean),中位数(Median)和众数(Mode)
其中均值和中位数用于定量的数据,众数用于定性的数据
对于定 量数据( Data )来说,均值是总和除以总量 N,中位数是数值大小位于中间(奇偶总量处理不同)的值,均值相对中位位数来说,包含的信息量更大,但是容易受异常的影响。
描述性统计分析函数为 describe 。该函数返回值有均值、标准差、最大 值、最小值、分位数等。括号中可以带一些参数,
# -*- coding: UTF-8 -*-
'''
@Author :Jason
数据分析中的一些特殊值,比如平均值,最大值,方差,标准差等等
'''
def BasicInfo():
import pandas as pd
df = pd.read_excel(r"./files/i_nuc.xls",sheet_name=6)
#sheet_name可以写具体sheet名字符串,也可以写第几个,注意从0开始
# print(df.head())
# print(df["英语"].describe())
'''
count 20.000
mean 72.550
std 7.178
min 60.000
25% 66.000
50% 73.500
75% 76.250
max 85.000
Name: 英语, dtype: float64
'''
# print(df.describe()) #DF的各列相应的数据
'''
Unnamed: 0 学号 班级 ... 数分 高代 解几
count 20.00000 2.000000e+01 2.000000e+01 ... 20.000000 20.000000 20.000000
mean 9.50000 2.308024e+09 2.308024e+07 ... 62.850000 62.150000 69.650000
std 5.91608 8.399160e+01 8.522416e-01 ... 9.582193 15.142394 10.643876
min 0.00000 2.308024e+09 2.308024e+07 ... 40.000000 23.000000 44.000000
25% 4.75000 2.308024e+09 2.308024e+07 ... 60.750000 56.750000 66.750000
50% 9.50000 2.308024e+09 2.308024e+07 ... 63.500000 65.500000 71.000000
75% 14.25000 2.308024e+09 2.308024e+07 ... 69.250000 71.250000 77.000000
max 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 np
print(np.mean(df["数分"]),np.average(df["数分"]),df["数分"].mean()) #62.85 62.85 62.85
if __name__ == "__main__":
BasicInfo()
根据字段将分析对象分成不同的部分,以对比分析各组之间差异性的一种方法
常用的统计指标: 计数,求和,平均值
命令:
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.000000
23080243 85.500000 71.000000 60.666667
23080244 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.750000
23080243 女 86.000000 69.333333 42.666667
男 85.000000 72.666667 78.666667
23080244 女 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 4
23080243 女 258 3
男 255 3
23080244 女 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 4
23080243 女 258 208 128 3 3 3
男 255 218 236 3 3 3
23080244 女 93 149 154 2 2 2
男 422 451 449 6 6 6
数组这样太多反而更复杂了,
'''
if __name__ == "__main__":
GB = Groupby()
GB.printp()
# -*- coding: UTF-8 -*-
'''
@Author :Jason
@Date :2019/11/17 16:56
@Desc :Crate By Jason
'''
import pandas as pd
import numpy
def 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 354
1 370
2 391
3 400
4 407
Name: total, dtype: int64
'''
# print(df["total"].describe())
'''
count 20.000000
mean 413.250000
std 36.230076
min 354.000000
25% 386.000000
50% 416.500000
75% 446.250000
max 457.000000
Name: 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
优秀 4
Name: total, dtype: int64
'''
if __name__ == "__main__":
Cut()
# -*- 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 pd
def 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 76
23080243 余皓 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 40
23080244 周路 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 60
23080243 余皓 67 85 66
李上初 90 84 76
李华 61 84 67
李嘉 0 90 62
郭窦 67 84 79
陈田 79 86 76
23080244 周路 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()
# -*- coding: UTF-8 -*-
'''
@Author :Jason
结构分析
'''
import numpy as np
import pandas as pd
from pandas import read_excel
def 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 1562
23080243 1209 1270
23080244 827 2620
'''
# print(df_pt.sum())
'''
性别
sum total 女 2813
男 5452
dtype: int64
'''
# print(df_pt.sum(axis=1)) #按列统计
'''
班级
23080242 2339
23080243 2479
23080244 3447
dtype: int64
'''
# print(df_pt.div(df_pt.sum(axis=1),axis=0)) #按列占比
'''
sum
total
性别 女 男
班级
23080242 0.332193 0.667807
23080243 0.487697 0.512303
23080244 0.239919 0.760081
'''
print(df_pt.div(df_pt.sum(axis=0),axis=1)) #按行占比
'''
sum
total
性别 女 男
班级
23080242 0.276218 0.286500
23080243 0.429790 0.232942
23080244 0.293992 0.480558
'''
if __name__ == "__main__":
StructuralAnaly()
两个变量 ==> 散点图.看变量之间是否符合某个变化规律
多个变量间 ==> 散点矩阵图 + 各变量间的散点图
||
相关系数:
Pearson相关系数:一般用于分析两个变量间的关系,要去连续变量的取值服从正态分布
Spearman秩相关系数和判定系数(等级相关系数):不符合Peason的
# -*- coding: UTF-8 -*-
'''
@Author :Jason
相关分析
DataFrame.corr() == 返回DataFrame
计算每列两两之间的相似度
Series.corr(other) == 返回一个数值,大小表示相关度
计算该序列与传入的序列之间的相关度
'''
import numpy as np
import pandas as pd
def 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()
数据如图,对各产品之间的销售情况做相关分析
# -*- 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.df
linerRelat = 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的大数据分析基础及实战》