注:小蚊子团队KEN主讲,共分6章。第一章,python与数据分析概况;第二章,python安装和使用;第三章,数据准备; 第四章 数据处理;第五章 数据分析;第六章,数据可视化
5.1基本统计
描述性统计分析,用来概括事物整体状况以及事物间联系(即事物的基本特征),以发现其内在规律的统计分析方法
常见的统计指标:计数、求和、平均值、方差、标准差
描述性统计分析函数:describe()
常用的统计函数:
size--计数
sum--求和
mean--平均值
var--方差
std--标准差
import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.1\\data.csv' ) data.score.describe() data.score.size data.score.max() data.score.min() data.score.sum() data.score.mean() data.score.var() data.score.std() #累计求和 data.score.cumsum() #最大值和最小值所在位置 data.score.argmin() data.score.argmax() data.score.quantile( 0.3, interpolation="nearest" )5.2分组分析
1)、定义:是指根据分组字段,将分析对象划分成不同的部分,以进行对比分析各组之间的差异性的一种分析方法
分组类型包括:
定性分组:按事物的已有类型、属性划分,如性别、年龄、地区。
定量分组:就是数值分组。
常用的统计指标有:
计数,size
求和,sum
平均值,mean
2)、分组统计函数:groupby(by=[分组列1,分组列2,,...])
[统计列1,统计列2,...].agg({统计列别名1:统计函数1,统计列别名2:统计函数2,...})
参数说明:by--用于分组的列,中括号--用于统计的列
agg--统计别名显示统计值的名称,统计函数用于统计数据
import numpy import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.2\\data.csv' ) aggResult = data.groupby( by=['class'] )['score'].agg({ '总分': numpy.sum, '人数': numpy.size, '平均值': numpy.mean })5.3分布分析
是指根据分析的目的,将数据(定量数据)进行等距或者不等距的分组,进行研究各组分布规律的一种分析方法,基于分组分析
import numpy import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.3\\data.csv' ) aggResult = data.groupby( by=['年龄'] )['年龄'].agg({ '人数': numpy.size }) data.年龄.hist() bins = [ min(data.年龄)-1, 20, 30, 40, max(data.年龄)+1 ] labels = [ '20岁以及以下', '21岁到30岁', '31岁到40岁', '41岁以上' ] data['年龄分层'] = pandas.cut( data.年龄, bins, labels=labels ) aggResult = data.groupby( by=['年龄分层'] )['年龄'].agg({ '人数': numpy.size }) pAggResult = round( aggResult/aggResult.sum(), 2 )*100 pAggResult['人数'].map('{:,.2f}%'.format)5.4交叉分析
通常用于分析两个或者两个以上,分组变量之间的关系,以交叉表形式进行变量间关系的对比分析。
三种情况:定量、定量分组交叉;定量、定性分组分组交叉;定性、定性分组交叉
交叉的维度建议两个维度最好
注意:函数是按列来计算的
import numpy import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.4\\data.csv' ) bins = [ min(data.年龄)-1, 20, 30, 40, max(data.年龄)+1 ] labels = [ '20岁以及以下', '21岁到30岁', '31岁到40岁', '41岁以上' ] data['年龄分层'] = pandas.cut( data.年龄, bins, labels=labels ) ptResult = data.pivot_table( values=['年龄'], index=['年龄分层'], columns=['性别'], aggfunc=[numpy.size] )5.5结构分析
是在分组及交叉的基础上,计算各部分所占的比重,进而分析总体的内部特征的一种分析方法
是指定性分析,主要看结构,计算占整体的比重
例子:
性别结构
地区结构
市场占有率
股权
展现:
通常用饼图表示,成分较少时可用圆环图表示
axis=0,按列运算;axis=1,按行运算。默认按列运算。
数据框的外运算函数
add,加
sub,减
multiply,乘
div,除
数据框的内运算函数
sum,求和
mean,均值
var,方差
sd,标准差
import numpy import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.5\\data.csv' ) bins = [ min(data.年龄)-1, 20, 30, 40, max(data.年龄)+1 ] labels = [ '20岁以及以下', '21岁到30岁', '31岁到40岁', '41岁以上' ] data['年龄分层'] = pandas.cut( data.年龄, bins, labels=labels ) ptResult = data.pivot_table( values=['年龄'], index=['年龄分层'], columns=['性别'], aggfunc=[numpy.size] ) ptResult.sum() ptResult.sum(axis=0) ptResult.sum(axis=1) #按列除以按行: ptResult.div(ptResult.sum(axis=1), axis=0) #按行除以按列: ptResult.div(ptResult.sum(axis=0), axis=1)5.6相关性分析
1)、定义:是研究两个或者两个以上随机变量之间相互依存关系和密切成都的方法
2)、常见方法:
a、线性相关
主要采用皮尔逊(pearson)相关系数r来度量连续变量之间线性相关强度,r>0正相关,y<0负相关
线性相关数|r|取值范围
0<=|r|<0.3,低度相关
0.3<=|r|<0.8,中度相关
0.8<=|r|<=1,高度相关
b、非线性相关
3)、函数
DataFrame.corr(), 计算每个列两两之间的相似度,返回DataFrame
Series.corr(other), 只计算该序列与传入的序列之间的相关度,返回一个数值型,大小为相关度
# -*- coding: utf-8 -*- import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.6\\data.csv' ) #先来看看如何进行两个列之间的相关度的计算 data['人口'].corr(data['文盲率']) #多列之间的相关度的计算方法 #选择多列的方法 data[[ '超市购物率', '网上购物率', '文盲率', '人口' ]] data[[ '超市购物率', '网上购物率', '文盲率', '人口' ]].corr()5.7RFM分析
import numpy import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.7\\data.csv' ) data['DealDateTime'] = pandas.to_datetime( data.DealDateTime, format='%Y/%m/%d' ) data['DateDiff'] = pandas.to_datetime( 'today' ) - data['DealDateTime'] data['DateDiff'] = data['DateDiff'].dt.days R_Agg = data.groupby( by=['CustomerID'] )['DateDiff'].agg({ 'RecencyAgg': numpy.min }) F_Agg = data.groupby( by=['CustomerID'] )['OrderID'].agg({ 'FrequencyAgg': numpy.size }) M_Agg = data.groupby( by=['CustomerID'] )['Sales'].agg({ 'MonetaryAgg': numpy.sum }) aggData = R_Agg.join(F_Agg).join(M_Agg) bins = aggData.RecencyAgg.quantile( q=[0, 0.2, 0.4, 0.6, 0.8, 1], interpolation='nearest' ) bins[0] = 0 labels = [5, 4, 3, 2, 1] R_S = pandas.cut( aggData.RecencyAgg, bins, labels=labels ) bins = aggData.FrequencyAgg.quantile( q=[0, 0.2, 0.4, 0.6, 0.8, 1], interpolation='nearest' ) bins[0] = 0; labels = [1, 2, 3, 4, 5]; F_S = pandas.cut( aggData.FrequencyAgg, bins, labels=labels ) bins = aggData.MonetaryAgg.quantile( q=[0, 0.2, 0.4, 0.6, 0.8, 1], interpolation='nearest' ) bins[0] = 0 labels = [1, 2, 3, 4, 5] M_S = pandas.cut( aggData.MonetaryAgg, bins, labels=labels ) aggData['R_S']=R_S aggData['F_S']=F_S aggData['M_S']=M_S aggData['RFM'] = 100*R_S.astype(int) + 10*F_S.astype(int) + 1*M_S.astype(int) bins = aggData.RFM.quantile( q=[ 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1 ], interpolation='nearest' ) bins[0] = 0 labels = [1, 2, 3, 4, 5, 6, 7, 8] aggData['level'] = pandas.cut( aggData.RFM, bins, labels=labels ) aggData = aggData.reset_index() aggData.sort( ['level', 'RFM'], ascending=[1, 1] ) aggData.groupby( by=['level'] )['CustomerID'].agg({ 'size':numpy.size })5.8矩阵分析
import pandas import matplotlib import matplotlib.pyplot as plt mainColor = (42/256, 87/256, 141/256, 1); #设置字体 font = { 'family': 'SimHei', 'size': 20 } matplotlib.rc('font', **font); data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\5.8\\data.csv' ) fig = plt.figure( figsize=(30, 20), dpi=80 ) sp = fig.add_subplot(111) sp.set_xlim([ 0, data.GDP.max()*1.1 ]) sp.set_ylim([ 0, data.population.max()*1.1 ]) #关闭坐标轴、坐标轴的刻度值 #sp.axis('off') sp.get_xaxis().set_ticks([]) sp.get_yaxis().set_ticks([]) #画点 sp.scatter( data.GDP, data.population, alpha=0.5, s=200, marker="o", edgecolors=mainColor, linewidths=5 ) #画均值线 sp.axvline( x=data.GDP.mean(), linewidth=1, color=mainColor ) sp.axhline( y=data.population.mean(), linewidth=1, color=mainColor ) sp.axvline( x=0, linewidth=3, color=mainColor ) sp.axhline( y=0, linewidth=3, color=mainColor ) sp.set_xlabel('GDP') sp.set_ylabel('人口') #画标签 data.apply( lambda row: plt.text( row.GDP, row.population, row.province, fontsize=15 ), axis=1 ) plt.show()