python数据分析入门【三】 — 数据分析

python数据分析入门【三】 — 数据分析

上一章内容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
2030  25.327923  76.0
3040  32.202541  20.0
4050  43.804270   1.0
5060  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%
2030    76.00%
3040    20.00%
4050     1.00%
5060     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
2030  25.327923  0.76
3040  32.202541  0.20
4050  43.804270  0.01
5060  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%
2030  25.327923  76.00%
3040  32.202541  20.00%
4050  43.804270   1.00%
5060  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]: 
         年龄       
性别        女      男
年龄分层              
5060    54    894
2030  2731  42185
3040   953  10694
4050   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]: 
    性别
年龄  女      431654785

data.sum(axis = 0)
---
Out[95]: 
    性别
年龄  女      431654785

data.sum(axis = 1)
---
Out[97]: 
年龄分层
5060      948
2030    44916
3040    11647
4050      843
20以下       578
60以上       169
dtype: int64

data.mean(axis = 0)
---
Out[98]: 
    性别
年龄  女      719.3333339130.833333
dtype: float64

data.var(axis = 0)
---
Out[99]: 
    性别
年龄  女     1.080351e+062.789948e+08
dtype: float64

data.std(axis = 0)
---
Out[100]: 
    性别
年龄  女      1039.39957016703.138105
dtype: float64
3)外运算
#得到行列占比
#这里指:在该年龄层上(对行求和),男女人数的占比
data1 = data.div(data.sum(axis=1),axis=0)
---
Out[106]: 
             年龄          
性别            女         男
年龄分层                     
5060  0.056962  0.943038
2030  0.060802  0.939198
3040  0.081824  0.918176
4050  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]: 
             年龄          
性别            女         男
年龄分层                     
5060  0.012512  0.016318
2030  0.632762  0.770010
3040  0.220806  0.195199
4050  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=100RS+10FS+1MS
    • 3)根据RFM分值对客户分类
  • RFM分析前提
    • 1.最近有过交易行为的客户,再次发生交易的可能性要高于最近没有交易行为的客户;
    • 2.交易频率较高的客户比交易频率较低的客户,更有可能再次发生交易行为;
    • 3.过去所有交易总金额较多的客户,比交易总金额较少的客户,更有消费积极性。

8、矩阵分析

矩阵分析:指根据事物(如产品,服务等)的两个重要属性(指标)作为分析的依据,进行关联分析,找出解决问题的一种分析方法。
在这里插入图片描述

9、补充:定性/定量分组

参考https://www.baidu.com/link?url=ctsUJdrjP9U10bbW4WSztxRxRhEyfzD5pxrxyhFR7xH8XO-3Ng1bpXMof3cUK6FUrYiBWMBCUm8l9Qq441845fb1ytxsSCC1d5VKOk_UIJy&wd=&eqid=e6ff222a00028d5c000000065f1a78d8

  • 定性分组 – 用文字语言进行相关描述,eg:按班级划分学生,班级之间没有数量关系。

    在此分组的基础上进行分析的方法称为定性分析法

  • 定量分组 – 用数学语言进行描述,eg:在成交额数值范围中,对不同区间的成交额进行用户量的划分,用户消费分布,用户年龄分布。

    在此分组的基础上进行分析的方法称为定量分析法

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python数据分析是指使用Python编程语言进行处理、数据可视化和数据建模的过程。下面是Python数据分析入门步骤: 1. 安装Python和相关库:首先,你需要安装Python解释器。你可以从Python官方网站下载并安装最新版本的Python。在安装Python之后,你需要安装一些常用的数据分析库,如NumPy、Pandas和Matplotlib。你可以使用pip命令来安装这些库。 2. 学习Python基础知识:在开始进行数据分析之前,你需要掌握一些基本的Python编程知识,如变量、数据类型、条件语句、循环等。你可以通过阅读Python的官方文档或参考一些在线教程来学习Python基础知识。 3. 学习NumPy库:NumPy是Python中用于科学计算的一个重要库。它提供了多维数组对象和一些用于操作数组的函数。学习NumPy可以帮助你更高效地处理和操作大量的数据。你可以通过阅读NumPy的官方文档或参考一些在线教程来学习NumPy。 4. 学习Pandas库:Pandas是Python中用于数据分析的一个强大库。它提供了高效的数据结构和数据分析工具,如DataFrame和Series。学习Pandas可以帮助你更方便地进行数据清洗、数据处理和数据分析。你可以通过阅读Pandas的官方文档或参考一些在线教程来学习Pandas。 5. 学习Matplotlib库:Matplotlib是Python中用于数据可视化的一个常用库。它提供了各种绘图函数和工具,可以帮助你将数据可视化为图表、图形和图像。学习Matplotlib可以帮助你更好地理解和展示数据。你可以通过阅读Matplotlib的官方文档或参考一些在线教程来学习Matplotlib。 6. 实践项目:最后,你可以通过实践一些数据分析项目来巩固所学的知识。你可以从一些开放的数据集中选择一个感兴趣的主题,然后使用Python进行数据清洗、数据处理和数据可视化。这样可以帮助你更深入地理解和应用Python数据分析的技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值