python数据分析入门【三】 — 数据分析
1、基本统计
1)常用统计指标
常用的统计指标有:计数,求和,平均值,方差,标准差
统计函数 | 注释 |
---|---|
describe | 描述性统计分析 |
size | 计数 |
sum | 求和 |
mean | 平均值 |
var | 方差 |
std | 标准差 |
'''基本统计'''
import pandas as pd
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//5.1 基本统计/data.csv'),
sep=','
)
'''A:描述性统计分析函数'''
# describe()
df1.describe()
---
df1.describe()
Out[2]:
score
count 13.000000
mean 121.076923
std 12.446295
min 96.000000
25% 115.000000
50% 120.000000
75% 131.000000
max 140.000000
'''B:常用的统计分析函数:'''
# size 计数
# sum 求和
# mean 平均值
# var 方差
# std 标准差
#df1.score.size()是错误写法
df1.score.size
---
Out[3]: 13
df1.score.max()
---
Out[6]: 140
df1.score.min()
---
Out[7]: 96
df1.score.sum()
---
Out[8]: 1574
df1.score.mean()
---
Out[9]: 121.07692307692308
df1.score.var()
---
Out[10]: 154.91025641025644
df1.score.std()
---
Out[11]: 12.44629488684309
2)其余函数
'''C:其余函数'''
# 累计求和
df1.score.cumsum()
---
Out[12]:
0 120
1 242
2 382
3 513
4 635
5 754
6 850
7 985
8 1090
9 1204
10 1319
11 1455
12 1574
Name: score, dtype: int64
# 最大值,最小值的位置
df1.score.argmin()
---
Out[13]: 6
df1.score.argmax()
---
Out[14]: 2
# 分位函数:得到数据中百分比为x的最近数值,默认x=0.5 <https://blog.csdn.net/weay/article/details/80823628>
# =============================================================================
# Help on method quantile in module pandas.core.series:
#
# quantile(q=0.5, interpolation='linear') method of pandas.core.series.Series instance
# Return value at the given quantile, a la numpy.percentile.
#
# Parameters
# ----------
# q : float or array-like, default 0.5 (50% quantile)
# 0 <= q <= 1, the quantile(s) to compute
# interpolation : {'linear', 'lower', 'higher', 'midpoint', 'nearest'}
# .. versionadded:: 0.18.0
#
# This optional parameter specifies the interpolation method to use,
# when the desired quantile lies between two data points `i` and `j`:
#
# * linear: `i + (j - i) * fraction`, where `fraction` is the
# fractional part of the index surrounded by `i` and `j`.
# * lower: `i`.
# * higher: `j`.
# * nearest: `i` or `j` whichever is nearest.
# * midpoint: (`i` + `j`) / 2.
#
# Returns
# -------
# quantile : float or Series
# if ``q`` is an array, a Series will be returned where the
# index is ``q`` and the values are the quantiles.
# =============================================================================
df1.score.quantile(
0.3,
interpolation = 'nearest'
)
---
Out[15]: 119
df1.score.quantile(
0.5,
interpolation = 'nearest'
)
---
Out[16]: 120
2、分组分析
- 分组分析:指根据分组字段,将分析对象划分成不同的部分,以进行对比分析各组间的差异性的一种分析方法(定性分组,定量分组)
- 常用的统计指标有:计数,求和,平均值
'''A:分组统计函数'''
# =============================================================================
# groupby(by = [分组列1,分组列2])[统计列1,统计列2,...].agg({
# 统计列别名1:统计函数1,统计列别名2:统计函数2,...
# })
# =============================================================================
import pandas as pd
import numpy as np
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//5.2 分组分析/data.csv'),
sep=','
)
# <https://www.cnblogs.com/Yanjy-OnlyOne/p/11217802.html>
#df1.groupby(by=['class'])得到的是<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x000001EB582B5208>
# =============================================================================
# >>> s.agg(['min', 'max'])
# min 1
# max 4
# dtype: int64
# =============================================================================
df1.groupby(by=['class'])['score'].agg({
# =============================================================================
# Aggregate using one or more operations over the specified axis.
#
# New in version 0.20.0.
#
# Parameters
# func:function, str, list or dict
# Function to use for aggregating the data. If a function, must either work when passed a Series or when passed to Series.apply.
# Accepted combinations are:
# function
# string function name
# list of functions and/or function names, e.g. [np.sum, 'mean']
# dict of axis labels -> functions, function names or list of such.
# =============================================================================
# func传入参数为dict
# 如果单运行np.sum,会报错:sum() missing 1 required positional argument: 'a'
# np.sum可以理解是自个调用方法可以不用传参
# Series.agg(self, func, axis=0, *args, **kwargs)[source]
"总分": np.sum,
"人数": np.size,
"平均值": np.mean
})
---
总分 人数 平均值
class
一班 635 5 127.00
三班 484 4 121.00
二班 455 4 113.75
3、分布分析
分布分析:根据分析目的,将数据(定量数据)进行等距或者不等距的分组,进行研究各组规律的一种分析方法(eg:用户消费分布,用户年龄分布)
import pandas as pd
import numpy as np
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//5.3 分布分析/data.csv'),
sep=','
)
'''分布分析'''
'''A:按年龄分组,但是每一岁做一组,不太合适'''
df1.groupby(['年龄'])['年龄'].agg({
"mean":np.mean,
"size":np.size
})
'''B:对连续数据进行分段处理(age)'''
bins = [
min(df1.年龄) - 1,20,30,40,50,60,max(df1.年龄) + 1
]
# 区间右边不闭合
# 自定义标签
labels = [
'20以下','20到30','30到40','40到50','50到60','60以上'
]
df1['年龄分层'] = pd.cut(
df1.年龄,
bins,
right = False,
labels = labels
)
1)按年龄分层分组
'''分布分析'''
'''B:按年龄分层分组'''
data = df1.groupby(['年龄分层'])['年龄'].agg({
"mean":np.mean,
"size":np.size
})
2)用百分比的形式显示数据
'''C:用百分比的形式显示数据(向量化计算)'''
data['size'] = round(
data['size']/data['size'].sum(),
2
)*100
data
---
Out[34]:
mean size
年龄分层
20以下 18.483122 2.0
20到30 25.327923 76.0
30到40 32.202541 20.0
40到50 43.804270 1.0
50到60 53.868512 1.0
60以上 64.946746 0.0
方法1:使用Series.map
# 会报错:TypeError: unsupported format string passed to Series.__format__
#data['size'] = '{:,.2f}%'.format(data['size'])
data['size'].map('{:,.2f}%'.format)
---
年龄分层
20以下 2.00%
20到30 76.00%
30到40 20.00%
40到50 1.00%
50到60 1.00%
60以上 0.00%
Name: size, dtype: object
#KeyError: '20以下'
#type(data.at['20以下','size'])
type(data.loc['20以下'].at['size'])
---
numpy.float64
方法2:用Series.apply + str
data['size'] = data['size'].apply(lambda x: str(x) + '%')
type(data.loc['20以下'].at['size'])
---
Out[76]: str
方法3:用Series.apply + format
data = df1.groupby(['年龄分层'])['年龄'].agg({
"mean":np.mean,
"size":np.size
})
'''C:用百分比的形式显示数据(向量化计算),这里没有乘100,因为在format时,自动会乘上100 + '%' + 保留小数'''
data['size'] = round(
data['size']/data['size'].sum(),
2
)
data
---
mean size
年龄分层
20以下 18.483122 0.02
20到30 25.327923 0.76
30到40 32.202541 0.20
40到50 43.804270 0.01
50到60 53.868512 0.01
60以上 64.946746 0.00
# 会报错:TypeError: unsupported format string passed to Series.__format__
#data['size'] = '{:,.2f}%'.format(data['size'])
# apply函数(Series有,DataFrame也有)的作用:唤起函数在Series值上的应用
#<https://www.runoob.com/python/att-string-format.html>
data['size'] = data['size'].apply(lambda x: format(x, '.2%'))
---
mean size
年龄分层
20以下 18.483122 2.00%
20到30 25.327923 76.00%
30到40 32.202541 20.00%
40到50 43.804270 1.00%
50到60 53.868512 1.00%
60以上 64.946746 0.00%
format
格式化可见这里https://www.runoob.com/python/att-string-format.html
4、交叉分析
1)交叉分析的概念
交叉分析:通常用于分析两个或两个以上,分组变量之间的关系,以交叉表形式进行变量间关系的对比分析(eg:在年龄分组的情况下,对性别进行再分组,统计不同性别,不同年龄分组下的人数)
- 定量,定量分组交叉
- 定量,定性分组交叉
- 定性,定性分组交叉
import pandas as pd
import numpy as np
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//5.4 交叉分析/data.csv'),
sep=','
)
bins = [
min(df1.年龄) - 1,20,30,40,50,60,max(df1.年龄) + 1
]
# 区间右边不闭合
# 自定义标签
labels = [
'20以下','20到30','30到40','40到50','50到60','60以上'
]
df1['年龄分层'] = pd.cut(
df1.年龄,
bins,
right = False,
labels = labels
)
2)用pivot_table()
进行交叉分析
'''A:交叉分析'''
# =============================================================================
# 交叉计数函数 pivot_table(values,index,columns,aggfunc,fill_value)
# values:交叉分析表中的值
# index:交叉分析表中的行
# columns:交叉分析表中的列
# aggfunc:统计函数
# fill_value:NA值的统一替换
# =============================================================================
data = df1.pivot_table(
values=['年龄'],
index=['年龄分层'],
columns=['性别'],
aggfunc= np.size
)
---
Out[91]:
年龄
性别 女 男
年龄分层
50到60 54 894
20到30 2731 42185
30到40 953 10694
40到50 233 610
20以下 280 298
60以上 65 104
5、结构分析
1)结构分析的概念
结构分析:是在分组和交叉的基础上,计算各组成部分所占的比重,进而分析总体的内部特征,主要是定性分析(eg:市场占有率,股权等,一般用饼图表现)。
-
数据框的外运算函数
运算 注释 add 加 sub 减 multiply 乘 div 除 -
数据框的内运算函数
运算 注释 sum 求和 mean 均值 var 方差 std 标准差
2)内运算
注意是对交叉表中哪个数据,在哪一列,哪一行进行运算,这里的值是’年龄’
'''B:结构分析(注意在分组和交叉基础上进行结构分析才有意义,值是一样的,可以进行列/行运算'''
# axis = 0 列运算(这里的列为性别)
# axis = 1 行运算(这里的行为年龄分层)
'''内运算(默认是列运算)'''
data.sum()
---
Out[95]:
性别
年龄 女 4316
男 54785
data.sum(axis = 0)
---
Out[95]:
性别
年龄 女 4316
男 54785
data.sum(axis = 1)
---
Out[97]:
年龄分层
50到60 948
20到30 44916
30到40 11647
40到50 843
20以下 578
60以上 169
dtype: int64
data.mean(axis = 0)
---
Out[98]:
性别
年龄 女 719.333333
男 9130.833333
dtype: float64
data.var(axis = 0)
---
Out[99]:
性别
年龄 女 1.080351e+06
男 2.789948e+08
dtype: float64
data.std(axis = 0)
---
Out[100]:
性别
年龄 女 1039.399570
男 16703.138105
dtype: float64
3)外运算
#得到行列占比
#这里指:在该年龄层上(对行求和),男女人数的占比
data1 = data.div(data.sum(axis=1),axis=0)
---
Out[106]:
年龄
性别 女 男
年龄分层
50到60 0.056962 0.943038
20到30 0.060802 0.939198
30到40 0.081824 0.918176
40到50 0.276394 0.723606
20以下 0.484429 0.515571
60以上 0.384615 0.615385
#这里指:在男女性别上(对列求和),不同年龄层人数的占比
data2 = data.div(data.sum(axis=0),axis=1)
---
Out[105]:
年龄
性别 女 男
年龄分层
50到60 0.012512 0.016318
20到30 0.632762 0.770010
30到40 0.220806 0.195199
40到50 0.053985 0.011134
20以下 0.064875 0.005439
60以上 0.015060 0.001898
6、相关分析
1)相关分析的概念
-
相关分析:研究两个或两个以上随机变量之间相互依赖关系的方向和密切程度的方法,包括线性相关,而非线性相关
-
线性相关关系主要采用Pearson相关系数r来度量连续变量之间线性相关强度(还有其他指标:kendall, spearman)
线性相关系数|r|取值范围 相关程度 $0<= r $0.3<= r $0.8<= r
import pandas as pd
import numpy as np
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//5.6 相关分析/data.csv'),
sep=','
)
2)用Series.corr
相关分析
# =============================================================================
# DataFrame.corr()
# Series.corr(other)
# 注意两个corr()是有区别的
# =============================================================================
df1['人口'].corr(df1['文盲率'])
---
Out[110]: 0.10762237339473261
3)用DataFrame.corr
相关分析
#语法错误
#df1[['人口','平均收入','超市购物率','网上购物率','文盲率']].corr(df1[['人口','平均收入','超市购物率','网上购物率','文盲率']])
# 得到一个对称矩阵
df1[['人口','平均收入','超市购物率','网上购物率','文盲率']].corr()
7、RFM分析
- RFM分析:根据客户活跃程度和交易金额贡献,进行客户价值细分的一种方法
指标 | 解释 | 意义 |
---|---|---|
R(Recency)近度 | 客户最近一次交易时间的交隔 | R越大,客户越久未发生交易;R越小,客户越近有交易发生 |
F(Frequency)频度 | 客户最近一段时间内交易的次数 | F越大,客户交易越频繁;F越小,表示客户不够活跃 |
M(Monetary)额度 | 客户最近一段时间内交易的金额 | M越大,客户价值越高;M越小,客户价值越小; |
- RFM分析过程
- 1)计算RFM各项分值:
- R_S,距离当前日期越近,得分越高,最高5分,最低1分
- F_S,交易频率越高,得分越高,最高5分,最低1分
- M_S,交易金额越高,得分越高,最高5分,最低1分
- 2)汇总RFM分值: R F M = 100 ∗ R S + 10 ∗ F S + 1 ∗ M S RFM = 100 * R_S + 10 * F_S + 1 * M_S RFM=100∗RS+10∗FS+1∗MS
- 3)根据RFM分值对客户分类
- 1)计算RFM各项分值:
- RFM分析前提
- 1.最近有过交易行为的客户,再次发生交易的可能性要高于最近没有交易行为的客户;
- 2.交易频率较高的客户比交易频率较低的客户,更有可能再次发生交易行为;
- 3.过去所有交易总金额较多的客户,比交易总金额较少的客户,更有消费积极性。
8、矩阵分析
矩阵分析:指根据事物(如产品,服务等)的两个重要属性(指标)作为分析的依据,进行关联分析,找出解决问题的一种分析方法。
9、补充:定性/定量分组
-
定性分组 – 用文字语言进行相关描述,eg:按班级划分学生,班级之间没有数量关系。
在此分组的基础上进行分析的方法称为定性分析法
-
定量分组 – 用数学语言进行描述,eg:在成交额数值范围中,对不同区间的成交额进行用户量的划分,用户消费分布,用户年龄分布。
在此分组的基础上进行分析的方法称为定量分析法